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.
Files changed (184) hide show
  1. data/MIT-LICENSE +2 -2
  2. data/README.md +14 -2
  3. data/Rakefile +25 -1
  4. data/VERSION +1 -1
  5. data/VERSION_DATE +1 -1
  6. data/VERSION_NAME +1 -1
  7. data/lib/sass/cache_stores/base.rb +4 -2
  8. data/lib/sass/cache_stores/chain.rb +2 -1
  9. data/lib/sass/cache_stores/filesystem.rb +2 -6
  10. data/lib/sass/cache_stores/memory.rb +1 -1
  11. data/lib/sass/cache_stores/null.rb +2 -2
  12. data/lib/sass/callbacks.rb +1 -0
  13. data/lib/sass/css.rb +10 -10
  14. data/lib/sass/engine.rb +403 -150
  15. data/lib/sass/environment.rb +136 -57
  16. data/lib/sass/error.rb +7 -7
  17. data/lib/sass/exec.rb +123 -39
  18. data/lib/sass/features.rb +41 -0
  19. data/lib/sass/importers/base.rb +33 -2
  20. data/lib/sass/importers/deprecated_path.rb +45 -0
  21. data/lib/sass/importers/filesystem.rb +25 -14
  22. data/lib/sass/importers.rb +1 -0
  23. data/lib/sass/logger/base.rb +3 -3
  24. data/lib/sass/logger/log_level.rb +4 -6
  25. data/lib/sass/media.rb +19 -19
  26. data/lib/sass/plugin/compiler.rb +141 -101
  27. data/lib/sass/plugin/configuration.rb +18 -22
  28. data/lib/sass/plugin/merb.rb +1 -1
  29. data/lib/sass/plugin/staleness_checker.rb +24 -8
  30. data/lib/sass/plugin.rb +4 -2
  31. data/lib/sass/repl.rb +3 -3
  32. data/lib/sass/script/css_lexer.rb +9 -4
  33. data/lib/sass/script/css_parser.rb +6 -2
  34. data/lib/sass/script/functions.rb +1343 -590
  35. data/lib/sass/script/lexer.rb +84 -52
  36. data/lib/sass/script/parser.rb +217 -97
  37. data/lib/sass/script/tree/funcall.rb +290 -0
  38. data/lib/sass/script/{interpolation.rb → tree/interpolation.rb} +34 -13
  39. data/lib/sass/script/tree/list_literal.rb +80 -0
  40. data/lib/sass/script/tree/literal.rb +47 -0
  41. data/lib/sass/script/tree/map_literal.rb +64 -0
  42. data/lib/sass/script/{node.rb → tree/node.rb} +22 -12
  43. data/lib/sass/script/{operation.rb → tree/operation.rb} +17 -25
  44. data/lib/sass/script/tree/selector.rb +30 -0
  45. data/lib/sass/script/{string_interpolation.rb → tree/string_interpolation.rb} +5 -4
  46. data/lib/sass/script/{unary_operation.rb → tree/unary_operation.rb} +14 -9
  47. data/lib/sass/script/tree/variable.rb +57 -0
  48. data/lib/sass/script/tree.rb +16 -0
  49. data/lib/sass/script/{arg_list.rb → value/arg_list.rb} +4 -24
  50. data/lib/sass/script/value/base.rb +248 -0
  51. data/lib/sass/script/value/bool.rb +36 -0
  52. data/lib/sass/script/{color.rb → value/color.rb} +239 -195
  53. data/lib/sass/script/value/helpers.rb +155 -0
  54. data/lib/sass/script/value/list.rb +119 -0
  55. data/lib/sass/script/value/map.rb +70 -0
  56. data/lib/sass/script/value/null.rb +45 -0
  57. data/lib/sass/script/{number.rb → value/number.rb} +91 -65
  58. data/lib/sass/script/{string.rb → value/string.rb} +9 -11
  59. data/lib/sass/script/value.rb +11 -0
  60. data/lib/sass/script.rb +35 -8
  61. data/lib/sass/scss/css_parser.rb +2 -1
  62. data/lib/sass/scss/parser.rb +338 -170
  63. data/lib/sass/scss/rx.rb +5 -6
  64. data/lib/sass/scss/script_lexer.rb +1 -0
  65. data/lib/sass/scss/script_parser.rb +1 -0
  66. data/lib/sass/scss/static_parser.rb +23 -6
  67. data/lib/sass/selector/abstract_sequence.rb +2 -2
  68. data/lib/sass/selector/comma_sequence.rb +21 -16
  69. data/lib/sass/selector/sequence.rb +60 -34
  70. data/lib/sass/selector/simple.rb +11 -12
  71. data/lib/sass/selector/simple_sequence.rb +55 -33
  72. data/lib/sass/selector.rb +52 -48
  73. data/lib/sass/source/map.rb +211 -0
  74. data/lib/sass/source/position.rb +39 -0
  75. data/lib/sass/source/range.rb +41 -0
  76. data/lib/sass/stack.rb +120 -0
  77. data/lib/sass/supports.rb +12 -13
  78. data/lib/sass/tree/at_root_node.rb +82 -0
  79. data/lib/sass/tree/comment_node.rb +3 -3
  80. data/lib/sass/tree/css_import_node.rb +11 -11
  81. data/lib/sass/tree/debug_node.rb +2 -2
  82. data/lib/sass/tree/directive_node.rb +13 -2
  83. data/lib/sass/tree/each_node.rb +8 -8
  84. data/lib/sass/tree/extend_node.rb +13 -6
  85. data/lib/sass/tree/for_node.rb +4 -4
  86. data/lib/sass/tree/function_node.rb +5 -4
  87. data/lib/sass/tree/if_node.rb +1 -1
  88. data/lib/sass/tree/import_node.rb +4 -5
  89. data/lib/sass/tree/media_node.rb +4 -14
  90. data/lib/sass/tree/mixin_def_node.rb +4 -4
  91. data/lib/sass/tree/mixin_node.rb +21 -8
  92. data/lib/sass/tree/node.rb +29 -12
  93. data/lib/sass/tree/prop_node.rb +38 -18
  94. data/lib/sass/tree/return_node.rb +3 -2
  95. data/lib/sass/tree/root_node.rb +19 -3
  96. data/lib/sass/tree/rule_node.rb +25 -17
  97. data/lib/sass/tree/supports_node.rb +0 -13
  98. data/lib/sass/tree/trace_node.rb +2 -1
  99. data/lib/sass/tree/variable_node.rb +9 -3
  100. data/lib/sass/tree/visitors/base.rb +6 -6
  101. data/lib/sass/tree/visitors/check_nesting.rb +12 -9
  102. data/lib/sass/tree/visitors/convert.rb +63 -38
  103. data/lib/sass/tree/visitors/cssize.rb +63 -23
  104. data/lib/sass/tree/visitors/deep_copy.rb +6 -5
  105. data/lib/sass/tree/visitors/extend.rb +7 -7
  106. data/lib/sass/tree/visitors/perform.rb +256 -151
  107. data/lib/sass/tree/visitors/set_options.rb +6 -6
  108. data/lib/sass/tree/visitors/to_css.rb +231 -81
  109. data/lib/sass/tree/warn_node.rb +2 -2
  110. data/lib/sass/tree/while_node.rb +2 -2
  111. data/lib/sass/util/multibyte_string_scanner.rb +2 -0
  112. data/lib/sass/util/normalized_map.rb +65 -0
  113. data/lib/sass/util/ordered_hash.rb +188 -0
  114. data/lib/sass/util/subset_map.rb +3 -2
  115. data/lib/sass/util/test.rb +9 -0
  116. data/lib/sass/util.rb +220 -34
  117. data/lib/sass/version.rb +9 -9
  118. data/lib/sass.rb +14 -7
  119. data/test/sass/compiler_test.rb +213 -0
  120. data/test/sass/conversion_test.rb +235 -9
  121. data/test/sass/engine_test.rb +230 -60
  122. data/test/sass/exec_test.rb +86 -0
  123. data/test/sass/extend_test.rb +215 -147
  124. data/test/sass/functions_test.rb +584 -99
  125. data/test/sass/importer_test.rb +165 -17
  126. data/test/sass/plugin_test.rb +19 -13
  127. data/test/sass/script_conversion_test.rb +40 -0
  128. data/test/sass/script_test.rb +231 -21
  129. data/test/sass/scss/css_test.rb +14 -5
  130. data/test/sass/scss/scss_test.rb +1266 -66
  131. data/test/sass/source_map_test.rb +879 -0
  132. data/test/sass/templates/bork5.sass +3 -0
  133. data/test/sass/util/normalized_map_test.rb +30 -0
  134. data/test/sass/util_test.rb +90 -0
  135. data/test/sass/value_helpers_test.rb +181 -0
  136. data/test/test_helper.rb +7 -2
  137. metadata +316 -291
  138. data/lib/sass/script/bool.rb +0 -18
  139. data/lib/sass/script/funcall.rb +0 -231
  140. data/lib/sass/script/list.rb +0 -84
  141. data/lib/sass/script/literal.rb +0 -239
  142. data/lib/sass/script/null.rb +0 -34
  143. data/lib/sass/script/variable.rb +0 -58
  144. data/test/Gemfile +0 -3
  145. data/vendor/listen/CHANGELOG.md +0 -221
  146. data/vendor/listen/CONTRIBUTING.md +0 -38
  147. data/vendor/listen/Gemfile +0 -30
  148. data/vendor/listen/Guardfile +0 -8
  149. data/vendor/listen/LICENSE +0 -20
  150. data/vendor/listen/README.md +0 -315
  151. data/vendor/listen/Rakefile +0 -47
  152. data/vendor/listen/Vagrantfile +0 -96
  153. data/vendor/listen/lib/listen/adapter.rb +0 -214
  154. data/vendor/listen/lib/listen/adapters/bsd.rb +0 -112
  155. data/vendor/listen/lib/listen/adapters/darwin.rb +0 -85
  156. data/vendor/listen/lib/listen/adapters/linux.rb +0 -113
  157. data/vendor/listen/lib/listen/adapters/polling.rb +0 -67
  158. data/vendor/listen/lib/listen/adapters/windows.rb +0 -87
  159. data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
  160. data/vendor/listen/lib/listen/directory_record.rb +0 -371
  161. data/vendor/listen/lib/listen/listener.rb +0 -225
  162. data/vendor/listen/lib/listen/multi_listener.rb +0 -143
  163. data/vendor/listen/lib/listen/turnstile.rb +0 -28
  164. data/vendor/listen/lib/listen/version.rb +0 -3
  165. data/vendor/listen/lib/listen.rb +0 -40
  166. data/vendor/listen/listen.gemspec +0 -22
  167. data/vendor/listen/spec/listen/adapter_spec.rb +0 -183
  168. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +0 -36
  169. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -37
  170. data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -47
  171. data/vendor/listen/spec/listen/adapters/polling_spec.rb +0 -68
  172. data/vendor/listen/spec/listen/adapters/windows_spec.rb +0 -30
  173. data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
  174. data/vendor/listen/spec/listen/directory_record_spec.rb +0 -1225
  175. data/vendor/listen/spec/listen/listener_spec.rb +0 -169
  176. data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
  177. data/vendor/listen/spec/listen/turnstile_spec.rb +0 -56
  178. data/vendor/listen/spec/listen_spec.rb +0 -73
  179. data/vendor/listen/spec/spec_helper.rb +0 -21
  180. data/vendor/listen/spec/support/adapter_helper.rb +0 -629
  181. data/vendor/listen/spec/support/directory_record_helper.rb +0 -55
  182. data/vendor/listen/spec/support/fixtures_helper.rb +0 -29
  183. data/vendor/listen/spec/support/listeners_helper.rb +0 -156
  184. 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 [DateTime] at which this release was cut.
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
- return nil
111
+ nil
112
112
  end
113
113
 
114
114
  def version_date
115
115
  return unless File.exists?(scope('VERSION_DATE'))
116
- return DateTime.parse(File.read(scope('VERSION_DATE')).strip)
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 [Sass::Engine].
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
- ENV['SASS_PATH'].split(Sass::Util.windows? ? ';' : ':') : []
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
- def test_loud_comment_conversion
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 = {})