oreorenasass 3.4.4 → 3.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +50 -70
  4. data/Rakefile +5 -26
  5. data/VERSION +1 -1
  6. data/VERSION_NAME +1 -1
  7. data/bin/sass +1 -1
  8. data/bin/scss +1 -1
  9. data/lib/sass.rb +12 -19
  10. data/lib/sass/cache_stores/base.rb +2 -2
  11. data/lib/sass/cache_stores/chain.rb +1 -2
  12. data/lib/sass/cache_stores/filesystem.rb +5 -1
  13. data/lib/sass/cache_stores/memory.rb +1 -1
  14. data/lib/sass/cache_stores/null.rb +2 -2
  15. data/lib/sass/callbacks.rb +0 -1
  16. data/lib/sass/css.rb +13 -11
  17. data/lib/sass/engine.rb +173 -424
  18. data/lib/sass/environment.rb +58 -148
  19. data/lib/sass/error.rb +14 -11
  20. data/lib/sass/exec.rb +703 -5
  21. data/lib/sass/importers/base.rb +6 -49
  22. data/lib/sass/importers/filesystem.rb +19 -44
  23. data/lib/sass/logger.rb +4 -1
  24. data/lib/sass/logger/base.rb +4 -2
  25. data/lib/sass/logger/log_level.rb +7 -3
  26. data/lib/sass/media.rb +23 -20
  27. data/lib/sass/plugin.rb +7 -7
  28. data/lib/sass/plugin/compiler.rb +145 -304
  29. data/lib/sass/plugin/configuration.rb +23 -18
  30. data/lib/sass/plugin/merb.rb +1 -1
  31. data/lib/sass/plugin/staleness_checker.rb +3 -3
  32. data/lib/sass/repl.rb +3 -3
  33. data/lib/sass/script.rb +8 -35
  34. data/lib/sass/script/{value/arg_list.rb → arg_list.rb} +25 -9
  35. data/lib/sass/script/bool.rb +18 -0
  36. data/lib/sass/script/color.rb +606 -0
  37. data/lib/sass/script/css_lexer.rb +4 -8
  38. data/lib/sass/script/css_parser.rb +2 -5
  39. data/lib/sass/script/funcall.rb +245 -0
  40. data/lib/sass/script/functions.rb +408 -1491
  41. data/lib/sass/script/interpolation.rb +79 -0
  42. data/lib/sass/script/lexer.rb +68 -172
  43. data/lib/sass/script/list.rb +85 -0
  44. data/lib/sass/script/literal.rb +221 -0
  45. data/lib/sass/script/{tree/node.rb → node.rb} +12 -22
  46. data/lib/sass/script/{value/null.rb → null.rb} +7 -14
  47. data/lib/sass/script/{value/number.rb → number.rb} +75 -152
  48. data/lib/sass/script/{tree/operation.rb → operation.rb} +24 -17
  49. data/lib/sass/script/parser.rb +110 -245
  50. data/lib/sass/script/string.rb +51 -0
  51. data/lib/sass/script/{tree/string_interpolation.rb → string_interpolation.rb} +4 -5
  52. data/lib/sass/script/{tree/unary_operation.rb → unary_operation.rb} +6 -6
  53. data/lib/sass/script/variable.rb +58 -0
  54. data/lib/sass/scss/css_parser.rb +3 -9
  55. data/lib/sass/scss/parser.rb +421 -450
  56. data/lib/sass/scss/rx.rb +11 -19
  57. data/lib/sass/scss/static_parser.rb +7 -321
  58. data/lib/sass/selector.rb +194 -68
  59. data/lib/sass/selector/abstract_sequence.rb +14 -29
  60. data/lib/sass/selector/comma_sequence.rb +25 -108
  61. data/lib/sass/selector/sequence.rb +66 -159
  62. data/lib/sass/selector/simple.rb +25 -23
  63. data/lib/sass/selector/simple_sequence.rb +63 -173
  64. data/lib/sass/shared.rb +1 -1
  65. data/lib/sass/supports.rb +15 -13
  66. data/lib/sass/tree/charset_node.rb +1 -1
  67. data/lib/sass/tree/comment_node.rb +3 -3
  68. data/lib/sass/tree/css_import_node.rb +11 -11
  69. data/lib/sass/tree/debug_node.rb +2 -2
  70. data/lib/sass/tree/directive_node.rb +4 -21
  71. data/lib/sass/tree/each_node.rb +8 -8
  72. data/lib/sass/tree/extend_node.rb +7 -14
  73. data/lib/sass/tree/for_node.rb +4 -4
  74. data/lib/sass/tree/function_node.rb +4 -9
  75. data/lib/sass/tree/if_node.rb +1 -1
  76. data/lib/sass/tree/import_node.rb +5 -4
  77. data/lib/sass/tree/media_node.rb +14 -4
  78. data/lib/sass/tree/mixin_def_node.rb +4 -4
  79. data/lib/sass/tree/mixin_node.rb +8 -21
  80. data/lib/sass/tree/node.rb +12 -54
  81. data/lib/sass/tree/prop_node.rb +20 -39
  82. data/lib/sass/tree/return_node.rb +2 -3
  83. data/lib/sass/tree/root_node.rb +3 -19
  84. data/lib/sass/tree/rule_node.rb +22 -35
  85. data/lib/sass/tree/supports_node.rb +13 -0
  86. data/lib/sass/tree/trace_node.rb +1 -2
  87. data/lib/sass/tree/variable_node.rb +3 -9
  88. data/lib/sass/tree/visitors/base.rb +8 -5
  89. data/lib/sass/tree/visitors/check_nesting.rb +19 -49
  90. data/lib/sass/tree/visitors/convert.rb +56 -74
  91. data/lib/sass/tree/visitors/cssize.rb +74 -202
  92. data/lib/sass/tree/visitors/deep_copy.rb +5 -10
  93. data/lib/sass/tree/visitors/extend.rb +7 -7
  94. data/lib/sass/tree/visitors/perform.rb +185 -278
  95. data/lib/sass/tree/visitors/set_options.rb +6 -20
  96. data/lib/sass/tree/visitors/to_css.rb +81 -234
  97. data/lib/sass/tree/warn_node.rb +2 -2
  98. data/lib/sass/tree/while_node.rb +2 -2
  99. data/lib/sass/util.rb +152 -522
  100. data/lib/sass/util/multibyte_string_scanner.rb +0 -2
  101. data/lib/sass/util/subset_map.rb +3 -4
  102. data/lib/sass/util/test.rb +1 -0
  103. data/lib/sass/version.rb +22 -20
  104. data/test/Gemfile +3 -0
  105. data/test/Gemfile.lock +10 -0
  106. data/test/sass/cache_test.rb +20 -62
  107. data/test/sass/callbacks_test.rb +1 -1
  108. data/test/sass/conversion_test.rb +2 -296
  109. data/test/sass/css2sass_test.rb +4 -23
  110. data/test/sass/engine_test.rb +354 -411
  111. data/test/sass/exec_test.rb +2 -2
  112. data/test/sass/extend_test.rb +145 -324
  113. data/test/sass/functions_test.rb +86 -873
  114. data/test/sass/importer_test.rb +21 -241
  115. data/test/sass/logger_test.rb +1 -1
  116. data/test/sass/more_results/more_import.css +1 -1
  117. data/test/sass/plugin_test.rb +26 -16
  118. data/test/sass/results/compact.css +1 -1
  119. data/test/sass/results/complex.css +4 -4
  120. data/test/sass/results/expanded.css +1 -1
  121. data/test/sass/results/import.css +1 -1
  122. data/test/sass/results/import_charset_ibm866.css +2 -2
  123. data/test/sass/results/mixins.css +17 -17
  124. data/test/sass/results/nested.css +1 -1
  125. data/test/sass/results/parent_ref.css +2 -2
  126. data/test/sass/results/script.css +3 -3
  127. data/test/sass/results/scss_import.css +1 -1
  128. data/test/sass/script_conversion_test.rb +7 -36
  129. data/test/sass/script_test.rb +53 -485
  130. data/test/sass/scss/css_test.rb +28 -143
  131. data/test/sass/scss/rx_test.rb +4 -4
  132. data/test/sass/scss/scss_test.rb +325 -2119
  133. data/test/sass/templates/scss_import.scss +1 -2
  134. data/test/sass/test_helper.rb +1 -1
  135. data/test/sass/util/multibyte_string_scanner_test.rb +1 -1
  136. data/test/sass/util/subset_map_test.rb +2 -2
  137. data/test/sass/util_test.rb +1 -86
  138. data/test/test_helper.rb +8 -37
  139. metadata +19 -66
  140. data/lib/sass/exec/base.rb +0 -187
  141. data/lib/sass/exec/sass_convert.rb +0 -264
  142. data/lib/sass/exec/sass_scss.rb +0 -424
  143. data/lib/sass/features.rb +0 -47
  144. data/lib/sass/script/tree.rb +0 -16
  145. data/lib/sass/script/tree/funcall.rb +0 -306
  146. data/lib/sass/script/tree/interpolation.rb +0 -118
  147. data/lib/sass/script/tree/list_literal.rb +0 -77
  148. data/lib/sass/script/tree/literal.rb +0 -45
  149. data/lib/sass/script/tree/map_literal.rb +0 -64
  150. data/lib/sass/script/tree/selector.rb +0 -26
  151. data/lib/sass/script/tree/variable.rb +0 -57
  152. data/lib/sass/script/value.rb +0 -11
  153. data/lib/sass/script/value/base.rb +0 -240
  154. data/lib/sass/script/value/bool.rb +0 -35
  155. data/lib/sass/script/value/color.rb +0 -680
  156. data/lib/sass/script/value/helpers.rb +0 -262
  157. data/lib/sass/script/value/list.rb +0 -113
  158. data/lib/sass/script/value/map.rb +0 -70
  159. data/lib/sass/script/value/string.rb +0 -97
  160. data/lib/sass/selector/pseudo.rb +0 -256
  161. data/lib/sass/source/map.rb +0 -210
  162. data/lib/sass/source/position.rb +0 -39
  163. data/lib/sass/source/range.rb +0 -41
  164. data/lib/sass/stack.rb +0 -120
  165. data/lib/sass/tree/at_root_node.rb +0 -83
  166. data/lib/sass/tree/error_node.rb +0 -18
  167. data/lib/sass/tree/keyframe_rule_node.rb +0 -15
  168. data/lib/sass/util/cross_platform_random.rb +0 -19
  169. data/lib/sass/util/normalized_map.rb +0 -130
  170. data/lib/sass/util/ordered_hash.rb +0 -192
  171. data/test/sass/compiler_test.rb +0 -232
  172. data/test/sass/encoding_test.rb +0 -219
  173. data/test/sass/source_map_test.rb +0 -977
  174. data/test/sass/superselector_test.rb +0 -191
  175. data/test/sass/util/normalized_map_test.rb +0 -51
  176. data/test/sass/value_helpers_test.rb +0 -179
