compass 0.11.alpha.3 → 0.11.alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,4 +2,4 @@
2
2
  :major: 0
3
3
  :minor: 11
4
4
  :state: alpha
5
- :build: 3
5
+ :build: 4
@@ -22,8 +22,7 @@ fallback_load_path(File.join(File.dirname(__FILE__), '..', 'lib')) do
22
22
  end
23
23
 
24
24
  runner = Proc.new do
25
- command_line_class = Compass::Exec::Helpers.select_appropriate_command_line_ui(ARGV)
26
- command_line_class.new(ARGV).run!
25
+ Compass::Exec::SubCommandUI.new(ARGV).run!
27
26
  end
28
27
 
29
28
  if ARGV.delete("--profile")
@@ -33,19 +33,20 @@ module Compass
33
33
  options ||= self.options if self.respond_to?(:options)
34
34
  skip_write = options[:dry_run]
35
35
  contents = process_erb(contents, options[:erb]) if options[:erb]
36
+ extra = options[:extra] || ""
36
37
  if File.exists?(file_name)
37
38
  existing_contents = IO.read(file_name)
38
39
  if existing_contents == contents
39
- logger.record :identical, basename(file_name)
40
+ logger.record :identical, basename(file_name), extra
40
41
  skip_write = true
41
42
  elsif options[:force]
42
- logger.record :overwrite, basename(file_name)
43
+ logger.record :overwrite, basename(file_name), extra
43
44
  else
44
45
  msg = "File #{basename(file_name)} already exists. Run with --force to force overwrite."
45
46
  raise Compass::FilesystemConflict.new(msg)
46
47
  end
47
48
  else
48
- logger.record :create, basename(file_name)
49
+ logger.record :create, basename(file_name), extra
49
50
  end
50
51
  if skip_write
51
52
  FileUtils.touch file_name unless options[:dry_run]
@@ -3,7 +3,7 @@ end
3
3
 
4
4
  require 'compass/commands/registry'
5
5
 
6
- %w(base generate_grid_background help list_frameworks project_base
6
+ %w(base generate_grid_background default help list_frameworks project_base
7
7
  update_project watch_project create_project imports installer_command
8
8
  print_version project_stats stamp_pattern sprite validate_project
9
9
  write_configuration interactive unpack_extension).each do |lib|
@@ -0,0 +1,50 @@
1
+ module Compass
2
+ module Commands
3
+ module DefaultOptionsParser
4
+ def set_options(opts)
5
+ opts.on("--trace") do
6
+ self.options[:trace] = true
7
+ end
8
+ opts.on("-?", "-h", "--help") do
9
+ self.options[:command] = Proc.new do
10
+ Help.new(working_path, options.merge(:help_command => "help"))
11
+ end
12
+ end
13
+ opts.on("-q", "--quiet") do
14
+ self.options[:quiet] = true
15
+ end
16
+ opts.on("-v", "--version") do
17
+ self.options[:command] = Proc.new do
18
+ PrintVersion.new(working_path, options)
19
+ end
20
+ end
21
+ super
22
+ end
23
+ end
24
+ class Default < Base
25
+
26
+ class << self
27
+ def option_parser(arguments)
28
+ parser = Compass::Exec::CommandOptionParser.new(arguments)
29
+ parser.extend(DefaultOptionsParser)
30
+ end
31
+ # def usage
32
+ # $stderr.puts caller.join("\n")
33
+ # "XXX"
34
+ # end
35
+ def parse!(arguments)
36
+ parser = option_parser(arguments)
37
+ parser.parse!
38
+ parser.options[:command] ||= Proc.new do
39
+ Help.new(working_path, options.merge(:help_command => "help"))
40
+ end
41
+ parser.options
42
+ end
43
+ end
44
+
45
+ def execute
46
+ instance_eval(&options[:command]).execute
47
+ end
48
+ end
49
+ end
50
+ end
@@ -9,6 +9,10 @@ Description:
9
9
  build and maintain your stylesheets and makes it easy
10
10
  for you to use stylesheet libraries provided by others.
11
11
 
12
+ Donating:
13
+ Compass is charityware. If you find it useful please make
14
+ a tax deductable donation: http://umdf.org/compass
15
+
12
16
  To get help on a particular command please specify the command.
13
17
 
14
18
  }
