Sha256: 45583c6b0384293860d309b62626ab81cb630a00462b1a895a8b05121d98ee8a

Contents?: true

Size: 1.05 KB

Versions: 17

Compression:

Stored size: 1.05 KB

Contents

# frozen_string_literal: true

require 'rb-inotify'

module Impression
  class FileWatcher
    def initialize(spec)
      @notifier = INotify::Notifier.new
      @buffer = []
      setup(spec)
    end

    def setup(spec)
      if File.file?(spec)
        setup_single_file(spec)
      elsif File.directory?(spec)
        setup_directory(spec)
      else
        dir = File.dir_name(spec)
        filename = File.basename(spec)
        if dir =~ /\/\*\*$/
          dir = File.dir_name(dir)
          filename = "**/#{filename}"
        end
        setup_directory(dir, filename)
      end
    end

    def setup_directory(dir)
      @notifier.watch(dir, :moved_to, :create, :move, :attrib, :modify, :delete) do |event|
        kind = event.flags.first

        @buffer << [kind, event.absolute_name]
      end
    end

    def each(&block)
      @receiver = Fiber.current
      io = @notifier.to_io
      loop do
        io.wait_readable
        @notifier.process
        next if @buffer.empty?

        @buffer.each(&block)
        @buffer.clear
      end
    end
  end
end

Version data entries

17 entries across 17 versions & 1 rubygems

Version Path
impression-0.17 lib/impression/file_watcher.rb
impression-0.16 lib/impression/file_watcher.rb
impression-0.15 lib/impression/file_watcher.rb
impression-0.14 lib/impression/file_watcher.rb
impression-0.13 lib/impression/file_watcher.rb
impression-0.12 lib/impression/file_watcher.rb
impression-0.11 lib/impression/file_watcher.rb
impression-0.10 lib/impression/file_watcher.rb
impression-0.9 lib/impression/file_watcher.rb
impression-0.8 lib/impression/file_watcher.rb
impression-0.7.1 lib/impression/file_watcher.rb
impression-0.7 lib/impression/file_watcher.rb
impression-0.6 lib/impression/file_watcher.rb
impression-0.5 lib/impression/file_watcher.rb
impression-0.4 lib/impression/file_watcher.rb
impression-0.3 lib/impression/file_watcher.rb
impression-0.2 lib/impression/file_watcher.rb