haml 3.1.0.alpha.33 → 3.1.0.alpha.36

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.
Files changed (61) hide show
  1. data/EDGE_GEM_VERSION +1 -1
  2. data/VERSION +1 -1
  3. data/vendor/sass/doc-src/SASS_CHANGELOG.md +177 -2
  4. data/vendor/sass/doc-src/SASS_REFERENCE.md +140 -3
  5. data/vendor/sass/lib/sass/cache_stores.rb +14 -0
  6. data/vendor/sass/lib/sass/cache_stores/active_support.rb +28 -0
  7. data/vendor/sass/lib/sass/cache_stores/base.rb +84 -0
  8. data/vendor/sass/lib/sass/cache_stores/filesystem.rb +56 -0
  9. data/vendor/sass/lib/sass/cache_stores/memory.rb +51 -0
  10. data/vendor/sass/lib/sass/cache_stores/null.rb +25 -0
  11. data/vendor/sass/lib/sass/engine.rb +86 -25
  12. data/vendor/sass/lib/sass/exec.rb +10 -1
  13. data/vendor/sass/lib/sass/importers/rails.rb +75 -0
  14. data/vendor/sass/lib/sass/less.rb +1 -1
  15. data/vendor/sass/lib/sass/plugin/compiler.rb +4 -1
  16. data/vendor/sass/lib/sass/plugin/configuration.rb +4 -2
  17. data/vendor/sass/lib/sass/plugin/rack.rb +15 -2
  18. data/vendor/sass/lib/sass/plugin/rails.rb +89 -9
  19. data/vendor/sass/lib/sass/plugin/staleness_checker.rb +30 -2
  20. data/vendor/sass/lib/sass/script/css_parser.rb +1 -1
  21. data/vendor/sass/lib/sass/script/functions.rb +126 -5
  22. data/vendor/sass/lib/sass/script/lexer.rb +1 -1
  23. data/vendor/sass/lib/sass/script/list.rb +76 -0
  24. data/vendor/sass/lib/sass/script/literal.rb +10 -1
  25. data/vendor/sass/lib/sass/script/number.rb +1 -1
  26. data/vendor/sass/lib/sass/script/operation.rb +3 -2
  27. data/vendor/sass/lib/sass/script/parser.rb +25 -12
  28. data/vendor/sass/lib/sass/scss/css_parser.rb +0 -5
  29. data/vendor/sass/lib/sass/scss/parser.rb +46 -7
  30. data/vendor/sass/lib/sass/scss/static_parser.rb +1 -1
  31. data/vendor/sass/lib/sass/tree/charset_node.rb +37 -0
  32. data/vendor/sass/lib/sass/tree/directive_node.rb +2 -2
  33. data/vendor/sass/lib/sass/tree/each_node.rb +54 -0
  34. data/vendor/sass/lib/sass/tree/if_node.rb +19 -0
  35. data/vendor/sass/lib/sass/tree/media_node.rb +75 -0
  36. data/vendor/sass/lib/sass/tree/prop_node.rb +1 -1
  37. data/vendor/sass/lib/sass/tree/root_node.rb +37 -5
  38. data/vendor/sass/lib/sass/tree/rule_node.rb +4 -6
  39. data/vendor/sass/lib/sass/util.rb +18 -1
  40. data/vendor/sass/test/sass/cache_test.rb +7 -7
  41. data/vendor/sass/test/sass/conversion_test.rb +28 -0
  42. data/vendor/sass/test/sass/engine_test.rb +214 -11
  43. data/vendor/sass/test/sass/functions_test.rb +69 -0
  44. data/vendor/sass/test/sass/plugin_test.rb +13 -4
  45. data/vendor/sass/test/sass/results/import_charset.css +4 -0
  46. data/vendor/sass/test/sass/results/import_charset_1_8.css +4 -0
  47. data/vendor/sass/test/sass/results/import_charset_ibm866.css +4 -0
  48. data/vendor/sass/test/sass/script_conversion_test.rb +27 -25
  49. data/vendor/sass/test/sass/script_test.rb +12 -1
  50. data/vendor/sass/test/sass/scss/css_test.rb +27 -8
  51. data/vendor/sass/test/sass/scss/scss_test.rb +77 -0
  52. data/vendor/sass/test/sass/templates/_imported_charset_ibm866.sass +4 -0
  53. data/vendor/sass/test/sass/templates/_imported_charset_utf8.sass +4 -0
  54. data/vendor/sass/test/sass/templates/import_charset.sass +7 -0
  55. data/vendor/sass/test/sass/templates/import_charset_1_8.sass +4 -0
  56. data/vendor/sass/test/sass/templates/import_charset_ibm866.sass +9 -0
  57. data/vendor/sass/test/sass/templates/script.sass +2 -2
  58. data/vendor/sass/test/test_helper.rb +8 -0
  59. metadata +27 -10
  60. data/REVISION +0 -1
  61. data/vendor/sass/lib/sass/cache_store.rb +0 -208
