sass 3.1.10 → 3.1.11
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/sass/importers/filesystem.rb +1 -1
- data/lib/sass/plugin.rb +4 -8
- data/lib/sass/plugin/compiler.rb +42 -17
- data/lib/sass/plugin/configuration.rb +0 -2
- data/lib/sass/script/funcall.rb +6 -1
- data/lib/sass/script/functions.rb +1 -1
- data/lib/sass/script/parser.rb +12 -5
- data/lib/sass/scss/parser.rb +1 -1
- data/lib/sass/scss/rx.rb +1 -0
- data/lib/sass/tree/visitors/check_nesting.rb +17 -18
- data/lib/sass/util.rb +4 -1
- data/test/sass/engine_test.rb +12 -0
- data/test/sass/importer_test.rb +7 -0
- data/test/sass/plugin_test.rb +16 -13
- data/test/sass/script_conversion_test.rb +2 -0
- data/test/sass/script_test.rb +18 -0
- data/test/sass/scss/scss_test.rb +9 -0
- data/test/sass/test_helper.rb +1 -1
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1.
|
1
|
+
3.1.11
|
@@ -108,7 +108,7 @@ module Sass
|
|
108
108
|
# @return [(String, Symbol)] A filename-syntax pair.
|
109
109
|
def find_real_file(dir, name)
|
110
110
|
for (f,s) in possible_files(remove_root(name))
|
111
|
-
path = (dir == ".") ? f : "#{dir}/#{f}"
|
111
|
+
path = (dir == "." || Pathname.new(f).absolute?) ? f : "#{dir}/#{f}"
|
112
112
|
if full_path = Dir[path].first
|
113
113
|
full_path.gsub!(REDUNDANT_DIRECTORY,File::SEPARATOR)
|
114
114
|
return full_path, s
|
data/lib/sass/plugin.rb
CHANGED
@@ -92,14 +92,10 @@ module Sass
|
|
92
92
|
# the second is the location of the CSS file that it should be compiled to.
|
93
93
|
# @see #update_stylesheets
|
94
94
|
def force_update_stylesheets(individual_files = [])
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
options[:cache] = false
|
100
|
-
update_stylesheets(individual_files)
|
101
|
-
ensure
|
102
|
-
self.options = old_options
|
95
|
+
Compiler.new(options.dup.merge(
|
96
|
+
:never_update => false,
|
97
|
+
:always_update => true,
|
98
|
+
:cache => false)).update_stylesheets(individual_files)
|
103
99
|
end
|
104
100
|
|
105
101
|
# All other method invocations are proxied to the \{#compiler}.
|
data/lib/sass/plugin/compiler.rb
CHANGED
@@ -38,7 +38,7 @@ module Sass::Plugin
|
|
38
38
|
self.options.merge!(options)
|
39
39
|
end
|
40
40
|
|
41
|
-
# Register a callback to be run
|
41
|
+
# Register a callback to be run after stylesheets are mass-updated.
|
42
42
|
# This is run whenever \{#update\_stylesheets} is called,
|
43
43
|
# unless the \{file:SASS_REFERENCE.md#never_update-option `:never_update` option}
|
44
44
|
# is enabled.
|
@@ -51,6 +51,22 @@ module Sass::Plugin
|
|
51
51
|
# the second is the target CSS file.
|
52
52
|
define_callback :updating_stylesheets
|
53
53
|
|
54
|
+
# Register a callback to be run after a single stylesheet is updated.
|
55
|
+
# The callback is only run if the stylesheet is really updated;
|
56
|
+
# if the CSS file is fresh, this won't be run.
|
57
|
+
#
|
58
|
+
# Even if the \{file:SASS_REFERENCE.md#full_exception-option `:full_exception` option}
|
59
|
+
# is enabled, this callback won't be run
|
60
|
+
# when an exception CSS file is being written.
|
61
|
+
# To run an action for those files, use \{#on\_compilation\_error}.
|
62
|
+
#
|
63
|
+
# @yield [template, css]
|
64
|
+
# @yieldparam template [String]
|
65
|
+
# The location of the Sass/SCSS file being updated.
|
66
|
+
# @yieldparam css [String]
|
67
|
+
# The location of the CSS file being generated.
|
68
|
+
define_callback :updated_stylesheet
|
69
|
+
|
54
70
|
# Register a callback to be run before a single stylesheet is updated.
|
55
71
|
# The callback is only run if the stylesheet is guaranteed to be updated;
|
56
72
|
# if the CSS file is fresh, this won't be run.
|
@@ -67,6 +83,13 @@ module Sass::Plugin
|
|
67
83
|
# The location of the CSS file being generated.
|
68
84
|
define_callback :updating_stylesheet
|
69
85
|
|
86
|
+
def on_updating_stylesheet_with_deprecation_warning(&block)
|
87
|
+
Sass::Util.sass_warn("Sass::Compiler#on_updating_stylesheet callback is deprecated and will be removed in a future release. Use Sass::Compiler#on_updated_stylesheet instead, which is run after stylesheet compilation.")
|
88
|
+
on_updating_stylesheet_without_deprecation_warning(&block)
|
89
|
+
end
|
90
|
+
alias_method :on_updating_stylesheet_without_deprecation_warning, :on_updating_stylesheet
|
91
|
+
alias_method :on_updating_stylesheet, :on_updating_stylesheet_with_deprecation_warning
|
92
|
+
|
70
93
|
# Register a callback to be run when Sass decides not to update a stylesheet.
|
71
94
|
# In particular, the callback is run when Sass finds that
|
72
95
|
# the template file and none of its dependencies
|
@@ -160,28 +183,25 @@ module Sass::Plugin
|
|
160
183
|
# The first string in each pair is the location of the Sass/SCSS file,
|
161
184
|
# the second is the location of the CSS file that it should be compiled to.
|
162
185
|
def update_stylesheets(individual_files = [])
|
163
|
-
run_updating_stylesheets individual_files
|
164
186
|
Sass::Plugin.checked_for_updates = true
|
165
187
|
staleness_checker = StalenessChecker.new(engine_options)
|
166
188
|
|
167
|
-
individual_files.each do |t, c|
|
168
|
-
if options[:always_update] || staleness_checker.stylesheet_needs_update?(c, t)
|
169
|
-
update_stylesheet(t, c)
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
189
|
template_location_array.each do |template_location, css_location|
|
174
|
-
|
175
190
|
Dir.glob(File.join(template_location, "**", "[^_]*.s[ca]ss")).sort.each do |file|
|
176
191
|
# Get the relative path to the file
|
177
192
|
name = file.sub(template_location.to_s.sub(/\/*$/, '/'), "")
|
178
193
|
css = css_filename(name, css_location)
|
194
|
+
individual_files << [file, css]
|
195
|
+
end
|
196
|
+
end
|
179
197
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
198
|
+
run_updating_stylesheets individual_files
|
199
|
+
|
200
|
+
individual_files.each do |file, css|
|
201
|
+
if options[:always_update] || staleness_checker.stylesheet_needs_update?(css, file)
|
202
|
+
update_stylesheet(file, css)
|
203
|
+
else
|
204
|
+
run_not_updating_stylesheet(file, css)
|
185
205
|
end
|
186
206
|
end
|
187
207
|
end
|
@@ -318,18 +338,23 @@ module Sass::Plugin
|
|
318
338
|
engine_opts = engine_options(:css_filename => css, :filename => filename)
|
319
339
|
result = Sass::Engine.for_file(filename, engine_opts).render
|
320
340
|
rescue Exception => e
|
341
|
+
compilation_error_occured = true
|
321
342
|
run_compilation_error e, filename, css
|
322
343
|
result = Sass::SyntaxError.exception_to_css(e, options)
|
323
344
|
else
|
324
345
|
run_updating_stylesheet filename, css
|
325
346
|
end
|
326
347
|
|
327
|
-
|
348
|
+
write_file(css, result)
|
349
|
+
run_updated_stylesheet(filename, css) unless compilation_error_occured
|
350
|
+
end
|
351
|
+
|
352
|
+
def write_file(css, content)
|
328
353
|
flag = 'w'
|
329
354
|
flag = 'wb' if Sass::Util.windows? && options[:unix_newlines]
|
330
355
|
File.open(css, flag) do |file|
|
331
|
-
file.set_encoding(
|
332
|
-
file.print(
|
356
|
+
file.set_encoding(content.encoding) unless Sass::Util.ruby1_8?
|
357
|
+
file.print(content)
|
333
358
|
end
|
334
359
|
end
|
335
360
|
|
data/lib/sass/script/funcall.rb
CHANGED
@@ -88,7 +88,12 @@ module Sass
|
|
88
88
|
opts(Functions::EvaluationContext.new(environment.options).send(ruby_name, *args))
|
89
89
|
end
|
90
90
|
rescue ArgumentError => e
|
91
|
-
|
91
|
+
# If this is a legitimate Ruby-raised argument error, re-raise it.
|
92
|
+
# Otherwise, it's an error in the user's stylesheet, so wrap it.
|
93
|
+
if e.message =~ /^wrong number of arguments \(\d+ for \d+\)/ &&
|
94
|
+
e.backtrace[0] !~ /:in `(block in )?#{ruby_name}'$/
|
95
|
+
raise e
|
96
|
+
end
|
92
97
|
raise Sass::SyntaxError.new("#{e.message} for `#{name}'")
|
93
98
|
end
|
94
99
|
|
@@ -93,7 +93,7 @@ module Sass::Script
|
|
93
93
|
# \{#adjust_color adjust-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\]}
|
94
94
|
# : Increase or decrease any of the components of a color.
|
95
95
|
#
|
96
|
-
# \{#scale_color scale-color($color, \[$red\], \[$green\], \[$blue\], \[$
|
96
|
+
# \{#scale_color scale-color($color, \[$red\], \[$green\], \[$blue\], \[$saturation\], \[$lightness\], \[$alpha\]}
|
97
97
|
# : Fluidly scale one or more components of a color.
|
98
98
|
#
|
99
99
|
# \{#change_color change-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\]}
|
data/lib/sass/script/parser.rb
CHANGED
@@ -182,7 +182,11 @@ module Sass
|
|
182
182
|
interp = try_ops_after_interp(#{ops.inspect}, #{name.inspect}) and return interp
|
183
183
|
return unless e = #{sub}
|
184
184
|
while tok = try_tok(#{ops.map {|o| o.inspect}.join(', ')})
|
185
|
-
interp = try_op_before_interp(tok, e)
|
185
|
+
if interp = try_op_before_interp(tok, e)
|
186
|
+
return interp unless other_interp = try_ops_after_interp(#{ops.inspect}, #{name.inspect}, interp)
|
187
|
+
return other_interp
|
188
|
+
end
|
189
|
+
|
186
190
|
line = @lexer.line
|
187
191
|
e = Operation.new(e, assert_expr(#{sub.inspect}), tok.type)
|
188
192
|
e.line = line
|
@@ -217,7 +221,10 @@ RUBY
|
|
217
221
|
return unless e = interpolation
|
218
222
|
arr = [e]
|
219
223
|
while tok = try_tok(:comma)
|
220
|
-
interp = try_op_before_interp(tok, e)
|
224
|
+
if interp = try_op_before_interp(tok, e)
|
225
|
+
return interp unless other_interp = try_ops_after_interp([:comma], :expr, interp)
|
226
|
+
return other_interp
|
227
|
+
end
|
221
228
|
arr << assert_expr(:interpolation)
|
222
229
|
end
|
223
230
|
arr.size == 1 ? arr.first : node(List.new(arr, :comma), line)
|
@@ -235,15 +242,15 @@ RUBY
|
|
235
242
|
interpolation(interp)
|
236
243
|
end
|
237
244
|
|
238
|
-
def try_ops_after_interp(ops, name)
|
245
|
+
def try_ops_after_interp(ops, name, prev = nil)
|
239
246
|
return unless @lexer.after_interpolation?
|
240
247
|
return unless op = try_tok(*ops)
|
241
|
-
interp = try_op_before_interp(op) and return interp
|
248
|
+
interp = try_op_before_interp(op, prev) and return interp
|
242
249
|
|
243
250
|
wa = @lexer.whitespace?
|
244
251
|
str = Script::String.new(Lexer::OPERATORS_REVERSE[op.type])
|
245
252
|
str.line = @lexer.line
|
246
|
-
interp = Script::Interpolation.new(
|
253
|
+
interp = Script::Interpolation.new(prev, str, assert_expr(name), !:wb, wa, :originally_text)
|
247
254
|
interp.line = @lexer.line
|
248
255
|
return interp
|
249
256
|
end
|
data/lib/sass/scss/parser.rb
CHANGED
@@ -770,7 +770,7 @@ MESSAGE
|
|
770
770
|
end
|
771
771
|
|
772
772
|
def interp_ident(start = IDENT)
|
773
|
-
return unless val = tok(start) || interpolation
|
773
|
+
return unless val = tok(start) || interpolation || tok(IDENT_HYPHEN_INTERP)
|
774
774
|
res = [val]
|
775
775
|
while val = tok(NAME) || interpolation
|
776
776
|
res << val
|
data/lib/sass/scss/rx.rb
CHANGED
@@ -112,6 +112,7 @@ module Sass
|
|
112
112
|
INTERP_START = /#\{/
|
113
113
|
MOZ_ANY = quote(":-moz-any(", Regexp::IGNORECASE)
|
114
114
|
|
115
|
+
IDENT_HYPHEN_INTERP = /-(?=#\{)/
|
115
116
|
STRING1_NOINTERP = /\"((?:[^\n\r\f\\"#]|#(?!\{)|\\#{NL}|#{ESCAPE})*)\"/
|
116
117
|
STRING2_NOINTERP = /\'((?:[^\n\r\f\\'#]|#(?!\{)|\\#{NL}|#{ESCAPE})*)\'/
|
117
118
|
STRING_NOINTERP = /#{STRING1_NOINTERP}|#{STRING2_NOINTERP}/
|
@@ -17,11 +17,11 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
17
17
|
raise e
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
CONTROL_NODES = [Sass::Tree::EachNode, Sass::Tree::ForNode, Sass::Tree::IfNode, Sass::Tree::WhileNode]
|
21
|
+
SCRIPT_NODES = [Sass::Tree::ImportNode, Sass::Tree::MixinNode] + CONTROL_NODES
|
22
22
|
def visit_children(parent)
|
23
23
|
old_parent = @parent
|
24
|
-
@parent = parent unless is_any_of?(parent,
|
24
|
+
@parent = parent unless is_any_of?(parent, SCRIPT_NODES)
|
25
25
|
old_real_parent, @real_parent = @real_parent, parent
|
26
26
|
super
|
27
27
|
ensure
|
@@ -48,9 +48,9 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
48
48
|
"@charset may only be used at the root of a document." unless parent.is_a?(Sass::Tree::RootNode)
|
49
49
|
end
|
50
50
|
|
51
|
-
|
51
|
+
VALID_EXTEND_PARENTS = [Sass::Tree::RuleNode, Sass::Tree::MixinDefNode]
|
52
52
|
def invalid_extend_parent?(parent, child)
|
53
|
-
unless is_any_of?(parent,
|
53
|
+
unless is_any_of?(parent, VALID_EXTEND_PARENTS)
|
54
54
|
"Extend directives may only be used within rules."
|
55
55
|
end
|
56
56
|
end
|
@@ -59,23 +59,22 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
59
59
|
"Functions may only be defined at the root of a document." unless parent.is_a?(Sass::Tree::RootNode)
|
60
60
|
end
|
61
61
|
|
62
|
-
|
63
|
-
Sass::Tree::CommentNode, Sass::Tree::DebugNode, Sass::Tree::
|
64
|
-
Sass::Tree::
|
65
|
-
|
66
|
-
]
|
62
|
+
VALID_FUNCTION_CHILDREN = [
|
63
|
+
Sass::Tree::CommentNode, Sass::Tree::DebugNode, Sass::Tree::ReturnNode,
|
64
|
+
Sass::Tree::VariableNode, Sass::Tree::WarnNode
|
65
|
+
] + CONTROL_NODES
|
67
66
|
def invalid_function_child?(parent, child)
|
68
|
-
unless is_any_of?(child,
|
67
|
+
unless is_any_of?(child, VALID_FUNCTION_CHILDREN)
|
69
68
|
"Functions can only contain variable declarations and control directives."
|
70
69
|
end
|
71
70
|
end
|
72
71
|
|
73
|
-
|
72
|
+
VALID_IMPORT_PARENTS = [
|
74
73
|
Sass::Tree::IfNode, Sass::Tree::ForNode, Sass::Tree::WhileNode,
|
75
74
|
Sass::Tree::EachNode, Sass::Tree::MixinDefNode
|
76
75
|
]
|
77
76
|
def invalid_import_parent?(parent, child)
|
78
|
-
if is_any_of?(@real_parent,
|
77
|
+
if is_any_of?(@real_parent, VALID_IMPORT_PARENTS)
|
79
78
|
return "Import directives may not be used within control directives or mixins."
|
80
79
|
end
|
81
80
|
return if parent.is_a?(Sass::Tree::RootNode)
|
@@ -98,17 +97,17 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
98
97
|
"Mixins may only be defined at the root of a document." unless parent.is_a?(Sass::Tree::RootNode)
|
99
98
|
end
|
100
99
|
|
101
|
-
|
100
|
+
VALID_PROP_CHILDREN = [Sass::Tree::CommentNode, Sass::Tree::PropNode, Sass::Tree::MixinNode] + CONTROL_NODES
|
102
101
|
def invalid_prop_child?(parent, child)
|
103
|
-
unless is_any_of?(child,
|
102
|
+
unless is_any_of?(child, VALID_PROP_CHILDREN)
|
104
103
|
"Illegal nesting: Only properties may be nested beneath properties."
|
105
104
|
end
|
106
105
|
end
|
107
106
|
|
108
|
-
|
109
|
-
|
107
|
+
VALID_PROP_PARENTS = [Sass::Tree::RuleNode, Sass::Tree::PropNode,
|
108
|
+
Sass::Tree::MixinDefNode, Sass::Tree::DirectiveNode]
|
110
109
|
def invalid_prop_parent?(parent, child)
|
111
|
-
unless is_any_of?(parent,
|
110
|
+
unless is_any_of?(parent, VALID_PROP_PARENTS)
|
112
111
|
"Properties are only allowed within rules, directives, or other properties." + child.pseudo_class_selector_message
|
113
112
|
end
|
114
113
|
end
|
data/lib/sass/util.rb
CHANGED
@@ -467,7 +467,8 @@ MSG
|
|
467
467
|
# We allow any printable ASCII characters but double quotes in the charset decl
|
468
468
|
bin = str.dup.force_encoding("BINARY")
|
469
469
|
encoding = Sass::Util::ENCODINGS_TO_CHECK.find do |enc|
|
470
|
-
|
470
|
+
re = Sass::Util::CHARSET_REGEXPS[enc]
|
471
|
+
re && bin =~ re
|
471
472
|
end
|
472
473
|
charset, bom = $1, $2
|
473
474
|
if charset
|
@@ -508,6 +509,8 @@ MSG
|
|
508
509
|
Regexp.new(/\A(?:#{_enc("\uFEFF", e)})?#{
|
509
510
|
_enc('@charset "', e)}(.*?)#{_enc('"', e)}|\A(#{
|
510
511
|
_enc("\uFEFF", e)})/)
|
512
|
+
rescue Encoding::ConverterNotFound => _
|
513
|
+
nil # JRuby on Java 5 doesn't support UTF-32
|
511
514
|
rescue
|
512
515
|
# /\A@charset "(.*?)"/
|
513
516
|
Regexp.new(/\A#{_enc('@charset "', e)}(.*?)#{_enc('"', e)}/)
|
data/test/sass/engine_test.rb
CHANGED
@@ -1203,6 +1203,18 @@ bar
|
|
1203
1203
|
SASS
|
1204
1204
|
end
|
1205
1205
|
|
1206
|
+
def test_control_directive_in_nested_property
|
1207
|
+
assert_equal(<<CSS, render(<<SASS))
|
1208
|
+
foo {
|
1209
|
+
a-b: c; }
|
1210
|
+
CSS
|
1211
|
+
foo
|
1212
|
+
a:
|
1213
|
+
@if true
|
1214
|
+
b: c
|
1215
|
+
SASS
|
1216
|
+
end
|
1217
|
+
|
1206
1218
|
def test_interpolation
|
1207
1219
|
assert_equal("a-1 {\n b-2-3: c-3; }\n", render(<<SASS))
|
1208
1220
|
$a: 1
|
data/test/sass/importer_test.rb
CHANGED
@@ -176,10 +176,17 @@ CSS
|
|
176
176
|
file_system_importer
|
177
177
|
)
|
178
178
|
end
|
179
|
+
|
179
180
|
def fixture_dir
|
180
181
|
File.join(File.dirname(__FILE__), "fixtures")
|
181
182
|
end
|
183
|
+
|
182
184
|
def fixture_file(path)
|
183
185
|
File.join(fixture_dir, path)
|
184
186
|
end
|
187
|
+
|
188
|
+
def test_absolute_files_across_template_locations
|
189
|
+
importer = Sass::Importers::Filesystem.new(absolutize 'templates')
|
190
|
+
assert_not_nil importer.mtime(absolutize('more_templates/more1.sass'), {})
|
191
|
+
end
|
185
192
|
end
|
data/test/sass/plugin_test.rb
CHANGED
@@ -183,6 +183,7 @@ CSS
|
|
183
183
|
|
184
184
|
def test_updating_stylesheets_callback
|
185
185
|
# Should run even when there's nothing to update
|
186
|
+
Sass::Plugin.options[:template_location] = nil
|
186
187
|
assert_callback :updating_stylesheets, []
|
187
188
|
end
|
188
189
|
|
@@ -196,25 +197,25 @@ CSS
|
|
196
197
|
assert_no_callback :updating_stylesheets
|
197
198
|
end
|
198
199
|
|
199
|
-
def
|
200
|
+
def test_updated_stylesheet_callback_for_updated_template
|
200
201
|
Sass::Plugin.options[:always_update] = false
|
201
202
|
touch 'basic'
|
202
|
-
assert_no_callback :
|
203
|
+
assert_no_callback :updated_stylesheet, template_loc("complex"), tempfile_loc("complex") do
|
203
204
|
assert_callbacks(
|
204
|
-
[:
|
205
|
-
[:
|
205
|
+
[:updated_stylesheet, template_loc("basic"), tempfile_loc("basic")],
|
206
|
+
[:updated_stylesheet, template_loc("import"), tempfile_loc("import")])
|
206
207
|
end
|
207
208
|
end
|
208
209
|
|
209
|
-
def
|
210
|
+
def test_updated_stylesheet_callback_for_fresh_template
|
210
211
|
Sass::Plugin.options[:always_update] = false
|
211
|
-
assert_no_callback :
|
212
|
+
assert_no_callback :updated_stylesheet
|
212
213
|
end
|
213
214
|
|
214
|
-
def
|
215
|
+
def test_updated_stylesheet_callback_for_error_template
|
215
216
|
Sass::Plugin.options[:always_update] = false
|
216
217
|
touch 'bork1'
|
217
|
-
assert_no_callback :
|
218
|
+
assert_no_callback :updated_stylesheet
|
218
219
|
end
|
219
220
|
|
220
221
|
def test_not_updating_stylesheet_callback_for_fresh_template
|
@@ -226,8 +227,8 @@ CSS
|
|
226
227
|
Sass::Plugin.options[:always_update] = false
|
227
228
|
assert_callback :not_updating_stylesheet, template_loc("complex"), tempfile_loc("complex") do
|
228
229
|
assert_no_callbacks(
|
229
|
-
[:
|
230
|
-
[:
|
230
|
+
[:updated_stylesheet, template_loc("basic"), tempfile_loc("basic")],
|
231
|
+
[:updated_stylesheet, template_loc("import"), tempfile_loc("import")])
|
231
232
|
end
|
232
233
|
end
|
233
234
|
|
@@ -347,9 +348,11 @@ CSS
|
|
347
348
|
|
348
349
|
def assert_callback(name, *expected_args)
|
349
350
|
run = false
|
351
|
+
received_args = nil
|
350
352
|
Sass::Plugin.send("on_#{name}") do |*args|
|
351
|
-
|
352
|
-
|
353
|
+
received_args = args
|
354
|
+
run ||= expected_args.zip(received_args).all? do |ea, ra|
|
355
|
+
ea.respond_to?(:call) ? ea.call(ra) : ea == ra
|
353
356
|
end
|
354
357
|
end
|
355
358
|
|
@@ -359,7 +362,7 @@ CSS
|
|
359
362
|
check_for_updates!
|
360
363
|
end
|
361
364
|
|
362
|
-
assert run, "Expected #{name} callback to be run with arguments:\n #{expected_args.inspect}"
|
365
|
+
assert run, "Expected #{name} callback to be run with arguments:\n #{expected_args.inspect}\nHowever, it got:\n #{received_args.inspect}"
|
363
366
|
end
|
364
367
|
|
365
368
|
def assert_no_callback(name, *unexpected_args)
|
@@ -223,6 +223,8 @@ RUBY
|
|
223
223
|
assert_renders '#{1 + 2}, #{3 + 4}'
|
224
224
|
assert_renders '#{1 + 2} ,#{3 + 4}'
|
225
225
|
assert_renders '#{1 + 2},#{3 + 4}'
|
226
|
+
assert_renders '#{1 + 2}, #{3 + 4}, #{5 + 6}'
|
227
|
+
assert_renders '3, #{3 + 4}, 11'
|
226
228
|
|
227
229
|
assert_renders '3 / #{3 + 4}'
|
228
230
|
assert_renders '3 /#{3 + 4}'
|
data/test/sass/script_test.rb
CHANGED
@@ -7,6 +7,14 @@ module Sass::Script::Functions::UserFunctions
|
|
7
7
|
val.options[:foo]
|
8
8
|
Sass::Script::String.new("Options defined!")
|
9
9
|
end
|
10
|
+
|
11
|
+
def arg_error
|
12
|
+
assert_options
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module Sass::Script::Functions
|
17
|
+
include Sass::Script::Functions::UserFunctions
|
10
18
|
end
|
11
19
|
|
12
20
|
class SassScriptTest < Test::Unit::TestCase
|
@@ -130,6 +138,8 @@ class SassScriptTest < Test::Unit::TestCase
|
|
130
138
|
assert_equal '3, 7', resolve('#{1 + 2}, #{3 + 4}')
|
131
139
|
assert_equal '3 ,7', resolve('#{1 + 2} ,#{3 + 4}')
|
132
140
|
assert_equal '3,7', resolve('#{1 + 2},#{3 + 4}')
|
141
|
+
assert_equal '3, 7, 11', resolve('#{1 + 2}, #{3 + 4}, #{5 + 6}')
|
142
|
+
assert_equal '3, 7, 11', resolve('3, #{3 + 4}, 11')
|
133
143
|
|
134
144
|
assert_equal '3 / 7', resolve('3 / #{3 + 4}')
|
135
145
|
assert_equal '3 /7', resolve('3 /#{3 + 4}')
|
@@ -414,6 +424,14 @@ SASS
|
|
414
424
|
assert_raise_message(Sass::SyntaxError, "() isn't a valid CSS value.") {resolve("nth(append((), ()), 1)")}
|
415
425
|
end
|
416
426
|
|
427
|
+
def test_deep_argument_error_not_unwrapped
|
428
|
+
assert_raise_message(ArgumentError, 'wrong number of arguments (0 for 1)') {resolve("arg-error()")}
|
429
|
+
end
|
430
|
+
|
431
|
+
def test_shallow_argument_error_unwrapped
|
432
|
+
assert_raise_message(Sass::SyntaxError, "wrong number of arguments (1 for 0) for `arg-error'") {resolve("arg-error(1)")}
|
433
|
+
end
|
434
|
+
|
417
435
|
# Regression Tests
|
418
436
|
|
419
437
|
def test_funcall_has_higher_precedence_than_color_name
|
data/test/sass/scss/scss_test.rb
CHANGED
@@ -1095,6 +1095,15 @@ SCSS
|
|
1095
1095
|
|
1096
1096
|
# Regression
|
1097
1097
|
|
1098
|
+
def test_prop_name_interpolation_after_hyphen
|
1099
|
+
assert_equal <<CSS, render(<<SCSS)
|
1100
|
+
a {
|
1101
|
+
-foo-bar: b; }
|
1102
|
+
CSS
|
1103
|
+
a { -\#{"foo"}-bar: b; }
|
1104
|
+
SCSS
|
1105
|
+
end
|
1106
|
+
|
1098
1107
|
def test_star_plus_and_parent
|
1099
1108
|
assert_equal <<CSS, render(<<SCSS)
|
1100
1109
|
* + html foo {
|
data/test/sass/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sass
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 3
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 3.1.
|
9
|
+
- 11
|
10
|
+
version: 3.1.11
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Nathan Weizenbaum
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2011-
|
20
|
+
date: 2011-11-28 00:00:00 -08:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|