sass 3.2.7 → 3.3.0.rc.1

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 (184) hide show
  1. data/MIT-LICENSE +2 -2
  2. data/README.md +14 -2
  3. data/Rakefile +25 -1
  4. data/VERSION +1 -1
  5. data/VERSION_DATE +1 -1
  6. data/VERSION_NAME +1 -1
  7. data/lib/sass/cache_stores/base.rb +4 -2
  8. data/lib/sass/cache_stores/chain.rb +2 -1
  9. data/lib/sass/cache_stores/filesystem.rb +2 -6
  10. data/lib/sass/cache_stores/memory.rb +1 -1
  11. data/lib/sass/cache_stores/null.rb +2 -2
  12. data/lib/sass/callbacks.rb +1 -0
  13. data/lib/sass/css.rb +10 -10
  14. data/lib/sass/engine.rb +403 -150
  15. data/lib/sass/environment.rb +136 -57
  16. data/lib/sass/error.rb +7 -7
  17. data/lib/sass/exec.rb +123 -39
  18. data/lib/sass/features.rb +41 -0
  19. data/lib/sass/importers/base.rb +33 -2
  20. data/lib/sass/importers/deprecated_path.rb +45 -0
  21. data/lib/sass/importers/filesystem.rb +25 -14
  22. data/lib/sass/importers.rb +1 -0
  23. data/lib/sass/logger/base.rb +3 -3
  24. data/lib/sass/logger/log_level.rb +4 -6
  25. data/lib/sass/media.rb +19 -19
  26. data/lib/sass/plugin/compiler.rb +141 -101
  27. data/lib/sass/plugin/configuration.rb +18 -22
  28. data/lib/sass/plugin/merb.rb +1 -1
  29. data/lib/sass/plugin/staleness_checker.rb +24 -8
  30. data/lib/sass/plugin.rb +4 -2
  31. data/lib/sass/repl.rb +3 -3
  32. data/lib/sass/script/css_lexer.rb +9 -4
  33. data/lib/sass/script/css_parser.rb +6 -2
  34. data/lib/sass/script/functions.rb +1343 -590
  35. data/lib/sass/script/lexer.rb +84 -52
  36. data/lib/sass/script/parser.rb +217 -97
  37. data/lib/sass/script/tree/funcall.rb +290 -0
  38. data/lib/sass/script/{interpolation.rb → tree/interpolation.rb} +34 -13
  39. data/lib/sass/script/tree/list_literal.rb +80 -0
  40. data/lib/sass/script/tree/literal.rb +47 -0
  41. data/lib/sass/script/tree/map_literal.rb +64 -0
  42. data/lib/sass/script/{node.rb → tree/node.rb} +22 -12
  43. data/lib/sass/script/{operation.rb → tree/operation.rb} +17 -25
  44. data/lib/sass/script/tree/selector.rb +30 -0
  45. data/lib/sass/script/{string_interpolation.rb → tree/string_interpolation.rb} +5 -4
  46. data/lib/sass/script/{unary_operation.rb → tree/unary_operation.rb} +14 -9
  47. data/lib/sass/script/tree/variable.rb +57 -0
  48. data/lib/sass/script/tree.rb +16 -0
  49. data/lib/sass/script/{arg_list.rb → value/arg_list.rb} +4 -24
  50. data/lib/sass/script/value/base.rb +248 -0
  51. data/lib/sass/script/value/bool.rb +36 -0
  52. data/lib/sass/script/{color.rb → value/color.rb} +239 -195
  53. data/lib/sass/script/value/helpers.rb +155 -0
  54. data/lib/sass/script/value/list.rb +119 -0
  55. data/lib/sass/script/value/map.rb +70 -0
  56. data/lib/sass/script/value/null.rb +45 -0
  57. data/lib/sass/script/{number.rb → value/number.rb} +91 -65
  58. data/lib/sass/script/{string.rb → value/string.rb} +9 -11
  59. data/lib/sass/script/value.rb +11 -0
  60. data/lib/sass/script.rb +35 -8
  61. data/lib/sass/scss/css_parser.rb +2 -1
  62. data/lib/sass/scss/parser.rb +338 -170
  63. data/lib/sass/scss/rx.rb +5 -6
  64. data/lib/sass/scss/script_lexer.rb +1 -0
  65. data/lib/sass/scss/script_parser.rb +1 -0
  66. data/lib/sass/scss/static_parser.rb +23 -6
  67. data/lib/sass/selector/abstract_sequence.rb +2 -2
  68. data/lib/sass/selector/comma_sequence.rb +21 -16
  69. data/lib/sass/selector/sequence.rb +60 -34
  70. data/lib/sass/selector/simple.rb +11 -12
  71. data/lib/sass/selector/simple_sequence.rb +55 -33
  72. data/lib/sass/selector.rb +52 -48
  73. data/lib/sass/source/map.rb +211 -0
  74. data/lib/sass/source/position.rb +39 -0
  75. data/lib/sass/source/range.rb +41 -0
  76. data/lib/sass/stack.rb +120 -0
  77. data/lib/sass/supports.rb +12 -13
  78. data/lib/sass/tree/at_root_node.rb +82 -0
  79. data/lib/sass/tree/comment_node.rb +3 -3
  80. data/lib/sass/tree/css_import_node.rb +11 -11
  81. data/lib/sass/tree/debug_node.rb +2 -2
  82. data/lib/sass/tree/directive_node.rb +13 -2
  83. data/lib/sass/tree/each_node.rb +8 -8
  84. data/lib/sass/tree/extend_node.rb +13 -6
  85. data/lib/sass/tree/for_node.rb +4 -4
  86. data/lib/sass/tree/function_node.rb +5 -4
  87. data/lib/sass/tree/if_node.rb +1 -1
  88. data/lib/sass/tree/import_node.rb +4 -5
  89. data/lib/sass/tree/media_node.rb +4 -14
  90. data/lib/sass/tree/mixin_def_node.rb +4 -4
  91. data/lib/sass/tree/mixin_node.rb +21 -8
  92. data/lib/sass/tree/node.rb +29 -12
  93. data/lib/sass/tree/prop_node.rb +38 -18
  94. data/lib/sass/tree/return_node.rb +3 -2
  95. data/lib/sass/tree/root_node.rb +19 -3
  96. data/lib/sass/tree/rule_node.rb +25 -17
  97. data/lib/sass/tree/supports_node.rb +0 -13
  98. data/lib/sass/tree/trace_node.rb +2 -1
  99. data/lib/sass/tree/variable_node.rb +9 -3
  100. data/lib/sass/tree/visitors/base.rb +6 -6
  101. data/lib/sass/tree/visitors/check_nesting.rb +12 -9
  102. data/lib/sass/tree/visitors/convert.rb +63 -38
  103. data/lib/sass/tree/visitors/cssize.rb +63 -23
  104. data/lib/sass/tree/visitors/deep_copy.rb +6 -5
  105. data/lib/sass/tree/visitors/extend.rb +7 -7
  106. data/lib/sass/tree/visitors/perform.rb +256 -151
  107. data/lib/sass/tree/visitors/set_options.rb +6 -6
  108. data/lib/sass/tree/visitors/to_css.rb +231 -81
  109. data/lib/sass/tree/warn_node.rb +2 -2
  110. data/lib/sass/tree/while_node.rb +2 -2
  111. data/lib/sass/util/multibyte_string_scanner.rb +2 -0
  112. data/lib/sass/util/normalized_map.rb +65 -0
  113. data/lib/sass/util/ordered_hash.rb +188 -0
  114. data/lib/sass/util/subset_map.rb +3 -2
  115. data/lib/sass/util/test.rb +9 -0
  116. data/lib/sass/util.rb +220 -34
  117. data/lib/sass/version.rb +9 -9
  118. data/lib/sass.rb +14 -7
  119. data/test/sass/compiler_test.rb +213 -0
  120. data/test/sass/conversion_test.rb +235 -9
  121. data/test/sass/engine_test.rb +230 -60
  122. data/test/sass/exec_test.rb +86 -0
  123. data/test/sass/extend_test.rb +215 -147
  124. data/test/sass/functions_test.rb +584 -99
  125. data/test/sass/importer_test.rb +165 -17
  126. data/test/sass/plugin_test.rb +19 -13
  127. data/test/sass/script_conversion_test.rb +40 -0
  128. data/test/sass/script_test.rb +231 -21
  129. data/test/sass/scss/css_test.rb +14 -5
  130. data/test/sass/scss/scss_test.rb +1266 -66
  131. data/test/sass/source_map_test.rb +879 -0
  132. data/test/sass/templates/bork5.sass +3 -0
  133. data/test/sass/util/normalized_map_test.rb +30 -0
  134. data/test/sass/util_test.rb +90 -0
  135. data/test/sass/value_helpers_test.rb +181 -0
  136. data/test/test_helper.rb +7 -2
  137. metadata +316 -291
  138. data/lib/sass/script/bool.rb +0 -18
  139. data/lib/sass/script/funcall.rb +0 -231
  140. data/lib/sass/script/list.rb +0 -84
  141. data/lib/sass/script/literal.rb +0 -239
  142. data/lib/sass/script/null.rb +0 -34
  143. data/lib/sass/script/variable.rb +0 -58
  144. data/test/Gemfile +0 -3
  145. data/vendor/listen/CHANGELOG.md +0 -221
  146. data/vendor/listen/CONTRIBUTING.md +0 -38
  147. data/vendor/listen/Gemfile +0 -30
  148. data/vendor/listen/Guardfile +0 -8
  149. data/vendor/listen/LICENSE +0 -20
  150. data/vendor/listen/README.md +0 -315
  151. data/vendor/listen/Rakefile +0 -47
  152. data/vendor/listen/Vagrantfile +0 -96
  153. data/vendor/listen/lib/listen/adapter.rb +0 -214
  154. data/vendor/listen/lib/listen/adapters/bsd.rb +0 -112
  155. data/vendor/listen/lib/listen/adapters/darwin.rb +0 -85
  156. data/vendor/listen/lib/listen/adapters/linux.rb +0 -113
  157. data/vendor/listen/lib/listen/adapters/polling.rb +0 -67
  158. data/vendor/listen/lib/listen/adapters/windows.rb +0 -87
  159. data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
  160. data/vendor/listen/lib/listen/directory_record.rb +0 -371
  161. data/vendor/listen/lib/listen/listener.rb +0 -225
  162. data/vendor/listen/lib/listen/multi_listener.rb +0 -143
  163. data/vendor/listen/lib/listen/turnstile.rb +0 -28
  164. data/vendor/listen/lib/listen/version.rb +0 -3
  165. data/vendor/listen/lib/listen.rb +0 -40
  166. data/vendor/listen/listen.gemspec +0 -22
  167. data/vendor/listen/spec/listen/adapter_spec.rb +0 -183
  168. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +0 -36
  169. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -37
  170. data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -47
  171. data/vendor/listen/spec/listen/adapters/polling_spec.rb +0 -68
  172. data/vendor/listen/spec/listen/adapters/windows_spec.rb +0 -30
  173. data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
  174. data/vendor/listen/spec/listen/directory_record_spec.rb +0 -1225
  175. data/vendor/listen/spec/listen/listener_spec.rb +0 -169
  176. data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
  177. data/vendor/listen/spec/listen/turnstile_spec.rb +0 -56
  178. data/vendor/listen/spec/listen_spec.rb +0 -73
  179. data/vendor/listen/spec/spec_helper.rb +0 -21
  180. data/vendor/listen/spec/support/adapter_helper.rb +0 -629
  181. data/vendor/listen/spec/support/directory_record_helper.rb +0 -55
  182. data/vendor/listen/spec/support/fixtures_helper.rb +0 -29
  183. data/vendor/listen/spec/support/listeners_helper.rb +0 -156
  184. data/vendor/listen/spec/support/platform_helper.rb +0 -15
