sass 3.5.0.pre.rc.1 → 3.5.0

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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/README.md +1 -1
  4. data/Rakefile +40 -11
  5. data/VERSION +1 -1
  6. data/VERSION_DATE +1 -1
  7. data/extra/sass-spec-ref.sh +32 -0
  8. data/lib/sass.rb +3 -3
  9. data/lib/sass/css.rb +1 -1
  10. data/lib/sass/deprecation.rb +55 -0
  11. data/lib/sass/engine.rb +16 -12
  12. data/lib/sass/environment.rb +1 -1
  13. data/lib/sass/error.rb +3 -3
  14. data/lib/sass/exec/base.rb +1 -1
  15. data/lib/sass/plugin.rb +1 -1
  16. data/lib/sass/plugin/compiler.rb +1 -1
  17. data/lib/sass/plugin/configuration.rb +2 -2
  18. data/lib/sass/plugin/rack.rb +3 -3
  19. data/lib/sass/plugin/staleness_checker.rb +3 -3
  20. data/lib/sass/script.rb +3 -3
  21. data/lib/sass/script/functions.rb +23 -22
  22. data/lib/sass/script/lexer.rb +17 -8
  23. data/lib/sass/script/parser.rb +8 -7
  24. data/lib/sass/script/tree/node.rb +2 -2
  25. data/lib/sass/script/tree/operation.rb +43 -16
  26. data/lib/sass/script/value/base.rb +3 -3
  27. data/lib/sass/script/value/color.rb +15 -10
  28. data/lib/sass/script/value/helpers.rb +13 -2
  29. data/lib/sass/script/value/list.rb +2 -2
  30. data/lib/sass/script/value/number.rb +4 -4
  31. data/lib/sass/script/value/string.rb +5 -12
  32. data/lib/sass/scss/parser.rb +7 -4
  33. data/lib/sass/scss/rx.rb +1 -1
  34. data/lib/sass/scss/static_parser.rb +12 -24
  35. data/lib/sass/selector/abstract_sequence.rb +12 -11
  36. data/lib/sass/selector/comma_sequence.rb +18 -3
  37. data/lib/sass/selector/pseudo.rb +15 -2
  38. data/lib/sass/selector/sequence.rb +9 -7
  39. data/lib/sass/selector/simple.rb +5 -4
  40. data/lib/sass/selector/simple_sequence.rb +7 -3
  41. data/lib/sass/shared.rb +5 -3
  42. data/lib/sass/source/map.rb +2 -2
  43. data/lib/sass/source/position.rb +4 -4
  44. data/lib/sass/tree/comment_node.rb +1 -1
  45. data/lib/sass/tree/node.rb +3 -3
  46. data/lib/sass/tree/prop_node.rb +1 -1
  47. data/lib/sass/tree/rule_node.rb +15 -6
  48. data/lib/sass/tree/visitors/cssize.rb +3 -5
  49. data/lib/sass/tree/visitors/deep_copy.rb +1 -1
  50. data/lib/sass/tree/visitors/extend.rb +2 -8
  51. data/lib/sass/tree/visitors/perform.rb +3 -2
  52. data/lib/sass/tree/visitors/to_css.rb +3 -3
  53. data/lib/sass/util.rb +32 -5
  54. data/lib/sass/version.rb +2 -4
  55. data/test/sass/cache_test.rb +0 -1
  56. data/test/sass/callbacks_test.rb +0 -1
  57. data/test/sass/compiler_test.rb +0 -1
  58. data/test/sass/conversion_test.rb +3 -4
  59. data/test/sass/css2sass_test.rb +1 -2
  60. data/test/sass/css_variable_test.rb +0 -1
  61. data/test/sass/encoding_test.rb +0 -1
  62. data/test/sass/engine_test.rb +63 -60
  63. data/test/sass/exec_test.rb +0 -1
  64. data/test/sass/extend_test.rb +40 -81
  65. data/test/sass/functions_test.rb +8 -6
  66. data/test/sass/importer_test.rb +0 -1
  67. data/test/sass/logger_test.rb +0 -1
  68. data/test/sass/more_templates/more1.sass +10 -10
  69. data/test/sass/more_templates/more_import.sass +2 -2
  70. data/test/sass/plugin_test.rb +3 -4
  71. data/test/sass/results/script.css +1 -1
  72. data/test/sass/results/units.css +2 -2
  73. data/test/sass/script_conversion_test.rb +1 -2
  74. data/test/sass/script_test.rb +55 -47
  75. data/test/sass/scss/css_test.rb +2 -3
  76. data/test/sass/scss/rx_test.rb +0 -1
  77. data/test/sass/scss/scss_test.rb +26 -12
  78. data/test/sass/source_map_test.rb +13 -14
  79. data/test/sass/superselector_test.rb +0 -1
  80. data/test/sass/templates/_partial.sass +1 -1
  81. data/test/sass/templates/basic.sass +10 -10
  82. data/test/sass/templates/bork1.sass +1 -1
  83. data/test/sass/templates/bork5.sass +1 -1
  84. data/test/sass/templates/compact.sass +10 -10
  85. data/test/sass/templates/complex.sass +187 -187
  86. data/test/sass/templates/compressed.sass +10 -10
  87. data/test/sass/templates/expanded.sass +10 -10
  88. data/test/sass/templates/import.sass +2 -2
  89. data/test/sass/templates/importee.sass +3 -3
  90. data/test/sass/templates/mixins.sass +22 -22
  91. data/test/sass/templates/multiline.sass +4 -4
  92. data/test/sass/templates/nested.sass +13 -13
  93. data/test/sass/templates/parent_ref.sass +12 -12
  94. data/test/sass/templates/script.sass +70 -70
  95. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +1 -1
  96. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +2 -2
  97. data/test/sass/templates/subdir/subdir.sass +3 -3
  98. data/test/sass/templates/units.sass +10 -10
  99. data/test/sass/util/multibyte_string_scanner_test.rb +10 -3
  100. data/test/sass/util/normalized_map_test.rb +0 -1
  101. data/test/sass/util/subset_map_test.rb +0 -1
  102. data/test/sass/util_test.rb +4 -3
  103. data/test/sass/value_helpers_test.rb +0 -1
  104. metadata +15 -13
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: utf-8 -*-
3
2
  require File.dirname(__FILE__) + '/../test_helper'
