sass 3.3.0.alpha.391 → 3.3.0.alpha.392
Sign up to get free protection for your applications and to get access to all the features.
- data/REVISION +1 -1
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/lib/sass/engine.rb +6 -2
- data/lib/sass/environment.rb +5 -0
- data/lib/sass/script.rb +2 -1
- data/lib/sass/scss/parser.rb +13 -2
- data/lib/sass/scss/rx.rb +0 -1
- data/lib/sass/tree/variable_node.rb +7 -1
- data/lib/sass/tree/visitors/convert.rb +1 -1
- data/lib/sass/tree/visitors/perform.rb +18 -2
- data/test/sass/conversion_test.rb +17 -0
- data/test/sass/engine_test.rb +24 -10
- data/test/sass/script_test.rb +99 -0
- data/test/sass/scss/scss_test.rb +2 -2
- data/test/sass/source_map_test.rb +2 -2
- metadata +4 -4
data/REVISION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
7cd0572b56d7915a0b3af53d6776fa3f7fd10317
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.3.0.alpha.
|
1
|
+
3.3.0.alpha.392
|
data/VERSION_DATE
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
12 October 2013 15:27:22 GMT
|
data/lib/sass/engine.rb
CHANGED
@@ -736,11 +736,15 @@ WARNING
|
|
736
736
|
end
|
737
737
|
|
738
738
|
def parse_variable(line)
|
739
|
-
name, value,
|
739
|
+
name, value, flags = line.text.scan(Script::MATCH)[0]
|
740
740
|
raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath variable declarations.",
|
741
741
|
:line => @line + 1) unless line.children.empty?
|
742
742
|
raise SyntaxError.new("Invalid variable: \"#{line.text}\".",
|
743
743
|
:line => @line) unless name && value
|
744
|
+
flags = flags ? flags.split(/\s+/) : []
|
745
|
+
if (invalid_flag = flags.find {|f| f != '!default' && f != '!global'})
|
746
|
+
raise SyntaxError.new("Invalid flag \"#{invalid_flag}\".", :line => @line)
|
747
|
+
end
|
744
748
|
|
745
749
|
# This workaround is needed for the case when the variable value is part of the identifier,
|
746
750
|
# otherwise we end up with the offset equal to the value index inside the name:
|
@@ -749,7 +753,7 @@ WARNING
|
|
749
753
|
index = line.text.index(value, line.offset + var_lhs_length) || 0
|
750
754
|
expr = parse_script(value, :offset => to_parser_offset(line.offset + index))
|
751
755
|
|
752
|
-
Tree::VariableNode.new(name, expr, default)
|
756
|
+
Tree::VariableNode.new(name, expr, flags.include?('!default'), flags.include?('!global'))
|
753
757
|
end
|
754
758
|
|
755
759
|
def parse_comment(line)
|
data/lib/sass/environment.rb
CHANGED
@@ -21,6 +21,11 @@ module Sass
|
|
21
21
|
(@#{name}s && @#{name}s[name]) || @parent && @parent._#{name}(name)
|
22
22
|
end
|
23
23
|
protected :_#{name}
|
24
|
+
|
25
|
+
def is_#{name}_global?(name)
|
26
|
+
return !@parent if @#{name}s && @#{name}s.has_key?(name)
|
27
|
+
@parent && @parent.is_#{name}_global?(name)
|
28
|
+
end
|
24
29
|
RUBY
|
25
30
|
end
|
26
31
|
|
data/lib/sass/script.rb
CHANGED
@@ -7,7 +7,8 @@ module Sass
|
|
7
7
|
# This module contains code that handles the parsing and evaluation of SassScript.
|
8
8
|
module Script
|
9
9
|
# The regular expression used to parse variables.
|
10
|
-
MATCH = /^\$(#{Sass::SCSS::RX::IDENT})\s*:\s*(.+?)
|
10
|
+
MATCH = /^\$(#{Sass::SCSS::RX::IDENT})\s*:\s*(.+?)
|
11
|
+
(!#{Sass::SCSS::RX::IDENT}(?:\s+!#{Sass::SCSS::RX::IDENT})*)?$/x
|
11
12
|
|
12
13
|
# The regular expression used to validate variables without matching.
|
13
14
|
VALIDATE = /^\$#{Sass::SCSS::RX::IDENT}$/
|
data/lib/sass/scss/parser.rb
CHANGED
@@ -598,8 +598,19 @@ module Sass
|
|
598
598
|
ss; tok!(/:/); ss
|
599
599
|
|
600
600
|
expr = sass_script(:parse)
|
601
|
-
|
602
|
-
|
601
|
+
while tok(/!/)
|
602
|
+
flag_name = tok!(IDENT)
|
603
|
+
if flag_name == 'default'
|
604
|
+
guarded ||= true
|
605
|
+
elsif flag_name == 'global'
|
606
|
+
global ||= true
|
607
|
+
else
|
608
|
+
raise Sass::SyntaxError.new("Invalid flag \"!#{flag_name}\".", :line => @line)
|
609
|
+
end
|
610
|
+
ss
|
611
|
+
end
|
612
|
+
|
613
|
+
result = Sass::Tree::VariableNode.new(name, expr, guarded, global)
|
603
614
|
node(result, start_pos)
|
604
615
|
end
|
605
616
|
|
data/lib/sass/scss/rx.rb
CHANGED
@@ -16,13 +16,19 @@ module Sass
|
|
16
16
|
# @return [Boolean]
|
17
17
|
attr_reader :guarded
|
18
18
|
|
19
|
+
# Whether this is a global variable assignment (`!global`).
|
20
|
+
# @return [Boolean]
|
21
|
+
attr_reader :global
|
22
|
+
|
19
23
|
# @param name [String] The name of the variable
|
20
24
|
# @param expr [Script::Tree::Node] See \{#expr}
|
21
25
|
# @param guarded [Boolean] See \{#guarded}
|
22
|
-
|
26
|
+
# @param global [Boolean] See \{#global}
|
27
|
+
def initialize(name, expr, guarded, global)
|
23
28
|
@name = name
|
24
29
|
@expr = expr
|
25
30
|
@guarded = guarded
|
31
|
+
@global = global
|
26
32
|
super()
|
27
33
|
end
|
28
34
|
end
|
@@ -253,7 +253,7 @@ class Sass::Tree::Visitors::Convert < Sass::Tree::Visitors::Base
|
|
253
253
|
|
254
254
|
def visit_variable(node)
|
255
255
|
"#{tab_str}$#{dasherize(node.name)}: #{node.expr.to_sass(@options)}" +
|
256
|
-
"#{' !default' if node.guarded}#{semi}\n"
|
256
|
+
"#{' !global' if node.global}#{' !default' if node.guarded}#{semi}\n"
|
257
257
|
end
|
258
258
|
|
259
259
|
def visit_warn(node)
|
@@ -416,7 +416,23 @@ class Sass::Tree::Visitors::Perform < Sass::Tree::Visitors::Base
|
|
416
416
|
|
417
417
|
# Loads the new variable value into the environment.
|
418
418
|
def visit_variable(node)
|
419
|
-
|
419
|
+
env = @environment
|
420
|
+
if node.global
|
421
|
+
env = env.global_env
|
422
|
+
elsif env.parent && env.is_var_global?(node.name)
|
423
|
+
var_expr = "$#{node.name}: #{node.expr.to_sass(env.options)} !global"
|
424
|
+
var_expr << " !default" if node.guarded
|
425
|
+
location = "on line #{node.line}"
|
426
|
+
location << " of #{node.filename}" if node.filename
|
427
|
+
Sass::Util.sass_warn <<WARNING
|
428
|
+
DEPRECATION WARNING #{location}:
|
429
|
+
Assigning to global variable "$#{node.name}" by default is deprecated.
|
430
|
+
In future versions of Sass, this will create a new local variable.
|
431
|
+
If you want to assign to the global variable, use "#{var_expr}" instead.
|
432
|
+
WARNING
|
433
|
+
end
|
434
|
+
|
435
|
+
var = env.var(node.name)
|
420
436
|
return [] if node.guarded && var && !var.null?
|
421
437
|
val = node.expr.perform(@environment)
|
422
438
|
if node.expr.source_range
|
@@ -424,7 +440,7 @@ class Sass::Tree::Visitors::Perform < Sass::Tree::Visitors::Base
|
|
424
440
|
else
|
425
441
|
val.source_range = node.source_range
|
426
442
|
end
|
427
|
-
|
443
|
+
env.set_var(node.name, val)
|
428
444
|
[]
|
429
445
|
end
|
430
446
|
|
@@ -1893,6 +1893,23 @@ foo {
|
|
1893
1893
|
SCSS
|
1894
1894
|
end
|
1895
1895
|
|
1896
|
+
def test_variable_with_global
|
1897
|
+
assert_renders(<<SASS, <<SCSS)
|
1898
|
+
$var: 1
|
1899
|
+
|
1900
|
+
foo
|
1901
|
+
$var: 2 !global
|
1902
|
+
$var: 3 !global !default
|
1903
|
+
SASS
|
1904
|
+
$var: 1;
|
1905
|
+
|
1906
|
+
foo {
|
1907
|
+
$var: 2 !global;
|
1908
|
+
$var: 3 !global !default;
|
1909
|
+
}
|
1910
|
+
SCSS
|
1911
|
+
end
|
1912
|
+
|
1896
1913
|
private
|
1897
1914
|
|
1898
1915
|
def assert_sass_to_sass(sass, options = {})
|
data/test/sass/engine_test.rb
CHANGED
@@ -1579,7 +1579,7 @@ $a: 5
|
|
1579
1579
|
@while $a != 0
|
1580
1580
|
a-\#{$a}
|
1581
1581
|
blooble: gloop
|
1582
|
-
$a: $a - 1
|
1582
|
+
$a: $a - 1 !global
|
1583
1583
|
SASS
|
1584
1584
|
end
|
1585
1585
|
|
@@ -1673,8 +1673,8 @@ a {
|
|
1673
1673
|
b: 1;
|
1674
1674
|
c: 2; }
|
1675
1675
|
CSS
|
1676
|
-
$a: 1
|
1677
1676
|
a
|
1677
|
+
$a: 1
|
1678
1678
|
b: $a
|
1679
1679
|
$a: 2
|
1680
1680
|
c: $a
|
@@ -1682,7 +1682,7 @@ SASS
|
|
1682
1682
|
end
|
1683
1683
|
|
1684
1684
|
def test_variable_scope
|
1685
|
-
assert_equal(<<CSS, render(<<SASS))
|
1685
|
+
silence_warnings {assert_equal(<<CSS, render(<<SASS))}
|
1686
1686
|
a {
|
1687
1687
|
b-1: c;
|
1688
1688
|
b-2: c;
|
@@ -1708,9 +1708,6 @@ SASS
|
|
1708
1708
|
|
1709
1709
|
def test_hyphen_underscore_insensitive_variables
|
1710
1710
|
assert_equal(<<CSS, render(<<SASS))
|
1711
|
-
a {
|
1712
|
-
b: c; }
|
1713
|
-
|
1714
1711
|
d {
|
1715
1712
|
e: 13;
|
1716
1713
|
f: foobar; }
|
@@ -1718,10 +1715,8 @@ CSS
|
|
1718
1715
|
$var-hyphen: 12
|
1719
1716
|
$var_under: foo
|
1720
1717
|
|
1721
|
-
|
1722
|
-
|
1723
|
-
$var-under: $var-under + bar
|
1724
|
-
b: c
|
1718
|
+
$var_hyphen: 1 + $var_hyphen
|
1719
|
+
$var-under: $var-under + bar
|
1725
1720
|
|
1726
1721
|
d
|
1727
1722
|
e: $var-hyphen
|
@@ -2489,6 +2484,25 @@ CSS
|
|
2489
2484
|
SASS
|
2490
2485
|
end
|
2491
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
|
+
|
2492
2506
|
# Regression tests
|
2493
2507
|
|
2494
2508
|
def test_list_separator_with_arg_list
|
data/test/sass/script_test.rb
CHANGED
@@ -585,6 +585,105 @@ SASS
|
|
585
585
|
assert_equal ".bar", resolve("nth(nth(&, 1), 3)", {}, env)
|
586
586
|
end
|
587
587
|
|
588
|
+
def test_setting_global_variable_locally_warns
|
589
|
+
assert_warning(<<WARNING) {assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))}
|
590
|
+
DEPRECATION WARNING on line 4 of test_setting_global_variable_locally_warns_inline.scss:
|
591
|
+
Assigning to global variable "$var" by default is deprecated.
|
592
|
+
In future versions of Sass, this will create a new local variable.
|
593
|
+
If you want to assign to the global variable, use "$var: x !global" instead.
|
594
|
+
WARNING
|
595
|
+
.foo {
|
596
|
+
a: x; }
|
597
|
+
|
598
|
+
.bar {
|
599
|
+
b: x; }
|
600
|
+
CSS
|
601
|
+
$var: 1;
|
602
|
+
|
603
|
+
.foo {
|
604
|
+
$var: x;
|
605
|
+
a: $var;
|
606
|
+
}
|
607
|
+
|
608
|
+
.bar {
|
609
|
+
b: $var;
|
610
|
+
}
|
611
|
+
SCSS
|
612
|
+
end
|
613
|
+
|
614
|
+
def test_setting_global_variable_globally
|
615
|
+
assert_no_warning {assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))}
|
616
|
+
.foo {
|
617
|
+
a: 1; }
|
618
|
+
|
619
|
+
.bar {
|
620
|
+
b: 2; }
|
621
|
+
CSS
|
622
|
+
$var: 1;
|
623
|
+
|
624
|
+
.foo {
|
625
|
+
a: $var;
|
626
|
+
}
|
627
|
+
|
628
|
+
$var: 2;
|
629
|
+
|
630
|
+
.bar {
|
631
|
+
b: $var;
|
632
|
+
}
|
633
|
+
SCSS
|
634
|
+
end
|
635
|
+
|
636
|
+
def test_setting_global_variable_with_flag
|
637
|
+
assert_no_warning {assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))}
|
638
|
+
.bar {
|
639
|
+
a: x;
|
640
|
+
b: y;
|
641
|
+
c: z; }
|
642
|
+
CSS
|
643
|
+
$var1: 1;
|
644
|
+
$var3: 3;
|
645
|
+
|
646
|
+
.foo {
|
647
|
+
$var1: x !global;
|
648
|
+
$var2: y !global;
|
649
|
+
@each $var3 in _ {
|
650
|
+
$var3: z !global;
|
651
|
+
}
|
652
|
+
}
|
653
|
+
|
654
|
+
.bar {
|
655
|
+
a: $var1;
|
656
|
+
b: $var2;
|
657
|
+
c: $var3;
|
658
|
+
}
|
659
|
+
SCSS
|
660
|
+
end
|
661
|
+
|
662
|
+
def test_setting_global_variable_with_flag_and_default
|
663
|
+
assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))
|
664
|
+
.bar {
|
665
|
+
a: 1;
|
666
|
+
b: y;
|
667
|
+
c: z; }
|
668
|
+
CSS
|
669
|
+
$var1: 1;
|
670
|
+
|
671
|
+
.foo {
|
672
|
+
$var1: x !global !default;
|
673
|
+
$var2: y !global !default;
|
674
|
+
@each $var3 in _ {
|
675
|
+
$var3: z !global !default;
|
676
|
+
}
|
677
|
+
}
|
678
|
+
|
679
|
+
.bar {
|
680
|
+
a: $var1;
|
681
|
+
b: $var2;
|
682
|
+
c: $var3;
|
683
|
+
}
|
684
|
+
SCSS
|
685
|
+
end
|
686
|
+
|
588
687
|
# Regression Tests
|
589
688
|
|
590
689
|
def test_funcall_has_higher_precedence_than_color_name
|
data/test/sass/scss/scss_test.rb
CHANGED
@@ -229,7 +229,7 @@ $i: 1;
|
|
229
229
|
.foo {
|
230
230
|
@while $i != 5 {
|
231
231
|
a: $i;
|
232
|
-
$i: $i + 1;
|
232
|
+
$i: $i + 1 !global;
|
233
233
|
}
|
234
234
|
}
|
235
235
|
SCSS
|
@@ -2639,7 +2639,7 @@ SCSS
|
|
2639
2639
|
CSS
|
2640
2640
|
$var: null;
|
2641
2641
|
.foo {
|
2642
|
-
$var:
|
2642
|
+
$var: & !global;
|
2643
2643
|
}
|
2644
2644
|
|
2645
2645
|
.bar {
|
@@ -488,7 +488,7 @@ CSS
|
|
488
488
|
$i: 6;
|
489
489
|
@while $i > 0 {
|
490
490
|
{{1}}{{4}}{{7}}.item-#{$i} {{/1}}{{/4}}{{/7}}{ {{2}}{{5}}{{8}}width{{/2}}{{/5}}{{/8}}: {{3}}{{6}}{{9}}2em * $i{{/3}}{{/6}}{{/9}}; }
|
491
|
-
$i: $i - 2;
|
491
|
+
$i: $i - 2 !global;
|
492
492
|
}
|
493
493
|
SCSS
|
494
494
|
{{1}}.item-6{{/1}} {
|
@@ -510,7 +510,7 @@ $i: 6
|
|
510
510
|
@while $i > 0
|
511
511
|
{{1}}{{4}}{{7}}.item-#{$i}{{/1}}{{/4}}{{/7}}
|
512
512
|
{{2}}{{5}}{{8}}width{{/2}}{{/5}}{{/8}}: {{3}}{{6}}{{9}}2em * $i{{/3}}{{/6}}{{/9}}
|
513
|
-
$i: $i - 2
|
513
|
+
$i: $i - 2 !global
|
514
514
|
SASS
|
515
515
|
{{1}}.item-6{{/1}} {
|
516
516
|
{{2}}width{{/2}}: {{3}}12em{{/3}}; }
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sass
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 592302109
|
5
5
|
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 3
|
8
8
|
- 3
|
9
9
|
- 0
|
10
10
|
- alpha
|
11
|
-
-
|
12
|
-
version: 3.3.0.alpha.
|
11
|
+
- 392
|
12
|
+
version: 3.3.0.alpha.392
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Nathan Weizenbaum
|
@@ -19,7 +19,7 @@ autorequire:
|
|
19
19
|
bindir: bin
|
20
20
|
cert_chain: []
|
21
21
|
|
22
|
-
date: 2013-10-
|
22
|
+
date: 2013-10-12 00:00:00 -04:00
|
23
23
|
default_executable:
|
24
24
|
dependencies:
|
25
25
|
- !ruby/object:Gem::Dependency
|