Class: Plushie::DevServer

Inherits:
Object
  • Object
show all
Defined in:
lib/plushie/dev_server.rb

Overview

File watcher and hot-reloader for development mode.

Watches lib/ (configurable) for .rb file changes, debounces rapid saves, and triggers a re-render in the runtime. The model state is preserved across reloads -- only the view is re-evaluated.

Requires the listen gem (optional dependency, not in gemspec). Install it in your Gemfile for development:

gem "listen", group: :development

Examples:

Plushie.run(MyApp, dev: true)

Manual control

dev = DevServer.new(event_queue: runtime_queue, dirs: ["lib/"])
dev.start
dev.stop

See Also:

  • ~/projects/toddy-elixir/lib/plushie/dev_server~/projects/toddy-elixir/lib/plushie/dev_server.ex

Instance Method Summary collapse

Constructor Details

#initialize(event_queue:, dirs: nil, debounce_ms: 100) ⇒ DevServer

Returns a new instance of DevServer.

Parameters:

  • event_queue (Thread::Queue)

    runtime event queue for :force_rerender

  • dirs (Array<String>) (defaults to: nil)

    directories to watch (default: ["lib/"])

  • debounce_ms (Integer) (defaults to: 100)

    debounce window in milliseconds (default: 100)



28
29
30
31
32
33
34
35
36
# File 'lib/plushie/dev_server.rb', line 28

def initialize(event_queue:, dirs: nil, debounce_ms: 100)
  @event_queue = event_queue
  @dirs = dirs || ["lib/"]
  @debounce_ms = debounce_ms
  @listener = nil
  @debounce_timer = nil
  @debounce_mutex = Mutex.new
  @logger = Logger.new($stderr, level: :info, progname: "plushie-dev")
end

Instance Method Details

#startObject

Start watching for file changes.



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/plushie/dev_server.rb', line 39

def start
  begin
    require "listen"
  rescue LoadError
    @logger.warn("plushie dev: `listen` gem not found. Add it to your Gemfile for hot reload.")
    return
  end

  @listener = Listen.to(*@dirs, only: /\.rb$/) do |modified, added, _removed|
    files = (modified + added).uniq
    schedule_reload(files) unless files.empty?
  end

  @listener.start
  @logger.info("plushie dev: watching #{@dirs.join(", ")} for changes")
end

#stopObject

Stop watching.



57
58
59
60
61
# File 'lib/plushie/dev_server.rb', line 57

def stop
  @listener&.stop
  @debounce_timer&.kill
  @listener = nil
end