@@ -9,10 +9,23 @@ require 'pathname'
9
9
 
10
10
  module Sass::Script::Functions::UserFunctions
11
11
  def option(name)
12
- Sass::Script::String.new(@options[name.value.to_sym].to_s)
12
+ Sass::Script::Value::String.new(@options[name.value.to_sym].to_s)
13
+ end
14
+
15
+ def set_a_variable(name, value)
16
+ environment.set_var(name.value, value)
17
+ return Sass::Script::Value::Null.new
18
+ end
19
+
20
+ def get_a_variable(name)
21
+ environment.var(name.value) || Sass::Script::Value::String.new("undefined")
13
22
  end
14
23
  end
15
24
 
25
+ module Sass::Script::Functions
26
+ include Sass::Script::Functions::UserFunctions
27
+ end
28
+
16
29
  class SassEngineTest < Test::Unit::TestCase
17
30
  FAKE_FILE_NAME = __FILE__.gsub(/rb$/,"sass")
18
31
  # A map of erroneous Sass documents to the error messages they should produce.
@@ -219,42 +232,30 @@ MSG
219
232
  end
220
233
 
221
234
  def test_import_same_name_different_ext
222
- assert_warning <<WARNING do
223
- WARNING: On line 1 of test_import_same_name_different_ext_inline.sass:
224
- It's not clear which file to import for '@import "same_name_different_ext"'.
225
- Candidates:
226
- same_name_different_ext.sass
227
- same_name_different_ext.scss
228
- For now I'll choose same_name_different_ext.sass.
229
- This will be an error in future versions of Sass.
230
- WARNING
235
+ assert_raise_message Sass::SyntaxError, <<ERROR do
236
+ It's not clear which file to import for '@import "same_name_different_ext"'.
237
+ Candidates:
238
+ same_name_different_ext.sass
239
+ same_name_different_ext.scss
240
+ Please delete or rename all but one of these files.
241
+ ERROR
231
242
  options = {:load_paths => [File.dirname(__FILE__) + '/templates/']}
