sass 3.3.0.alpha.50 → 3.3.0.alpha.59
Sign up to get free protection for your applications and to get access to all the features.
- data/REVISION +1 -1
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/lib/sass/engine.rb +3 -1
- data/lib/sass/importers/filesystem.rb +9 -4
- data/lib/sass/plugin/compiler.rb +0 -29
- data/lib/sass/plugin/configuration.rb +0 -11
- data/lib/sass/script/number.rb +0 -11
- data/lib/sass/scss/parser.rb +3 -1
- data/lib/sass/scss/rx.rb +1 -6
- data/lib/sass/selector/simple_sequence.rb +10 -11
- data/lib/sass/source/range.rb +0 -1
- data/lib/sass/tree/visitors/extend.rb +7 -7
- data/test/sass/engine_test.rb +0 -6
- data/test/sass/extend_test.rb +78 -125
- data/test/sass/plugin_test.rb +0 -12
- data/test/sass/scss/scss_test.rb +35 -0
- metadata +10 -10
data/REVISION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
6b1a36d5126d1d8e2b9550a69e3aab09db566fed
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.3.0.alpha.
|
1
|
+
3.3.0.alpha.59
|
data/VERSION_DATE
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
22 December 2012 00:18:55 GMT
|
data/lib/sass/engine.rb
CHANGED
@@ -268,7 +268,9 @@ module Sass
|
|
268
268
|
|
269
269
|
# Render the template to CSS and return the source map.
|
270
270
|
#
|
271
|
-
# @param sourcemap_uri [String] The sourcemap URI to use in the
|
271
|
+
# @param sourcemap_uri [String] The sourcemap URI to use in the
|
272
|
+
# @sourceMappingURL comment. This should be relative to the location of
|
273
|
+
# the CSS file.
|
272
274
|
# @return [(String, Sass::Source::Map)] The rendered CSS and the associated source map
|
273
275
|
# @raise [Sass::SyntaxError] if there's an error in the document
|
274
276
|
# @raise [Encoding::UndefinedConversionError] if the source encoding
|
@@ -91,8 +91,14 @@ module Sass
|
|
91
91
|
sorted_exts = extensions.sort
|
92
92
|
syntax = extensions[extname]
|
93
93
|
|
94
|
-
|
95
|
-
|
94
|
+
if syntax
|
95
|
+
ret = [["#{dirname}/{_,}#{basename}.#{extensions.invert[syntax]}", syntax]]
|
96
|
+
else
|
97
|
+
ret = sorted_exts.map {|ext, syn| ["#{dirname}/{_,}#{basename}.#{ext}", syn]}
|
98
|
+
end
|
99
|
+
|
100
|
+
# JRuby chokes when trying to import files from JARs when the path starts with './'.
|
101
|
+
ret.map {|f, s| [f.sub(%r{^\./}, ''), s]}
|
96
102
|
end
|
97
103
|
|
98
104
|
def escape_glob_characters(name)
|
@@ -118,7 +124,7 @@ module Sass
|
|
118
124
|
end
|
119
125
|
found = Sass::Util.flatten(found, 1)
|
120
126
|
return if found.empty?
|
121
|
-
|
127
|
+
|
122
128
|
if found.size > 1 && !@same_name_warnings.include?(found.first.first)
|
123
129
|
found.each {|(f, _)| @same_name_warnings << f}
|
124
130
|
relative_to = Pathname.new(dir)
|
@@ -141,7 +147,6 @@ MESSAGE
|
|
141
147
|
WARNING: In #{File.dirname(name)}:
|
142
148
|
There are multiple files that match the name "#{File.basename(name)}":
|
143
149
|
#{candidates}
|
144
|
-
This will be an error in future versions of Sass.
|
145
150
|
WARNING
|
146
151
|
end
|
147
152
|
end
|
data/lib/sass/plugin/compiler.rb
CHANGED
@@ -69,31 +69,6 @@ module Sass::Plugin
|
|
69
69
|
# The location of the sourcemap being generated, if any.
|
70
70
|
define_callback :updated_stylesheet
|
71
71
|
|
72
|
-
# Register a callback to be run before a single stylesheet is updated.
|
73
|
-
# The callback is only run if the stylesheet is guaranteed to be updated;
|
74
|
-
# if the CSS file is fresh, this won't be run.
|
75
|
-
#
|
76
|
-
# Even if the \{file:SASS_REFERENCE.md#full_exception-option `:full_exception` option}
|
77
|
-
# is enabled, this callback won't be run
|
78
|
-
# when an exception CSS file is being written.
|
79
|
-
# To run an action for those files, use \{#on\_compilation\_error}.
|
80
|
-
#
|
81
|
-
# @yield [template, css]
|
82
|
-
# @yieldparam template [String]
|
83
|
-
# The location of the Sass/SCSS file being updated.
|
84
|
-
# @yieldparam css [String]
|
85
|
-
# The location of the CSS file being generated.
|
86
|
-
# @yieldparam sourcemap [String]
|
87
|
-
# The location of the sourcemap file being generated, if any.
|
88
|
-
define_callback :updating_stylesheet
|
89
|
-
|
90
|
-
def on_updating_stylesheet_with_deprecation_warning(&block)
|
91
|
-
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.")
|
92
|
-
on_updating_stylesheet_without_deprecation_warning(&block)
|
93
|
-
end
|
94
|
-
alias_method :on_updating_stylesheet_without_deprecation_warning, :on_updating_stylesheet
|
95
|
-
alias_method :on_updating_stylesheet, :on_updating_stylesheet_with_deprecation_warning
|
96
|
-
|
97
72
|
# Register a callback to be run when Sass decides not to update a stylesheet.
|
98
73
|
# In particular, the callback is run when Sass finds that
|
99
74
|
# the template file and none of its dependencies
|
@@ -201,8 +176,6 @@ module Sass::Plugin
|
|
201
176
|
end
|
202
177
|
end
|
203
178
|
|
204
|
-
run_updating_stylesheets individual_files
|
205
|
-
|
206
179
|
individual_files.each do |file, css, sourcemap|
|
207
180
|
# TODO: Does staleness_checker need to check the sourcemap file as well?
|
208
181
|
if options[:always_update] || staleness_checker.stylesheet_needs_update?(css, file)
|
@@ -355,8 +328,6 @@ module Sass::Plugin
|
|
355
328
|
compilation_error_occured = true
|
356
329
|
run_compilation_error e, filename, css, sourcemap
|
357
330
|
rendered = Sass::SyntaxError.exception_to_css(e, options)
|
358
|
-
else
|
359
|
-
run_updating_stylesheet filename, css, sourcemap
|
360
331
|
end
|
361
332
|
|
362
333
|
write_file(css, rendered)
|
@@ -33,17 +33,6 @@ module Sass
|
|
33
33
|
@options ||= default_options.dup
|
34
34
|
end
|
35
35
|
|
36
|
-
# Sets the options hash.
|
37
|
-
# See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
|
38
|
-
# See {Sass::Plugin::Configuration#reset!}
|
39
|
-
# @deprecated Instead, modify the options hash in-place.
|
40
|
-
# @param value [{Symbol => Object}] The options hash
|
41
|
-
def options=(value)
|
42
|
-
Sass::Util.sass_warn("Setting Sass::Plugin.options is deprecated " +
|
43
|
-
"and will be removed in a future release.")
|
44
|
-
options.merge!(value)
|
45
|
-
end
|
46
|
-
|
47
36
|
# Adds a new template-location/css-location mapping.
|
48
37
|
# This means that Sass/SCSS files in `template_location`
|
49
38
|
# will be compiled to CSS files in `css_location`.
|
data/lib/sass/script/number.rb
CHANGED
@@ -53,17 +53,6 @@ module Sass::Script
|
|
53
53
|
@precision_factor ||= 10.0**precision
|
54
54
|
end
|
55
55
|
|
56
|
-
# Handles the deprecation warning for the PRECISION constant
|
57
|
-
# This can be removed in 3.2.
|
58
|
-
def self.const_missing(const)
|
59
|
-
if const == :PRECISION
|
60
|
-
Sass::Util.sass_warn("Sass::Script::Number::PRECISION is deprecated and will be removed in a future release. Use Sass::Script::Number.precision_factor instead.")
|
61
|
-
const_set(:PRECISION, self.precision_factor)
|
62
|
-
else
|
63
|
-
super
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
56
|
# Used so we don't allocate two new arrays for each new number.
|
68
57
|
NO_UNITS = []
|
69
58
|
|
data/lib/sass/scss/parser.rb
CHANGED
data/lib/sass/scss/rx.rb
CHANGED
@@ -128,12 +128,7 @@ module Sass
|
|
128
128
|
# We could use it for 1.9 only, but I don't want to introduce a cross-version
|
129
129
|
# behavior difference.
|
130
130
|
# In any case, almost all CSS idents will be matched by this.
|
131
|
-
|
132
|
-
# We explicitly avoid parsing newlines or values/selectors longer than
|
133
|
-
# about 50 characters. This mitigates the problem of exponential parsing
|
134
|
-
# time when a value has a long string of valid, parsable content followed
|
135
|
-
# by something invalid.
|
136
|
-
STATIC_VALUE = /(-?#{NMSTART}|#{STRING_NOINTERP}|[ \t](?!%)|#[a-f0-9]|[,%]|#{NUM}|\!important){1,50}([;}])/i
|
131
|
+
STATIC_VALUE = /(-?#{NMSTART}|#{STRING_NOINTERP}|#[a-f0-9]|[,%]|-?#{NUMBER}|\!important)+([;}])/i
|
137
132
|
STATIC_SELECTOR = /(#{NMCHAR}|[ \t]|[,>+*]|[:#.]#{NMSTART}){0,50}([{])/i
|
138
133
|
end
|
139
134
|
end
|
@@ -105,7 +105,7 @@ module Sass
|
|
105
105
|
group.each {|e, _| e.result = :failed_to_unify}
|
106
106
|
next unless unified = seq.members.last.unify(self_without_sel, subject?)
|
107
107
|
group.each {|e, _| e.result = :succeeded}
|
108
|
-
|
108
|
+
group.each {|e, _| check_directives_match!(e, parent_directives)}
|
109
109
|
new_seq = Sequence.new(seq.members[0...-1] + [unified])
|
110
110
|
new_seq.add_sources!(sources + [seq])
|
111
111
|
[sels, new_seq]
|
@@ -180,16 +180,15 @@ module Sass
|
|
180
180
|
def check_directives_match!(extend, parent_directives)
|
181
181
|
dirs1 = extend.directives.map {|d| d.resolved_value}
|
182
182
|
dirs2 = parent_directives.map {|d| d.resolved_value}
|
183
|
-
return
|
184
|
-
|
185
|
-
Sass
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
return false
|
183
|
+
return if Sass::Util.subsequence?(dirs1, dirs2)
|
184
|
+
|
185
|
+
# TODO(nweiz): this should use the Sass stack trace of the extend node,
|
186
|
+
# not the selector.
|
187
|
+
raise Sass::SyntaxError.new(<<MESSAGE)
|
188
|
+
You may not @extend an outer selector from within #{extend.directives.last.name}.
|
189
|
+
You may only @extend selectors within the same directive.
|
190
|
+
From "@extend #{extend.target.join(', ')}" on line #{extend.node.line}#{" of #{extend.node.filename}" if extend.node.filename}.
|
191
|
+
MESSAGE
|
193
192
|
end
|
194
193
|
|
195
194
|
def _hash
|
data/lib/sass/source/range.rb
CHANGED
@@ -20,7 +20,6 @@ module Sass::Source
|
|
20
20
|
# @param end_pos [Sass::Source::Position] See \{#end_pos}
|
21
21
|
# @param file [String] See \{#file}
|
22
22
|
def initialize(start_pos, end_pos, file)
|
23
|
-
raise 'hell' if end_pos.is_a?(Fixnum)
|
24
23
|
@start_pos = start_pos
|
25
24
|
@end_pos = end_pos
|
26
25
|
@file = file
|
@@ -49,7 +49,7 @@ class Sass::Tree::Visitors::Extend < Sass::Tree::Visitors::Base
|
|
49
49
|
def self.check_extends_fired!(extends)
|
50
50
|
extends.each_value do |ex|
|
51
51
|
next if ex.result == :succeeded || ex.node.optional?
|
52
|
-
|
52
|
+
message = "\"#{ex.extender}\" failed to @extend \"#{ex.target.join}\"."
|
53
53
|
reason =
|
54
54
|
if ex.result == :not_found
|
55
55
|
"The selector \"#{ex.target.join}\" was not found."
|
@@ -57,12 +57,12 @@ class Sass::Tree::Visitors::Extend < Sass::Tree::Visitors::Base
|
|
57
57
|
"No selectors matching \"#{ex.target.join}\" could be unified with \"#{ex.extender}\"."
|
58
58
|
end
|
59
59
|
|
60
|
-
Sass
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
60
|
+
# TODO(nweiz): this should use the Sass stack trace of the extend node.
|
61
|
+
raise Sass::SyntaxError.new(<<MESSAGE, :filename => ex.node.filename, :line => ex.node.line)
|
62
|
+
#{message}
|
63
|
+
#{reason}
|
64
|
+
Use "@extend #{ex.target.join} !optional" if the extend should be able to fail.
|
65
|
+
MESSAGE
|
66
66
|
end
|
67
67
|
end
|
68
68
|
end
|
data/test/sass/engine_test.rb
CHANGED
@@ -2903,12 +2903,6 @@ SCSS
|
|
2903
2903
|
assert_equal original_filename, importer.engine("imported").options[:original_filename]
|
2904
2904
|
end
|
2905
2905
|
|
2906
|
-
def test_deprecated_PRECISION
|
2907
|
-
assert_warning(<<END) {assert_equal 100_000.0, Sass::Script::Number::PRECISION}
|
2908
|
-
Sass::Script::Number::PRECISION is deprecated and will be removed in a future release. Use Sass::Script::Number.precision_factor instead.
|
2909
|
-
END
|
2910
|
-
end
|
2911
|
-
|
2912
2906
|
def test_changing_precision
|
2913
2907
|
old_precision = Sass::Script::Number.precision
|
2914
2908
|
begin
|
data/test/sass/extend_test.rb
CHANGED
@@ -154,7 +154,7 @@ SCSS
|
|
154
154
|
assert_unification '.foo#baz', '#baz {@extend .foo}', '#baz'
|
155
155
|
|
156
156
|
assert_extend_doesnt_match('#bar', '.foo', :failed_to_unify, 2) do
|
157
|
-
|
157
|
+
render_unification '.foo#baz', '#bar {@extend .foo}'
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
@@ -180,7 +180,7 @@ SCSS
|
|
180
180
|
assert_unification 'ns|*.foo', '*|* {@extend .foo}', 'ns|*'
|
181
181
|
|
182
182
|
assert_extend_doesnt_match('ns2|*', '.foo', :failed_to_unify, 2) do
|
183
|
-
|
183
|
+
render_unification 'ns1|*.foo', 'ns2|* {@extend .foo}'
|
184
184
|
end
|
185
185
|
|
186
186
|
assert_unification 'ns|*.foo', 'ns|* {@extend .foo}', 'ns|*'
|
@@ -200,7 +200,7 @@ SCSS
|
|
200
200
|
assert_unification 'ns|a.foo', '*|* {@extend .foo}', 'ns|a'
|
201
201
|
|
202
202
|
assert_extend_doesnt_match('ns2|*', '.foo', :failed_to_unify, 2) do
|
203
|
-
|
203
|
+
render_unification 'ns1|a.foo', 'ns2|* {@extend .foo}'
|
204
204
|
end
|
205
205
|
|
206
206
|
assert_unification 'ns|a.foo', 'ns|* {@extend .foo}', 'ns|a'
|
@@ -227,7 +227,7 @@ SCSS
|
|
227
227
|
assert_unification 'ns|*.foo', '*|a {@extend .foo}', 'ns|*.foo, ns|a'
|
228
228
|
|
229
229
|
assert_extend_doesnt_match('ns2|a', '.foo', :failed_to_unify, 2) do
|
230
|
-
|
230
|
+
render_unification 'ns1|*.foo', 'ns2|a {@extend .foo}'
|
231
231
|
end
|
232
232
|
|
233
233
|
assert_unification 'ns|*.foo', 'ns|a {@extend .foo}', 'ns|*.foo, ns|a'
|
@@ -242,7 +242,7 @@ SCSS
|
|
242
242
|
assert_unification '*|a.foo', 'ns|a {@extend .foo}', '*|a.foo, ns|a'
|
243
243
|
|
244
244
|
assert_extend_doesnt_match('h1', '.foo', :failed_to_unify, 2) do
|
245
|
-
|
245
|
+
render_unification 'a.foo', 'h1 {@extend .foo}'
|
246
246
|
end
|
247
247
|
end
|
248
248
|
|
@@ -251,7 +251,7 @@ SCSS
|
|
251
251
|
assert_unification 'ns|a.foo', '*|a {@extend .foo}', 'ns|a'
|
252
252
|
|
253
253
|
assert_extend_doesnt_match('ns2|a', '.foo', :failed_to_unify, 2) do
|
254
|
-
|
254
|
+
render_unification 'ns1|a.foo', 'ns2|a {@extend .foo}'
|
255
255
|
end
|
256
256
|
|
257
257
|
assert_unification 'ns|a.foo', 'ns|a {@extend .foo}', 'ns|a'
|
@@ -270,11 +270,11 @@ SCSS
|
|
270
270
|
assert_unification ':foo.baz', '::foo {@extend .baz}', ':foo.baz, :foo::foo'
|
271
271
|
|
272
272
|
assert_extend_doesnt_match('::bar', '.baz', :failed_to_unify, 2) do
|
273
|
-
|
273
|
+
render_unification '::foo.baz', '::bar {@extend .baz}'
|
274
274
|
end
|
275
275
|
|
276
276
|
assert_extend_doesnt_match('::foo(2n+1)', '.baz', :failed_to_unify, 2) do
|
277
|
-
|
277
|
+
render_unification '::foo.baz', '::foo(2n+1) {@extend .baz}'
|
278
278
|
end
|
279
279
|
|
280
280
|
assert_unification '::foo.baz', '::foo {@extend .baz}', '::foo'
|
@@ -348,7 +348,7 @@ SCSS
|
|
348
348
|
|
349
349
|
def test_long_extendee_requires_all_selectors
|
350
350
|
assert_extend_doesnt_match('.baz', '.foo.bar', :not_found, 2) do
|
351
|
-
|
351
|
+
render_extends '.foo', '.baz {@extend .foo.bar}'
|
352
352
|
end
|
353
353
|
end
|
354
354
|
|
@@ -372,11 +372,11 @@ SCSS
|
|
372
372
|
|
373
373
|
def test_long_extender_aborts_unification
|
374
374
|
assert_extend_doesnt_match('h1.baz', '.foo', :failed_to_unify, 2) do
|
375
|
-
|
375
|
+
render_extends 'a.foo#bar', 'h1.baz {@extend .foo}'
|
376
376
|
end
|
377
377
|
|
378
378
|
assert_extend_doesnt_match('.bang#baz', '.foo', :failed_to_unify, 2) do
|
379
|
-
|
379
|
+
render_extends 'a.foo#bar', '.bang#baz {@extend .foo}'
|
380
380
|
end
|
381
381
|
end
|
382
382
|
|
@@ -392,7 +392,7 @@ SCSS
|
|
392
392
|
|
393
393
|
def test_nested_extender_aborts_unification
|
394
394
|
assert_extend_doesnt_match('foo bar', '.foo', :failed_to_unify, 2) do
|
395
|
-
|
395
|
+
render_extends 'baz.foo', 'foo bar {@extend .foo}'
|
396
396
|
end
|
397
397
|
end
|
398
398
|
|
@@ -810,10 +810,7 @@ SCSS
|
|
810
810
|
|
811
811
|
def test_placeholder_selector_as_modifier
|
812
812
|
assert_extend_doesnt_match('div', '%foo', :failed_to_unify, 3) do
|
813
|
-
|
814
|
-
a.baz.bar {
|
815
|
-
color: blue; }
|
816
|
-
CSS
|
813
|
+
render(<<SCSS)
|
817
814
|
a%foo.baz {color: blue}
|
818
815
|
.bar {@extend %foo}
|
819
816
|
div {@extend %foo}
|
@@ -844,16 +841,11 @@ SCSS
|
|
844
841
|
end
|
845
842
|
|
846
843
|
def test_extend_out_of_media
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
It can only work once @extend is supported natively in the browser.
|
853
|
-
WARN
|
854
|
-
.foo {
|
855
|
-
a: b; }
|
856
|
-
CSS
|
844
|
+
assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
|
845
|
+
You may not @extend an outer selector from within @media.
|
846
|
+
You may only @extend selectors within the same directive.
|
847
|
+
From "@extend .foo" on line 3 of test_extend_out_of_media_inline.scss.
|
848
|
+
ERR
|
857
849
|
.foo {a: b}
|
858
850
|
@media screen {
|
859
851
|
.bar {@extend .foo}
|
@@ -862,18 +854,11 @@ SCSS
|
|
862
854
|
end
|
863
855
|
|
864
856
|
def test_extend_out_of_unknown_directive
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
It can only work once @extend is supported natively in the browser.
|
871
|
-
WARN
|
872
|
-
.foo {
|
873
|
-
a: b; }
|
874
|
-
|
875
|
-
@flooblehoof {}
|
876
|
-
CSS
|
857
|
+
assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
|
858
|
+
You may not @extend an outer selector from within @flooblehoof.
|
859
|
+
You may only @extend selectors within the same directive.
|
860
|
+
From "@extend .foo" on line 3 of test_extend_out_of_unknown_directive_inline.scss.
|
861
|
+
ERR
|
877
862
|
.foo {a: b}
|
878
863
|
@flooblehoof {
|
879
864
|
.bar {@extend .foo}
|
@@ -882,19 +867,11 @@ SCSS
|
|
882
867
|
end
|
883
868
|
|
884
869
|
def test_extend_out_of_nested_directives
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
It can only work once @extend is supported natively in the browser.
|
891
|
-
WARN
|
892
|
-
@media screen {
|
893
|
-
.foo {
|
894
|
-
a: b; }
|
895
|
-
|
896
|
-
@flooblehoof {} }
|
897
|
-
CSS
|
870
|
+
assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
|
871
|
+
You may not @extend an outer selector from within @flooblehoof.
|
872
|
+
You may only @extend selectors within the same directive.
|
873
|
+
From "@extend .foo" on line 4 of test_extend_out_of_nested_directives_inline.scss.
|
874
|
+
ERR
|
898
875
|
@media screen {
|
899
876
|
.foo {a: b}
|
900
877
|
@flooblehoof {
|
@@ -985,20 +962,11 @@ SCSS
|
|
985
962
|
end
|
986
963
|
|
987
964
|
def test_extend_within_and_without_media
|
988
|
-
|
989
|
-
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
It can only work once @extend is supported natively in the browser.
|
994
|
-
WARN
|
995
|
-
.foo {
|
996
|
-
a: b; }
|
997
|
-
|
998
|
-
@media screen {
|
999
|
-
.foo, .bar {
|
1000
|
-
c: d; } }
|
1001
|
-
CSS
|
965
|
+
assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
|
966
|
+
You may not @extend an outer selector from within @media.
|
967
|
+
You may only @extend selectors within the same directive.
|
968
|
+
From "@extend .foo" on line 4 of test_extend_within_and_without_media_inline.scss.
|
969
|
+
ERR
|
1002
970
|
.foo {a: b}
|
1003
971
|
@media screen {
|
1004
972
|
.foo {c: d}
|
@@ -1008,20 +976,11 @@ SCSS
|
|
1008
976
|
end
|
1009
977
|
|
1010
978
|
def test_extend_within_and_without_unknown_directive
|
1011
|
-
|
1012
|
-
|
1013
|
-
|
1014
|
-
|
1015
|
-
|
1016
|
-
It can only work once @extend is supported natively in the browser.
|
1017
|
-
WARN
|
1018
|
-
.foo {
|
1019
|
-
a: b; }
|
1020
|
-
|
1021
|
-
@flooblehoof {
|
1022
|
-
.foo, .bar {
|
1023
|
-
c: d; } }
|
1024
|
-
CSS
|
979
|
+
assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
|
980
|
+
You may not @extend an outer selector from within @flooblehoof.
|
981
|
+
You may only @extend selectors within the same directive.
|
982
|
+
From "@extend .foo" on line 4 of test_extend_within_and_without_unknown_directive_inline.scss.
|
983
|
+
ERR
|
1025
984
|
.foo {a: b}
|
1026
985
|
@flooblehoof {
|
1027
986
|
.foo {c: d}
|
@@ -1031,21 +990,11 @@ SCSS
|
|
1031
990
|
end
|
1032
991
|
|
1033
992
|
def test_extend_within_and_without_nested_directives
|
1034
|
-
|
1035
|
-
|
1036
|
-
|
1037
|
-
|
1038
|
-
|
1039
|
-
It can only work once @extend is supported natively in the browser.
|
1040
|
-
WARN
|
1041
|
-
@media screen {
|
1042
|
-
.foo {
|
1043
|
-
a: b; }
|
1044
|
-
|
1045
|
-
@flooblehoof {
|
1046
|
-
.foo, .bar {
|
1047
|
-
c: d; } } }
|
1048
|
-
CSS
|
993
|
+
assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
|
994
|
+
You may not @extend an outer selector from within @flooblehoof.
|
995
|
+
You may only @extend selectors within the same directive.
|
996
|
+
From "@extend .foo" on line 5 of test_extend_within_and_without_nested_directives_inline.scss.
|
997
|
+
ERR
|
1049
998
|
@media screen {
|
1050
999
|
.foo {a: b}
|
1051
1000
|
@flooblehoof {
|
@@ -1115,33 +1064,28 @@ SCSS
|
|
1115
1064
|
end
|
1116
1065
|
|
1117
1066
|
def test_extend_warns_when_extendee_doesnt_exist
|
1118
|
-
|
1119
|
-
|
1120
|
-
|
1121
|
-
|
1122
|
-
|
1123
|
-
WARN
|
1067
|
+
assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
|
1068
|
+
".foo" failed to @extend ".bar".
|
1069
|
+
The selector ".bar" was not found.
|
1070
|
+
Use "@extend .bar !optional" if the extend should be able to fail.
|
1071
|
+
ERR
|
1124
1072
|
.foo {@extend .bar}
|
1125
1073
|
SCSS
|
1126
1074
|
end
|
1127
1075
|
|
1128
1076
|
def test_extend_warns_when_extension_fails
|
1129
|
-
|
1130
|
-
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
WARN
|
1135
|
-
a.bar {
|
1136
|
-
a: b; }
|
1137
|
-
CSS
|
1077
|
+
assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
|
1078
|
+
"b.foo" failed to @extend ".bar".
|
1079
|
+
No selectors matching ".bar" could be unified with "b.foo".
|
1080
|
+
Use "@extend .bar !optional" if the extend should be able to fail.
|
1081
|
+
ERR
|
1138
1082
|
a.bar {a: b}
|
1139
1083
|
b.foo {@extend .bar}
|
1140
1084
|
SCSS
|
1141
1085
|
end
|
1142
1086
|
|
1143
|
-
def
|
1144
|
-
|
1087
|
+
def test_extend_succeeds_when_one_extension_fails_but_others_dont
|
1088
|
+
assert_equal(<<CSS, render(<<SCSS))
|
1145
1089
|
a.bar {
|
1146
1090
|
a: b; }
|
1147
1091
|
|
@@ -1154,8 +1098,8 @@ b.foo {@extend .bar}
|
|
1154
1098
|
SCSS
|
1155
1099
|
end
|
1156
1100
|
|
1157
|
-
def
|
1158
|
-
|
1101
|
+
def test_extend_succeeds_when_one_extension_fails_but_others_dont
|
1102
|
+
assert_equal(<<CSS, render(<<SCSS))
|
1159
1103
|
a.bar {
|
1160
1104
|
a: b; }
|
1161
1105
|
|
@@ -1168,14 +1112,14 @@ b.foo {@extend .bar}
|
|
1168
1112
|
SCSS
|
1169
1113
|
end
|
1170
1114
|
|
1171
|
-
def
|
1172
|
-
|
1115
|
+
def test_optional_extend_succeeds_when_extendee_doesnt_exist
|
1116
|
+
assert_equal("", render(<<SCSS))
|
1173
1117
|
.foo {@extend .bar !optional}
|
1174
1118
|
SCSS
|
1175
1119
|
end
|
1176
1120
|
|
1177
|
-
def
|
1178
|
-
|
1121
|
+
def test_optional_extend_succeeds_when_extension_fails
|
1122
|
+
assert_equal(<<CSS, render(<<SCSS))
|
1179
1123
|
a.bar {
|
1180
1124
|
a: b; }
|
1181
1125
|
CSS
|
@@ -1295,7 +1239,7 @@ SCSS
|
|
1295
1239
|
private
|
1296
1240
|
|
1297
1241
|
def assert_extend_doesnt_match(extender, target, reason, line, syntax = :scss)
|
1298
|
-
|
1242
|
+
message = "\"#{extender}\" failed to @extend \"#{target}\"."
|
1299
1243
|
reason =
|
1300
1244
|
if reason == :not_found
|
1301
1245
|
"The selector \"#{target}\" was not found."
|
@@ -1303,12 +1247,11 @@ SCSS
|
|
1303
1247
|
"No selectors matching \"#{target}\" could be unified with \"#{extender}\"."
|
1304
1248
|
end
|
1305
1249
|
|
1306
|
-
|
1307
|
-
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1311
|
-
WARNING
|
1250
|
+
assert_raise_message(Sass::SyntaxError, <<ERR) {yield}
|
1251
|
+
#{message}
|
1252
|
+
#{reason}
|
1253
|
+
Use "@extend #{target} !optional" if the extend should be able to fail.
|
1254
|
+
ERR
|
1312
1255
|
end
|
1313
1256
|
|
1314
1257
|
def assert_unification(selector, extension, unified)
|
@@ -1319,11 +1262,21 @@ WARNING
|
|
1319
1262
|
unified.split(', ').map {|s| "-a #{s}"}.join(', '))
|
1320
1263
|
end
|
1321
1264
|
|
1265
|
+
def render_unification(selector, extension)
|
1266
|
+
render_extends(
|
1267
|
+
"%-a #{selector}",
|
1268
|
+
extension + " -a {@extend %-a}")
|
1269
|
+
end
|
1270
|
+
|
1322
1271
|
def assert_extends(selector, extension, result)
|
1323
|
-
assert_equal <<CSS,
|
1272
|
+
assert_equal <<CSS, render_extends(selector, extension)
|
1324
1273
|
#{result} {
|
1325
1274
|
a: b; }
|
1326
1275
|
CSS
|
1276
|
+
end
|
1277
|
+
|
1278
|
+
def render_extends(selector, extension)
|
1279
|
+
render(<<SCSS)
|
1327
1280
|
#{selector} {a: b}
|
1328
1281
|
#{extension}
|
1329
1282
|
SCSS
|
data/test/sass/plugin_test.rb
CHANGED
@@ -222,7 +222,6 @@ WARNING: In #{template_loc}:
|
|
222
222
|
There are multiple files that match the name "same_name_different_partiality.scss":
|
223
223
|
_same_name_different_partiality.scss
|
224
224
|
same_name_different_partiality.scss
|
225
|
-
This will be an error in future versions of Sass.
|
226
225
|
WARNING
|
227
226
|
touch "_same_name_different_partiality"
|
228
227
|
assert_needs_update "same_name_different_partiality"
|
@@ -231,17 +230,6 @@ WARNING
|
|
231
230
|
|
232
231
|
# Callbacks
|
233
232
|
|
234
|
-
def test_updating_stylesheets_callback
|
235
|
-
# Should run even when there's nothing to update
|
236
|
-
Sass::Plugin.options[:template_location] = nil
|
237
|
-
assert_callback :updating_stylesheets, []
|
238
|
-
end
|
239
|
-
|
240
|
-
def test_updating_stylesheets_callback_with_never_update
|
241
|
-
Sass::Plugin.options[:never_update] = true
|
242
|
-
assert_no_callback :updating_stylesheets
|
243
|
-
end
|
244
|
-
|
245
233
|
def test_updated_stylesheet_callback_for_updated_template
|
246
234
|
Sass::Plugin.options[:always_update] = false
|
247
235
|
touch 'basic'
|
data/test/sass/scss/scss_test.rb
CHANGED
@@ -1711,6 +1711,41 @@ SCSS
|
|
1711
1711
|
|
1712
1712
|
# Regression
|
1713
1713
|
|
1714
|
+
def test_parsing_decimals_followed_by_comments_doesnt_take_forever
|
1715
|
+
assert_equal(<<CSS, render(<<SCSS))
|
1716
|
+
.foo {
|
1717
|
+
padding: 4.21053% 4.21053% 5.63158%; }
|
1718
|
+
CSS
|
1719
|
+
.foo {
|
1720
|
+
padding: 4.21052631578947% 4.21052631578947% 5.631578947368421% /**/
|
1721
|
+
}
|
1722
|
+
SCSS
|
1723
|
+
end
|
1724
|
+
|
1725
|
+
def test_parsing_many_numbers_doesnt_take_forever
|
1726
|
+
values = ["80% 90%"] * 1000
|
1727
|
+
assert_equal(<<CSS, render(<<SCSS))
|
1728
|
+
.foo {
|
1729
|
+
padding: #{values.join(', ')}; }
|
1730
|
+
CSS
|
1731
|
+
.foo {
|
1732
|
+
padding: #{values.join(', ')};
|
1733
|
+
}
|
1734
|
+
SCSS
|
1735
|
+
end
|
1736
|
+
|
1737
|
+
def test_import_comments_in_imports
|
1738
|
+
assert_equal(<<CSS, render(<<SCSS))
|
1739
|
+
@import url(foo.css);
|
1740
|
+
@import url(bar.css);
|
1741
|
+
@import url(baz.css);
|
1742
|
+
CSS
|
1743
|
+
@import "foo.css", // this is a comment
|
1744
|
+
"bar.css", // this is another comment
|
1745
|
+
"baz.css"; // this is a third comment
|
1746
|
+
SCSS
|
1747
|
+
end
|
1748
|
+
|
1714
1749
|
def test_reference_combinator_with_parent_ref
|
1715
1750
|
assert_equal <<CSS, render(<<SCSS)
|
1716
1751
|
a /foo/ b {
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sass
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 592302971
|
5
5
|
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 3
|
8
8
|
- 3
|
9
9
|
- 0
|
10
10
|
- alpha
|
11
|
-
-
|
12
|
-
version: 3.3.0.alpha.
|
11
|
+
- 59
|
12
|
+
version: 3.3.0.alpha.59
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Nathan Weizenbaum
|
@@ -19,7 +19,7 @@ autorequire:
|
|
19
19
|
bindir: bin
|
20
20
|
cert_chain: []
|
21
21
|
|
22
|
-
date: 2012-
|
22
|
+
date: 2012-12-21 00:00:00 -05:00
|
23
23
|
default_executable:
|
24
24
|
dependencies:
|
25
25
|
- !ruby/object:Gem::Dependency
|
@@ -132,6 +132,7 @@ files:
|
|
132
132
|
- lib/sass/selector/simple.rb
|
133
133
|
- lib/sass/selector/simple_sequence.rb
|
134
134
|
- lib/sass/shared.rb
|
135
|
+
- lib/sass/util.rb
|
135
136
|
- lib/sass/supports.rb
|
136
137
|
- lib/sass/tree/charset_node.rb
|
137
138
|
- lib/sass/tree/comment_node.rb
|
@@ -167,13 +168,12 @@ files:
|
|
167
168
|
- lib/sass/tree/visitors/to_css.rb
|
168
169
|
- lib/sass/tree/warn_node.rb
|
169
170
|
- lib/sass/tree/while_node.rb
|
170
|
-
- lib/sass/util.rb
|
171
|
-
- lib/sass/util/multibyte_string_scanner.rb
|
172
|
-
- lib/sass/util/subset_map.rb
|
173
|
-
- lib/sass/version.rb
|
174
171
|
- lib/sass/source/map.rb
|
175
172
|
- lib/sass/source/position.rb
|
176
173
|
- lib/sass/source/range.rb
|
174
|
+
- lib/sass/util/multibyte_string_scanner.rb
|
175
|
+
- lib/sass/util/subset_map.rb
|
176
|
+
- lib/sass/version.rb
|
177
177
|
- vendor/listen/CHANGELOG.md
|
178
178
|
- vendor/listen/Gemfile
|
179
179
|
- vendor/listen/Guardfile
|
@@ -268,6 +268,7 @@ files:
|
|
268
268
|
- test/sass/scss/rx_test.rb
|
269
269
|
- test/sass/scss/scss_test.rb
|
270
270
|
- test/sass/scss/test_helper.rb
|
271
|
+
- test/sass/util_test.rb
|
271
272
|
- test/sass/templates/_cached_import_option_partial.scss
|
272
273
|
- test/sass/templates/_double_import_loop2.sass
|
273
274
|
- test/sass/templates/_filename_fn_import.scss
|
@@ -326,7 +327,6 @@ files:
|
|
326
327
|
- test/sass/test_helper.rb
|
327
328
|
- test/sass/util/multibyte_string_scanner_test.rb
|
328
329
|
- test/sass/util/subset_map_test.rb
|
329
|
-
- test/sass/util_test.rb
|
330
330
|
- test/sass/source_map_test.rb
|
331
331
|
- test/test_helper.rb
|
332
332
|
- extra/update_watch.rb
|
@@ -394,7 +394,7 @@ test_files:
|
|
394
394
|
- test/sass/scss/css_test.rb
|
395
395
|
- test/sass/scss/rx_test.rb
|
396
396
|
- test/sass/scss/scss_test.rb
|
397
|
+
- test/sass/util_test.rb
|
397
398
|
- test/sass/util/multibyte_string_scanner_test.rb
|
398
399
|
- test/sass/util/subset_map_test.rb
|
399
|
-
- test/sass/util_test.rb
|
400
400
|
- test/sass/source_map_test.rb
|