sass 3.4.19 → 3.4.20
Sign up to get free protection for your applications and to get access to all the features.
- 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 = /\{\{(\/?)([^}]+)\}\}/
|