sass 3.1.5 → 3.1.6
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/sass/cache_stores/base.rb +4 -9
- data/lib/sass/engine.rb +2 -1
- data/lib/sass/environment.rb +11 -0
- data/lib/sass/script/funcall.rb +8 -0
- data/lib/sass/script/interpolation.rb +9 -0
- data/lib/sass/script/list.rb +7 -0
- data/lib/sass/script/literal.rb +5 -0
- data/lib/sass/script/node.rb +8 -0
- data/lib/sass/script/operation.rb +8 -0
- data/lib/sass/script/string_interpolation.rb +9 -0
- data/lib/sass/script/unary_operation.rb +7 -0
- data/lib/sass/script/variable.rb +5 -0
- data/lib/sass/tree/debug_node.rb +1 -6
- data/lib/sass/tree/each_node.rb +1 -7
- data/lib/sass/tree/extend_node.rb +1 -1
- data/lib/sass/tree/for_node.rb +2 -7
- data/lib/sass/tree/function_node.rb +0 -5
- data/lib/sass/tree/if_node.rb +1 -19
- data/lib/sass/tree/mixin_def_node.rb +1 -6
- data/lib/sass/tree/mixin_node.rb +2 -7
- data/lib/sass/tree/node.rb +2 -18
- data/lib/sass/tree/prop_node.rb +0 -5
- data/lib/sass/tree/return_node.rb +1 -6
- data/lib/sass/tree/rule_node.rb +7 -5
- data/lib/sass/tree/variable_node.rb +1 -7
- data/lib/sass/tree/visitors/deep_copy.rb +87 -0
- data/lib/sass/tree/visitors/perform.rb +8 -7
- data/lib/sass/tree/visitors/set_options.rb +97 -0
- data/lib/sass/tree/visitors/to_css.rb +5 -1
- data/lib/sass/tree/warn_node.rb +1 -7
- data/lib/sass/tree/while_node.rb +1 -7
- data/test/sass/cache_test.rb +15 -0
- data/test/sass/engine_test.rb +25 -8
- data/test/sass/scss/scss_test.rb +8 -0
- metadata +201 -199
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1.
|
1
|
+
3.1.6
|
@@ -42,20 +42,15 @@ module Sass
|
|
42
42
|
raise "#{self.class} must implement #_retrieve."
|
43
43
|
end
|
44
44
|
|
45
|
-
# Store
|
45
|
+
# Store a {Sass::Tree::RootNode}.
|
46
46
|
#
|
47
47
|
# @param key [String] The key to store it under.
|
48
48
|
# @param sha [String] The checksum for the contents that are being stored.
|
49
49
|
# @param obj [Object] The object to cache.
|
50
|
-
def store(key, sha,
|
51
|
-
|
52
|
-
begin
|
53
|
-
_store(key, Sass::VERSION, sha, Marshal.dump(obj))
|
54
|
-
ensure
|
55
|
-
obj.after_sass_cache_store(temp) if obj.respond_to?(:after_sass_cache_store)
|
56
|
-
end
|
50
|
+
def store(key, sha, root)
|
51
|
+
_store(key, Sass::VERSION, sha, Marshal.dump(root))
|
57
52
|
rescue TypeError, LoadError => e
|
58
|
-
Sass::Util.sass_warn "Warning. Error encountered while saving
|
53
|
+
Sass::Util.sass_warn "Warning. Error encountered while saving cache #{path_to(key)}: #{e}"
|
59
54
|
end
|
60
55
|
|
61
56
|
# Retrieve a {Sass::Tree::RootNode}.
|
data/lib/sass/engine.rb
CHANGED
@@ -28,6 +28,8 @@ require 'sass/tree/visitors/perform'
|
|
28
28
|
require 'sass/tree/visitors/cssize'
|
29
29
|
require 'sass/tree/visitors/convert'
|
30
30
|
require 'sass/tree/visitors/to_css'
|
31
|
+
require 'sass/tree/visitors/deep_copy'
|
32
|
+
require 'sass/tree/visitors/set_options'
|
31
33
|
require 'sass/tree/visitors/check_nesting'
|
32
34
|
require 'sass/selector'
|
33
35
|
require 'sass/environment'
|
@@ -307,7 +309,6 @@ module Sass
|
|
307
309
|
sha = Digest::SHA1.hexdigest(@template)
|
308
310
|
|
309
311
|
if root = @options[:cache_store].retrieve(key, sha)
|
310
|
-
@options = root.options.merge(@options)
|
311
312
|
root.options = @options
|
312
313
|
return root
|
313
314
|
end
|
data/lib/sass/environment.rb
CHANGED
@@ -93,6 +93,17 @@ module Sass
|
|
93
93
|
@mixins_in_use ||= @parent.mixins_in_use
|
94
94
|
end
|
95
95
|
|
96
|
+
def stack_trace
|
97
|
+
trace = []
|
98
|
+
stack.reverse.each_with_index do |entry, i|
|
99
|
+
msg = "#{i == 0 ? "on" : "from"} line #{entry[:line]}"
|
100
|
+
msg << " of #{entry[:filename] || "an unknown file"}"
|
101
|
+
msg << ", in `#{entry[:mixin]}'" if entry[:mixin]
|
102
|
+
trace << msg
|
103
|
+
end
|
104
|
+
trace
|
105
|
+
end
|
106
|
+
|
96
107
|
private
|
97
108
|
|
98
109
|
def parent_options
|
data/lib/sass/script/funcall.rb
CHANGED
@@ -57,6 +57,14 @@ module Sass
|
|
57
57
|
@args + @keywords.values
|
58
58
|
end
|
59
59
|
|
60
|
+
# @see Node#deep_copy
|
61
|
+
def deep_copy
|
62
|
+
node = dup
|
63
|
+
node.instance_variable_set('@args', args.map {|a| a.deep_copy})
|
64
|
+
node.instance_variable_set('@keywords', Hash[keywords.map {|k, v| [k, v.deep_copy]}])
|
65
|
+
node
|
66
|
+
end
|
67
|
+
|
60
68
|
protected
|
61
69
|
|
62
70
|
# Evaluates the function call.
|
@@ -50,6 +50,15 @@ module Sass::Script
|
|
50
50
|
[@before, @mid, @after].compact
|
51
51
|
end
|
52
52
|
|
53
|
+
# @see Node#deep_copy
|
54
|
+
def deep_copy
|
55
|
+
node = dup
|
56
|
+
node.instance_variable_set('@before', @before.deep_copy) if @before
|
57
|
+
node.instance_variable_set('@mid', @mid.deep_copy)
|
58
|
+
node.instance_variable_set('@after', @after.deep_copy) if @after
|
59
|
+
node
|
60
|
+
end
|
61
|
+
|
53
62
|
protected
|
54
63
|
|
55
64
|
# Evaluates the interpolation.
|
data/lib/sass/script/list.rb
CHANGED
@@ -24,6 +24,13 @@ module Sass::Script
|
|
24
24
|
@separator = separator
|
25
25
|
end
|
26
26
|
|
27
|
+
# @see Node#deep_copy
|
28
|
+
def deep_copy
|
29
|
+
node = dup
|
30
|
+
node.instance_variable_set('@value', value.map {|c| c.deep_copy})
|
31
|
+
node
|
32
|
+
end
|
33
|
+
|
27
34
|
# @see Node#eq
|
28
35
|
def eq(other)
|
29
36
|
Sass::Script::Bool.new(
|
data/lib/sass/script/literal.rb
CHANGED
data/lib/sass/script/node.rb
CHANGED
@@ -57,6 +57,14 @@ module Sass::Script
|
|
57
57
|
Sass::Util.abstract(self)
|
58
58
|
end
|
59
59
|
|
60
|
+
# Returns a deep clone of this node.
|
61
|
+
# The child nodes are cloned, but options are not.
|
62
|
+
#
|
63
|
+
# @return [Node]
|
64
|
+
def deep_copy
|
65
|
+
Sass::Util.abstract(self)
|
66
|
+
end
|
67
|
+
|
60
68
|
protected
|
61
69
|
|
62
70
|
# Converts underscores to dashes if the :dasherize option is set.
|
@@ -55,6 +55,14 @@ module Sass::Script
|
|
55
55
|
[@operand1, @operand2]
|
56
56
|
end
|
57
57
|
|
58
|
+
# @see Node#deep_copy
|
59
|
+
def deep_copy
|
60
|
+
node = dup
|
61
|
+
node.instance_variable_set('@operand1', @operand1.deep_copy)
|
62
|
+
node.instance_variable_set('@operand2', @operand2.deep_copy)
|
63
|
+
node
|
64
|
+
end
|
65
|
+
|
58
66
|
protected
|
59
67
|
|
60
68
|
# Evaluates the operation.
|
@@ -60,6 +60,15 @@ module Sass::Script
|
|
60
60
|
[@before, @mid, @after].compact
|
61
61
|
end
|
62
62
|
|
63
|
+
# @see Node#deep_copy
|
64
|
+
def deep_copy
|
65
|
+
node = dup
|
66
|
+
node.instance_variable_set('@before', @before.deep_copy) if @before
|
67
|
+
node.instance_variable_set('@mid', @mid.deep_copy)
|
68
|
+
node.instance_variable_set('@after', @after.deep_copy) if @after
|
69
|
+
node
|
70
|
+
end
|
71
|
+
|
63
72
|
protected
|
64
73
|
|
65
74
|
# Evaluates the interpolation.
|
data/lib/sass/script/variable.rb
CHANGED
data/lib/sass/tree/debug_node.rb
CHANGED
@@ -6,12 +6,7 @@ module Sass
|
|
6
6
|
class DebugNode < Node
|
7
7
|
# The expression to print.
|
8
8
|
# @return [Script::Node]
|
9
|
-
|
10
|
-
|
11
|
-
# Returns sub nodes that are not tree children.
|
12
|
-
def subnodes
|
13
|
-
Array(expr)
|
14
|
-
end
|
9
|
+
attr_accessor :expr
|
15
10
|
|
16
11
|
# @param expr [Script::Node] The expression to print
|
17
12
|
def initialize(expr)
|
data/lib/sass/tree/each_node.rb
CHANGED
@@ -11,7 +11,7 @@ module Sass::Tree
|
|
11
11
|
|
12
12
|
# The parse tree for the list.
|
13
13
|
# @param [Script::Node]
|
14
|
-
|
14
|
+
attr_accessor :list
|
15
15
|
|
16
16
|
# @param var [String] The name of the loop variable
|
17
17
|
# @param list [Script::Node] The parse tree for the list
|
@@ -20,11 +20,5 @@ module Sass::Tree
|
|
20
20
|
@list = list
|
21
21
|
super()
|
22
22
|
end
|
23
|
-
|
24
|
-
# Returns sub nodes that are not tree children.
|
25
|
-
def subnodes
|
26
|
-
Array(list)
|
27
|
-
end
|
28
|
-
|
29
23
|
end
|
30
24
|
end
|
data/lib/sass/tree/for_node.rb
CHANGED
@@ -11,11 +11,11 @@ module Sass::Tree
|
|
11
11
|
|
12
12
|
# The parse tree for the initial expression.
|
13
13
|
# @return [Script::Node]
|
14
|
-
|
14
|
+
attr_accessor :from
|
15
15
|
|
16
16
|
# The parse tree for the final expression.
|
17
17
|
# @return [Script::Node]
|
18
|
-
|
18
|
+
attr_accessor :to
|
19
19
|
|
20
20
|
# Whether to include `to` in the loop or stop just before.
|
21
21
|
# @return [Boolean]
|
@@ -32,10 +32,5 @@ module Sass::Tree
|
|
32
32
|
@exclusive = exclusive
|
33
33
|
super()
|
34
34
|
end
|
35
|
-
|
36
|
-
# Returns sub nodes that are not tree children.
|
37
|
-
def subnodes
|
38
|
-
Array(from) + Array(to)
|
39
|
-
end
|
40
35
|
end
|
41
36
|
end
|
data/lib/sass/tree/if_node.rb
CHANGED
@@ -13,7 +13,7 @@ module Sass::Tree
|
|
13
13
|
# If this is nil, this is an `@else` node, not an `@else if`.
|
14
14
|
#
|
15
15
|
# @return [Script::Expr]
|
16
|
-
|
16
|
+
attr_accessor :expr
|
17
17
|
|
18
18
|
# The next {IfNode} in the if-else list, or `nil`.
|
19
19
|
#
|
@@ -35,12 +35,6 @@ module Sass::Tree
|
|
35
35
|
@last_else = node
|
36
36
|
end
|
37
37
|
|
38
|
-
# @see Node#options=
|
39
|
-
def options=(options)
|
40
|
-
super
|
41
|
-
self.else.options = options if self.else
|
42
|
-
end
|
43
|
-
|
44
38
|
def _dump(f)
|
45
39
|
Marshal.dump([self.expr, self.else, self.children])
|
46
40
|
end
|
@@ -54,17 +48,5 @@ module Sass::Tree
|
|
54
48
|
node.else ? node.else.instance_variable_get('@last_else') : node)
|
55
49
|
node
|
56
50
|
end
|
57
|
-
|
58
|
-
# @see Node#deep_copy
|
59
|
-
def deep_copy
|
60
|
-
node = super
|
61
|
-
node.else = self.else.deep_copy if self.else
|
62
|
-
node
|
63
|
-
end
|
64
|
-
|
65
|
-
# Returns sub nodes that are not tree children.
|
66
|
-
def subnodes
|
67
|
-
Array(expr) + Array(self.else)
|
68
|
-
end
|
69
51
|
end
|
70
52
|
end
|
@@ -13,7 +13,7 @@ module Sass
|
|
13
13
|
# and the parse tree for the default value of the argument.
|
14
14
|
#
|
15
15
|
# @return [Array<(Script::Node, Script::Node)>]
|
16
|
-
|
16
|
+
attr_accessor :args
|
17
17
|
|
18
18
|
# @param name [String] The mixin name
|
19
19
|
# @param args [Array<(Script::Node, Script::Node)>] See \{#args}
|
@@ -22,11 +22,6 @@ module Sass
|
|
22
22
|
@args = args
|
23
23
|
super()
|
24
24
|
end
|
25
|
-
|
26
|
-
# Returns sub nodes that are not tree children.
|
27
|
-
def subnodes
|
28
|
-
Array(args)
|
29
|
-
end
|
30
25
|
end
|
31
26
|
end
|
32
27
|
end
|
data/lib/sass/tree/mixin_node.rb
CHANGED
@@ -13,11 +13,11 @@ module Sass::Tree
|
|
13
13
|
|
14
14
|
# The arguments to the mixin.
|
15
15
|
# @return [Array<Script::Node>]
|
16
|
-
|
16
|
+
attr_accessor :args
|
17
17
|
|
18
18
|
# A hash from keyword argument names to values.
|
19
19
|
# @return [{String => Script::Node}]
|
20
|
-
|
20
|
+
attr_accessor :keywords
|
21
21
|
|
22
22
|
# @param name [String] The name of the mixin
|
23
23
|
# @param args [Array<Script::Node>] See \{#args}
|
@@ -28,10 +28,5 @@ module Sass::Tree
|
|
28
28
|
@keywords = keywords
|
29
29
|
super()
|
30
30
|
end
|
31
|
-
|
32
|
-
# Returns sub nodes that are not tree children.
|
33
|
-
def subnodes
|
34
|
-
Array(args) + (keywords||{}).values
|
35
|
-
end
|
36
31
|
end
|
37
32
|
end
|
data/lib/sass/tree/node.rb
CHANGED
@@ -65,11 +65,7 @@ module Sass
|
|
65
65
|
# @param options [{Symbol => Object}] The options
|
66
66
|
# @see #options
|
67
67
|
def options=(options)
|
68
|
-
|
69
|
-
if respond_to?(:subnodes)
|
70
|
-
subnodes.each {|n| n.options = options if n.respond_to?(:options=)}
|
71
|
-
end
|
72
|
-
@options = options
|
68
|
+
Sass::Tree::Visitors::SetOptions.visit(self, options)
|
73
69
|
end
|
74
70
|
|
75
71
|
# @private
|
@@ -188,19 +184,7 @@ module Sass
|
|
188
184
|
#
|
189
185
|
# @return [Node]
|
190
186
|
def deep_copy
|
191
|
-
|
192
|
-
node.children = children.map {|c| c.deep_copy}
|
193
|
-
node
|
194
|
-
end
|
195
|
-
|
196
|
-
def before_sass_cache_store
|
197
|
-
o = self.options
|
198
|
-
self.options = {}
|
199
|
-
return o
|
200
|
-
end
|
201
|
-
|
202
|
-
def after_sass_cache_store(o)
|
203
|
-
self.options = o
|
187
|
+
Sass::Tree::Visitors::DeepCopy.visit(self)
|
204
188
|
end
|
205
189
|
|
206
190
|
protected
|
data/lib/sass/tree/prop_node.rb
CHANGED
@@ -55,11 +55,6 @@ module Sass::Tree
|
|
55
55
|
super()
|
56
56
|
end
|
57
57
|
|
58
|
-
# Returns sub nodes that are not tree children.
|
59
|
-
def subnodes
|
60
|
-
Array(name).select{|n| n.is_a?(Sass::Script::Node)} + [value]
|
61
|
-
end
|
62
|
-
|
63
58
|
# Compares the names and values of two properties.
|
64
59
|
#
|
65
60
|
# @param other [Object] The object to compare with
|
@@ -6,18 +6,13 @@ module Sass
|
|
6
6
|
class ReturnNode < Node
|
7
7
|
# The expression to return.
|
8
8
|
# @type [Script::Node]
|
9
|
-
|
9
|
+
attr_accessor :expr
|
10
10
|
|
11
11
|
# @param expr [Script::Node] The expression to return
|
12
12
|
def initialize(expr)
|
13
13
|
@expr = expr
|
14
14
|
super()
|
15
15
|
end
|
16
|
-
|
17
|
-
# Returns sub nodes that are not tree children.
|
18
|
-
def subnodes
|
19
|
-
Array(expr)
|
20
|
-
end
|
21
16
|
end
|
22
17
|
end
|
23
18
|
end
|
data/lib/sass/tree/rule_node.rb
CHANGED
@@ -50,6 +50,13 @@ module Sass::Tree
|
|
50
50
|
# @return [Boolean]
|
51
51
|
attr_accessor :group_end
|
52
52
|
|
53
|
+
# The stack trace.
|
54
|
+
# This is only readable in a CSS tree as it is written during the perform step
|
55
|
+
# and only when the :trace_selectors option is set.
|
56
|
+
#
|
57
|
+
# @return [Array<String>]
|
58
|
+
attr_accessor :stack_trace
|
59
|
+
|
53
60
|
# @param rule [Array<String, Sass::Script::Node>]
|
54
61
|
# The CSS rule. See \{#rule}
|
55
62
|
def initialize(rule)
|
@@ -115,11 +122,6 @@ module Sass::Tree
|
|
115
122
|
:line => self.line}
|
116
123
|
end
|
117
124
|
|
118
|
-
# Returns sub nodes that are not tree children.
|
119
|
-
def subnodes
|
120
|
-
rule.select{|r| r.is_a?(Sass::Script::Node)}
|
121
|
-
end
|
122
|
-
|
123
125
|
private
|
124
126
|
|
125
127
|
def try_to_parse_non_interpolated_rules
|