232
243
  munge_filename options
233
- result = Sass::Engine.new("@import 'same_name_different_ext'", options).render
234
- assert_equal(<<CSS, result)
235
- .foo {
236
- ext: sass; }
237
- CSS
244
+ Sass::Engine.new("@import 'same_name_different_ext'", options).render
238
245
  end
239
246
  end
240
247
 
241
248
  def test_import_same_name_different_partiality
242
- assert_warning <<WARNING do
243
- WARNING: On line 1 of test_import_same_name_different_partiality_inline.sass:
244
- It's not clear which file to import for '@import "same_name_different_partiality"'.
245
- Candidates:
246
- _same_name_different_partiality.scss
247
- same_name_different_partiality.scss
248
- For now I'll choose _same_name_different_partiality.scss.
249
- This will be an error in future versions of Sass.
250
- WARNING
249
+ assert_raise_message Sass::SyntaxError, <<ERROR do
250
+ It's not clear which file to import for '@import "same_name_different_partiality"'.
251
+ Candidates:
252
+ _same_name_different_partiality.scss
253
+ same_name_different_partiality.scss
254
+ Please delete or rename all but one of these files.
255
+ ERROR
251
256
  options = {:load_paths => [File.dirname(__FILE__) + '/templates/']}
252
257
  munge_filename options
