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.
- data/MIT-LICENSE +2 -2
- data/README.md +14 -2
- data/Rakefile +25 -1
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/VERSION_NAME +1 -1
- data/lib/sass/cache_stores/base.rb +4 -2
- data/lib/sass/cache_stores/chain.rb +2 -1
- data/lib/sass/cache_stores/filesystem.rb +2 -6
- data/lib/sass/cache_stores/memory.rb +1 -1
- data/lib/sass/cache_stores/null.rb +2 -2
- data/lib/sass/callbacks.rb +1 -0
- data/lib/sass/css.rb +10 -10
- data/lib/sass/engine.rb +403 -150
- data/lib/sass/environment.rb +136 -57
- data/lib/sass/error.rb +7 -7
- data/lib/sass/exec.rb +123 -39
- data/lib/sass/features.rb +41 -0
- data/lib/sass/importers/base.rb +33 -2
- data/lib/sass/importers/deprecated_path.rb +45 -0
- data/lib/sass/importers/filesystem.rb +25 -14
- data/lib/sass/importers.rb +1 -0
- data/lib/sass/logger/base.rb +3 -3
- data/lib/sass/logger/log_level.rb +4 -6
- data/lib/sass/media.rb +19 -19
- data/lib/sass/plugin/compiler.rb +141 -101
- data/lib/sass/plugin/configuration.rb +18 -22
- data/lib/sass/plugin/merb.rb +1 -1
- data/lib/sass/plugin/staleness_checker.rb +24 -8
- data/lib/sass/plugin.rb +4 -2
- data/lib/sass/repl.rb +3 -3
- data/lib/sass/script/css_lexer.rb +9 -4
- data/lib/sass/script/css_parser.rb +6 -2
- data/lib/sass/script/functions.rb +1343 -590
- data/lib/sass/script/lexer.rb +84 -52
- data/lib/sass/script/parser.rb +217 -97
- data/lib/sass/script/tree/funcall.rb +290 -0
- data/lib/sass/script/{interpolation.rb → tree/interpolation.rb} +34 -13
- data/lib/sass/script/tree/list_literal.rb +80 -0
- data/lib/sass/script/tree/literal.rb +47 -0
- data/lib/sass/script/tree/map_literal.rb +64 -0
- data/lib/sass/script/{node.rb → tree/node.rb} +22 -12
- data/lib/sass/script/{operation.rb → tree/operation.rb} +17 -25
- data/lib/sass/script/tree/selector.rb +30 -0
- data/lib/sass/script/{string_interpolation.rb → tree/string_interpolation.rb} +5 -4
- data/lib/sass/script/{unary_operation.rb → tree/unary_operation.rb} +14 -9
- data/lib/sass/script/tree/variable.rb +57 -0
- data/lib/sass/script/tree.rb +16 -0
- data/lib/sass/script/{arg_list.rb → value/arg_list.rb} +4 -24
- data/lib/sass/script/value/base.rb +248 -0
- data/lib/sass/script/value/bool.rb +36 -0
- data/lib/sass/script/{color.rb → value/color.rb} +239 -195
- data/lib/sass/script/value/helpers.rb +155 -0
- data/lib/sass/script/value/list.rb +119 -0
- data/lib/sass/script/value/map.rb +70 -0
- data/lib/sass/script/value/null.rb +45 -0
- data/lib/sass/script/{number.rb → value/number.rb} +91 -65
- data/lib/sass/script/{string.rb → value/string.rb} +9 -11
- data/lib/sass/script/value.rb +11 -0
- data/lib/sass/script.rb +35 -8
- data/lib/sass/scss/css_parser.rb +2 -1
- data/lib/sass/scss/parser.rb +338 -170
- data/lib/sass/scss/rx.rb +5 -6
- data/lib/sass/scss/script_lexer.rb +1 -0
- data/lib/sass/scss/script_parser.rb +1 -0
- data/lib/sass/scss/static_parser.rb +23 -6
- data/lib/sass/selector/abstract_sequence.rb +2 -2
- data/lib/sass/selector/comma_sequence.rb +21 -16
- data/lib/sass/selector/sequence.rb +60 -34
- data/lib/sass/selector/simple.rb +11 -12
- data/lib/sass/selector/simple_sequence.rb +55 -33
- data/lib/sass/selector.rb +52 -48
- data/lib/sass/source/map.rb +211 -0
- data/lib/sass/source/position.rb +39 -0
- data/lib/sass/source/range.rb +41 -0
- data/lib/sass/stack.rb +120 -0
- data/lib/sass/supports.rb +12 -13
- data/lib/sass/tree/at_root_node.rb +82 -0
- data/lib/sass/tree/comment_node.rb +3 -3
- data/lib/sass/tree/css_import_node.rb +11 -11
- data/lib/sass/tree/debug_node.rb +2 -2
- data/lib/sass/tree/directive_node.rb +13 -2
- data/lib/sass/tree/each_node.rb +8 -8
- data/lib/sass/tree/extend_node.rb +13 -6
- data/lib/sass/tree/for_node.rb +4 -4
- data/lib/sass/tree/function_node.rb +5 -4
- data/lib/sass/tree/if_node.rb +1 -1
- data/lib/sass/tree/import_node.rb +4 -5
- data/lib/sass/tree/media_node.rb +4 -14
- data/lib/sass/tree/mixin_def_node.rb +4 -4
- data/lib/sass/tree/mixin_node.rb +21 -8
- data/lib/sass/tree/node.rb +29 -12
- data/lib/sass/tree/prop_node.rb +38 -18
- data/lib/sass/tree/return_node.rb +3 -2
- data/lib/sass/tree/root_node.rb +19 -3
- data/lib/sass/tree/rule_node.rb +25 -17
- data/lib/sass/tree/supports_node.rb +0 -13
- data/lib/sass/tree/trace_node.rb +2 -1
- data/lib/sass/tree/variable_node.rb +9 -3
- data/lib/sass/tree/visitors/base.rb +6 -6
- data/lib/sass/tree/visitors/check_nesting.rb +12 -9
- data/lib/sass/tree/visitors/convert.rb +63 -38
- data/lib/sass/tree/visitors/cssize.rb +63 -23
- data/lib/sass/tree/visitors/deep_copy.rb +6 -5
- data/lib/sass/tree/visitors/extend.rb +7 -7
- data/lib/sass/tree/visitors/perform.rb +256 -151
- data/lib/sass/tree/visitors/set_options.rb +6 -6
- data/lib/sass/tree/visitors/to_css.rb +231 -81
- data/lib/sass/tree/warn_node.rb +2 -2
- data/lib/sass/tree/while_node.rb +2 -2
- data/lib/sass/util/multibyte_string_scanner.rb +2 -0
- data/lib/sass/util/normalized_map.rb +65 -0
- data/lib/sass/util/ordered_hash.rb +188 -0
- data/lib/sass/util/subset_map.rb +3 -2
- data/lib/sass/util/test.rb +9 -0
- data/lib/sass/util.rb +220 -34
- data/lib/sass/version.rb +9 -9
- data/lib/sass.rb +14 -7
- data/test/sass/compiler_test.rb +213 -0
- data/test/sass/conversion_test.rb +235 -9
- data/test/sass/engine_test.rb +230 -60
- data/test/sass/exec_test.rb +86 -0
- data/test/sass/extend_test.rb +215 -147
- data/test/sass/functions_test.rb +584 -99
- data/test/sass/importer_test.rb +165 -17
- data/test/sass/plugin_test.rb +19 -13
- data/test/sass/script_conversion_test.rb +40 -0
- data/test/sass/script_test.rb +231 -21
- data/test/sass/scss/css_test.rb +14 -5
- data/test/sass/scss/scss_test.rb +1266 -66
- data/test/sass/source_map_test.rb +879 -0
- data/test/sass/templates/bork5.sass +3 -0
- data/test/sass/util/normalized_map_test.rb +30 -0
- data/test/sass/util_test.rb +90 -0
- data/test/sass/value_helpers_test.rb +181 -0
- data/test/test_helper.rb +7 -2
- metadata +316 -291
- data/lib/sass/script/bool.rb +0 -18
- data/lib/sass/script/funcall.rb +0 -231
- data/lib/sass/script/list.rb +0 -84
- data/lib/sass/script/literal.rb +0 -239
- data/lib/sass/script/null.rb +0 -34
- data/lib/sass/script/variable.rb +0 -58
- data/test/Gemfile +0 -3
- data/vendor/listen/CHANGELOG.md +0 -221
- data/vendor/listen/CONTRIBUTING.md +0 -38
- data/vendor/listen/Gemfile +0 -30
- data/vendor/listen/Guardfile +0 -8
- data/vendor/listen/LICENSE +0 -20
- data/vendor/listen/README.md +0 -315
- data/vendor/listen/Rakefile +0 -47
- data/vendor/listen/Vagrantfile +0 -96
- data/vendor/listen/lib/listen/adapter.rb +0 -214
- data/vendor/listen/lib/listen/adapters/bsd.rb +0 -112
- data/vendor/listen/lib/listen/adapters/darwin.rb +0 -85
- data/vendor/listen/lib/listen/adapters/linux.rb +0 -113
- data/vendor/listen/lib/listen/adapters/polling.rb +0 -67
- data/vendor/listen/lib/listen/adapters/windows.rb +0 -87
- data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
- data/vendor/listen/lib/listen/directory_record.rb +0 -371
- data/vendor/listen/lib/listen/listener.rb +0 -225
- data/vendor/listen/lib/listen/multi_listener.rb +0 -143
- data/vendor/listen/lib/listen/turnstile.rb +0 -28
- data/vendor/listen/lib/listen/version.rb +0 -3
- data/vendor/listen/lib/listen.rb +0 -40
- data/vendor/listen/listen.gemspec +0 -22
- data/vendor/listen/spec/listen/adapter_spec.rb +0 -183
- data/vendor/listen/spec/listen/adapters/bsd_spec.rb +0 -36
- data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -37
- data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -47
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +0 -68
- data/vendor/listen/spec/listen/adapters/windows_spec.rb +0 -30
- data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
- data/vendor/listen/spec/listen/directory_record_spec.rb +0 -1225
- data/vendor/listen/spec/listen/listener_spec.rb +0 -169
- data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
- data/vendor/listen/spec/listen/turnstile_spec.rb +0 -56
- data/vendor/listen/spec/listen_spec.rb +0 -73
- data/vendor/listen/spec/spec_helper.rb +0 -21
- data/vendor/listen/spec/support/adapter_helper.rb +0 -629
- data/vendor/listen/spec/support/directory_record_helper.rb +0 -55
- data/vendor/listen/spec/support/fixtures_helper.rb +0 -29
- data/vendor/listen/spec/support/listeners_helper.rb +0 -156
- data/vendor/listen/spec/support/platform_helper.rb +0 -15
data/test/sass/engine_test.rb
CHANGED
|
@@ -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
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
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
|
-
|
|
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
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1647
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
2611
|
+
/*! color: red */
|
|
2457
2612
|
.foo {
|
|
2458
2613
|
color: red; }
|
|
2459
2614
|
|
|
2460
|
-
|
|
2615
|
+
/*! color: blue */
|
|
2461
2616
|
.foo {
|
|
2462
2617
|
color: blue; }
|
|
2463
2618
|
|
|
2464
|
-
|
|
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
|
-
|
|
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
|