Sha256: e9a7274e16594a2f0f1cc0894cb2daad75875d827cfe39d21fa7f7ec671f0f34

Contents?: true

Size: 1.38 KB

Versions: 4

Compression:

Stored size: 1.38 KB

Contents

module DeadlySerious
  module Engine
    class FileMonitor
      class Parts
        attr_reader :directory, :name

        def initialize(file_name)
          matcher = file_name.to_s.match(%r{\A((?<dir>.*)/)?(?<name>[^/]+)\z})
          @directory = matcher[:dir]
          @name = matcher[:name]
        end

        def exist?
          File.exist?(to_s)
        end

        def to_s
          File.join(@directory, @name)
        end
      end

      def initialize(*file_names)
        @parts = file_names.map { |f| Parts.new(f) }
      end

      def wait_creation
        part = @parts.find { |p| p.exist? }
        return part.to_s if part
        watch_event(@parts, :create)
      end

      def wait_modification
        notifier = INotify::Notifier.new
        @parts.each { |p| notifier.watch(p.to_s, :modify) { Fiber.yield p.to_s } }
        fiber = Fiber.new { notifier.process }
        fiber.resume
      end

      private

      def watch_event(parts, event)
        dirs = parts.group_by(&:directory)
        notifier = INotify::Notifier.new
        dirs.each do |dir, ps|
          files = ps.map(&:name)
          notifier.watch(dir, event) do |e|
            Fiber.yield(File.join(dir, e.name)) if files.include?(e.name)
          end
        end
        fiber = Fiber.new { notifier.run }
        file_name = fiber.resume
        notifier.stop
        file_name
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
deadly_serious-2.0.0.pre.rc4 lib/deadly_serious/engine/file_monitor.rb
deadly_serious-2.0.0.pre.rc3 lib/deadly_serious/engine/file_monitor.rb
deadly_serious-2.0.0.pre.rc2 lib/deadly_serious/engine/file_monitor.rb
deadly_serious-2.0.0.pre.rc1 lib/deadly_serious/engine/file_monitor.rb