sass 3.2.0.alpha.35 → 3.2.0.alpha.49

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/README.md +1 -1
  2. data/REVISION +1 -1
  3. data/VERSION +1 -1
  4. data/lib/sass.rb +22 -0
  5. data/lib/sass/engine.rb +2 -2
  6. data/lib/sass/environment.rb +0 -1
  7. data/lib/sass/exec.rb +1 -1
  8. data/lib/sass/importers/filesystem.rb +1 -1
  9. data/lib/sass/plugin.rb +4 -8
  10. data/lib/sass/plugin/compiler.rb +42 -17
  11. data/lib/sass/plugin/configuration.rb +0 -2
  12. data/lib/sass/repl.rb +0 -1
  13. data/lib/sass/script/funcall.rb +6 -1
  14. data/lib/sass/script/functions.rb +2 -2
  15. data/lib/sass/script/number.rb +1 -1
  16. data/lib/sass/script/parser.rb +12 -5
  17. data/lib/sass/script/variable.rb +0 -1
  18. data/lib/sass/scss/css_parser.rb +1 -0
  19. data/lib/sass/scss/parser.rb +37 -12
  20. data/lib/sass/scss/rx.rb +8 -3
  21. data/lib/sass/selector.rb +21 -0
  22. data/lib/sass/selector/abstract_sequence.rb +7 -0
  23. data/lib/sass/tree/media_node.rb +4 -4
  24. data/lib/sass/tree/rule_node.rb +5 -0
  25. data/lib/sass/tree/visitors/check_nesting.rb +10 -10
  26. data/lib/sass/tree/visitors/convert.rb +3 -3
  27. data/lib/sass/tree/visitors/cssize.rb +5 -1
  28. data/lib/sass/tree/visitors/perform.rb +16 -2
  29. data/lib/sass/tree/visitors/to_css.rb +2 -1
  30. data/lib/sass/util.rb +4 -1
  31. data/test/sass/conversion_test.rb +32 -2
  32. data/test/sass/engine_test.rb +105 -1
  33. data/test/sass/extend_test.rb +65 -0
  34. data/test/sass/importer_test.rb +7 -0
  35. data/test/sass/plugin_test.rb +16 -13
  36. data/test/sass/script_conversion_test.rb +2 -0
  37. data/test/sass/script_test.rb +18 -0
  38. data/test/sass/scss/scss_test.rb +34 -0
  39. data/test/sass/test_helper.rb +1 -1
  40. data/test/test_helper.rb +1 -0
  41. metadata +3 -3
@@ -1339,6 +1339,71 @@ CSS
1339
1339
  SCSS
1340
1340
  end
1341
1341
 
1342
+ def test_basic_placeholder_selector
1343
+ assert_equal <<CSS, render(<<SCSS)
1344
+ .bar {
1345
+ color: blue; }
1346
+ CSS
1347
+ %foo {color: blue}
1348
+ .bar {@extend %foo}
1349
+ SCSS
1350
+ end
1351
+
1352
+ def test_unused_placeholder_selector
1353
+ assert_equal <<CSS, render(<<SCSS)
1354
+ .baz {
1355
+ color: blue; }
1356
+ CSS
1357
+ %foo {color: blue}
1358
+ %bar {color: red}
1359
+ .baz {@extend %foo}
1360
+ SCSS
1361
+ end
1362
+
1363
+ def test_placeholder_descendant_selector
1364
+ assert_equal <<CSS, render(<<SCSS)
1365
+ #context .bar a {
1366
+ color: blue; }
1367
+ CSS
1368
+ #context %foo a {color: blue}
1369
+ .bar {@extend %foo}
1370
+ SCSS
1371
+ end
1372
+
1373
+ def test_placeholder_selector_with_multiple_extenders
1374
+ assert_equal <<CSS, render(<<SCSS)
1375
+ .bar, .baz {
1376
+ color: blue; }
1377
+ CSS
1378
+ %foo {color: blue}
1379
+ .bar {@extend %foo}
1380
+ .baz {@extend %foo}
1381
+ SCSS
1382
+ end
1383
+
1384
+ def test_placeholder_selector_as_modifier
1385
+ assert_equal <<CSS, render(<<SCSS)
1386
+ a.baz.bar {
1387
+ color: blue; }
1388
+ CSS
1389
+ a%foo.baz {color: blue}
1390
+ .bar {@extend %foo}
1391
+ div {@extend %foo}
1392
+ SCSS
1393
+ end
1394
+
1395
+ def test_placeholder_interpolation
1396
+ assert_equal <<CSS, render(<<SCSS)
1397
+ .bar {
1398
+ color: blue; }
1399
+ CSS
1400
+ $foo: foo;
1401
+
1402
+ %\#{$foo} {color: blue}
1403
+ .bar {@extend %foo}
1404
+ SCSS
1405
+ end
1406
+
1342
1407
  private