@@ -83,6 +83,8 @@ Options:
83
83
  lines << "Compass #{::Compass.version[:string]}"
84
84
  lines << "Copyright (c) 2008-#{Time.now.year} Chris Eppstein"
85
85
  lines << "Released under the MIT License."
86
+ lines << "Compass is charityware."
87
+ lines << "Please make a tax deductable donation: http://umdf.org/compass"
86
88
  puts lines.join("\n")
87
89
  end
88
90
  end
@@ -5,6 +5,7 @@ module Compass::Commands
5
5
  @commands[name.to_sym] = command_class
6
6
  end
7
7
  def get(name)
8
+ return unless name
8
9
  @commands ||= Hash.new
9
10
  @commands[name.to_sym] || @commands[abbreviation_of(name)]
10
11
  end
@@ -13,6 +14,8 @@ module Compass::Commands
13
14
  matching = @commands.keys.select{|k| k.to_s =~ re}
14
15
  if matching.size == 1
15
16
  matching.first
17
+ elsif name =~ /^-/
18
+ nil
16
19
  else
17
20
  raise Compass::Error, "Ambiguous abbreviation '#{name}'. Did you mean one of: #{matching.join(", ")}"
18
21
  end
@@ -14,6 +14,9 @@ module Compass
14
14
  Options:
15
15
  }.split("\n").map{|l| l.gsub(/^ */,'')}.join("\n")
16
16
 
17
+ opts.on("--time", "Display compilation times.") do
18
+ self.options[:time] = true
19
+ end
17
20
  super
18
21
  end
19
22
  end
@@ -51,6 +54,7 @@ module Compass
51
54
  :sass_files => explicit_sass_files,
52
55
  :dry_run => options[:dry_run])
53
56
  compiler_opts[:quiet] = options[:quiet] if options[:quiet]
57
+ compiler_opts[:time] = options[:time] if options[:time]
54
58
  compiler_opts.merge!(additional_options)
