sass 3.3.0.alpha.3 → 3.3.0.alpha.8

Sign up to get free protection for your applications and to get access to all the features.
data/REVISION CHANGED
@@ -1 +1 @@
1
- 1bbdfb8d30d299461649555d31b4863b65e0e5ed
1
+ a47f79a8dcc0166c1b528858c23e8ec5b25f8a39
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.3.0.alpha.3
1
+ 3.3.0.alpha.8
data/VERSION_DATE CHANGED
@@ -1 +1 @@
1
- 16 August 2012 00:35:54 GMT
1
+ 01 November 2012 22:46:46 GMT
@@ -48,7 +48,7 @@ module Sass
48
48
  # @param name [Symbol] The name of the callback
49
49
  # @return [void]
50
50
  def define_callback(name)
51
- class_eval <<RUBY
51
+ class_eval <<RUBY, __FILE__, __LINE__ + 1
52
52
  def on_#{name}(&block)
53
53
  @_sass_callbacks ||= {}
54
54
  (@_sass_callbacks[#{name.inspect}] ||= []) << block
data/lib/sass/engine.rb CHANGED
@@ -820,7 +820,7 @@ WARNING
820
820
  media_parser = Sass::SCSS::Parser.new(scanner, @options[:filename], @line)
821
821
  media = media_parser.parse_media_query_list
822
822
  Tree::CssImportNode.new(str || uri, media.to_a)
823
- elsif val =~ /^http:\/\//
823
+ elsif val =~ /^(https?:)?\/\//
824
824
  Tree::CssImportNode.new("url(#{val})")
825
825
  else
826
826
  Tree::ImportNode.new(val)
data/lib/sass/exec.rb CHANGED
@@ -229,6 +229,10 @@ END
229
229
  'Only meaningful for --watch and --update.') do
230
230
  @options[:stop_on_error] = true
231
231
  end
232
+ opts.on('--poll', 'Check for file changes manually, rather than relying on the OS.',
233
+ 'Only meaningful for --watch.') do
234
+ @options[:poll] = true
235
+ end
232
236
  opts.on('-f', '--force', 'Recompile all Sass files, even if the CSS file is newer.',
233
237
  'Only meaningful for --update.') do
234
238
  @options[:force] = true
@@ -357,6 +361,7 @@ END
357
361
  require 'sass/plugin'
358
362
  ::Sass::Plugin.options.merge! @options[:for_engine]
359
363
  ::Sass::Plugin.options[:unix_newlines] = @options[:unix_newlines]
364
+ ::Sass::Plugin.options[:poll] = @options[:poll]
360
365
 
361
366
  if @options[:force]
362
367
  raise "The --force flag may only be used with --update." unless @options[:update]
@@ -1,4 +1,5 @@
1
1
  require 'pathname'
2
+ require 'set'
2
3
 
3
4
  module Sass
4
5
  module Importers
@@ -14,6 +15,7 @@ module Sass
14
15
  # This importer will import files relative to this path.
15
16
  def initialize(root)
16
17
  @root = File.expand_path(root)
18
+ @same_name_warnings = Set.new
17
19
  end
18
20
 
19
21
  # @see Base#find_relative
@@ -28,7 +30,7 @@ module Sass
28
30
 
29
31
  # @see Base#mtime
30
32
  def mtime(name, options)
31
- file, s = find_real_file(@root, name)
33
+ file, s = Sass::Util.destructure(find_real_file(@root, name, options))
32
34
  File.mtime(file) if file
33
35
  rescue Errno::ENOENT
34
36
  nil
@@ -106,15 +108,44 @@ module Sass
106
108
  # @param dir [String] The directory relative to which to search.
107
109
  # @param name [String] The filename to search for.
108
110
  # @return [(String, Symbol)] A filename-syntax pair.
109
- def find_real_file(dir, name)
110
- for (f,s) in possible_files(remove_root(name))
111
+ def find_real_file(dir, name, options)
112
+ found = possible_files(remove_root(name)).map do |f, s|
111
113
  path = (dir == "." || Pathname.new(f).absolute?) ? f : "#{dir}/#{f}"
112
- if full_path = Dir[path].first
113
- full_path.gsub!(REDUNDANT_DIRECTORY,File::SEPARATOR)
114
- return full_path, s
114
+ Dir[path].map do |full_path|
115
+ full_path.gsub!(REDUNDANT_DIRECTORY, File::SEPARATOR)
116
+ [full_path, s]
115
117
  end
116
118
  end
117
- nil
119
+ found = Sass::Util.flatten(found, 1)
120
+ return if found.empty?
121
+
122
+ if found.size > 1 && !@same_name_warnings.include?(found.first.first)
123
+ found.each {|(f, _)| @same_name_warnings << f}
124
+ relative_to = Pathname.new(dir)
125
+ if options[:_from_import_node]
126
+ # If _line exists, we're here due to an actual import in an
127
+ # import_node and we want to print a warning for a user writing an
128
+ # ambiguous import.
129
+ candidates = found.map {|(f, _)| " " + Pathname.new(f).relative_path_from(relative_to).to_s}.join("\n")
130
+ raise Sass::SyntaxError.new(<<MESSAGE)
131
+ It's not clear which file to import for '@import "#{name}"'.
132
+ Candidates:
133
+ #{candidates}
134
+ Please delete or rename all but one of these files.
135
+ MESSAGE
136
+ else
137
+ # Otherwise, we're here via StalenessChecker, and we want to print a
138
+ # warning for a user running `sass --watch` with two ambiguous files.
139
+ candidates = found.map {|(f, _)| " " + File.basename(f)}.join("\n")
140
+ Sass::Util.sass_warn <<WARNING
141
+ WARNING: In #{File.dirname(name)}:
142
+ There are multiple files that match the name "#{File.basename(name)}":
143
+ #{candidates}
144
+ This will be an error in future versions of Sass.
145
+ WARNING
146
+ end
147
+ end
148
+ found.first
118
149
  end
119
150
 
120
151
  # Splits a filename into three parts, a directory part, a basename, and an extension
@@ -132,7 +163,7 @@ module Sass
132
163
  private
133
164
 
134
165
  def _find(dir, name, options)
135
- full_filename, syntax = find_real_file(dir, name)
166
+ full_filename, syntax = Sass::Util.destructure(find_real_file(dir, name, options))
136
167
  return unless full_filename && File.readable?(full_filename)
137
168
 
138
169
  options[:syntax] = syntax
@@ -36,14 +36,14 @@ module Sass
36
36
  end
37
37
 
38
38
  def define_logger(name, options = {})
39
- class_eval %Q{
39
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
40
40
  def #{name}(message)
41
41
  #{options.fetch(:to, :log)}(#{name.inspect}, message)
42
42
  end
43
- }
43
+ RUBY
44
44
  end
45
45
  end
46
46
 
47
47
  end
48
48
  end
49
- end
49
+ end
@@ -300,7 +300,7 @@ module Sass::Plugin
300
300
 
301
301
  # The native windows listener is much slower than the polling
302
302
  # option, according to https://github.com/nex3/sass/commit/a3031856b22bc834a5417dedecb038b7be9b9e3e#commitcomment-1295118
303
- listener.force_polling(true) if Sass::Util.windows?
303
+ listener.force_polling(true) if @options[:poll] || Sass::Util.windows?
304
304
 
305
305
  begin
306
306
  listener.start
@@ -140,7 +140,7 @@ module Sass
140
140
  end
141
141
 
142
142
  def dependencies(uri, importer)
143
- stored_mtime, dependencies = @dependencies[[uri, importer]]
143
+ stored_mtime, dependencies = Sass::Util.destructure(@dependencies[[uri, importer]])
144
144
 
145
145
  if !stored_mtime || stored_mtime < mtime(uri, importer)
146
146
  dependencies = compute_dependencies(uri, importer)
@@ -90,13 +90,13 @@ module Sass::Script
90
90
  #
91
91
  # ## Other Color Functions
92
92
  #
93
- # \{#adjust_color adjust-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\]}
93
+ # \{#adjust_color adjust-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\])}
94
94
  # : Increase or decrease any of the components of a color.
95
95
  #
96
- # \{#scale_color scale-color($color, \[$red\], \[$green\], \[$blue\], \[$saturation\], \[$lightness\], \[$alpha\]}
96
+ # \{#scale_color scale-color($color, \[$red\], \[$green\], \[$blue\], \[$saturation\], \[$lightness\], \[$alpha\])}
97
97
  # : Fluidly scale one or more components of a color.
98
98
  #
99
- # \{#change_color change-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\]}
99
+ # \{#change_color change-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\])}
100
100
  # : Changes one or more properties of a color.
101
101
  #
102
102
  # \{#ie_hex_str ie-hex-str($color)}
@@ -203,7 +203,7 @@ module Sass
203
203
  # sub is the name of the production beneath it,
204
204
  # and ops is a list of operators for this precedence level
205
205
  def production(name, sub, *ops)
206
- class_eval <<RUBY
206
+ class_eval <<RUBY, __FILE__, __LINE__ + 1
207
207
  def #{name}
208
208
  interp = try_ops_after_interp(#{ops.inspect}, #{name.inspect}) and return interp
209
209
  return unless e = #{sub}
@@ -223,7 +223,7 @@ RUBY
223
223
  end
224
224
 
225
225
  def unary(op, sub)
226
- class_eval <<RUBY
226
+ class_eval <<RUBY, __FILE__, __LINE__ + 1
227
227
  def unary_#{op}
228
228
  return #{sub} unless tok = try_tok(:#{op})
229
229
  interp = try_op_before_interp(tok) and return interp
@@ -307,6 +307,7 @@ module Sass
307
307
  end
308
308
 
309
309
  def import_arg
310
+ line = @line
310
311
  return unless (str = tok(STRING)) || (uri = tok?(/url\(/i))
311
312
  if uri
312
313
  str = sass_script(:parse_string)
@@ -319,11 +320,13 @@ module Sass
319
320
  ss
320
321
 
321
322
  media = media_query_list
322
- if path =~ /^http:\/\// || media || use_css_import?
323
- return node(Sass::Tree::CssImportNode.new(str, media.to_a))
323
+ if path =~ /^(https?:)?\/\// || media || use_css_import?
324
+ node = Sass::Tree::CssImportNode.new(str, media.to_a)
325
+ else
326
+ node = Sass::Tree::ImportNode.new(path.strip)
324
327
  end
325
-
326
- node(Sass::Tree::ImportNode.new(path.strip))
328
+ node.line = line
329
+ node
327
330
  end
328
331
 
329
332
  def use_css_import?; false; end
@@ -674,7 +677,7 @@ module Sass
674
677
  expected('"{"') if res.length == 1 && res[0].is_a?(Selector::Universal)
675
678
  throw_error {expected('"{"')}
676
679
  rescue Sass::SyntaxError => e
677
- e.message << "\n\n\"#{sel}\" may only be used at the beginning of a selector."
680
+ e.message << "\n\n\"#{sel}\" may only be used at the beginning of a compound selector."
678
681
  raise e
679
682
  end
680
683
  end
@@ -706,7 +709,7 @@ module Sass
706
709
  end
707
710
 
708
711
  def element_name
709
- ns, name = qualified_name(:allow_star_name)
712
+ ns, name = Sass::Util.destructure(qualified_name(:allow_star_name))
710
713
  return unless ns || name
711
714
 
712
715
  if name == '*'
@@ -797,7 +800,7 @@ module Sass
797
800
  # could start a pseudo expression like "n+1", or it could start a
798
801
  # selector like "n|m". In order to handle this, we must regrettably
799
802
  # backtrack.
800
- expr, sel = nil
803
+ expr, sel = nil, nil
801
804
  pseudo_err = catch_error do
802
805
  expr = pseudo_expr
803
806
  next if tok?(/[,)]/)
@@ -9,6 +9,9 @@ module Sass
9
9
  # @return [String]
10
10
  attr_reader :imported_filename
11
11
 
12
+ # Sets the imported file.
13
+ attr_writer :imported_file
14
+
12
15
  # @param imported_filename [String] The name of the imported file
13
16
  def initialize(imported_filename)
14
17
  @imported_filename = imported_filename
@@ -43,12 +46,12 @@ module Sass
43
46
 
44
47
  if @options[:importer]
45
48
  f = @options[:importer].find_relative(
46
- @imported_filename, @options[:filename], @options.dup)
49
+ @imported_filename, @options[:filename], options_for_importer)
47
50
  return f if f
48
51
  end
49
52
 
50
53
  paths.each do |p|
51
- if f = p.find(@imported_filename, @options.dup)
54
+ if f = p.find(@imported_filename, options_for_importer)
52
55
  return f
53
56
  end
54
57
  end
@@ -63,6 +66,10 @@ module Sass
63
66
  rescue SyntaxError => e
64
67
  raise SyntaxError.new(e.message, :line => self.line, :filename => @filename)
65
68
  end
69
+
70
+ def options_for_importer
71
+ @options.merge(:_from_import_node => true)
72
+ end
66
73
  end
67
74
  end
68
75
  end
@@ -218,15 +218,17 @@ class Sass::Tree::Visitors::Perform < Sass::Tree::Visitors::Base
218
218
  file = node.imported_file
219
219
  handle_import_loop!(node) if @stack.any? {|e| e[:filename] == file.options[:filename]}
220
220
 
221
- @stack.push(:filename => node.filename, :line => node.line)
222
- root = file.to_tree
223
- Sass::Tree::Visitors::CheckNesting.visit(root)
224
- node.children = root.children.map {|c| visit(c)}.flatten
225
- node
226
- rescue Sass::SyntaxError => e
227
- e.modify_backtrace(:filename => node.imported_file.options[:filename])
228
- e.add_backtrace(:filename => node.filename, :line => node.line)
229
- raise e
221
+ begin
222
+ @stack.push(:filename => node.filename, :line => node.line)
223
+ root = file.to_tree
224
+ Sass::Tree::Visitors::CheckNesting.visit(root)
225
+ node.children = root.children.map {|c| visit(c)}.flatten
226
+ node
227
+ rescue Sass::SyntaxError => e
228
+ e.modify_backtrace(:filename => node.imported_file.options[:filename])
229
+ e.add_backtrace(:filename => node.filename, :line => node.line)
230
+ raise e
231
+ end
230
232
  ensure
231
233
  @stack.pop unless path
232
234
  end
@@ -50,6 +50,14 @@ class Sass::Tree::Visitors::SetOptions < Sass::Tree::Visitors::Base
50
50
  yield
51
51
  end
52
52
 
53
+ def visit_import(node)
54
+ # We have no good way of propagating the new options through an Engine
55
+ # instance, so we just null it out. This also lets us avoid caching an
56
+ # imported Engine along with the importing source tree.
57
+ node.imported_file = nil
58
+ yield
59
+ end
60
+
53
61
  def visit_mixindef(node)
54
62
  node.args.each do |k, v|
55
63
  k.options = @options
data/lib/sass/util.rb CHANGED
@@ -467,6 +467,19 @@ module Sass
467
467
  Dir.glob(path, &block)
468
468
  end
469
469
 
470
+ # Prepare a value for a destructuring assignment (e.g. `a, b =
471
+ # val`). This works around a performance bug when using
472
+ # ActiveSupport, and only needs to be called when `val` is likely
473
+ # to be `nil` reasonably often.
474
+ #
475
+ # See [this bug report](http://redmine.ruby-lang.org/issues/4917).
476
+ #
477
+ # @param val [Object]
478
+ # @return [Object]
479
+ def destructure(val)
480
+ val || []
481
+ end
482
+
470
483
  ## Cross-Ruby-Version Compatibility
471
484
 
472
485
  # Whether or not this is running under Ruby 1.8 or lower.
@@ -145,8 +145,8 @@ MSG
145
145
  "$var: true\n@while $var\n @extend .bar\n $var: false" => ["Extend directives may only be used within rules.", 3],
146
146
  "@for $i from 0 to 1\n @extend .bar" => ["Extend directives may only be used within rules.", 2],
147
147
  "@mixin foo\n @extend .bar\n@include foo" => ["Extend directives may only be used within rules.", 2],
148
- "foo\n &a\n b: c" => ["Invalid CSS after \"&\": expected \"{\", was \"a\"\n\n\"a\" may only be used at the beginning of a selector.", 2],
149
- "foo\n &1\n b: c" => ["Invalid CSS after \"&\": expected \"{\", was \"1\"\n\n\"1\" may only be used at the beginning of a selector.", 2],
148
+ "foo\n &a\n b: c" => ["Invalid CSS after \"&\": expected \"{\", was \"a\"\n\n\"a\" may only be used at the beginning of a compound selector.", 2],
149
+ "foo\n &1\n b: c" => ["Invalid CSS after \"&\": expected \"{\", was \"1\"\n\n\"1\" may only be used at the beginning of a compound selector.", 2],
150
150
  "foo %\n a: b" => ['Invalid CSS after "foo %": expected placeholder name, was ""', 1],
151
151
  "=foo\n @content error" => "Invalid content directive. Trailing characters found: \"error\".",
152
152
  "=foo\n @content\n b: c" => "Illegal nesting: Nothing may be nested beneath @content directives.",
@@ -217,7 +217,35 @@ MSG
217
217
  assert_equal("p {\n a: b; }\n p q {\n c: d; }\n",
218
218
  render("p\n\ta: b\n\tq\n\t\tc: d\n"))
219
219
  end
220
-
220
+
221
+ def test_import_same_name_different_ext
222
+ assert_raise_message Sass::SyntaxError, <<ERROR do
223
+ It's not clear which file to import for '@import "same_name_different_ext"'.
224
+ Candidates:
225
+ same_name_different_ext.sass
226
+ same_name_different_ext.scss
227
+ Please delete or rename all but one of these files.
228
+ ERROR
229
+ options = {:load_paths => [File.dirname(__FILE__) + '/templates/']}
230
+ munge_filename options
231
+ Sass::Engine.new("@import 'same_name_different_ext'", options).render
232
+ end
233
+ end
234
+
235
+ def test_import_same_name_different_partiality
236
+ assert_raise_message Sass::SyntaxError, <<ERROR do
237
+ It's not clear which file to import for '@import "same_name_different_partiality"'.
238
+ Candidates:
239
+ _same_name_different_partiality.scss
240
+ same_name_different_partiality.scss
241
+ Please delete or rename all but one of these files.
242
+ ERROR
243
+ options = {:load_paths => [File.dirname(__FILE__) + '/templates/']}
244
+ munge_filename options
245
+ Sass::Engine.new("@import 'same_name_different_partiality'", options).render
246
+ end
247
+ end
248
+
221
249
  EXCEPTION_MAP.each do |key, value|
222
250
  define_method("test_exception (#{key.inspect})") do
223
251
  line = 10
@@ -625,6 +653,11 @@ CSS
625
653
  render("@import \"http://fonts.googleapis.com/css?family=Droid+Sans\""))
