sass 3.4.0 → 3.4.25

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 (142) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +3 -1
  3. data/CODE_OF_CONDUCT.md +10 -0
  4. data/CONTRIBUTING.md +148 -0
  5. data/MIT-LICENSE +1 -1
  6. data/README.md +26 -20
  7. data/Rakefile +103 -20
  8. data/VERSION +1 -1
  9. data/VERSION_DATE +1 -1
  10. data/extra/sass-spec-ref.sh +32 -0
  11. data/extra/update_watch.rb +1 -1
  12. data/lib/sass/cache_stores/filesystem.rb +7 -7
  13. data/lib/sass/cache_stores/memory.rb +4 -5
  14. data/lib/sass/callbacks.rb +2 -2
  15. data/lib/sass/css.rb +11 -10
  16. data/lib/sass/deprecation.rb +55 -0
  17. data/lib/sass/engine.rb +83 -38
  18. data/lib/sass/environment.rb +26 -2
  19. data/lib/sass/error.rb +12 -12
  20. data/lib/sass/exec/base.rb +15 -3
  21. data/lib/sass/exec/sass_convert.rb +34 -15
  22. data/lib/sass/exec/sass_scss.rb +23 -7
  23. data/lib/sass/features.rb +2 -2
  24. data/lib/sass/importers/base.rb +1 -1
  25. data/lib/sass/importers/deprecated_path.rb +51 -0
  26. data/lib/sass/importers/filesystem.rb +24 -16
  27. data/lib/sass/importers.rb +1 -0
  28. data/lib/sass/logger/base.rb +8 -2
  29. data/lib/sass/logger/delayed.rb +50 -0
  30. data/lib/sass/logger.rb +8 -3
  31. data/lib/sass/plugin/compiler.rb +42 -25
  32. data/lib/sass/plugin/configuration.rb +38 -22
  33. data/lib/sass/plugin/merb.rb +2 -2
  34. data/lib/sass/plugin/rack.rb +3 -3
  35. data/lib/sass/plugin/rails.rb +1 -1
  36. data/lib/sass/plugin/staleness_checker.rb +3 -3
  37. data/lib/sass/plugin.rb +3 -2
  38. data/lib/sass/script/css_parser.rb +2 -3
  39. data/lib/sass/script/css_variable_warning.rb +52 -0
  40. data/lib/sass/script/functions.rb +140 -73
  41. data/lib/sass/script/lexer.rb +37 -22
  42. data/lib/sass/script/parser.rb +235 -40
  43. data/lib/sass/script/tree/funcall.rb +12 -5
  44. data/lib/sass/script/tree/interpolation.rb +109 -4
  45. data/lib/sass/script/tree/list_literal.rb +31 -4
  46. data/lib/sass/script/tree/literal.rb +4 -0
  47. data/lib/sass/script/tree/node.rb +21 -3
  48. data/lib/sass/script/tree/operation.rb +54 -1
  49. data/lib/sass/script/tree/string_interpolation.rb +58 -37
  50. data/lib/sass/script/tree/variable.rb +1 -1
  51. data/lib/sass/script/value/base.rb +10 -9
  52. data/lib/sass/script/value/color.rb +42 -24
  53. data/lib/sass/script/value/helpers.rb +16 -6
  54. data/lib/sass/script/value/map.rb +1 -1
  55. data/lib/sass/script/value/number.rb +52 -19
  56. data/lib/sass/script/value/string.rb +46 -5
  57. data/lib/sass/script.rb +3 -3
  58. data/lib/sass/scss/css_parser.rb +16 -2
  59. data/lib/sass/scss/parser.rb +120 -75
  60. data/lib/sass/scss/rx.rb +9 -10
  61. data/lib/sass/scss/static_parser.rb +19 -14
  62. data/lib/sass/scss.rb +0 -2
  63. data/lib/sass/selector/abstract_sequence.rb +8 -6
  64. data/lib/sass/selector/comma_sequence.rb +25 -9
  65. data/lib/sass/selector/pseudo.rb +45 -35
  66. data/lib/sass/selector/sequence.rb +54 -18
  67. data/lib/sass/selector/simple.rb +11 -11
  68. data/lib/sass/selector/simple_sequence.rb +34 -15
  69. data/lib/sass/selector.rb +7 -10
  70. data/lib/sass/shared.rb +1 -1
  71. data/lib/sass/source/map.rb +7 -4
  72. data/lib/sass/source/position.rb +4 -4
  73. data/lib/sass/stack.rb +2 -2
  74. data/lib/sass/supports.rb +8 -10
  75. data/lib/sass/tree/comment_node.rb +1 -1
  76. data/lib/sass/tree/css_import_node.rb +9 -1
  77. data/lib/sass/tree/function_node.rb +8 -3
  78. data/lib/sass/tree/import_node.rb +6 -5
  79. data/lib/sass/tree/node.rb +5 -3
  80. data/lib/sass/tree/prop_node.rb +5 -6
  81. data/lib/sass/tree/rule_node.rb +14 -4
  82. data/lib/sass/tree/visitors/check_nesting.rb +18 -22
  83. data/lib/sass/tree/visitors/convert.rb +43 -26
  84. data/lib/sass/tree/visitors/cssize.rb +5 -1
  85. data/lib/sass/tree/visitors/deep_copy.rb +1 -1
  86. data/lib/sass/tree/visitors/extend.rb +15 -13
  87. data/lib/sass/tree/visitors/perform.rb +42 -17
  88. data/lib/sass/tree/visitors/set_options.rb +1 -1
  89. data/lib/sass/tree/visitors/to_css.rb +58 -30
  90. data/lib/sass/util/multibyte_string_scanner.rb +0 -2
  91. data/lib/sass/util/normalized_map.rb +0 -1
  92. data/lib/sass/util/subset_map.rb +1 -2
  93. data/lib/sass/util.rb +125 -68
  94. data/lib/sass/version.rb +2 -2
  95. data/lib/sass.rb +10 -3
  96. data/test/sass/compiler_test.rb +6 -2
  97. data/test/sass/conversion_test.rb +187 -53
  98. data/test/sass/css2sass_test.rb +50 -1
  99. data/test/sass/css_variable_test.rb +132 -0
  100. data/test/sass/engine_test.rb +207 -61
  101. data/test/sass/exec_test.rb +10 -0
  102. data/test/sass/extend_test.rb +101 -29
  103. data/test/sass/functions_test.rb +60 -9
  104. data/test/sass/importer_test.rb +9 -0
  105. data/test/sass/more_templates/more1.sass +10 -10
  106. data/test/sass/more_templates/more_import.sass +2 -2
  107. data/test/sass/plugin_test.rb +10 -8
  108. data/test/sass/results/script.css +3 -3
  109. data/test/sass/script_conversion_test.rb +58 -29
  110. data/test/sass/script_test.rb +430 -53
  111. data/test/sass/scss/css_test.rb +73 -7
  112. data/test/sass/scss/rx_test.rb +4 -0
  113. data/test/sass/scss/scss_test.rb +309 -4
  114. data/test/sass/source_map_test.rb +152 -74
  115. data/test/sass/superselector_test.rb +19 -0
  116. data/test/sass/templates/_partial.sass +1 -1
  117. data/test/sass/templates/basic.sass +10 -10
  118. data/test/sass/templates/bork1.sass +1 -1
  119. data/test/sass/templates/bork5.sass +1 -1
  120. data/test/sass/templates/compact.sass +10 -10
  121. data/test/sass/templates/complex.sass +187 -187
  122. data/test/sass/templates/compressed.sass +10 -10
  123. data/test/sass/templates/expanded.sass +10 -10
  124. data/test/sass/templates/import.sass +2 -2
  125. data/test/sass/templates/importee.sass +3 -3
  126. data/test/sass/templates/mixins.sass +22 -22
  127. data/test/sass/templates/multiline.sass +4 -4
  128. data/test/sass/templates/nested.sass +13 -13
  129. data/test/sass/templates/parent_ref.sass +12 -12
  130. data/test/sass/templates/script.sass +70 -70
  131. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +1 -1
  132. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +2 -2
  133. data/test/sass/templates/subdir/subdir.sass +3 -3
  134. data/test/sass/templates/units.sass +10 -10
  135. data/test/sass/util/multibyte_string_scanner_test.rb +10 -2
  136. data/test/sass/util_test.rb +15 -44
  137. data/test/sass-spec.yml +3 -0
  138. data/test/test_helper.rb +5 -4
  139. metadata +302 -295
  140. data/CONTRIBUTING +0 -3
  141. data/lib/sass/scss/script_lexer.rb +0 -15
  142. data/lib/sass/scss/script_parser.rb +0 -25