1343
1408
 
1344
1409
  def render(sass, options = {})
@@ -176,10 +176,17 @@ CSS
176
176
  file_system_importer
177
177
  )
178
178
  end
179
+
179
180
  def fixture_dir
180
181
  File.join(File.dirname(__FILE__), "fixtures")
181
182
  end
183
+
182
184
  def fixture_file(path)
183
185
  File.join(fixture_dir, path)
184
186
  end
187
+
188
+ def test_absolute_files_across_template_locations
189
+ importer = Sass::Importers::Filesystem.new(absolutize 'templates')
190
+ assert_not_nil importer.mtime(absolutize('more_templates/more1.sass'), {})
191
+ end
185
192
  end
@@ -183,6 +183,7 @@ CSS
183
183
 
184
184
  def test_updating_stylesheets_callback
185
185
  # Should run even when there's nothing to update
186
+ Sass::Plugin.options[:template_location] = nil
186
187
  assert_callback :updating_stylesheets, []
187
188
  end
188
189
 
@@ -196,25 +197,25 @@ CSS
196
197
  assert_no_callback :updating_stylesheets
197
198
  end
198
199
 
199
- def test_updating_stylesheet_callback_for_updated_template
200
+ def test_updated_stylesheet_callback_for_updated_template
200
201
  Sass::Plugin.options[:always_update] = false
201
202
  touch 'basic'
202
- assert_no_callback :updating_stylesheet, template_loc("complex"), tempfile_loc("complex") do
203
+ assert_no_callback :updated_stylesheet, template_loc("complex"), tempfile_loc("complex") do
203
204
  assert_callbacks(
204
- [:updating_stylesheet, template_loc("basic"), tempfile_loc("basic")],
205
- [:updating_stylesheet, template_loc("import"), tempfile_loc("import")])
205
+ [:updated_stylesheet, template_loc("basic"), tempfile_loc("basic")],
206
+ [:updated_stylesheet, template_loc("import"), tempfile_loc("import")])
206
207
  end
207
208
  end
208
209
 
209
- def test_updating_stylesheet_callback_for_fresh_template
210
+ def test_updated_stylesheet_callback_for_fresh_template
210
211
  Sass::Plugin.options[:always_update] = false
211
- assert_no_callback :updating_stylesheet
212
+ assert_no_callback :updated_stylesheet
212
213
  end
213
214
 
214
- def test_updating_stylesheet_callback_for_error_template
215
+ def test_updated_stylesheet_callback_for_error_template
215
216
  Sass::Plugin.options[:always_update] = false
216
217
  touch 'bork1'
217
- assert_no_callback :updating_stylesheet
218
+ assert_no_callback :updated_stylesheet
218
219
  end
219
220
 
220
221
  def test_not_updating_stylesheet_callback_for_fresh_template
@@ -226,8 +227,8 @@ CSS
226
227
  Sass::Plugin.options[:always_update] = false
