Class: Pocketbook::CLI::Watcher

Inherits:
Object
  • Object
show all
Defined in:
lib/pocketbook/cli/watch_command.rb

Defined Under Namespace

Classes: ChangeBuffer

Constant Summary collapse

WATCHABLE_EXTENSIONS =
%w[.md .css .erb .yml .yaml].freeze
STOP_POLL_INTERVAL =
0.1

Instance Method Summary collapse

Constructor Details

#initialize(request:, stdout: $stdout, stderr: $stderr) ⇒ Watcher

Returns a new instance of Watcher.



80
81
82
83
84
85
86
87
88
89
90
# File 'lib/pocketbook/cli/watch_command.rb', line 80

def initialize(request:, stdout: $stdout, stderr: $stderr)
  @request = request
  @stdout = stdout
  @stderr = stderr
  @changes = ChangeBuffer.new(
    debounce_seconds: @request.debounce_ms.to_f / 1000.0,
    poll_interval: STOP_POLL_INTERVAL
  )
  @theme_root = nil
  @watch_directories = []
end

Instance Method Details

#runObject



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/pocketbook/cli/watch_command.rb', line 92

def run
  theme = build_theme
  @theme_root = theme.root_path
  @watch_directories = compute_watch_directories

  print_watch_banner
  render(reason: "initial build", preloaded_theme: theme, open_output: @request.open_output)

  listener = ::Listen.to(*@watch_directories) do |modified, added, removed|
    register_changes(modified + added + removed)
  end

  worker = Thread.new { worker_loop }

  with_signal_traps do
    listener.start
    @changes.wait_until_stopped
  end
ensure
  @changes.stop!
  listener&.stop
  worker&.join
  @stdout.puts("[pocketbook] Watch stopped.")
end