Class: Plushie::DevServer
- Inherits:
-
Object
- Object
- Plushie::DevServer
- 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
Instance Method Summary collapse
-
#initialize(event_queue:, dirs: nil, debounce_ms: 100) ⇒ DevServer
constructor
A new instance of DevServer.
-
#start ⇒ Object
Start watching for file changes.
-
#stop ⇒ Object
Stop watching.
Constructor Details
#initialize(event_queue:, dirs: nil, debounce_ms: 100) ⇒ DevServer
Returns a new instance of DevServer.
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
#start ⇒ Object
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 |
#stop ⇒ Object
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 |