@@ -3,7 +3,7 @@ require File.dirname(__FILE__) + '/../test_helper'
3
3
  require 'sass/util/test'
4
4
  require 'tmpdir'
5
5
 
6
- class ExecTest < MiniTest::Test
6
+ class ExecTest < Test::Unit::TestCase
7
7
  include Sass::Util::Test
8
8
 
9
9
  def setup
@@ -19,7 +19,7 @@ class ExecTest < MiniTest::Test
19
19
  src = get_path("src.scss")
20
20
  dest = get_path("dest.css")
21
21
  write(src, ".ruleset { margin: 0 }")
22
- assert(exec(*%w[scss --sourcemap=none -t expanded --unix-newlines].push(src, dest)))
22
+ assert(exec(*%w[scss -t expanded --unix-newlines].push(src, dest)))
23
23
  assert_equal(".ruleset {\n margin: 0;\n}\n", read(dest))
24
24
  end
25
25
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  require File.dirname(__FILE__) + '/../test_helper'
3
3
 
4
- class ExtendTest < MiniTest::Test
4
+ class ExtendTest < Test::Unit::TestCase
5
5
  def test_basic
6
6
  assert_equal <<CSS, render(<<SCSS)
7
7
  .foo, .bar {
@@ -145,8 +145,8 @@ SCSS
145
145
  end
146
146
 
147
147
  def test_class_unification
148
- assert_unification '.foo.bar', '.baz {@extend .foo}', '.foo.bar, .bar.baz'
149
- assert_unification '.foo.baz', '.baz {@extend .foo}', '.baz'
148
+ assert_unification '.foo.bar', '.baz {@extend .foo}', '.foo.bar, .bar.baz'
149
+ assert_unification '.foo.baz', '.baz {@extend .foo}', '.baz'
150
150
  end
151
151
 
152
152
  def test_id_unification
@@ -154,7 +154,7 @@ SCSS
154
154
  assert_unification '.foo#baz', '#baz {@extend .foo}', '#baz'
155
155
 
156
156
  assert_extend_doesnt_match('#bar', '.foo', :failed_to_unify, 2) do
157
- render_unification '.foo#baz', '#bar {@extend .foo}'
157
+ assert_unification '.foo#baz', '#bar {@extend .foo}', '.foo#baz'
158
158
  end
159
159
  end
160
160
 
@@ -180,7 +180,7 @@ SCSS
180
180
  assert_unification 'ns|*.foo', '*|* {@extend .foo}', 'ns|*'
181
181
 
182
182
  assert_extend_doesnt_match('ns2|*', '.foo', :failed_to_unify, 2) do
183
- render_unification 'ns1|*.foo', 'ns2|* {@extend .foo}'
183
+ assert_unification 'ns1|*.foo', 'ns2|* {@extend .foo}', 'ns1|*.foo'
184
184
  end
185
185
 
186
186
  assert_unification 'ns|*.foo', 'ns|* {@extend .foo}', 'ns|*'
@@ -200,7 +200,7 @@ SCSS
200
200
  assert_unification 'ns|a.foo', '*|* {@extend .foo}', 'ns|a'
201
201
 
202
202
  assert_extend_doesnt_match('ns2|*', '.foo', :failed_to_unify, 2) do
203
- render_unification 'ns1|a.foo', 'ns2|* {@extend .foo}'
203
+ assert_unification 'ns1|a.foo', 'ns2|* {@extend .foo}', 'ns1|a.foo'
204
204
  end
205
205
 
206
206
  assert_unification 'ns|a.foo', 'ns|* {@extend .foo}', 'ns|a'
@@ -227,7 +227,7 @@ SCSS
227
227
  assert_unification 'ns|*.foo', '*|a {@extend .foo}', 'ns|*.foo, ns|a'
228
228
 
229
229
  assert_extend_doesnt_match('ns2|a', '.foo', :failed_to_unify, 2) do
230
- render_unification 'ns1|*.foo', 'ns2|a {@extend .foo}'
230
+ assert_unification 'ns1|*.foo', 'ns2|a {@extend .foo}', 'ns1|*.foo'
231
231
  end
232
232
 
233
233
  assert_unification 'ns|*.foo', 'ns|a {@extend .foo}', 'ns|*.foo, ns|a'
@@ -242,7 +242,7 @@ SCSS
242
242
  assert_unification '*|a.foo', 'ns|a {@extend .foo}', '*|a.foo, ns|a'
243
243
 
244
244
  assert_extend_doesnt_match('h1', '.foo', :failed_to_unify, 2) do
245
- render_unification 'a.foo', 'h1 {@extend .foo}'
245
+ assert_unification 'a.foo', 'h1 {@extend .foo}', 'a.foo'
246
246
  end
247
247
  end
248
248
 
@@ -251,7 +251,7 @@ SCSS
251
251
  assert_unification 'ns|a.foo', '*|a {@extend .foo}', 'ns|a'
252
252
 
253
253
  assert_extend_doesnt_match('ns2|a', '.foo', :failed_to_unify, 2) do
254
- render_unification 'ns1|a.foo', 'ns2|a {@extend .foo}'
254
+ assert_unification 'ns1|a.foo', 'ns2|a {@extend .foo}', 'ns1|a.foo'
255
255
  end
256
256
 
257
257
  assert_unification 'ns|a.foo', 'ns|a {@extend .foo}', 'ns|a'
@@ -270,11 +270,11 @@ SCSS
270
270
  assert_unification ':foo.baz', '::foo {@extend .baz}', ':foo.baz, :foo::foo'
271
271
 
272
272
  assert_extend_doesnt_match('::bar', '.baz', :failed_to_unify, 2) do
273
- render_unification '::foo.baz', '::bar {@extend .baz}'
273
+ assert_unification '::foo.baz', '::bar {@extend .baz}', '::foo.baz'
274
274
  end
275
275
 
276
276
  assert_extend_doesnt_match('::foo(2n+1)', '.baz', :failed_to_unify, 2) do
277
- render_unification '::foo.baz', '::foo(2n+1) {@extend .baz}'
277
+ assert_unification '::foo.baz', '::foo(2n+1) {@extend .baz}', '::foo.baz'
278
278
  end
279
279
 
280
280
  assert_unification '::foo.baz', '::foo {@extend .baz}', '::foo'
@@ -310,183 +310,9 @@ SCSS
310
310
  end
311
311
 
312
312
  def test_negation_unification
313
- assert_extends ':not(.foo).baz', ':not(.bar) {@extend .baz}', ':not(.foo).baz, :not(.foo):not(.bar)'
314
- # Unifying to :not(.foo) here would reduce the specificity of the original selector.
315
- assert_extends ':not(.foo).baz', ':not(.foo) {@extend .baz}', ':not(.foo).baz, :not(.foo)'
316
- end
317
-
318
- def test_prefixed_pseudoclass_unification
319
- assert_unification(
320
- ':nth-child(2n+1 of .foo).baz',
321
- ':nth-child(2n of .foo) {@extend .baz}',
322
- ':nth-child(2n+1 of .foo).baz, :nth-child(2n+1 of .foo):nth-child(2n of .foo)')
323
-
324
- assert_unification(
325
- ':nth-child(2n+1 of .foo).baz',
326
- ':nth-child(2n+1 of .bar) {@extend .baz}',
327
- ':nth-child(2n+1 of .foo).baz, :nth-child(2n+1 of .foo):nth-child(2n+1 of .bar)')
328
-
329
- assert_unification(
330
- ':nth-child(2n+1 of .foo).baz',
331
- ':nth-child(2n+1 of .foo) {@extend .baz}',
332
- ':nth-child(2n+1 of .foo)')
333
- end
334
-
335
- def test_extend_into_not
336
- assert_extends(':not(.foo)', '.x {@extend .foo}', ':not(.foo, .x)')
337
- assert_extends(':not(.foo.bar)', '.x {@extend .bar}', ':not(.foo.bar, .foo.x)')
338
- assert_extends(
339
- ':not(.foo.bar, .baz.bar)',
340
- '.x {@extend .bar}',
341
- ':not(.foo.bar, .foo.x, .baz.bar, .baz.x)')
342
- end
343
-
344
- def test_extend_into_mergeable_pseudoclasses
345
- assert_extends(':matches(.foo)', '.x {@extend .foo}', ':matches(.foo, .x)')
346
- assert_extends(':matches(.foo.bar)', '.x {@extend .bar}', ':matches(.foo.bar, .foo.x)')
347
- assert_extends(
348
- ':matches(.foo.bar, .baz.bar)',
349
- '.x {@extend .bar}',
350
- ':matches(.foo.bar, .foo.x, .baz.bar, .baz.x)')
351
-
352
- assert_extends(':-moz-any(.foo)', '.x {@extend .foo}', ':-moz-any(.foo, .x)')
353
- assert_extends(':current(.foo)', '.x {@extend .foo}', ':current(.foo, .x)')
354
- assert_extends(':has(.foo)', '.x {@extend .foo}', ':has(.foo, .x)')
355
- assert_extends(':host(.foo)', '.x {@extend .foo}', ':host(.foo, .x)')
356
- assert_extends(':host-context(.foo)', '.x {@extend .foo}', ':host-context(.foo, .x)')
357
- assert_extends(':nth-child(n of .foo)', '.x {@extend .foo}', ':nth-child(n of .foo, .x)')
358
- assert_extends(
359
- ':nth-last-child(n of .foo)',
360
- '.x {@extend .foo}',
361
- ':nth-last-child(n of .foo, .x)')
362
- end
363
-
364
- def test_complex_extend_into_pseudoclass
365
- assert_extends(':not(.bar)', '.x .y {@extend .bar}', ':not(.bar, .x .y)')
366
- assert_extends(':matches(.bar)', '.x .y {@extend .bar}', ':matches(.bar, .x .y)')
367
- assert_extends(':current(.bar)', '.x .y {@extend .bar}', ':current(.bar, .x .y)')
368
- assert_extends(':has(.bar)', '.x .y {@extend .bar}', ':has(.bar, .x .y)')
369
- assert_extends(':host(.bar)', '.x .y {@extend .bar}', ':host(.bar, .x .y)')
370
- assert_extends(':host-context(.bar)', '.x .y {@extend .bar}', ':host-context(.bar, .x .y)')
371
- assert_extends(
372
- ':-moz-any(.bar)',
373
- '.x .y {@extend .bar}',
374
- ':-moz-any(.bar, .x .y)')
375
- assert_extends(
376
- ':nth-child(n of .bar)',
377
- '.x .y {@extend .bar}',
378
- ':nth-child(n of .bar, .x .y)')
379
- assert_extends(
380
- ':nth-last-child(n of .bar)',
381
- '.x .y {@extend .bar}',
382
- ':nth-last-child(n of .bar, .x .y)')
383
- end
384
-
385
- def test_extend_over_selector_pseudoclass
386
- assert_extends(':not(.foo)', '.x {@extend :not(.foo)}', ':not(.foo), .x')
387
- assert_extends(
388
- ':matches(.foo, .bar)',
389
- '.x {@extend :matches(.foo, .bar)}',
390
- ':matches(.foo, .bar), .x')
391
- end
392
-
393
- def test_matches_within_not
394
- assert_extends(
395
- ':not(.foo, .bar)',
396
- ':matches(.x, .y) {@extend .foo}',
397
- ':not(.foo, .x, .y, .bar)')
398
- end
399
-
400
- def test_pseudoclasses_merge
401
- assert_extends(':matches(.foo)', ':matches(.bar) {@extend .foo}', ':matches(.foo, .bar)')
402
- assert_extends(':-moz-any(.foo)', ':-moz-any(.bar) {@extend .foo}', ':-moz-any(.foo, .bar)')
403
- assert_extends(':current(.foo)', ':current(.bar) {@extend .foo}', ':current(.foo, .bar)')
404
- assert_extends(
405
- ':nth-child(n of .foo)',
406
- ':nth-child(n of .bar) {@extend .foo}',
407
- ':nth-child(n of .foo, .bar)')
408
- assert_extends(
409
- ':nth-last-child(n of .foo)',
410
- ':nth-last-child(n of .bar) {@extend .foo}',
411
- ':nth-last-child(n of .foo, .bar)')
412
- end
413
-
414
- def test_nesting_pseudoclasses_merge
415
- assert_extends(':has(.foo)', ':has(.bar) {@extend .foo}', ':has(.foo, :has(.bar))')
416
- assert_extends(':host(.foo)', ':host(.bar) {@extend .foo}', ':host(.foo, :host(.bar))')
417
- assert_extends(
418
- ':host-context(.foo)',
419
- ':host-context(.bar) {@extend .foo}',
420
- ':host-context(.foo, :host-context(.bar))')
421
- end
422
-
423
- def test_not_unifies_with_unique_values
424
- assert_unification('foo', ':not(bar) {@extend foo}', ':not(bar)')
425
- assert_unification('#foo', ':not(#bar) {@extend #foo}', ':not(#bar)')
426
- end
427
-
428
- def test_not_adds_no_specificity
429
- assert_specificity_equals(':not(.foo)', '.foo')
430
- end
431
-
432
- def test_matches_has_a_specificity_range
433
- # `:matches(.foo, #bar)` has minimum specificity equal to that of `.foo`,
434
- # which means `:matches(.foo, #bar) .a` can have less specificity than
435
- # `#b.a`. Thus the selector generated by `#b.a` should be preserved.
436
- assert_equal <<CSS, render(<<SCSS)
437
- :matches(.foo, #bar) .a, :matches(.foo, #bar) #b.a {
438
- a: b; }
439
- CSS
440
- :matches(.foo, #bar) %x {a: b}
441
- .a {@extend %x}
442
- #b.a {@extend %x}
443
- SCSS
444
-
445
- # `:matches(.foo, #bar)` has maximum specificity equal to that of `#bar`,
446
- # which means `:matches(.foo, #bar).b` can have greater specificity than `.a
447
- # .b`. Thus the selector generated by `:matches(.foo, #bar).b` should be
448
- # preserved.
449
- assert_equal <<CSS, render(<<SCSS)
450
- .a .b, .a .b:matches(.foo, #bar) {
451
- a: b; }
452
- CSS
453
- .a %x {a: b}
454
- .b {@extend %x}
455
- .b:matches(.foo, #bar) {@extend %x}
456
- SCSS
457
- end
458
-
459
- def test_extend_into_not_and_normal_extend
460
- assert_equal <<CSS, render(<<SCSS)
461
- .x:not(.y, .bar), .foo:not(.y, .bar) {
462
- a: b; }
463
- CSS
464
- .x:not(.y) {a: b}
465
- .foo {@extend .x}
466
- .bar {@extend .y}
467
- SCSS
468
- end
469
-
470
- def test_extend_into_matches_and_normal_extend
471
- assert_equal <<CSS, render(<<SCSS)
472
- .x:matches(.y, .bar), .foo:matches(.y, .bar) {
473
- a: b; }
474
- CSS
475
- .x:matches(.y) {a: b}
476
- .foo {@extend .x}
477
- .bar {@extend .y}
478
- SCSS
479
- end
480
-
481
- def test_multilayer_pseudoclass_extend
482
- assert_equal <<CSS, render(<<SCSS)
483
- :matches(.x, .foo, .bar) {
484
- a: b; }
485
- CSS
486
- :matches(.x) {a: b}
487
- .foo {@extend .x}
488
- .bar {@extend .foo}
489
- SCSS
313
+ assert_unification ':not(.foo).baz', ':not(.bar) {@extend .baz}', ':not(.foo).baz, :not(.foo):not(.bar)'
314
+ assert_unification ':not(.foo).baz', ':not(.foo) {@extend .baz}', ':not(.foo)'
315
+ assert_unification ':not([a=b]).baz', ':not([a = b]) {@extend .baz}', ':not([a=b])'
490
316
  end
491
317
 
492
318
  def test_comma_extendee
@@ -522,7 +348,7 @@ SCSS
522
348
 
523
349
  def test_long_extendee_requires_all_selectors
524
350
  assert_extend_doesnt_match('.baz', '.foo.bar', :not_found, 2) do
525
- render_extends '.foo', '.baz {@extend .foo.bar}'
351
+ assert_extends '.foo', '.baz {@extend .foo.bar}', '.foo'
526
352
  end
527
353
  end
528
354
 
@@ -546,11 +372,11 @@ SCSS
546
372
 
547
373
  def test_long_extender_aborts_unification
548
374
  assert_extend_doesnt_match('h1.baz', '.foo', :failed_to_unify, 2) do
549
- render_extends 'a.foo#bar', 'h1.baz {@extend .foo}'
375
+ assert_extends 'a.foo#bar', 'h1.baz {@extend .foo}', 'a.foo#bar'
550
376
  end
551
377
 
552
378
  assert_extend_doesnt_match('.bang#baz', '.foo', :failed_to_unify, 2) do
553
- render_extends 'a.foo#bar', '.bang#baz {@extend .foo}'
379
+ assert_extends 'a.foo#bar', '.bang#baz {@extend .foo}', 'a.foo#bar'
554
380
  end
555
381
  end
556
382
 
@@ -566,7 +392,7 @@ SCSS
566
392
 
567
393
  def test_nested_extender_aborts_unification
568
394
  assert_extend_doesnt_match('foo bar', '.foo', :failed_to_unify, 2) do
569
- render_extends 'baz.foo', 'foo bar {@extend .foo}'
395
+ assert_extends 'baz.foo', 'foo bar {@extend .foo}', 'baz.foo'
570
396
  end
571
397
  end
572
398
 
@@ -663,7 +489,7 @@ CSS
663
489
  SCSS
664
490
  end
665
491
 
666
- def test_nested_extender_with_early_child_selector
492
+ def test_another_nested_extender_with_early_child_selectors_doesnt_subseq_them
667
493
  assert_equal <<CSS, render(<<SCSS)
668
494
  .foo .bar, .foo .bip > .baz {
669
495
  a: b; }
@@ -690,7 +516,7 @@ SCSS
690
516
  end
691
517
 
692
518
  def test_nested_extender_with_trailing_child_selector
693
- assert_raises(Sass::SyntaxError, "bar > can't extend: invalid selector") do
519
+ assert_raise(Sass::SyntaxError, "bar > can't extend: invalid selector") do
694
520
  render("bar > {@extend .baz}")
695
521
  end
696
522
  end
@@ -824,10 +650,10 @@ SCSS
824
650
 
825
651
  def test_basic_extend_loop
826
652
  assert_equal <<CSS, render(<<SCSS)
827
- .foo, .bar {
653
+ .bar, .foo {
828
654
  a: b; }
829
655
 
830
- .bar, .foo {
656
+ .foo, .bar {
831
657
  c: d; }
832
658
  CSS
833
659
  .foo {a: b; @extend .bar}
@@ -837,13 +663,13 @@ SCSS
837
663
 
838
664
  def test_three_level_extend_loop
839
665
  assert_equal <<CSS, render(<<SCSS)
840
- .foo, .baz, .bar {
666
+ .baz, .bar, .foo {
841
667
  a: b; }
842
668
 
843
- .bar, .foo, .baz {
669
+ .foo, .baz, .bar {
844
670
  c: d; }
845
671
 
846
- .baz, .bar, .foo {
672
+ .bar, .foo, .baz {
847
673
  e: f; }
848
674
  CSS
849
675
  .foo {a: b; @extend .bar}
@@ -866,18 +692,6 @@ CSS
866
692
  SCSS
867
693
  end
868
694
 
869
- def test_cross_loop
870
- # The first law of extend means the selector should stick around.
871
- assert_equal <<CSS, render(<<SCSS)
872
- .foo.bar, .foo, .bar {
873
- a: b; }
874
- CSS
875
- .foo.bar {a: b}
876
- .foo {@extend .bar}
877
- .bar {@extend .foo}
878
- SCSS
879
- end
880
-
881
695
  def test_multiple_extender_merges_with_superset_selector
882
696
  assert_equal <<CSS, render(<<SCSS)
883
697
  a.bar.baz, a.foo {
@@ -996,7 +810,10 @@ SCSS
996
810
 
997
811
  def test_placeholder_selector_as_modifier
998
812
  assert_extend_doesnt_match('div', '%foo', :failed_to_unify, 3) do
999
- render(<<SCSS)
813
+ assert_equal <<CSS, render(<<SCSS)
814
+ a.baz.bar {
815
+ color: blue; }
816
+ CSS
1000
817
  a%foo.baz {color: blue}
1001
818
  .bar {@extend %foo}
1002
819
  div {@extend %foo}
@@ -1016,17 +833,6 @@ $foo: foo;
1016
833
  SCSS
1017
834
  end
1018
835
 
1019
- def test_placeholder_in_selector_pseudoclass
1020
- assert_equal <<CSS, render(<<SCSS)
1021
- :matches(.bar, .baz) {
1022
- color: blue; }
1023
- CSS
1024
- :matches(%foo) {color: blue}
1025
- .bar {@extend %foo}
1026
- .baz {@extend %foo}
1027
- SCSS
1028
- end
1029
-
1030
836
  def test_media_in_placeholder_selector
1031
837
  assert_equal <<CSS, render(<<SCSS)
1032
838
  .baz {
@@ -1038,11 +844,16 @@ SCSS
1038
844
  end
1039
845
 
1040
846
  def test_extend_out_of_media
1041
- assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
1042
- You may not @extend an outer selector from within @media.
1043
- You may only @extend selectors within the same directive.
1044
- From "@extend .foo" on line 3 of test_extend_out_of_media_inline.scss.
1045
- ERR
847
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SCSS))}
848
+ DEPRECATION WARNING on line 3 of test_extend_out_of_media_inline.scss:
849
+ @extending an outer selector from within @media is deprecated.
850
+ You may only @extend selectors within the same directive.
851
+ This will be an error in Sass 3.3.
852
+ It can only work once @extend is supported natively in the browser.
853
+ WARN
854
+ .foo {
855
+ a: b; }
856
+ CSS
1046
857
  .foo {a: b}
1047
858
  @media screen {
1048
859
  .bar {@extend .foo}
@@ -1051,11 +862,18 @@ SCSS
1051
862
  end
1052
863
 
1053
864
  def test_extend_out_of_unknown_directive
1054
- assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
1055
- You may not @extend an outer selector from within @flooblehoof.
1056
- You may only @extend selectors within the same directive.
1057
- From "@extend .foo" on line 3 of test_extend_out_of_unknown_directive_inline.scss.
1058
- ERR
865
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SCSS))}
866
+ DEPRECATION WARNING on line 3 of test_extend_out_of_unknown_directive_inline.scss:
867
+ @extending an outer selector from within @flooblehoof is deprecated.
868
+ You may only @extend selectors within the same directive.
869
+ This will be an error in Sass 3.3.
870
+ It can only work once @extend is supported natively in the browser.
871
+ WARN
872
+ .foo {
873
+ a: b; }
874
+
875
+ @flooblehoof {}
876
+ CSS
1059
877
  .foo {a: b}
1060
878
  @flooblehoof {
1061
879
  .bar {@extend .foo}
@@ -1064,11 +882,19 @@ SCSS
1064
882
  end
1065
883
 
1066
884
  def test_extend_out_of_nested_directives
1067
- assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
1068
- You may not @extend an outer selector from within @flooblehoof.
1069
- You may only @extend selectors within the same directive.
1070
- From "@extend .foo" on line 4 of test_extend_out_of_nested_directives_inline.scss.
1071
- ERR
885
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SCSS))}
886
+ DEPRECATION WARNING on line 4 of test_extend_out_of_nested_directives_inline.scss:
887
+ @extending an outer selector from within @flooblehoof is deprecated.
888
+ You may only @extend selectors within the same directive.
889
+ This will be an error in Sass 3.3.
890
+ It can only work once @extend is supported natively in the browser.
891
+ WARN
892
+ @media screen {
893
+ .foo {
894
+ a: b; }
895
+
896
+ @flooblehoof {} }
897
+ CSS
1072
898
  @media screen {
1073
899
  .foo {a: b}
1074
900
  @flooblehoof {
@@ -1136,6 +962,7 @@ SCSS
1136
962
  @flooblehoof {
1137
963
  .foo, .bar {
1138
964
  a: b; } }
965
+
1139
966
  @flooblehoof {}
1140
967
  CSS
1141
968
  @flooblehoof {.foo {a: b}}
@@ -1158,11 +985,20 @@ SCSS
1158
985
  end
1159
986
 
1160
987
  def test_extend_within_and_without_media
1161
- assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
1162
- You may not @extend an outer selector from within @media.
1163
- You may only @extend selectors within the same directive.
1164
- From "@extend .foo" on line 4 of test_extend_within_and_without_media_inline.scss.
1165
- ERR
988
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SCSS))}
989
+ DEPRECATION WARNING on line 4 of test_extend_within_and_without_media_inline.scss:
990
+ @extending an outer selector from within @media is deprecated.
991
+ You may only @extend selectors within the same directive.
992
+ This will be an error in Sass 3.3.
993
+ It can only work once @extend is supported natively in the browser.
994
+ WARN
995
+ .foo {
996
+ a: b; }
997
+
998
+ @media screen {
999
+ .foo, .bar {
1000
+ c: d; } }
1001
+ CSS
1166
1002
  .foo {a: b}
1167
1003
  @media screen {
1168
1004
  .foo {c: d}
@@ -1172,11 +1008,20 @@ SCSS
1172
1008
  end
1173
1009
 
1174
1010
  def test_extend_within_and_without_unknown_directive
1175
- assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
1176
- You may not @extend an outer selector from within @flooblehoof.
1177
- You may only @extend selectors within the same directive.
1178
- From "@extend .foo" on line 4 of test_extend_within_and_without_unknown_directive_inline.scss.
1179
- ERR
1011
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SCSS))}
1012
+ DEPRECATION WARNING on line 4 of test_extend_within_and_without_unknown_directive_inline.scss:
1013
+ @extending an outer selector from within @flooblehoof is deprecated.
1014
+ You may only @extend selectors within the same directive.
1015
+ This will be an error in Sass 3.3.
1016
+ It can only work once @extend is supported natively in the browser.
1017
+ WARN
1018
+ .foo {
1019
+ a: b; }
1020
+
1021
+ @flooblehoof {
1022
+ .foo, .bar {
1023
+ c: d; } }
1024
+ CSS
1180
1025
  .foo {a: b}