@@ -36,6 +36,25 @@ module Sass::Tree
36
36
  self.else.options = options if self.else
37
37
  end
38
38
 
39
+ # @see Node#_around_dump
40
+ def _around_dump
41
+ old_else = @else
42
+ old_last_else = @last_else
43
+ @else = Sass::Util.dump(@else)
44
+ @last_else = (self == @last_else ? nil : Sass::Util.dump(@last_else))
45
+ super
46
+ ensure
47
+ @else = old_else
48
+ @last_else = old_last_else
49
+ end
50
+
51
+ # @see Node#_after_load
52
+ def _after_load
53
+ super
54
+ @else = Sass::Util.load(@else)
55
+ @last_else = (@last_else ? Sass::Util.load(@last_else) : self)
56
+ end
57
+
39
58
  protected
40
59
 
41
60
  # @see Node#to_src
@@ -0,0 +1,75 @@
1
+ module Sass::Tree
2
+ # A static node representing a `@media` rule.
3
+ # `@media` rules behave differently from other directives
4
+ # in that when they're nested within rules,
5
+ # they bubble up to top-level.
6
+ #
7
+ # @see Sass::Tree
8
+ class MediaNode < DirectiveNode
9
+ # The media query (e.g. `print` or `screen`).
10
+ #
11
+ # @return [String]
12
+ attr_accessor :query
13
+
14
+ # @see RuleNode#tabs
15
+ attr_accessor :tabs
16
+
17
+ # @see RuleNode#group_end
18
+ attr_accessor :group_end
19
+
20
+ # @param query [String] See \{#query}
21
+ def initialize(query)
22
+ @query = query
23
+ @tabs = 0
24
+ super('')
25
+ end
26
+
27
+ # @see DirectiveNode#value
28
+ def value
29
+ "@media #{query}"
30
+ end
31
+
32
+ # Pass on the parent if it's a RuleNode.
33
+ #
34
+ # @see Node#cssize
35
+ def cssize(extends, parent = nil)
36
+ _cssize(extends, (parent if [MediaNode, RuleNode].include?(parent.class)))
37
+ rescue Sass::SyntaxError => e
38
+ e.modify_backtrace(:filename => filename, :line => line)
39
+ raise e
40
+ end
41
+
42
+ protected
43
+
44
+ # Merge nested media queries.
45
+ #
46
+ # @see Node#_cssize
47
+ def _cssize(extends, parent)
48
+ node = super
49
+ media = node.children.select {|c| c.is_a?(MediaNode)}
50
+ node.children.reject! {|c| c.is_a?(MediaNode)}
51
+ media.each {|n| n.query = "#{query} and #{n.query}"}
52
+ (node.children.empty? ? [] : [node]) + media
53
+ end
54
+
55
+ # If we're passed a parent, bubble it down.
56
+ #
57
+ # @see Node#cssize
58
+ def cssize!(extends, parent)
59
+ return super unless parent.is_a?(RuleNode)
60
+ new_rule = parent.dup
61
+ new_rule.children = self.children
62
+ self.children = Array(new_rule.cssize(extends, self))
63
+ # If the last child is actually the end of the group,
64
+ # the parent's cssize will set it properly
65
+ self.children.last.group_end = false unless self.children.empty?
66
+ end
67
+
68
+ # @see Node#to_s
69
+ def _to_s(tabs)
70
+ str = super(tabs + self.tabs)
71
+ str.gsub!(/\n\Z/, '') unless style == :compressed || group_end
72
+ str
73
+ end
74
+ end
75
+ end
@@ -199,7 +199,7 @@ module Sass::Tree
199
199
 
