# class Listen::Adapter::Windows

Adapter implementation for Windows `wdm`.

### Constants

BUNDLER_DECLARE_GEM
OS_REGEXP

### Public Class Methods

usable?() click to toggle source
Calls superclass method Listen::Adapter::Base.usable?

    # File lib/listen/adapter/windows.rb, line 13
    def self.usable?
      return false unless super
      require 'wdm'
      true
    rescue LoadError
      _log :debug, format('wdm - load failed: %s:%s', $ERROR_INFO,
                          $ERROR_POSITION * "\n")

      Kernel.warn BUNDLER_DECLARE_GEM
      false
    end

### Private Instance Methods

_change(type) click to toggle source

    # File lib/listen/adapter/windows.rb, line 89
    def _change(type)
      { modified: [:modified, :attrib], # TODO: is attrib really passed?
        added:    [:added, :renamed_new_file],
        removed:  [:removed, :renamed_old_file] }.each do |change, types|
        return change if types.include?(type)
      end
      nil
    end

_configure(dir, &callback) click to toggle source

    # File lib/listen/adapter/windows.rb, line 27
    def _configure(dir, &callback)
      require 'wdm'
      _log :debug, 'wdm - starting...'
      @worker ||= WDM::Monitor.new
      @worker.watch_recursively(dir.to_s, :files) do |change|
        callback.call([:file, change])
      end

      @worker.watch_recursively(dir.to_s, :directories) do |change|
        callback.call([:dir, change])
      end

      events = [:attributes, :last_write]
      @worker.watch_recursively(dir.to_s, *events) do |change|
        callback.call([:attr, change])
      end
    end

_process_event(dir, event) click to toggle source

    # File lib/listen/adapter/windows.rb, line 49
    def _process_event(dir, event)
      _log :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
        if change.type == :removed
          # TODO: check if watched dir?
          _queue_change(:dir, dir, Pathname(rel_path).dirname.to_s, {})
        elsif change.type == :added
          _queue_change(:dir, dir, rel_path, {})
        else
          # 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
    rescue
      details = event.inspect
      _log :error, format('wdm - callback (%): %s:%s', details, $ERROR_INFO,
                          $ERROR_POSITION * "\n")
      raise
    end

_run() click to toggle source

    # File lib/listen/adapter/windows.rb, line 45
    def _run
      @worker.run!
    end