sass 3.3.0 → 3.4.25
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 +4 -4
- data/.yardopts +3 -1
- data/CODE_OF_CONDUCT.md +10 -0
- data/CONTRIBUTING.md +148 -0
- data/MIT-LICENSE +1 -1
- data/README.md +76 -62
- data/Rakefile +104 -24
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/VERSION_NAME +1 -1
- data/bin/sass +1 -1
- data/bin/scss +1 -1
- data/extra/sass-spec-ref.sh +32 -0
- data/extra/update_watch.rb +1 -1
- data/lib/sass/cache_stores/filesystem.rb +9 -5
- data/lib/sass/cache_stores/memory.rb +4 -5
- data/lib/sass/callbacks.rb +2 -2
- data/lib/sass/css.rb +12 -13
- data/lib/sass/deprecation.rb +55 -0
- data/lib/sass/engine.rb +106 -70
- data/lib/sass/environment.rb +39 -19
- data/lib/sass/error.rb +17 -20
- data/lib/sass/exec/base.rb +199 -0
- data/lib/sass/exec/sass_convert.rb +283 -0
- data/lib/sass/exec/sass_scss.rb +440 -0
- data/lib/sass/exec.rb +5 -771
- data/lib/sass/features.rb +9 -2
- data/lib/sass/importers/base.rb +8 -3
- data/lib/sass/importers/filesystem.rb +30 -38
- data/lib/sass/logger/base.rb +8 -2
- data/lib/sass/logger/delayed.rb +50 -0
- data/lib/sass/logger.rb +8 -3
- data/lib/sass/media.rb +1 -4
- data/lib/sass/plugin/compiler.rb +224 -90
- data/lib/sass/plugin/configuration.rb +38 -22
- data/lib/sass/plugin/merb.rb +2 -2
- data/lib/sass/plugin/rack.rb +3 -3
- data/lib/sass/plugin/rails.rb +1 -1
- data/lib/sass/plugin/staleness_checker.rb +4 -4
- data/lib/sass/plugin.rb +6 -5
- data/lib/sass/script/css_lexer.rb +1 -1
- data/lib/sass/script/css_parser.rb +2 -3
- data/lib/sass/script/css_variable_warning.rb +52 -0
- data/lib/sass/script/functions.rb +739 -318
- data/lib/sass/script/lexer.rb +134 -54
- data/lib/sass/script/parser.rb +252 -56
- data/lib/sass/script/tree/funcall.rb +13 -6
- data/lib/sass/script/tree/interpolation.rb +127 -4
- data/lib/sass/script/tree/list_literal.rb +31 -4
- data/lib/sass/script/tree/literal.rb +4 -0
- data/lib/sass/script/tree/node.rb +21 -3
- data/lib/sass/script/tree/operation.rb +54 -1
- data/lib/sass/script/tree/selector.rb +26 -0
- data/lib/sass/script/tree/string_interpolation.rb +59 -38
- data/lib/sass/script/tree/variable.rb +1 -1
- data/lib/sass/script/tree.rb +1 -0
- data/lib/sass/script/value/base.rb +17 -14
- data/lib/sass/script/value/bool.rb +0 -5
- data/lib/sass/script/value/color.rb +78 -42
- data/lib/sass/script/value/helpers.rb +119 -2
- data/lib/sass/script/value/list.rb +0 -15
- data/lib/sass/script/value/map.rb +1 -1
- data/lib/sass/script/value/null.rb +0 -5
- data/lib/sass/script/value/number.rb +112 -31
- data/lib/sass/script/value/string.rb +102 -13
- data/lib/sass/script/value.rb +0 -1
- data/lib/sass/script.rb +3 -3
- data/lib/sass/scss/css_parser.rb +24 -4
- data/lib/sass/scss/parser.rb +290 -383
- data/lib/sass/scss/rx.rb +17 -9
- data/lib/sass/scss/static_parser.rb +306 -4
- data/lib/sass/scss.rb +0 -2
- data/lib/sass/selector/abstract_sequence.rb +35 -18
- data/lib/sass/selector/comma_sequence.rb +114 -19
- data/lib/sass/selector/pseudo.rb +266 -0
- data/lib/sass/selector/sequence.rb +146 -40
- data/lib/sass/selector/simple.rb +22 -33
- data/lib/sass/selector/simple_sequence.rb +122 -39
- data/lib/sass/selector.rb +57 -197
- data/lib/sass/shared.rb +2 -2
- data/lib/sass/source/map.rb +31 -14
- data/lib/sass/source/position.rb +4 -4
- data/lib/sass/stack.rb +2 -8
- data/lib/sass/supports.rb +10 -13
- data/lib/sass/tree/at_root_node.rb +1 -0
- data/lib/sass/tree/charset_node.rb +1 -1
- data/lib/sass/tree/comment_node.rb +1 -1
- data/lib/sass/tree/css_import_node.rb +9 -1
- data/lib/sass/tree/directive_node.rb +8 -2
- data/lib/sass/tree/error_node.rb +18 -0
- data/lib/sass/tree/extend_node.rb +1 -1
- data/lib/sass/tree/function_node.rb +9 -0
- data/lib/sass/tree/import_node.rb +6 -5
- data/lib/sass/tree/keyframe_rule_node.rb +15 -0
- data/lib/sass/tree/node.rb +5 -3
- data/lib/sass/tree/prop_node.rb +6 -7
- data/lib/sass/tree/rule_node.rb +26 -11
- data/lib/sass/tree/visitors/check_nesting.rb +56 -32
- data/lib/sass/tree/visitors/convert.rb +59 -44
- data/lib/sass/tree/visitors/cssize.rb +34 -30
- data/lib/sass/tree/visitors/deep_copy.rb +6 -1
- data/lib/sass/tree/visitors/extend.rb +15 -13
- data/lib/sass/tree/visitors/perform.rb +87 -50
- data/lib/sass/tree/visitors/set_options.rb +15 -1
- data/lib/sass/tree/visitors/to_css.rb +72 -43
- data/lib/sass/util/multibyte_string_scanner.rb +0 -2
- data/lib/sass/util/normalized_map.rb +0 -1
- data/lib/sass/util/subset_map.rb +2 -3
- data/lib/sass/util.rb +334 -154
- data/lib/sass/version.rb +7 -7
- data/lib/sass.rb +10 -8
- data/test/sass/cache_test.rb +62 -20
- data/test/sass/callbacks_test.rb +1 -1
- data/test/sass/compiler_test.rb +24 -11
- data/test/sass/conversion_test.rb +241 -50
- data/test/sass/css2sass_test.rb +73 -5
- data/test/sass/css_variable_test.rb +132 -0
- data/test/sass/encoding_test.rb +219 -0
- data/test/sass/engine_test.rb +343 -260
- data/test/sass/exec_test.rb +12 -2
- data/test/sass/extend_test.rb +333 -44
- data/test/sass/functions_test.rb +353 -260
- data/test/sass/importer_test.rb +40 -21
- data/test/sass/logger_test.rb +1 -1
- data/test/sass/more_results/more_import.css +1 -1
- data/test/sass/more_templates/more1.sass +10 -10
- data/test/sass/more_templates/more_import.sass +2 -2
- data/test/sass/plugin_test.rb +24 -21
- data/test/sass/results/compact.css +1 -1
- data/test/sass/results/complex.css +4 -4
- data/test/sass/results/expanded.css +1 -1
- data/test/sass/results/import.css +1 -1
- data/test/sass/results/import_charset_ibm866.css +2 -2
- data/test/sass/results/mixins.css +17 -17
- data/test/sass/results/nested.css +1 -1
- data/test/sass/results/parent_ref.css +2 -2
- data/test/sass/results/script.css +5 -5
- data/test/sass/results/scss_import.css +1 -1
- data/test/sass/script_conversion_test.rb +71 -39
- data/test/sass/script_test.rb +714 -123
- data/test/sass/scss/css_test.rb +213 -30
- data/test/sass/scss/rx_test.rb +8 -4
- data/test/sass/scss/scss_test.rb +766 -22
- data/test/sass/source_map_test.rb +263 -95
- data/test/sass/superselector_test.rb +210 -0
- data/test/sass/templates/_partial.sass +1 -1
- data/test/sass/templates/basic.sass +10 -10
- data/test/sass/templates/bork1.sass +1 -1
- data/test/sass/templates/bork5.sass +1 -1
- data/test/sass/templates/compact.sass +10 -10
- data/test/sass/templates/complex.sass +187 -187
- data/test/sass/templates/compressed.sass +10 -10
- data/test/sass/templates/expanded.sass +10 -10
- data/test/sass/templates/import.sass +2 -2
- data/test/sass/templates/importee.sass +3 -3
- data/test/sass/templates/mixins.sass +22 -22
- data/test/sass/templates/multiline.sass +4 -4
- data/test/sass/templates/nested.sass +13 -13
- data/test/sass/templates/parent_ref.sass +12 -12
- data/test/sass/templates/script.sass +70 -70
- data/test/sass/templates/scss_import.scss +2 -1
- data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +1 -1
- data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +2 -2
- data/test/sass/templates/subdir/subdir.sass +3 -3
- data/test/sass/templates/units.sass +10 -10
- data/test/sass/test_helper.rb +1 -1
- data/test/sass/util/multibyte_string_scanner_test.rb +11 -3
- data/test/sass/util/normalized_map_test.rb +1 -1
- data/test/sass/util/subset_map_test.rb +2 -2
- data/test/sass/util_test.rb +46 -45
- data/test/sass/value_helpers_test.rb +5 -7
- data/test/sass-spec.yml +3 -0
- data/test/test_helper.rb +7 -6
- data/vendor/listen/CHANGELOG.md +1 -228
- data/vendor/listen/Gemfile +5 -15
- data/vendor/listen/README.md +111 -77
- data/vendor/listen/Rakefile +0 -42
- data/vendor/listen/lib/listen/adapter.rb +195 -82
- data/vendor/listen/lib/listen/adapters/bsd.rb +27 -64
- data/vendor/listen/lib/listen/adapters/darwin.rb +21 -58
- data/vendor/listen/lib/listen/adapters/linux.rb +23 -55
- data/vendor/listen/lib/listen/adapters/polling.rb +25 -34
- data/vendor/listen/lib/listen/adapters/windows.rb +50 -46
- data/vendor/listen/lib/listen/directory_record.rb +96 -61
- data/vendor/listen/lib/listen/listener.rb +135 -37
- data/vendor/listen/lib/listen/turnstile.rb +9 -5
- data/vendor/listen/lib/listen/version.rb +1 -1
- data/vendor/listen/lib/listen.rb +33 -19
- data/vendor/listen/listen.gemspec +6 -0
- data/vendor/listen/spec/listen/adapter_spec.rb +43 -77
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +8 -8
- data/vendor/listen/spec/listen/directory_record_spec.rb +81 -56
- data/vendor/listen/spec/listen/listener_spec.rb +128 -39
- data/vendor/listen/spec/listen_spec.rb +15 -21
- data/vendor/listen/spec/spec_helper.rb +4 -0
- data/vendor/listen/spec/support/adapter_helper.rb +52 -15
- data/vendor/listen/spec/support/directory_record_helper.rb +7 -5
- data/vendor/listen/spec/support/listeners_helper.rb +30 -7
- metadata +310 -300
- data/CONTRIBUTING +0 -3
- data/ext/mkrf_conf.rb +0 -27
- data/lib/sass/script/value/deprecated_false.rb +0 -55
- data/lib/sass/scss/script_lexer.rb +0 -15
- data/lib/sass/scss/script_parser.rb +0 -25
- data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
- data/vendor/listen/lib/listen/multi_listener.rb +0 -143
- data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
- data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
@@ -3,12 +3,12 @@
|
|
3
3
|
require File.dirname(__FILE__) + '/../test_helper'
|
4
4
|
require File.dirname(__FILE__) + '/test_helper'
|
5
5
|
|
6
|
-
class SourcemapTest < Test
|
6
|
+
class SourcemapTest < MiniTest::Test
|
7
7
|
def test_to_json_requires_args
|
8
8
|
_, sourcemap = render_with_sourcemap('')
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
assert_raises(ArgumentError) {sourcemap.to_json({})}
|
10
|
+
assert_raises(ArgumentError) {sourcemap.to_json({:css_path => 'foo'})}
|
11
|
+
assert_raises(ArgumentError) {sourcemap.to_json({:sourcemap_path => 'foo'})}
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_simple_mapping_scss
|
@@ -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"
|
@@ -37,7 +37,7 @@ JSON
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def test_simple_mapping_sass
|
40
|
-
assert_parses_with_sourcemap <<SASS, <<CSS, <<JSON, :syntax => :sass
|
40
|
+
silence_warnings {assert_parses_with_sourcemap <<SASS, <<CSS, <<JSON, :syntax => :sass}
|
41
41
|
a
|
42
42
|
foo: bar
|
43
43
|
/* SOME COMMENT */
|
@@ -60,6 +60,32 @@ CSS
|
|
60
60
|
JSON
|
61
61
|
end
|
62
62
|
|
63
|
+
def test_simple_mapping_with_file_uris
|
64
|
+
uri = Sass::Util.file_uri_from_path(Sass::Util.absolute_path(filename_for_test(:scss)))
|
65
|
+
assert_parses_with_sourcemap <<SCSS, <<CSS, <<JSON, :sourcemap => :file
|
66
|
+
a {
|
67
|
+
foo: bar;
|
68
|
+
/* SOME COMMENT */
|
69
|
+
font-size: 12px;
|
70
|
+
}
|
71
|
+
SCSS
|
72
|
+
a {
|
73
|
+
foo: bar;
|
74
|
+
/* SOME COMMENT */
|
75
|
+
font-size: 12px; }
|
76
|
+
|
77
|
+
/*# sourceMappingURL=test.css.map */
|
78
|
+
CSS
|
79
|
+
{
|
80
|
+
"version": 3,
|
81
|
+
"mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;EACV,kBAAkB;EAChB,SAAS,EAAE,IAAI",
|
82
|
+
"sources": ["#{uri}"],
|
83
|
+
"names": [],
|
84
|
+
"file": "test.css"
|
85
|
+
}
|
86
|
+
JSON
|
87
|
+
end
|
88
|
+
|
63
89
|
def test_mapping_with_directory_scss
|
64
90
|
options = {:filename => "scss/style.scss", :output => "css/style.css"}
|
65
91
|
assert_parses_with_sourcemap <<SCSS, <<CSS, <<JSON, options
|
@@ -78,7 +104,7 @@ a {
|
|
78
104
|
CSS
|
79
105
|
{
|
80
106
|
"version": 3,
|
81
|
-
"mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG
|
107
|
+
"mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;EACV,kBAAkB;EAChB,SAAS,EAAE,IAAI",
|
82
108
|
"sources": ["../scss/style.scss"],
|
83
109
|
"names": [],
|
84
110
|
"file": "style.css"
|
@@ -88,7 +114,7 @@ JSON
|
|
88
114
|
|
89
115
|
def test_mapping_with_directory_sass
|
90
116
|
options = {:filename => "sass/style.sass", :output => "css/style.css", :syntax => :sass}
|
91
|
-
assert_parses_with_sourcemap <<SASS, <<CSS, <<JSON, options
|
117
|
+
silence_warnings {assert_parses_with_sourcemap <<SASS, <<CSS, <<JSON, options}
|
92
118
|
a
|
93
119
|
foo: bar
|
94
120
|
/* SOME COMMENT */
|
@@ -156,15 +182,15 @@ JSON
|
|
156
182
|
end
|
157
183
|
|
158
184
|
def test_different_charset_than_encoding_scss
|
159
|
-
assert_parses_with_sourcemap(<<SCSS.force_encoding("IBM866"), <<CSS
|
185
|
+
assert_parses_with_sourcemap(<<SCSS.force_encoding("IBM866"), <<CSS, <<JSON)
|
160
186
|
@charset "IBM866";
|
161
187
|
f\x86\x86 {
|
162
188
|
\x86: b;
|
163
189
|
}
|
164
190
|
SCSS
|
165
|
-
@charset "
|
166
|
-
f
|
167
|
-
|
191
|
+
@charset "UTF-8";
|
192
|
+
fЖЖ {
|
193
|
+
Ж: b; }
|
168
194
|
|
169
195
|
/*# sourceMappingURL=test.css.map */
|
170
196
|
CSS
|
@@ -179,14 +205,14 @@ JSON
|
|
179
205
|
end
|
180
206
|
|
181
207
|
def test_different_charset_than_encoding_sass
|
182
|
-
assert_parses_with_sourcemap(<<SASS.force_encoding("IBM866"), <<CSS
|
208
|
+
assert_parses_with_sourcemap(<<SASS.force_encoding("IBM866"), <<CSS, <<JSON, :syntax => :sass)
|
183
209
|
@charset "IBM866"
|
184
210
|
f\x86\x86
|
185
211
|
\x86: b
|
186
212
|
SASS
|
187
|
-
@charset "
|
188
|
-
f
|
189
|
-
|
213
|
+
@charset "UTF-8";
|
214
|
+
fЖЖ {
|
215
|
+
Ж: b; }
|
190
216
|
|
191
217
|
/*# sourceMappingURL=test.css.map */
|
192
218
|
CSS
|
@@ -324,44 +350,42 @@ CSS
|
|
324
350
|
$width: 2px;
|
325
351
|
$translucent-red: rgba(255, 0, 0, 0.5);
|
326
352
|
{{1}}a {{/1}}{
|
327
|
-
{{
|
328
|
-
{{
|
329
|
-
{{
|
330
|
-
{{
|
331
|
-
{{
|
332
|
-
{{
|
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}};
|
333
359
|
}
|
334
|
-
{{
|
335
|
-
{{
|
360
|
+
{{19}}&:after {{/19}}{
|
361
|
+
{{20}}content{{/20}}: {{21}}"I ate #{5 + 10} pies #{$width} thick!"{{/21}};
|
336
362
|
}
|
337
363
|
}
|
338
|
-
{{
|
339
|
-
{{
|
340
|
-
{{24}}border{{/24}}: {{25}}$width solid black{{/25}};
|
364
|
+
{{22}}&:active {{/22}}{
|
365
|
+
{{23}}border{{/23}}: {{24}}$width solid black{{/24}};
|
341
366
|
}
|
342
|
-
/* SOME COMMENT */
|
343
|
-
{{
|
344
|
-
{{
|
345
|
-
{{
|
367
|
+
{{2}}/* SOME COMMENT */{{/2}}
|
368
|
+
{{3}}font{{/3}}: {{4}}2px/3px {{/4}}{
|
369
|
+
{{5}}family{{/5}}: {{6}}fantasy{{/6}};
|
370
|
+
{{7}}size{{/7}}: {{8}}1em + (2em * 3){{/8}};
|
346
371
|
}
|
347
372
|
}
|
348
373
|
SCSS
|
349
374
|
{{1}}a{{/1}} {
|
350
|
-
/* SOME COMMENT */
|
351
|
-
{{
|
352
|
-
{{
|
353
|
-
{{
|
354
|
-
{{
|
355
|
-
{{
|
356
|
-
{{
|
357
|
-
{{
|
358
|
-
{{
|
359
|
-
{{
|
360
|
-
{{
|
361
|
-
{{
|
362
|
-
{{
|
363
|
-
{{
|
364
|
-
{{24}}border{{/24}}: {{25}}2px solid black{{/25}}; }
|
375
|
+
{{2}}/* SOME COMMENT */{{/2}}
|
376
|
+
{{3}}font{{/3}}: {{4}}2px/3px{{/4}};
|
377
|
+
{{5}}font-family{{/5}}: {{6}}fantasy{{/6}};
|
378
|
+
{{7}}font-size{{/7}}: {{8}}7em{{/8}}; }
|
379
|
+
{{9}}a .special{{/9}} {
|
380
|
+
{{10}}color{{/10}}: {{11}}red{{/11}}; }
|
381
|
+
{{12}}a .special:hover{{/12}} {
|
382
|
+
{{13}}foo{{/13}}: {{14}}bar{{/14}};
|
383
|
+
{{15}}cursor{{/15}}: {{16}}e-resize{{/16}};
|
384
|
+
{{17}}color{{/17}}: {{18}}rgba(255, 0, 0, 0.8){{/18}}; }
|
385
|
+
{{19}}a .special:after{{/19}} {
|
386
|
+
{{20}}content{{/20}}: {{21}}"I ate 15 pies 2px thick!"{{/21}}; }
|
387
|
+
{{22}}a:active{{/22}} {
|
388
|
+
{{23}}border{{/23}}: {{24}}2px solid black{{/24}}; }
|
365
389
|
|
366
390
|
/*# sourceMappingURL=test.css.map */
|
367
391
|
CSS
|
@@ -372,39 +396,37 @@ CSS
|
|
372
396
|
$width: 2px
|
373
397
|
$translucent-red: rgba(255, 0, 0, 0.5)
|
374
398
|
{{1}}a{{/1}}
|
375
|
-
{{
|
376
|
-
{{
|
377
|
-
{{
|
378
|
-
{{
|
379
|
-
{{
|
380
|
-
{{
|
381
|
-
{{
|
382
|
-
{{
|
383
|
-
{{
|
384
|
-
{{
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
{{
|
390
|
-
{{6}}size{{/6}}: {{7}}1em + (2em * 3){{/7}}
|
399
|
+
{{9}}.special{{/9}}
|
400
|
+
{{10}}color{{/10}}: {{11}}red{{/11}}
|
401
|
+
{{12}}&:hover{{/12}}
|
402
|
+
{{13}}foo{{/13}}: {{14}}bar{{/14}}
|
403
|
+
{{15}}cursor{{/15}}: {{16}}e + -resize{{/16}}
|
404
|
+
{{17}}color{{/17}}: {{18}}opacify($translucent-red, 0.3){{/18}}
|
405
|
+
{{19}}&:after{{/19}}
|
406
|
+
{{20}}content{{/20}}: {{21}}"I ate #{5 + 10} pies #{$width} thick!"{{/21}}
|
407
|
+
{{22}}&:active{{/22}}
|
408
|
+
{{23}}border{{/23}}: {{24}}$width solid black{{/24}}
|
409
|
+
|
410
|
+
{{2}}/* SOME COMMENT */{{/2}}
|
411
|
+
{{3}}font{{/3}}: {{4}}2px/3px{{/4}}
|
412
|
+
{{5}}family{{/5}}: {{6}}fantasy{{/6}}
|
413
|
+
{{7}}size{{/7}}: {{8}}1em + (2em * 3){{/8}}
|
391
414
|
SASS
|
392
415
|
{{1}}a{{/1}} {
|
393
|
-
/* SOME COMMENT */
|
394
|
-
{{
|
395
|
-
{{
|
396
|
-
{{
|
397
|
-
{{
|
398
|
-
{{
|
399
|
-
{{
|
400
|
-
{{
|
401
|
-
{{
|
402
|
-
{{
|
403
|
-
{{
|
404
|
-
{{
|
405
|
-
{{
|
406
|
-
{{
|
407
|
-
{{24}}border{{/24}}: {{25}}2px solid black{{/25}}; }
|
416
|
+
{{2}}/* SOME COMMENT */{{/2}}
|
417
|
+
{{3}}font{{/3}}: {{4}}2px/3px{{/4}};
|
418
|
+
{{5}}font-family{{/5}}: {{6}}fantasy{{/6}};
|
419
|
+
{{7}}font-size{{/7}}: {{8}}7em{{/8}}; }
|
420
|
+
{{9}}a .special{{/9}} {
|
421
|
+
{{10}}color{{/10}}: {{11}}red{{/11}}; }
|
422
|
+
{{12}}a .special:hover{{/12}} {
|
423
|
+
{{13}}foo{{/13}}: {{14}}bar{{/14}};
|
424
|
+
{{15}}cursor{{/15}}: {{16}}e-resize{{/16}};
|
425
|
+
{{17}}color{{/17}}: {{18}}rgba(255, 0, 0, 0.8){{/18}}; }
|
426
|
+
{{19}}a .special:after{{/19}} {
|
427
|
+
{{20}}content{{/20}}: {{21}}"I ate 15 pies 2px thick!"{{/21}}; }
|
428
|
+
{{22}}a:active{{/22}} {
|
429
|
+
{{23}}border{{/23}}: {{24}}2px solid black{{/24}}; }
|
408
430
|
|
409
431
|
/*# sourceMappingURL=test.css.map */
|
410
432
|
CSS
|
@@ -443,8 +465,8 @@ CSS
|
|
443
465
|
{{7}}border-width{{/7}}: {{8}}3px{{/8}}
|
444
466
|
SASS
|
445
467
|
{{1}}.error, .seriousError{{/1}} {
|
446
|
-
{{2}}border{{/2}}: {{3}}1px
|
447
|
-
{{4}}background-color{{/4}}: {{5}}#
|
468
|
+
{{2}}border{{/2}}: {{3}}1px #f00{{/3}};
|
469
|
+
{{4}}background-color{{/4}}: {{5}}#fdd{{/5}}; }
|
448
470
|
|
449
471
|
{{6}}.seriousError{{/6}} {
|
450
472
|
{{7}}border-width{{/7}}: {{8}}3px{{/8}}; }
|
@@ -632,16 +654,16 @@ SCSS
|
|
632
654
|
{{22}}border-style{{/22}}: {{23}}dashed{{/23}}; }
|
633
655
|
|
634
656
|
{{24}}.shadows{{/24}} {
|
635
|
-
{{25}}-moz-box-shadow{{/25}}: {{26}}0px 4px 5px #
|
636
|
-
{{27}}-webkit-box-shadow{{/27}}: {{28}}0px 4px 5px #
|
637
|
-
{{29}}box-shadow{{/29}}: {{30}}0px 4px 5px #
|
657
|
+
{{25}}-moz-box-shadow{{/25}}: {{26}}0px 4px 5px #666, 2px 6px 10px #999{{/26}};
|
658
|
+
{{27}}-webkit-box-shadow{{/27}}: {{28}}0px 4px 5px #666, 2px 6px 10px #999{{/28}};
|
659
|
+
{{29}}box-shadow{{/29}}: {{30}}0px 4px 5px #666, 2px 6px 10px #999{{/30}}; }
|
638
660
|
|
639
661
|
/*# sourceMappingURL=test.css.map */
|
640
662
|
CSS
|
641
663
|
end
|
642
664
|
|
643
665
|
def test_mixin_sourcemap_sass
|
644
|
-
assert_parses_with_mapping <<'SASS', <<'CSS', :syntax => :sass
|
666
|
+
silence_warnings {assert_parses_with_mapping <<'SASS', <<'CSS', :syntax => :sass}
|
645
667
|
=large-text
|
646
668
|
:font
|
647
669
|
{{2}}size{{/2}}: {{3}}20px{{/3}}
|
@@ -675,7 +697,7 @@ SASS
|
|
675
697
|
{{1}}.page-title{{/1}} {
|
676
698
|
{{2}}font-size{{/2}}: {{3}}20px{{/3}};
|
677
699
|
{{4}}font-weight{{/4}}: {{5}}bold{{/5}};
|
678
|
-
{{6}}color{{/6}}: {{7}}
|
700
|
+
{{6}}color{{/6}}: {{7}}#ff0000{{/7}};
|
679
701
|
{{8}}padding{{/8}}: {{9}}4px{{/9}}; }
|
680
702
|
|
681
703
|
{{10}}p{{/10}} {
|
@@ -689,9 +711,9 @@ SASS
|
|
689
711
|
{{22}}border-style{{/22}}: {{23}}dashed{{/23}}; }
|
690
712
|
|
691
713
|
{{24}}.shadows{{/24}} {
|
692
|
-
{{25}}-moz-box-shadow{{/25}}: {{26}}0px 4px 5px #
|
693
|
-
{{27}}-webkit-box-shadow{{/27}}: {{28}}0px 4px 5px #
|
694
|
-
{{29}}box-shadow{{/29}}: {{30}}0px 4px 5px #
|
714
|
+
{{25}}-moz-box-shadow{{/25}}: {{26}}0px 4px 5px #666, 2px 6px 10px #999{{/26}};
|
715
|
+
{{27}}-webkit-box-shadow{{/27}}: {{28}}0px 4px 5px #666, 2px 6px 10px #999{{/28}};
|
716
|
+
{{29}}box-shadow{{/29}}: {{30}}0px 4px 5px #666, 2px 6px 10px #999{{/30}}; }
|
695
717
|
|
696
718
|
/*# sourceMappingURL=test.css.map */
|
697
719
|
CSS
|
@@ -735,7 +757,7 @@ CSS
|
|
735
757
|
# Regression tests
|
736
758
|
|
737
759
|
def test_properties_sass
|
738
|
-
assert_parses_with_mapping <<SASS, <<CSS, :syntax => :sass
|
760
|
+
silence_warnings {assert_parses_with_mapping <<SASS, <<CSS, :syntax => :sass}
|
739
761
|
{{1}}.foo{{/1}}
|
740
762
|
:{{2}}name{{/2}} {{3}}value{{/3}}
|
741
763
|
{{4}}name{{/4}}: {{5}}value{{/5}}
|
@@ -748,6 +770,140 @@ SASS
|
|
748
770
|
{{6}}name{{/6}}: {{7}}value{{/7}};
|
749
771
|
{{8}}name{{/8}}: {{9}}value{{/9}}; }
|
750
772
|
|
773
|
+
/*# sourceMappingURL=test.css.map */
|
774
|
+
CSS
|
775
|
+
end
|
776
|
+
|
777
|
+
def test_multiline_script_scss
|
778
|
+
assert_parses_with_mapping <<SCSS, <<CSS, :syntax => :scss
|
779
|
+
$var: {{3}}foo +
|
780
|
+
bar{{/3}}; {{1}}x {{/1}}{ {{2}}y{{/2}}: $var }
|
781
|
+
SCSS
|
782
|
+
{{1}}x{{/1}} {
|
783
|
+
{{2}}y{{/2}}: {{3}}foobar{{/3}}; }
|
784
|
+
|
785
|
+
/*# sourceMappingURL=test.css.map */
|
786
|
+
CSS
|
787
|
+
end
|
788
|
+
|
789
|
+
def test_multiline_interpolation_source_range
|
790
|
+
engine = Sass::Engine.new(<<-SCSS, :cache => false, :syntax => :scss)
|
791
|
+
p {
|
792
|
+
filter: progid:DXImageTransform(
|
793
|
+
'\#{123}');
|
794
|
+
}
|
795
|
+
SCSS
|
796
|
+
|
797
|
+
interpolated = engine.to_tree.children.
|
798
|
+
first.children.
|
799
|
+
first.value.children[1]
|
800
|
+
assert_equal "123", interpolated.to_sass
|
801
|
+
range = interpolated.source_range
|
802
|
+
assert_equal 3, range.start_pos.line
|
803
|
+
assert_equal 14, range.start_pos.offset
|
804
|
+
assert_equal 3, range.end_pos.line
|
805
|
+
assert_equal 17, range.end_pos.offset
|
806
|
+
end
|
807
|
+
|
808
|
+
def test_list_source_range
|
809
|
+
engine = Sass::Engine.new(<<-SCSS, :cache => false, :syntax => :scss)
|
810
|
+
@each $a, $b in (1, 2), (2, 4), (3, 6) { }
|
811
|
+
SCSS
|
812
|
+
list = engine.to_tree.children.first.list
|
813
|
+
assert_equal 1, list.source_range.start_pos.line
|
814
|
+
assert_equal 1, list.source_range.end_pos.line
|
815
|
+
assert_equal 16, list.source_range.start_pos.offset
|
816
|
+
assert_equal 38, list.source_range.end_pos.offset
|
817
|
+
end
|
818
|
+
|
819
|
+
def test_sources_array_is_uri_escaped
|
820
|
+
map = Sass::Source::Map.new
|
821
|
+
importer = Sass::Importers::Filesystem.new('.')
|
822
|
+
map.add(
|
823
|
+
Sass::Source::Range.new(
|
824
|
+
Sass::Source::Position.new(0, 0),
|
825
|
+
Sass::Source::Position.new(0, 10),
|
826
|
+
'source file.scss',
|
827
|
+
importer),
|
828
|
+
Sass::Source::Range.new(
|
829
|
+
Sass::Source::Position.new(0, 0),
|
830
|
+
Sass::Source::Position.new(0, 10),
|
831
|
+
nil, nil))
|
832
|
+
|
833
|
+
json = map.to_json(:css_path => 'output file.css', :sourcemap_path => 'output file.css.map')
|
834
|
+
assert_equal json, <<JSON.rstrip
|
835
|
+
{
|
836
|
+
"version": 3,
|
837
|
+
"mappings": "DADD,UAAU",
|
838
|
+
"sources": ["source%20file.scss"],
|
839
|
+
"names": [],
|
840
|
+
"file": "output%20file.css"
|
841
|
+
}
|
842
|
+
JSON
|
843
|
+
end
|
844
|
+
|
845
|
+
def test_scss_comment_source_range
|
846
|
+
assert_parses_with_mapping <<SCSS, <<CSS, :syntax => :scss
|
847
|
+
$var: val; {{1}}/* text */{{/1}}
|
848
|
+
|
849
|
+
{{2}}/* multiline
|
850
|
+
comment */{{/2}}
|
851
|
+
SCSS
|
852
|
+
{{1}}/* text */{{/1}}
|
853
|
+
{{2}}/* multiline
|
854
|
+
comment */{{/2}}
|
855
|
+
|
856
|
+
/*# sourceMappingURL=test.css.map */
|
857
|
+
CSS
|
858
|
+
end
|
859
|
+
|
860
|
+
def test_sass_comment_source_range
|
861
|
+
assert_parses_with_mapping <<SASS, <<CSS, :syntax => :sass
|
862
|
+
{{1}}body{{/1}}
|
863
|
+
{{2}}/* text */{{/2}}
|
864
|
+
|
865
|
+
{{3}}/* multiline
|
866
|
+
comment */{{/3}}
|
867
|
+
SASS
|
868
|
+
{{1}}body{{/1}} {
|
869
|
+
{{2}}/* text */{{/2}} }
|
870
|
+
|
871
|
+
{{3}}/* multiline
|
872
|
+
* comment */{{/3}}
|
873
|
+
|
874
|
+
/*# sourceMappingURL=test.css.map */
|
875
|
+
CSS
|
876
|
+
end
|
877
|
+
|
878
|
+
def test_scss_comment_interpolation_source_range
|
879
|
+
assert_parses_with_mapping <<SCSS, <<CSS, :syntax => :scss
|
880
|
+
$var: 2; {{1}}/* two \#{$var} and four \#{2 * $var} */{{/1}}
|
881
|
+
|
882
|
+
{{2}}/* multiline
|
883
|
+
comment \#{ 2 + 2 } and \#{ 2 +
|
884
|
+
2 } */{{/2}}
|
885
|
+
SCSS
|
886
|
+
{{1}}/* two 2 and four 4 */{{/1}}
|
887
|
+
{{2}}/* multiline
|
888
|
+
comment 4 and 4 */{{/2}}
|
889
|
+
|
890
|
+
/*# sourceMappingURL=test.css.map */
|
891
|
+
CSS
|
892
|
+
end
|
893
|
+
|
894
|
+
def test_sass_comment_interpolation_source_range
|
895
|
+
assert_parses_with_mapping <<SASS, <<CSS, :syntax => :sass
|
896
|
+
$var: 2
|
897
|
+
{{1}}/* two \#{$var} and four \#{2 * $var} */{{/1}}
|
898
|
+
|
899
|
+
{{2}}/* multiline
|
900
|
+
comment \#{ 2 + 2 } and \#{ 2 +
|
901
|
+
2 } */{{/2}}
|
902
|
+
SASS
|
903
|
+
{{1}}/* two 2 and four 4 */{{/1}}
|
904
|
+
{{2}}/* multiline
|
905
|
+
* comment 4 and 4 */{{/2}}
|
906
|
+
|
751
907
|
/*# sourceMappingURL=test.css.map */
|
752
908
|
CSS
|
753
909
|
end
|
@@ -787,11 +943,12 @@ CSS
|
|
787
943
|
source_ranges = build_ranges(source, source_file_name)
|
788
944
|
target_ranges = build_ranges(css)
|
789
945
|
map = Sass::Source::Map.new
|
790
|
-
|
946
|
+
source_ranges.map do |(name, sources)|
|
791
947
|
assert(sources.length == 1, "#{sources.length} source ranges encountered for annotation #{name}")
|
792
948
|
assert(target_ranges[name], "No target ranges for annotation #{name}")
|
793
949
|
target_ranges[name].map {|target_range| [sources.first, target_range]}
|
794
|
-
end
|
950
|
+
end.
|
951
|
+
flatten(1).
|
795
952
|
sort_by {|(_, target)| [target.start_pos.line, target.start_pos.offset]}.
|
796
953
|
each {|(s2, target)| map.add(s2, target)}
|
797
954
|
map
|
@@ -810,17 +967,28 @@ CSS
|
|
810
967
|
|
811
968
|
def assert_positions_equal(expected, actual, lines, message = nil)
|
812
969
|
prefix = message ? message + ": " : ""
|
970
|
+
expected_location = lines[expected.line - 1] + "\n" + ("-" * (expected.offset - 1)) + "^"
|
971
|
+
actual_location = lines[actual.line - 1] + "\n" + ("-" * (actual.offset - 1)) + "^"
|
813
972
|
assert_equal(expected.line, actual.line, prefix +
|
814
|
-
"Expected #{expected.inspect}
|
973
|
+
"Expected #{expected.inspect}\n" +
|
974
|
+
expected_location + "\n\n" +
|
975
|
+
"But was #{actual.inspect}\n" +
|
976
|
+
actual_location)
|
815
977
|
assert_equal(expected.offset, actual.offset, prefix +
|
816
|
-
"Expected #{expected.inspect}
|
817
|
-
|
978
|
+
"Expected #{expected.inspect}\n" +
|
979
|
+
expected_location + "\n\n" +
|
980
|
+
"But was #{actual.inspect}\n" +
|
981
|
+
actual_location)
|
818
982
|
end
|
819
983
|
|
820
984
|
def assert_ranges_equal(expected, actual, lines, prefix)
|
821
985
|
assert_positions_equal(expected.start_pos, actual.start_pos, lines, prefix + " start position")
|
822
986
|
assert_positions_equal(expected.end_pos, actual.end_pos, lines, prefix + " end position")
|
823
|
-
|
987
|
+
if expected.file.nil?
|
988
|
+
assert_nil(actual.file)
|
989
|
+
else
|
990
|
+
assert_equal(expected.file, actual.file)
|
991
|
+
end
|
824
992
|
end
|
825
993
|
|
826
994
|
def assert_sourcemaps_equal(source, css, expected, actual)
|
@@ -843,7 +1011,7 @@ MESSAGE
|
|
843
1011
|
rendered, sourcemap = render_with_sourcemap(source, options)
|
844
1012
|
css_path = options[:output] || "test.css"
|
845
1013
|
sourcemap_path = Sass::Util.sourcemap_name(css_path)
|
846
|
-
rendered_json = sourcemap.to_json(:css_path => css_path, :sourcemap_path => sourcemap_path)
|
1014
|
+
rendered_json = sourcemap.to_json(:css_path => css_path, :sourcemap_path => sourcemap_path, :type => options[:sourcemap])
|
847
1015
|
|
848
1016
|
assert_equal css.rstrip, rendered.rstrip
|
849
1017
|
assert_equal sourcemap_json.rstrip, rendered_json
|