@@ -28,7 +28,7 @@ a {
28
28
  CSS
29
29
  {
30
30
  "version": 3,
31
- "mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;;EAER,SAAS,EAAE,IAAI",
31
+ "mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;EACV,kBAAkB;EAChB,SAAS,EAAE,IAAI",
32
32
  "sources": ["test_simple_mapping_scss_inline.scss"],
33
33
  "names": [],
34
34
  "file": "test.css"
@@ -37,7 +37,7 @@ JSON
37
37
  end
38
38
 
39
39
  def test_simple_mapping_sass
40
- assert_parses_with_sourcemap <<SASS, <<CSS, <<JSON, :syntax => :sass
40
+ silence_warnings {assert_parses_with_sourcemap <<SASS, <<CSS, <<JSON, :syntax => :sass}
41
41
  a
42
42
  foo: bar
43
43
  /* SOME COMMENT */
@@ -78,7 +78,7 @@ a {
78
78
  CSS
79
79
  {
80
80
  "version": 3,
81
- "mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;;EAER,SAAS,EAAE,IAAI",
81
+ "mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;EACV,kBAAkB;EAChB,SAAS,EAAE,IAAI",
82
82
  "sources": ["#{uri}"],
83
83
  "names": [],
84
84
  "file": "test.css"
@@ -104,7 +104,7 @@ a {
104
104
  CSS
105
105
  {
106
106
  "version": 3,
107
- "mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;;EAER,SAAS,EAAE,IAAI",
107
+ "mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;EACV,kBAAkB;EAChB,SAAS,EAAE,IAAI",
108
108
  "sources": ["../scss/style.scss"],
109
109
  "names": [],
110
110
  "file": "style.css"
@@ -114,7 +114,7 @@ JSON
114
114
 
115
115
  def test_mapping_with_directory_sass
116
116
  options = {:filename => "sass/style.sass", :output => "css/style.css", :syntax => :sass}
117
- assert_parses_with_sourcemap <<SASS, <<CSS, <<JSON, options
117
+ silence_warnings {assert_parses_with_sourcemap <<SASS, <<CSS, <<JSON, options}
118
118
  a
119
119
  foo: bar
120
120
  /* SOME COMMENT */
@@ -350,44 +350,42 @@ CSS
350
350
  $width: 2px;
351
351
  $translucent-red: rgba(255, 0, 0, 0.5);
352
352
  {{1}}a {{/1}}{
353
- {{8}}.special {{/8}}{
354
- {{9}}color{{/9}}: {{10}}red{{/10}};
355
- {{11}}&:hover {{/11}}{
356
- {{12}}foo{{/12}}: {{13}}bar{{/13}};
357
- {{14}}cursor{{/14}}: {{15}}e + -resize{{/15}};
358
- {{16}}color{{/16}}: {{17}}opacify($translucent-red, 0.3){{/17}};
353
+ {{9}}.special {{/9}}{
354
+ {{10}}color{{/10}}: {{11}}red{{/11}};
355
+ {{12}}&:hover {{/12}}{
356
+ {{13}}foo{{/13}}: {{14}}bar{{/14}};
357
+ {{15}}cursor{{/15}}: {{16}}e + -resize{{/16}};
358
+ {{17}}color{{/17}}: {{18}}opacify($translucent-red, 0.3){{/18}};
359
359
  }
360
- {{18}}&:after {{/18}}{
361
- {{19}}content{{/19}}: {{20}}"I ate #{5 + 10} pies #{$width} thick!"{{/20}};
360
+ {{19}}&:after {{/19}}{
361
+ {{20}}content{{/20}}: {{21}}"I ate #{5 + 10} pies #{$width} thick!"{{/21}};
362
362
  }
363
363
  }
364
- {{21}}&:active {{/21}}{
365
- {{22}}color{{/22}}: {{23}}#010203 + #040506{{/23}};
366
- {{24}}border{{/24}}: {{25}}$width solid black{{/25}};
364
+ {{22}}&:active {{/22}}{
365
+ {{23}}border{{/23}}: {{24}}$width solid black{{/24}};
367
366
  }
368
- /* SOME COMMENT */
369
- {{2}}font{{/2}}: {{3}}2px/3px {{/3}}{
370
- {{4}}family{{/4}}: {{5}}fantasy{{/5}};
371
- {{6}}size{{/6}}: {{7}}1em + (2em * 3){{/7}};
367
+ {{2}}/* SOME COMMENT */{{/2}}
368
+ {{3}}font{{/3}}: {{4}}2px/3px {{/4}}{
369
+ {{5}}family{{/5}}: {{6}}fantasy{{/6}};
370
+ {{7}}size{{/7}}: {{8}}1em + (2em * 3){{/8}};
372
371
  }
373
372
  }
374
373
  SCSS
375
374
  {{1}}a{{/1}} {
376
- /* SOME COMMENT */
377
- {{2}}font{{/2}}: {{3}}2px/3px{{/3}};
378
- {{4}}font-family{{/4}}: {{5}}fantasy{{/5}};
379
- {{6}}font-size{{/6}}: {{7}}7em{{/7}}; }
380
- {{8}}a .special{{/8}} {
381
- {{9}}color{{/9}}: {{10}}red{{/10}}; }
382
- {{11}}a .special:hover{{/11}} {
383
- {{12}}foo{{/12}}: {{13}}bar{{/13}};
384
- {{14}}cursor{{/14}}: {{15}}e-resize{{/15}};
385
- {{16}}color{{/16}}: {{17}}rgba(255, 0, 0, 0.8){{/17}}; }
386
- {{18}}a .special:after{{/18}} {
387
- {{19}}content{{/19}}: {{20}}"I ate 15 pies 2px thick!"{{/20}}; }
388
- {{21}}a:active{{/21}} {
389
- {{22}}color{{/22}}: {{23}}#050709{{/23}};
390
- {{24}}border{{/24}}: {{25}}2px solid black{{/25}}; }
375
+ {{2}}/* SOME COMMENT */{{/2}}
376
+ {{3}}font{{/3}}: {{4}}2px/3px{{/4}};
377
+ {{5}}font-family{{/5}}: {{6}}fantasy{{/6}};
378
+ {{7}}font-size{{/7}}: {{8}}7em{{/8}}; }
379
+ {{9}}a .special{{/9}} {
380
+ {{10}}color{{/10}}: {{11}}red{{/11}}; }
381
+ {{12}}a .special:hover{{/12}} {
382
+ {{13}}foo{{/13}}: {{14}}bar{{/14}};
383
+ {{15}}cursor{{/15}}: {{16}}e-resize{{/16}};
384
+ {{17}}color{{/17}}: {{18}}rgba(255, 0, 0, 0.8){{/18}}; }
385
+ {{19}}a .special:after{{/19}} {
386
+ {{20}}content{{/20}}: {{21}}"I ate 15 pies 2px thick!"{{/21}}; }
387
+ {{22}}a:active{{/22}} {
388
+ {{23}}border{{/23}}: {{24}}2px solid black{{/24}}; }
391
389
 
392
390
  /*# sourceMappingURL=test.css.map */
393
391
  CSS
@@ -398,39 +396,37 @@ CSS
398
396
  $width: 2px
399
397
  $translucent-red: rgba(255, 0, 0, 0.5)
400
398
  {{1}}a{{/1}}
401
- {{8}}.special{{/8}}
402
- {{9}}color{{/9}}: {{10}}red{{/10}}
403
- {{11}}&:hover{{/11}}
404
- {{12}}foo{{/12}}: {{13}}bar{{/13}}
405
- {{14}}cursor{{/14}}: {{15}}e + -resize{{/15}}
406
- {{16}}color{{/16}}: {{17}}opacify($translucent-red, 0.3){{/17}}
407
- {{18}}&:after{{/18}}
408
- {{19}}content{{/19}}: {{20}}"I ate #{5 + 10} pies #{$width} thick!"{{/20}}
409
- {{21}}&:active{{/21}}
410
- {{22}}color{{/22}}: {{23}}#010203 + #040506{{/23}}
411
- {{24}}border{{/24}}: {{25}}$width solid black{{/25}}
412
-
413
- /* SOME COMMENT */
414
- {{2}}font{{/2}}: {{3}}2px/3px{{/3}}
415
- {{4}}family{{/4}}: {{5}}fantasy{{/5}}
416
- {{6}}size{{/6}}: {{7}}1em + (2em * 3){{/7}}
399
+ {{9}}.special{{/9}}
400
+ {{10}}color{{/10}}: {{11}}red{{/11}}
401
+ {{12}}&:hover{{/12}}
402
+ {{13}}foo{{/13}}: {{14}}bar{{/14}}
403
+ {{15}}cursor{{/15}}: {{16}}e + -resize{{/16}}
404
+ {{17}}color{{/17}}: {{18}}opacify($translucent-red, 0.3){{/18}}
405
+ {{19}}&:after{{/19}}
406
+ {{20}}content{{/20}}: {{21}}"I ate #{5 + 10} pies #{$width} thick!"{{/21}}
407
+ {{22}}&:active{{/22}}
408
+ {{23}}border{{/23}}: {{24}}$width solid black{{/24}}
409
+
410
+ {{2}}/* SOME COMMENT */{{/2}}
411
+ {{3}}font{{/3}}: {{4}}2px/3px{{/4}}
412
+ {{5}}family{{/5}}: {{6}}fantasy{{/6}}
413
+ {{7}}size{{/7}}: {{8}}1em + (2em * 3){{/8}}
417
414
  SASS
418
415
  {{1}}a{{/1}} {
419
- /* SOME COMMENT */
420
- {{2}}font{{/2}}: {{3}}2px/3px{{/3}};
421
- {{4}}font-family{{/4}}: {{5}}fantasy{{/5}};
422
- {{6}}font-size{{/6}}: {{7}}7em{{/7}}; }
423
- {{8}}a .special{{/8}} {
424
- {{9}}color{{/9}}: {{10}}red{{/10}}; }
425
- {{11}}a .special:hover{{/11}} {
426
- {{12}}foo{{/12}}: {{13}}bar{{/13}};
427
- {{14}}cursor{{/14}}: {{15}}e-resize{{/15}};
428
- {{16}}color{{/16}}: {{17}}rgba(255, 0, 0, 0.8){{/17}}; }
429
- {{18}}a .special:after{{/18}} {
430
- {{19}}content{{/19}}: {{20}}"I ate 15 pies 2px thick!"{{/20}}; }
431
- {{21}}a:active{{/21}} {
432
- {{22}}color{{/22}}: {{23}}#050709{{/23}};
433
- {{24}}border{{/24}}: {{25}}2px solid black{{/25}}; }
416
+ {{2}}/* SOME COMMENT */{{/2}}
417
+ {{3}}font{{/3}}: {{4}}2px/3px{{/4}};
418
+ {{5}}font-family{{/5}}: {{6}}fantasy{{/6}};
419
+ {{7}}font-size{{/7}}: {{8}}7em{{/8}}; }
420
+ {{9}}a .special{{/9}} {
421
+ {{10}}color{{/10}}: {{11}}red{{/11}}; }
422
+ {{12}}a .special:hover{{/12}} {
423
+ {{13}}foo{{/13}}: {{14}}bar{{/14}};
424
+ {{15}}cursor{{/15}}: {{16}}e-resize{{/16}};
425
+ {{17}}color{{/17}}: {{18}}rgba(255, 0, 0, 0.8){{/18}}; }
426
+ {{19}}a .special:after{{/19}} {
427
+ {{20}}content{{/20}}: {{21}}"I ate 15 pies 2px thick!"{{/21}}; }
428
+ {{22}}a:active{{/22}} {
429
+ {{23}}border{{/23}}: {{24}}2px solid black{{/24}}; }
434
430
 
435
431
  /*# sourceMappingURL=test.css.map */
436
432
  CSS
@@ -667,7 +663,7 @@ CSS
667
663
  end
668
664
 
669
665
  def test_mixin_sourcemap_sass
670
- assert_parses_with_mapping <<'SASS', <<'CSS', :syntax => :sass
666
+ silence_warnings {assert_parses_with_mapping <<'SASS', <<'CSS', :syntax => :sass}
671
667
  =large-text
672
668
  :font
673
669
  {{2}}size{{/2}}: {{3}}20px{{/3}}
@@ -761,7 +757,7 @@ CSS
761
757
  # Regression tests
762
758
 
763
759
  def test_properties_sass
764
- assert_parses_with_mapping <<SASS, <<CSS, :syntax => :sass
760
+ silence_warnings {assert_parses_with_mapping <<SASS, <<CSS, :syntax => :sass}
765
761
  {{1}}.foo{{/1}}
766
762
  :{{2}}name{{/2}} {{3}}value{{/3}}
767
763
  {{4}}name{{/4}}: {{5}}value{{/5}}
@@ -801,12 +797,23 @@ SCSS
801
797
  interpolated = engine.to_tree.children.
802
798
  first.children.
803
799
  first.value.children[1]
804
- assert_equal interpolated.to_sass, "\#{123}"
800
+ assert_equal "123", interpolated.to_sass
805
801
  range = interpolated.source_range
806
802
  assert_equal 3, range.start_pos.line
807
- assert_equal 12, range.start_pos.offset
803
+ assert_equal 14, range.start_pos.offset
808
804
  assert_equal 3, range.end_pos.line
809
- assert_equal 18, range.end_pos.offset
805
+ assert_equal 17, range.end_pos.offset
806
+ end
807
+
808
+ def test_list_source_range
809
+ engine = Sass::Engine.new(<<-SCSS, :cache => false, :syntax => :scss)
810
+ @each $a, $b in (1, 2), (2, 4), (3, 6) { }
811
+ SCSS
812
+ list = engine.to_tree.children.first.list
813
+ assert_equal 1, list.source_range.start_pos.line
814
+ assert_equal 1, list.source_range.end_pos.line
815
+ assert_equal 16, list.source_range.start_pos.offset
816
+ assert_equal 38, list.source_range.end_pos.offset
810
817
  end
811
818
 
812
819
  def test_sources_array_is_uri_escaped
@@ -835,6 +842,72 @@ SCSS
835
842
  JSON
836
843
  end
837
844
 
845
+ def test_scss_comment_source_range
846
+ assert_parses_with_mapping <<SCSS, <<CSS, :syntax => :scss
847
+ $var: val; {{1}}/* text */{{/1}}
848
+
849
+ {{2}}/* multiline
850
+ comment */{{/2}}
851
+ SCSS
852
+ {{1}}/* text */{{/1}}
853
+ {{2}}/* multiline
854
+ comment */{{/2}}
855
+
856
+ /*# sourceMappingURL=test.css.map */
857
+ CSS
858
+ end
859
+
860
+ def test_sass_comment_source_range
861
+ assert_parses_with_mapping <<SASS, <<CSS, :syntax => :sass
862
+ {{1}}body{{/1}}
863
+ {{2}}/* text */{{/2}}
864
+
865
+ {{3}}/* multiline
866
+ comment */{{/3}}
867
+ SASS
868
+ {{1}}body{{/1}} {
869
+ {{2}}/* text */{{/2}} }
870
+
871
+ {{3}}/* multiline
872
+ * comment */{{/3}}
873
+
874
+ /*# sourceMappingURL=test.css.map */
875
+ CSS
876
+ end
877
+
878
+ def test_scss_comment_interpolation_source_range
879
+ assert_parses_with_mapping <<SCSS, <<CSS, :syntax => :scss
880
+ $var: 2; {{1}}/* two \#{$var} and four \#{2 * $var} */{{/1}}
881
+
882
+ {{2}}/* multiline
883
+ comment \#{ 2 + 2 } and \#{ 2 +
884
+ 2 } */{{/2}}
885
+ SCSS
886
+ {{1}}/* two 2 and four 4 */{{/1}}
887
+ {{2}}/* multiline
888
+ comment 4 and 4 */{{/2}}
889
+
890
+ /*# sourceMappingURL=test.css.map */
891
+ CSS
892
+ end
893
+
894
+ def test_sass_comment_interpolation_source_range
895
+ assert_parses_with_mapping <<SASS, <<CSS, :syntax => :sass
896
+ $var: 2
897
+ {{1}}/* two \#{$var} and four \#{2 * $var} */{{/1}}
898
+
899
+ {{2}}/* multiline
900
+ comment \#{ 2 + 2 } and \#{ 2 +
901
+ 2 } */{{/2}}
902
+ SASS
903
+ {{1}}/* two 2 and four 4 */{{/1}}
904
+ {{2}}/* multiline
905
+ * comment 4 and 4 */{{/2}}
906
+
907
+ /*# sourceMappingURL=test.css.map */
908
+ CSS
909
+ end
910
+
838
911
  private
839
912
 
840
913
  ANNOTATION_REGEX = /\{\{(\/?)([^}]+)\}\}/
@@ -870,11 +943,12 @@ JSON
870
943
  source_ranges = build_ranges(source, source_file_name)
871
944
  target_ranges = build_ranges(css)
872
945
  map = Sass::Source::Map.new
873
- Sass::Util.flatten(source_ranges.map do |(name, sources)|
946
+ source_ranges.map do |(name, sources)|
874
947
  assert(sources.length == 1, "#{sources.length} source ranges encountered for annotation #{name}")
875
948
  assert(target_ranges[name], "No target ranges for annotation #{name}")
876
949
  target_ranges[name].map {|target_range| [sources.first, target_range]}
877
- end, 1).
950
+ end.
951
+ flatten(1).
878
952
  sort_by {|(_, target)| [target.start_pos.line, target.start_pos.offset]}.
879
953
  each {|(s2, target)| map.add(s2, target)}
880
954
  map
@@ -910,7 +984,11 @@ JSON
910
984
  def assert_ranges_equal(expected, actual, lines, prefix)
911
985
  assert_positions_equal(expected.start_pos, actual.start_pos, lines, prefix + " start position")
912
986
  assert_positions_equal(expected.end_pos, actual.end_pos, lines, prefix + " end position")
913
- assert_equal(expected.file, actual.file)
987
+ if expected.file.nil?
988
+ assert_nil(actual.file)
989
+ else
990
+ assert_equal(expected.file, actual.file)
991
+ end
914
992
  end
915
993
 
916
994
  def assert_sourcemaps_equal(source, css, expected, actual)
@@ -55,6 +55,25 @@ class SuperselectorTest < MiniTest::Test
55
55
  def test_descendant_is_superselector_of_child
56
56
  assert_strict_superselector '.foo .bar', '.foo > .bar.baz'
57
57
  assert_strict_superselector '.foo .bar', '.foo.baz > .bar'
58
+ assert_strict_superselector '.foo .baz', '.foo > .bar > .baz'
59
+ end
60
+
61
+ def test_child_isnt_superselector_of_longer_child
62
+ refute_superselector '.foo > .baz', '.foo > .bar > .baz'
63
+ refute_superselector '.foo > .baz', '.foo > .bar .baz'
64
+ end
65
+
66
+ def test_following_sibling_isnt_superselector_of_longer_following_sibling
67
+ refute_superselector '.foo + .baz', '.foo + .bar + .baz'
68
+ refute_superselector '.foo + .baz', '.foo + .bar .baz'
69
+ end
70
+
71
+ def test_sibling_isnt_superselector_of_longer_sibling
72
+ # This actually is a superselector, but it's a very narrow edge case and
73
+ # detecting it is very difficult and may be exponential in the worst case.
74
+ refute_superselector '.foo ~ .baz', '.foo ~ .bar ~ .baz'
75
+
76
+ refute_superselector '.foo ~ .baz', '.foo ~ .bar .baz'
58
77
  end
59
78
 
60
79
  def test_matches_is_superselector_of_constituent_selectors
@@ -1,2 +1,2 @@
1
1
  #foo
2
- :background-color #baf
2
+ background-color: #baf
@@ -1,23 +1,23 @@
1
1
 
2
2
 
3
3
  body
4
- :font Arial
5
- :background blue
4
+ font: Arial
5
+ background: blue
6
6
 
7
7
  #page
8
- :width 700px
9
- :height 100
8
+ width: 700px
9
+ height: 100
10
10
  #header
11
- :height 300px
11
+ height: 300px
12
12
  h1
13
- :font-size 50px
14
- :color blue
13
+ font-size: 50px
14
+ color: blue
15
15
 
16
16
  #content.user.show
17
17
  #container.top
18
18
  #column.left
19
- :width 100px
19
+ width: 100px
20
20
  #column.right
21
- :width 600px
21
+ width: 600px
22
22
  #container.bottom
23
- :background brown
23
+ background: brown
@@ -1,2 +1,2 @@
1
1
  bork
2
- :bork $bork
2
+ bork: $bork
@@ -1,3 +1,3 @@
1
1
  bork
2
2
  /* foo */
3
- :bork $bork
3
+ bork: $bork
@@ -1,17 +1,17 @@
1
1
  #main
2
- :width 15em
3
- :color #0000ff
2
+ width: 15em
3
+ color: #0000ff
4
4
  p
5
- :border
6
- :style dotted
5
+ border:
6
+ style: dotted
7
7
  /* Nested comment
8
8
  More nested stuff
9
- :width 2px
9
+ width: 2px
10
10
  .cool
11
- :width 100px
11
+ width: 100px
12
12
 
13
13
  #left
14
- :font
15
- :size 2em
16
- :weight bold
17
- :float left
14
+ font:
15
+ size: 2em
16
+ weight: bold
17
+ float: left