4
3
  require File.dirname(__FILE__) + '/test_helper'
@@ -98,8 +97,6 @@ MSG
98
97
  "a\n\t\tb: c\n\tb: c" => ["Inconsistent indentation: 1 tab was used for indentation, but the rest of the document was indented using 2 tabs.", 3],
99
98
  "a\n b: c\n b: c" => ["Inconsistent indentation: 3 spaces were used for indentation, but the rest of the document was indented using 2 spaces.", 3],
100
99
  "a\n b: c\n a\n d: e" => ["Inconsistent indentation: 3 spaces were used for indentation, but the rest of the document was indented using 2 spaces.", 4],
101
- "a\n b: c\na\n d: e" => ["The line was indented 2 levels deeper than the previous line.", 4],
102
- "a\n b: c\n a\n d: e" => ["The line was indented 3 levels deeper than the previous line.", 4],
103
100
  "a\n \tb: c" => ["Indentation can't use both tabs and spaces.", 2],
104
101
  "=a(" => 'Invalid CSS after "(": expected variable (e.g. $foo), was ""',
105
102
  "=a(b)" => 'Invalid CSS after "(": expected variable (e.g. $foo), was "b)"',
@@ -139,7 +136,7 @@ MSG
139
136
  '@for $a from "foo" to 1' => '"foo" is not an integer.',
140
137
  '@for $a from 1 to "2"' => '"2" is not an integer.',
141
138
  '@for $a from 1 to "foo"' => '"foo" is not an integer.',
142
- '@for $a from 1 to 1.232323' => '1.23232 is not an integer.',
139
+ '@for $a from 1 to 1.23232323232' => '1.2323232323 is not an integer.',
143
140
  '@for $a from 1px to 3em' => "Incompatible units: 'em' and 'px'.",
144
141
  '@if' => "Invalid if directive '@if': expected expression.",
145
142
  '@while' => "Invalid while directive '@while': expected expression.",
@@ -288,10 +285,10 @@ ERROR
288
285
  def test_exception_line
289
286
  to_render = <<SASS
290
287
  rule
291
- :prop val
288
+ prop: val
292
289
  // comment!
293
290
 
294
- :broken
291
+ broken:
295
292
  SASS
296
293
  begin
297
294
  Sass::Engine.new(to_render).render
@@ -305,10 +302,10 @@ SASS
305
302
  def test_exception_location
306
303
  to_render = <<SASS
307
304
  rule
308
- :prop val
305
+ prop: val
309
306
  // comment!
310
307
 
311
- :broken
308
+ broken:
312
309
  SASS
313
310
  begin
314
311
  Sass::Engine.new(to_render, :filename => FAKE_FILE_NAME, :line => (__LINE__-7)).render
@@ -749,22 +746,22 @@ SASS
749
746
 