626
654
  end
627
655
 
656
+ def test_protocol_relative_import
657
+ assert_equal("@import url(//fonts.googleapis.com/css?family=Droid+Sans);\n",
658
+ render("@import \"//fonts.googleapis.com/css?family=Droid+Sans\""))
659
+ end
660
+
628
661
  def test_import_with_interpolation
629
662
  assert_equal(<<CSS, render(<<SASS))
630
663
  @import url("http://fonts.googleapis.com/css?family=Droid+Sans");
@@ -9,6 +9,12 @@ module Sass::Script::Functions
9
9
  filename = options[:filename].gsub(%r{.*((/[^/]+){4})}, '\1')
10
10
  Sass::Script::String.new(filename)
11
11
  end
12
+
13
+ def whatever
14
+ custom = options[:custom]
15
+ whatever = custom && custom[:whatever]
16
+ Sass::Script::String.new(whatever || "incorrect")
17
+ end
12
18
  end
13
19
 
14
20
  class SassPluginTest < Test::Unit::TestCase
@@ -123,7 +129,7 @@ CSS
123
129
  File.open(tempfile_loc('single_import_loop')) do |file|
124
130
  assert_equal(<<CSS.strip, file.read.split("\n")[0...2].join("\n"))
125
131
  /*
126
- Sass::SyntaxError: An @import loop has been found: #{template_loc('single_import_loop')} imports itself
132
+ Syntax error: An @import loop has been found: #{template_loc('single_import_loop')} imports itself
127
133
  CSS
128
134
  end
129
135
  end
@@ -134,9 +140,9 @@ CSS
134
140
  File.open(tempfile_loc('double_import_loop1')) do |file|
135
141
  assert_equal(<<CSS.strip, file.read.split("\n")[0...4].join("\n"))
136
142
  /*
137
- Sass::SyntaxError: An @import loop has been found:
138
- #{template_loc('double_import_loop1')} imports #{template_loc('_double_import_loop2')}
139
- #{template_loc('_double_import_loop2')} imports #{template_loc('double_import_loop1')}
143
+ Syntax error: An @import loop has been found:
144
+ #{template_loc('double_import_loop1')} imports #{template_loc('_double_import_loop2')}
145
+ #{template_loc('_double_import_loop2')} imports #{template_loc('double_import_loop1')}
140
146
  CSS
141
147
  end
142
148
  end
@@ -210,6 +216,19 @@ CSS
210
216
  assert_needs_update "basic"
211
217
  end
212
218
 
219
+ def test_import_same_name
220
+ assert_warning <<WARNING do
221
+ WARNING: In #{template_loc}:
222
+ There are multiple files that match the name "same_name_different_partiality.scss":
223
+ _same_name_different_partiality.scss
224
+ same_name_different_partiality.scss
225
+ This will be an error in future versions of Sass.
226
+ WARNING
227
+ touch "_same_name_different_partiality"
228
+ assert_needs_update "same_name_different_partiality"
229
+ end
230
+ end
231
+
213
232
  # Callbacks
214
233
 
215
234
  def test_updating_stylesheets_callback
@@ -333,7 +352,24 @@ CSS
333
352
  check_for_updates!
334
353
  assert_renders_correctly 'if'
335
354
  ensure
336
- set_plugin_opts :cache_store => @@cache_store
355
+ set_plugin_opts
356
+ end
357
+
358
+ def test_cached_import_option
359
+ set_plugin_opts :custom => {:whatever => "correct"}
360
+ check_for_updates!
361
+ assert_renders_correctly "cached_import_option"
362
+
363
+ @@cache_store.reset!
364
+ set_plugin_opts :custom => nil, :always_update => false
365
+ check_for_updates!
366
+ assert_renders_correctly "cached_import_option"
367
+
368
+ set_plugin_opts :custom => {:whatever => "correct"}, :always_update => true
369
+ check_for_updates!
370
+ assert_renders_correctly "cached_import_option"
371
+ ensure
372
+ set_plugin_opts :custom => nil
337
373
  end
338
374
 
339
375
  private
@@ -388,7 +424,7 @@ CSS
388
424
  end
389
425
 
390
426
  if block_given?
391
- yield
427
+ Sass::Util.silence_sass_warnings {yield}
392
428
  else
393
429
  check_for_updates!
394
430
  end
@@ -0,0 +1,3 @@
1
+ partial { value: correct; }
2
+
3
+ main { value: correct; }
@@ -290,6 +290,11 @@ SCSS
290
290
  render("@import \"http://fonts.googleapis.com/css?family=Droid+Sans\";"))
291
291
  end
292
292
 
293
+ def test_protocol_relative_import
294
+ assert_equal("@import \"//fonts.googleapis.com/css?family=Droid+Sans\";\n",
295
+ render("@import \"//fonts.googleapis.com/css?family=Droid+Sans\";"))
296
+ end
297
+
293
298
  def test_import_with_interpolation
294
299
  assert_equal <<CSS, render(<<SCSS)
295
300
  @import url("http://fonts.googleapis.com/css?family=Droid+Sans");
@@ -1664,7 +1669,7 @@ SCSS
1664
1669
  assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
1665
1670
  Invalid CSS after " .foo": expected "{", was "&.bar {a: b}"
1666
1671
 
1667
- "&.bar" may only be used at the beginning of a selector.
1672
+ "&.bar" may only be used at the beginning of a compound selector.
1668
1673
  MESSAGE
1669
1674
  flim {
1670
1675
  .foo&.bar {a: b}
@@ -1676,7 +1681,7 @@ SCSS
1676
1681
  assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
1677
1682
  Invalid CSS after " .foo.bar": expected "{", was "& {a: b}"
1678
1683
 
1679
- "&" may only be used at the beginning of a selector.
1684
+ "&" may only be used at the beginning of a compound selector.
1680
1685
  MESSAGE
1681
1686
  flim {
1682
1687
  .foo.bar& {a: b}
@@ -1688,7 +1693,7 @@ SCSS
1688
1693
  assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
1689
1694
  Invalid CSS after " &": expected "{", was "& {a: b}"
1690
1695
 
1691
- "&" may only be used at the beginning of a selector.
1696
+ "&" may only be used at the beginning of a compound selector.
1692
1697
  MESSAGE
1693
1698
  flim {
1694
1699
  && {a: b}
@@ -0,0 +1 @@
1
+ partial {value: whatever()}
@@ -0,0 +1 @@
1
+ .foo {partial: yes}
@@ -0,0 +1,3 @@
1
+ @import "cached_import_option_partial";
2
+
3
+ main {value: whatever()}
@@ -0,0 +1,2 @@
1
+ .foo
2
+ ext: sass
@@ -0,0 +1 @@
1
+ .foo {ext: scss}
@@ -0,0 +1 @@
1
+ .foo {partial: no}
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sass
3
3
  version: !ruby/object:Gem::Version
4
- hash: 592302859
4
+ hash: 592302877
5
5
  prerelease: 6
6
6
  segments:
7
7
  - 3
8
8
  - 3
9
9
  - 0
10
10
  - alpha
11
- - 3
12
- version: 3.3.0.alpha.3
11
+ - 8
12
+ version: 3.3.0.alpha.8
13
13
  platform: ruby
14
14
  authors:
15
15
  - Nathan Weizenbaum
@@ -19,7 +19,7 @@ autorequire:
19
19
  bindir: bin
20
20
  cert_chain: []
21
21
 
22
- date: 2012-08-15 00:00:00 -04:00
22
+ date: 2012-11-01 00:00:00 -04:00
23
23
  default_executable:
24
24
  dependencies:
25
25
  - !ruby/object:Gem::Dependency
@@ -233,6 +233,7 @@ files:
233
233
  - test/sass/plugin_test.rb
234
234
  - test/sass/results/alt.css
235
235
  - test/sass/results/basic.css
236
+ - test/sass/results/cached_import_option.css
236
237
  - test/sass/results/compact.css
237
238
  - test/sass/results/complex.css
238
239
  - test/sass/results/compressed.css
@@ -264,18 +265,21 @@ files:
264
265
  - test/sass/scss/rx_test.rb
265
266
  - test/sass/scss/scss_test.rb
266
267
  - test/sass/scss/test_helper.rb
268
+ - test/sass/templates/_cached_import_option_partial.scss
267
269
  - test/sass/templates/_double_import_loop2.sass
268
270
  - test/sass/templates/_filename_fn_import.scss
269
271
  - test/sass/templates/_imported_charset_ibm866.sass
270
272
  - test/sass/templates/_imported_charset_utf8.sass
271
273
  - test/sass/templates/_imported_content.sass
272
274
  - test/sass/templates/_partial.sass
275
+ - test/sass/templates/_same_name_different_partiality.scss
273
276
  - test/sass/templates/alt.sass
274
277
  - test/sass/templates/basic.sass
275
278
  - test/sass/templates/bork1.sass
276
279
  - test/sass/templates/bork2.sass
277
280
  - test/sass/templates/bork3.sass
278
281
  - test/sass/templates/bork4.sass
282
+ - test/sass/templates/cached_import_option.scss
279
283
  - test/sass/templates/compact.sass
280
284
  - test/sass/templates/complex.sass
281
285
  - test/sass/templates/compressed.sass
@@ -303,6 +307,9 @@ files:
303
307
  - test/sass/templates/nested_mixin_bork.sass
304
308
  - test/sass/templates/options.sass
305
309
  - test/sass/templates/parent_ref.sass
310
+ - test/sass/templates/same_name_different_ext.sass
311
+ - test/sass/templates/same_name_different_ext.scss
312
+ - test/sass/templates/same_name_different_partiality.scss
306
313
  - test/sass/templates/script.sass
307
314
  - test/sass/templates/scss_import.scss
308
315
  - test/sass/templates/scss_importee.scss