200
200
  def val_to_sass_concat(node, opts)
201
201
  return node unless node.is_a?(Sass::Script::Operation)
202
- return val_to_sass_div(node, opts) unless node.operator == :concat
202
+ return val_to_sass_div(node, opts) unless node.operator == :space
203
203
 
204
204
  Sass::Script::Operation.new(
205
205
  val_to_sass_div(node.operand1, opts),
@@ -17,7 +17,7 @@ module Sass
17
17
  def to_s(*args)
18
18
  super
19
19
  rescue Sass::SyntaxError => e
20
- e.sass_template = @template
20
+ e.sass_template ||= @template
21
21
  raise e
22
22
  end
23
23
 
@@ -36,7 +36,7 @@ module Sass
36
36
  environment.options = @options if environment.options.nil? || environment.options.empty?
37
37
  super
38
38
  rescue Sass::SyntaxError => e
39
- e.sass_template = @template
39
+ e.sass_template ||= @template
40
40
  raise e
41
41
  end
42
42
 
@@ -47,9 +47,9 @@ module Sass
47
47
  # @return [(Tree::Node, Sass::Util::SubsetMap)] The resulting tree of static nodes
48
48
  # *and* the extensions defined for this tree
49
49
  def cssize(extends = Sass::Util::SubsetMap.new, parent = nil)
50
- return super(extends), extends
50
+ return super(extends, parent), extends
51
51
  rescue Sass::SyntaxError => e
52
- e.sass_template = @template
52
+ e.sass_template ||= @template
53
53
  raise e
54
54
  end
55
55
 
@@ -106,7 +106,39 @@ module Sass
106
106
  end
107
107
  result.rstrip!
108
108
  return "" if result.empty?
109
- return result + "\n"
109
+ result << "\n"
110
+ unless Sass::Util.ruby1_8? || result.ascii_only?
111
+ if children.first.is_a?(CharsetNode)
112
+ begin
113
+ encoding = children.first.name
114
+ # Default to big-endian encoding, because we have to decide somehow
115
+ encoding << 'BE' if encoding =~ /\Autf-(16|32)\Z/i
116
+ result = result.encode(Encoding.find(encoding))
117
+ rescue EncodingError
118
+ end
119
+ end
120
+
121
+ result = "@charset \"#{result.encoding.name}\";#{
122
+ style == :compressed ? '' : "\n"
123
+ }".encode(result.encoding) + result
124
+ end
125
+ result
126
+ end
127
+
128
+ # In Ruby 1.8, ensures that there's only one @charset directive
129
+ # and that it's at the top of the document.
130
+ #
131
+ # @see Node#cssize
132
+ def cssize!(extends, parent)
133
+ super
134
+
135
+ # In Ruby 1.9 we can make all @charset nodes invisible
136
+ # and infer the final @charset from the encoding of the final string.
137
+ if Sass::Util.ruby1_8? && parent.nil?
138
+ charset = self.children.find {|c| c.is_a?(CharsetNode)}
139
+ self.children.reject! {|c| c.is_a?(CharsetNode)}
140
+ self.children.unshift charset if charset
141
+ end
110
142
  end