253
- result = Sass::Engine.new("@import 'same_name_different_partiality'", options).render
254
- assert_equal(<<CSS, result)
255
- .foo {
256
- partial: yes; }
257
- CSS
258
+ Sass::Engine.new("@import 'same_name_different_partiality'", options).render
258
259
  end
259
260
  end
260
261
 
@@ -523,6 +524,21 @@ MESSAGE
523
524
  assert_hash_has(err.sass_backtrace[2], :mixin => "foo", :line => 2)
524
525
  end
525
526
 
527
+ def test_mixin_loop_with_content
528
+ render <<SASS
529
+ =foo
530
+ @content
531
+ =bar
532
+ +foo
533
+ +bar
534
+ +bar
535
+ SASS
536
+ assert(false, "Exception not raised")
537
+ rescue Sass::SyntaxError => err
538
+ assert_equal("An @include loop has been found: bar includes itself", err.message)
539
+ assert_hash_has(err.sass_backtrace[0], :mixin => "@content", :line => 5)
540
+ end
541
+
526
542
  def test_basic_import_loop_exception
527
543
  import = filename_for_test
528
544
  importer = MockImporter.new
@@ -542,7 +558,7 @@ ERR
542
558
  importer.add_import("bar", "@import 'foo'")
543
559
 
544
560
  engine = Sass::Engine.new('@import "foo"', :filename => filename_for_test,
545
- :load_paths => [importer])
561
+ :load_paths => [importer], :importer => importer)
546
562
 
