haml 3.1.3 → 3.1.4
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of haml might be problematic. Click here for more details.
- data/Rakefile +42 -17
- data/VERSION +1 -1
- data/lib/haml/compiler.rb +3 -3
- data/lib/haml/helpers/action_view_mods.rb +4 -3
- data/lib/haml/template.rb +3 -1
- data/test/gemfiles/Gemfile.rails-2.0.x +8 -0
- data/test/gemfiles/Gemfile.rails-2.0.x.lock +38 -0
- data/test/gemfiles/Gemfile.rails-2.1.x +8 -0
- data/test/gemfiles/Gemfile.rails-2.1.x.lock +38 -0
- data/test/gemfiles/Gemfile.rails-2.2.x +8 -0
- data/test/gemfiles/Gemfile.rails-2.2.x.lock +38 -0
- data/test/gemfiles/Gemfile.rails-2.3.x +8 -0
- data/test/gemfiles/Gemfile.rails-2.3.x.lock +40 -0
- data/test/gemfiles/Gemfile.rails-3.0.x +8 -0
- data/test/gemfiles/Gemfile.rails-3.0.x.lock +85 -0
- data/test/gemfiles/Gemfile.rails-3.1.x +8 -0
- data/test/gemfiles/Gemfile.rails-3.1.x.lock +98 -0
- data/test/gemfiles/Gemfile.rails-xss-2.3.x +9 -0
- data/test/gemfiles/Gemfile.rails-xss-2.3.x.lock +42 -0
- data/test/haml/engine_test.rb +19 -0
- data/test/haml/html2haml_test.rb +1 -1
- data/test/haml/template_test.rb +20 -2
- data/test/haml/templates/partial_layout.haml +4 -1
- data/test/linked_rails.rb +4 -4
- data/vendor/sass/VERSION +1 -1
- data/vendor/sass/doc-src/SASS_CHANGELOG.md +115 -2
- data/vendor/sass/doc-src/SASS_REFERENCE.md +12 -4
- data/vendor/sass/lib/sass.rb +1 -0
- data/vendor/sass/lib/sass/cache_stores/base.rb +3 -1
- data/vendor/sass/lib/sass/cache_stores/filesystem.rb +2 -0
- data/vendor/sass/lib/sass/css.rb +2 -1
- data/vendor/sass/lib/sass/engine.rb +39 -23
- data/vendor/sass/lib/sass/environment.rb +11 -0
- data/vendor/sass/lib/sass/exec.rb +14 -1
- data/vendor/sass/lib/sass/importers/base.rb +2 -1
- data/vendor/sass/lib/sass/importers/filesystem.rb +18 -13
- data/vendor/sass/lib/sass/less.rb +2 -2
- data/vendor/sass/lib/sass/logger.rb +15 -0
- data/vendor/sass/lib/sass/logger/base.rb +32 -0
- data/vendor/sass/lib/sass/logger/log_level.rb +49 -0
- data/vendor/sass/lib/sass/plugin.rb +4 -8
- data/vendor/sass/lib/sass/plugin/compiler.rb +42 -17
- data/vendor/sass/lib/sass/plugin/configuration.rb +0 -2
- data/vendor/sass/lib/sass/railtie.rb +1 -1
- data/vendor/sass/lib/sass/script/funcall.rb +14 -1
- data/vendor/sass/lib/sass/script/functions.rb +44 -1
- data/vendor/sass/lib/sass/script/interpolation.rb +9 -0
- data/vendor/sass/lib/sass/script/lexer.rb +6 -1
- data/vendor/sass/lib/sass/script/list.rb +7 -0
- data/vendor/sass/lib/sass/script/literal.rb +5 -0
- data/vendor/sass/lib/sass/script/node.rb +8 -0
- data/vendor/sass/lib/sass/script/number.rb +28 -5
- data/vendor/sass/lib/sass/script/operation.rb +8 -0
- data/vendor/sass/lib/sass/script/parser.rb +12 -5
- data/vendor/sass/lib/sass/script/string_interpolation.rb +9 -0
- data/vendor/sass/lib/sass/script/unary_operation.rb +7 -0
- data/vendor/sass/lib/sass/script/variable.rb +5 -0
- data/vendor/sass/lib/sass/scss/parser.rb +78 -38
- data/vendor/sass/lib/sass/scss/rx.rb +2 -1
- data/vendor/sass/lib/sass/scss/static_parser.rb +2 -2
- data/vendor/sass/lib/sass/shared.rb +1 -1
- data/vendor/sass/lib/sass/tree/comment_node.rb +24 -11
- data/vendor/sass/lib/sass/tree/debug_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/each_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/extend_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/for_node.rb +2 -2
- data/vendor/sass/lib/sass/tree/function_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/if_node.rb +1 -14
- data/vendor/sass/lib/sass/tree/mixin_def_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/mixin_node.rb +2 -2
- data/vendor/sass/lib/sass/tree/node.rb +2 -5
- data/vendor/sass/lib/sass/tree/prop_node.rb +2 -9
- data/vendor/sass/lib/sass/tree/return_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/rule_node.rb +9 -2
- data/vendor/sass/lib/sass/tree/variable_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/visitors/check_nesting.rb +17 -18
- data/vendor/sass/lib/sass/tree/visitors/convert.rb +10 -5
- data/vendor/sass/lib/sass/tree/visitors/deep_copy.rb +87 -0
- data/vendor/sass/lib/sass/tree/visitors/perform.rb +50 -19
- data/vendor/sass/lib/sass/tree/visitors/set_options.rb +97 -0
- data/vendor/sass/lib/sass/tree/visitors/to_css.rb +9 -15
- data/vendor/sass/lib/sass/tree/warn_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/while_node.rb +1 -1
- data/vendor/sass/lib/sass/util.rb +58 -6
- data/vendor/sass/sass.gemspec +2 -1
- data/vendor/sass/test/Gemfile +4 -0
- data/vendor/sass/test/Gemfile.lock +19 -0
- data/vendor/sass/test/sass/cache_test.rb +15 -0
- data/vendor/sass/test/sass/conversion_test.rb +2 -6
- data/vendor/sass/test/sass/css2sass_test.rb +9 -0
- data/vendor/sass/test/sass/engine_test.rb +124 -26
- data/vendor/sass/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
- data/vendor/sass/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
- data/vendor/sass/test/sass/functions_test.rb +13 -0
- data/vendor/sass/test/sass/importer_test.rb +110 -0
- data/vendor/sass/test/sass/logger_test.rb +58 -0
- data/vendor/sass/test/sass/plugin_test.rb +16 -13
- data/vendor/sass/test/sass/script_conversion_test.rb +2 -0
- data/vendor/sass/test/sass/script_test.rb +18 -0
- data/vendor/sass/test/sass/scss/css_test.rb +7 -1
- data/vendor/sass/test/sass/scss/scss_test.rb +37 -13
- data/vendor/sass/test/sass/templates/bork5.sass +3 -0
- data/vendor/sass/test/sass/templates/nested_bork5.sass +2 -0
- data/vendor/sass/test/sass/test_helper.rb +1 -1
- data/vendor/sass/test/sass/util_test.rb +12 -0
- data/vendor/sass/vendor/fssm/Gemfile +3 -0
- data/vendor/sass/vendor/fssm/LICENSE +1 -1
- data/vendor/sass/vendor/fssm/README.markdown +55 -27
- data/vendor/sass/vendor/fssm/Rakefile +6 -54
- data/vendor/sass/vendor/fssm/example.rb +6 -3
- data/vendor/sass/vendor/fssm/fssm.gemspec +17 -70
- data/vendor/sass/vendor/fssm/lib/fssm.rb +7 -3
- data/vendor/sass/vendor/fssm/lib/fssm/backends/fsevents.rb +1 -1
- data/vendor/sass/vendor/fssm/lib/fssm/backends/inotify.rb +2 -2
- data/vendor/sass/vendor/fssm/lib/fssm/backends/polling.rb +2 -2
- data/vendor/sass/vendor/fssm/lib/fssm/backends/rbfsevent.rb +42 -0
- data/vendor/sass/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +10 -10
- data/vendor/sass/vendor/fssm/lib/fssm/monitor.rb +19 -9
- data/vendor/sass/vendor/fssm/lib/fssm/path.rb +24 -21
- data/vendor/sass/vendor/fssm/lib/fssm/pathname.rb +13 -479
- data/vendor/sass/vendor/fssm/lib/fssm/state/directory.rb +29 -11
- data/vendor/sass/vendor/fssm/lib/fssm/state/file.rb +1 -1
- data/vendor/sass/vendor/fssm/lib/fssm/support.rb +41 -12
- data/vendor/sass/vendor/fssm/lib/fssm/tree.rb +6 -6
- data/vendor/sass/vendor/fssm/lib/fssm/version.rb +3 -0
- data/vendor/sass/vendor/fssm/profile/prof-cache.rb +3 -3
- data/vendor/sass/vendor/fssm/profile/prof-pathname-rubinius.rb +35 -0
- data/vendor/sass/vendor/fssm/profile/prof-pathname.rb +7 -7
- data/vendor/sass/vendor/fssm/spec/count_down_latch.rb +151 -0
- data/vendor/sass/vendor/fssm/spec/monitor_spec.rb +202 -0
- data/vendor/sass/vendor/fssm/spec/path_spec.rb +36 -15
- data/vendor/sass/vendor/fssm/spec/spec_helper.rb +6 -6
- metadata +36 -5
- data/vendor/sass/vendor/fssm/VERSION.yml +0 -5
@@ -0,0 +1 @@
|
|
1
|
+
.pear { color: green; }
|
@@ -0,0 +1 @@
|
|
1
|
+
@import "apple";
|
@@ -965,6 +965,19 @@ MSG
|
|
965
965
|
assert_error_message("Separator name must be space, comma, or auto for `append'", "append(1, 2, baboon)")
|
966
966
|
end
|
967
967
|
|
968
|
+
def test_zip
|
969
|
+
assert_equal("1 3 5, 2 4 6", evaluate("zip(1 2, 3 4, 5 6)"))
|
970
|
+
assert_equal("1 4 7, 2 5 8", evaluate("zip(1 2 3, 4 5 6, 7 8)"))
|
971
|
+
end
|
972
|
+
|
973
|
+
def test_index
|
974
|
+
assert_equal("1", evaluate("index(1px solid blue, 1px)"))
|
975
|
+
assert_equal("2", evaluate("index(1px solid blue, solid)"))
|
976
|
+
assert_equal("3", evaluate("index(1px solid blue, #00f)"))
|
977
|
+
assert_equal("false", evaluate("index(1px solid blue, 1em)"))
|
978
|
+
assert_equal("false", evaluate("index(1px solid blue, notfound)"))
|
979
|
+
end
|
980
|
+
|
968
981
|
def test_if
|
969
982
|
assert_equal("1px", evaluate("if(true, 1px, 2px)"))
|
970
983
|
assert_equal("2px", evaluate("if(false, 1px, 2px)"))
|
@@ -2,6 +2,8 @@
|
|
2
2
|
require File.dirname(__FILE__) + '/../test_helper'
|
3
3
|
require File.dirname(__FILE__) + '/test_helper'
|
4
4
|
|
5
|
+
require 'sass/plugin'
|
6
|
+
|
5
7
|
class ImporterTest < Test::Unit::TestCase
|
6
8
|
|
7
9
|
class FruitImporter < Sass::Importers::Base
|
@@ -38,6 +40,72 @@ class ImporterTest < Test::Unit::TestCase
|
|
38
40
|
end
|
39
41
|
end
|
40
42
|
|
43
|
+
# This importer maps one import to another import
|
44
|
+
# based on the mappings passed to importer's constructor.
|
45
|
+
class IndirectImporter < Sass::Importers::Base
|
46
|
+
def initialize(mappings, mtimes)
|
47
|
+
@mappings = mappings
|
48
|
+
@mtimes = mtimes
|
49
|
+
end
|
50
|
+
def find_relative(uri, base, options)
|
51
|
+
nil
|
52
|
+
end
|
53
|
+
def find(name, options)
|
54
|
+
if @mappings.has_key?(name)
|
55
|
+
Sass::Engine.new(
|
56
|
+
%Q[@import "#{@mappings[name]}";],
|
57
|
+
options.merge(
|
58
|
+
:filename => name,
|
59
|
+
:syntax => :scss,
|
60
|
+
:importer => self
|
61
|
+
)
|
62
|
+
)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
def mtime(uri, options)
|
66
|
+
@mtimes.fetch(uri, @mtimes.has_key?(uri) ? Time.now : nil)
|
67
|
+
end
|
68
|
+
def key(uri, options)
|
69
|
+
[self.class.name, uri]
|
70
|
+
end
|
71
|
+
def to_s
|
72
|
+
"IndirectImporter(#{@mappings.keys.join(", ")})"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# This importer maps the import to single class
|
77
|
+
# based on the mappings passed to importer's constructor.
|
78
|
+
class ClassImporter < Sass::Importers::Base
|
79
|
+
def initialize(mappings, mtimes)
|
80
|
+
@mappings = mappings
|
81
|
+
@mtimes = mtimes
|
82
|
+
end
|
83
|
+
def find_relative(uri, base, options)
|
84
|
+
nil
|
85
|
+
end
|
86
|
+
def find(name, options)
|
87
|
+
if @mappings.has_key?(name)
|
88
|
+
Sass::Engine.new(
|
89
|
+
%Q[.#{name}{#{@mappings[name]}}],
|
90
|
+
options.merge(
|
91
|
+
:filename => name,
|
92
|
+
:syntax => :scss,
|
93
|
+
:importer => self
|
94
|
+
)
|
95
|
+
)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
def mtime(uri, options)
|
99
|
+
@mtimes.fetch(uri, @mtimes.has_key?(uri) ? Time.now : nil)
|
100
|
+
end
|
101
|
+
def key(uri, options)
|
102
|
+
[self.class.name, uri]
|
103
|
+
end
|
104
|
+
def to_s
|
105
|
+
"ClassImporter(#{@mappings.keys.join(", ")})"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
41
109
|
def test_can_resolve_generated_imports
|
42
110
|
scss_file = %Q{
|
43
111
|
$pear-color: green;
|
@@ -79,4 +147,46 @@ CSS
|
|
79
147
|
ensure
|
80
148
|
FileUtils.rm_rf(absolutize("tmp"))
|
81
149
|
end
|
150
|
+
|
151
|
+
def test_staleness_check_across_importers
|
152
|
+
file_system_importer = Sass::Importers::Filesystem.new(fixture_dir)
|
153
|
+
# Make sure the first import is older
|
154
|
+
indirect_importer = IndirectImporter.new({"apple" => "pear"}, {"apple" => Time.now - 1})
|
155
|
+
# Make css file is newer so the dependencies are the only way for the css file to be out of date.
|
156
|
+
FileUtils.touch(fixture_file("test_staleness_check_across_importers.css"))
|
157
|
+
# Make sure the first import is older
|
158
|
+
class_importer = ClassImporter.new({"pear" => %Q{color: green;}}, {"pear" => Time.now + 1})
|
159
|
+
|
160
|
+
options = {
|
161
|
+
:style => :compact,
|
162
|
+
:filename => fixture_file("test_staleness_check_across_importers.scss"),
|
163
|
+
:importer => file_system_importer,
|
164
|
+
:load_paths => [file_system_importer, indirect_importer, class_importer],
|
165
|
+
:syntax => :scss
|
166
|
+
}
|
167
|
+
|
168
|
+
assert_equal File.read(fixture_file("test_staleness_check_across_importers.css")),
|
169
|
+
Sass::Engine.new(File.read(fixture_file("test_staleness_check_across_importers.scss")), options).render
|
170
|
+
|
171
|
+
checker = Sass::Plugin::StalenessChecker.new(options)
|
172
|
+
|
173
|
+
assert checker.stylesheet_needs_update?(
|
174
|
+
fixture_file("test_staleness_check_across_importers.css"),
|
175
|
+
fixture_file("test_staleness_check_across_importers.scss"),
|
176
|
+
file_system_importer
|
177
|
+
)
|
178
|
+
end
|
179
|
+
|
180
|
+
def fixture_dir
|
181
|
+
File.join(File.dirname(__FILE__), "fixtures")
|
182
|
+
end
|
183
|
+
|
184
|
+
def fixture_file(path)
|
185
|
+
File.join(fixture_dir, path)
|
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
|
82
192
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
class LoggerTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
class InterceptedLogger < Sass::Logger::Base
|
8
|
+
|
9
|
+
attr_accessor :messages
|
10
|
+
|
11
|
+
def initialize(*args)
|
12
|
+
super
|
13
|
+
self.messages = []
|
14
|
+
end
|
15
|
+
|
16
|
+
def reset!
|
17
|
+
self.messages = []
|
18
|
+
end
|
19
|
+
|
20
|
+
def _log(*args)
|
21
|
+
messages << [args]
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_global_sass_logger_instance_exists
|
27
|
+
assert Sass.logger.respond_to?(:warn)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_log_level_orders
|
31
|
+
logged_levels = {
|
32
|
+
:trace => [ [], [:trace, :debug, :info, :warn, :error]],
|
33
|
+
:debug => [ [:trace], [:debug, :info, :warn, :error]],
|
34
|
+
:info => [ [:trace, :debug], [:info, :warn, :error]],
|
35
|
+
:warn => [ [:trace, :debug, :info], [:warn, :error]],
|
36
|
+
:error => [ [:trace, :debug, :info, :warn], [:error]]
|
37
|
+
}
|
38
|
+
logged_levels.each do |level, (should_not_be_logged, should_be_logged)|
|
39
|
+
logger = Sass::Logger::Base.new(level)
|
40
|
+
should_not_be_logged.each do |should_level|
|
41
|
+
assert !logger.logging_level?(should_level)
|
42
|
+
end
|
43
|
+
should_be_logged.each do |should_level|
|
44
|
+
assert logger.logging_level?(should_level)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_logging_can_be_disabled
|
50
|
+
logger = InterceptedLogger.new
|
51
|
+
logger.error("message #1")
|
52
|
+
assert_equal 1, logger.messages.size
|
53
|
+
logger.reset!
|
54
|
+
logger.disabled = true
|
55
|
+
logger.error("message #2")
|
56
|
+
assert_equal 0, logger.messages.size
|
57
|
+
end
|
58
|
+
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
|
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 :
|
203
|
+
assert_no_callback :updated_stylesheet, template_loc("complex"), tempfile_loc("complex") do
|
203
204
|
assert_callbacks(
|
204
|
-
[:
|
205
|
-
[:
|
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
|
210
|
+
def test_updated_stylesheet_callback_for_fresh_template
|
210
211
|
Sass::Plugin.options[:always_update] = false
|
211
|
-
assert_no_callback :
|
212
|
+
assert_no_callback :updated_stylesheet
|
212
213
|
end
|
213
214
|
|
214
|
-
def
|
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 :
|
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
|
-
[:
|
230
|
-
[:
|
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
|
-
|
352
|
-
|
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
|
@@ -800,6 +800,12 @@ SCSS
|
|
800
800
|
assert_selector_parses('E*:hover')
|
801
801
|
end
|
802
802
|
|
803
|
+
def test_spaceless_combo_selectors
|
804
|
+
assert_equal "E > F {\n a: b; }\n", render("E>F { a: b;} ")
|
805
|
+
assert_equal "E ~ F {\n a: b; }\n", render("E~F { a: b;} ")
|
806
|
+
assert_equal "E + F {\n a: b; }\n", render("E+F { a: b;} ")
|
807
|
+
end
|
808
|
+
|
803
809
|
## Errors
|
804
810
|
|
805
811
|
def test_invalid_directives
|
@@ -909,7 +915,7 @@ SCSS
|
|
909
915
|
end
|
910
916
|
|
911
917
|
def render(scss, options = {})
|
912
|
-
tree = Sass::SCSS::CssParser.new(scss).parse
|
918
|
+
tree = Sass::SCSS::CssParser.new(scss, options[:filename]).parse
|
913
919
|
tree.options = Sass::Engine::DEFAULT_OPTIONS.merge(options)
|
914
920
|
tree.render
|
915
921
|
end
|
@@ -118,11 +118,11 @@ SCSS
|
|
118
118
|
def test_warn_directive
|
119
119
|
expected_warning = <<EXPECTATION
|
120
120
|
WARNING: this is a warning
|
121
|
-
|
121
|
+
on line 2 of test_warn_directive_inline.scss
|
122
122
|
|
123
123
|
WARNING: this is a mixin
|
124
|
-
|
125
|
-
|
124
|
+
on line 1 of test_warn_directive_inline.scss, in `foo'
|
125
|
+
from line 3 of test_warn_directive_inline.scss
|
126
126
|
EXPECTATION
|
127
127
|
assert_warning expected_warning do
|
128
128
|
assert_equal <<CSS, render(<<SCSS)
|
@@ -892,7 +892,8 @@ SCSS
|
|
892
892
|
end
|
893
893
|
|
894
894
|
def test_uses_property_exception_with_star_hack
|
895
|
-
|
895
|
+
# Silence the "beginning of selector" warning
|
896
|
+
Sass::Util.silence_warnings {render <<SCSS}
|
896
897
|
foo {
|
897
898
|
*bar:baz [fail]; }
|
898
899
|
SCSS
|
@@ -1029,11 +1030,10 @@ SCSS
|
|
1029
1030
|
end
|
1030
1031
|
|
1031
1032
|
def test_parent_in_mid_selector_error
|
1032
|
-
assert_raise_message(Sass::SyntaxError, <<MESSAGE) {render <<SCSS}
|
1033
|
+
assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
|
1033
1034
|
Invalid CSS after ".foo": expected "{", was "&.bar"
|
1034
1035
|
|
1035
|
-
|
1036
|
-
since it could potentially be replaced by an element name.
|
1036
|
+
"&" may only be used at the beginning of a selector.
|
1037
1037
|
MESSAGE
|
1038
1038
|
flim {
|
1039
1039
|
.foo&.bar {a: b}
|
@@ -1042,11 +1042,10 @@ SCSS
|
|
1042
1042
|
end
|
1043
1043
|
|
1044
1044
|
def test_parent_in_mid_selector_error
|
1045
|
-
assert_raise_message(Sass::SyntaxError, <<MESSAGE) {render <<SCSS}
|
1045
|
+
assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
|
1046
1046
|
Invalid CSS after " .foo.bar": expected "{", was "& {a: b}"
|
1047
1047
|
|
1048
|
-
|
1049
|
-
since it could potentially be replaced by an element name.
|
1048
|
+
"&" may only be used at the beginning of a selector.
|
1050
1049
|
MESSAGE
|
1051
1050
|
flim {
|
1052
1051
|
.foo.bar& {a: b}
|
@@ -1055,11 +1054,10 @@ SCSS
|
|
1055
1054
|
end
|
1056
1055
|
|
1057
1056
|
def test_double_parent_selector_error
|
1058
|
-
assert_raise_message(Sass::SyntaxError, <<MESSAGE) {render <<SCSS}
|
1057
|
+
assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
|
1059
1058
|
Invalid CSS after " &": expected "{", was "& {a: b}"
|
1060
1059
|
|
1061
|
-
|
1062
|
-
since it could potentially be replaced by an element name.
|
1060
|
+
"&" may only be used at the beginning of a selector.
|
1063
1061
|
MESSAGE
|
1064
1062
|
flim {
|
1065
1063
|
&& {a: b}
|
@@ -1097,6 +1095,24 @@ SCSS
|
|
1097
1095
|
|
1098
1096
|
# Regression
|
1099
1097
|
|
1098
|
+
def test_prop_name_interpolation_after_hyphen
|
1099
|
+
assert_equal <<CSS, render(<<SCSS)
|
1100
|
+
a {
|
1101
|
+
-foo-bar: b; }
|
1102
|
+
CSS
|
1103
|
+
a { -\#{"foo"}-bar: b; }
|
1104
|
+
SCSS
|
1105
|
+
end
|
1106
|
+
|
1107
|
+
def test_star_plus_and_parent
|
1108
|
+
assert_equal <<CSS, render(<<SCSS)
|
1109
|
+
* + html foo {
|
1110
|
+
a: b; }
|
1111
|
+
CSS
|
1112
|
+
foo {*+html & {a: b}}
|
1113
|
+
SCSS
|
1114
|
+
end
|
1115
|
+
|
1100
1116
|
def test_weird_added_space
|
1101
1117
|
assert_equal <<CSS, render(<<SCSS)
|
1102
1118
|
foo {
|
@@ -1244,6 +1260,14 @@ foo {
|
|
1244
1260
|
a: $var1;
|
1245
1261
|
b: $var2;
|
1246
1262
|
c: $var3; }
|
1263
|
+
SCSS
|
1264
|
+
end
|
1265
|
+
|
1266
|
+
def test_options_passed_to_script
|
1267
|
+
assert_equal <<CSS, render(<<SCSS, :style => :compressed)
|
1268
|
+
foo{color:#000}
|
1269
|
+
CSS
|
1270
|
+
foo {color: darken(black, 10%)}
|
1247
1271
|
SCSS
|
1248
1272
|
end
|
1249
1273
|
end
|