111
143
 
112
144
  # Returns an error message if the given child node is invalid,
@@ -53,11 +53,8 @@ module Sass::Tree
53
53
  # @param rule [Array<String, Sass::Script::Node>]
54
54
  # The CSS rule. See \{#rule}
55
55
  def initialize(rule)
56
- #p rule
57
56
  merged = Sass::Util.merge_adjacent_strings(rule)
58
- #p merged
59
57
  @rule = Sass::Util.strip_string_array(merged)
60
- #p @rule
61
58
  @tabs = 0
62
59
  super()
63
60
  end
@@ -200,8 +197,8 @@ module Sass::Tree
200
197
  # or nil if the parent isn't a {RuleNode}
201
198
  def _cssize(extends, parent)
202
199
  node = super
203
- rules = node.children.grep(RuleNode)
204
- props = node.children.reject {|c| c.is_a?(RuleNode) || c.invisible?}
200
+ rules = node.children.select {|c| c.is_a?(RuleNode) || c.is_a?(MediaNode)}
201
+ props = node.children.reject {|c| c.is_a?(RuleNode) || c.is_a?(MediaNode) || c.invisible?}
205
202
 
206
203
  unless props.empty?
207
204
  node.children = props
@@ -223,7 +220,8 @@ module Sass::Tree
223
220
  # or nil if the parent isn't a {RuleNode}
224
221
  # @raise [Sass::SyntaxError] if the rule has no parents but uses `&`
225
222
  def cssize!(extends, parent)
226
- self.resolved_rules = @parsed_rules.resolve_parent_refs(parent && parent.resolved_rules)
223
+ # It's possible for resolved_rules to be set if we've duplicated this node during @media bubbling
224
+ self.resolved_rules ||= @parsed_rules.resolve_parent_refs(parent && parent.resolved_rules)
227
225
  super
228
226
  end
229
227
 
@@ -17,6 +17,11 @@ module Sass
17
17
  # @api public
18
18
  RUBY_VERSION = ::RUBY_VERSION.split(".").map {|s| s.to_i}
19
19
 
20
+ # The Ruby engine we're running under. Defaults to `"ruby"`
21
+ # if the top-level constant is undefined.
22
+ # @api public
23
+ RUBY_ENGINE = defined?(::RUBY_ENGINE) ? ::RUBY_ENGINE : "ruby"
24
+
20
25
  # Returns the path of a file relative to the Sass root directory.
21
26
  #
22
27
  # @param file [String] The filename relative to the Sass root
@@ -416,13 +421,25 @@ module Sass
416
421
  RbConfig::CONFIG['host_os'] =~ /mswin|windows|mingw/i
417
422
  end
418
423
 
424
+ # Whether or not this is running on IronRuby.
425
+ #
426
+ # @return [Boolean]
427
+ def ironruby?
428
+ RUBY_ENGINE == "ironruby"
429
+ end
430
+
419
431
  ## Cross-Ruby-Version Compatibility
420
432
 
421
433
  # Whether or not this is running under Ruby 1.8 or lower.
422
434
  #
435
+ # Note that IronRuby counts as Ruby 1.8,
436
+ # because it doesn't support the Ruby 1.9 encoding API.
437
+ #
423
438
  # @return [Boolean]
424
439
  def ruby1_8?
425
- Sass::Util::RUBY_VERSION[0] == 1 && Sass::Util::RUBY_VERSION[1] < 9
440
+ # IronRuby says its version is 1.9, but doesn't support any of the encoding APIs.
441
+ # We have to fall back to 1.8 behavior.
442
+ ironruby? || (Sass::Util::RUBY_VERSION[0] == 1 && Sass::Util::RUBY_VERSION[1] < 9)
426
443
  end
427
444
 
428
445
  # Whether or not this is running under Ruby 1.8.6 or lower.