547
563
  assert_raise_message(Sass::SyntaxError, <<ERR.rstrip) {engine.render}
548
564
  An @import loop has been found:
@@ -559,7 +575,7 @@ ERR
559
575
  importer.add_import("baz", "@import 'foo'")
560
576
 
561
577
  engine = Sass::Engine.new('@import "foo"', :filename => filename_for_test,
562
- :load_paths => [importer])
578
+ :load_paths => [importer], :importer => importer)
563
579
 
564
580
  assert_raise_message(Sass::SyntaxError, <<ERR.rstrip) {engine.render}
565
581
  An @import loop has been found:
@@ -715,7 +731,7 @@ SASS
715
731
  importer.add_import("imported", "div{color:red}")
716
732
  Sass.load_paths << importer
717
733
 
718
- assert_equal "div {\n color: red; }\n", Sass::Engine.new('@import "imported"').render
734
+ assert_equal "div {\n color: red; }\n", Sass::Engine.new('@import "imported"', :importer => importer).render
719
735
  ensure
720
736
  Sass.load_paths.clear
721
737
  end
@@ -1412,6 +1428,44 @@ bar
1412
1428
  SASS
1413
1429
  end
1414
1430
 
1431
+ def test_user_defined_function_variable_scope
1432
+ render(<<SASS)
1433
+ bar
1434
+ -no-op: set-a-variable(variable, 5)
1435
+ a: $variable
1436
+ SASS
1437
+ flunk("Exception not raised for test_user_defined_function_variable_scope")
1438
+ rescue Sass::SyntaxError => e
1439
+ assert_equal('Undefined variable: "$variable".', e.message)
1440
+ end
1441
+
1442
+ def test_user_defined_function_can_change_global_variable
1443
+ assert_equal(<<CSS, render(<<SASS))
1444
+ bar {
1445
+ a: 5; }
1446
+ CSS
1447
+ $variable: 0
1448
+ bar
1449
+ $local: 10
1450
+ -no-op: set-a-variable(variable, 5)
1451
+ a: $variable
1452
+ SASS
1453
+ end
1454
+
1455
+ def test_user_defined_function_cannot_read_local_variable
1456
+ assert_equal(<<CSS, render(<<SASS))
1457
+ bar {
1458
+ global: 0;
1459
+ local: undefined; }
1460
+ CSS
1461
+ $global: 0
1462
+ bar
1463
+ $local: 10
1464
+ global: get-a-variable(global)
1465
+ local: get-a-variable(local)
1466
+ SASS
1467
+ end
1468
+
1415
1469
  def test_control_directive_in_nested_property
1416
1470
  assert_equal(<<CSS, render(<<SASS))
