diff --git a/lib/compass/actions.rb b/lib/compass/actions.rb new file mode 100644 index 00000000..9cf75914 --- /dev/null +++ b/lib/compass/actions.rb @@ -0,0 +1,72 @@ +module Compass + module Actions + + attr_writer :logger + + def logger + @logger ||= Logger.new + end + + # copy/process a template in the compass template directory to the project directory. + def copy(from, to, options = nil) + options ||= self.options if self.respond_to?(:options) + if File.exists?(to) && !options[:force] + #TODO: Detect differences & provide an overwrite prompt + msg = "#{basename(to)} already exists." + raise InstallationError.new(msg) + elsif File.exists?(to) + logger.record :overwrite, basename(to) + FileUtils.rm to unless options[:dry_run] + FileUtils.cp from, to unless options[:dry_run] + else + logger.record :create, basename(to) + FileUtils.cp from, to unless options[:dry_run] + end + end + + # create a directory and all the directories necessary to reach it. + def directory(dir, options = nil) + options ||= self.options if self.respond_to?(:options) + if File.exists?(dir) && File.directory?(dir) + logger.record :exists, basename(dir) + elsif File.exists?(dir) + msg = "#{basename(dir)} already exists and is not a directory." + raise InstallationError.new(msg) + else + logger.record :directory, basename(dir) + FileUtils.mkdir_p(dir) unless options[:dry_run] + end + end + + def write_file(file_name, contents, options = nil) + options ||= self.options if self.respond_to?(:options) + if File.exists?(file_name) && !options[:force] + msg = "File #{basename(file_name)} already exists. Run with --force to force creation." + raise InstallationError.new(msg) + end + if File.exists?(file_name) + logger.record :overwrite, basename(file_name) + else + logger.record :create, basename(file_name) + end + open(file_name,'w') do |file| + file.write(contents) + end + end + + def basename(file) + relativize(file) {|f| File.basename(file)} + end + + def relativize(path) + if path.index(working_path+File::SEPARATOR) == 0 + path[(working_path+File::SEPARATOR).length..-1] + elsif block_given? + yield path + else + path + end + end + + end +end \ No newline at end of file diff --git a/lib/compass/exec.rb b/lib/compass/exec.rb index e9b77d59..12c20e00 100644 --- a/lib/compass/exec.rb +++ b/lib/compass/exec.rb @@ -3,6 +3,7 @@ require 'rubygems' require 'haml' require File.join(Compass.lib_directory, 'compass', 'logger') require File.join(Compass.lib_directory, 'compass', 'configuration') +require File.join(Compass.lib_directory, 'compass', 'actions') module Compass module Exec diff --git a/lib/compass/installers/base.rb b/lib/compass/installers/base.rb index f30be0b5..9148790c 100644 --- a/lib/compass/installers/base.rb +++ b/lib/compass/installers/base.rb @@ -2,10 +2,12 @@ module Compass module Installers class Base + + include Compass::Actions + attr_accessor :template_path, :target_path, :working_path attr_accessor :options attr_accessor :manifest - attr_accessor :logger attr_accessor :css_dir, :sass_dir, :images_dir, :javascripts_dir def initialize(template_path, target_path, options = {}) @@ -14,7 +16,7 @@ module Compass @working_path = Dir.getwd @options = options @manifest = Manifest.new(manifest_file) - configure_option_with_default :logger + self.logger = options[:logger] configure end @@ -80,23 +82,19 @@ module Compass end def install_stylesheet(from, to, options) - copy from, "#{sass_dir}/#{to}" + copy templatize(from), targetize("#{sass_dir}/#{to}") end def install_image(from, to, options) - copy from, "#{images_dir}/#{to}" + copy templatize(from), targetize("#{images_dir}/#{to}") end def install_script(from, to, options) - copy from, "#{javascripts_dir}/#{to}" + copy templatize(from), targetize("#{javascripts_dir}/#{to}") end def install_file(from, to, options) - copy from, to - end - - def default_logger - Compass::Logger.new + copy templatize(from), targetize(to) end # returns an absolute path given a path relative to the current installation target. @@ -116,71 +114,6 @@ module Compass path.gsub(%r{/}, File::SEPARATOR) end - # copy/process a template in the compass template directory to the project directory. - def copy(from, to, options = nil) - options ||= self.options - from = templatize(from) - to = targetize(to) - if File.exists?(to) && !options[:force] - #TODO: Detect differences & provide an overwrite prompt - msg = "#{basename(to)} already exists." - raise InstallationError.new(msg) - elsif File.exists?(to) - logger.record :overwrite, basename(to) - FileUtils.rm to unless options[:dry_run] - FileUtils.cp from, to unless options[:dry_run] - else - logger.record :create, basename(to) - FileUtils.cp from, to unless options[:dry_run] - end - end - - # create a directory and all the directories necessary to reach it. - def directory(dir, options = nil) - options ||= self.options - dir = targetize(dir) - if File.exists?(dir) && File.directory?(dir) - logger.record :exists, basename(dir) - elsif File.exists?(dir) - msg = "#{basename(dir)} already exists and is not a directory." - raise InstallationError.new(msg) - else - logger.record :directory, basename(dir) - FileUtils.mkdir_p(dir) unless options[:dry_run] - end - end - - def write_file(file_name, contents, options = nil) - options ||= self.options - file_name = targetize(file_name) - if File.exists?(file_name) && !options[:force] - msg = "File #{basename(file_name)} already exists. Run with --force to force creation." - raise InstallationError.new(msg) - end - if File.exists?(file_name) - logger.record :overwrite, basename(file_name) - else - logger.record :create, basename(file_name) - end - open(file_name,'w') do |file| - file.write(contents) - end - end - - def basename(file) - relativize(file) {|f| File.basename(file)} - end - - def relativize(path) - if path.index(working_path+File::SEPARATOR) == 0 - path[(working_path+File::SEPARATOR).length..-1] - elsif block_given? - yield path - else - path - end - end - def stylesheet_links html = "\n" manifest.each_stylesheet do |stylesheet| diff --git a/lib/compass/installers/rails.rb b/lib/compass/installers/rails.rb index f896aa65..3874ea36 100644 --- a/lib/compass/installers/rails.rb +++ b/lib/compass/installers/rails.rb @@ -15,9 +15,9 @@ module Compass def init set_sass_dir unless sass_dir set_css_dir unless css_dir - directory css_dir - directory sass_dir - write_file 'config/initializers/compass.rb', initializer_contents + directory targetize(css_dir) + directory targetize(sass_dir) + write_file targetize('config/initializers/compass.rb'), initializer_contents end def prepare diff --git a/lib/compass/installers/stand_alone.rb b/lib/compass/installers/stand_alone.rb index ff333e83..0b4f9c35 100644 --- a/lib/compass/installers/stand_alone.rb +++ b/lib/compass/installers/stand_alone.rb @@ -13,14 +13,14 @@ module Compass end def init - directory "" - directory css_dir - directory sass_dir + directory targetize("") + directory targetize(css_dir) + directory targetize(sass_dir) end def prepare - directory images_dir if manifest.has_image? - directory javascripts_dir if manifest.has_javascript? + directory targetize(images_dir) if manifest.has_image? + directory targetize(javascripts_dir) if manifest.has_javascript? end def default_css_dir