sass 3.4.0 → 3.4.25
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/test/sass/engine_test.rb
CHANGED
@@ -78,7 +78,6 @@ MSG
|
|
78
78
|
"& a\n :b c" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 1],
|
79
79
|
"a\n :b\n c" => "Illegal nesting: Only properties may be nested beneath properties.",
|
80
80
|
"$a: b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
|
81
|
-
"$a: b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
|
82
81
|
"@import templates/basic\n foo" => "Illegal nesting: Nothing may be nested beneath import directives.",
|
83
82
|
"foo\n @import foo.css" => "CSS import directives may only be used at the root of a document.",
|
84
83
|
"@if true\n @import foo" => "Import directives may not be used within control directives or mixins.",
|
@@ -178,6 +177,8 @@ MSG
|
|
178
177
|
"& foo\n bar: baz\n blat: bang" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 1],
|
179
178
|
"a\n b: c\n& foo\n bar: baz\n blat: bang" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 3],
|
180
179
|
"@" => "Invalid directive: '@'.",
|
180
|
+
"$r: 20em * #ccc" => ["Cannot multiply a number with units (20em) to a color (#ccc).", 1],
|
181
|
+
"$r: #ccc / 1em" => ["Cannot divide a number with units (1em) to a color (#ccc).", 1],
|
181
182
|
}
|
182
183
|
|
183
184
|
def teardown
|
@@ -287,10 +288,10 @@ ERROR
|
|
287
288
|
def test_exception_line
|
288
289
|
to_render = <<SASS
|
289
290
|
rule
|
290
|
-
:
|
291
|
+
prop: val
|
291
292
|
// comment!
|
292
293
|
|
293
|
-
:
|
294
|
+
broken:
|
294
295
|
SASS
|
295
296
|
begin
|
296
297
|
Sass::Engine.new(to_render).render
|
@@ -304,10 +305,10 @@ SASS
|
|
304
305
|
def test_exception_location
|
305
306
|
to_render = <<SASS
|
306
307
|
rule
|
307
|
-
:
|
308
|
+
prop: val
|
308
309
|
// comment!
|
309
310
|
|
310
|
-
:
|
311
|
+
broken:
|
311
312
|
SASS
|
312
313
|
begin
|
313
314
|
Sass::Engine.new(to_render, :filename => FAKE_FILE_NAME, :line => (__LINE__-7)).render
|
@@ -680,7 +681,6 @@ SASS
|
|
680
681
|
def test_nonexistent_import
|
681
682
|
assert_raise_message(Sass::SyntaxError, <<ERR.rstrip) do
|
682
683
|
File to import not found or unreadable: nonexistent.sass.
|
683
|
-
Load path: #{Dir.pwd}
|
684
684
|
ERR
|
685
685
|
render("@import nonexistent.sass")
|
686
686
|
end
|
@@ -689,7 +689,6 @@ ERR
|
|
689
689
|
def test_nonexistent_extensionless_import
|
690
690
|
assert_raise_message(Sass::SyntaxError, <<ERR.rstrip) do
|
691
691
|
File to import not found or unreadable: nonexistent.
|
692
|
-
Load path: #{Dir.pwd}
|
693
692
|
ERR
|
694
693
|
render("@import nonexistent")
|
695
694
|
end
|
@@ -750,22 +749,22 @@ SASS
|
|
750
749
|
|
751
750
|
def test_basic_multiline_selector
|
752
751
|
assert_equal("#foo #bar,\n#baz #boom {\n foo: bar; }\n",
|
753
|
-
render("#foo #bar,\n#baz #boom\n :
|
752
|
+
render("#foo #bar,\n#baz #boom\n foo: bar"))
|
754
753
|
assert_equal("#foo #bar,\n#foo #baz {\n foo: bar; }\n",
|
755
|
-
render("#foo\n #bar,\n #baz\n :
|
754
|
+
render("#foo\n #bar,\n #baz\n foo: bar"))
|
756
755
|
assert_equal("#foo,\n#bar {\n foo: bar; }\n #foo #baz,\n #bar #baz {\n foo: bar; }\n",
|
757
|
-
render("#foo,\n#bar\n :
|
756
|
+
render("#foo,\n#bar\n foo: bar\n #baz\n foo: bar"))
|
758
757
|
assert_equal("#foo #bar, #baz #boom { foo: bar; }\n",
|
759
|
-
render("#foo #bar,\n#baz #boom\n :
|
758
|
+
render("#foo #bar,\n#baz #boom\n foo: bar", :style => :compact))
|
760
759
|
|
761
760
|
assert_equal("#foo #bar,#baz #boom{foo:bar}\n",
|
762
|
-
render("#foo #bar,\n#baz #boom\n :
|
761
|
+
render("#foo #bar,\n#baz #boom\n foo: bar", :style => :compressed))
|
763
762
|
|
764
763
|
assert_equal("#foo #bar,\n#baz #boom {\n foo: bar; }\n",
|
765
|
-
render("#foo #bar,,\n,#baz #boom,\n :
|
764
|
+
render("#foo #bar,,\n,#baz #boom,\n foo: bar"))
|
766
765
|
|
767
766
|
assert_equal("#bip #bop {\n foo: bar; }\n",
|
768
|
-
render("#bip #bop,, ,\n :
|
767
|
+
render("#bip #bop,, ,\n foo: bar"))
|
769
768
|
end
|
770
769
|
|
771
770
|
def test_complex_multiline_selector
|
@@ -784,7 +783,7 @@ SASS
|
|
784
783
|
end
|
785
784
|
|
786
785
|
begin
|
787
|
-
render("a\n :b c", :property_syntax => :new)
|
786
|
+
silence_warnings {render("a\n :b c", :property_syntax => :new)}
|
788
787
|
assert_equal(2, e.sass_line)
|
789
788
|
rescue Sass::SyntaxError => e
|
790
789
|
assert_equal("Illegal property syntax: can't use old syntax when :property_syntax => :new is set.",
|
@@ -807,53 +806,53 @@ SASS
|
|
807
806
|
def test_directive
|
808
807
|
assert_equal("@a b;\n", render("@a b"))
|
809
808
|
|
810
|
-
assert_equal("@a {\n b: c; }\n", render("@a\n :
|
811
|
-
assert_equal("@a { b: c; }\n", render("@a\n :
|
812
|
-
assert_equal("@a {\n b: c;\n}\n", render("@a\n :
|
813
|
-
assert_equal("@a{b:c}\n", render("@a\n :
|
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))
|
814
813
|
|
815
814
|
assert_equal("@a {\n b: c;\n d: e; }\n",
|
816
|
-
render("@a\n :
|
815
|
+
render("@a\n b: c\n d: e"))
|
817
816
|
assert_equal("@a { b: c; d: e; }\n",
|
818
|
-
render("@a\n :
|
817
|
+
render("@a\n b: c\n d: e", :style => :compact))
|
819
818
|
assert_equal("@a {\n b: c;\n d: e;\n}\n",
|
820
|
-
render("@a\n :
|
819
|
+
render("@a\n b: c\n d: e", :style => :expanded))
|
821
820
|
assert_equal("@a{b:c;d:e}\n",
|
822
|
-
render("@a\n :
|
821
|
+
render("@a\n b: c\n d: e", :style => :compressed))
|
823
822
|
|
824
823
|
assert_equal("@a {\n #b {\n c: d; } }\n",
|
825
|
-
render("@a\n #b\n :
|
824
|
+
render("@a\n #b\n c: d"))
|
826
825
|
assert_equal("@a { #b { c: d; } }\n",
|
827
|
-
render("@a\n #b\n :
|
826
|
+
render("@a\n #b\n c: d", :style => :compact))
|
828
827
|
assert_equal("@a {\n #b {\n c: d;\n }\n}\n",
|
829
|
-
render("@a\n #b\n :
|
828
|
+
render("@a\n #b\n c: d", :style => :expanded))
|
830
829
|
assert_equal("@a{#b{c:d}}\n",
|
831
|
-
render("@a\n #b\n :
|
830
|
+
render("@a\n #b\n c: d", :style => :compressed))
|
832
831
|
|
833
832
|
assert_equal("@a {\n #b {\n a: b; }\n #b #c {\n d: e; } }\n",
|
834
|
-
render("@a\n #b\n :
|
833
|
+
render("@a\n #b\n a: b\n #c\n d: e"))
|
835
834
|
assert_equal("@a { #b { a: b; }\n #b #c { d: e; } }\n",
|
836
|
-
render("@a\n #b\n :
|
835
|
+
render("@a\n #b\n a: b\n #c\n d: e", :style => :compact))
|
837
836
|
assert_equal("@a {\n #b {\n a: b;\n }\n #b #c {\n d: e;\n }\n}\n",
|
838
|
-
render("@a\n #b\n :
|
837
|
+
render("@a\n #b\n a: b\n #c\n d: e", :style => :expanded))
|
839
838
|
assert_equal("@a{#b{a:b}#b #c{d:e}}\n",
|
840
|
-
render("@a\n #b\n :
|
839
|
+
render("@a\n #b\n a: b\n #c\n d: e", :style => :compressed))
|
841
840
|
|
842
841
|
assert_equal("@a {\n #foo,\n #bar {\n b: c; } }\n",
|
843
|
-
render("@a\n #foo, \n #bar\n :
|
842
|
+
render("@a\n #foo, \n #bar\n b: c"))
|
844
843
|
assert_equal("@a { #foo, #bar { b: c; } }\n",
|
845
|
-
render("@a\n #foo, \n #bar\n :
|
844
|
+
render("@a\n #foo, \n #bar\n b: c", :style => :compact))
|
846
845
|
assert_equal("@a {\n #foo,\n #bar {\n b: c;\n }\n}\n",
|
847
|
-
render("@a\n #foo, \n #bar\n :
|
846
|
+
render("@a\n #foo, \n #bar\n b: c", :style => :expanded))
|
848
847
|
assert_equal("@a{#foo,#bar{b:c}}\n",
|
849
|
-
render("@a\n #foo, \n #bar\n :
|
848
|
+
render("@a\n #foo, \n #bar\n b: c", :style => :compressed))
|
850
849
|
|
851
850
|
to_render = <<END
|
852
851
|
@a
|
853
|
-
:
|
852
|
+
b: c
|
854
853
|
#d
|
855
|
-
:
|
856
|
-
:
|
854
|
+
e: f
|
855
|
+
g: h
|
857
856
|
END
|
858
857
|
rendered = <<END
|
859
858
|
@a { b: c;
|
@@ -1142,7 +1141,7 @@ black {
|
|
1142
1141
|
color: #000; }
|
1143
1142
|
CSS
|
1144
1143
|
=foo($a: #FFF)
|
1145
|
-
:
|
1144
|
+
color: $a
|
1146
1145
|
white
|
1147
1146
|
+foo
|
1148
1147
|
black
|
@@ -1166,9 +1165,9 @@ three {
|
|
1166
1165
|
CSS
|
1167
1166
|
$a: 5px
|
1168
1167
|
=foo($a, $b: 1px, $c: 3px + $b)
|
1169
|
-
:
|
1170
|
-
:
|
1171
|
-
:
|
1168
|
+
color: $a
|
1169
|
+
padding: $b
|
1170
|
+
margin: $c
|
1172
1171
|
one
|
1173
1172
|
+foo(#fff)
|
1174
1173
|
two
|
@@ -2059,20 +2058,21 @@ SASS
|
|
2059
2058
|
end
|
2060
2059
|
|
2061
2060
|
def test_warn_with_imports
|
2061
|
+
prefix = Sass::Util.cleanpath(File.dirname(__FILE__)).to_s
|
2062
2062
|
expected_warning = <<WARN
|
2063
2063
|
WARNING: In the main file
|
2064
|
-
on line 1 of #{
|
2064
|
+
on line 1 of #{prefix}/templates/warn.sass
|
2065
2065
|
|
2066
2066
|
WARNING: Imported
|
2067
|
-
on line 1 of #{
|
2068
|
-
from line 2 of #{
|
2067
|
+
on line 1 of #{prefix}/templates/warn_imported.sass
|
2068
|
+
from line 2 of #{prefix}/templates/warn.sass
|
2069
2069
|
|
2070
2070
|
WARNING: In an imported mixin
|
2071
|
-
on line 4 of #{
|
2072
|
-
from line 3 of #{
|
2071
|
+
on line 4 of #{prefix}/templates/warn_imported.sass, in `emits-a-warning'
|
2072
|
+
from line 3 of #{prefix}/templates/warn.sass
|
2073
2073
|
WARN
|
2074
2074
|
assert_warning expected_warning do
|
2075
|
-
renders_correctly "warn", :style => :compact, :load_paths => [
|
2075
|
+
renders_correctly "warn", :style => :compact, :load_paths => ["#{prefix}/templates"]
|
2076
2076
|
end
|
2077
2077
|
end
|
2078
2078
|
|
@@ -2457,6 +2457,18 @@ SASS
|
|
2457
2457
|
|
2458
2458
|
# Regression tests
|
2459
2459
|
|
2460
|
+
def test_interpolation_in_multiline_selector
|
2461
|
+
assert_equal(<<CSS, render(<<SASS))
|
2462
|
+
.foo,
|
2463
|
+
.bar {
|
2464
|
+
a: b; }
|
2465
|
+
CSS
|
2466
|
+
.foo,
|
2467
|
+
\#{".bar"}
|
2468
|
+
a: b
|
2469
|
+
SASS
|
2470
|
+
end
|
2471
|
+
|
2460
2472
|
def test_list_separator_with_arg_list
|
2461
2473
|
assert_equal(<<CSS, render(<<SASS))
|
2462
2474
|
.test {
|
@@ -2586,29 +2598,29 @@ SASS
|
|
2586
2598
|
border-style: solid; }
|
2587
2599
|
RESULT
|
2588
2600
|
.box
|
2589
|
-
:
|
2590
|
-
|
2591
|
-
:
|
2601
|
+
border:
|
2602
|
+
//color: black
|
2603
|
+
style: solid
|
2592
2604
|
SOURCE
|
2593
2605
|
|
2594
2606
|
assert_equal(<<RESULT, render(<<SOURCE))
|
2595
2607
|
.box {
|
2596
|
-
/* :
|
2608
|
+
/* color: black */
|
2597
2609
|
border-style: solid; }
|
2598
2610
|
RESULT
|
2599
2611
|
.box
|
2600
|
-
:
|
2601
|
-
/* :
|
2602
|
-
:
|
2612
|
+
border:
|
2613
|
+
/* color: black
|
2614
|
+
style: solid
|
2603
2615
|
SOURCE
|
2604
2616
|
|
2605
2617
|
assert_equal(<<RESULT, render(<<SOURCE, :style => :compressed))
|
2606
2618
|
.box{border-style:solid}
|
2607
2619
|
RESULT
|
2608
2620
|
.box
|
2609
|
-
:
|
2610
|
-
|
2611
|
-
:
|
2621
|
+
border:
|
2622
|
+
/*color: black
|
2623
|
+
style: solid
|
2612
2624
|
SOURCE
|
2613
2625
|
end
|
2614
2626
|
|
@@ -2903,7 +2915,7 @@ SASS
|
|
2903
2915
|
assert_equal <<CSS, render(<<SASS)
|
2904
2916
|
div {
|
2905
2917
|
maximum: 1.00000001;
|
2906
|
-
too-much: 1
|
2918
|
+
too-much: 1; }
|
2907
2919
|
CSS
|
2908
2920
|
div
|
2909
2921
|
maximum : 1.00000001
|
@@ -3252,10 +3264,143 @@ CSS
|
|
3252
3264
|
SASS
|
3253
3265
|
end
|
3254
3266
|
|
3267
|
+
def test_compressed_unknown_directive
|
3268
|
+
assert_equal(<<CSS, render(<<SASS, :style => :compressed))
|
3269
|
+
x{@foo;a:b;@bar}
|
3270
|
+
CSS
|
3271
|
+
x
|
3272
|
+
@foo
|
3273
|
+
a: b
|
3274
|
+
@bar
|
3275
|
+
SASS
|
3276
|
+
end
|
3277
|
+
|
3278
|
+
def test_compressed_unknown_directive_in_directive
|
3279
|
+
assert_equal(<<CSS, render(<<SASS, :style => :compressed))
|
3280
|
+
@x{@foo;a:b;@bar}
|
3281
|
+
CSS
|
3282
|
+
@x
|
3283
|
+
@foo
|
3284
|
+
a: b
|
3285
|
+
@bar
|
3286
|
+
SASS
|
3287
|
+
end
|
3288
|
+
|
3289
|
+
def test_compressed_unknown_directive_with_children_in_directive
|
3290
|
+
assert_equal(<<CSS, render(<<SASS, :style => :compressed))
|
3291
|
+
@x{@foo{a:b}c:d;@bar{e:f}}
|
3292
|
+
CSS
|
3293
|
+
@x
|
3294
|
+
@foo
|
3295
|
+
a: b
|
3296
|
+
c: d
|
3297
|
+
@bar
|
3298
|
+
e: f
|
3299
|
+
SASS
|
3300
|
+
end
|
3301
|
+
|
3302
|
+
def test_compressed_rule_in_directive
|
3303
|
+
assert_equal(<<CSS, render(<<SASS, :style => :compressed))
|
3304
|
+
@x{foo{a:b}c:d;bar{e:f}}
|
3305
|
+
CSS
|
3306
|
+
@x
|
3307
|
+
foo
|
3308
|
+
a: b
|
3309
|
+
c: d
|
3310
|
+
bar
|
3311
|
+
e: f
|
3312
|
+
SASS
|
3313
|
+
end
|
3314
|
+
|
3315
|
+
def test_import_two_css_files_issue_1806
|
3316
|
+
assert_equal(<<CSS, render(<<SASS, :syntax => :scss, :style => :compressed))
|
3317
|
+
@import url(\"foo.css\");@import url(\"bar.css\");@import url(\"baz.css\")
|
3318
|
+
CSS
|
3319
|
+
@import url("foo.css");
|
3320
|
+
@import url("bar.css");
|
3321
|
+
@import url("baz.css");
|
3322
|
+
SASS
|
3323
|
+
end
|
3324
|
+
|
3325
|
+
def test_numeric_formatting_of_integers
|
3326
|
+
assert_equal(<<CSS, render(<<SASS, :syntax => :scss, :style => :compressed))
|
3327
|
+
a{near:3.00001;plus:3;minus:3;negative:-3}
|
3328
|
+
CSS
|
3329
|
+
a {
|
3330
|
+
near: (3 + 0.00001);
|
3331
|
+
plus: (3 + 0.0000001);
|
3332
|
+
minus: (3 - 0.0000001);
|
3333
|
+
negative: (-3 + 0.0000001);
|
3334
|
+
}
|
3335
|
+
SASS
|
3336
|
+
end
|
3337
|
+
|
3338
|
+
def test_escaped_semicolons_are_not_compressed
|
3339
|
+
assert_equal(<<'CSS', render(<<'SASS', :syntax => :scss, :style => :compressed))
|
3340
|
+
div{color:#f00000\9\0\;}
|
3341
|
+
CSS
|
3342
|
+
div {
|
3343
|
+
color: #f00000\9\0\;
|
3344
|
+
}
|
3345
|
+
SASS
|
3346
|
+
end
|
3347
|
+
|
3348
|
+
def test_compressed_output_of_nth_selectors
|
3349
|
+
assert_equal(<<CSS, render(<<SASS, :syntax => :scss, :style => :compressed))
|
3350
|
+
:nth-of-type(2n-1),:nth-child(2n-1),:nth(2n-1),:nth-of-type(2n-1),:nth-of-type(2n-1){color:red}:nth-of-type(2n+1),:nth-child(2n+1),:nth(2n+1),:nth-of-type(2n+1),:nth-of-type(2n+1){color:red}
|
3351
|
+
CSS
|
3352
|
+
:nth-of-type(2n-1), :nth-child(2n- 1), :nth(2n -1), :nth-of-type(2n - 1), :nth-of-type( 2n - 1 ) {
|
3353
|
+
color: red }
|
3354
|
+
:nth-of-type(2n+1), :nth-child(2n+ 1), :nth(2n +1), :nth-of-type(2n + 1), :nth-of-type( 2n + 1 ) {
|
3355
|
+
color: red }
|
3356
|
+
SASS
|
3357
|
+
end
|
3358
|
+
|
3359
|
+
def test_descendant_selectors_with_leading_dash
|
3360
|
+
assert_equal(<<CSS, render(<<SASS, :syntax => :scss, :style => :compressed))
|
3361
|
+
a -b{color:red}
|
3362
|
+
CSS
|
3363
|
+
a -b {
|
3364
|
+
color: red }
|
3365
|
+
SASS
|
3366
|
+
end
|
3367
|
+
|
3368
|
+
def test_import_with_supports_clause_interp
|
3369
|
+
assert_equal(<<CSS, render(<<'SASS', :style => :compressed))
|
3370
|
+
@import url("fallback-layout.css") supports(not (display: flex))
|
3371
|
+
CSS
|
3372
|
+
$display-type: flex
|
3373
|
+
@import url("fallback-layout.css") supports(not (display: #{$display-type}))
|
3374
|
+
SASS
|
3375
|
+
end
|
3376
|
+
|
3377
|
+
def test_import_with_supports_clause
|
3378
|
+
assert_equal(<<CSS, render(<<SASS, :style => :compressed))
|
3379
|
+
@import url("fallback-layout.css") supports(not (display: flex))
|
3380
|
+
CSS
|
3381
|
+
@import url("fallback-layout.css") supports(not (display: flex))
|
3382
|
+
SASS
|
3383
|
+
end
|
3384
|
+
|
3385
|
+
def test_compressed_commas_in_attribute_selectors
|
3386
|
+
assert_equal(<<CSS, render(<<SASS, :style => :compressed))
|
3387
|
+
.classname[a="1, 2, 3"],.another[b="4, 5, 6"]{color:red}
|
3388
|
+
CSS
|
3389
|
+
.classname[a="1, 2, 3"], .another[b="4, 5, 6"]
|
3390
|
+
color: red
|
3391
|
+
SASS
|
3392
|
+
end
|
3393
|
+
|
3255
3394
|
private
|
3256
3395
|
|
3257
3396
|
def assert_hash_has(hash, expected)
|
3258
|
-
expected.each
|
3397
|
+
expected.each do |k, v|
|
3398
|
+
if v.nil?
|
3399
|
+
assert_nil(hash[k])
|
3400
|
+
else
|
3401
|
+
assert_equal(v, hash[k])
|
3402
|
+
end
|
3403
|
+
end
|
3259
3404
|
end
|
3260
3405
|
|
3261
3406
|
def assert_renders_encoded(css, sass)
|
@@ -3287,7 +3432,8 @@ SASS
|
|
3287
3432
|
end
|
3288
3433
|
|
3289
3434
|
def filename(name, type)
|
3290
|
-
File.dirname(__FILE__) + "/#{type == 'sass' ? 'templates' : 'results'}/#{name}.#{type}"
|
3435
|
+
path = File.dirname(__FILE__) + "/#{type == 'sass' ? 'templates' : 'results'}/#{name}.#{type}"
|
3436
|
+
Sass::Util.cleanpath(path).to_s
|
3291
3437
|
end
|
3292
3438
|
|
3293
3439
|
def sassc_path(template)
|
data/test/sass/exec_test.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require File.dirname(__FILE__) + '/../test_helper'
|
3
|
+
require 'fileutils'
|
3
4
|
require 'sass/util/test'
|
4
5
|
require 'tmpdir'
|
5
6
|
|
@@ -64,6 +65,14 @@ class ExecTest < MiniTest::Test
|
|
64
65
|
assert_equal(".ruleset\r\n margin: 0\r\n", read(src))
|
65
66
|
end
|
66
67
|
|
68
|
+
def test_sass_convert_R
|
69
|
+
Dir.chdir(@dir) do
|
70
|
+
src = get_path("styles/src.css")
|
71
|
+
write(src, ".ruleset { margin: 0 }")
|
72
|
+
assert(exec(*%w[sass-convert -Rq --from css --to scss --trace styles]))
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
67
76
|
private
|
68
77
|
|
69
78
|
def get_path(name)
|
@@ -75,6 +84,7 @@ class ExecTest < MiniTest::Test
|
|
75
84
|
end
|
76
85
|
|
77
86
|
def write(file, content)
|
87
|
+
FileUtils.mkdir_p(File.dirname(file))
|
78
88
|
open(file, 'wb') {|f| f.write(content)}
|
79
89
|
end
|
80
90
|
|