sass 3.4.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.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +3 -1
  3. data/CODE_OF_CONDUCT.md +10 -0
  4. data/CONTRIBUTING.md +148 -0
  5. data/MIT-LICENSE +1 -1
  6. data/README.md +26 -20
  7. data/Rakefile +103 -20
  8. data/VERSION +1 -1
  9. data/VERSION_DATE +1 -1
  10. data/extra/sass-spec-ref.sh +32 -0
  11. data/extra/update_watch.rb +1 -1
  12. data/lib/sass/cache_stores/filesystem.rb +7 -7
  13. data/lib/sass/cache_stores/memory.rb +4 -5
  14. data/lib/sass/callbacks.rb +2 -2
  15. data/lib/sass/css.rb +11 -10
  16. data/lib/sass/deprecation.rb +55 -0
  17. data/lib/sass/engine.rb +83 -38
  18. data/lib/sass/environment.rb +26 -2
  19. data/lib/sass/error.rb +12 -12
  20. data/lib/sass/exec/base.rb +15 -3
  21. data/lib/sass/exec/sass_convert.rb +34 -15
  22. data/lib/sass/exec/sass_scss.rb +23 -7
  23. data/lib/sass/features.rb +2 -2
  24. data/lib/sass/importers/base.rb +1 -1
  25. data/lib/sass/importers/deprecated_path.rb +51 -0
  26. data/lib/sass/importers/filesystem.rb +24 -16
  27. data/lib/sass/importers.rb +1 -0
  28. data/lib/sass/logger/base.rb +8 -2
  29. data/lib/sass/logger/delayed.rb +50 -0
  30. data/lib/sass/logger.rb +8 -3
  31. data/lib/sass/plugin/compiler.rb +42 -25
  32. data/lib/sass/plugin/configuration.rb +38 -22
  33. data/lib/sass/plugin/merb.rb +2 -2
  34. data/lib/sass/plugin/rack.rb +3 -3
  35. data/lib/sass/plugin/rails.rb +1 -1
  36. data/lib/sass/plugin/staleness_checker.rb +3 -3
  37. data/lib/sass/plugin.rb +3 -2
  38. data/lib/sass/script/css_parser.rb +2 -3
  39. data/lib/sass/script/css_variable_warning.rb +52 -0
  40. data/lib/sass/script/functions.rb +140 -73
  41. data/lib/sass/script/lexer.rb +37 -22
  42. data/lib/sass/script/parser.rb +235 -40
  43. data/lib/sass/script/tree/funcall.rb +12 -5
  44. data/lib/sass/script/tree/interpolation.rb +109 -4
  45. data/lib/sass/script/tree/list_literal.rb +31 -4
  46. data/lib/sass/script/tree/literal.rb +4 -0
  47. data/lib/sass/script/tree/node.rb +21 -3
  48. data/lib/sass/script/tree/operation.rb +54 -1
  49. data/lib/sass/script/tree/string_interpolation.rb +58 -37
  50. data/lib/sass/script/tree/variable.rb +1 -1
  51. data/lib/sass/script/value/base.rb +10 -9
  52. data/lib/sass/script/value/color.rb +42 -24
  53. data/lib/sass/script/value/helpers.rb +16 -6
  54. data/lib/sass/script/value/map.rb +1 -1
  55. data/lib/sass/script/value/number.rb +52 -19
  56. data/lib/sass/script/value/string.rb +46 -5
  57. data/lib/sass/script.rb +3 -3
  58. data/lib/sass/scss/css_parser.rb +16 -2
  59. data/lib/sass/scss/parser.rb +120 -75
  60. data/lib/sass/scss/rx.rb +9 -10
  61. data/lib/sass/scss/static_parser.rb +19 -14
  62. data/lib/sass/scss.rb +0 -2
  63. data/lib/sass/selector/abstract_sequence.rb +8 -6
  64. data/lib/sass/selector/comma_sequence.rb +25 -9
  65. data/lib/sass/selector/pseudo.rb +45 -35
  66. data/lib/sass/selector/sequence.rb +54 -18
  67. data/lib/sass/selector/simple.rb +11 -11
  68. data/lib/sass/selector/simple_sequence.rb +34 -15
  69. data/lib/sass/selector.rb +7 -10
  70. data/lib/sass/shared.rb +1 -1
  71. data/lib/sass/source/map.rb +7 -4
  72. data/lib/sass/source/position.rb +4 -4
  73. data/lib/sass/stack.rb +2 -2
  74. data/lib/sass/supports.rb +8 -10
  75. data/lib/sass/tree/comment_node.rb +1 -1
  76. data/lib/sass/tree/css_import_node.rb +9 -1
  77. data/lib/sass/tree/function_node.rb +8 -3
  78. data/lib/sass/tree/import_node.rb +6 -5
  79. data/lib/sass/tree/node.rb +5 -3
  80. data/lib/sass/tree/prop_node.rb +5 -6
  81. data/lib/sass/tree/rule_node.rb +14 -4
  82. data/lib/sass/tree/visitors/check_nesting.rb +18 -22
  83. data/lib/sass/tree/visitors/convert.rb +43 -26
  84. data/lib/sass/tree/visitors/cssize.rb +5 -1
  85. data/lib/sass/tree/visitors/deep_copy.rb +1 -1
  86. data/lib/sass/tree/visitors/extend.rb +15 -13
  87. data/lib/sass/tree/visitors/perform.rb +42 -17
  88. data/lib/sass/tree/visitors/set_options.rb +1 -1
  89. data/lib/sass/tree/visitors/to_css.rb +58 -30
  90. data/lib/sass/util/multibyte_string_scanner.rb +0 -2
  91. data/lib/sass/util/normalized_map.rb +0 -1
  92. data/lib/sass/util/subset_map.rb +1 -2
  93. data/lib/sass/util.rb +125 -68
  94. data/lib/sass/version.rb +2 -2
  95. data/lib/sass.rb +10 -3
  96. data/test/sass/compiler_test.rb +6 -2
  97. data/test/sass/conversion_test.rb +187 -53
  98. data/test/sass/css2sass_test.rb +50 -1
  99. data/test/sass/css_variable_test.rb +132 -0
  100. data/test/sass/engine_test.rb +207 -61
  101. data/test/sass/exec_test.rb +10 -0
  102. data/test/sass/extend_test.rb +101 -29
  103. data/test/sass/functions_test.rb +60 -9
  104. data/test/sass/importer_test.rb +9 -0
  105. data/test/sass/more_templates/more1.sass +10 -10
  106. data/test/sass/more_templates/more_import.sass +2 -2
  107. data/test/sass/plugin_test.rb +10 -8
  108. data/test/sass/results/script.css +3 -3
  109. data/test/sass/script_conversion_test.rb +58 -29
  110. data/test/sass/script_test.rb +430 -53
  111. data/test/sass/scss/css_test.rb +73 -7
  112. data/test/sass/scss/rx_test.rb +4 -0
  113. data/test/sass/scss/scss_test.rb +309 -4
  114. data/test/sass/source_map_test.rb +152 -74
  115. data/test/sass/superselector_test.rb +19 -0
  116. data/test/sass/templates/_partial.sass +1 -1
  117. data/test/sass/templates/basic.sass +10 -10
  118. data/test/sass/templates/bork1.sass +1 -1
  119. data/test/sass/templates/bork5.sass +1 -1
  120. data/test/sass/templates/compact.sass +10 -10
  121. data/test/sass/templates/complex.sass +187 -187
  122. data/test/sass/templates/compressed.sass +10 -10
  123. data/test/sass/templates/expanded.sass +10 -10
  124. data/test/sass/templates/import.sass +2 -2
  125. data/test/sass/templates/importee.sass +3 -3
  126. data/test/sass/templates/mixins.sass +22 -22
  127. data/test/sass/templates/multiline.sass +4 -4
  128. data/test/sass/templates/nested.sass +13 -13
  129. data/test/sass/templates/parent_ref.sass +12 -12
  130. data/test/sass/templates/script.sass +70 -70
  131. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +1 -1
  132. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +2 -2
  133. data/test/sass/templates/subdir/subdir.sass +3 -3
  134. data/test/sass/templates/units.sass +10 -10
  135. data/test/sass/util/multibyte_string_scanner_test.rb +10 -2
  136. data/test/sass/util_test.rb +15 -44
  137. data/test/sass-spec.yml +3 -0
  138. data/test/test_helper.rb +5 -4
  139. metadata +302 -295
  140. data/CONTRIBUTING +0 -3
  141. data/lib/sass/scss/script_lexer.rb +0 -15
  142. data/lib/sass/scss/script_parser.rb +0 -25
