Class: Middleman::CoreExtensions::FileWatcher::API

Inherits:
Object
  • Object
show all
Defined in:
lib/middleman-core/core_extensions/file_watcher.rb

Overview

Core File Change API class

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ API

Initialize api and internal path cache



60
61
62
63
64
65
66
# File 'lib/middleman-core/core_extensions/file_watcher.rb', line 60

def initialize(app)
  @app = app
  @known_paths = Set.new

  @_changed = []
  @_deleted = []
end

Instance Attribute Details

#appObject (readonly)

Returns the value of attribute app.



56
57
58
# File 'lib/middleman-core/core_extensions/file_watcher.rb', line 56

def app
  @app
end

Instance Method Details

#changed(matcher = nil, &block) ⇒ Array<Proc>

Add callback to be run on file change

Parameters:

  • matcher (nil, Regexp) (defaults to: nil)

    A Regexp to match the change path against

Returns:

  • (Array<Proc>)


72
73
74
75
# File 'lib/middleman-core/core_extensions/file_watcher.rb', line 72

def changed(matcher=nil, &block)
  @_changed << [block, matcher] if block_given?
  @_changed
end

#deleted(matcher = nil, &block) ⇒ Array<Proc>

Add callback to be run on file deletion

Parameters:

  • matcher (nil, Regexp) (defaults to: nil)

    A Regexp to match the deleted path against

Returns:

  • (Array<Proc>)


81
82
83
84
# File 'lib/middleman-core/core_extensions/file_watcher.rb', line 81

def deleted(matcher=nil, &block)
  @_deleted << [block, matcher] if block_given?
  @_deleted
end

#did_change(path) ⇒ void

This method returns an undefined value.

Notify callbacks that a file changed

Parameters:

  • path (Pathname)

    The file that changed



90
91
92
93
94
95
96
# File 'lib/middleman-core/core_extensions/file_watcher.rb', line 90

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

#did_delete(path) ⇒ void

This method returns an undefined value.

Notify callbacks that a file was deleted

Parameters:

  • path (Pathname)

    The file that was deleted



102
103
104
105
106
107
108
# File 'lib/middleman-core/core_extensions/file_watcher.rb', line 102

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

#find_new_files(path) ⇒ void

This method returns an undefined value.

Like reload_path, but only triggers events on new files

Parameters:

  • path (Pathname)

    The path to reload



139
140
141
# File 'lib/middleman-core/core_extensions/file_watcher.rb', line 139

def find_new_files(path)
  reload_path(path, true)
end

#reload_path(path, only_new = false) ⇒ void

This method returns an undefined value.

Manually trigger update events

Parameters:

  • path (Pathname)

    The path to reload

  • only_new (Boolean) (defaults to: false)

    Whether we only look for new files



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/middleman-core/core_extensions/file_watcher.rb', line 115

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