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