227
228
  assert_callback :not_updating_stylesheet, template_loc("complex"), tempfile_loc("complex") do
228
229
  assert_no_callbacks(
229
- [:updating_stylesheet, template_loc("basic"), tempfile_loc("basic")],
230
- [:updating_stylesheet, template_loc("import"), tempfile_loc("import")])
230
+ [:updated_stylesheet, template_loc("basic"), tempfile_loc("basic")],
231
+ [:updated_stylesheet, template_loc("import"), tempfile_loc("import")])
231
232
  end
232
233
  end
233
234
 
@@ -347,9 +348,11 @@ CSS
347
348
 
348
349
  def assert_callback(name, *expected_args)
349
350
  run = false
351
+ received_args = nil
350
352
  Sass::Plugin.send("on_#{name}") do |*args|
351
- run ||= expected_args.zip(args).all? do |ea, a|
352
- ea.respond_to?(:call) ? ea.call(a) : ea == a
353
+ received_args = args
354
+ run ||= expected_args.zip(received_args).all? do |ea, ra|
355
+ ea.respond_to?(:call) ? ea.call(ra) : ea == ra
353
356
  end
354
357
  end
355
358
 
@@ -359,7 +362,7 @@ CSS
359
362
  check_for_updates!
360
363
  end
361
364
 
362
- assert run, "Expected #{name} callback to be run with arguments:\n #{expected_args.inspect}"
365
+ assert run, "Expected #{name} callback to be run with arguments:\n #{expected_args.inspect}\nHowever, it got:\n #{received_args.inspect}"
363
366
  end
364
367
 
365
368
  def assert_no_callback(name, *unexpected_args)
@@ -223,6 +223,8 @@ RUBY
223
223
  assert_renders '#{1 + 2}, #{3 + 4}'
224
224
  assert_renders '#{1 + 2} ,#{3 + 4}'
225
225
  assert_renders '#{1 + 2},#{3 + 4}'
226
+ assert_renders '#{1 + 2}, #{3 + 4}, #{5 + 6}'
227
+ assert_renders '3, #{3 + 4}, 11'
226
228
 
227
229
  assert_renders '3 / #{3 + 4}'
228
230
  assert_renders '3 /#{3 + 4}'
@@ -7,6 +7,14 @@ module Sass::Script::Functions::UserFunctions
7
7
  val.options[:foo]
8
8
  Sass::Script::String.new("Options defined!")
9
9
  end
10
+
11
+ def arg_error
12
+ assert_options
13
+ end
14
+ end
15
+
16
+ module Sass::Script::Functions
17
+ include Sass::Script::Functions::UserFunctions
10
18
  end
11
19
 
12
20
  class SassScriptTest < Test::Unit::TestCase
@@ -130,6 +138,8 @@ class SassScriptTest < Test::Unit::TestCase
130
138
  assert_equal '3, 7', resolve('#{1 + 2}, #{3 + 4}')
131
139
  assert_equal '3 ,7', resolve('#{1 + 2} ,#{3 + 4}')
132
140
  assert_equal '3,7', resolve('#{1 + 2},#{3 + 4}')
141
+ assert_equal '3, 7, 11', resolve('#{1 + 2}, #{3 + 4}, #{5 + 6}')
142
+ assert_equal '3, 7, 11', resolve('3, #{3 + 4}, 11')
133
143
 
134
144
  assert_equal '3 / 7', resolve('3 / #{3 + 4}')
135
145
  assert_equal '3 /7', resolve('3 /#{3 + 4}')
@@ -414,6 +424,14 @@ SASS
414
424
  assert_raise_message(Sass::SyntaxError, "() isn't a valid CSS value.") {resolve("nth(append((), ()), 1)")}
415
425
  end
416
426
 
