Module: Compass::Actions

Included in:
Commands::Base, Compiler, Installers::Base, SassCompiler
Defined in:
lib/compass/actions.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#loggerObject



6
7
8
# File 'lib/compass/actions.rb', line 6

def logger
  @logger ||= ::Compass::Logger.new
end

Instance Method Details

#basename(file) ⇒ Object



82
83
84
# File 'lib/compass/actions.rb', line 82

def basename(file)
  relativize(file) {|f| File.basename(file)}
end

#copy(from, to, options = nil, binary = false) ⇒ Object

copy/process a template in the compass template directory to the project directory.



11
12
13
14
15
16
17
18
19
# File 'lib/compass/actions.rb', line 11

def copy(from, to, options = nil, binary = false)
  options ||= self.options if self.respond_to?(:options)
  if binary
    contents = File.new(from,"rb").read
  else
    contents = File.new(from).read
  end  
  write_file to, contents, options, binary
end

#directory(dir, options = nil) ⇒ Object

create a directory and all the directories necessary to reach it.



22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/compass/actions.rb', line 22

def directory(dir, options = nil)
  options ||= self.options if self.respond_to?(:options)
  options ||= {}
  if File.exists?(dir) && File.directory?(dir)
      # do nothing
  elsif File.exists?(dir)
    msg = "#{basename(dir)} already exists and is not a directory."
    raise Compass::FilesystemConflict.new(msg)
  else
    log_action :directory, separate("#{basename(dir)}/"), options
    FileUtils.mkdir_p(dir)
  end
end

#log_action(action, file, options) ⇒ Object



107
108
109
110
111
112
113
114
# File 'lib/compass/actions.rb', line 107

def log_action(action, file, options)
  quiet = !!options[:quiet]
  quiet = false if options[:loud] && options[:loud] == true
  quiet = false if options[:loud] && options[:loud].is_a?(Array) && options[:loud].include?(action)
  unless quiet
    logger.record(action, file, options[:extra].to_s)
  end
end

#process_erb(contents, ctx = nil) ⇒ Object



66
67
68
69
# File 'lib/compass/actions.rb', line 66

def process_erb(contents, ctx = nil)
  ctx = Object.new.instance_eval("binding") unless ctx.is_a? Binding
  ERB.new(contents).result(ctx)
end

#relativize(path) ⇒ Object



86
87
88
89
90
91
92
93
94
95
# File 'lib/compass/actions.rb', line 86

def relativize(path)
  path = File.expand_path(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

#remove(file_name) ⇒ Object



71
72
73
74
75
76
77
78
79
80
# File 'lib/compass/actions.rb', line 71

def remove(file_name)
  file_name ||= ''
  if File.directory?(file_name)
    FileUtils.rm_rf file_name
    log_action :remove, basename(file_name)+"/", options
  elsif File.exists?(file_name)
    File.unlink file_name
    log_action :remove, basename(file_name), options
  end
end

#separate(path) ⇒ Object

Write paths like we’re on unix and then fix it



98
99
100
# File 'lib/compass/actions.rb', line 98

def separate(path)
  path.gsub(%r{/}, File::SEPARATOR)
end

#strip_trailing_separator(path) ⇒ Object

Removes the trailing separator, if any, from a path.



103
104
105
# File 'lib/compass/actions.rb', line 103

def strip_trailing_separator(path)
  (path[-1..-1] == File::SEPARATOR) ? path[0..-2] : path
end

#write_file(file_name, contents, options = nil, binary = false) ⇒ Object

Write a file given the file contents as a string



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/compass/actions.rb', line 37

def write_file(file_name, contents, options = nil, binary = false)
  options ||= self.options if self.respond_to?(:options)
  skip_write = false
  contents = process_erb(contents, options[:erb]) if options[:erb]
  if File.exists?(file_name)
    existing_contents = IO.read(file_name)
    if existing_contents == contents
      log_action :identical, basename(file_name), options
      skip_write = true
    elsif options[:force]
      log_action :overwrite, basename(file_name), options
    else
      msg = "File #{basename(file_name)} already exists. Run with --force to force overwrite."
      raise Compass::FilesystemConflict.new(msg)
    end
  else
    log_action :create, basename(file_name), options
  end
  if skip_write
    FileUtils.touch file_name
  else
    mode = "w"
    mode << "b" if binary
    open(file_name, mode) do |file|
      file.write(contents)
    end
  end
end