Class: RailsAiBridge::Watcher

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_ai_bridge/watcher.rb,
lib/rails_ai_bridge/watcher/watch_directories.rb,
lib/rails_ai_bridge/watcher/bridge_regenerator.rb

Overview

File system watcher that regenerates bridge files when key files change. Requires the +listen+ gem (optional dependency).

Orchestrates WatchDirectories, the Listen listener loop, and BridgeRegenerator for regeneration work.

Defined Under Namespace

Classes: BridgeRegenerator, WatchDirectories

Constant Summary collapse

WATCH_PATTERNS =

Returns relative path segments watched by default (same as RailsAiBridge::Watcher::WatchDirectories::DEFAULT_PATTERNS).

Returns:

WatchDirectories::DEFAULT_PATTERNS

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app = nil) ⇒ Watcher

Returns a new instance of Watcher.

Parameters:

  • app (Rails::Application, nil) (defaults to: nil)

    defaults to +Rails.application+



17
18
19
20
# File 'lib/rails_ai_bridge/watcher.rb', line 17

def initialize(app = nil)
  @app = app || Rails.application
  @regenerator = BridgeRegenerator.new(@app)
end

Instance Attribute Details

#appRails::Application (readonly)

Returns host application.

Returns:

  • (Rails::Application)

    host application



14
15
16
# File 'lib/rails_ai_bridge/watcher.rb', line 14

def app
  @app
end

Instance Method Details

#startvoid

This method returns an undefined value.

Starts the Listen loop until SIGINT (Interrupt). Exits the process if +listen+ is missing.



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/rails_ai_bridge/watcher.rb', line 25

def start
  require 'listen'

  root = app.root.to_s
  dirs = WatchDirectories.resolve(root)

  if dirs.empty?
    warn '[rails-ai-bridge] No watchable directories found'
    return
  end

  warn '[rails-ai-bridge] Watching for changes...'
  warn "[rails-ai-bridge] Directories: #{dirs.map { |d| d.sub("#{root}/", '') }.join(', ')}"

  listener = Listen.to(*dirs) do |modified, added, removed|
    next if (modified + added + removed).empty?

    handle_change
  end

  listener.start

  loop do
    sleep 1
  rescue Interrupt
    warn "\n[rails-ai-bridge] Stopping watcher..."
    listener.stop
    break
  end
rescue LoadError
  warn 'Error: The `listen` gem is required for watch mode.'
  warn "Add to your Gemfile:  gem 'listen', group: :development"
  raise SystemExit, 1
end