sass 3.3.0.alpha.391 → 3.3.0.alpha.392

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