class Sass::Plugin::Listener
@private
files, as well as a somewhat cleaner event dispatch API.
A wrapper around the Listen gem. Adds support for listening to individual
def directory(path, events)
def directory(path, events) (@directories[path] ||= []) << events end
def file(path, events)
def file(path, events) file_base = File.basename(path) directory(File.dirname(path), { :modified => file_event_fn(events[:modified], file_base), :added => file_event_fn(events[:added], file_base), :removed => file_event_fn(events[:removed], file_base) }) end
def file_event_fn(event, file_base)
def file_event_fn(event, file_base) lambda do |dir, base| next unless event next unless base == file_base event.call end end
def initialize
def initialize @directories = {} yield self begin start! rescue Exception => e raise e unless e.is_a?(Interrupt) end end
def run_events(paths, event, path)
def run_events(paths, event, path) return if paths.nil? || event.nil? paths.each {|p| event[File.dirname(p), File.basename(p)]} end
def start!
def start! listener = Listen::MultiListener.new(*@directories.keys) do |modified, added, removed| modified = modified.group_by {|path| File.dirname(path)} added = added.group_by {|path| File.dirname(path)} removed = removed.group_by {|path| File.dirname(path)} @directories.each do |dir, events| events.each do |e| run_events(modified[dir], e[:modified], dir) run_events(added[dir], e[:added], dir) run_events(removed[dir], e[:removed], dir) end end end.start end