750
747
  def test_basic_multiline_selector
751
748
  assert_equal("#foo #bar,\n#baz #boom {\n foo: bar; }\n",
752
- render("#foo #bar,\n#baz #boom\n :foo bar"))
749
+ render("#foo #bar,\n#baz #boom\n foo: bar"))
753
750
  assert_equal("#foo #bar,\n#foo #baz {\n foo: bar; }\n",
754
- render("#foo\n #bar,\n #baz\n :foo bar"))
751
+ render("#foo\n #bar,\n #baz\n foo: bar"))
755
752
  assert_equal("#foo,\n#bar {\n foo: bar; }\n #foo #baz,\n #bar #baz {\n foo: bar; }\n",
756
- render("#foo,\n#bar\n :foo bar\n #baz\n :foo bar"))
753
+ render("#foo,\n#bar\n foo: bar\n #baz\n foo: bar"))
757
754
  assert_equal("#foo #bar, #baz #boom { foo: bar; }\n",
758
- render("#foo #bar,\n#baz #boom\n :foo bar", :style => :compact))
755
+ render("#foo #bar,\n#baz #boom\n foo: bar", :style => :compact))
759
756
 
760
757
  assert_equal("#foo #bar,#baz #boom{foo:bar}\n",
761
- render("#foo #bar,\n#baz #boom\n :foo bar", :style => :compressed))
758
+ render("#foo #bar,\n#baz #boom\n foo: bar", :style => :compressed))
762
759
 
763
760
  assert_equal("#foo #bar,\n#baz #boom {\n foo: bar; }\n",
764
- render("#foo #bar,,\n,#baz #boom,\n :foo bar"))
761
+ render("#foo #bar,,\n,#baz #boom,\n foo: bar"))
765
762
 
766
763
  assert_equal("#bip #bop {\n foo: bar; }\n",
767
- render("#bip #bop,, ,\n :foo bar"))
764
+ render("#bip #bop,, ,\n foo: bar"))
768
765
  end
769
766
 
770
767
  def test_complex_multiline_selector
@@ -783,7 +780,7 @@ SASS
783
780
  end
784
781
 
785
782
  begin
786
- render("a\n :b c", :property_syntax => :new)
783
+ silence_warnings {render("a\n :b c", :property_syntax => :new)}
787
784
  assert_equal(2, e.sass_line)
788
785
  rescue Sass::SyntaxError => e
789
786
  assert_equal("Illegal property syntax: can't use old syntax when :property_syntax => :new is set.",
@@ -806,53 +803,53 @@ SASS
806
803
  def test_directive
807
804
  assert_equal("@a b;\n", render("@a b"))
808
805
 
809
- assert_equal("@a {\n b: c; }\n", render("@a\n :b c"))
810
- assert_equal("@a { b: c; }\n", render("@a\n :b c", :style => :compact))
811
- assert_equal("@a {\n b: c;\n}\n", render("@a\n :b c", :style => :expanded))
812
- assert_equal("@a{b:c}\n", render("@a\n :b c", :style => :compressed))
806
+ assert_equal("@a {\n b: c; }\n", render("@a\n b: c"))
807
+ assert_equal("@a { b: c; }\n", render("@a\n b: c", :style => :compact))
808
+ assert_equal("@a {\n b: c;\n}\n", render("@a\n b: c", :style => :expanded))
809
+ assert_equal("@a{b:c}\n", render("@a\n b: c", :style => :compressed))
813
810
 
814
811
  assert_equal("@a {\n b: c;\n d: e; }\n",
815
- render("@a\n :b c\n :d e"))
812
+ render("@a\n b: c\n d: e"))
816
813
  assert_equal("@a { b: c; d: e; }\n",
817
- render("@a\n :b c\n :d e", :style => :compact))
814
+ render("@a\n b: c\n d: e", :style => :compact))
818
815
  assert_equal("@a {\n b: c;\n d: e;\n}\n",
819
- render("@a\n :b c\n :d e", :style => :expanded))
816
+ render("@a\n b: c\n d: e", :style => :expanded))
820
817
  assert_equal("@a{b:c;d:e}\n",
821
- render("@a\n :b c\n :d e", :style => :compressed))
818
+ render("@a\n b: c\n d: e", :style => :compressed))
822
819
 
