sass 3.2.7 → 3.3.0.rc.1
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/MIT-LICENSE +2 -2
- data/README.md +14 -2
- data/Rakefile +25 -1
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/VERSION_NAME +1 -1
- data/lib/sass/cache_stores/base.rb +4 -2
- data/lib/sass/cache_stores/chain.rb +2 -1
- data/lib/sass/cache_stores/filesystem.rb +2 -6
- data/lib/sass/cache_stores/memory.rb +1 -1
- data/lib/sass/cache_stores/null.rb +2 -2
- data/lib/sass/callbacks.rb +1 -0
- data/lib/sass/css.rb +10 -10
- data/lib/sass/engine.rb +403 -150
- data/lib/sass/environment.rb +136 -57
- data/lib/sass/error.rb +7 -7
- data/lib/sass/exec.rb +123 -39
- data/lib/sass/features.rb +41 -0
- data/lib/sass/importers/base.rb +33 -2
- data/lib/sass/importers/deprecated_path.rb +45 -0
- data/lib/sass/importers/filesystem.rb +25 -14
- data/lib/sass/importers.rb +1 -0
- data/lib/sass/logger/base.rb +3 -3
- data/lib/sass/logger/log_level.rb +4 -6
- data/lib/sass/media.rb +19 -19
- data/lib/sass/plugin/compiler.rb +141 -101
- data/lib/sass/plugin/configuration.rb +18 -22
- data/lib/sass/plugin/merb.rb +1 -1
- data/lib/sass/plugin/staleness_checker.rb +24 -8
- data/lib/sass/plugin.rb +4 -2
- data/lib/sass/repl.rb +3 -3
- data/lib/sass/script/css_lexer.rb +9 -4
- data/lib/sass/script/css_parser.rb +6 -2
- data/lib/sass/script/functions.rb +1343 -590
- data/lib/sass/script/lexer.rb +84 -52
- data/lib/sass/script/parser.rb +217 -97
- data/lib/sass/script/tree/funcall.rb +290 -0
- data/lib/sass/script/{interpolation.rb → tree/interpolation.rb} +34 -13
- data/lib/sass/script/tree/list_literal.rb +80 -0
- data/lib/sass/script/tree/literal.rb +47 -0
- data/lib/sass/script/tree/map_literal.rb +64 -0
- data/lib/sass/script/{node.rb → tree/node.rb} +22 -12
- data/lib/sass/script/{operation.rb → tree/operation.rb} +17 -25
- data/lib/sass/script/tree/selector.rb +30 -0
- data/lib/sass/script/{string_interpolation.rb → tree/string_interpolation.rb} +5 -4
- data/lib/sass/script/{unary_operation.rb → tree/unary_operation.rb} +14 -9
- data/lib/sass/script/tree/variable.rb +57 -0
- data/lib/sass/script/tree.rb +16 -0
- data/lib/sass/script/{arg_list.rb → value/arg_list.rb} +4 -24
- data/lib/sass/script/value/base.rb +248 -0
- data/lib/sass/script/value/bool.rb +36 -0
- data/lib/sass/script/{color.rb → value/color.rb} +239 -195
- data/lib/sass/script/value/helpers.rb +155 -0
- data/lib/sass/script/value/list.rb +119 -0
- data/lib/sass/script/value/map.rb +70 -0
- data/lib/sass/script/value/null.rb +45 -0
- data/lib/sass/script/{number.rb → value/number.rb} +91 -65
- data/lib/sass/script/{string.rb → value/string.rb} +9 -11
- data/lib/sass/script/value.rb +11 -0
- data/lib/sass/script.rb +35 -8
- data/lib/sass/scss/css_parser.rb +2 -1
- data/lib/sass/scss/parser.rb +338 -170
- data/lib/sass/scss/rx.rb +5 -6
- data/lib/sass/scss/script_lexer.rb +1 -0
- data/lib/sass/scss/script_parser.rb +1 -0
- data/lib/sass/scss/static_parser.rb +23 -6
- data/lib/sass/selector/abstract_sequence.rb +2 -2
- data/lib/sass/selector/comma_sequence.rb +21 -16
- data/lib/sass/selector/sequence.rb +60 -34
- data/lib/sass/selector/simple.rb +11 -12
- data/lib/sass/selector/simple_sequence.rb +55 -33
- data/lib/sass/selector.rb +52 -48
- data/lib/sass/source/map.rb +211 -0
- data/lib/sass/source/position.rb +39 -0
- data/lib/sass/source/range.rb +41 -0
- data/lib/sass/stack.rb +120 -0
- data/lib/sass/supports.rb +12 -13
- data/lib/sass/tree/at_root_node.rb +82 -0
- data/lib/sass/tree/comment_node.rb +3 -3
- data/lib/sass/tree/css_import_node.rb +11 -11
- data/lib/sass/tree/debug_node.rb +2 -2
- data/lib/sass/tree/directive_node.rb +13 -2
- data/lib/sass/tree/each_node.rb +8 -8
- data/lib/sass/tree/extend_node.rb +13 -6
- data/lib/sass/tree/for_node.rb +4 -4
- data/lib/sass/tree/function_node.rb +5 -4
- data/lib/sass/tree/if_node.rb +1 -1
- data/lib/sass/tree/import_node.rb +4 -5
- data/lib/sass/tree/media_node.rb +4 -14
- data/lib/sass/tree/mixin_def_node.rb +4 -4
- data/lib/sass/tree/mixin_node.rb +21 -8
- data/lib/sass/tree/node.rb +29 -12
- data/lib/sass/tree/prop_node.rb +38 -18
- data/lib/sass/tree/return_node.rb +3 -2
- data/lib/sass/tree/root_node.rb +19 -3
- data/lib/sass/tree/rule_node.rb +25 -17
- data/lib/sass/tree/supports_node.rb +0 -13
- data/lib/sass/tree/trace_node.rb +2 -1
- data/lib/sass/tree/variable_node.rb +9 -3
- data/lib/sass/tree/visitors/base.rb +6 -6
- data/lib/sass/tree/visitors/check_nesting.rb +12 -9
- data/lib/sass/tree/visitors/convert.rb +63 -38
- data/lib/sass/tree/visitors/cssize.rb +63 -23
- data/lib/sass/tree/visitors/deep_copy.rb +6 -5
- data/lib/sass/tree/visitors/extend.rb +7 -7
- data/lib/sass/tree/visitors/perform.rb +256 -151
- data/lib/sass/tree/visitors/set_options.rb +6 -6
- data/lib/sass/tree/visitors/to_css.rb +231 -81
- data/lib/sass/tree/warn_node.rb +2 -2
- data/lib/sass/tree/while_node.rb +2 -2
- data/lib/sass/util/multibyte_string_scanner.rb +2 -0
- data/lib/sass/util/normalized_map.rb +65 -0
- data/lib/sass/util/ordered_hash.rb +188 -0
- data/lib/sass/util/subset_map.rb +3 -2
- data/lib/sass/util/test.rb +9 -0
- data/lib/sass/util.rb +220 -34
- data/lib/sass/version.rb +9 -9
- data/lib/sass.rb +14 -7
- data/test/sass/compiler_test.rb +213 -0
- data/test/sass/conversion_test.rb +235 -9
- data/test/sass/engine_test.rb +230 -60
- data/test/sass/exec_test.rb +86 -0
- data/test/sass/extend_test.rb +215 -147
- data/test/sass/functions_test.rb +584 -99
- data/test/sass/importer_test.rb +165 -17
- data/test/sass/plugin_test.rb +19 -13
- data/test/sass/script_conversion_test.rb +40 -0
- data/test/sass/script_test.rb +231 -21
- data/test/sass/scss/css_test.rb +14 -5
- data/test/sass/scss/scss_test.rb +1266 -66
- data/test/sass/source_map_test.rb +879 -0
- data/test/sass/templates/bork5.sass +3 -0
- data/test/sass/util/normalized_map_test.rb +30 -0
- data/test/sass/util_test.rb +90 -0
- data/test/sass/value_helpers_test.rb +181 -0
- data/test/test_helper.rb +7 -2
- metadata +316 -291
- data/lib/sass/script/bool.rb +0 -18
- data/lib/sass/script/funcall.rb +0 -231
- data/lib/sass/script/list.rb +0 -84
- data/lib/sass/script/literal.rb +0 -239
- data/lib/sass/script/null.rb +0 -34
- data/lib/sass/script/variable.rb +0 -58
- data/test/Gemfile +0 -3
- data/vendor/listen/CHANGELOG.md +0 -221
- data/vendor/listen/CONTRIBUTING.md +0 -38
- data/vendor/listen/Gemfile +0 -30
- data/vendor/listen/Guardfile +0 -8
- data/vendor/listen/LICENSE +0 -20
- data/vendor/listen/README.md +0 -315
- data/vendor/listen/Rakefile +0 -47
- data/vendor/listen/Vagrantfile +0 -96
- data/vendor/listen/lib/listen/adapter.rb +0 -214
- data/vendor/listen/lib/listen/adapters/bsd.rb +0 -112
- data/vendor/listen/lib/listen/adapters/darwin.rb +0 -85
- data/vendor/listen/lib/listen/adapters/linux.rb +0 -113
- data/vendor/listen/lib/listen/adapters/polling.rb +0 -67
- data/vendor/listen/lib/listen/adapters/windows.rb +0 -87
- data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
- data/vendor/listen/lib/listen/directory_record.rb +0 -371
- data/vendor/listen/lib/listen/listener.rb +0 -225
- data/vendor/listen/lib/listen/multi_listener.rb +0 -143
- data/vendor/listen/lib/listen/turnstile.rb +0 -28
- data/vendor/listen/lib/listen/version.rb +0 -3
- data/vendor/listen/lib/listen.rb +0 -40
- data/vendor/listen/listen.gemspec +0 -22
- data/vendor/listen/spec/listen/adapter_spec.rb +0 -183
- data/vendor/listen/spec/listen/adapters/bsd_spec.rb +0 -36
- data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -37
- data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -47
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +0 -68
- data/vendor/listen/spec/listen/adapters/windows_spec.rb +0 -30
- data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
- data/vendor/listen/spec/listen/directory_record_spec.rb +0 -1225
- data/vendor/listen/spec/listen/listener_spec.rb +0 -169
- data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
- data/vendor/listen/spec/listen/turnstile_spec.rb +0 -56
- data/vendor/listen/spec/listen_spec.rb +0 -73
- data/vendor/listen/spec/spec_helper.rb +0 -21
- data/vendor/listen/spec/support/adapter_helper.rb +0 -629
- data/vendor/listen/spec/support/directory_record_helper.rb +0 -55
- data/vendor/listen/spec/support/fixtures_helper.rb +0 -29
- data/vendor/listen/spec/support/listeners_helper.rb +0 -156
- data/vendor/listen/spec/support/platform_helper.rb +0 -15
data/lib/sass/version.rb
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
require 'date'
|
|
2
|
-
|
|
3
|
-
# This is necessary for loading Sass when Haml is required in Rails 3.
|
|
4
|
-
# Once the split is complete, we can remove it.
|
|
5
|
-
require File.dirname(__FILE__) + '/../sass'
|
|
6
2
|
require 'sass/util'
|
|
7
3
|
|
|
8
4
|
module Sass
|
|
@@ -18,7 +14,8 @@ module Sass
|
|
|
18
14
|
# The `:name` key has the name of the version.
|
|
19
15
|
# The `:string` key contains a human-readable string representation of the version.
|
|
20
16
|
# The `:number` key is the major, minor, and teeny keys separated by periods.
|
|
21
|
-
# The `:date` key, which is not guaranteed to be defined, is the
|
|
17
|
+
# The `:date` key, which is not guaranteed to be defined, is the `DateTime`
|
|
18
|
+
# at which this release was cut.
|
|
22
19
|
# If Sass is checked out from Git, the `:rev` key will have the revision hash.
|
|
23
20
|
# For example:
|
|
24
21
|
#
|
|
@@ -47,6 +44,8 @@ module Sass
|
|
|
47
44
|
# }
|
|
48
45
|
#
|
|
49
46
|
# @return [{Symbol => String/Fixnum}] The version hash
|
|
47
|
+
# @comment
|
|
48
|
+
# rubocop:disable ClassVars
|
|
50
49
|
def version
|
|
51
50
|
return @@version if defined?(@@version)
|
|
52
51
|
|
|
@@ -60,7 +59,7 @@ module Sass
|
|
|
60
59
|
:name => name
|
|
61
60
|
}
|
|
62
61
|
|
|
63
|
-
if date = version_date
|
|
62
|
+
if (date = version_date)
|
|
64
63
|
@@version[:date] = date
|
|
65
64
|
end
|
|
66
65
|
|
|
@@ -73,7 +72,7 @@ module Sass
|
|
|
73
72
|
@@version[:number] = numbers.join('.')
|
|
74
73
|
@@version[:string] = @@version[:number].dup
|
|
75
74
|
|
|
76
|
-
if rev = revision_number
|
|
75
|
+
if (rev = revision_number)
|
|
77
76
|
@@version[:rev] = rev
|
|
78
77
|
unless rev[0] == ?(
|
|
79
78
|
@@version[:string] << "." << rev[0...7]
|
|
@@ -83,6 +82,7 @@ module Sass
|
|
|
83
82
|
@@version[:string] << " (#{name})"
|
|
84
83
|
@@version
|
|
85
84
|
end
|
|
85
|
+
# rubocop:enable ClassVars
|
|
86
86
|
|
|
87
87
|
private
|
|
88
88
|
|
|
@@ -108,12 +108,12 @@ module Sass
|
|
|
108
108
|
return sha
|
|
109
109
|
end
|
|
110
110
|
end
|
|
111
|
-
|
|
111
|
+
nil
|
|
112
112
|
end
|
|
113
113
|
|
|
114
114
|
def version_date
|
|
115
115
|
return unless File.exists?(scope('VERSION_DATE'))
|
|
116
|
-
|
|
116
|
+
DateTime.parse(File.read(scope('VERSION_DATE')).strip)
|
|
117
117
|
end
|
|
118
118
|
end
|
|
119
119
|
|
data/lib/sass.rb
CHANGED
|
@@ -19,7 +19,7 @@ require 'sass/version'
|
|
|
19
19
|
module Sass
|
|
20
20
|
# The global load paths for Sass files. This is meant for plugins and
|
|
21
21
|
# libraries to register the paths to their Sass stylesheets to that they may
|
|
22
|
-
# be `@imported`. This load path is used by every instance of
|
|
22
|
+
# be `@imported`. This load path is used by every instance of {Sass::Engine}.
|
|
23
23
|
# They are lower-precedence than any load paths passed in via the
|
|
24
24
|
# {file:SASS_REFERENCE.md#load_paths-option `:load_paths` option}.
|
|
25
25
|
#
|
|
@@ -35,8 +35,11 @@ module Sass
|
|
|
35
35
|
# Sass.load_paths << File.dirname(__FILE__ + '/sass')
|
|
36
36
|
# @return [Array<String, Pathname, Sass::Importers::Base>]
|
|
37
37
|
def self.load_paths
|
|
38
|
-
@load_paths ||= ENV['SASS_PATH']
|
|
39
|
-
|
|
38
|
+
@load_paths ||= if ENV['SASS_PATH']
|
|
39
|
+
ENV['SASS_PATH'].split(Sass::Util.windows? ? ';' : ':')
|
|
40
|
+
else
|
|
41
|
+
[]
|
|
42
|
+
end
|
|
40
43
|
end
|
|
41
44
|
|
|
42
45
|
# Compile a Sass or SCSS string to CSS.
|
|
@@ -56,9 +59,6 @@ module Sass
|
|
|
56
59
|
|
|
57
60
|
# Compile a file on disk to CSS.
|
|
58
61
|
#
|
|
59
|
-
# @param filename [String] The path to the Sass, SCSS, or CSS file on disk.
|
|
60
|
-
# @param options [{Symbol => Object}] An options hash;
|
|
61
|
-
# see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
|
|
62
62
|
# @raise [Sass::SyntaxError] if there's an error in the document
|
|
63
63
|
# @raise [Encoding::UndefinedConversionError] if the source encoding
|
|
64
64
|
# cannot be converted to UTF-8
|
|
@@ -67,11 +67,17 @@ module Sass
|
|
|
67
67
|
# @overload compile_file(filename, options = {})
|
|
68
68
|
# Return the compiled CSS rather than writing it to a file.
|
|
69
69
|
#
|
|
70
|
+
# @param filename [String] The path to the Sass, SCSS, or CSS file on disk.
|
|
71
|
+
# @param options [{Symbol => Object}] An options hash;
|
|
72
|
+
# see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
|
|
70
73
|
# @return [String] The compiled CSS.
|
|
71
74
|
#
|
|
72
75
|
# @overload compile_file(filename, css_filename, options = {})
|
|
73
76
|
# Write the compiled CSS to a file.
|
|
74
77
|
#
|
|
78
|
+
# @param filename [String] The path to the Sass, SCSS, or CSS file on disk.
|
|
79
|
+
# @param options [{Symbol => Object}] An options hash;
|
|
80
|
+
# see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
|
|
75
81
|
# @param css_filename [String] The location to which to write the compiled CSS.
|
|
76
82
|
def self.compile_file(filename, *args)
|
|
77
83
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
|
@@ -79,7 +85,7 @@ module Sass
|
|
|
79
85
|
result = Sass::Engine.for_file(filename, options).render
|
|
80
86
|
if css_filename
|
|
81
87
|
options[:css_filename] ||= css_filename
|
|
82
|
-
open(css_filename,"w") {|css_file| css_file.write(result)}
|
|
88
|
+
open(css_filename, "w") {|css_file| css_file.write(result)}
|
|
83
89
|
nil
|
|
84
90
|
else
|
|
85
91
|
result
|
|
@@ -93,3 +99,4 @@ require 'sass/util'
|
|
|
93
99
|
require 'sass/engine'
|
|
94
100
|
require 'sass/plugin' if defined?(Merb::Plugins)
|
|
95
101
|
require 'sass/railtie'
|
|
102
|
+
require 'sass/features'
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
require 'test/unit'
|
|
3
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
|
4
|
+
require 'sass/plugin'
|
|
5
|
+
require 'sass/plugin/compiler'
|
|
6
|
+
|
|
7
|
+
class CompilerTest < Test::Unit::TestCase
|
|
8
|
+
class FakeListener
|
|
9
|
+
attr_accessor :options
|
|
10
|
+
attr_accessor :directories
|
|
11
|
+
attr_reader :start_called
|
|
12
|
+
|
|
13
|
+
def initialize(*args, &on_filesystem_event)
|
|
14
|
+
self.options = args.last.is_a?(Hash) ? args.pop : {}
|
|
15
|
+
self.directories = args
|
|
16
|
+
@on_filesystem_event = on_filesystem_event
|
|
17
|
+
@start_called = false
|
|
18
|
+
reset_events!
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def fire_events!(*args)
|
|
22
|
+
@on_filesystem_event.call(@modified, @added, @removed)
|
|
23
|
+
reset_events!
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def changed(filename)
|
|
27
|
+
@modified << File.expand_path(filename)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def added(filename)
|
|
31
|
+
@added << File.expand_path(filename)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def removed(filename)
|
|
35
|
+
@removed << File.expand_path(filename)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def on_start!(&run_during_start)
|
|
39
|
+
@run_during_start = run_during_start
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def start!
|
|
43
|
+
@run_during_start.call(self) if @run_during_start
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def reset_events!
|
|
47
|
+
@modified = []
|
|
48
|
+
@added = []
|
|
49
|
+
@removed = []
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
module MockWatcher
|
|
54
|
+
attr_accessor :run_during_start
|
|
55
|
+
attr_accessor :update_stylesheets_times
|
|
56
|
+
attr_accessor :update_stylesheets_called_with
|
|
57
|
+
attr_accessor :deleted_css_files
|
|
58
|
+
|
|
59
|
+
def fake_listener
|
|
60
|
+
@fake_listener
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def update_stylesheets(individual_files)
|
|
64
|
+
@update_stylesheets_times ||= 0
|
|
65
|
+
@update_stylesheets_times += 1
|
|
66
|
+
(@update_stylesheets_called_with ||= []) << individual_files
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def try_delete_css(css_filename)
|
|
70
|
+
(@deleted_css_files ||= []) << css_filename
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
def create_listener(*args, &on_filesystem_event)
|
|
75
|
+
@fake_listener = FakeListener.new(*args, &on_filesystem_event)
|
|
76
|
+
@fake_listener.on_start!(&run_during_start)
|
|
77
|
+
@fake_listener
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def test_initialize
|
|
82
|
+
watcher
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_watch_starts_the_listener
|
|
86
|
+
start_called = false
|
|
87
|
+
c = watcher do |listener|
|
|
88
|
+
start_called = true
|
|
89
|
+
end
|
|
90
|
+
c.watch
|
|
91
|
+
assert start_called, "start! was not called"
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def test_sass_callbacks_fire_from_listener_events
|
|
95
|
+
c = watcher do |listener|
|
|
96
|
+
listener.changed "changed.scss"
|
|
97
|
+
listener.added "added.scss"
|
|
98
|
+
listener.removed "removed.scss"
|
|
99
|
+
listener.fire_events!
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
modified_fired = false
|
|
103
|
+
c.on_template_modified do |sass_file|
|
|
104
|
+
modified_fired = true
|
|
105
|
+
assert_equal "changed.scss", sass_file
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
added_fired = false
|
|
109
|
+
c.on_template_created do |sass_file|
|
|
110
|
+
added_fired = true
|
|
111
|
+
assert_equal "added.scss", sass_file
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
removed_fired = false
|
|
115
|
+
c.on_template_deleted do |sass_file|
|
|
116
|
+
removed_fired = true
|
|
117
|
+
assert_equal "removed.scss", sass_file
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
c.watch
|
|
121
|
+
|
|
122
|
+
assert_equal 2, c.update_stylesheets_times
|
|
123
|
+
assert modified_fired
|
|
124
|
+
assert added_fired
|
|
125
|
+
assert removed_fired
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def test_removing_a_sass_file_removes_corresponding_css_file
|
|
129
|
+
c = watcher do |listener|
|
|
130
|
+
listener.removed "remove_me.scss"
|
|
131
|
+
listener.fire_events!
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
c.watch
|
|
135
|
+
|
|
136
|
+
assert_equal "./remove_me.css", c.deleted_css_files.first
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def test_an_importer_can_watch_an_image
|
|
140
|
+
image_importer = Sass::Importers::Filesystem.new(".")
|
|
141
|
+
class << image_importer
|
|
142
|
+
def watched_file?(filename)
|
|
143
|
+
filename =~ /\.png$/
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
c = watcher(:load_paths => [image_importer]) do |listener|
|
|
147
|
+
listener.changed "image.png"
|
|
148
|
+
listener.fire_events!
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
modified_fired = false
|
|
152
|
+
c.on_template_modified do |f|
|
|
153
|
+
modified_fired = true
|
|
154
|
+
assert_equal "image.png", f
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
c.watch
|
|
158
|
+
|
|
159
|
+
assert_equal 2, c.update_stylesheets_times
|
|
160
|
+
assert modified_fired
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def test_watching_specific_files_and_one_is_deleted
|
|
164
|
+
directories = nil
|
|
165
|
+
c = watcher do |listener|
|
|
166
|
+
directories = listener.directories
|
|
167
|
+
listener.removed "/asdf/foobar/sass/foo.scss"
|
|
168
|
+
listener.fire_events!
|
|
169
|
+
end
|
|
170
|
+
c.watch([["/asdf/foobar/sass/foo.scss", "/asdf/foobar/css/foo.css", nil]])
|
|
171
|
+
assert directories.include?("/asdf/foobar/sass"), directories.inspect
|
|
172
|
+
assert_equal "/asdf/foobar/css/foo.css", c.deleted_css_files.first, "the corresponding css file was not deleted"
|
|
173
|
+
assert_equal [], c.update_stylesheets_called_with[1], "the sass file should not have been compiled"
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def test_watched_directories_are_dedupped
|
|
177
|
+
directories = nil
|
|
178
|
+
c = watcher(:load_paths => [".", "./foo", "."]) do |listener|
|
|
179
|
+
directories = listener.directories
|
|
180
|
+
end
|
|
181
|
+
c.watch
|
|
182
|
+
assert_equal [File.expand_path(".")], directories
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def test_a_changed_css_in_a_watched_directory_does_not_force_a_compile
|
|
186
|
+
c = watcher do |listener|
|
|
187
|
+
listener.changed "foo.css"
|
|
188
|
+
listener.fire_events!
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
c.on_template_modified do |f|
|
|
192
|
+
assert false, "Should not have been called"
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
c.watch
|
|
196
|
+
|
|
197
|
+
assert_equal 1, c.update_stylesheets_times
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
private
|
|
201
|
+
|
|
202
|
+
def default_options
|
|
203
|
+
{:template_location => [[".","."]]}
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def watcher(options = {}, &run_during_start)
|
|
207
|
+
options = default_options.merge(options)
|
|
208
|
+
watcher = Sass::Plugin::Compiler.new(options)
|
|
209
|
+
watcher.extend(MockWatcher)
|
|
210
|
+
watcher.run_during_start = run_during_start
|
|
211
|
+
watcher
|
|
212
|
+
end
|
|
213
|
+
end
|
|
@@ -531,6 +531,28 @@ SASS
|
|
|
531
531
|
SCSS
|
|
532
532
|
end
|
|
533
533
|
|
|
534
|
+
def test_immediately_following_comments
|
|
535
|
+
assert_sass_to_scss <<SCSS, <<SASS
|
|
536
|
+
.foobar {
|
|
537
|
+
// trailing comment
|
|
538
|
+
a: 1px;
|
|
539
|
+
}
|
|
540
|
+
SCSS
|
|
541
|
+
.foobar // trailing comment
|
|
542
|
+
a: 1px
|
|
543
|
+
SASS
|
|
544
|
+
|
|
545
|
+
assert_sass_to_scss <<SCSS, <<SASS
|
|
546
|
+
.foobar {
|
|
547
|
+
// trailing comment
|
|
548
|
+
a: 1px;
|
|
549
|
+
}
|
|
550
|
+
SCSS
|
|
551
|
+
.foobar /* trailing comment */
|
|
552
|
+
a: 1px
|
|
553
|
+
SASS
|
|
554
|
+
end
|
|
555
|
+
|
|
534
556
|
def test_debug
|
|
535
557
|
assert_renders <<SASS, <<SCSS
|
|
536
558
|
foo
|
|
@@ -725,6 +747,10 @@ a
|
|
|
725
747
|
c
|
|
726
748
|
@each $str in foo, bar, baz, bang
|
|
727
749
|
d: $str
|
|
750
|
+
|
|
751
|
+
c
|
|
752
|
+
@each $key, $value in (foo: 1, bar: 2, baz: 3)
|
|
753
|
+
\#{$key}: $value
|
|
728
754
|
SASS
|
|
729
755
|
a {
|
|
730
756
|
@each $number in 1px 2px 3px 4px {
|
|
@@ -737,6 +763,12 @@ c {
|
|
|
737
763
|
d: $str;
|
|
738
764
|
}
|
|
739
765
|
}
|
|
766
|
+
|
|
767
|
+
c {
|
|
768
|
+
@each $key, $value in (foo: 1, bar: 2, baz: 3) {
|
|
769
|
+
\#{$key}: $value;
|
|
770
|
+
}
|
|
771
|
+
}
|
|
740
772
|
SCSS
|
|
741
773
|
end
|
|
742
774
|
|
|
@@ -1347,7 +1379,7 @@ div
|
|
|
1347
1379
|
SASS
|
|
1348
1380
|
end
|
|
1349
1381
|
|
|
1350
|
-
|
|
1382
|
+
def test_loud_comment_conversion
|
|
1351
1383
|
assert_renders(<<SASS, <<SCSS)
|
|
1352
1384
|
/*! \#{"interpolated"}
|
|
1353
1385
|
SASS
|
|
@@ -1589,6 +1621,28 @@ SASS
|
|
|
1589
1621
|
SCSS
|
|
1590
1622
|
end
|
|
1591
1623
|
|
|
1624
|
+
def test_mixin_var_kwargs
|
|
1625
|
+
assert_scss_to_sass <<SASS, <<SCSS
|
|
1626
|
+
=foo($a: b, $c: d)
|
|
1627
|
+
a: $a
|
|
1628
|
+
c: $c
|
|
1629
|
+
|
|
1630
|
+
.foo
|
|
1631
|
+
+foo($list..., $map...)
|
|
1632
|
+
+foo(pos, $list..., $kwd: val, $map...)
|
|
1633
|
+
SASS
|
|
1634
|
+
@mixin foo($a: b, $c: d) {
|
|
1635
|
+
a: $a;
|
|
1636
|
+
c: $c;
|
|
1637
|
+
}
|
|
1638
|
+
|
|
1639
|
+
.foo {
|
|
1640
|
+
@include foo($list..., $map...);
|
|
1641
|
+
@include foo(pos, $list..., $kwd: val, $map...);
|
|
1642
|
+
}
|
|
1643
|
+
SCSS
|
|
1644
|
+
end
|
|
1645
|
+
|
|
1592
1646
|
def test_function_var_args
|
|
1593
1647
|
assert_scss_to_sass <<SASS, <<SCSS
|
|
1594
1648
|
@function foo($args...)
|
|
@@ -1616,8 +1670,126 @@ SASS
|
|
|
1616
1670
|
SCSS
|
|
1617
1671
|
end
|
|
1618
1672
|
|
|
1673
|
+
def test_function_var_kwargs
|
|
1674
|
+
assert_scss_to_sass <<SASS, <<SCSS
|
|
1675
|
+
@function foo($a: b, $c: d)
|
|
1676
|
+
@return foo
|
|
1677
|
+
|
|
1678
|
+
.foo
|
|
1679
|
+
a: foo($list..., $map...)
|
|
1680
|
+
b: foo(pos, $list..., $kwd: val, $map...)
|
|
1681
|
+
SASS
|
|
1682
|
+
@function foo($a: b, $c: d) {
|
|
1683
|
+
@return foo;
|
|
1684
|
+
}
|
|
1685
|
+
|
|
1686
|
+
.foo {
|
|
1687
|
+
a: foo($list..., $map...);
|
|
1688
|
+
b: foo(pos, $list..., $kwd: val, $map...);
|
|
1689
|
+
}
|
|
1690
|
+
SCSS
|
|
1691
|
+
end
|
|
1692
|
+
|
|
1693
|
+
def test_at_root
|
|
1694
|
+
assert_scss_to_sass <<SASS, <<SCSS
|
|
1695
|
+
.foo
|
|
1696
|
+
@at-root
|
|
1697
|
+
.bar
|
|
1698
|
+
a: b
|
|
1699
|
+
.baz
|
|
1700
|
+
c: d
|
|
1701
|
+
SASS
|
|
1702
|
+
.foo {
|
|
1703
|
+
@at-root {
|
|
1704
|
+
.bar {
|
|
1705
|
+
a: b;
|
|
1706
|
+
}
|
|
1707
|
+
.baz {
|
|
1708
|
+
c: d;
|
|
1709
|
+
}
|
|
1710
|
+
}
|
|
1711
|
+
}
|
|
1712
|
+
SCSS
|
|
1713
|
+
end
|
|
1714
|
+
|
|
1715
|
+
def test_at_root_with_selector
|
|
1716
|
+
assert_scss_to_sass <<SASS, <<SCSS
|
|
1717
|
+
.foo
|
|
1718
|
+
@at-root .bar
|
|
1719
|
+
a: b
|
|
1720
|
+
SASS
|
|
1721
|
+
.foo {
|
|
1722
|
+
@at-root .bar {
|
|
1723
|
+
a: b;
|
|
1724
|
+
}
|
|
1725
|
+
}
|
|
1726
|
+
SCSS
|
|
1727
|
+
end
|
|
1728
|
+
|
|
1729
|
+
def test_at_root_without
|
|
1730
|
+
assert_scss_to_sass <<SASS, <<SCSS
|
|
1731
|
+
.foo
|
|
1732
|
+
@at-root (without: media rule)
|
|
1733
|
+
a: b
|
|
1734
|
+
SASS
|
|
1735
|
+
.foo {
|
|
1736
|
+
@at-root (without: media rule) {
|
|
1737
|
+
a: b;
|
|
1738
|
+
}
|
|
1739
|
+
}
|
|
1740
|
+
SCSS
|
|
1741
|
+
end
|
|
1742
|
+
|
|
1743
|
+
def test_at_root_with
|
|
1744
|
+
assert_scss_to_sass <<SASS, <<SCSS
|
|
1745
|
+
.foo
|
|
1746
|
+
@at-root (with: media rule)
|
|
1747
|
+
a: b
|
|
1748
|
+
SASS
|
|
1749
|
+
.foo {
|
|
1750
|
+
@at-root (with: media rule) {
|
|
1751
|
+
a: b;
|
|
1752
|
+
}
|
|
1753
|
+
}
|
|
1754
|
+
SCSS
|
|
1755
|
+
end
|
|
1756
|
+
|
|
1757
|
+
def test_function_var_kwargs_with_list
|
|
1758
|
+
assert_scss_to_sass <<SASS, <<SCSS
|
|
1759
|
+
@function foo($a: b, $c: d)
|
|
1760
|
+
@return $a, $c
|
|
1761
|
+
|
|
1762
|
+
.foo
|
|
1763
|
+
a: foo($list..., $map...)
|
|
1764
|
+
SASS
|
|
1765
|
+
@function foo($a: b, $c: d) {
|
|
1766
|
+
@return $a, $c;
|
|
1767
|
+
}
|
|
1768
|
+
|
|
1769
|
+
.foo {
|
|
1770
|
+
a: foo($list..., $map...);
|
|
1771
|
+
}
|
|
1772
|
+
SCSS
|
|
1773
|
+
end
|
|
1774
|
+
|
|
1619
1775
|
## Regression Tests
|
|
1620
1776
|
|
|
1777
|
+
def test_list_in_args
|
|
1778
|
+
assert_renders(<<SASS, <<SCSS)
|
|
1779
|
+
+mixin((a, b, c))
|
|
1780
|
+
|
|
1781
|
+
+mixin($arg: (a, b, c))
|
|
1782
|
+
|
|
1783
|
+
+mixin(a, b, (c, d, e)...)
|
|
1784
|
+
SASS
|
|
1785
|
+
@include mixin((a, b, c));
|
|
1786
|
+
|
|
1787
|
+
@include mixin($arg: (a, b, c));
|
|
1788
|
+
|
|
1789
|
+
@include mixin(a, b, (c, d, e)...);
|
|
1790
|
+
SCSS
|
|
1791
|
+
end
|
|
1792
|
+
|
|
1621
1793
|
def test_media_query_with_expr
|
|
1622
1794
|
assert_scss_to_sass <<SASS, <<SCSS
|
|
1623
1795
|
@media foo and (bar: baz)
|
|
@@ -1628,14 +1800,6 @@ SASS
|
|
|
1628
1800
|
SCSS
|
|
1629
1801
|
end
|
|
1630
1802
|
|
|
1631
|
-
def test_empty_lists
|
|
1632
|
-
assert_renders(<<SASS, <<SCSS)
|
|
1633
|
-
$foo: ()
|
|
1634
|
-
SASS
|
|
1635
|
-
$foo: ();
|
|
1636
|
-
SCSS
|
|
1637
|
-
end
|
|
1638
|
-
|
|
1639
1803
|
def test_nested_if_statements
|
|
1640
1804
|
assert_renders(<<SASS, <<SCSS)
|
|
1641
1805
|
@if $foo
|
|
@@ -1684,6 +1848,68 @@ foo {
|
|
|
1684
1848
|
SCSS
|
|
1685
1849
|
end
|
|
1686
1850
|
|
|
1851
|
+
def test_keyword_arguments
|
|
1852
|
+
assert_renders(<<SASS, <<SCSS, :dasherize => true)
|
|
1853
|
+
$foo: foo($dash-ed: 2px)
|
|
1854
|
+
SASS
|
|
1855
|
+
$foo: foo($dash-ed: 2px);
|
|
1856
|
+
SCSS
|
|
1857
|
+
assert_scss_to_sass(<<SASS, <<SCSS, :dasherize => true)
|
|
1858
|
+
$foo: foo($dash-ed: 2px)
|
|
1859
|
+
SASS
|
|
1860
|
+
$foo: foo($dash_ed: 2px);
|
|
1861
|
+
SCSS
|
|
1862
|
+
assert_sass_to_scss(<<SCSS, <<SASS, :dasherize => true)
|
|
1863
|
+
$foo: foo($dash-ed: 2px);
|
|
1864
|
+
SCSS
|
|
1865
|
+
$foo: foo($dash_ed: 2px)
|
|
1866
|
+
SASS
|
|
1867
|
+
assert_renders(<<SASS, <<SCSS)
|
|
1868
|
+
$foo: foo($under_scored: 1px)
|
|
1869
|
+
SASS
|
|
1870
|
+
$foo: foo($under_scored: 1px);
|
|
1871
|
+
SCSS
|
|
1872
|
+
assert_renders(<<SASS, <<SCSS)
|
|
1873
|
+
$foo: foo($dash-ed: 2px, $under_scored: 1px)
|
|
1874
|
+
SASS
|
|
1875
|
+
$foo: foo($dash-ed: 2px, $under_scored: 1px);
|
|
1876
|
+
SCSS
|
|
1877
|
+
end
|
|
1878
|
+
|
|
1879
|
+
def test_ambiguous_negation
|
|
1880
|
+
assert_renders(<<SASS, <<SCSS, :indent => ' ')
|
|
1881
|
+
foo
|
|
1882
|
+
ok: -$foo
|
|
1883
|
+
comma: 10px, -$foo
|
|
1884
|
+
needs-parens: 10px (-$foo)
|
|
1885
|
+
no-parens: a 50px + 60px b
|
|
1886
|
+
SASS
|
|
1887
|
+
foo {
|
|
1888
|
+
ok: -$foo;
|
|
1889
|
+
comma: 10px, -$foo;
|
|
1890
|
+
needs-parens: 10px (-$foo);
|
|
1891
|
+
no-parens: a 50px + 60px b;
|
|
1892
|
+
}
|
|
1893
|
+
SCSS
|
|
1894
|
+
end
|
|
1895
|
+
|
|
1896
|
+
def test_variable_with_global
|
|
1897
|
+
assert_renders(<<SASS, <<SCSS)
|
|
1898
|
+
$var: 1
|
|
1899
|
+
|
|
1900
|
+
foo
|
|
1901
|
+
$var: 2 !global
|
|
1902
|
+
$var: 3 !global !default
|
|
1903
|
+
SASS
|
|
1904
|
+
$var: 1;
|
|
1905
|
+
|
|
1906
|
+
foo {
|
|
1907
|
+
$var: 2 !global;
|
|
1908
|
+
$var: 3 !global !default;
|
|
1909
|
+
}
|
|
1910
|
+
SCSS
|
|
1911
|
+
end
|
|
1912
|
+
|
|
1687
1913
|
private
|
|
1688
1914
|
|
|
1689
1915
|
def assert_sass_to_sass(sass, options = {})
|