55
59
  Compass::Compiler.new(working_path,
56
60
  Compass.configuration.sass_path,
@@ -60,6 +60,7 @@ module Compass
60
60
 
61
61
  FSSM.monitor do |monitor|
62
62
  Compass.configuration.sass_load_paths.each do |load_path|
63
+ next unless load_path.is_a? String
63
64
  monitor.path load_path do |path|
64
65
  path.glob '**/*.s[ac]ss'
65
66
 
@@ -76,29 +76,49 @@ module Compass
76
76
  target_directories.each {|dir| directory dir}
77
77
 
78
78
  # Compile each sass file.
79
- sass_files.zip(css_files).each do |sass_filename, css_filename|
80
- begin
81
- compile_if_required sass_filename, css_filename
82
- rescue Sass::SyntaxError => e
83
- handle_exception(sass_filename, css_filename, e)
79
+ result = timed do
80
+ sass_files.zip(css_files).each do |sass_filename, css_filename|
81
+ begin
82
+ compile_if_required sass_filename, css_filename
83
+ rescue Sass::SyntaxError => e
84
+ handle_exception(sass_filename, css_filename, e)
85
+ end
84
86
  end
85
87
  end
88
+ if options[:time]
89
+ puts "Compilation took #{(result.__duration * 1000).round / 1000.0}s"
90
+ end
86
91
  end
87
92
 
88
93
  def compile_if_required(sass_filename, css_filename)
89
94
  if should_compile?(sass_filename, css_filename)
90
- compile sass_filename, css_filename
95
+ compile sass_filename, css_filename, :time => options[:time]
91
96
  else
92
97
  logger.record :unchanged, basename(sass_filename) unless options[:quiet]
93
98
  end
94
99
  end
95
100
 
101
+ def timed
102
+ start_time = Time.now
103
+ res = yield
104
+ end_time = Time.now
105
+ res.instance_variable_set("@__duration", end_time - start_time)
106
+ def res.__duration
107
+ @__duration
108
+ end
109
+ res
110
+ end
111
+
96
112
  # Compile one Sass file
97
- def compile(sass_filename, css_filename)
113
+ def compile(sass_filename, css_filename, additional_options = {})
114
+ start_time = end_time = nil
98
115
  css_content = logger.red do
99
- engine(sass_filename, css_filename).render
116
+ timed do
117
+ engine(sass_filename, css_filename).render
118
+ end
100
119
  end
101
- write_file(css_filename, css_content, options.merge(:force => true))
120
+ duration = additional_options[:time] ? "(#{(css_content.__duration * 1000).round / 1000.0}s)" : ""
121
+ write_file(css_filename, css_content, options.merge(:force => true, :extra => duration))
102
122
  end
103
123
 
104
124
  def should_compile?(sass_filename, css_filename)
@@ -16,7 +16,7 @@ end
16
16
  module Compass::Exec
17
17
  end
18
18
 
19
- %w(helpers switch_ui sub_command_ui
19
+ %w(helpers sub_command_ui
20
20
  global_options_parser project_options_parser
21
21
  command_option_parser).each do |lib|
22
22
  require "compass/exec/#{lib}"
@@ -1,18 +1,6 @@
1
1
  module Compass::Exec
2
2
  module Helpers
3
3
  extend self
4
- def select_appropriate_command_line_ui(arguments)
5
- if Compass::Commands.command_exists? arguments.first
6
- SubCommandUI
7
- else
8
- unless arguments.include?("-h") || arguments.include?("--help")
9
- Compass::Logger.new.red do
10
- Compass::Util.compass_warn "WARNING: This interface is deprecated. Please use the new subcommand interface.\nSee `compass help` for more information.\n"
11
- end
12
- end
13
- SwitchUI
14
- end
15
- end
16
4
  def report_error(e, options)
17
5
  $stderr.puts "#{e.class} on line #{get_line e} of #{get_file e}: #{e.message}"
18
6
  if options[:trace]
@@ -30,6 +30,11 @@ module Compass::Exec
30
30
  def perform!
31
31
  $command = args.shift
32
32
  command_class = Compass::Commands[$command]
33
+ unless command_class
34
+ args.unshift($command)
35
+ $command = "help"
36
+ command_class = Compass::Commands::Default
37
+ end
33
38
  @options = if command_class.respond_to?("parse_#{$command}!")
34
39
  command_class.send("parse_#{$command}!", args)
35
40
  else
@@ -38,7 +43,7 @@ module Compass::Exec
38
43
  command_class.new(Dir.getwd, @options).execute
39
44
  rescue OptionParser::ParseError => e
40
45
  puts "Error: #{e.message}"
41
- puts command_class.usage
46
+ puts command_class.usage if command_class.respond_to?(:usage)
42
47
  end
43
48
 
44
49
  end
@@ -70,7 +70,7 @@ module Compass::SassExtensions::Functions::Sprites
70
70
  :repeat => repeat_for(sprite_name),
71
71
  :spacing => spacing_for(sprite_name),
72
72
  :position => position_for(sprite_name),
73
- :digest => MD5.file(file).hexdigest
73
+ :digest => Digest::MD5.file(file).hexdigest
74
74
  }
75
75
  end
76
76
  @images.each_with_index do |image, index|
@@ -163,7 +163,8 @@ module Compass::SassExtensions::Functions::Sprites
163
163
 
164
164
  def uniqueness_hash
165
165
  @uniqueness_hash ||= begin
166
- sum = MD5.md5(SPRITE_VERSION)
166
+ sum = Digest::MD5.new
167
+ sum << SPRITE_VERSION
167
168
  sum << path
168
169
  images.each do |image|
169
170
  [:relative_file, :height, :width, :repeat, :spacing, :position, :digest].each do |attr|
@@ -5,8 +5,11 @@ module FSSM::Backends
5
5
  end
6
6
 
7
7
  def add_handler(handler, preload=true)
8
- @notifier.watch(handler.path.to_s, :all_events) do |event|
9
- handler.refresh(event.name)
8
+ @notifier.watch(handler.path.to_s, :recursive, :attrib, :modify, :create,
9
+ :delete, :delete_self, :moved_from, :moved_to, :move_self) do |event|
10
+ path = FSSM::Pathname.for(event.absolute_name)
11
+ path = path.dirname unless event.name == "" # Event on root directory
12
+ handler.refresh(path)
10
13
  end
11
14
 
12
15
  handler.refresh(nil, true) if preload
@@ -1,65 +1,50 @@
1
- # The bundled ruby pathname library is a slow and hideous beast.
2
- # There. I said it. This version is based on pathname3.
1
+ require 'fileutils'
2
+ require 'find'
3
3
 
4
4
  module FSSM
5
5
  class Pathname < String
6
+ SYMLOOP_MAX = 8
6
7
 
7
- SEPARATOR = Regexp.quote(File::SEPARATOR)
8
-
9
- if File::ALT_SEPARATOR
10
- ALT_SEPARATOR = Regexp.quote(File::ALT_SEPARATOR)
11
- SEPARATOR_PAT = Regexp.compile("[#{SEPARATOR}#{ALT_SEPARATOR}]")
12
- else
13
- SEPARATOR_PAT = Regexp.compile(SEPARATOR)
14
- end
15
-
16
- if RUBY_PLATFORM =~ /(:?mswin|mingw|bccwin)/
17
- PREFIX_PAT = Regexp.compile("^([A-Za-z]:#{SEPARATOR_PAT})")
18
- else
19
- PREFIX_PAT = Regexp.compile("^(#{SEPARATOR_PAT})")
20
- end
8
+ ROOT = '/'.freeze
9
+ DOT = '.'.freeze
10
+ DOT_DOT = '..'.freeze
21
11
 
22
12
  class << self
23
13
  def for(path)
24
- path = path.is_a?(::FSSM::Pathname) ? path : new(path)
25
- path.dememo
26
- path
14
+ path.is_a?(::FSSM::Pathname) ? path : new("#{path}")
27
15
  end
28
16
  end
29
17
 
30
18
  def initialize(path)
31
- if path =~ %r{\0}
32
- raise ArgumentError, "path cannot contain ASCII NULLs"
33
- end
34
-
35
- dememo
36
-
19
+ raise ArgumentError, "path cannot contain ASCII NULLs" if path =~ %r{\0}
37
20
  super(path)
38
21
  end
39
22
 
40
- def to_path
41
- self
23
+ def <=>(other)
24
+ self.tr('/', "\0").to_s <=> other.to_str.tr('/', "\0")
25
+ rescue NoMethodError
26
+ nil
42
27
  end
43
28
 
44
- def to_s
45
- "#{self}"
46
- end
29
+ def ==(other)
30
+ left = self.cleanpath.tr('/', "\0").to_s
31
+ right = self.class.for(other).cleanpath.tr('/', "\0").to_s
47
32
 
48
- alias to_str to_s
33
+ left == right
34
+ rescue NoMethodError
35
+ false
36
+ end
49
37
 
50
- def to_a
51
- return @segments if @segments
52
- set_prefix_and_names
53
- @segments = @names.dup
54
- @segments.delete('.')
55
- @segments.unshift(@prefix) unless @prefix.empty?
56
- @segments
38
+ def +(path)
39
+ dup << path
57
40
  end
58
41
 
59
- alias segments to_a
42
+ def <<(path)
43
+ replace( join(path).cleanpath! )
44
+ end
60
45
 
61
- def each_filename(&block)
62
- to_a.each(&block)
46
+ def absolute?
47
+ self[0, 1].to_s == ROOT
63
48
  end
64
49
 
65
50
  def ascend
@@ -69,37 +54,8 @@ module FSSM
69
54
  end
70
55
  end
71
56
 
72
- def descend
73
- parts = to_a
74
- 1.upto(parts.length) do |i|
75
- yield self.class.join(parts[0, i])
76
- end
77
- end
78
-
79
- def root?
80
- set_prefix_and_names
81
- @names.empty? && !@prefix.empty?
82
- end
83
-
84
- def parent
85
- self + '..'
86
- end
87
-
88
- def relative?
89
- set_prefix_and_names
90
- @prefix.empty?
91
- end
92
-
93
- def absolute?
94
- !relative?
95
- end
96
-
97
- def +(path)
98
- dup << path
99
- end
100
-
101
- def <<(path)
102
- replace(join(path).cleanpath!)
57
+ def children
58
+ entries[2..-1]
103
59
  end
104
60
 
105
61
  def cleanpath!
@@ -108,14 +64,16 @@ module FSSM
108
64
 
109
65
  parts.each do |part|
110
66
  case part
111
- when '.' then
67
+ when DOT then
112
68
  next
113
- when '..' then
69
+ when DOT_DOT then
114
70
  case final.last
115
- when '..' then
116
- final.push('..')
117
- when nil then
118
- final.push('..')
71
+ when ROOT then
72
+ next
73
+ when DOT_DOT then
74
+ final.push(DOT_DOT)
75
+ when nil then
76
+ final.push(DOT_DOT)
119
77
  else
120
78
  final.pop
121
79
  end
@@ -124,142 +82,128 @@ module FSSM
124
82
  end
125
83
  end
126
84
 
127
- replace(final.empty? ? Dir.pwd : File.join(*final))
85
+ replace(final.empty? ? DOT : self.class.join(*final))
128
86
  end
129
87
 
130
88
  def cleanpath
131
89
  dup.cleanpath!
132
90
  end
133
91
 
134
- def realpath
135
- raise unless self.exist?
92
+ def descend
93
+ parts = to_a
94
+ 1.upto(parts.length) { |i| yield self.class.join(parts[0, i]) }
95
+ end
136
96
 
137
- if File.symlink?(self)
138
- file = self.dup
97
+ def dot?
98
+ self == DOT
99
+ end
139
100
 
140
- while true
141
- file = File.join(File.dirname(file), File.readlink(file))
142
- break unless File.symlink?(file)
143
- end
101
+ def dot_dot?
102
+ self == DOT_DOT
103
+ end
144
104
 
145
- self.class.new(file).clean
146
- else
147
- self.class.new(Dir.pwd) + self
105
+ def each_filename(&blk)
106
+ to_a.each(&blk)
107
+ end
108
+
109
+ def mountpoint?
110
+ stat1 = self.lstat
111
+ stat2 = self.parent.lstat
112
+
113
+ stat1.dev != stat2.dev || stat1.ino == stat2.ino
114
+ rescue Errno::ENOENT
115
+ false
116
+ end
117
+
118
+ def parent
119
+ self + '..'
120
+ end
121
+
122
+ def realpath
123
+ path = self
124
+
125
+ SYMLOOP_MAX.times do
126
+ link = path.readlink
127
+ link = path.dirname + link if link.relative?
128
+ path = link
148
129
  end
130
+
131
+ raise Errno::ELOOP, self
132
+ rescue Errno::EINVAL
133
+ path.expand_path
134
+ end
135
+
136
+ def relative?
137
+ !absolute?
149
138
  end
150
139
 
151
140
  def relative_path_from(base)
152
141
  base = self.class.for(base)
153
142
 
154
- if self.absolute? != base.absolute?
155
- raise ArgumentError, 'no relative path between a relative and absolute'
156
- end
143
+ raise ArgumentError, 'no relative path between a relative and absolute' if self.absolute? != base.absolute?
157
144
 
158
- if self.prefix != base.prefix
159
- raise ArgumentError, "different prefix: #{@prefix.inspect} and #{base.prefix.inspect}"
160
- end
145
+ return self if base.dot?
146
+ return self.class.new(DOT) if self == base
161
147
 
162
- base = base.cleanpath!.segments
163
- dest = dup.cleanpath!.segments
148
+ base = base.cleanpath.to_a
149
+ dest = self.cleanpath.to_a
164
150
 
165
151
  while !dest.empty? && !base.empty? && dest[0] == base[0]
166
152
  base.shift
167
153
  dest.shift
168
154
  end
169
155
 
170
- base.shift if base[0] == '.'
171
- dest.shift if dest[0] == '.'
156
+ base.shift if base[0] == DOT
157
+ dest.shift if dest[0] == DOT
172
158
 
173
- if base.include?('..')
174
- raise ArgumentError, "base directory may not contain '..'"
175
- end
159
+ raise ArgumentError, "base directory may not contain '#{DOT_DOT}'" if base.include?(DOT_DOT)
176
160
 
177
- path = base.fill('..') + dest
161
+ path = base.fill(DOT_DOT) + dest
178
162
  path = self.class.join(*path)
179
- path = self.class.new('.') if path.empty?
163
+ path = self.class.new(DOT) if path.empty?
180
164
 
181
165
  path
182
166
  end
183
167
 
184
- def replace(path)
185
- if path =~ %r{\0}
186
- raise ArgumentError, "path cannot contain ASCII NULLs"
187
- end
188
-
189
- dememo
190
-
191
- super(path)
168
+ def root?
169
+ !!(self =~ %r{^#{ROOT}+$})
192
170
  end
193
171
 
194
- def unlink
195
- Dir.unlink(self)
196
- true
197
- rescue Errno::ENOTDIR
198
- File.unlink(self)
199
- true
172
+ def to_a
173
+ array = to_s.split(File::SEPARATOR)
174
+ array.delete('')
175
+ array.insert(0, ROOT) if absolute?
176
+ array
200
177
  end
201
178
 
202
- def prefix
203
- set_prefix_and_names
204
- @prefix
205
- end
179
+ alias segments to_a
206
180
 
207
- def names
208
- set_prefix_and_names
209
- @names
181
+ def to_path
182
+ self
210
183
  end
211
184
 
212
- def dememo
213
- @set = nil
214
- @segments = nil
215
- @prefix = nil
216
- @names = nil
185
+ def to_s
186
+ "#{self}"
217
187
  end
218
188
 
219
- private
220
-
221
- def set_prefix_and_names
222
- return if @set
223
-
224
- @names = []
225
-
226
- if (match = PREFIX_PAT.match(self))
227
- @prefix = match[0].to_s
228
- @names += match.post_match.split(SEPARATOR_PAT)
229
- else
230
- @prefix = ''
231
- @names += self.split(SEPARATOR_PAT)
232
- end
233
-
234
- @names.compact!
235
- @names.delete('')
189
+ alias to_str to_s
236
190
 
237
- @set = true
191
+ def unlink
192
+ Dir.unlink(self)
193
+ true
194
+ rescue Errno::ENOTDIR
195
+ File.unlink(self)
196
+ true
238
197
  end
239
-
240
198
  end
241
199
 
242
200
  class Pathname
243
- class << self
244
- def glob(pattern, flags=0)
245
- dirs = Dir.glob(pattern, flags)
246
- dirs.map! {|path| new(path)}
247
-
248
- if block_given?
249
- dirs.each {|dir| yield dir}
250
- nil
251
- else
252
- dirs
253
- end
254
- end
255
-
256
- def [](pattern)
257
- Dir[pattern].map! {|path| new(path)}
258
- end
201
+ def self.[](pattern)
202
+ Dir[pattern].map! {|d| FSSM::Pathname.new(d) }
203
+ end
259
204
 
260
- def pwd
261
- new(Dir.pwd)
262
- end
205
+ def self.pwd
206
+ FSSM::Pathname.new(Dir.pwd)
263
207
  end
264
208
 
265
209
  def entries
@@ -278,6 +222,24 @@ module FSSM
278
222
  Dir.rmdir(self)
279
223
  end
280
224
 
225
+ def self.glob(pattern, flags = 0)
226
+ dirs = Dir.glob(pattern, flags)
227
+ dirs.map! {|path| FSSM::Pathname.new(path) }
228
+
229
+ if block_given?
230
+ dirs.each {|dir| yield dir }
231
+ nil
232
+ else
233
+ dirs
234
+ end
235
+ end
236
+
237
+ def glob(pattern, flags = 0, &block)
238
+ patterns = [pattern].flatten
239
+ patterns.map! {|p| self.class.glob(self.to_s + p, flags, &block) }
240
+ patterns.flatten
241
+ end
242
+
281
243
  def chdir
282
244
  blk = lambda { yield self } if block_given?
283
245
  Dir.chdir(self, &blk)
@@ -372,8 +334,6 @@ module FSSM
372
334
  def zero?
373
335
  FileTest.zero?(self)
374
336
  end
375
-
376
- alias exist? exists?
377
337
  end
378
338
 
379
339
  class Pathname
@@ -407,10 +367,10 @@ module FSSM
407
367
  end
408
368
 
409
369
  class Pathname
410
- class << self
411
- def join(*parts)
412
- new(File.join(*parts.reject {|p| p.empty? }))
413
- end
370
+ def self.join(*parts)
371
+ last_part = FSSM::Pathname.new(parts.last)
372
+ return last_part if last_part.absolute?
373
+ FSSM::Pathname.new(File.join(*parts.reject {|p| p.empty? }))
414
374
  end
415
375
 
416
376
  def basename
@@ -478,6 +438,10 @@ module FSSM
478
438
  File.size?(self)
479
439
  end
480
440
 
441
+ def split
442
+ File.split(self).map {|part| FSSM::Pathname.new(part) }
443
+ end
444
+
481
445
  def symlink(to)
482
446
  File.symlink(self, to)
483
447
  end
@@ -525,4 +489,14 @@ module FSSM
525
489
  end
526
490
  end
527
491
 
492
+ class Pathname
493
+ class << self
494
+ alias getwd pwd
495
+ end
496
+
497
+ alias absolute expand_path
498
+ alias delete unlink
499
+ alias exist? exists?
500
+ alias fnmatch fnmatch?
501
+ end
528
502
  end
@@ -39,11 +39,14 @@ module FSSM::Support
39
39
  def rb_inotify?
40
40
  found = begin
41
41
  require 'rb-inotify'
42
- INotify::Notifier.ancestors.include?(IO)
42
+ if defined?(INotify::VERSION)
43
+ version = INotify::VERSION
44
+ version[0] > 0 || version[1] >= 6
45
+ end
43
46
  rescue LoadError
44
47
  false
45
48
  end
46
- STDERR.puts("Warning: Unable to load rb-inotify >= 0.3.0. Inotify will be unavailable.") unless found
49
+ STDERR.puts("Warning: Unable to load rb-inotify >= 0.5.1. Inotify will be unavailable.") unless found
47
50
  found
48
51
  end
49
52
 
@@ -107,8 +107,7 @@ module Compass::CommandLineHelper
107
107
  end
108
108
 
109
109
  def execute(*arguments)
110
- command_line_class = Compass::Exec::Helpers.select_appropriate_command_line_ui(arguments)
111
- exit_code = command_line_class.new(arguments).run!
110
+ exit_code = Compass::Exec::SubCommandUI.new(arguments).run!
112
111
  # fail "Command Failed with exit code: #{exit_code}" unless exit_code == 0
113
112
  exit_code
114
113
  end
@@ -20,7 +20,7 @@ class CommandLineTest < Test::Unit::TestCase
20
20
 
21
21
  def test_basic_install
22
22
  within_tmp_directory do
23
- compass "--boring", "basic"
23
+ compass "create", "--boring", "basic"
24
24
  assert File.exists?("basic/sass/screen.scss")
25
25
  assert File.exists?("basic/stylesheets/screen.css")
26
26
  assert_action_performed :directory, "basic/"
@@ -33,7 +33,7 @@ class CommandLineTest < Test::Unit::TestCase
33
33
  next if framework.name =~ /^_/
34
34
  define_method "test_#{framework.name}_installation" do
35
35
  within_tmp_directory do
36
- compass *%W(--boring --framework #{framework.name} #{framework.name}_project)
36
+ compass *%W(create --boring --using #{framework.name} #{framework.name}_project)
37
37
  assert File.exists?("#{framework.name}_project/sass/screen.scss"), "sass/screen.scss is missing. Found: #{Dir.glob("#{framework.name}_project/**/*").join(", ")}"
38
38
  assert File.exists?("#{framework.name}_project/stylesheets/screen.css")
39
39
  assert_action_performed :directory, "#{framework.name}_project/"
@@ -45,13 +45,13 @@ class CommandLineTest < Test::Unit::TestCase
45
45
 
46
46
  def test_basic_update
47
47
  within_tmp_directory do
48
- compass "--boring", "basic"
48
+ compass "create", "--boring", "basic"
49
49
  Dir.chdir "basic" do
50
50
  # basic update with timestamp caching
51
- compass "--boring"
51
+ compass "compile", "--boring"
52
52
  assert_action_performed :unchanged, "sass/screen.scss"
53
53
  # basic update with force option set
54
- compass "--force", "--boring"
54
+ compass "compile", "--force", "--boring"
55
55
  assert_action_performed :identical, "stylesheets/screen.css"
56
56
  end
57
57
  end
@@ -47,7 +47,7 @@ class CompassTest < Test::Unit::TestCase
47
47
  assert_no_errors css_file, 'compass'
48
48
  end
49
49
  each_sass_file do |sass_file|
50
- assert_renders_correctly sass_file
50
+ assert_renders_correctly sass_file, :ignore_charset => true
51
51
  end
52
52
  end
53
53
  end
@@ -86,8 +86,12 @@ private
86
86
  for name in arguments
87
87
  actual_result_file = "#{tempfile_path(@current_project)}/#{name}.css"
88
88
  expected_result_file = "#{result_path(@current_project)}/#{name}.css"
89
- actual_lines = File.read(actual_result_file).split("\n")
90
- expected_lines = ERB.new(File.read(expected_result_file)).result(binding).split("\n")
89
+ actual_lines = File.read(actual_result_file)
90
+ actual_lines.gsub!(/^@charset[^;]+;/,'') if options[:ignore_charset]
91
+ actual_lines = actual_lines.split("\n").reject{|l| l=~/\A\Z/}
92
+ expected_lines = ERB.new(File.read(expected_result_file)).result(binding)
93
+ expected_lines.gsub!(/^@charset[^;]+;/,'') if options[:ignore_charset]
94
+ expected_lines = expected_lines.split("\n").reject{|l| l=~/\A\Z/}
91
95
  expected_lines.zip(actual_lines).each_with_index do |pair, line|
92
96
  message = "template: #{name}\nline: #{line + 1}"
93
97
  assert_equal(pair.first, pair.last, message)
@@ -4,6 +4,7 @@ module Compass
4
4
  Dir.mkdir name
5
5
  Dir.mkdir File.join(name, "config")
6
6
  Dir.mkdir File.join(name, "config", "initializers")
7
+ Dir.mkdir File.join(name, "tmp")
7
8
  end
8
9
 
9
10
  # Generate a rails application without polluting our current set of requires
@@ -39,7 +39,7 @@ class RailsIntegrationTest < Test::Unit::TestCase
39
39
  within_tmp_directory do
40
40
  generate_rails_app_directories("compass_rails")
41
41
  Dir.chdir "compass_rails" do
42
- compass(*%w(--rails --trace --boring --sass-dir app/stylesheets --css-dir public/stylesheets/compiled .))
42
+ compass(*%w(init rails --trace --boring --sass-dir app/stylesheets --css-dir public/stylesheets/compiled .))
43
43
  assert_action_performed :create, "./app/stylesheets/screen.scss"
44
44
  assert_action_performed :create, "./config/initializers/compass.rb"
45
45
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: compass
3
3
  version: !ruby/object:Gem::Version
4
- hash: -3702664206
5
4
  prerelease: true
6
5
  segments:
7
6
  - 0
8
7
  - 11
9
8
  - alpha
10
- - 3
11
- version: 0.11.alpha.3
9
+ - 4
10
+ version: 0.11.alpha.4
12
11
  platform: ruby
13
12
  authors:
14
13
  - Chris Eppstein
@@ -19,7 +18,7 @@ autorequire:
19
18
  bindir: bin
20
19
  cert_chain: []
21
20
 
22
- date: 2010-12-05 00:00:00 -08:00
21
+ date: 2010-12-10 00:00:00 -08:00
23
22
  default_executable: compass
24
23
  dependencies:
25
24
  - !ruby/object:Gem::Dependency
@@ -30,7 +29,6 @@ dependencies:
30
29
  requirements:
31
30
  - - ">="
32
31
  - !ruby/object:Gem::Version
33
- hash: -3702664376
34
32
  segments:
35
33
  - 3
36
34
  - 1
@@ -48,7 +46,6 @@ dependencies:
48
46
  requirements:
49
47
  - - ~>
50
48
  - !ruby/object:Gem::Version
51
- hash: 49
52
49
  segments:
53
50
  - 0
54
51
  - 10
@@ -340,6 +337,7 @@ files:
340
337
  - lib/compass/app_integration.rb
341
338
  - lib/compass/commands/base.rb
342
339
  - lib/compass/commands/create_project.rb
340
+ - lib/compass/commands/default.rb
343
341
  - lib/compass/commands/generate_grid_background.rb
344
342
  - lib/compass/commands/help.rb
345
343
  - lib/compass/commands/imports.rb
@@ -562,7 +560,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
562
560
  requirements:
563
561
  - - ">="
564
562
  - !ruby/object:Gem::Version
565
- hash: 3
566
563
  segments:
567
564
  - 0
568
565
  version: "0"
@@ -571,7 +568,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
571
568
  requirements:
572
569
  - - ">"
573
570
  - !ruby/object:Gem::Version
574
- hash: 25
575
571
  segments:
576
572
  - 1
577
573
  - 3