1181
1026
  @flooblehoof {
1182
1027
  .foo {c: d}
@@ -1186,11 +1031,21 @@ SCSS
1186
1031
  end
1187
1032
 
1188
1033
  def test_extend_within_and_without_nested_directives
1189
- assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
1190
- You may not @extend an outer selector from within @flooblehoof.
1191
- You may only @extend selectors within the same directive.
1192
- From "@extend .foo" on line 5 of test_extend_within_and_without_nested_directives_inline.scss.
1193
- ERR
1034
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SCSS))}
1035
+ DEPRECATION WARNING on line 5 of test_extend_within_and_without_nested_directives_inline.scss:
1036
+ @extending an outer selector from within @flooblehoof is deprecated.
1037
+ You may only @extend selectors within the same directive.
1038
+ This will be an error in Sass 3.3.
1039
+ It can only work once @extend is supported natively in the browser.
1040
+ WARN
1041
+ @media screen {
1042
+ .foo {
1043
+ a: b; }
1044
+
1045
+ @flooblehoof {
1046
+ .foo, .bar {
1047
+ c: d; } } }
1048
+ CSS
1194
1049
  @media screen {
1195
1050
  .foo {a: b}
1196
1051
  @flooblehoof {
@@ -1202,7 +1057,7 @@ SCSS
1202
1057
  end
1203
1058
 
1204
1059
  def test_extend_with_subject_transfers_subject_to_extender
1205
- silence_warnings {assert_equal(<<CSS, render(<<SCSS))}
1060
+ assert_equal(<<CSS, render(<<SCSS))
1206
1061
  foo bar! baz, foo .bip .bap! baz, .bip foo .bap! baz {
1207
1062
  a: b; }
1208
1063
  CSS
@@ -1210,7 +1065,7 @@ foo bar! baz {a: b}
1210
1065
  .bip .bap {@extend bar}
1211
1066
  SCSS
1212
1067
 
1213
- silence_warnings {assert_equal(<<CSS, render(<<SCSS))}
1068
+ assert_equal(<<CSS, render(<<SCSS))
1214
1069
  foo.x bar.y! baz.z, foo.x .bip bar.bap! baz.z, .bip foo.x bar.bap! baz.z {
1215
1070
  a: b; }
1216
1071
  CSS
@@ -1220,7 +1075,7 @@ SCSS
1220
1075
  end
1221
1076
 
1222
1077
  def test_extend_with_subject_retains_subject_on_target
1223
- silence_warnings {assert_equal(<<CSS, render(<<SCSS))}
1078
+ assert_equal(<<CSS, render(<<SCSS))
1224
1079
  .foo! .bar, .foo! .bip .bap, .bip .foo! .bap {
1225
1080
  a: b; }
1226
1081
  CSS
@@ -1230,7 +1085,7 @@ SCSS
1230
1085
  end
1231
1086
 
1232
1087
  def test_extend_with_subject_transfers_subject_to_target
1233
- silence_warnings {assert_equal(<<CSS, render(<<SCSS))}
1088
+ assert_equal(<<CSS, render(<<SCSS))
1234
1089
  a.foo .bar, .bip a.bap! .bar {
1235
1090
  a: b; }
1236
1091
  CSS
@@ -1240,7 +1095,7 @@ SCSS
1240
1095
  end
1241
1096
 
1242
1097
  def test_extend_with_subject_retains_subject_on_extender
1243
- silence_warnings {assert_equal(<<CSS, render(<<SCSS))}
1098
+ assert_equal(<<CSS, render(<<SCSS))
1244
1099
  .foo .bar, .foo .bip! .bap, .bip! .foo .bap {
1245
1100
  a: b; }
1246
1101
  CSS
@@ -1250,38 +1105,43 @@ SCSS
1250
1105
  end
1251
1106
 
1252
1107
  def test_extend_with_subject_fails_with_conflicting_subject
1253
- silence_warnings {assert_equal(<<CSS, render(<<SCSS))}
1108
+ assert_equal(<<CSS, render(<<SCSS))
1254
1109
  x! .bar {
1255
1110
  a: b; }
1256
1111
  CSS
1257
1112
  x! .bar {a: b}
1258
1113
  y! .bap {@extend .bar}
1259
1114
  SCSS
1260
- end
1115
+ end
1261
1116
 
1262
1117
  def test_extend_warns_when_extendee_doesnt_exist
1263
- assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
1264
- ".foo" failed to @extend ".bar".
1265
- The selector ".bar" was not found.
1266
- Use "@extend .bar !optional" if the extend should be able to fail.
1267
- ERR
1118
+ assert_warning(<<WARN) {assert_equal("", render(<<SCSS))}
1119
+ WARNING on line 1 of test_extend_warns_when_extendee_doesnt_exist_inline.scss: ".foo" failed to @extend ".bar".
1120
+ The selector ".bar" was not found.
1121
+ This will be an error in future releases of Sass.
1122
+ Use "@extend .bar !optional" if the extend should be able to fail.
1123
+ WARN
1268
1124
  .foo {@extend .bar}
1269
1125
  SCSS
1270
1126
  end
1271
1127
 
1272
1128
  def test_extend_warns_when_extension_fails
1273
- assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
1274
- "b.foo" failed to @extend ".bar".
1275
- No selectors matching ".bar" could be unified with "b.foo".
1276
- Use "@extend .bar !optional" if the extend should be able to fail.
1277
- ERR
1129
+ assert_warning(<<WARN) {assert_equal(<<CSS, render(<<SCSS))}
1130
+ WARNING on line 2 of test_extend_warns_when_extension_fails_inline.scss: "b.foo" failed to @extend ".bar".
1131
+ No selectors matching ".bar" could be unified with "b.foo".
1132
+ This will be an error in future releases of Sass.
1133
+ Use "@extend .bar !optional" if the extend should be able to fail.
1134
+ WARN
1135
+ a.bar {
1136
+ a: b; }
1137
+ CSS
1278
1138
  a.bar {a: b}
1279
1139
  b.foo {@extend .bar}
1280
1140
  SCSS
1281
1141
  end
1282
1142
 
1283
- def test_extend_succeeds_when_one_extension_fails_but_others_dont
1284
- assert_equal(<<CSS, render(<<SCSS))
1143
+ def test_extend_does_not_warn_when_one_extension_fails_but_others_dont
1144
+ assert_no_warning {assert_equal(<<CSS, render(<<SCSS))}
1285
1145
  a.bar {
1286
1146
  a: b; }
1287
1147
 
@@ -1294,14 +1154,14 @@ b.foo {@extend .bar}
1294
1154
  SCSS
1295
1155
  end
1296
1156
 
1297
- def test_optional_extend_succeeds_when_extendee_doesnt_exist
1298
- assert_equal("", render(<<SCSS))
1157
+ def test_optional_extend_does_not_warn_when_extendee_doesnt_exist
1158
+ assert_no_warning {assert_equal("", render(<<SCSS))}
1299
1159
  .foo {@extend .bar !optional}
1300
1160
  SCSS
1301
1161
  end
1302
1162
 
1303
- def test_optional_extend_succeeds_when_extension_fails
1304
- assert_equal(<<CSS, render(<<SCSS))
1163
+ def test_optional_extend_does_not_warn_when_extension_fails
1164
+ assert_no_warning {assert_equal(<<CSS, render(<<SCSS))}
1305
1165
  a.bar {
1306
1166
  a: b; }
1307
1167
  CSS
@@ -1312,16 +1172,6 @@ SCSS
1312
1172
 
1313
1173
  # Regression Tests
1314
1174
 
1315
- def test_extend_parent_selector_suffix
1316
- assert_equal <<CSS, render(<<SCSS)
1317
- .a-b, .c {
1318
- x: y; }
1319
- CSS
1320
- .a {&-b {x: y}}
1321
- .c {@extend .a-b}
1322
- SCSS
1323
- end
1324
-
1325
1175
  def test_pseudo_element_superselector
1326
1176
  # Pseudo-elements shouldn't be removed in superselector calculations.
1327
1177
  assert_equal <<CSS, render(<<SCSS)
@@ -1590,7 +1440,7 @@ SCSS
1590
1440
  private
1591
1441
 
1592
1442
  def assert_extend_doesnt_match(extender, target, reason, line, syntax = :scss)
1593
- message = "\"#{extender}\" failed to @extend \"#{target}\"."
1443
+ warn = "\"#{extender}\" failed to @extend \"#{target}\"."
1594
1444
  reason =
1595
1445
  if reason == :not_found
1596
1446
  "The selector \"#{target}\" was not found."
@@ -1598,14 +1448,15 @@ SCSS
1598
1448
  "No selectors matching \"#{target}\" could be unified with \"#{extender}\"."
1599
1449
  end
1600
1450
 
1601
- assert_raise_message(Sass::SyntaxError, <<ERR) {yield}
1602
- #{message}
1603
- #{reason}
1604
- Use "@extend #{target} !optional" if the extend should be able to fail.
1605
- ERR
1451
+ assert_warning(<<WARNING) {yield}
1452
+ WARNING on line #{line} of #{filename_for_test syntax}: #{warn}
1453
+ #{reason}
1454
+ This will be an error in future releases of Sass.
1455
+ Use "@extend #{target} !optional" if the extend should be able to fail.
1456
+ WARNING
1606
1457
  end
1607
1458
 
1608
- def assert_unification(selector, extension, unified, nested = true)
1459
+ def assert_unification(selector, extension, unified)
1609
1460
  # Do some trickery so the first law of extend doesn't get in our way.
1610
1461
  assert_extends(
1611
1462
  "%-a #{selector}",
@@ -1613,41 +1464,11 @@ ERR
1613
1464
  unified.split(', ').map {|s| "-a #{s}"}.join(', '))
1614
1465
  end
1615
1466
 
1616
- def assert_specificity_equals(sel1, sel2)
1617
- assert_specificity_gte(sel1, sel2)
1618
- assert_specificity_gte(sel2, sel1)
1619
- end
1620
-
1621
- def assert_specificity_gte(sel1, sel2)
1622
- assert_equal <<CSS, render(<<SCSS)
1623
- #{sel1} .a {
1624
- a: b; }
1625
- CSS
1626
- #{sel1} %-a {a: b}
1627
- .a {@extend %-a}
1628
- #{sel2}.a {@extend %-a}
1629
- SCSS
1630
- end
1631
-
1632
- def render_unification(selector, extension)
1633
- render_extends(
1634
- "%-a #{selector}",
1635
- extension + " -a {@extend %-a}")
1636
- end
1637
-
1638
1467
  def assert_extends(selector, extension, result)
1639
- assert_equal <<CSS, render_extends(selector, extension)
1468
+ assert_equal <<CSS, render(<<SCSS)
1640
1469
  #{result} {
1641
1470
  a: b; }
1642
1471
  CSS
1643
- end
1644
-
1645
- def assert_extends_to_nothing(selector, extension)
1646
- assert_equal '', render_extends(selector, extension)
1647
- end
1648
-
1649
- def render_extends(selector, extension)
1650
- render(<<SCSS)
1651
1472
  #{selector} {a: b}
1652
1473
  #{extension}
1653
1474
  SCSS