@@ -14,13 +14,13 @@ class CacheTest < Test::Unit::TestCase
14
14
  end
15
15
 
16
16
  def test_file_cache_writes_a_file
17
- file_store = Sass::FileCacheStore.new(@@cache_dir)
17
+ file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
18
18
  file_store.store("asdf/foo.scssc", "fakesha1", root_node)
19
19
  assert File.exists?("#{@@cache_dir}/asdf/foo.scssc")
20
20
  end
21
21
 
22
22
  def test_file_cache_reads_a_file
23
- file_store = Sass::FileCacheStore.new(@@cache_dir)
23
+ file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
24
24
  assert !File.exists?("#{@@cache_dir}/asdf/foo.scssc")
25
25
  file_store.store("asdf/foo.scssc", "fakesha1", root_node)
26
26
  assert File.exists?("#{@@cache_dir}/asdf/foo.scssc")
@@ -28,13 +28,13 @@ class CacheTest < Test::Unit::TestCase
28
28
  end
29
29
 
30
30
  def test_file_cache_miss_returns_nil
31
- file_store = Sass::FileCacheStore.new(@@cache_dir)
31
+ file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
32
32
  assert !File.exists?("#{@@cache_dir}/asdf/foo.scssc")
33
33
  assert_nil file_store.retrieve("asdf/foo.scssc", "fakesha1")
34
34
  end
35
35
 
36
36
  def test_sha_change_invalidates_cache_and_cleans_up
37
- file_store = Sass::FileCacheStore.new(@@cache_dir)
37
+ file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
38
38
  assert !File.exists?("#{@@cache_dir}/asdf/foo.scssc")
39
39
  file_store.store("asdf/foo.scssc", "fakesha1", root_node)
40
40
  assert File.exists?("#{@@cache_dir}/asdf/foo.scssc")
@@ -43,7 +43,7 @@ class CacheTest < Test::Unit::TestCase
43
43
  end
44
44
 
45
45
  def test_version_change_invalidates_cache_and_cleans_up
46
- file_store = Sass::FileCacheStore.new(@@cache_dir)
46
+ file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
47
47
  assert !File.exists?("#{@@cache_dir}/asdf/foo.scssc")
48
48
  file_store.store("asdf/foo.scssc", "fakesha1", root_node)
49
49
  assert File.exists?("#{@@cache_dir}/asdf/foo.scssc")
@@ -58,7 +58,7 @@ class CacheTest < Test::Unit::TestCase
58
58
  end
59
59
 
60
60
  def test_arbitrary_objects_can_go_into_cache
61
- cache = Sass::InMemoryCacheStore.new
61
+ cache = Sass::CacheStores::Memory.new
62
62
  an_object = {:foo => :bar}
63
63
  cache.store("an_object", "", an_object)
64
64
  assert_equal an_object, cache.retrieve("an_object", "")
@@ -71,4 +71,4 @@ class CacheTest < Test::Unit::TestCase
71
71
  div { @include color(red); }
72
72
  SCSS
73
73
  end
