sass 3.2.5 → 3.2.6
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.
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/bin/sass +2 -1
- data/bin/sass-convert +2 -1
- data/bin/scss +2 -1
- data/lib/sass/cache_stores/chain.rb +1 -1
- data/lib/sass/cache_stores/filesystem.rb +0 -1
- data/lib/sass/engine.rb +7 -1
- data/lib/sass/importers/filesystem.rb +1 -1
- data/lib/sass/media.rb +1 -4
- data/lib/sass/script/funcall.rb +43 -8
- data/lib/sass/script/lexer.rb +0 -2
- data/lib/sass/script/parser.rb +0 -2
- data/lib/sass/scss/parser.rb +13 -1
- data/lib/sass/selector/simple_sequence.rb +1 -1
- data/lib/sass/tree/comment_node.rb +2 -2
- data/lib/sass/tree/visitors/cssize.rb +10 -1
- data/lib/sass/tree/visitors/perform.rb +4 -2
- data/lib/sass/util.rb +54 -1
- data/lib/sass/util/multibyte_string_scanner.rb +29 -8
- data/test/sass/engine_test.rb +16 -0
- data/test/sass/extend_test.rb +15 -0
- data/test/sass/script_test.rb +3 -1
- data/vendor/listen/CHANGELOG.md +76 -2
- data/vendor/listen/CONTRIBUTING.md +38 -0
- data/vendor/listen/Gemfile +8 -1
- data/vendor/listen/Guardfile +1 -1
- data/vendor/listen/LICENSE +1 -1
- data/vendor/listen/README.md +8 -5
- data/vendor/listen/lib/listen.rb +7 -5
- data/vendor/listen/lib/listen/adapter.rb +76 -29
- data/vendor/listen/lib/listen/adapters/bsd.rb +112 -0
- data/vendor/listen/lib/listen/adapters/darwin.rb +11 -10
- data/vendor/listen/lib/listen/adapters/linux.rb +33 -30
- data/vendor/listen/lib/listen/adapters/polling.rb +2 -1
- data/vendor/listen/lib/listen/adapters/windows.rb +27 -21
- data/vendor/listen/lib/listen/dependency_manager.rb +126 -0
- data/vendor/listen/lib/listen/directory_record.rb +63 -10
- data/vendor/listen/lib/listen/listener.rb +22 -0
- data/vendor/listen/lib/listen/multi_listener.rb +22 -0
- data/vendor/listen/lib/listen/version.rb +1 -1
- data/vendor/listen/listen.gemspec +0 -4
- data/vendor/listen/spec/listen/adapter_spec.rb +45 -4
- data/vendor/listen/spec/listen/adapters/bsd_spec.rb +36 -0
- data/vendor/listen/spec/listen/adapters/darwin_spec.rb +6 -0
- data/vendor/listen/spec/listen/adapters/linux_spec.rb +6 -0
- data/vendor/listen/spec/listen/adapters/windows_spec.rb +7 -1
- data/vendor/listen/spec/listen/dependency_manager_spec.rb +107 -0
- data/vendor/listen/spec/listen/directory_record_spec.rb +91 -4
- data/vendor/listen/spec/listen/listener_spec.rb +14 -0
- data/vendor/listen/spec/listen/multi_listener_spec.rb +19 -1
- data/vendor/listen/spec/spec_helper.rb +6 -3
- data/vendor/listen/spec/support/adapter_helper.rb +125 -212
- data/vendor/listen/spec/support/listeners_helper.rb +13 -1
- data/vendor/listen/spec/support/platform_helper.rb +4 -0
- metadata +9 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.2.
|
1
|
+
3.2.6
|
data/VERSION_DATE
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
23 February 2013 01:41:39 UTC
|
data/bin/sass
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# The command line Sass parser.
|
3
3
|
|
4
|
-
|
4
|
+
THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
|
5
|
+
require File.dirname(THIS_FILE) + '/../lib/sass'
|
5
6
|
require 'sass/exec'
|
6
7
|
|
7
8
|
opts = Sass::Exec::Sass.new(ARGV)
|
data/bin/sass-convert
CHANGED
data/bin/scss
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# The command line Sass parser.
|
3
3
|
|
4
|
-
|
4
|
+
THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
|
5
|
+
require File.dirname(THIS_FILE) + '/../lib/sass'
|
5
6
|
require 'sass/exec'
|
6
7
|
|
7
8
|
opts = Sass::Exec::Scss.new(ARGV)
|
@@ -17,7 +17,6 @@ module Sass
|
|
17
17
|
# @see Base#\_retrieve
|
18
18
|
def _retrieve(key, version, sha)
|
19
19
|
return unless File.readable?(path_to(key))
|
20
|
-
contents = nil
|
21
20
|
File.open(path_to(key), "rb") do |f|
|
22
21
|
if f.readline("\n").strip == version && f.readline("\n").strip == sha
|
23
22
|
return f.read
|
data/lib/sass/engine.rb
CHANGED
@@ -293,7 +293,7 @@ module Sass
|
|
293
293
|
# @return [[Sass::Engine]] The dependency documents.
|
294
294
|
def dependencies
|
295
295
|
_dependencies(Set.new, engines = Set.new)
|
296
|
-
engines
|
296
|
+
Sass::Util.array_minus(engines, [self])
|
297
297
|
end
|
298
298
|
|
299
299
|
# Helper for \{#dependencies}.
|
@@ -714,6 +714,12 @@ WARNING
|
|
714
714
|
parser = Sass::SCSS::Parser.new(value, @options[:filename], @line)
|
715
715
|
Tree::MediaNode.new(parser.parse_media_query_list.to_a)
|
716
716
|
else
|
717
|
+
unprefixed_directive = directive.gsub(/^-[a-z0-9]+-/i, '')
|
718
|
+
if unprefixed_directive == 'supports'
|
719
|
+
parser = Sass::SCSS::Parser.new(value, @options[:filename], @line)
|
720
|
+
return Tree::SupportsNode.new(directive, parser.parse_supports_condition)
|
721
|
+
end
|
722
|
+
|
717
723
|
Tree::DirectiveNode.new(
|
718
724
|
value.nil? ? ["@#{directive}"] : ["@#{directive} "] + parse_interp(value, offset))
|
719
725
|
end
|
@@ -30,7 +30,7 @@ module Sass
|
|
30
30
|
|
31
31
|
# @see Base#mtime
|
32
32
|
def mtime(name, options)
|
33
|
-
file,
|
33
|
+
file, _ = Sass::Util.destructure(find_real_file(@root, name, options))
|
34
34
|
File.mtime(file) if file
|
35
35
|
rescue Errno::ENOENT
|
36
36
|
nil
|
data/lib/sass/media.rb
CHANGED
@@ -140,10 +140,7 @@ module Sass::Media
|
|
140
140
|
type = t1
|
141
141
|
mod = m1.empty? ? m2 : m1
|
142
142
|
end
|
143
|
-
|
144
|
-
q.type = [type]
|
145
|
-
q.modifier = [mod]
|
146
|
-
return q
|
143
|
+
return Query.new([mod], [type], other.expressions + expressions)
|
147
144
|
end
|
148
145
|
|
149
146
|
# Returns the CSS for the media query.
|
data/lib/sass/script/funcall.rb
CHANGED
@@ -106,18 +106,53 @@ module Sass
|
|
106
106
|
opts(Functions::EvaluationContext.new(environment.options).send(ruby_name, *args))
|
107
107
|
end
|
108
108
|
rescue ArgumentError => e
|
109
|
+
message = e.message
|
110
|
+
|
109
111
|
# If this is a legitimate Ruby-raised argument error, re-raise it.
|
110
112
|
# Otherwise, it's an error in the user's stylesheet, so wrap it.
|
111
|
-
if
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
113
|
+
if Sass::Util.rbx?
|
114
|
+
# Rubinius has a different error report string than vanilla Ruby. It
|
115
|
+
# also doesn't put the actual method for which the argument error was
|
116
|
+
# thrown in the backtrace, nor does it include `send`, so we look for
|
117
|
+
# `_perform`.
|
118
|
+
if e.message =~ /^method '([^']+)': given (\d+), expected (\d+)/
|
119
|
+
error_name, given, expected = $1, $2, $3
|
120
|
+
raise e if error_name != ruby_name || e.backtrace[0] !~ /:in `_perform'$/
|
121
|
+
message = "wrong number of arguments (#{given} for #{expected})"
|
122
|
+
end
|
123
|
+
elsif Sass::Util.jruby?
|
124
|
+
if Sass::Util.jruby1_6?
|
125
|
+
should_maybe_raise = e.message =~ /^wrong number of arguments \((\d+) for (\d+)\)/ &&
|
126
|
+
# The one case where JRuby does include the Ruby name of the function
|
127
|
+
# is manually-thrown ArgumentErrors, which are indistinguishable from
|
128
|
+
# legitimate ArgumentErrors. We treat both of these as
|
129
|
+
# Sass::SyntaxErrors even though it can hide Ruby errors.
|
130
|
+
e.backtrace[0] !~ /:in `(block in )?#{ruby_name}'$/
|
131
|
+
else
|
132
|
+
should_maybe_raise = e.message =~ /^wrong number of arguments calling `[^`]+` \((\d+) for (\d+)\)/
|
133
|
+
given, expected = $1, $2
|
134
|
+
end
|
135
|
+
|
136
|
+
if should_maybe_raise
|
137
|
+
# JRuby 1.7 includes __send__ before send and _perform.
|
138
|
+
trace = e.backtrace.dup
|
139
|
+
raise e if !Sass::Util.jruby1_6? && trace.shift !~ /:in `__send__'$/
|
140
|
+
|
141
|
+
# JRuby (as of 1.7.2) doesn't put the actual method
|
142
|
+
# for which the argument error was thrown in the backtrace, so we
|
143
|
+
# detect whether our send threw an argument error.
|
144
|
+
if !(trace[0] =~ /:in `send'$/ && trace[1] =~ /:in `_perform'$/)
|
145
|
+
raise e
|
146
|
+
elsif !Sass::Util.jruby1_6?
|
147
|
+
# JRuby 1.7 doesn't use standard formatting for its ArgumentErrors.
|
148
|
+
message = "wrong number of arguments (#{given} for #{expected})"
|
149
|
+
end
|
150
|
+
end
|
151
|
+
elsif e.message =~ /^wrong number of arguments \(\d+ for \d+\)/ &&
|
152
|
+
e.backtrace[0] !~ /:in `(block in )?#{ruby_name}'$/
|
118
153
|
raise e
|
119
154
|
end
|
120
|
-
raise Sass::SyntaxError.new("#{
|
155
|
+
raise Sass::SyntaxError.new("#{message} for `#{name}'")
|
121
156
|
end
|
122
157
|
|
123
158
|
# This method is factored out from `_perform` so that compass can override
|
data/lib/sass/script/lexer.rb
CHANGED
data/lib/sass/script/parser.rb
CHANGED
data/lib/sass/scss/parser.rb
CHANGED
@@ -52,6 +52,18 @@ module Sass
|
|
52
52
|
ql
|
53
53
|
end
|
54
54
|
|
55
|
+
# Parses a supports query condition.
|
56
|
+
#
|
57
|
+
# @return [Sass::Supports::Condition] The parsed condition
|
58
|
+
# @raise [Sass::SyntaxError] if there's a syntax error in the condition,
|
59
|
+
# or if it doesn't take up the entire input string.
|
60
|
+
def parse_supports_condition
|
61
|
+
init_scanner!
|
62
|
+
condition = supports_condition
|
63
|
+
expected("supports condition") unless @scanner.eos?
|
64
|
+
condition
|
65
|
+
end
|
66
|
+
|
55
67
|
private
|
56
68
|
|
57
69
|
include Sass::SCSS::RX
|
@@ -986,7 +998,7 @@ MESSAGE
|
|
986
998
|
line = @line
|
987
999
|
@strs.push ""
|
988
1000
|
throw_error {yield} && @strs.last
|
989
|
-
rescue Sass::SyntaxError
|
1001
|
+
rescue Sass::SyntaxError
|
990
1002
|
@scanner.pos = pos
|
991
1003
|
@line = line
|
992
1004
|
nil
|
@@ -101,7 +101,7 @@ module Sass
|
|
101
101
|
# If A {@extend B} and C {...},
|
102
102
|
# seq is A, sels is B, and self is C
|
103
103
|
|
104
|
-
self_without_sel = self.members
|
104
|
+
self_without_sel = Sass::Util.array_minus(self.members, sels)
|
105
105
|
group.each {|e, _| e.result = :failed_to_unify unless e.result == :succeeded}
|
106
106
|
next unless unified = seq.members.last.unify(self_without_sel, subject?)
|
107
107
|
group.each {|e, _| e.result = :succeeded}
|
@@ -70,13 +70,13 @@ module Sass::Tree
|
|
70
70
|
private
|
71
71
|
|
72
72
|
def normalize_indentation(str)
|
73
|
-
|
73
|
+
ind = str.split("\n").inject(str[/^[ \t]*/].split("")) do |pre, line|
|
74
74
|
line[/^[ \t]*/].split("").zip(pre).inject([]) do |arr, (a, b)|
|
75
75
|
break arr if a != b
|
76
76
|
arr << a
|
77
77
|
end
|
78
78
|
end.join
|
79
|
-
str.gsub(/^#{
|
79
|
+
str.gsub(/^#{ind}/, '')
|
80
80
|
end
|
81
81
|
end
|
82
82
|
end
|
@@ -32,6 +32,8 @@ class Sass::Tree::Visitors::Cssize < Sass::Tree::Visitors::Base
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
+
MERGEABLE_DIRECTIVES = [Sass::Tree::MediaNode]
|
36
|
+
|
35
37
|
# Runs a block of code with the current parent node
|
36
38
|
# replaced with the given node.
|
37
39
|
#
|
@@ -39,11 +41,18 @@ class Sass::Tree::Visitors::Cssize < Sass::Tree::Visitors::Base
|
|
39
41
|
# @yield A block in which the parent is set to `parent`.
|
40
42
|
# @return [Object] The return value of the block.
|
41
43
|
def with_parent(parent)
|
42
|
-
|
44
|
+
if parent.is_a?(Sass::Tree::DirectiveNode)
|
45
|
+
if MERGEABLE_DIRECTIVES.any? {|klass| parent.is_a?(klass)}
|
46
|
+
old_parent_directive = @parent_directives.pop
|
47
|
+
end
|
48
|
+
@parent_directives.push parent
|
49
|
+
end
|
50
|
+
|
43
51
|
old_parent, @parent = @parent, parent
|
44
52
|
yield
|
45
53
|
ensure
|
46
54
|
@parent_directives.pop if parent.is_a?(Sass::Tree::DirectiveNode)
|
55
|
+
@parent_directives.push old_parent_directive if old_parent_directive
|
47
56
|
@parent = old_parent
|
48
57
|
end
|
49
58
|
|
@@ -14,11 +14,13 @@ class Sass::Tree::Visitors::Perform < Sass::Tree::Visitors::Base
|
|
14
14
|
|
15
15
|
begin
|
16
16
|
unless keywords.empty?
|
17
|
-
unknown_args = keywords.keys
|
17
|
+
unknown_args = Sass::Util.array_minus(keywords.keys,
|
18
|
+
callable.args.map {|var| var.first.underscored_name})
|
18
19
|
if callable.splat && unknown_args.include?(callable.splat.underscored_name)
|
19
20
|
raise Sass::SyntaxError.new("Argument $#{callable.splat.name} of #{downcase_desc} cannot be used as a named argument.")
|
20
21
|
elsif unknown_args.any?
|
21
|
-
|
22
|
+
description = unknown_args.length > 1 ? 'the following arguments:' : 'an argument named'
|
23
|
+
raise Sass::SyntaxError.new("#{desc} doesn't have #{description} #{unknown_args.map {|name| "$#{name}"}.join ', '}.")
|
22
24
|
end
|
23
25
|
end
|
24
26
|
rescue Sass::SyntaxError => keyword_exception
|
data/lib/sass/util.rb
CHANGED
@@ -256,6 +256,33 @@ module Sass
|
|
256
256
|
arr
|
257
257
|
end
|
258
258
|
|
259
|
+
# Returns a sub-array of `minuend` containing only elements that are also in
|
260
|
+
# `subtrahend`. Ensures that the return value has the same order as
|
261
|
+
# `minuend`, even on Rubinius where that's not guaranteed by {Array#-}.
|
262
|
+
#
|
263
|
+
# @param minuend [Array]
|
264
|
+
# @param subtrahend [Array]
|
265
|
+
# @return [Array]
|
266
|
+
def array_minus(minuend, subtrahend)
|
267
|
+
return minuend - subtrahend unless rbx?
|
268
|
+
set = Set.new(minuend) - subtrahend
|
269
|
+
minuend.select {|e| set.include?(e)}
|
270
|
+
end
|
271
|
+
|
272
|
+
# Returns a string description of the character that caused an
|
273
|
+
# `Encoding::UndefinedConversionError`.
|
274
|
+
#
|
275
|
+
# @param [Encoding::UndefinedConversionError]
|
276
|
+
# @return [String]
|
277
|
+
def undefined_conversion_error_char(e)
|
278
|
+
# Rubinius (as of 2.0.0.rc1) pre-quotes the error character.
|
279
|
+
return e.error_char if rbx?
|
280
|
+
# JRuby (as of 1.7.2) doesn't have an error_char field on
|
281
|
+
# Encoding::UndefinedConversionError.
|
282
|
+
return e.error_char.dump unless jruby?
|
283
|
+
e.message[/^"[^"]+"/] #"
|
284
|
+
end
|
285
|
+
|
259
286
|
# Asserts that `value` falls within `range` (inclusive), leaving
|
260
287
|
# room for slight floating-point errors.
|
261
288
|
#
|
@@ -462,6 +489,27 @@ module Sass
|
|
462
489
|
RUBY_ENGINE == "ironruby"
|
463
490
|
end
|
464
491
|
|
492
|
+
# Whether or not this is running on Rubinius.
|
493
|
+
#
|
494
|
+
# @return [Boolean]
|
495
|
+
def rbx?
|
496
|
+
RUBY_ENGINE == "rbx"
|
497
|
+
end
|
498
|
+
|
499
|
+
# Whether or not this is running on JRuby.
|
500
|
+
#
|
501
|
+
# @return [Boolean]
|
502
|
+
def jruby?
|
503
|
+
RUBY_PLATFORM =~ /java/
|
504
|
+
end
|
505
|
+
|
506
|
+
# Returns an array of ints representing the JRuby version number.
|
507
|
+
#
|
508
|
+
# @return [Array<Fixnum>]
|
509
|
+
def jruby_version
|
510
|
+
$jruby_version ||= ::JRUBY_VERSION.split(".").map {|s| s.to_i}
|
511
|
+
end
|
512
|
+
|
465
513
|
# Like `Dir.glob`, but works with backslash-separated paths on Windows.
|
466
514
|
#
|
467
515
|
# @param path [String]
|
@@ -512,6 +560,11 @@ module Sass
|
|
512
560
|
ruby1_8? && Sass::Util::RUBY_VERSION[2] < 7
|
513
561
|
end
|
514
562
|
|
563
|
+
# Wehter or not this is running under JRuby 1.6 or lower.
|
564
|
+
def jruby1_6?
|
565
|
+
jruby? && jruby_version[0] == 1 && jruby_version[1] < 7
|
566
|
+
end
|
567
|
+
|
515
568
|
# Whether or not this is running under MacRuby.
|
516
569
|
#
|
517
570
|
# @return [Boolean]
|
@@ -548,7 +601,7 @@ module Sass
|
|
548
601
|
line.encode(encoding)
|
549
602
|
rescue Encoding::UndefinedConversionError => e
|
550
603
|
yield <<MSG.rstrip, i + 1
|
551
|
-
Invalid #{encoding.name} character #{e
|
604
|
+
Invalid #{encoding.name} character #{undefined_conversion_error_char(e)}
|
552
605
|
MSG
|
553
606
|
end
|
554
607
|
end
|
@@ -3,23 +3,44 @@ require 'strscan'
|
|
3
3
|
if Sass::Util.ruby1_8?
|
4
4
|
Sass::Util::MultibyteStringScanner = StringScanner
|
5
5
|
else
|
6
|
+
if Sass::Util.rbx?
|
7
|
+
# Rubinius's StringScanner class implements some of its methods in terms of
|
8
|
+
# others, which causes us to double-count bytes in some cases if we do
|
9
|
+
# straightforward inheritance. To work around this, we use a delegate class.
|
10
|
+
require 'delegate'
|
11
|
+
class Sass::Util::MultibyteStringScanner < DelegateClass(StringScanner)
|
12
|
+
def initialize(str)
|
13
|
+
super(StringScanner.new(str))
|
14
|
+
@mb_pos = 0
|
15
|
+
@mb_matched_size = nil
|
16
|
+
@mb_last_pos = nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def is_a?(klass)
|
20
|
+
__getobj__.is_a?(klass) || super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
else
|
24
|
+
class Sass::Util::MultibyteStringScanner < StringScanner
|
25
|
+
def initialize(str)
|
26
|
+
super
|
27
|
+
@mb_pos = 0
|
28
|
+
@mb_matched_size = nil
|
29
|
+
@mb_last_pos = nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
6
34
|
# A wrapper of the native StringScanner class that works correctly with
|
7
35
|
# multibyte character encodings. The native class deals only in bytes, not
|
8
36
|
# characters, for methods like [#pos] and [#matched_size]. This class deals
|
9
37
|
# only in characters, instead.
|
10
|
-
class Sass::Util::MultibyteStringScanner
|
38
|
+
class Sass::Util::MultibyteStringScanner
|
11
39
|
def self.new(str)
|
12
40
|
return StringScanner.new(str) if str.ascii_only?
|
13
41
|
super
|
14
42
|
end
|
15
43
|
|
16
|
-
def initialize(str)
|
17
|
-
super
|
18
|
-
@mb_pos = 0
|
19
|
-
@mb_matched_size = nil
|
20
|
-
@mb_last_pos = nil
|
21
|
-
end
|
22
|
-
|
23
44
|
alias_method :byte_pos, :pos
|
24
45
|
alias_method :byte_matched_size, :matched_size
|
25
46
|
|
data/test/sass/engine_test.rb
CHANGED
@@ -2381,6 +2381,22 @@ SASS
|
|
2381
2381
|
|
2382
2382
|
# Regression tests
|
2383
2383
|
|
2384
|
+
def test_supports_bubbles
|
2385
|
+
assert_equal <<CSS, render(<<SASS)
|
2386
|
+
parent {
|
2387
|
+
background: orange; }
|
2388
|
+
@supports (perspective: 10px) or (-moz-perspective: 10px) {
|
2389
|
+
parent child {
|
2390
|
+
background: blue; } }
|
2391
|
+
CSS
|
2392
|
+
parent
|
2393
|
+
background: orange
|
2394
|
+
@supports (perspective: 10px) or (-moz-perspective: 10px)
|
2395
|
+
child
|
2396
|
+
background: blue
|
2397
|
+
SASS
|
2398
|
+
end
|
2399
|
+
|
2384
2400
|
def test_line_numbers_with_dos_line_endings
|
2385
2401
|
assert_equal <<CSS, render(<<SASS, :line_comments => true)
|
2386
2402
|
/* line 5, test_line_numbers_with_dos_line_endings_inline.sass */
|
data/test/sass/extend_test.rb
CHANGED
@@ -1186,6 +1186,21 @@ SCSS
|
|
1186
1186
|
|
1187
1187
|
# Regression Tests
|
1188
1188
|
|
1189
|
+
def test_extend_in_double_nested_media_query
|
1190
|
+
assert_equal <<CSS, render(<<SCSS)
|
1191
|
+
@media all and (orientation: landscape) {
|
1192
|
+
.bar {
|
1193
|
+
color: blue; } }
|
1194
|
+
CSS
|
1195
|
+
@media all {
|
1196
|
+
@media (orientation: landscape) {
|
1197
|
+
%foo {color: blue}
|
1198
|
+
.bar {@extend %foo}
|
1199
|
+
}
|
1200
|
+
}
|
1201
|
+
SCSS
|
1202
|
+
end
|
1203
|
+
|
1189
1204
|
def test_partially_failed_extend
|
1190
1205
|
assert_no_warning {assert_equal(<<CSS, render(<<SCSS))}
|
1191
1206
|
.rc, test {
|