Sha256: 159e701814525fd25255ec391d816cd4120ca8980a233d422319d530455cab47

Contents?: true

Size: 1.83 KB

Versions: 26

Compression:

Stored size: 1.83 KB

Contents

require "active_support"

module Lookbook
  class Reloaders
    attr_reader :reloaders

    def initialize
      @reloaders = []
    end

    def add(name, directories, extensions, &callback)
      reloader = Reloader.new(name, directories, extensions, &callback)
      reloaders.push(reloader)

      if Engine.reloading?
        Rails.application.reloaders << reloader
        Rails.application.reloader.to_run { reloader.execute_if_updated }
      end
    end

    def execute
      reloaders.each { |reloader| reloader.execute }
    end

    def register_changes(changes)
      reloader = reloaders.find { |reloader| reloader.watching?(changes) }
      reloader.last_changes = changes if reloader
    end

    class Reloader
      delegate :execute, :execute_if_updated, :updated?, to: :file_watcher

      attr_reader :name, :directories, :extensions, :callback
      attr_accessor :last_changes

      def initialize(name, directories, extensions, &callback)
        @name = name.to_sym
        @directories = directories
        @extensions = extensions
        @callback = callback
        @last_changes = nil
      end

      def watching?(changes)
        file_paths = changes.to_h.values.flatten
        !!file_paths.find do |file_path|
          file_path = Pathname(file_path).expand_path
          directories.find do |dir_path|
            matcher = File.expand_path(File.join(dir_path, "**"))
            file_path.fnmatch?(matcher)
          end
        end
      end

      protected

      def file_watcher
        return @_file_watcher if @_file_watcher

        to_watch = directories.each_with_object({}) do |directory, result|
          result[directory] = extensions
        end

        @_file_watcher ||= FileWatcher.new([], to_watch) do
          callback.call(@last_changes)
          @last_changes = nil
        end
      end
    end
  end
end

Version data entries

26 entries across 26 versions & 1 rubygems

Version Path
lookbook-2.3.2 lib/lookbook/reloaders.rb
lookbook-2.3.0 lib/lookbook/reloaders.rb
lookbook-2.2.2 lib/lookbook/reloaders.rb
lookbook-2.2.1 lib/lookbook/reloaders.rb
lookbook-2.2.0 lib/lookbook/reloaders.rb
lookbook-2.1.1 lib/lookbook/reloaders.rb
lookbook-2.1.0 lib/lookbook/reloaders.rb
lookbook-2.0.5 lib/lookbook/reloaders.rb
lookbook-2.0.4 lib/lookbook/reloaders.rb
lookbook-2.0.3 lib/lookbook/reloaders.rb
lookbook-2.0.2 lib/lookbook/reloaders.rb
lookbook-2.0.1 lib/lookbook/reloaders.rb
lookbook-2.0.0 lib/lookbook/reloaders.rb
lookbook-2.0.0.rc.3 lib/lookbook/reloaders.rb
lookbook-2.0.0.rc.2 lib/lookbook/reloaders.rb
lookbook-2.0.0.rc.1 lib/lookbook/reloaders.rb
lookbook-2.0.0.beta.9 lib/lookbook/reloaders.rb
lookbook-2.0.0.beta.8 lib/lookbook/reloaders.rb
lookbook-2.0.0.beta.7 lib/lookbook/reloaders.rb
lookbook-2.0.0.beta.6 lib/lookbook/reloaders.rb