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 CHANGED
@@ -1 +1 @@
1
- 8a52009908c0e749c18e10c4a62e792c4f70f024
1
+ 7cd0572b56d7915a0b3af53d6776fa3f7fd10317
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.3.0.alpha.391
1
+ 3.3.0.alpha.392
@@ -1 +1 @@
1
- 11 October 2013 23:20:43 GMT
1
+ 12 October 2013 15:27:22 GMT
@@ -736,11 +736,15 @@ WARNING
736
736
  end
737
737
 
738
738
  def parse_variable(line)
739
- name, value, default = line.text.scan(Script::MATCH)[0]
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)
@@ -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
 
@@ -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*(.+?)(!(?i:default))?$/
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}$/
@@ -598,8 +598,19 @@ module Sass
598
598
  ss; tok!(/:/); ss
599
599
 
600
600
  expr = sass_script(:parse)
601
- guarded = tok(DEFAULT)
602
- result = Sass::Tree::VariableNode.new(name, expr, guarded)
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
 
@@ -94,7 +94,6 @@ module Sass
94
94
  HASH = /##{NAME}/
95
95
 
96
96
  IMPORTANT = /!#{W}important/i
97
- DEFAULT = /!#{W}default/i
98
97
 
99
98
  NUMBER = /#{NUM}(?:#{IDENT}|%)?/
100
99
 
@@ -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
- def initialize(name, expr, guarded)
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
- var = @environment.var(node.name)
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
- @environment.set_var(node.name, val)
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 = {})
@@ -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
- a
1722
- $var_hyphen: 1 + $var_hyphen
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
@@ -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
@@ -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: 592302083
4
+ hash: 592302109
5
5
  prerelease: 6
6
6
  segments:
7
7
  - 3
8
8
  - 3
9
9
  - 0
10
10
  - alpha
11
- - 391
12
- version: 3.3.0.alpha.391
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-11 00:00:00 -04:00
22
+ date: 2013-10-12 00:00:00 -04:00
23
23
  default_executable:
24
24
  dependencies:
25
25
  - !ruby/object:Gem::Dependency