1417
1471
  foo {
@@ -1525,7 +1579,7 @@ $a: 5
1525
1579
  @while $a != 0
1526
1580
  a-\#{$a}
1527
1581
  blooble: gloop
1528
- $a: $a - 1
1582
+ $a: $a - 1 !global
1529
1583
  SASS
1530
1584
  end
1531
1585
 
@@ -1592,14 +1646,35 @@ a
1592
1646
  SASS
1593
1647
  end
1594
1648
 
1649
+ def test_destructuring_each
1650
+ assert_equal <<CSS, render(<<SCSS)
1651
+ a {
1652
+ foo: 1px;
1653
+ bar: 2px;
1654
+ baz: 3px; }
1655
+
1656
+ c {
1657
+ foo: "Value is bar";
1658
+ bar: "Value is baz";
1659
+ bang: "Value is "; }
1660
+ CSS
1661
+ a
1662
+ @each $name, $number in (foo: 1px, bar: 2px, baz: 3px)
1663
+ \#{$name}: $number
1664
+ c
1665
+ @each $key, $value in (foo bar) (bar, baz) bang
1666
+ \#{$key}: "Value is \#{$value}"
1667
+ SCSS
1668
+ end
1669
+
1595
1670
  def test_variable_reassignment
1596
1671
  assert_equal(<<CSS, render(<<SASS))
1597
1672
  a {
1598
1673
  b: 1;
1599
1674
  c: 2; }
1600
1675
  CSS
1601
- $a: 1
1602
1676
  a
1677
+ $a: 1
1603
1678
  b: $a
1604
1679
  $a: 2
1605
1680
  c: $a
@@ -1607,7 +1682,7 @@ SASS
1607
1682
  end
1608
1683
 
1609
1684
  def test_variable_scope
1610
- assert_equal(<<CSS, render(<<SASS))
1685
+ silence_warnings {assert_equal(<<CSS, render(<<SASS))}
1611
1686
  a {
1612
1687
  b-1: c;
1613
1688
  b-2: c;
@@ -1633,9 +1708,6 @@ SASS
1633
1708
 
1634
1709
  def test_hyphen_underscore_insensitive_variables
1635
1710
  assert_equal(<<CSS, render(<<SASS))
1636
- a {
1637
- b: c; }
1638
-
1639
1711
  d {
1640
1712
  e: 13;
1641
1713
  f: foobar; }
@@ -1643,10 +1715,8 @@ CSS
1643
1715
  $var-hyphen: 12
1644
1716
  $var_under: foo
1645
1717
 
1646
- a
1647
- $var_hyphen: 1 + $var_hyphen
1648
- $var-under: $var-under + bar
1649
- b: c
1718
+ $var_hyphen: 1 + $var_hyphen
1719
+ $var-under: $var-under + bar
1650
1720
 
1651
1721
  d
1652
1722
  e: $var-hyphen
@@ -1789,7 +1859,7 @@ SASS
1789
1859
 
1790
1860
  def test_loud_comment_in_compressed_mode
1791
1861
  assert_equal <<CSS, render(<<SASS, :style => :compressed)
1792
- foo{color:blue;/* foo
1862
+ foo{color:blue;/*! foo
1793
1863
  * bar
1794
1864
  */}
1795
1865
  CSS
@@ -1803,10 +1873,9 @@ SASS
1803
1873
 
1804
1874
  def test_loud_comment_is_evaluated
1805
1875
  assert_equal <<CSS, render(<<SASS)
1806
- /* Hue: 327.21649deg */
1876
+ /*! Hue: 327.21649deg */
1807
1877
  CSS
1808
- /*!
1809
- Hue: \#{hue(#f836a0)}
1878
+ /*! Hue: \#{hue(#f836a0)}
1810
1879
  SASS
1811
1880
  end
1812
1881
 
@@ -2379,8 +2448,94 @@ $val: 20
2379
2448
  SASS
2380
2449
  end
2381
2450
 
2451
+ def test_at_root
2452
+ assert_equal <<CSS, render(<<SASS)
2453
+ .bar {
2454
+ a: b; }
2455
+ CSS
2456
+ .foo
2457
+ @at-root
2458
+ .bar
2459
+ a: b
2460
+ SASS
2461
+ end
2462
+
2463
+ def test_at_root_with_selector
2464
+ assert_equal <<CSS, render(<<SASS)
2465
+ .bar {
2466
+ a: b; }
2467
+ CSS
2468
+ .foo
2469
+ @at-root .bar
2470
+ a: b
2471
+ SASS
2472
+ end
2473
+
2474
+ def test_at_root_with_query
2475
+ assert_equal <<CSS, render(<<SASS)
2476
+ .foo .bar {
2477
+ a: b; }
2478
+ CSS
2479
+ .foo
2480
+ @media screen
2481
+ @at-root (without: media)
2482
+ .bar
2483
+ a: b
2484
+ SASS
2485
+ end
2486
+
2487
+ def test_variable_assignment_with_global
2488
+ assert_no_warning {assert_equal(<<CSS, render(<<SASS))}
2489
+ .foo {
2490
+ a: x; }
2491
+
2492
+ .bar {
2493
+ b: x; }
2494
+ CSS
2495
+ $var: 1
2496
+
2497
+ .foo
2498
+ $var: x !global
2499
+ a: $var
2500
+
2501
+ .bar
2502
+ b: $var
2503
+ SASS
2504
+ end
2505
+
2382
2506
  # Regression tests
2383
2507
 
2508
+ def test_list_separator_with_arg_list
2509
+ assert_equal(<<CSS, render(<<SASS))
2510
+ .test {
2511
+ separator: comma; }
2512
+ CSS
2513
+ @mixin arglist-test($args...)
2514
+ separator: list-separator($args)
2515
+
2516
+ .test
2517
+ @include arglist-test(this, is, comma, separated)
2518
+ SASS
2519
+ end
2520
+
2521
+ def test_parent_mixin_in_content_nested
2522
+ assert_equal(<<CSS, render(<<SASS))
2523
+ a {
2524
+ b: c; }
2525
+ CSS
2526
+ =foo
2527
+ @content
2528
+
2529
+ =bar
2530
+ +foo
2531
+ +foo
2532
+ a
2533
+ b: c
2534
+
2535
+ +bar
2536
+ SASS
2537
+ end
2538
+
2384
2539
  def test_supports_bubbles
2385
2540
  assert_equal <<CSS, render(<<SASS)
2386
2541
  parent {
@@ -2453,15 +2608,15 @@ SASS
2453
2608
 
2454
2609
  def test_interpolated_comment_in_mixin
2455
2610
  assert_equal <<CSS, render(<<SASS)
2456
- /* color: red */
2611
+ /*! color: red */
2457
2612
  .foo {
2458
2613
  color: red; }
2459
2614
 
2460
- /* color: blue */
2615
+ /*! color: blue */
2461
2616
  .foo {
2462
2617
  color: blue; }
2463
2618
 
2464
- /* color: green */
2619
+ /*! color: green */
2465
2620
  .foo {
2466
2621
  color: green; }
2467
2622
  CSS
@@ -2756,7 +2911,7 @@ CSS
2756
2911
  /* \\\#{foo}
2757
2912
  SASS
2758
2913
  assert_equal <<CSS, render(<<SASS)
2759
- /* \#{foo} */
2914
+ /*! \#{foo} */
2760
2915
  CSS
2761
2916
  /*! \\\#{foo}
2762
2917
  SASS
@@ -2939,23 +3094,17 @@ SCSS
2939
3094
 
2940
3095
  original_filename = filename_for_test
2941
3096
  engine = Sass::Engine.new('@import "imported"; div{color:blue}',
2942
- :filename => original_filename, :load_paths => [importer], :syntax => :scss)
3097
+ :filename => original_filename, :load_paths => [importer], :syntax => :scss, :importer => importer)
2943
3098
  engine.render
2944
3099
 
2945
3100
  assert_equal original_filename, engine.options[:original_filename]
2946
3101
  assert_equal original_filename, importer.engine("imported").options[:original_filename]
2947
3102
  end
2948
3103
 
2949
- def test_deprecated_PRECISION
2950
- assert_warning(<<END) {assert_equal 100_000.0, Sass::Script::Number::PRECISION}
2951
- Sass::Script::Number::PRECISION is deprecated and will be removed in a future release. Use Sass::Script::Number.precision_factor instead.
2952
- END
2953
- end
2954
-
2955
3104
  def test_changing_precision
2956
- old_precision = Sass::Script::Number.precision
3105
+ old_precision = Sass::Script::Value::Number.precision
2957
3106
  begin
2958
- Sass::Script::Number.precision = 8
3107
+ Sass::Script::Value::Number.precision = 8
2959
3108
  assert_equal <<CSS, render(<<SASS)
2960
3109
  div {
2961
3110
  maximum: 1.00000001;
@@ -2966,7 +3115,7 @@ div
2966
3115
  too-much: 1.000000001
2967
3116
  SASS
2968
3117
  ensure
2969
- Sass::Script::Number.precision = old_precision
3118
+ Sass::Script::Value::Number.precision = old_precision
2970
3119
  end
2971
3120
  end
2972
3121
 
@@ -3160,6 +3309,26 @@ SASS
3160
3309
  ], e.sass_backtrace)
3161
3310
  end
3162
3311
 
3312
+ def test_mixin_with_args_and_varargs_passed_no_var_args
3313
+ assert_equal <<CSS, render(<<SASS, :syntax => :scss)
3314
+ .foo {
3315
+ a: 1;
3316
+ b: 2;
3317
+ c: 3; }
3318
+ CSS
3319
+ @mixin three-or-more-args($a, $b, $c, $rest...) {
3320
+ a: $a;
3321
+ b: $b;
3322
+ c: $c;
3323
+ }
3324
+
3325
+ .foo {
3326
+ @include three-or-more-args($a: 1, $b: 2, $c: 3);
3327
+ }
3328
+ SASS
3329
+
3330
+ end
3331
+
3163
3332
  private
3164
3333
 
3165
3334
  def assert_hash_has(hash, expected)
@@ -3174,6 +3343,7 @@ SASS
3174
3343
 
3175
3344
  def render(sass, options = {})
3176
3345
  munge_filename options
3346
+ options[:importer] ||= MockImporter.new
3177
3347
  Sass::Engine.new(sass, options).render
3178
3348
  end
3179
3349
 
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../test_helper'
3
+ require 'sass/util/test'
4
+ require 'tmpdir'
5
+
6
+ class ExecTest < Test::Unit::TestCase
7
+ include Sass::Util::Test
8
+
9
+ def setup
10
+ @dir = Dir.mktmpdir
11
+ end
12
+
13
+ def teardown
14
+ FileUtils.rm_rf(@dir)
15
+ clean_up_sassc
16
+ end
17
+
18
+ def test_scss_t_expanded
19
+ src = get_path("src.scss")
20
+ dest = get_path("dest.css")
21
+ write(src, ".ruleset { margin: 0 }")
22
+ assert(exec(*%w[scss -t expanded --unix-newlines].push(src, dest)))
23
+ assert_equal(".ruleset {\n margin: 0;\n}\n", read(dest))
24
+ end
25
+
26
+ def test_sass_convert_T_sass
27
+ src = get_path("src.scss")
28
+ dest = get_path("dest.css")
29
+ write(src, ".ruleset { margin: 0 }")
30
+ assert(exec(*%w[sass-convert -T sass --unix-newlines].push(src, dest)))
31
+ assert_equal(".ruleset\n margin: 0\n", read(dest))
32
+ end
33
+
34
+ def test_sass_convert_T_sass_in_place
35
+ src = get_path("src.scss")
36
+ write(src, ".ruleset { margin: 0 }")
37
+ assert(exec(*%w[sass-convert -T sass --in-place --unix-newlines].push(src)))
38
+ assert_equal(".ruleset\n margin: 0\n", read(src))
39
+ end
40
+
41
+ def test_scss_t_expanded_no_unix_newlines
42
+ return skip "Can be run on Windows only" unless Sass::Util.windows?
43
+ src = get_path("src.scss")
44
+ dest = get_path("dest.css")
45
+ write(src, ".ruleset { margin: 0 }")
46
+ assert(exec(*%w[scss -t expanded].push(src, dest)))
47
+ assert_equal(".ruleset {\r\n margin: 0;\r\n}\r\n", read(dest))
48
+ end
49
+
50
+ def test_sass_convert_T_sass_no_unix_newlines
51
+ return skip "Can be run on Windows only" unless Sass::Util.windows?
52
+ src = get_path("src.scss")
53
+ dest = get_path("dest.sass")
54
+ write(src, ".ruleset { margin: 0 }")
55
+ assert(exec(*%w[sass-convert -T sass].push(src, dest)))
56
+ assert_equal(".ruleset\r\n margin: 0\r\n", read(dest))
57
+ end
58
+
59
+ def test_sass_convert_T_sass_in_place_no_unix_newlines
60
+ return skip "Can be run on Windows only" unless Sass::Util.windows?
61
+ src = get_path("src.scss")
62
+ write(src, ".ruleset { margin: 0 }")
63
+ assert(exec(*%w[sass-convert -T sass --in-place].push(src)))
64
+ assert_equal(".ruleset\r\n margin: 0\r\n", read(src))
65
+ end
66
+
67
+ private
68
+
69
+ def get_path(name)
70
+ File.join(@dir, name)
71
+ end
72
+
73
+ def read(file)
74
+ open(file, 'rb') {|f| f.read}
75
+ end
76
+
77
+ def write(file, content)
78
+ open(file, 'wb') {|f| f.write(content)}
79
+ end
80
+
81
+ def exec(script, *args)
82
+ script = File.dirname(__FILE__) + '/../../bin/' + script
83
+ ruby = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'] + RbConfig::CONFIG['EXEEXT'])
84
+ system(ruby, script, *args)
85
+ end
86
+ end