sass 3.4.19 → 3.4.20
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.
- checksums.yaml +8 -8
- data/.yardopts +2 -0
- data/Rakefile +10 -3
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/extra/update_watch.rb +1 -1
- data/lib/sass/css.rb +1 -1
- data/lib/sass/engine.rb +36 -10
- data/lib/sass/exec/base.rb +1 -1
- data/lib/sass/importers/base.rb +1 -1
- data/lib/sass/plugin/configuration.rb +37 -21
- data/lib/sass/plugin/merb.rb +1 -1
- data/lib/sass/plugin/rails.rb +1 -1
- data/lib/sass/script/functions.rb +9 -2
- data/lib/sass/script/lexer.rb +7 -0
- data/lib/sass/script/parser.rb +154 -17
- data/lib/sass/script/tree/interpolation.rb +109 -4
- data/lib/sass/script/tree/string_interpolation.rb +6 -0
- data/lib/sass/script/value/number.rb +4 -0
- data/lib/sass/script/value/string.rb +37 -1
- data/lib/sass/scss/parser.rb +33 -15
- data/lib/sass/selector/simple_sequence.rb +1 -1
- data/lib/sass/tree/css_import_node.rb +9 -1
- data/lib/sass/tree/visitors/convert.rb +1 -0
- data/lib/sass/tree/visitors/perform.rb +3 -0
- data/lib/sass/tree/visitors/to_css.rb +3 -2
- data/lib/sass/util.rb +4 -3
- data/test/sass/conversion_test.rb +8 -0
- data/test/sass/engine_test.rb +28 -0
- data/test/sass/functions_test.rb +3 -0
- data/test/sass/script_conversion_test.rb +27 -26
- data/test/sass/script_test.rb +197 -37
- data/test/sass/scss/scss_test.rb +19 -0
- data/test/sass/source_map_test.rb +130 -64
- data/test/sass/util_test.rb +11 -0
- data/test/test_helper.rb +4 -3
- metadata +2 -2
data/test/sass/engine_test.rb
CHANGED
@@ -3322,6 +3322,34 @@ CSS
|
|
3322
3322
|
SASS
|
3323
3323
|
end
|
3324
3324
|
|
3325
|
+
def test_compressed_output_of_nth_selectors
|
3326
|
+
assert_equal(<<CSS, render(<<SASS, :syntax => :scss, :style => :compressed))
|
3327
|
+
:nth-of-type(2n-1),:nth-of-type(2n-1),:nth-of-type(2n-1),:nth-of-type(2n-1),:nth-of-type(2n-1){color:red}:nth-of-type(2n+1),:nth-of-type(2n+1),:nth-of-type(2n+1),:nth-of-type(2n+1),:nth-of-type(2n+1){color:red}
|
3328
|
+
CSS
|
3329
|
+
:nth-of-type(2n-1), :nth-of-type(2n- 1), :nth-of-type(2n -1), :nth-of-type(2n - 1), :nth-of-type( 2n - 1 ) {
|
3330
|
+
color: red }
|
3331
|
+
:nth-of-type(2n+1), :nth-of-type(2n+ 1), :nth-of-type(2n +1), :nth-of-type(2n + 1), :nth-of-type( 2n + 1 ) {
|
3332
|
+
color: red }
|
3333
|
+
SASS
|
3334
|
+
end
|
3335
|
+
|
3336
|
+
def test_import_with_supports_clause_interp
|
3337
|
+
assert_equal(<<CSS, render(<<'SASS', :style => :compressed))
|
3338
|
+
@import url("fallback-layout.css") supports(not (display: flex))
|
3339
|
+
CSS
|
3340
|
+
$display-type: flex
|
3341
|
+
@import url("fallback-layout.css") supports(not (display: #{$display-type}))
|
3342
|
+
SASS
|
3343
|
+
end
|
3344
|
+
|
3345
|
+
def test_import_with_supports_clause
|
3346
|
+
assert_equal(<<CSS, render(<<SASS, :style => :compressed))
|
3347
|
+
@import url("fallback-layout.css") supports(not (display: flex))
|
3348
|
+
CSS
|
3349
|
+
@import url("fallback-layout.css") supports(not (display: flex))
|
3350
|
+
SASS
|
3351
|
+
end
|
3352
|
+
|
3325
3353
|
private
|
3326
3354
|
|
3327
3355
|
def assert_hash_has(hash, expected)
|
data/test/sass/functions_test.rb
CHANGED
@@ -154,6 +154,7 @@ WARNING
|
|
154
154
|
assert_equal("5px", evaluate("round(4.8px)"))
|
155
155
|
assert_equal("5px", evaluate("round(5.49px)"))
|
156
156
|
assert_equal("5px", evaluate("round($number: 5.49px)"))
|
157
|
+
assert_equal("-6", evaluate("round(-5.5)"))
|
157
158
|
end
|
158
159
|
|
159
160
|
def test_round_checks_types
|
@@ -197,6 +198,7 @@ WARNING
|
|
197
198
|
assert_equal("1", evaluate("min(3px, 2px, 1)"))
|
198
199
|
assert_equal("4em", evaluate("min(4em)"))
|
199
200
|
assert_equal("10cm", evaluate("min(10cm, 6in)"))
|
201
|
+
assert_equal("1q", evaluate("min(1cm, 1q)"))
|
200
202
|
|
201
203
|
assert_error_message("#aaaaaa is not a number for `min'", "min(#aaa)")
|
202
204
|
assert_error_message("Incompatible units: 'px' and 'em'.", "min(3em, 4em, 1px)")
|
@@ -207,6 +209,7 @@ WARNING
|
|
207
209
|
assert_equal("3", evaluate("max(3, 2px, 1px)"))
|
208
210
|
assert_equal("4em", evaluate("max(4em)"))
|
209
211
|
assert_equal("6in", evaluate("max(10cm, 6in)"))
|
212
|
+
assert_equal("11mm", evaluate("max(11mm, 10q)"))
|
210
213
|
|
211
214
|
assert_error_message("#aaaaaa is not a number for `max'", "max(#aaa)")
|
212
215
|
assert_error_message("Incompatible units: 'px' and 'em'.", "max(3em, 4em, 1px)")
|
@@ -264,20 +264,21 @@ RUBY
|
|
264
264
|
end
|
265
265
|
|
266
266
|
def test_interpolation
|
267
|
-
|
268
|
-
|
269
|
-
|
267
|
+
assert_equal 'unquote("#{$foo}#{$bar}#{$baz}")', render("$foo\#{$bar}$baz")
|
268
|
+
assert_equal 'unquote("#{$foo}#{$bar} #{$baz}")', render("$foo\#{$bar} $baz")
|
269
|
+
assert_equal 'unquote("#{$foo} #{$bar}#{$baz}")', render("$foo \#{$bar}$baz")
|
270
270
|
assert_renders "$foo \#{$bar} $baz"
|
271
271
|
assert_renders "$foo \#{$bar}\#{$bang} $baz"
|
272
272
|
assert_renders "$foo \#{$bar} \#{$bang} $baz"
|
273
|
-
|
274
|
-
|
273
|
+
assert_equal 'unquote("#{$bar}#{$baz}")', render("\#{$bar}$baz")
|
274
|
+
assert_equal 'unquote("#{$foo}#{$bar}")', render("$foo\#{$bar}")
|
275
275
|
assert_renders "\#{$bar}"
|
276
276
|
end
|
277
277
|
|
278
278
|
def test_interpolation_in_function
|
279
279
|
assert_renders 'flabnabbit(#{1 + "foo"})'
|
280
|
-
|
280
|
+
assert_equal 'flabnabbit(unquote("#{$foo} #{1 + "foo"}#{$baz}"))',
|
281
|
+
render('flabnabbit($foo #{1 + "foo"}$baz)')
|
281
282
|
assert_renders 'flabnabbit($foo #{1 + "foo"}#{2 + "bar"} $baz)'
|
282
283
|
end
|
283
284
|
|
@@ -299,30 +300,30 @@ RUBY
|
|
299
300
|
assert_renders '3/ #{3 + 4}'
|
300
301
|
assert_renders '3/#{3 + 4}'
|
301
302
|
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
303
|
+
assert_equal 'unquote("#{1 + 2} * 7")', render('#{1 + 2} * 7')
|
304
|
+
assert_equal 'unquote("#{1 + 2}* 7")', render('#{1 + 2}* 7')
|
305
|
+
assert_equal 'unquote("#{1 + 2} *7")', render('#{1 + 2} *7')
|
306
|
+
assert_equal 'unquote("#{1 + 2}*7")', render('#{1 + 2}*7')
|
306
307
|
|
307
308
|
assert_renders '-#{1 + 2}'
|
308
|
-
|
309
|
+
assert_equal 'unquote("- #{1 + 2}")', render('- #{1 + 2}')
|
309
310
|
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
311
|
+
assert_equal 'unquote("5 + #{1 + 2} * #{3 + 4}")', render('5 + #{1 + 2} * #{3 + 4}')
|
312
|
+
assert_equal 'unquote("5 +#{1 + 2} * #{3 + 4}")', render('5 +#{1 + 2} * #{3 + 4}')
|
313
|
+
assert_equal 'unquote("5+#{1 + 2} * #{3 + 4}")', render('5+#{1 + 2} * #{3 + 4}')
|
314
|
+
assert_equal 'unquote("#{1 + 2} * #{3 + 4} + 5")', render('#{1 + 2} * #{3 + 4} + 5')
|
315
|
+
assert_equal 'unquote("#{1 + 2} * #{3 + 4}+ 5")', render('#{1 + 2} * #{3 + 4}+ 5')
|
316
|
+
assert_equal 'unquote("#{1 + 2} * #{3 + 4}+5")', render('#{1 + 2} * #{3 + 4}+5')
|
316
317
|
|
317
|
-
assert_equal '5 / #{1 + 2} + #{3 + 4}', render('5 / (#{1 + 2} + #{3 + 4})')
|
318
|
-
assert_equal '5 / #{1 + 2} + #{3 + 4}', render('5 /(#{1 + 2} + #{3 + 4})')
|
319
|
-
assert_equal '5 / #{1 + 2} + #{3 + 4}', render('5 /( #{1 + 2} + #{3 + 4} )')
|
320
|
-
assert_equal '#{1 + 2} + #{3 + 4} / 5', render('(#{1 + 2} + #{3 + 4}) / 5')
|
321
|
-
assert_equal '#{1 + 2} + #{3 + 4} / 5', render('(#{1 + 2} + #{3 + 4})/ 5')
|
322
|
-
assert_equal '#{1 + 2} + #{3 + 4} / 5', render('( #{1 + 2} + #{3 + 4} )/ 5')
|
318
|
+
assert_equal '5 / unquote("#{1 + 2} + #{3 + 4}")', render('5 / (#{1 + 2} + #{3 + 4})')
|
319
|
+
assert_equal '5 / unquote("#{1 + 2} + #{3 + 4}")', render('5 /(#{1 + 2} + #{3 + 4})')
|
320
|
+
assert_equal '5 / unquote("#{1 + 2} + #{3 + 4}")', render('5 /( #{1 + 2} + #{3 + 4} )')
|
321
|
+
assert_equal 'unquote("#{1 + 2} + #{3 + 4}") / 5', render('(#{1 + 2} + #{3 + 4}) / 5')
|
322
|
+
assert_equal 'unquote("#{1 + 2} + #{3 + 4}") / 5', render('(#{1 + 2} + #{3 + 4})/ 5')
|
323
|
+
assert_equal 'unquote("#{1 + 2} + #{3 + 4}") / 5', render('( #{1 + 2} + #{3 + 4} )/ 5')
|
323
324
|
|
324
|
-
|
325
|
-
|
325
|
+
assert_equal 'unquote("#{1 + 2} + #{2 + 3}")', render('#{1 + 2} + 2 + 3')
|
326
|
+
assert_equal 'unquote("#{1 + 2} +#{2 + 3}")', render('#{1 + 2} +2 + 3')
|
326
327
|
end
|
327
328
|
|
328
329
|
def test_string_interpolation
|
@@ -350,7 +351,7 @@ RUBY
|
|
350
351
|
|
351
352
|
def render(script, options = {})
|
352
353
|
munge_filename(options)
|
353
|
-
node = Sass::Script.parse(script, 1, 0, options)
|
354
|
+
node = Sass::Script.parse(script, 1, 0, options.merge(:_convert => true))
|
354
355
|
node.to_sass
|
355
356
|
end
|
356
357
|
end
|
data/test/sass/script_test.rb
CHANGED
@@ -191,43 +191,45 @@ class SassScriptTest < MiniTest::Test
|
|
191
191
|
end
|
192
192
|
|
193
193
|
def test_interpolation_near_operators
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
194
|
+
silence_warnings do
|
195
|
+
assert_equal '3 , 7', resolve('#{1 + 2} , #{3 + 4}')
|
196
|
+
assert_equal '3, 7', resolve('#{1 + 2}, #{3 + 4}')
|
197
|
+
assert_equal '3 ,7', resolve('#{1 + 2} ,#{3 + 4}')
|
198
|
+
assert_equal '3,7', resolve('#{1 + 2},#{3 + 4}')
|
199
|
+
assert_equal '3, 7, 11', resolve('#{1 + 2}, #{3 + 4}, #{5 + 6}')
|
200
|
+
assert_equal '3, 7, 11', resolve('3, #{3 + 4}, 11')
|
201
|
+
assert_equal '3, 7, 11', resolve('3, 7, #{5 + 6}')
|
202
|
+
|
203
|
+
assert_equal '3 / 7', resolve('3 / #{3 + 4}')
|
204
|
+
assert_equal '3 /7', resolve('3 /#{3 + 4}')
|
205
|
+
assert_equal '3/ 7', resolve('3/ #{3 + 4}')
|
206
|
+
assert_equal '3/7', resolve('3/#{3 + 4}')
|
207
|
+
|
208
|
+
assert_equal '3 * 7', resolve('#{1 + 2} * 7')
|
209
|
+
assert_equal '3* 7', resolve('#{1 + 2}* 7')
|
210
|
+
assert_equal '3 *7', resolve('#{1 + 2} *7')
|
211
|
+
assert_equal '3*7', resolve('#{1 + 2}*7')
|
212
|
+
|
213
|
+
assert_equal '-3', resolve('-#{1 + 2}')
|
214
|
+
assert_equal '- 3', resolve('- #{1 + 2}')
|
215
|
+
|
216
|
+
assert_equal '5 + 3 * 7', resolve('5 + #{1 + 2} * #{3 + 4}')
|
217
|
+
assert_equal '5 +3 * 7', resolve('5 +#{1 + 2} * #{3 + 4}')
|
218
|
+
assert_equal '5+3 * 7', resolve('5+#{1 + 2} * #{3 + 4}')
|
219
|
+
assert_equal '3 * 7 + 5', resolve('#{1 + 2} * #{3 + 4} + 5')
|
220
|
+
assert_equal '3 * 7+ 5', resolve('#{1 + 2} * #{3 + 4}+ 5')
|
221
|
+
assert_equal '3 * 7+5', resolve('#{1 + 2} * #{3 + 4}+5')
|
222
|
+
|
223
|
+
assert_equal '5/3 + 7', resolve('5 / (#{1 + 2} + #{3 + 4})')
|
224
|
+
assert_equal '5/3 + 7', resolve('5 /(#{1 + 2} + #{3 + 4})')
|
225
|
+
assert_equal '5/3 + 7', resolve('5 /( #{1 + 2} + #{3 + 4} )')
|
226
|
+
assert_equal '3 + 7/5', resolve('(#{1 + 2} + #{3 + 4}) / 5')
|
227
|
+
assert_equal '3 + 7/5', resolve('(#{1 + 2} + #{3 + 4})/ 5')
|
228
|
+
assert_equal '3 + 7/5', resolve('( #{1 + 2} + #{3 + 4} )/ 5')
|
229
|
+
|
230
|
+
assert_equal '3 + 5', resolve('#{1 + 2} + 2 + 3')
|
231
|
+
assert_equal '3 +5', resolve('#{1 + 2} +2 + 3')
|
232
|
+
end
|
231
233
|
end
|
232
234
|
|
233
235
|
def test_string_interpolation
|
@@ -496,10 +498,14 @@ SASS
|
|
496
498
|
|
497
499
|
def test_operator_unit_conversion
|
498
500
|
assert_equal "1.1cm", resolve("1cm + 1mm")
|
501
|
+
assert_equal "8q", resolve("4q + 1mm")
|
502
|
+
assert_equal "40.025cm", resolve("40cm + 1q")
|
499
503
|
assert_equal "2in", resolve("1in + 96px")
|
500
504
|
assert_equal "true", resolve("2mm < 1cm")
|
501
505
|
assert_equal "true", resolve("10mm == 1cm")
|
502
506
|
assert_equal "true", resolve("1.1cm == 11mm")
|
507
|
+
assert_equal "true", resolve("2mm == 8q")
|
508
|
+
assert_equal "false", resolve("2px > 3q")
|
503
509
|
|
504
510
|
assert_warning(<<WARNING) {assert_equal "true", resolve("1 == 1cm")}
|
505
511
|
DEPRECATION WARNING on line 1 of test_operator_unit_conversion_inline.sass:
|
@@ -521,6 +527,8 @@ WARNING
|
|
521
527
|
assert_equal "2.83465", resolve("(1mm/1pt)")
|
522
528
|
assert_equal "1.33333", resolve("(1pt/1px)")
|
523
529
|
assert_equal "0.01042", resolve("(1px/1in)")
|
530
|
+
assert_equal "1.05833", resolve("(1px/1q)")
|
531
|
+
assert_equal "0.05906", resolve("(1q/1pc)")
|
524
532
|
end
|
525
533
|
|
526
534
|
def test_angle_units
|
@@ -1171,12 +1179,164 @@ SASS
|
|
1171
1179
|
assert_equal "true", resolve("29 == (29 / 7 * 7)")
|
1172
1180
|
end
|
1173
1181
|
|
1182
|
+
def test_compressed_output_of_numbers_with_leading_zeros
|
1183
|
+
assert_equal "1.5", resolve("1.5", :style => :compressed)
|
1184
|
+
assert_equal ".5", resolve("0.5", :style => :compressed)
|
1185
|
+
assert_equal "-.5", resolve("-0.5", :style => :compressed)
|
1186
|
+
assert_equal "0.5", resolve("0.5", :style => :compact)
|
1187
|
+
end
|
1188
|
+
|
1189
|
+
def test_interpolation_without_deprecation_warning
|
1190
|
+
assert_no_warning {assert_equal "a", resolve('#{a}')}
|
1191
|
+
assert_no_warning {assert_equal "abc", resolve('a#{b}c')}
|
1192
|
+
assert_no_warning {assert_equal "+ a", resolve('+ #{a}')}
|
1193
|
+
assert_no_warning {assert_equal "/ a", resolve('/ #{a}')}
|
1194
|
+
assert_no_warning {assert_equal "1 / a", resolve('1 / #{a}')}
|
1195
|
+
assert_no_warning {assert_equal "a / b", resolve('#{a} / #{b}')}
|
1196
|
+
assert_no_warning {assert_equal "foo(1 = a)", resolve('foo(1 = #{a})')}
|
1197
|
+
assert_no_warning {assert_equal "foo(a = b)", resolve('foo(#{a} = #{b})')}
|
1198
|
+
assert_no_warning {assert_equal "-a", resolve('-#{a}')}
|
1199
|
+
assert_no_warning {assert_equal "1-a", resolve('1-#{a}')}
|
1200
|
+
assert_no_warning {assert_equal "a- 1", resolve('#{a}- 1')}
|
1201
|
+
assert_no_warning {assert_equal "a-1", resolve('#{a}-1')}
|
1202
|
+
assert_no_warning {assert_equal "a-b", resolve('#{a}-#{b}')}
|
1203
|
+
assert_no_warning {assert_equal "a1", resolve('#{a}1')}
|
1204
|
+
assert_no_warning {assert_equal "ab", resolve('#{a}b')}
|
1205
|
+
assert_no_warning {assert_equal "1a", resolve('1#{a}')}
|
1206
|
+
assert_no_warning {assert_equal "ba", resolve('b#{a}')}
|
1207
|
+
end
|
1208
|
+
|
1209
|
+
def test_leading_interpolation_with_deprecation_warning
|
1210
|
+
assert_equal "ab == 1", resolve_with_interp_warning('#{a + b} == 1')
|
1211
|
+
assert_equal "ab != 1", resolve_with_interp_warning('#{a + b} != 1')
|
1212
|
+
assert_equal "ab > 1", resolve_with_interp_warning('#{a + b} > 1')
|
1213
|
+
assert_equal "ab >= 1", resolve_with_interp_warning('#{a + b} >= 1')
|
1214
|
+
assert_equal "ab < 1", resolve_with_interp_warning('#{a + b} < 1')
|
1215
|
+
assert_equal "ab <= 1", resolve_with_interp_warning('#{a + b} <= 1')
|
1216
|
+
assert_equal "ab + 1", resolve_with_interp_warning('#{a + b} + 1')
|
1217
|
+
assert_equal "ab * 1", resolve_with_interp_warning('#{a + b} * 1')
|
1218
|
+
assert_equal "ab - 1", resolve_with_interp_warning('#{a + b} - 1')
|
1219
|
+
assert_equal "ab % 1", resolve_with_interp_warning('#{a + b} % 1')
|
1220
|
+
assert_equal(
|
1221
|
+
"abvar",
|
1222
|
+
resolve_with_interp_warning(
|
1223
|
+
'#{a + b}$var', '"#{a + b}#{$var}"',
|
1224
|
+
env('var' => Sass::Script::Value::String.new("var"))))
|
1225
|
+
assert_equal(
|
1226
|
+
"varab",
|
1227
|
+
resolve_with_interp_warning(
|
1228
|
+
'$var#{a + b}', '"#{$var}#{a + b}"',
|
1229
|
+
env('var' => Sass::Script::Value::String.new("var"))))
|
1230
|
+
assert_equal "ab1", resolve_with_interp_warning('#{a + b}(1)', '"#{a + b}1"')
|
1231
|
+
assert_equal "1ab", resolve_with_interp_warning('(1)#{a + b}', '"1#{a + b}"')
|
1232
|
+
end
|
1233
|
+
|
1234
|
+
def test_trailing_interpolation_with_deprecation_warning
|
1235
|
+
assert_equal "not ab", resolve_with_interp_warning('not #{a + b}')
|
1236
|
+
assert_equal "1 and ab", resolve_with_interp_warning('1 and #{a + b}')
|
1237
|
+
assert_equal "1 or ab", resolve_with_interp_warning('1 or #{a + b}')
|
1238
|
+
assert_equal "1 == ab", resolve_with_interp_warning('1 == #{a + b}')
|
1239
|
+
assert_equal "1 != ab", resolve_with_interp_warning('1 != #{a + b}')
|
1240
|
+
assert_equal "1 > ab", resolve_with_interp_warning('1 > #{a + b}')
|
1241
|
+
assert_equal "1 >= ab", resolve_with_interp_warning('1 >= #{a + b}')
|
1242
|
+
assert_equal "1 < ab", resolve_with_interp_warning('1 < #{a + b}')
|
1243
|
+
assert_equal "1 <= ab", resolve_with_interp_warning('1 <= #{a + b}')
|
1244
|
+
assert_equal "1 + ab", resolve_with_interp_warning('1 + #{a + b}')
|
1245
|
+
assert_equal "1 * ab", resolve_with_interp_warning('1 * #{a + b}')
|
1246
|
+
assert_equal "1 - ab", resolve_with_interp_warning('1 - #{a + b}')
|
1247
|
+
assert_equal "1 % ab", resolve_with_interp_warning('1 % #{a + b}')
|
1248
|
+
assert_equal "- ab", resolve_with_interp_warning('- #{a + b}')
|
1249
|
+
assert_equal "1- ab", resolve_with_interp_warning('1- #{a + b}')
|
1250
|
+
assert_equal "- ab 2 3", resolve_with_interp_warning('- #{a + b} 2 3', '"- #{a + b} #{2 3}"')
|
1251
|
+
end
|
1252
|
+
|
1253
|
+
def test_brackteing_interpolation_with_deprecation_warning
|
1254
|
+
assert_equal "ab == cd", resolve_with_interp_warning('#{a + b} == #{c + d}')
|
1255
|
+
assert_equal "ab != cd", resolve_with_interp_warning('#{a + b} != #{c + d}')
|
1256
|
+
assert_equal "ab > cd", resolve_with_interp_warning('#{a + b} > #{c + d}')
|
1257
|
+
assert_equal "ab >= cd", resolve_with_interp_warning('#{a + b} >= #{c + d}')
|
1258
|
+
assert_equal "ab < cd", resolve_with_interp_warning('#{a + b} < #{c + d}')
|
1259
|
+
assert_equal "ab <= cd", resolve_with_interp_warning('#{a + b} <= #{c + d}')
|
1260
|
+
assert_equal "ab + cd", resolve_with_interp_warning('#{a + b} + #{c + d}')
|
1261
|
+
assert_equal "ab * cd", resolve_with_interp_warning('#{a + b} * #{c + d}')
|
1262
|
+
assert_equal "ab - cd", resolve_with_interp_warning('#{a + b} - #{c + d}')
|
1263
|
+
assert_equal "ab % cd", resolve_with_interp_warning('#{a + b} % #{c + d}')
|
1264
|
+
end
|
1265
|
+
|
1266
|
+
def test_interp_warning_formatting
|
1267
|
+
resolve_with_interp_warning('#{1} + 1', '"1 + 1"')
|
1268
|
+
resolve_with_interp_warning('#{1} + "foo"', '\'1 + "foo"\'')
|
1269
|
+
resolve_with_interp_warning('#{1} + \'foo\'', '\'1 + "foo"\'')
|
1270
|
+
|
1271
|
+
resolve_with_interp_warning('#{1} + "#{a + b}"', '\'1 + "#{a + b}"\'')
|
1272
|
+
resolve_with_interp_warning('"#{a + b}" + #{1}', '\'"#{a + b}" + 1\'')
|
1273
|
+
resolve_with_interp_warning('"#{a + b}" + #{1} + "#{c + d}"', '\'"#{a + b}" + 1 + "#{c + d}"\'')
|
1274
|
+
|
1275
|
+
resolve_with_interp_warning('#{1} + "\'"', '"1 + \\"\'\\""')
|
1276
|
+
resolve_with_interp_warning('#{1} + \'"\'', '"1 + \'\\"\'"')
|
1277
|
+
resolve_with_interp_warning('#{1} + "\'\\""', '"1 + \\"\'\\\\\\"\\""')
|
1278
|
+
end
|
1279
|
+
|
1280
|
+
def test_inactive_lazy_interpolation_deprecation_warning
|
1281
|
+
assert_equal '1, 2, 3', assert_no_warning {resolve('1, #{2}, 3')}
|
1282
|
+
assert_equal '1, 2, 3', assert_no_warning {resolve('1, 2, #{3}')}
|
1283
|
+
assert_equal '1,2,3', assert_no_warning {resolve('1,#{2},3')}
|
1284
|
+
assert_equal '1 2 3', assert_no_warning {resolve('#{1} 2 3')}
|
1285
|
+
assert_equal '1 2 3', assert_no_warning {resolve('1 #{2} 3')}
|
1286
|
+
assert_equal '1 2 3', assert_no_warning {resolve('1 2 #{3}')}
|
1287
|
+
|
1288
|
+
assert_equal '+1 2 3', assert_no_warning {resolve('+#{1} 2 3')}
|
1289
|
+
assert_equal '-1 2 3', assert_no_warning {resolve('-#{1} 2 3')}
|
1290
|
+
assert_equal '/1 2 3', assert_no_warning {resolve('/#{1} 2 3')}
|
1291
|
+
|
1292
|
+
assert_equal '1, 2, 31', assert_no_warning {resolve('(1, #{2}, 3) + 1')}
|
1293
|
+
assert_equal '11, 2, 3', assert_no_warning {resolve('1 + (1, #{2}, 3)')}
|
1294
|
+
|
1295
|
+
assert_equal 'a, b, c', assert_no_warning {resolve('selector-parse((a, #{b}, c))')}
|
1296
|
+
end
|
1297
|
+
|
1298
|
+
def test_active_lazy_interpolation_deprecation_warning
|
1299
|
+
assert_equal "1, 2, 3", resolve_with_lazy_interp_warning('quote((1, #{2}, 3))', '"1, 2, 3"')
|
1300
|
+
assert_equal "1", resolve_with_lazy_interp_warning('length((1, #{2}, 3))', '"1, 2, 3"')
|
1301
|
+
assert_equal "1, 2, 3", resolve_with_lazy_interp_warning('inspect((1, #{2}, 3))', '"1, 2, 3"')
|
1302
|
+
assert_equal "string", resolve_with_lazy_interp_warning('type-of((1, #{2}, 3))', '"1, 2, 3"')
|
1303
|
+
|
1304
|
+
assert_equal "+1 2 3", resolve_with_lazy_interp_warning('quote((+#{1} 2 3))', '"+1 #{2 3}"')
|
1305
|
+
assert_equal "/1 2 3", resolve_with_lazy_interp_warning('quote((/#{1} 2 3))', '"/1 #{2 3}"')
|
1306
|
+
assert_equal "-1 2 3", resolve_with_lazy_interp_warning('quote((-#{1} 2 3))', '"-1 #{2 3}"')
|
1307
|
+
end
|
1308
|
+
|
1174
1309
|
private
|
1175
1310
|
|
1311
|
+
def resolve_with_lazy_interp_warning(str, contents = nil, environment = env)
|
1312
|
+
contents ||= "\"#{str}\""
|
1313
|
+
result = assert_warning(<<WARNING) {resolve(str, {}, environment)}
|
1314
|
+
DEPRECATION WARNING on line 1 of #{filename_for_test}: \#{} interpolation near operators will be simplified
|
1315
|
+
in a future version of Sass. To preserve the current behavior, use quotes:
|
1316
|
+
|
1317
|
+
unquote(#{contents})
|
1318
|
+
WARNING
|
1319
|
+
$_sass_deprecated_interp_warnings = nil
|
1320
|
+
result
|
1321
|
+
end
|
1322
|
+
|
1323
|
+
def resolve_with_interp_warning(str, contents = nil, environment = env)
|
1324
|
+
contents ||= "\"#{str}\""
|
1325
|
+
assert_warning(<<WARNING) {resolve(str, {}, environment)}
|
1326
|
+
DEPRECATION WARNING on line 1 of #{filename_for_test}: \#{} interpolation near operators will be simplified
|
1327
|
+
in a future version of Sass. To preserve the current behavior, use quotes:
|
1328
|
+
|
1329
|
+
unquote(#{contents})
|
1330
|
+
|
1331
|
+
You can use the sass-convert command to automatically fix most cases.
|
1332
|
+
WARNING
|
1333
|
+
end
|
1334
|
+
|
1176
1335
|
def resolve(str, opts = {}, environment = env)
|
1177
1336
|
munge_filename opts
|
1178
1337
|
val = eval(str, opts, environment)
|
1179
1338
|
assert_kind_of Sass::Script::Value::Base, val
|
1339
|
+
val.options = opts
|
1180
1340
|
val.is_a?(Sass::Script::Value::String) ? val.value : val.to_s
|
1181
1341
|
end
|
1182
1342
|
|
data/test/sass/scss/scss_test.rb
CHANGED
@@ -4125,4 +4125,23 @@ CSS
|
|
4125
4125
|
}
|
4126
4126
|
SCSS
|
4127
4127
|
end
|
4128
|
+
|
4129
|
+
def test_import_with_supports_clause_interp
|
4130
|
+
assert_equal(<<CSS, render(<<'SASS', :style => :compressed))
|
4131
|
+
@import url("fallback-layout.css") supports(not (display: flex))
|
4132
|
+
CSS
|
4133
|
+
$display-type: flex;
|
4134
|
+
@import url("fallback-layout.css") supports(not (display: #{$display-type}));
|
4135
|
+
SASS
|
4136
|
+
end
|
4137
|
+
|
4138
|
+
def test_import_with_supports_clause
|
4139
|
+
assert_equal(<<CSS, render(<<SASS, :style => :compressed))
|
4140
|
+
@import url("fallback-layout.css") supports(not (display: flex));.foo{bar:baz}
|
4141
|
+
CSS
|
4142
|
+
@import url("fallback-layout.css") supports(not (display: flex));
|
4143
|
+
.foo { bar: baz; }
|
4144
|
+
SASS
|
4145
|
+
end
|
4146
|
+
|
4128
4147
|
end
|
@@ -28,7 +28,7 @@ a {
|
|
28
28
|
CSS
|
29
29
|
{
|
30
30
|
"version": 3,
|
31
|
-
"mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG
|
31
|
+
"mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;EACV,kBAAkB;EAChB,SAAS,EAAE,IAAI",
|
32
32
|
"sources": ["test_simple_mapping_scss_inline.scss"],
|
33
33
|
"names": [],
|
34
34
|
"file": "test.css"
|
@@ -78,7 +78,7 @@ a {
|
|
78
78
|
CSS
|
79
79
|
{
|
80
80
|
"version": 3,
|
81
|
-
"mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG
|
81
|
+
"mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;EACV,kBAAkB;EAChB,SAAS,EAAE,IAAI",
|
82
82
|
"sources": ["#{uri}"],
|
83
83
|
"names": [],
|
84
84
|
"file": "test.css"
|
@@ -104,7 +104,7 @@ a {
|
|
104
104
|
CSS
|
105
105
|
{
|
106
106
|
"version": 3,
|
107
|
-
"mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG
|
107
|
+
"mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;EACV,kBAAkB;EAChB,SAAS,EAAE,IAAI",
|
108
108
|
"sources": ["../scss/style.scss"],
|
109
109
|
"names": [],
|
110
110
|
"file": "style.css"
|
@@ -350,44 +350,44 @@ CSS
|
|
350
350
|
$width: 2px;
|
351
351
|
$translucent-red: rgba(255, 0, 0, 0.5);
|
352
352
|
{{1}}a {{/1}}{
|
353
|
-
{{
|
354
|
-
{{
|
355
|
-
{{
|
356
|
-
{{
|
357
|
-
{{
|
358
|
-
{{
|
353
|
+
{{9}}.special {{/9}}{
|
354
|
+
{{10}}color{{/10}}: {{11}}red{{/11}};
|
355
|
+
{{12}}&:hover {{/12}}{
|
356
|
+
{{13}}foo{{/13}}: {{14}}bar{{/14}};
|
357
|
+
{{15}}cursor{{/15}}: {{16}}e + -resize{{/16}};
|
358
|
+
{{17}}color{{/17}}: {{18}}opacify($translucent-red, 0.3){{/18}};
|
359
359
|
}
|
360
|
-
{{
|
361
|
-
{{
|
360
|
+
{{19}}&:after {{/19}}{
|
361
|
+
{{20}}content{{/20}}: {{21}}"I ate #{5 + 10} pies #{$width} thick!"{{/21}};
|
362
362
|
}
|
363
363
|
}
|
364
|
-
{{
|
365
|
-
{{
|
366
|
-
{{
|
364
|
+
{{22}}&:active {{/22}}{
|
365
|
+
{{23}}color{{/23}}: {{24}}#010203 + #040506{{/24}};
|
366
|
+
{{25}}border{{/25}}: {{26}}$width solid black{{/26}};
|
367
367
|
}
|
368
|
-
/* SOME COMMENT */
|
369
|
-
{{
|
370
|
-
{{
|
371
|
-
{{
|
368
|
+
{{2}}/* SOME COMMENT */{{/2}}
|
369
|
+
{{3}}font{{/3}}: {{4}}2px/3px {{/4}}{
|
370
|
+
{{5}}family{{/5}}: {{6}}fantasy{{/6}};
|
371
|
+
{{7}}size{{/7}}: {{8}}1em + (2em * 3){{/8}};
|
372
372
|
}
|
373
373
|
}
|
374
374
|
SCSS
|
375
375
|
{{1}}a{{/1}} {
|
376
|
-
/* SOME COMMENT */
|
377
|
-
{{
|
378
|
-
{{
|
379
|
-
{{
|
380
|
-
{{
|
381
|
-
{{
|
382
|
-
{{
|
383
|
-
{{
|
384
|
-
{{
|
385
|
-
{{
|
386
|
-
{{
|
387
|
-
{{
|
388
|
-
{{
|
389
|
-
{{
|
390
|
-
{{
|
376
|
+
{{2}}/* SOME COMMENT */{{/2}}
|
377
|
+
{{3}}font{{/3}}: {{4}}2px/3px{{/4}};
|
378
|
+
{{5}}font-family{{/5}}: {{6}}fantasy{{/6}};
|
379
|
+
{{7}}font-size{{/7}}: {{8}}7em{{/8}}; }
|
380
|
+
{{9}}a .special{{/9}} {
|
381
|
+
{{10}}color{{/10}}: {{11}}red{{/11}}; }
|
382
|
+
{{12}}a .special:hover{{/12}} {
|
383
|
+
{{13}}foo{{/13}}: {{14}}bar{{/14}};
|
384
|
+
{{15}}cursor{{/15}}: {{16}}e-resize{{/16}};
|
385
|
+
{{17}}color{{/17}}: {{18}}rgba(255, 0, 0, 0.8){{/18}}; }
|
386
|
+
{{19}}a .special:after{{/19}} {
|
387
|
+
{{20}}content{{/20}}: {{21}}"I ate 15 pies 2px thick!"{{/21}}; }
|
388
|
+
{{22}}a:active{{/22}} {
|
389
|
+
{{23}}color{{/23}}: {{24}}#050709{{/24}};
|
390
|
+
{{25}}border{{/25}}: {{26}}2px solid black{{/26}}; }
|
391
391
|
|
392
392
|
/*# sourceMappingURL=test.css.map */
|
393
393
|
CSS
|
@@ -398,39 +398,39 @@ CSS
|
|
398
398
|
$width: 2px
|
399
399
|
$translucent-red: rgba(255, 0, 0, 0.5)
|
400
400
|
{{1}}a{{/1}}
|
401
|
-
{{
|
402
|
-
{{
|
403
|
-
{{
|
404
|
-
{{
|
405
|
-
{{
|
406
|
-
{{
|
407
|
-
{{
|
408
|
-
{{
|
409
|
-
{{
|
410
|
-
{{
|
411
|
-
{{
|
412
|
-
|
413
|
-
/* SOME COMMENT */
|
414
|
-
{{
|
415
|
-
{{
|
416
|
-
{{
|
401
|
+
{{9}}.special{{/9}}
|
402
|
+
{{10}}color{{/10}}: {{11}}red{{/11}}
|
403
|
+
{{12}}&:hover{{/12}}
|
404
|
+
{{13}}foo{{/13}}: {{14}}bar{{/14}}
|
405
|
+
{{15}}cursor{{/15}}: {{16}}e + -resize{{/16}}
|
406
|
+
{{17}}color{{/17}}: {{18}}opacify($translucent-red, 0.3){{/18}}
|
407
|
+
{{19}}&:after{{/19}}
|
408
|
+
{{20}}content{{/20}}: {{21}}"I ate #{5 + 10} pies #{$width} thick!"{{/21}}
|
409
|
+
{{22}}&:active{{/22}}
|
410
|
+
{{23}}color{{/23}}: {{24}}#010203 + #040506{{/24}}
|
411
|
+
{{25}}border{{/25}}: {{26}}$width solid black{{/26}}
|
412
|
+
|
413
|
+
{{2}}/* SOME COMMENT */{{/2}}
|
414
|
+
{{3}}font{{/3}}: {{4}}2px/3px{{/4}}
|
415
|
+
{{5}}family{{/5}}: {{6}}fantasy{{/6}}
|
416
|
+
{{7}}size{{/7}}: {{8}}1em + (2em * 3){{/8}}
|
417
417
|
SASS
|
418
418
|
{{1}}a{{/1}} {
|
419
|
-
/* SOME COMMENT */
|
420
|
-
{{
|
421
|
-
{{
|
422
|
-
{{
|
423
|
-
{{
|
424
|
-
{{
|
425
|
-
{{
|
426
|
-
{{
|
427
|
-
{{
|
428
|
-
{{
|
429
|
-
{{
|
430
|
-
{{
|
431
|
-
{{
|
432
|
-
{{
|
433
|
-
{{
|
419
|
+
{{2}}/* SOME COMMENT */{{/2}}
|
420
|
+
{{3}}font{{/3}}: {{4}}2px/3px{{/4}};
|
421
|
+
{{5}}font-family{{/5}}: {{6}}fantasy{{/6}};
|
422
|
+
{{7}}font-size{{/7}}: {{8}}7em{{/8}}; }
|
423
|
+
{{9}}a .special{{/9}} {
|
424
|
+
{{10}}color{{/10}}: {{11}}red{{/11}}; }
|
425
|
+
{{12}}a .special:hover{{/12}} {
|
426
|
+
{{13}}foo{{/13}}: {{14}}bar{{/14}};
|
427
|
+
{{15}}cursor{{/15}}: {{16}}e-resize{{/16}};
|
428
|
+
{{17}}color{{/17}}: {{18}}rgba(255, 0, 0, 0.8){{/18}}; }
|
429
|
+
{{19}}a .special:after{{/19}} {
|
430
|
+
{{20}}content{{/20}}: {{21}}"I ate 15 pies 2px thick!"{{/21}}; }
|
431
|
+
{{22}}a:active{{/22}} {
|
432
|
+
{{23}}color{{/23}}: {{24}}#050709{{/24}};
|
433
|
+
{{25}}border{{/25}}: {{26}}2px solid black{{/26}}; }
|
434
434
|
|
435
435
|
/*# sourceMappingURL=test.css.map */
|
436
436
|
CSS
|
@@ -846,6 +846,72 @@ SCSS
|
|
846
846
|
JSON
|
847
847
|
end
|
848
848
|
|
849
|
+
def test_scss_comment_source_range
|
850
|
+
assert_parses_with_mapping <<SCSS, <<CSS, :syntax => :scss
|
851
|
+
$var: val; {{1}}/* text */{{/1}}
|
852
|
+
|
853
|
+
{{2}}/* multiline
|
854
|
+
comment */{{/2}}
|
855
|
+
SCSS
|
856
|
+
{{1}}/* text */{{/1}}
|
857
|
+
{{2}}/* multiline
|
858
|
+
comment */{{/2}}
|
859
|
+
|
860
|
+
/*# sourceMappingURL=test.css.map */
|
861
|
+
CSS
|
862
|
+
end
|
863
|
+
|
864
|
+
def test_sass_comment_source_range
|
865
|
+
assert_parses_with_mapping <<SASS, <<CSS, :syntax => :sass
|
866
|
+
{{1}}body{{/1}}
|
867
|
+
{{2}}/* text */{{/2}}
|
868
|
+
|
869
|
+
{{3}}/* multiline
|
870
|
+
comment */{{/3}}
|
871
|
+
SASS
|
872
|
+
{{1}}body{{/1}} {
|
873
|
+
{{2}}/* text */{{/2}} }
|
874
|
+
|
875
|
+
{{3}}/* multiline
|
876
|
+
* comment */{{/3}}
|
877
|
+
|
878
|
+
/*# sourceMappingURL=test.css.map */
|
879
|
+
CSS
|
880
|
+
end
|
881
|
+
|
882
|
+
def test_scss_comment_interpolation_source_range
|
883
|
+
assert_parses_with_mapping <<SCSS, <<CSS, :syntax => :scss
|
884
|
+
$var: 2; {{1}}/* two \#{$var} and four \#{2 * $var} */{{/1}}
|
885
|
+
|
886
|
+
{{2}}/* multiline
|
887
|
+
comment \#{ 2 + 2 } and \#{ 2 +
|
888
|
+
2 } */{{/2}}
|
889
|
+
SCSS
|
890
|
+
{{1}}/* two 2 and four 4 */{{/1}}
|
891
|
+
{{2}}/* multiline
|
892
|
+
comment 4 and 4 */{{/2}}
|
893
|
+
|
894
|
+
/*# sourceMappingURL=test.css.map */
|
895
|
+
CSS
|
896
|
+
end
|
897
|
+
|
898
|
+
def test_sass_comment_interpolation_source_range
|
899
|
+
assert_parses_with_mapping <<SASS, <<CSS, :syntax => :sass
|
900
|
+
$var: 2
|
901
|
+
{{1}}/* two \#{$var} and four \#{2 * $var} */{{/1}}
|
902
|
+
|
903
|
+
{{2}}/* multiline
|
904
|
+
comment \#{ 2 + 2 } and \#{ 2 +
|
905
|
+
2 } */{{/2}}
|
906
|
+
SASS
|
907
|
+
{{1}}/* two 2 and four 4 */{{/1}}
|
908
|
+
{{2}}/* multiline
|
909
|
+
* comment 4 and 4 */{{/2}}
|
910
|
+
|
911
|
+
/*# sourceMappingURL=test.css.map */
|
912
|
+
CSS
|
913
|
+
end
|
914
|
+
|
849
915
|
private
|
850
916
|
|
851
917
|
ANNOTATION_REGEX = /\{\{(\/?)([^}]+)\}\}/
|