class Middleman::CoreExtensions::FileWatcher::API

Core File Change API class

def changed(matcher=nil, &block)

Returns:
  • (Array) -

Parameters:
  • matcher (nil, Regexp) -- A Regexp to match the change path against
def changed(matcher=nil, &block)
  @_changed << [block, matcher] if block_given?
  @_changed
end

def deleted(matcher=nil, &block)

Returns:
  • (Array) -

Parameters:
  • matcher (nil, Regexp) -- A Regexp to match the deleted path against
def deleted(matcher=nil, &block)
  @_deleted << [block, matcher] if block_given?
  @_deleted
end

def did_change(path)

Returns:
  • (void) -

Parameters:
  • path (Pathname) -- The file that changed
def did_change(path)
  path = Pathname(path)
  return if ignored?(path)
  logger.debug "== File Change: #{path}"
  @known_paths << path
  self.run_callbacks(path, :changed)
end

def did_delete(path)

Returns:
  • (void) -

Parameters:
  • path (Pathname) -- The file that was deleted
def did_delete(path)
  path = Pathname(path)
  return if ignored?(path)
  logger.debug "== File Deletion: #{path}"
  @known_paths.delete(path)
  self.run_callbacks(path, :deleted)
end

def find_new_files(path)

Returns:
  • (void) -

Parameters:
  • path (Pathname) -- The path to reload
def find_new_files(path)
  reload_path(path, true)
end

def ignored?(path)

Returns:
  • (Boolean) -

Parameters:
  • path (Pathname) --
def ignored?(path)
  path = path.to_s
  IGNORE_LIST.any? { |r| path =~ r }
end

def initialize(app)

Initialize api and internal path cache
def initialize(app)
  @app = app
  @known_paths = Set.new
  @_changed = []
  @_deleted = []
end

def reload_path(path, only_new=false)

Returns:
  • (void) -

Parameters:
  • only_new (Boolean) -- Whether we only look for new files
  • path (Pathname) -- The path to reload
def reload_path(path, only_new=false)
  # chdir into the root directory so Pathname can work with relative paths
  Dir.chdir @app.root_path do
    path = Pathname(path)
    return unless path.exist?
    glob = (path + "**").to_s
    subset = @known_paths.select { |p| p.fnmatch(glob) }
    ::Middleman::Util.all_files_under(path).each do |filepath|
      next if only_new && subset.include?(filepath)
      subset.delete(filepath)
      did_change(filepath)
    end
    subset.each(&method(:did_delete)) unless only_new
  end
end

def run_callbacks(path, callbacks_name)

Returns:
  • (void) -

Parameters:
  • callbacks_name (Symbol) -- The name of the callbacks method
  • path (Pathname) -- The file that was changed
def run_callbacks(path, callbacks_name)
  path = path.to_s
  self.send(callbacks_name).each do |callback, matcher|
    next unless matcher.nil? || path.match(matcher)
    @app.instance_exec(path, &callback)
  end
end