lib/fontcustom/watcher.rb
require "fontcustom"
require "listen"
module Fontcustom
class Watcher
include Utility
def initialize(options, is_test = false)
@base = Fontcustom::Base.new options
@options = @base.options
@is_test = is_test
templates = @options[:templates].dup.map { |template| File.basename(template) }
packaged = %w|preview css scss scss-rails|
templates.delete_if { |template| packaged.include?(template) }
create_listener(templates)
end
def watch
compile unless @options[:skip_first]
start
rescue SignalException # Catches Ctrl + C
stop
end
private
def create_listener(templates)
listen_options = {}
listen_options[:polling_fallback_message] = false if @is_test
listen_dirs = [@options[:input][:vectors]]
listen_dirs << @options[:input][:templates] unless templates.empty?
if listen_eq2
listen_options[:only] = /(#{templates.join("|")}|.+\.svg)$/
@listener = Listen.to(listen_dirs, listen_options, &callback)
else
listen_options[:filter] = /(#{templates.join("|")}|.+\.svg)$/
listen_options[:relative_paths] = true
@listener = Listen::Listener.new(*listen_dirs, listen_options, &callback)
end
end
def start
if @is_test # Non-blocking listener
@listener.start
else
if listen_eq2
@listener.start
sleep
else
@listener.start!
end
end
end
def stop
@listener.stop
shell.say "\nFont Custom is signing off. Good night and good luck.", :yellow
end
def callback
Proc.new do |modified, added, removed|
begin
say_message :changed, modified.join(", ") unless modified.empty?
say_message :added, added.join(", ") unless added.empty?
say_message :removed, removed.join(", ") unless removed.empty?
changed = modified + added + removed
compile unless changed.empty?
rescue Fontcustom::Error => e
say_message :error, e.message
end
end
end
def compile
@base.compile
end
def listen_eq2
begin
require 'listen/version'
::Listen::VERSION =~ /^2\./
rescue LoadError
false
end
end
end
end