class Listen::Adapter::Windows
Adapter implementation for Windows ‘wdm`.
def self.usable?
def self.usable? return false unless super require 'wdm' true rescue LoadError Listen.logger.debug format('wdm - load failed: %s:%s', $ERROR_INFO, $ERROR_POSITION * "\n") Listen.adapter_warn(BUNDLER_DECLARE_GEM) false end
def _change(type)
def _change(type) { modified: [:modified, :attrib], # TODO: is attrib really passed? added: [:added, :renamed_new_file], removed: [:removed, :renamed_old_file] }.find do |change, types| types.include?(type) and break change end end
def _configure(dir)
def _configure(dir) require 'wdm' Listen.logger.debug 'wdm - starting...' @worker ||= WDM::Monitor.new @worker.watch_recursively(dir.to_s, :files) do |change| yield([:file, change]) end @worker.watch_recursively(dir.to_s, :directories) do |change| yield([:dir, change]) end @worker.watch_recursively(dir.to_s, :attributes, :last_write) do |change| yield([:attr, change]) end end
def _process_event(dir, event)
def _process_event(dir, event) Listen.logger.debug "wdm - callback: #{event.inspect}" type, change = event full_path = Pathname(change.path) rel_path = full_path.relative_path_from(dir).to_s options = { change: _change(change.type) } case type when :file _queue_change(:file, dir, rel_path, options) when :attr unless full_path.directory? _queue_change(:file, dir, rel_path, options) end when :dir case change.type when :removed # TODO: check if watched dir? _queue_change(:dir, dir, Pathname(rel_path).dirname.to_s, {}) when :added _queue_change(:dir, dir, rel_path, {}) # do nothing - changed directory means either: # - removed subdirs (handled above) # - added subdirs (handled above) # - removed files (handled by _file_callback) # - added files (handled by _file_callback) # so what's left? end end end
def _run
def _run @worker.run! end