74
- end
74
+ end
@@ -607,6 +607,14 @@ foo {
607
607
  SCSS
608
608
  end
609
609
 
610
+ def test_charset
611
+ assert_renders <<SASS, <<SCSS
612
+ @charset "utf-8"
613
+ SASS
614
+ @charset "utf-8";
615
+ SCSS
616
+ end
617
+
610
618
  def test_for
611
619
  assert_renders <<SASS, <<SCSS
612
620
  foo
@@ -667,6 +675,26 @@ foo {
667
675
  SCSS
668
676
  end
669
677
 
678
+ def test_each
679
+ assert_renders <<SASS, <<SCSS
680
+ a
681
+ @each $number in 1px 2px 3px 4px
682
+ b: $number
683
+
684
+ c
685
+ @each $str in foo, bar, baz, bang
686
+ d: $str
687
+ SASS
688
+ a {
689
+ @each $number in 1px 2px 3px 4px {
690
+ b: $number; } }
691
+
692
+ c {
693
+ @each $str in foo, bar, baz, bang {
694
+ d: $str; } }
695
+ SCSS
696
+ end
697
+
670
698
  def test_import
671
699
  assert_renders <<SASS, <<SCSS
672
700
  @import foo
@@ -56,12 +56,8 @@ MSG
56
56
  "$a: #ccc + 2px" => "Cannot add a number with units (2px) to a color (#cccccc).",
57
57
  "& a\n :b c" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 1],
58
58
  "a\n :b\n c" => "Illegal nesting: Only properties may be nested beneath properties.",
59
- "a,\n :b c" => ["Rules can\'t end in commas.", 1],
60
- "a," => "Rules can\'t end in commas.",
61
- "a,\n$b: 1" => ["Rules can\'t end in commas.", 1],
62
59
  "$a: b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
63
60
  "@import foo.sass" => "File to import not found or unreadable: foo.sass.",
64
- "a,\n$b: 1" => ["Rules can\'t end in commas.", 1],
65
61
  "$a: b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
66
62
  "@import foo.sass" => <<MSG,
67
63
  File to import not found or unreadable: foo.sass.
@@ -610,6 +606,12 @@ SASS
610
606
 
611
607
  assert_equal("#foo #bar,#baz #boom{foo:bar}\n",
612
608
  render("#foo #bar,\n#baz #boom\n :foo bar", :style => :compressed))
609
+
610
+ assert_equal("#foo #bar,\n#baz #boom {\n foo: bar; }\n",
611
+ render("#foo #bar,,\n,#baz #boom,\n :foo bar"))
612
+
613
+ assert_equal("#bip #bop {\n foo: bar; }\n",
614
+ render("#bip #bop,, ,\n :foo bar"))
613
615
  end
614
616
 
615
617
  def test_complex_multiline_selector
@@ -1281,6 +1283,29 @@ a
1281
1283
  SASS
1282
1284
  end
1283
1285
 
1286
+ def test_each
1287
+ assert_equal(<<CSS, render(<<SASS))
1288
+ a {
1289
+ b: 1px;
1290
+ b: 2px;
1291
+ b: 3px;
1292
+ b: 4px;
1293
+ c: foo;
1294
+ c: bar;
1295
+ c: baz;
1296
+ c: bang;
1297
+ d: blue; }
1298
+ CSS
1299
+ a
1300
+ @each $number in 1px 2px 3px 4px
1301
+ b: $number
1302
+ @each $str in foo, bar, baz, bang
1303
+ c: $str
1304
+ @each $single in blue
1305
+ d: $single
1306
+ SASS
1307
+ end
1308
+
1284
1309
  def test_variable_reassignment
1285
1310
  assert_equal(<<CSS, render(<<SASS))
1286
1311
  a {
@@ -2218,6 +2243,180 @@ foo
2218
2243
  SASS
2219
2244
  end
2220
2245
 
2246
+ def test_media_bubbling
2247
+ assert_equal <<CSS, render(<<SASS)
2248
+ .foo {
2249
+ a: b; }
2250
+ @media bar {
2251
+ .foo {
2252
+ c: d; } }
2253
+ .foo .baz {
2254
+ e: f; }
2255
+ @media bip {
2256
+ .foo .baz {
2257
+ g: h; } }
2258
+
2259
+ .other {
2260
+ i: j; }
2261
+ CSS
2262
+ .foo
2263
+ a: b
2264
+ @media bar
2265
+ c: d
2266
+ .baz
2267
+ e: f
2268
+ @media bip
2269
+ g: h
2270
+
2271
+ .other
2272
+ i: j
2273
+ SASS
2274
+
2275
+ assert_equal <<CSS, render(<<SASS, :style => :compact)
2276
+ .foo { a: b; }
2277
+ @media bar { .foo { c: d; } }
2278
+ .foo .baz { e: f; }
2279
+ @media bip { .foo .baz { g: h; } }
2280
+
2281
+ .other { i: j; }
2282
+ CSS
2283
+ .foo
2284
+ a: b
2285
+ @media bar
2286
+ c: d
2287
+ .baz
2288
+ e: f
2289
+ @media bip
2290
+ g: h
2291
+
2292
+ .other
2293
+ i: j
2294
+ SASS
2295
+
2296
+ assert_equal <<CSS, render(<<SASS, :style => :expanded)
2297
+ .foo {
2298
+ a: b;
2299
+ }
2300
+ @media bar {
2301
+ .foo {
2302
+ c: d;
2303
+ }
2304
+ }
2305
+ .foo .baz {
2306
+ e: f;
2307
+ }
2308
+ @media bip {
2309
+ .foo .baz {
2310
+ g: h;
2311
+ }
2312
+ }
2313
+
2314
+ .other {
2315
+ i: j;
2316
+ }
2317
+ CSS
2318
+ .foo
2319
+ a: b
2320
+ @media bar
2321
+ c: d
2322
+ .baz
2323
+ e: f
2324
+ @media bip
2325
+ g: h
2326
+
2327
+ .other
2328
+ i: j
2329
+ SASS
2330
+ end
2331
+
2332
+ def test_double_media_bubbling
2333
+ assert_equal <<CSS, render(<<SASS)
2334
+ @media bar and baz {
2335
+ .foo {
2336
+ c: d; } }
2337
+ CSS
2338
+ @media bar
2339
+ @media baz
2340
+ .foo
2341
+ c: d
2342
+ SASS
2343
+
2344
+ assert_equal <<CSS, render(<<SASS)
2345
+ @media bar {
2346
+ .foo {
2347
+ a: b; } }
2348
+ @media bar and baz {
2349
+ .foo {
2350
+ c: d; } }
2351
+ CSS
2352
+ .foo
2353
+ @media bar
2354
+ a: b
2355
+ @media baz
2356
+ c: d
2357
+ SASS
2358
+ end
2359
+
2360
+ def test_rule_media_rule_bubbling
2361
+ assert_equal <<CSS, render(<<SASS)
2362
+ @media bar {
2363
+ .foo {
2364
+ a: b;
2365
+ e: f; }
2366
+ .foo .baz {
2367
+ c: d; } }
2368
+ CSS
2369
+ .foo
2370
+ @media bar
2371
+ a: b
2372
+ .baz
2373
+ c: d
2374
+ e: f
2375
+ SASS
2376
+ end
2377
+
2378
+ def test_nested_media_around_properties
2379
+ assert_equal <<CSS, render(<<SASS)
2380
+ .outside {
2381
+ color: red;
2382
+ background: blue; }
2383
+ @media print {
2384
+ .outside {
2385
+ color: black; } }
2386
+ @media print and nested {
2387
+ .outside .inside {
2388
+ border: 1px solid black; } }
2389
+ .outside .middle {
2390
+ display: block; }
2391
+ CSS
2392
+ .outside
2393
+ color: red
2394
+ @media print
2395
+ color: black
2396
+ .inside
2397
+ @media nested
2398
+ border: 1px solid black
2399
+ background: blue
2400
+ .middle
2401
+ display: block
2402
+ SASS
2403
+ end
2404
+
2405
+ def test_media_with_parent_references
2406
+ sass_str = <<SASS
2407
+ .outside
2408
+ @media print
2409
+ &.inside
2410
+ border: 1px solid black
2411
+ SASS
2412
+ css_str = <<CSS
2413
+ @media print {
2414
+ .outside.inside {
2415
+ border: 1px solid black; } }
2416
+ CSS
2417
+ assert_equal css_str, render(sass_str)
2418
+ end
2419
+
2221
2420
  # Encodings
2222
2421
 
2223
2422
  unless Sass::Util.ruby1_8?
@@ -2241,7 +2440,7 @@ SASS
2241
2440
 
2242
2441
  def test_same_charset_as_encoding
2243
2442
  assert_renders_encoded(<<CSS, <<SASS)
2244
- @charset "utf-8";
2443
+ @charset "UTF-8";
2245
2444
  fóó {
2246
2445
  a: b; }
2247
2446
  CSS
@@ -2253,7 +2452,7 @@ SASS
2253
2452
 
2254
2453
  def test_different_charset_than_encoding
2255
2454
  assert_renders_encoded(<<CSS.force_encoding("IBM866"), <<SASS)
2256
- @charset "ibm866";
2455
+ @charset "IBM866";
2257
2456
  fóó {
2258
2457
  a: b; }
2259
2458
  CSS
@@ -2265,6 +2464,7 @@ SASS
2265
2464
 
2266
2465
  def test_different_encoding_than_system
2267
2466
  assert_renders_encoded(<<CSS.encode("IBM866"), <<SASS.encode("IBM866"))
2467
+ @charset "IBM866";
2268
2468
  тАЬ {
2269
2469
  a: b; }
2270
2470
  CSS
@@ -2274,20 +2474,20 @@ SASS
2274
2474
  end
2275
2475
 
2276
2476
  def test_multibyte_charset
2277
- assert_renders_encoded(<<CSS.encode("UTF-16BE"), <<SASS.encode("UTF-16BE").force_encoding("UTF-8"))
2278
- @charset "utf-16be";
2477
+ assert_renders_encoded(<<CSS.encode("UTF-16LE"), <<SASS.encode("UTF-16LE").force_encoding("UTF-8"))
2478
+ @charset "UTF-16LE";
2279
2479
  fóó {
2280
2480
  a: b; }
2281
2481
  CSS
2282
- @charset "utf-16be"
2482
+ @charset "utf-16le"
2283
2483
  fóó
2284
2484
  a: b
2285
2485
  SASS
2286
2486
  end
2287
2487
 
2288
2488
  def test_multibyte_charset_without_endian_specifier
2289
- assert_renders_encoded(<<CSS.encode("UTF-32LE"), <<SASS.encode("UTF-32LE").force_encoding("UTF-8"))
2290
- @charset "utf-32";
2489
+ assert_renders_encoded(<<CSS.encode("UTF-32BE"), <<SASS.encode("UTF-32BE").force_encoding("UTF-8"))
2490
+ @charset "UTF-32BE";
2291
2491
  fóó {
2292
2492
  a: b; }
2293
2493
  CSS
@@ -2299,6 +2499,7 @@ SASS
2299
2499
 
2300
2500
  def test_utf8_bom
2301
2501
  assert_renders_encoded(<<CSS, <<SASS.force_encoding("BINARY"))
2502
+ @charset "UTF-8";
2302
2503
  fóó {
2303
2504
  a: b; }
2304
2505
  CSS
@@ -2309,6 +2510,7 @@ SASS
2309
2510
 
2310
2511
  def test_utf16le_bom
2311
2512
  assert_renders_encoded(<<CSS.encode("UTF-16LE"), <<SASS.encode("UTF-16LE").force_encoding("BINARY"))
2513
+ @charset "UTF-16LE";
2312
2514
  fóó {
2313
2515
  a: b; }
2314
2516
  CSS
@@ -2319,6 +2521,7 @@ SASS
2319
2521
 
2320
2522
  def test_utf32be_bom
2321
2523
  assert_renders_encoded(<<CSS.encode("UTF-32BE"), <<SASS.encode("UTF-32BE").force_encoding("BINARY"))
2524
+ @charset "UTF-32BE";
2322
2525
  fóó {
2323
2526
  a: b; }
2324
2527
  CSS