Class: Listen::Listener
- Inherits:
-
Object
- Object
- Listen::Listener
- Defined in:
- lib/listen/listener.rb
Constant Summary collapse
- RELATIVE_PATHS_WITH_MULTIPLE_DIRECTORIES_WARNING_MESSAGE =
"The relative_paths option doesn't work when listening to multiple diretories."
Instance Attribute Summary collapse
-
#block ⇒ Object
Returns the value of attribute block.
-
#changes ⇒ Object
Returns the value of attribute changes.
-
#directories ⇒ Object
Returns the value of attribute directories.
-
#options ⇒ Object
Returns the value of attribute options.
-
#paused ⇒ Object
Returns the value of attribute paused.
-
#thread ⇒ Object
Returns the value of attribute thread.
Instance Method Summary collapse
- #_init_actors ⇒ Object private
- #_init_debug ⇒ Object private
- #_init_options(options = {}) ⇒ Object private
- #_pop_changes ⇒ Object private
- #_signals_trap ⇒ Object private
- #_wait_for_changes ⇒ Object private
-
#ignore(regexps) ⇒ Object
Adds ignore patterns to the existing one (See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer).
-
#ignore!(regexps) ⇒ Object
Overwrites ignore patterns (See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer).
-
#initialize(*args) {|modified, added, removed| ... } ⇒ Listener
constructor
Initializes the directories listener.
-
#listen? ⇒ Boolean
Returns true if Listener is not paused.
-
#pause ⇒ Object
Pauses listening callback (adapter still running).
-
#paused? ⇒ Boolean
Returns true if Listener is paused.
-
#start ⇒ Object
Starts the listener by initializing the adapter and building the directory record concurrently, then it starts the adapter to watch for changes.
-
#stop ⇒ Object
Terminates all Listen actors and kill the adapter.
-
#unpause ⇒ Object
Unpauses listening callback.
Constructor Details
#initialize(*args) {|modified, added, removed| ... } ⇒ Listener
Initializes the directories listener.
23 24 25 26 27 28 29 |
# File 'lib/listen/listener.rb', line 23 def initialize(*args, &block) @options = (args.last.is_a?(Hash) ? args.pop : {}) @directories = args.flatten.map { |path| Pathname.new(path).realpath } @changes = [] @block = block _init_debug end |
Instance Attribute Details
#block ⇒ Object
Returns the value of attribute block.
9 10 11 |
# File 'lib/listen/listener.rb', line 9 def block @block end |
#changes ⇒ Object
Returns the value of attribute changes.
9 10 11 |
# File 'lib/listen/listener.rb', line 9 def changes @changes end |
#directories ⇒ Object
Returns the value of attribute directories.
9 10 11 |
# File 'lib/listen/listener.rb', line 9 def directories @directories end |
#options ⇒ Object
Returns the value of attribute options.
9 10 11 |
# File 'lib/listen/listener.rb', line 9 def @options end |
#paused ⇒ Object
Returns the value of attribute paused.
9 10 11 |
# File 'lib/listen/listener.rb', line 9 def paused @paused end |
#thread ⇒ Object
Returns the value of attribute thread.
9 10 11 |
# File 'lib/listen/listener.rb', line 9 def thread @thread end |
Instance Method Details
#_init_actors ⇒ Object (private)
118 119 120 121 122 123 |
# File 'lib/listen/listener.rb', line 118 def _init_actors Celluloid::Actor[:listen_silencer] = Silencer.new() Celluloid::Actor[:listen_change_pool] = Change.pool(args: self) Celluloid::Actor[:listen_adapter] = Adapter.new(self) Celluloid::Actor[:listen_record] = Record.new(self) end |
#_init_debug ⇒ Object (private)
110 111 112 113 114 115 116 |
# File 'lib/listen/listener.rb', line 110 def _init_debug if [:debug] Celluloid.logger.level = Logger::INFO else Celluloid.logger = nil end end |
#_init_options(options = {}) ⇒ Object (private)
103 104 105 106 107 108 |
# File 'lib/listen/listener.rb', line 103 def ( = {}) { debug: false, latency: nil, force_polling: false, polling_fallback_message: nil }.merge() end |
#_pop_changes ⇒ Object (private)
144 145 146 147 148 149 150 151 |
# File 'lib/listen/listener.rb', line 144 def _pop_changes changes = { modified: [], added: [], removed: [] } until @changes.empty? change = @changes.pop change.each { |k, v| changes[k] << v.to_s } end changes.each { |_, v| v.uniq! } end |
#_signals_trap ⇒ Object (private)
125 126 127 128 129 |
# File 'lib/listen/listener.rb', line 125 def _signals_trap if Signal.list.keys.include?('INT') Signal.trap('INT') { exit } end end |
#_wait_for_changes ⇒ Object (private)
131 132 133 134 135 136 137 138 139 140 141 142 |
# File 'lib/listen/listener.rb', line 131 def _wait_for_changes loop do changes = _pop_changes unless changes.all? { |_,v| v.empty? } block.call(changes[:modified], changes[:added], changes[:removed]) end sleep 0.1 end rescue => ex Kernel.warn "[Listen warning]: Change block raise an execption: #{$!}" Kernel.warn "Backtrace:\n\t#{ex.backtrace.join("\n\t")}" end |
#ignore(regexps) ⇒ Object
Adds ignore patterns to the existing one (See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer)
86 87 88 89 |
# File 'lib/listen/listener.rb', line 86 def ignore(regexps) [:ignore] = [[:ignore], regexps] Celluloid::Actor[:listen_silencer] = Silencer.new() end |
#ignore!(regexps) ⇒ Object
Overwrites ignore patterns (See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer)
95 96 97 98 99 |
# File 'lib/listen/listener.rb', line 95 def ignore!(regexps) .delete(:ignore) [:ignore!] = regexps Celluloid::Actor[:listen_silencer] = Silencer.new() end |
#listen? ⇒ Boolean
Returns true if Listener is not paused
78 79 80 |
# File 'lib/listen/listener.rb', line 78 def listen? @paused == false end |
#pause ⇒ Object
Pauses listening callback (adapter still running)
55 56 57 |
# File 'lib/listen/listener.rb', line 55 def pause @paused = true end |
#paused? ⇒ Boolean
Returns true if Listener is paused
70 71 72 |
# File 'lib/listen/listener.rb', line 70 def paused? @paused == true end |
#start ⇒ Object
Starts the listener by initializing the adapter and building the directory record concurrently, then it starts the adapter to watch for changes. The current thread is not blocked after starting.
35 36 37 38 39 40 41 |
# File 'lib/listen/listener.rb', line 35 def start _signals_trap _init_actors unpause Celluloid::Actor[:listen_adapter].async.start @thread = Thread.new { _wait_for_changes } end |
#stop ⇒ Object
Terminates all Listen actors and kill the adapter.
45 46 47 48 49 50 51 |
# File 'lib/listen/listener.rb', line 45 def stop thread.kill Celluloid::Actor.kill(Celluloid::Actor[:listen_adapter]) Celluloid::Actor[:listen_silencer].terminate Celluloid::Actor[:listen_change_pool].terminate Celluloid::Actor[:listen_record].terminate end |
#unpause ⇒ Object
Unpauses listening callback
61 62 63 64 |
# File 'lib/listen/listener.rb', line 61 def unpause Celluloid::Actor[:listen_record].build @paused = false end |