823
820
  assert_equal("@a {\n #b {\n c: d; } }\n",
824
- render("@a\n #b\n :c d"))
821
+ render("@a\n #b\n c: d"))
825
822
  assert_equal("@a { #b { c: d; } }\n",
826
- render("@a\n #b\n :c d", :style => :compact))
823
+ render("@a\n #b\n c: d", :style => :compact))
827
824
  assert_equal("@a {\n #b {\n c: d;\n }\n}\n",
828
- render("@a\n #b\n :c d", :style => :expanded))
825
+ render("@a\n #b\n c: d", :style => :expanded))
829
826
  assert_equal("@a{#b{c:d}}\n",
830
- render("@a\n #b\n :c d", :style => :compressed))
827
+ render("@a\n #b\n c: d", :style => :compressed))
831
828
 
832
829
  assert_equal("@a {\n #b {\n a: b; }\n #b #c {\n d: e; } }\n",
833
- render("@a\n #b\n :a b\n #c\n :d e"))
830
+ render("@a\n #b\n a: b\n #c\n d: e"))
834
831
  assert_equal("@a { #b { a: b; }\n #b #c { d: e; } }\n",
835
- render("@a\n #b\n :a b\n #c\n :d e", :style => :compact))
832
+ render("@a\n #b\n a: b\n #c\n d: e", :style => :compact))
836
833
  assert_equal("@a {\n #b {\n a: b;\n }\n #b #c {\n d: e;\n }\n}\n",
837
- render("@a\n #b\n :a b\n #c\n :d e", :style => :expanded))
834
+ render("@a\n #b\n a: b\n #c\n d: e", :style => :expanded))
838
835
  assert_equal("@a{#b{a:b}#b #c{d:e}}\n",
839
- render("@a\n #b\n :a b\n #c\n :d e", :style => :compressed))
836
+ render("@a\n #b\n a: b\n #c\n d: e", :style => :compressed))
840
837
 
841
838
  assert_equal("@a {\n #foo,\n #bar {\n b: c; } }\n",
842
- render("@a\n #foo, \n #bar\n :b c"))
839
+ render("@a\n #foo, \n #bar\n b: c"))
843
840
  assert_equal("@a { #foo, #bar { b: c; } }\n",
844
- render("@a\n #foo, \n #bar\n :b c", :style => :compact))
841
+ render("@a\n #foo, \n #bar\n b: c", :style => :compact))
845
842
  assert_equal("@a {\n #foo,\n #bar {\n b: c;\n }\n}\n",
846
- render("@a\n #foo, \n #bar\n :b c", :style => :expanded))
843
+ render("@a\n #foo, \n #bar\n b: c", :style => :expanded))
847
844
  assert_equal("@a{#foo,#bar{b:c}}\n",
848
- render("@a\n #foo, \n #bar\n :b c", :style => :compressed))
845
+ render("@a\n #foo, \n #bar\n b: c", :style => :compressed))
849
846
 
850
847
  to_render = <<END
851
848
  @a
852
- :b c
849
+ b: c
853
850
  #d
854
- :e f
855
- :g h
851
+ e: f
852
+ g: h
856
853
  END
857
854
  rendered = <<END