427
+ def test_deep_argument_error_not_unwrapped
428
+ assert_raise_message(ArgumentError, 'wrong number of arguments (0 for 1)') {resolve("arg-error()")}
429
+ end
430
+
431
+ def test_shallow_argument_error_unwrapped
432
+ assert_raise_message(Sass::SyntaxError, "wrong number of arguments (1 for 0) for `arg-error'") {resolve("arg-error(1)")}
433
+ end
434
+
417
435
  # Regression Tests
418
436
 
419
437
  def test_funcall_has_higher_precedence_than_color_name
@@ -1094,6 +1094,15 @@ SCSS
1094
1094
 
1095
1095
  # Regression
1096
1096
 
1097
+ def test_prop_name_interpolation_after_hyphen
1098
+ assert_equal <<CSS, render(<<SCSS)
1099
+ a {
1100
+ -foo-bar: b; }
1101
+ CSS
1102
+ a { -\#{"foo"}-bar: b; }
1103
+ SCSS
1104
+ end
1105
+
1097
1106
  def test_star_plus_and_parent
1098
1107
  assert_equal <<CSS, render(<<SCSS)
1099
1108
  * + html foo {
@@ -1296,4 +1305,29 @@ CSS
1296
1305
  foo {color: darken(black, 10%)}
1297
1306
  SCSS
1298
1307
  end
1308
+
1309
+ # ref: https://github.com/nex3/sass/issues/104
1310
+ def test_no_buffer_overflow
1311
+ template = render <<SCSS
1312
+ .aaa {
1313
+ background-color: white;
1314
+ }
1315
+ .aaa .aaa .aaa {
1316
+ background-color: black;
1317
+ }
1318
+ .bbb {
1319
+ @extend .aaa;
1320
+ }
1321
+ .xxx {
1322
+ @extend .bbb;
1323
+ }
1324
+ .yyy {
1325
+ @extend .bbb;
1326
+ }
1327
+ .zzz {
1328
+ @extend .bbb;
1329
+ }
1330
+ SCSS
1331
+ Sass::SCSS::Parser.new(template, "test.scss").parse
1332
+ end
1299
1333
  end
@@ -3,6 +3,6 @@ $:.unshift test_dir unless $:.include?(test_dir)
3
3
 
4
4
  class Test::Unit::TestCase
5
5
  def absolutize(file)
6
- "#{File.dirname(__FILE__)}/#{file}"
6
+ File.expand_path("#{File.dirname(__FILE__)}/#{file}")
7
7
  end
8
8
  end
@@ -4,6 +4,7 @@ require 'test/unit'
4
4
  require 'fileutils'
5
5
  $:.unshift lib_dir unless $:.include?(lib_dir)
6
6
  require 'sass'
7
+ require 'mathn' if ENV['MATHN'] == 'true'
7
8
 
8
9
  Sass::RAILS_LOADED = true unless defined?(Sass::RAILS_LOADED)
9
10
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sass
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0.alpha.35
4
+ version: 3.2.0.alpha.49
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Weizenbaum
@@ -11,7 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2011-10-06 00:00:00 -04:00
14
+ date: 2012-01-04 00:00:00 -05:00
15
15
  default_executable:
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
@@ -130,6 +130,7 @@ files:
130
130
  - lib/sass/tree/root_node.rb
131
131
  - lib/sass/tree/rule_node.rb
132
132
  - lib/sass/tree/content_node.rb
133
+ - lib/sass/tree/trace_node.rb
133
134
  - lib/sass/tree/variable_node.rb
134
135
  - lib/sass/tree/visitors/base.rb
135
136
  - lib/sass/tree/visitors/check_nesting.rb
@@ -141,7 +142,6 @@ files:
141
142
  - lib/sass/tree/visitors/to_css.rb
142
143
  - lib/sass/tree/warn_node.rb
143
144
  - lib/sass/tree/while_node.rb
144
- - lib/sass/tree/trace_node.rb
145
145
  - lib/sass/util.rb
146
146
  - lib/sass/util/subset_map.rb
147
147
  - lib/sass/version.rb