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
@@ -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