858
855
  @a { b: c;
@@ -1141,7 +1138,7 @@ black {
1141
1138
  color: #000; }
1142
1139
  CSS
1143
1140
  =foo($a: #FFF)
1144
- :color $a
1141
+ color: $a
1145
1142
  white
1146
1143
  +foo
1147
1144
  black
@@ -1165,9 +1162,9 @@ three {
1165
1162
  CSS
1166
1163
  $a: 5px
1167
1164
  =foo($a, $b: 1px, $c: 3px + $b)
1168
- :color $a
1169
- :padding $b
1170
- :margin $c
1165
+ color: $a
1166
+ padding: $b
1167
+ margin: $c
1171
1168
  one
1172
1169
  +foo(#fff)
1173
1170
  two
@@ -1793,7 +1790,7 @@ SASS
1793
1790
 
1794
1791
  def test_loud_comment_is_evaluated
1795
1792
  assert_equal <<CSS, render(<<SASS)
1796
- /*! Hue: 327.21649deg */
1793
+ /*! Hue: 327.2164948454deg */
1797
1794
  CSS
1798
1795
  /*! Hue: \#{hue(#f836a0)}
1799
1796
  SASS
@@ -2598,29 +2595,29 @@ SASS
2598
2595
  border-style: solid; }
2599
2596
  RESULT
2600
2597
  .box
2601
- :border
2602
- //:color black
2603
- :style solid
2598
+ border:
2599
+ //color: black
2600
+ style: solid
2604
2601
  SOURCE
2605
2602
 
2606
2603
  assert_equal(<<RESULT, render(<<SOURCE))
2607
2604
  .box {
2608
- /* :color black */
2605
+ /* color: black */
2609
2606
  border-style: solid; }
2610
2607
  RESULT
2611
2608
  .box
2612
- :border
2613
- /* :color black
2614
- :style solid
2609
+ border:
2610
+ /* color: black
2611
+ style: solid
2615
2612
  SOURCE
2616
2613
 
2617
2614
  assert_equal(<<RESULT, render(<<SOURCE, :style => :compressed))
2618
2615
  .box{border-style:solid}
2619
2616
  RESULT
2620
2617
  .box
2621
- :border
2622
- /*:color black
2623
- :style solid
2618
+ border:
2619
+ /*color: black
2620
+ style: solid
2624
2621
  SOURCE
2625
2622
  end
2626
2623
 
@@ -3315,13 +3312,13 @@ SASS
3315
3312
 
3316
3313
  def test_numeric_formatting_of_integers
3317
3314
  assert_equal(<<CSS, render(<<SASS, :syntax => :scss, :style => :compressed))
3318
- a{near:3.00001;plus:3;minus:3;negative:-3}
3315
+ a{near:3.0000000001;plus:3;minus:3;negative:-3}
3319
3316
  CSS
3320
3317
  a {
3321
- near: (3 + 0.00001);
3322
- plus: (3 + 0.0000001);
3323
- minus: (3 - 0.0000001);
3324
- negative: (-3 + 0.0000001);
3318
+ near: (3 + 0.0000000001);
3319
+ plus: (3 + 0.000000000001);
3320
+ minus: (3 - 0.000000000001);
3321
+ negative: (-3 + 0.000000000001);
3325
3322
  }
3326
3323
  SASS
3327
3324
  end
@@ -3449,7 +3446,13 @@ SASS
3449
3446
  private
3450
3447
 
3451
3448
  def assert_hash_has(hash, expected)
3452
- expected.each {|k, v| assert_equal(v, hash[k])}
3449
+ expected.each do |k, v|
3450
+ if v.nil?
3451
+ assert_nil(hash[k])
3452
+ else
3453
+ assert_equal(v, hash[k])
3454
+ end
3455
+ end
3453
3456
  end
3454
3457
 
3455
3458
  def assert_renders_encoded(css, sass)
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  require File.dirname(__FILE__) + '/../test_helper'
3
2
  require 'fileutils'
4
3
  require 'sass/util/test'
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  require File.dirname(__FILE__) + '/../test_helper'
3
2
 
4
3
  class ExtendTest < MiniTest::Test
@@ -152,10 +151,7 @@ SCSS
152
151
  def test_id_unification
153
152
  assert_unification '.foo.bar', '#baz {@extend .foo}', '.foo.bar, .bar#baz'
154
153
  assert_unification '.foo#baz', '#baz {@extend .foo}', '#baz'
155
-
156
- assert_extend_doesnt_match('#bar', '.foo', :failed_to_unify, 2) do
157
- render_unification '.foo#baz', '#bar {@extend .foo}'
158
- end
154
+ assert_unification '.foo#baz', '#bar {@extend .foo}', '.foo#baz'
159
155
  end
160
156
 
161
157
  def test_universal_unification_with_simple_target
@@ -167,42 +163,34 @@ SCSS
167
163
  end
168
164
 
169
165
  def test_universal_unification_with_namespaceless_universal_target
166
+ assert_unification '*.foo', 'ns|* {@extend .foo}', '*.foo'
170
167
  assert_unification '*.foo', '* {@extend .foo}', '*'
171
168
  assert_unification '*.foo', '*|* {@extend .foo}', '*'
172
169
  assert_unification '*|*.foo', '* {@extend .foo}', '*|*.foo, *'
173
170
  assert_unification '*|*.foo', '*|* {@extend .foo}', '*|*'
174
- assert_unification '*.foo', 'ns|* {@extend .foo}', '*.foo, ns|*'
175
171
  assert_unification '*|*.foo', 'ns|* {@extend .foo}', '*|*.foo, ns|*'
176
172
  end
177
173
 
178
174
  def test_universal_unification_with_namespaced_universal_target
179
- assert_unification 'ns|*.foo', '* {@extend .foo}', 'ns|*'
175
+ assert_unification 'ns|*.foo', '* {@extend .foo}', 'ns|*.foo'
176
+ assert_unification 'ns1|*.foo', 'ns2|* {@extend .foo}', 'ns1|*.foo'
180
177
  assert_unification 'ns|*.foo', '*|* {@extend .foo}', 'ns|*'
181
-
182
- assert_extend_doesnt_match('ns2|*', '.foo', :failed_to_unify, 2) do
183
- render_unification 'ns1|*.foo', 'ns2|* {@extend .foo}'
184
- end
185
-
186
178
  assert_unification 'ns|*.foo', 'ns|* {@extend .foo}', 'ns|*'
187
179
  end
188
180
 
189
181
  def test_universal_unification_with_namespaceless_element_target
182
+ assert_unification 'a.foo', 'ns|* {@extend .foo}', 'a.foo'
190
183
  assert_unification 'a.foo', '* {@extend .foo}', 'a'
191
184
  assert_unification 'a.foo', '*|* {@extend .foo}', 'a'
192
185
  assert_unification '*|a.foo', '* {@extend .foo}', '*|a.foo, a'
193
186
  assert_unification '*|a.foo', '*|* {@extend .foo}', '*|a'
194
- assert_unification 'a.foo', 'ns|* {@extend .foo}', 'a.foo, ns|a'
195
187
  assert_unification '*|a.foo', 'ns|* {@extend .foo}', '*|a.foo, ns|a'
196
188
  end
197
189
 
198
190
  def test_universal_unification_with_namespaced_element_target
199
- assert_unification 'ns|a.foo', '* {@extend .foo}', 'ns|a'
191
+ assert_unification 'ns|a.foo', '* {@extend .foo}', 'ns|a.foo'
192
+ assert_unification 'ns1|a.foo', 'ns2|* {@extend .foo}', 'ns1|a.foo'
200
193
  assert_unification 'ns|a.foo', '*|* {@extend .foo}', 'ns|a'
201
-
202
- assert_extend_doesnt_match('ns2|*', '.foo', :failed_to_unify, 2) do
203
- render_unification 'ns1|a.foo', 'ns2|* {@extend .foo}'
204
- end
205
-
206
194
  assert_unification 'ns|a.foo', 'ns|* {@extend .foo}', 'ns|a'
207
195
  end
208
196
 
@@ -214,46 +202,35 @@ SCSS
214
202
  end
215
203
 
216
204
  def test_element_unification_with_namespaceless_universal_target
205
+ assert_unification '*.foo', 'ns|a {@extend .foo}', '*.foo'
217
206
  assert_unification '*.foo', 'a {@extend .foo}', '*.foo, a'
218
207
  assert_unification '*.foo', '*|a {@extend .foo}', '*.foo, a'
219
208
  assert_unification '*|*.foo', 'a {@extend .foo}', '*|*.foo, a'
220
209
  assert_unification '*|*.foo', '*|a {@extend .foo}', '*|*.foo, *|a'
221
- assert_unification '*.foo', 'ns|a {@extend .foo}', '*.foo, ns|a'
222
210
  assert_unification '*|*.foo', 'ns|a {@extend .foo}', '*|*.foo, ns|a'
223
211
  end
224
212
 
225
213
  def test_element_unification_with_namespaced_universal_target
226
- assert_unification 'ns|*.foo', 'a {@extend .foo}', 'ns|*.foo, ns|a'
214
+ assert_unification 'ns|*.foo', 'a {@extend .foo}', 'ns|*.foo'
215
+ assert_unification 'ns1|*.foo', 'ns2|a {@extend .foo}', 'ns1|*.foo'
227
216
  assert_unification 'ns|*.foo', '*|a {@extend .foo}', 'ns|*.foo, ns|a'
228
-
229
- assert_extend_doesnt_match('ns2|a', '.foo', :failed_to_unify, 2) do
230
- render_unification 'ns1|*.foo', 'ns2|a {@extend .foo}'
231
- end
232
-
233
217
  assert_unification 'ns|*.foo', 'ns|a {@extend .foo}', 'ns|*.foo, ns|a'
234
218
  end
235
219
 
236
220
  def test_element_unification_with_namespaceless_element_target
221
+ assert_unification 'a.foo', 'ns|a {@extend .foo}', 'a.foo'
222
+ assert_unification 'a.foo', 'h1 {@extend .foo}', 'a.foo'
237
223
  assert_unification 'a.foo', 'a {@extend .foo}', 'a'
238
224
  assert_unification 'a.foo', '*|a {@extend .foo}', 'a'
239
225
  assert_unification '*|a.foo', 'a {@extend .foo}', '*|a.foo, a'
240
226
  assert_unification '*|a.foo', '*|a {@extend .foo}', '*|a'
241
- assert_unification 'a.foo', 'ns|a {@extend .foo}', 'a.foo, ns|a'
242
227
  assert_unification '*|a.foo', 'ns|a {@extend .foo}', '*|a.foo, ns|a'
243
-
244
- assert_extend_doesnt_match('h1', '.foo', :failed_to_unify, 2) do
245
- render_unification 'a.foo', 'h1 {@extend .foo}'
246
- end
247
228
  end
248
229
 
249
230
  def test_element_unification_with_namespaced_element_target
250
- assert_unification 'ns|a.foo', 'a {@extend .foo}', 'ns|a'
231
+ assert_unification 'ns|a.foo', 'a {@extend .foo}', 'ns|a.foo'
232
+ assert_unification 'ns1|a.foo', 'ns2|a {@extend .foo}', 'ns1|a.foo'
251
233
  assert_unification 'ns|a.foo', '*|a {@extend .foo}', 'ns|a'
252
-
253
- assert_extend_doesnt_match('ns2|a', '.foo', :failed_to_unify, 2) do
254
- render_unification 'ns1|a.foo', 'ns2|a {@extend .foo}'
255
- end
256
-
257
234
  assert_unification 'ns|a.foo', 'ns|a {@extend .foo}', 'ns|a'
258
235
  end
259
236
 
@@ -268,15 +245,8 @@ SCSS
268
245
  def test_pseudo_unification
269
246
  assert_unification ':foo.baz', ':foo(2n+1) {@extend .baz}', ':foo.baz, :foo:foo(2n+1)'
270
247
  assert_unification ':foo.baz', '::foo {@extend .baz}', ':foo.baz, :foo::foo'
271
-
272
- assert_extend_doesnt_match('::bar', '.baz', :failed_to_unify, 2) do
273
- render_unification '::foo.baz', '::bar {@extend .baz}'
274
- end
275
-
276
- assert_extend_doesnt_match('::foo(2n+1)', '.baz', :failed_to_unify, 2) do
277
- render_unification '::foo.baz', '::foo(2n+1) {@extend .baz}'
278
- end
279
-
248
+ assert_unification '::foo.baz', '::bar {@extend .baz}', '::foo.baz'
249
+ assert_unification '::foo.baz', '::foo(2n+1) {@extend .baz}', '::foo.baz'
280
250
  assert_unification '::foo.baz', '::foo {@extend .baz}', '::foo'
281
251
  assert_unification '::foo(2n+1).baz', '::foo(2n+1) {@extend .baz}', '::foo(2n+1)'
282
252
  assert_unification ':foo.baz', ':bar {@extend .baz}', ':foo.baz, :foo:bar'
@@ -565,21 +535,27 @@ SCSS
565
535
  ## Long Extendees
566
536
 
567
537
  def test_long_extendee
568
- assert_extends '.foo.bar', '.baz {@extend .foo.bar}', '.foo.bar, .baz'
538
+ assert_warning(<<WARNING) {assert_extends '.foo.bar', '.baz {@extend .foo.bar}', '.foo.bar, .baz'}
539
+ DEPRECATION WARNING on line 2 of test_long_extendee_inline.scss:
540
+ Extending a compound selector, .foo.bar, is deprecated and will not be supported in a future release.
541
+ See https://github.com/sass/sass/issues/1599 for details.
542
+ WARNING
569
543
  end
570
544
 
571
545
  def test_long_extendee_requires_all_selectors
572
- assert_extend_doesnt_match('.baz', '.foo.bar', :not_found, 2) do
573
- render_extends '.foo', '.baz {@extend .foo.bar}'
546
+ silence_warnings do
547
+ assert_extend_doesnt_match('.baz', '.foo.bar', :not_found, 2) do
548
+ render_extends '.foo', '.baz {@extend .foo.bar}'
549
+ end
574
550
  end
575
551
  end
576
552
 
577
553
  def test_long_extendee_matches_supersets
578
- assert_extends '.foo.bar.bap', '.baz {@extend .foo.bar}', '.foo.bar.bap, .bap.baz'
554
+ silence_warnings {assert_extends '.foo.bar.bap', '.baz {@extend .foo.bar}', '.foo.bar.bap, .bap.baz'}
579
555
  end
580
556
 
581
557
  def test_long_extendee_runs_unification
582
- assert_extends 'ns|*.foo.bar', 'a.baz {@extend .foo.bar}', 'ns|*.foo.bar, ns|a.baz'
558
+ silence_warnings {assert_extends 'ns|*.foo.bar', '*|a.baz {@extend .foo.bar}', 'ns|*.foo.bar, ns|a.baz'}
583
559
  end
584
560
 
585
561
  ## Long Extenders
@@ -589,17 +565,12 @@ SCSS
589
565
  end
590
566
 
591
567
  def test_long_extender_runs_unification
592
- assert_extends 'ns|*.foo.bar', 'a.baz {@extend .foo}', 'ns|*.foo.bar, ns|a.bar.baz'
568
+ assert_extends 'ns|*.foo.bar', '*|a.baz {@extend .foo}', 'ns|*.foo.bar, ns|a.bar.baz'
593
569
  end
594
570
 
595
- def test_long_extender_aborts_unification
596
- assert_extend_doesnt_match('h1.baz', '.foo', :failed_to_unify, 2) do
597
- render_extends 'a.foo#bar', 'h1.baz {@extend .foo}'
598
- end
599
-
600
- assert_extend_doesnt_match('.bang#baz', '.foo', :failed_to_unify, 2) do
601
- render_extends 'a.foo#bar', '.bang#baz {@extend .foo}'
602
- end
571
+ def test_long_extender_doesnt_unify
572
+ assert_extends 'a.foo#bar', 'h1.baz {@extend .foo}', 'a.foo#bar'
573
+ assert_extends 'a.foo#bar', '.bang#baz {@extend .foo}', 'a.foo#bar'
603
574
  end
604
575
 
605
576
  ## Nested Extenders
@@ -612,10 +583,8 @@ SCSS
612
583
  assert_extends '.foo.bar', 'foo bar {@extend .foo}', '.foo.bar, foo bar.bar'
613
584
  end
614
585
 
615
- def test_nested_extender_aborts_unification
616
- assert_extend_doesnt_match('foo bar', '.foo', :failed_to_unify, 2) do
617
- render_extends 'baz.foo', 'foo bar {@extend .foo}'
618
- end
586
+ def test_nested_extender_doesnt_unify
587
+ assert_extends 'baz.foo', 'foo bar {@extend .foo}', 'baz.foo'
619
588
  end
620
589
 
621
590
  def test_nested_extender_alternates_parents
@@ -675,9 +644,9 @@ SCSS
675
644
  end
676
645
 
677
646
  def test_nested_extender_doesnt_find_common_selectors_around_reference_selector
678
- assert_extends 'a /for/ b c .c1', 'a c .c2 {@extend .c1}', 'a /for/ b c .c1, a /for/ b a c .c2, a a /for/ b c .c2'
679
- assert_extends 'a /for/ b c .c1', 'a b .c2 {@extend .c1}', 'a /for/ b c .c1, a a /for/ b c .c2'
680
- assert_extends 'a /for/ b c .c1', 'b c .c2 {@extend .c1}', 'a /for/ b c .c1, a /for/ b c .c2'
647
+ silence_warnings {assert_extends 'a /for/ b c .c1', 'a c .c2 {@extend .c1}', 'a /for/ b c .c1, a /for/ b a c .c2, a a /for/ b c .c2'}
648
+ silence_warnings {assert_extends 'a /for/ b c .c1', 'a b .c2 {@extend .c1}', 'a /for/ b c .c1, a a /for/ b c .c2'}
649
+ silence_warnings {assert_extends 'a /for/ b c .c1', 'b c .c2 {@extend .c1}', 'a /for/ b c .c1, a /for/ b c .c2'}
681
650
  end
682
651
 
683
652
  def test_nested_extender_with_early_child_selectors_doesnt_subseq_them
@@ -1043,13 +1012,14 @@ SCSS
1043
1012
  end
1044
1013
 
1045
1014
  def test_placeholder_selector_as_modifier
1046
- assert_extend_doesnt_match('div', '%foo', :failed_to_unify, 3) do
1047
- render(<<SCSS)
1015
+ assert_equal <<CSS, render(<<SCSS)
1016
+ a.baz.bar {
1017
+ color: blue; }
1018
+ CSS
1048
1019
  a%foo.baz {color: blue}
1049
1020
  .bar {@extend %foo}
1050
1021
  div {@extend %foo}
1051
1022
  SCSS
1052
- end
1053
1023
  end
1054
1024
 
1055
1025
  def test_placeholder_interpolation
@@ -1317,17 +1287,6 @@ ERR
1317
1287
  SCSS
1318
1288
  end
1319
1289
 
1320
- def test_extend_warns_when_extension_fails
1321
- assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
1322
- "b.foo" failed to @extend ".bar".
1323
- No selectors matching ".bar" could be unified with "b.foo".
1324
- Use "@extend .bar !optional" if the extend should be able to fail.
1325
- ERR
1326
- a.bar {a: b}
1327
- b.foo {@extend .bar}
1328
- SCSS
1329
- end
1330
-
1331
1290
  def test_extend_succeeds_when_one_extension_fails_but_others_dont
1332
1291
  assert_equal(<<CSS, render(<<SCSS))
1333
1292
  a.bar {