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.
- checksums.yaml +4 -4
- data/.yardopts +3 -1
- data/CODE_OF_CONDUCT.md +10 -0
- data/CONTRIBUTING.md +148 -0
- data/MIT-LICENSE +1 -1
- data/README.md +26 -20
- data/Rakefile +103 -20
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/extra/sass-spec-ref.sh +32 -0
- data/extra/update_watch.rb +1 -1
- data/lib/sass/cache_stores/filesystem.rb +7 -7
- data/lib/sass/cache_stores/memory.rb +4 -5
- data/lib/sass/callbacks.rb +2 -2
- data/lib/sass/css.rb +11 -10
- data/lib/sass/deprecation.rb +55 -0
- data/lib/sass/engine.rb +83 -38
- data/lib/sass/environment.rb +26 -2
- data/lib/sass/error.rb +12 -12
- data/lib/sass/exec/base.rb +15 -3
- data/lib/sass/exec/sass_convert.rb +34 -15
- data/lib/sass/exec/sass_scss.rb +23 -7
- data/lib/sass/features.rb +2 -2
- data/lib/sass/importers/base.rb +1 -1
- data/lib/sass/importers/deprecated_path.rb +51 -0
- data/lib/sass/importers/filesystem.rb +24 -16
- data/lib/sass/importers.rb +1 -0
- data/lib/sass/logger/base.rb +8 -2
- data/lib/sass/logger/delayed.rb +50 -0
- data/lib/sass/logger.rb +8 -3
- data/lib/sass/plugin/compiler.rb +42 -25
- data/lib/sass/plugin/configuration.rb +38 -22
- data/lib/sass/plugin/merb.rb +2 -2
- data/lib/sass/plugin/rack.rb +3 -3
- data/lib/sass/plugin/rails.rb +1 -1
- data/lib/sass/plugin/staleness_checker.rb +3 -3
- data/lib/sass/plugin.rb +3 -2
- data/lib/sass/script/css_parser.rb +2 -3
- data/lib/sass/script/css_variable_warning.rb +52 -0
- data/lib/sass/script/functions.rb +140 -73
- data/lib/sass/script/lexer.rb +37 -22
- data/lib/sass/script/parser.rb +235 -40
- data/lib/sass/script/tree/funcall.rb +12 -5
- data/lib/sass/script/tree/interpolation.rb +109 -4
- data/lib/sass/script/tree/list_literal.rb +31 -4
- data/lib/sass/script/tree/literal.rb +4 -0
- data/lib/sass/script/tree/node.rb +21 -3
- data/lib/sass/script/tree/operation.rb +54 -1
- data/lib/sass/script/tree/string_interpolation.rb +58 -37
- data/lib/sass/script/tree/variable.rb +1 -1
- data/lib/sass/script/value/base.rb +10 -9
- data/lib/sass/script/value/color.rb +42 -24
- data/lib/sass/script/value/helpers.rb +16 -6
- data/lib/sass/script/value/map.rb +1 -1
- data/lib/sass/script/value/number.rb +52 -19
- data/lib/sass/script/value/string.rb +46 -5
- data/lib/sass/script.rb +3 -3
- data/lib/sass/scss/css_parser.rb +16 -2
- data/lib/sass/scss/parser.rb +120 -75
- data/lib/sass/scss/rx.rb +9 -10
- data/lib/sass/scss/static_parser.rb +19 -14
- data/lib/sass/scss.rb +0 -2
- data/lib/sass/selector/abstract_sequence.rb +8 -6
- data/lib/sass/selector/comma_sequence.rb +25 -9
- data/lib/sass/selector/pseudo.rb +45 -35
- data/lib/sass/selector/sequence.rb +54 -18
- data/lib/sass/selector/simple.rb +11 -11
- data/lib/sass/selector/simple_sequence.rb +34 -15
- data/lib/sass/selector.rb +7 -10
- data/lib/sass/shared.rb +1 -1
- data/lib/sass/source/map.rb +7 -4
- data/lib/sass/source/position.rb +4 -4
- data/lib/sass/stack.rb +2 -2
- data/lib/sass/supports.rb +8 -10
- data/lib/sass/tree/comment_node.rb +1 -1
- data/lib/sass/tree/css_import_node.rb +9 -1
- data/lib/sass/tree/function_node.rb +8 -3
- data/lib/sass/tree/import_node.rb +6 -5
- data/lib/sass/tree/node.rb +5 -3
- data/lib/sass/tree/prop_node.rb +5 -6
- data/lib/sass/tree/rule_node.rb +14 -4
- data/lib/sass/tree/visitors/check_nesting.rb +18 -22
- data/lib/sass/tree/visitors/convert.rb +43 -26
- data/lib/sass/tree/visitors/cssize.rb +5 -1
- data/lib/sass/tree/visitors/deep_copy.rb +1 -1
- data/lib/sass/tree/visitors/extend.rb +15 -13
- data/lib/sass/tree/visitors/perform.rb +42 -17
- data/lib/sass/tree/visitors/set_options.rb +1 -1
- data/lib/sass/tree/visitors/to_css.rb +58 -30
- data/lib/sass/util/multibyte_string_scanner.rb +0 -2
- data/lib/sass/util/normalized_map.rb +0 -1
- data/lib/sass/util/subset_map.rb +1 -2
- data/lib/sass/util.rb +125 -68
- data/lib/sass/version.rb +2 -2
- data/lib/sass.rb +10 -3
- data/test/sass/compiler_test.rb +6 -2
- data/test/sass/conversion_test.rb +187 -53
- data/test/sass/css2sass_test.rb +50 -1
- data/test/sass/css_variable_test.rb +132 -0
- data/test/sass/engine_test.rb +207 -61
- data/test/sass/exec_test.rb +10 -0
- data/test/sass/extend_test.rb +101 -29
- data/test/sass/functions_test.rb +60 -9
- data/test/sass/importer_test.rb +9 -0
- data/test/sass/more_templates/more1.sass +10 -10
- data/test/sass/more_templates/more_import.sass +2 -2
- data/test/sass/plugin_test.rb +10 -8
- data/test/sass/results/script.css +3 -3
- data/test/sass/script_conversion_test.rb +58 -29
- data/test/sass/script_test.rb +430 -53
- data/test/sass/scss/css_test.rb +73 -7
- data/test/sass/scss/rx_test.rb +4 -0
- data/test/sass/scss/scss_test.rb +309 -4
- data/test/sass/source_map_test.rb +152 -74
- data/test/sass/superselector_test.rb +19 -0
- data/test/sass/templates/_partial.sass +1 -1
- data/test/sass/templates/basic.sass +10 -10
- data/test/sass/templates/bork1.sass +1 -1
- data/test/sass/templates/bork5.sass +1 -1
- data/test/sass/templates/compact.sass +10 -10
- data/test/sass/templates/complex.sass +187 -187
- data/test/sass/templates/compressed.sass +10 -10
- data/test/sass/templates/expanded.sass +10 -10
- data/test/sass/templates/import.sass +2 -2
- data/test/sass/templates/importee.sass +3 -3
- data/test/sass/templates/mixins.sass +22 -22
- data/test/sass/templates/multiline.sass +4 -4
- data/test/sass/templates/nested.sass +13 -13
- data/test/sass/templates/parent_ref.sass +12 -12
- data/test/sass/templates/script.sass +70 -70
- data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +1 -1
- data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +2 -2
- data/test/sass/templates/subdir/subdir.sass +3 -3
- data/test/sass/templates/units.sass +10 -10
- data/test/sass/util/multibyte_string_scanner_test.rb +10 -2
- data/test/sass/util_test.rb +15 -44
- data/test/sass-spec.yml +3 -0
- data/test/test_helper.rb +5 -4
- metadata +302 -295
- data/CONTRIBUTING +0 -3
- data/lib/sass/scss/script_lexer.rb +0 -15
- 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
|
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
|
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
|
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
|
-
{{
|
354
|
-
{{
|
355
|
-
{{
|
356
|
-
{{
|
357
|
-
{{
|
358
|
-
{{
|
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
|
-
{{
|
361
|
-
{{
|
360
|
+
{{19}}&:after {{/19}}{
|
361
|
+
{{20}}content{{/20}}: {{21}}"I ate #{5 + 10} pies #{$width} thick!"{{/21}};
|
362
362
|
}
|
363
363
|
}
|
364
|
-
{{
|
365
|
-
{{
|
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
|
-
{{
|
370
|
-
{{
|
371
|
-
{{
|
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
|
-
{{
|
378
|
-
{{
|
379
|
-
{{
|
380
|
-
{{
|
381
|
-
{{
|
382
|
-
{{
|
383
|
-
{{
|
384
|
-
{{
|
385
|
-
{{
|
386
|
-
{{
|
387
|
-
{{
|
388
|
-
{{
|
389
|
-
{{
|
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
|
-
{{
|
402
|
-
{{
|
403
|
-
{{
|
404
|
-
{{
|
405
|
-
{{
|
406
|
-
{{
|
407
|
-
{{
|
408
|
-
{{
|
409
|
-
{{
|
410
|
-
{{
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
{{
|
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
|
-
{{
|
421
|
-
{{
|
422
|
-
{{
|
423
|
-
{{
|
424
|
-
{{
|
425
|
-
{{
|
426
|
-
{{
|
427
|
-
{{
|
428
|
-
{{
|
429
|
-
{{
|
430
|
-
{{
|
431
|
-
{{
|
432
|
-
{{
|
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
|
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
|
803
|
+
assert_equal 14, range.start_pos.offset
|
808
804
|
assert_equal 3, range.end_pos.line
|
809
|
-
assert_equal
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
2
|
+
background-color: #baf
|
@@ -1,23 +1,23 @@
|
|
1
1
|
|
2
2
|
|
3
3
|
body
|
4
|
-
:
|
5
|
-
:
|
4
|
+
font: Arial
|
5
|
+
background: blue
|
6
6
|
|
7
7
|
#page
|
8
|
-
:
|
9
|
-
:
|
8
|
+
width: 700px
|
9
|
+
height: 100
|
10
10
|
#header
|
11
|
-
:
|
11
|
+
height: 300px
|
12
12
|
h1
|
13
|
-
|
14
|
-
:
|
13
|
+
font-size: 50px
|
14
|
+
color: blue
|
15
15
|
|
16
16
|
#content.user.show
|
17
17
|
#container.top
|
18
18
|
#column.left
|
19
|
-
:
|
19
|
+
width: 100px
|
20
20
|
#column.right
|
21
|
-
:
|
21
|
+
width: 600px
|
22
22
|
#container.bottom
|
23
|
-
:
|
23
|
+
background: brown
|
@@ -1,2 +1,2 @@
|
|
1
1
|
bork
|
2
|
-
:
|
2
|
+
bork: $bork
|
@@ -1,17 +1,17 @@
|
|
1
1
|
#main
|
2
|
-
:
|
3
|
-
:
|
2
|
+
width: 15em
|
3
|
+
color: #0000ff
|
4
4
|
p
|
5
|
-
:
|
6
|
-
:
|
5
|
+
border:
|
6
|
+
style: dotted
|
7
7
|
/* Nested comment
|
8
8
|
More nested stuff
|
9
|
-
:
|
9
|
+
width: 2px
|
10
10
|
.cool
|
11
|
-
:
|
11
|
+
width: 100px
|
12
12
|
|
13
13
|
#left
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
14
|
+
font:
|
15
|
+
size: 2em
|
16
|
+
weight: bold
|
17
|
+
float: left
|