sass 3.4.0 → 3.4.25

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -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
- :prop val
291
+ prop: val
291
292
  // comment!
292
293
 
293
- :broken
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
- :prop val
308
+ prop: val
308
309
  // comment!
309
310
 
310
- :broken
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 :foo bar"))
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 :foo bar"))
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 :foo bar\n #baz\n :foo bar"))
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 :foo bar", :style => :compact))
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 :foo bar", :style => :compressed))
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 :foo bar"))
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 :foo bar"))
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 :b c"))
811
- assert_equal("@a { b: c; }\n", render("@a\n :b c", :style => :compact))
812
- assert_equal("@a {\n b: c;\n}\n", render("@a\n :b c", :style => :expanded))
813
- assert_equal("@a{b:c}\n", render("@a\n :b c", :style => :compressed))
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 :b c\n :d e"))
815
+ render("@a\n b: c\n d: e"))
817
816
  assert_equal("@a { b: c; d: e; }\n",
818
- render("@a\n :b c\n :d e", :style => :compact))
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 :b c\n :d e", :style => :expanded))
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 :b c\n :d e", :style => :compressed))
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 :c d"))
824
+ render("@a\n #b\n c: d"))
826
825
  assert_equal("@a { #b { c: d; } }\n",
827
- render("@a\n #b\n :c d", :style => :compact))
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 :c d", :style => :expanded))
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 :c d", :style => :compressed))
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 :a b\n #c\n :d e"))
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 :a b\n #c\n :d e", :style => :compact))
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 :a b\n #c\n :d e", :style => :expanded))
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 :a b\n #c\n :d e", :style => :compressed))
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 :b c"))
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 :b c", :style => :compact))
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 :b c", :style => :expanded))
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 :b c", :style => :compressed))
848
+ render("@a\n #foo, \n #bar\n b: c", :style => :compressed))
850
849
 
851
850
  to_render = <<END
852
851
  @a
853
- :b c
852
+ b: c
854
853
  #d
855
- :e f
856
- :g h
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
- :color $a
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
- :color $a
1170
- :padding $b
1171
- :margin $c
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 #{File.dirname(__FILE__)}/templates/warn.sass
2064
+ on line 1 of #{prefix}/templates/warn.sass
2065
2065
 
2066
2066
  WARNING: Imported
2067
- on line 1 of #{File.dirname(__FILE__)}/templates/warn_imported.sass
2068
- from line 2 of #{File.dirname(__FILE__)}/templates/warn.sass
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 #{File.dirname(__FILE__)}/templates/warn_imported.sass, in `emits-a-warning'
2072
- from line 3 of #{File.dirname(__FILE__)}/templates/warn.sass
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 => [File.dirname(__FILE__) + "/templates"]
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
- :border
2590
- //:color black
2591
- :style solid
2601
+ border:
2602
+ //color: black
2603
+ style: solid
2592
2604
  SOURCE
2593
2605
 
2594
2606
  assert_equal(<<RESULT, render(<<SOURCE))
2595
2607
  .box {
2596
- /* :color black */
2608
+ /* color: black */
2597
2609
  border-style: solid; }
2598
2610
  RESULT
2599
2611
  .box
2600
- :border
2601
- /* :color black
2602
- :style solid
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
- :border
2610
- /*:color black
2611
- :style solid
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.0; }
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 {|k, v| assert_equal(v, hash[k])}
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)
@@ -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