@@ -1,25 +1,25 @@
1
1
  #main
2
- :width 15em
3
- :color #0000ff
2
+ width: 15em
3
+ color: #0000ff
4
4
  p
5
- :border
6
- :style dotted
5
+ border:
6
+ style: dotted
7
7
  /* Nested comment
8
8
  More nested stuff
9
- :width 2px
9
+ width: 2px
10
10
  .cool
11
- :width 100px
11
+ width: 100px
12
12
 
13
13
  #left
14
- :font
15
- :size 2em
16
- :weight bold
17
- :float left
14
+ font:
15
+ size: 2em
16
+ weight: bold
17
+ float: left
18
18
 
19
19
  #right
20
20
  .header
21
- :border-style solid
21
+ border-style: solid
22
22
  .body
23
- :border-style dotted
23
+ border-style: dotted
24
24
  .footer
25
- :border-style dashed
25
+ border-style: dashed
@@ -1,25 +1,25 @@
1
1
  a
2
- :color #000
2
+ color: #000
3
3
  &:hover
4
- :color #f00
4
+ color: #f00
5
5
 
6
6
  p, div
7
- :width 100em
7
+ width: 100em
8
8
  & foo
9
- :width 10em
9
+ width: 10em
10
10
  &:hover, bar
11
- :height 20em
11
+ height: 20em
12
12
 
13
13
  #cool
14
- :border
15
- :style solid
16
- :width 2em
14
+ border:
15
+ style: solid
16
+ width: 2em
17
17
  .ie7 &, .ie6 &
18
- :content string("Totally not cool.")
18
+ content: string("Totally not cool.")
19
19
  .firefox &
20
- :content string("Quite cool.")
20
+ content: string("Quite cool.")
21
21
 
22
22
  .wow, .snazzy
23
- :font-family fantasy
23
+ font-family: fantasy
24
24
  &:hover, &:visited
25
- :font-weight bold
25
+ font-weight: bold
@@ -14,88 +14,88 @@ $percent: 11%
14
14
  $complex: 1px/1em
15
15
 
16
16
  #main
17
- :content $str
18
- :qstr $qstr
19
- :hstr $hstr
20
- :width $width
21
- :background-color #000
22
- :color $main_text
23
- :short-color #123
24
- :named-color olive
25
- :con "foo" bar ($space "boom")
26
- :con2 "noquo" quo
17
+ content: $str
18
+ qstr: $qstr
19
+ hstr: $hstr
20
+ width: $width
21
+ background-color: #000
22
+ color: $main_text
23
+ short-color: #123
24
+ named-color: olive
25
+ con: "foo" bar ($space "boom")
26
+ con2: "noquo" quo
27
27
  #sidebar
28
- :background-color $color
29
- :num
30
- :normal $num
31
- :dec $dec
32
- :dec0 $dec_0
33
- :neg $neg
34
- :esc $esc
35
- :many 1 + 2 + 3
36
- :order 1 + 2 * 3
37
- :complex ((1 + 2) + 15)+#3a8b9f + (hi+(1 +1+ 2)* 4)
28
+ background-color: $color
29
+ num:
30
+ normal: $num
31
+ dec: $dec
32
+ dec0: $dec_0
33
+ neg: $neg
34
+ esc: $esc
35
+ many: 1 + 2 + 3
36
+ order: 1 + 2 * 3
37
+ complex: ((1 + 2) + 15)+#3a8b9f + (hi+(1 +1+ 2)* 4)
38
38
 
39
39
  #plus
40
- :num
41
- :num 5+2
42
- :num-un 10em + 15em
43
- :num-un2 10 + 13em
44
- :num-neg 10 + -.13
45
- :str 100 * 1px
46
- :col 13 + #aaa
47
- :perc $percent + 20%
48
- :str
49
- :str "hi" + "\ there"
50
- :str2 "hi" + " there"
51
- :col "14em solid " + #123
52
- :num "times: " + 13
53
- :col
54
- :num #f02 + 123.5
55
- :col #12A + #405162
40
+ num:
41
+ num: 5+2
42
+ num-un: 10em + 15em
43
+ num-un2: 10 + 13em
44
+ num-neg: 10 + -.13
45
+ str: 100 * 1px
46
+ col: 13 + #aaa
47
+ perc: $percent + 20%
48
+ str:
49
+ str: "hi" + "\ there"
50
+ str2: "hi" + " there"
51
+ col: "14em solid " + #123
52
+ num: "times: " + 13
53
+ col:
54
+ num: #f02 + 123.5
55
+ col: #12A + #405162
56
56
 
57
57
  #minus
58
- :num
59
- :num 912 - 12
60
- :col
61
- :num #fffffa - 5.2
62
- :col #abcdef - #fedcba
63
- :unary
64
- :num -1
65
- :const -$neg
66
- :paren -(5 + 6)
67
- :two --12
68
- :many --------12
69
- :crazy -----(5 + ---$neg)
58
+ num:
59
+ num: 912 - 12
60
+ col:
61
+ num: #fffffa - 5.2
62
+ col: #abcdef - #fedcba
63
+ unary:
64
+ num: -1
65
+ const: -$neg
66
+ paren: -(5 + 6)
67
+ two: --12
68
+ many: --------12
69
+ crazy: -----(5 + ---$neg)
70
70
 
71
71
  #times
72
- :num
73
- :num 2 * 3.5
74
- :col 2 * #3a4b5c
75
- :col
76
- :num #12468a * 0.5
77
- :col #121212 * #020304
72
+ num:
73
+ num: 2 * 3.5
74
+ col: 2 * #3a4b5c
75
+ col:
76
+ num: #12468a * 0.5
77
+ col: #121212 * #020304
78
78
 
79
79
  #div
80
- :num
81
- :num (10 / 3.0)
82
- :num2 (10 / 3)
83
- :col
84
- :num #12468a / 2
85
- :col #abcdef / #0f0f0f
86
- :comp $complex * 1em
80
+ num:
81
+ num: (10 / 3.0)
82
+ num2: (10 / 3)
83
+ col:
84
+ num: #12468a / 2
85
+ col: #abcdef / #0f0f0f
86
+ comp: $complex * 1em
87
87
 
88
88
  #mod
89
- :num
90
- :num 17 % 3
91
- :col
92
- :col #5f6e7d % #10200a
93
- :num #aaabac % 3
89
+ num:
90
+ num: 17 % 3
91
+ col:
92
+ col: #5f6e7d % #10200a
93
+ num: #aaabac % 3
94
94
 
95
95
  #const
96
- :escaped
97
- :quote \$foo \!bar
98
- :default $str !important
96
+ escaped:
97
+ quote: \$foo \!bar
98
+ default: $str !important
99
99
 
100
100
  #regression
101
- :a (3 + 2) - 1
101
+ a: (3 + 2) - 1
@@ -1,2 +1,2 @@
1
1
  #nested
2
- :relative true
2
+ relative: true
@@ -1,3 +1,3 @@
1
1
  #pi
2
- :width 314px
3
-
2
+ width: 314px
3
+
@@ -1,6 +1,6 @@
1
1
  @import nested_subdir/nested_partial.sass
2
2
 
3
3
  #subdir
4
- :font
5
- :size 20px
6
- :weight bold
4
+ font:
5
+ size: 20px
6
+ weight: bold
@@ -1,11 +1,11 @@
1
1
  b
2
- :foo 0.5 * 10px
3
- :bar 10zzz * 12px / 5zzz
4
- :baz percentage(12.0px / 18px)
5
- :many-units 10.0zzz / 3yyy * 12px / 5zzz * 3yyy / 3px * 4em
6
- :mm 5mm + 1cm
7
- :pc 1pc + 12pt
8
- :pt 72pt - 2in
9
- :inches 1in + 2.54cm
10
- :more-inches 1in + ((72pt * 2in) + (36pt * 1in)) / 2.54cm
11
- :mixed (1 + (1em * 6px / 3in)) * 4in / 2em
2
+ foo: 0.5 * 10px
3
+ bar: 10zzz * 12px / 5zzz
4
+ baz: percentage(12.0px / 18px)
5
+ many-units: 10.0zzz / 3yyy * 12px / 5zzz * 3yyy / 3px * 4em
6
+ mm: 5mm + 1cm
7
+ pc: 1pc + 12pt
8
+ pt: 72pt - 2in
9
+ inches: 1in + 2.54cm
10
+ more-inches: 1in + ((72pt * 2in) + (36pt * 1in)) / 2.54cm
11
+ mixed: (1 + (1em * 6px / 3in)) * 4in / 2em
@@ -140,8 +140,16 @@ unless Sass::Util.ruby1_8?
140
140
  def assert_scanner_state(pos, byte_pos, matched_size, byte_matched_size)
141
141
  assert_equal pos, @scanner.pos, 'pos'
142
142
  assert_equal byte_pos, @scanner.byte_pos, 'byte_pos'
143
- assert_equal matched_size, @scanner.matched_size, 'matched_size'
144
- assert_equal byte_matched_size, @scanner.byte_matched_size, 'byte_matched_size'
143
+ if matched_size.nil?
144
+ assert_nil @scanner.matched_size, 'matched_size'
145
+ else
146
+ assert_equal matched_size, @scanner.matched_size, 'matched_size'
147
+ end
148
+ if byte_matched_size.nil?
149
+ assert_nil @scanner.byte_matched_size, 'byte_matched_size'
150
+ else
151
+ assert_equal byte_matched_size, @scanner.byte_matched_size, 'byte_matched_size'
152
+ end
145
153
  end
146
154
  end
147
155
  end
@@ -206,20 +206,6 @@ class UtilTest < MiniTest::Test
206
206
  assert_equal(98, ord("bar"))
207
207
  end
208
208
 
209
- def test_flatten
210
- assert_equal([1, 2, 3], flatten([1, 2, 3], 0))
211
- assert_equal([1, 2, 3], flatten([1, 2, 3], 1))
212
- assert_equal([1, 2, 3], flatten([1, 2, 3], 2))
213
-
214
- assert_equal([[1, 2], 3], flatten([[1, 2], 3], 0))
215
- assert_equal([1, 2, 3], flatten([[1, 2], 3], 1))
216
- assert_equal([1, 2, 3], flatten([[1, 2], 3], 2))
217
-
218
- assert_equal([[[1], 2], [3], 4], flatten([[[1], 2], [3], 4], 0))
219
- assert_equal([[1], 2, 3, 4], flatten([[[1], 2], [3], 4], 1))
220
- assert_equal([1, 2, 3, 4], flatten([[[1], 2], [3], 4], 2))
221
- end
222
-
223
209
  def test_flatten_vertically
224
210
  assert_equal([1, 2, 3], flatten_vertically([1, 2, 3]))
225
211
  assert_equal([1, 3, 5, 2, 4, 6], flatten_vertically([[1, 2], [3, 4], [5, 6]]))
@@ -227,36 +213,6 @@ class UtilTest < MiniTest::Test
227
213
  assert_equal([1, 4, 6, 2, 5, 3], flatten_vertically([[1, 2, 3], [4, 5], 6]))
228
214
  end
229
215
 
230
- def test_set_hash
231
- assert(set_hash(Set[1, 2, 3]) == set_hash(Set[3, 2, 1]))
232
- assert(set_hash(Set[1, 2, 3]) == set_hash(Set[1, 2, 3]))
233
-
234
- s1 = Set[]
235
- s1 << 1
236
- s1 << 2
237
- s1 << 3
238
- s2 = Set[]
239
- s2 << 3
240
- s2 << 2
241
- s2 << 1
242
- assert(set_hash(s1) == set_hash(s2))
243
- end
244
-
245
- def test_set_eql
246
- assert(set_eql?(Set[1, 2, 3], Set[3, 2, 1]))
247
- assert(set_eql?(Set[1, 2, 3], Set[1, 2, 3]))
248
-
249
- s1 = Set[]
250
- s1 << 1
251
- s1 << 2
252
- s1 << 3
253
- s2 = Set[]
254
- s2 << 3
255
- s2 << 2
256
- s2 << 1
257
- assert(set_eql?(s1, s2))
258
- end
259
-
260
216
  def test_extract_and_inject_values
261
217
  test = lambda {|arr| assert_equal(arr, with_extracted_values(arr) {|str| str})}
262
218
 
@@ -280,10 +236,12 @@ class UtilTest < MiniTest::Test
280
236
  def test_caller_info
281
237
  assert_equal(["/tmp/foo.rb", 12, "fizzle"], caller_info("/tmp/foo.rb:12: in `fizzle'"))
282
238
  assert_equal(["/tmp/foo.rb", 12, nil], caller_info("/tmp/foo.rb:12"))
239
+ assert_equal(["C:/tmp/foo.rb", 12, nil], caller_info("C:/tmp/foo.rb:12"))
283
240
  assert_equal(["(sass)", 12, "blah"], caller_info("(sass):12: in `blah'"))
284
241
  assert_equal(["", 12, "boop"], caller_info(":12: in `boop'"))
285
242
  assert_equal(["/tmp/foo.rb", -12, "fizzle"], caller_info("/tmp/foo.rb:-12: in `fizzle'"))
286
243
  assert_equal(["/tmp/foo.rb", 12, "fizzle"], caller_info("/tmp/foo.rb:12: in `fizzle {}'"))
244
+ assert_equal(["C:/tmp/foo.rb", 12, "fizzle"], caller_info("C:/tmp/foo.rb:12: in `fizzle {}'"))
287
245
 
288
246
  info = nested_caller_info_fn
289
247
  assert_equal(__FILE__, info[0])
@@ -396,6 +354,17 @@ WARNING
396
354
  assert_equal decimal_array, decimal_array_from_vlq
397
355
  end
398
356
 
357
+ def test_round_respects_precision
358
+ original_precision = Sass::Script::Value::Number.precision
359
+ assert_equal 0, Sass::Util.round(0.49999)
360
+ assert_equal 1, Sass::Util.round(0.499999)
361
+ Sass::Script::Value::Number.precision = 6
362
+ assert_equal 0, Sass::Util.round(0.499999)
363
+ assert_equal 1, Sass::Util.round(0.49999999)
364
+ ensure
365
+ Sass::Script::Value::Number.precision = original_precision
366
+ end
367
+
399
368
  def test_atomic_writes
400
369
  # when using normal writes, this test fails about 90% of the time.
401
370
  filename = File.join(Dir.tmpdir, "test_atomic")
@@ -426,6 +395,8 @@ WARNING
426
395
  end
427
396
  threads.each {|t| t.join}
428
397
  end
398
+ ensure
399
+ Sass::Util.retry_on_windows {File.delete filename if File.exist?(filename)}
429
400
  end
430
401
 
431
402
  def test_atomic_write_permissions
@@ -0,0 +1,3 @@
1
+ ---
2
+ :enabled: true
3
+ :language_version: '3.4'
data/test/test_helper.rb CHANGED
@@ -47,27 +47,28 @@ class MiniTest::Test
47
47
 
48
48
  def clean_up_sassc
49
49
  path = File.dirname(__FILE__) + "/../.sass-cache"
50
- FileUtils.rm_r(path) if File.exist?(path)
50
+ Sass::Util.retry_on_windows {FileUtils.rm_r(path) if File.exist?(path)}
51
51
  end
52
52
 
53
53
  def assert_warning(message)
54
54
  the_real_stderr, $stderr = $stderr, StringIO.new
55
- yield
55
+ result = yield
56
56
 
57
57
  if message.is_a?(Regexp)
58
58
  assert_match message, $stderr.string.strip
59
59
  else
60
60
  assert_equal message.strip, $stderr.string.strip
61
61
  end
62
+ result
62
63
  ensure
63
64
  $stderr = the_real_stderr
64
65
  end
65
66
 
66
67
  def assert_no_warning
67
68
  the_real_stderr, $stderr = $stderr, StringIO.new
68
- yield
69
-
69
+ result = yield
70
70
  assert_equal '', $stderr.string
71
+ result
71
72
  ensure
72
73
  $stderr = the_real_stderr
73
74
  end