lib/guard/compass.rb in guard-compass-0.0.6 vs lib/guard/compass.rb in guard-compass-0.0.8

- old
+ new

@@ -1,56 +1,163 @@ require 'guard' require 'guard/guard' +require 'guard/watcher' +require 'guard/reporter' +require 'guard/compass_helper' require 'compass' require 'compass/commands' require 'compass/logger' +require 'compass/compiler' +module Compass + class Compiler + alias :old_handle_exception :handle_exception + def handle_exception(sass_filename, css_filename, e) + old_handle_exception(sass_filename, css_filename, e) + # rethrow the exception, we need it to notificate the user! + raise Sass::SyntaxError, "[#{File.basename(sass_filename)}:#{e.sass_line}] #{e.message}" + end + end +end + module Guard class Compass < Guard - attr_reader :updater - - VERSION = '0.0.6' - + attr_reader :updater, :working_path + attr_accessor :reporter + def initialize(watchers = [], options = {}) super - @options[:workdir] = File.expand_path(File.dirname(".")) + @reporter = Reporter.new + @working_path = Pathname.pwd # the Guard base path is the current working_path end - + + # Load Compass Configuration + def create_watchers + # root_path is the path to the compass project + # working_path is the current Guard (and by extension Compass) working directory + + watchers.clear + + config_file = (options[:configuration_file] || ::Compass.detect_configuration_file(root_path)) + config_path = pathname(working_path, config_file) + src_path = pathname(root_path, ::Compass.configuration.sass_dir) + + watchers.push Watcher.new(%r{^#{src_path.relative_path_from(working_path)}/.*}) + watchers.push Watcher.new(%r{^#{config_path.relative_path_from(working_path)}$}) + end + + def root_path + options[:project_path].nil? ? working_path : pathname(working_path, options[:project_path]) + end + + def valid_sass_path? + if ::Compass.configuration.sass_dir.nil? + reporter.failure("Sass files src directory not set.\nPlease check your Compass configuration.") + return false + end + + path = pathname(root_path, ::Compass.configuration.sass_dir ) + + unless path.exist? + reporter.failure("Sass files src directory not found: #{path}\nPlease check your Compass configuration.") + false + else + true + end + end + + def valid_configuration_path? + config_file = (options[:configuration_file] || ::Compass.detect_configuration_file(root_path)) + + if config_file.nil? + reporter.failure "Cannot find a Compass configuration file, please add information to your Guardfile guard 'compass' declaration." + return false + end + + config_path = pathname(working_path, config_file) + + if config_path.exist? + true + else + reporter.failure "Compass configuration file not found: #{config_path}\nPlease check Guard configuration." + false + end + end + # Guard Interface Implementation - + # Compile all the sass|scss stylesheets def start create_updater - UI.info "Guard::Compass is watching at your stylesheets." + if options[:compile_on_start] + reporter.announce "Guard::Compass is going to compile your stylesheets." + perform + else + reporter.announce "Guard::Compass is waiting to compile your stylesheets." + end true end - + def stop @updater = nil true end - + # Reload the configuration def reload create_updater true end - + # Compile all the sass|scss stylesheets def run_all - @updater.execute - true + perform end - + # Compile the changed stylesheets def run_on_change(paths) - @updater.execute - true + perform end - + private + include CompassHelper + + # Cleanup of the given options + def cleanup_options + # Ensure configuration file make reference to an absolute path. + if options[:configuration_file] + options[:configuration_file] = pathname(working_path, options[:configuration_file]).to_s + end + end + + def perform + if valid_sass_path? + begin + @updater.execute + rescue Sass::SyntaxError => e + msg = "#{e.sass_backtrace_str}" + ::Guard::Notifier.notify msg, :title => "Guard Compass", :image => :failed + return false + rescue Exception => e + ::Guard::Notifier.notify e.to_s, :title => "Guard Compass", :image => :failed + return false + end + true + else + false + end + end + def create_updater - @updater = ::Compass::Commands::UpdateProject.new(@options[:workdir] , @options) + cleanup_options + if valid_configuration_path? + @updater = ::Compass::Commands::UpdateProject.new(working_path.to_s, options) + create_watchers + return valid_sass_path? + else + return false + end end + end -end \ No newline at end of file +end