sass 3.1.15 → 3.1.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. data/README.md +4 -5
  2. data/Rakefile +2 -2
  3. data/VERSION +1 -1
  4. data/lib/sass/css.rb +144 -48
  5. data/lib/sass/engine.rb +3 -1
  6. data/lib/sass/plugin/compiler.rb +25 -32
  7. data/lib/sass/plugin/listener.rb +59 -0
  8. data/lib/sass/script/lexer.rb +1 -1
  9. data/lib/sass/script/list.rb +1 -0
  10. data/lib/sass/scss/parser.rb +90 -4
  11. data/lib/sass/scss/rx.rb +5 -0
  12. data/lib/sass/scss/static_parser.rb +1 -1
  13. data/lib/sass/selector/abstract_sequence.rb +11 -2
  14. data/lib/sass/selector/simple.rb +6 -0
  15. data/lib/sass/tree/comment_node.rb +1 -1
  16. data/lib/sass/tree/node.rb +2 -2
  17. data/lib/sass/tree/visitors/check_nesting.rb +2 -2
  18. data/lib/sass/tree/visitors/cssize.rb +1 -1
  19. data/lib/sass/util.rb +3 -2
  20. data/test/sass/conversion_test.rb +10 -0
  21. data/test/sass/css2sass_test.rb +24 -0
  22. data/test/sass/engine_test.rb +1 -0
  23. data/test/sass/scss/css_test.rb +53 -0
  24. data/vendor/listen/CHANGELOG.md +72 -0
  25. data/vendor/listen/Gemfile +35 -0
  26. data/vendor/listen/Guardfile +8 -0
  27. data/vendor/{fssm → listen}/LICENSE +1 -1
  28. data/vendor/listen/README.md +297 -0
  29. data/vendor/listen/Rakefile +47 -0
  30. data/vendor/listen/Vagrantfile +96 -0
  31. data/vendor/listen/lib/listen.rb +38 -0
  32. data/vendor/listen/lib/listen/adapter.rb +159 -0
  33. data/vendor/listen/lib/listen/adapters/darwin.rb +84 -0
  34. data/vendor/listen/lib/listen/adapters/linux.rb +99 -0
  35. data/vendor/listen/lib/listen/adapters/polling.rb +66 -0
  36. data/vendor/listen/lib/listen/adapters/windows.rb +82 -0
  37. data/vendor/listen/lib/listen/directory_record.rb +257 -0
  38. data/vendor/listen/lib/listen/listener.rb +186 -0
  39. data/vendor/listen/lib/listen/multi_listener.rb +121 -0
  40. data/vendor/listen/lib/listen/turnstile.rb +28 -0
  41. data/vendor/listen/lib/listen/version.rb +3 -0
  42. data/vendor/listen/listen.gemspec +26 -0
  43. data/vendor/listen/spec/listen/adapter_spec.rb +142 -0
  44. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +31 -0
  45. data/vendor/listen/spec/listen/adapters/linux_spec.rb +30 -0
  46. data/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
  47. data/vendor/listen/spec/listen/adapters/windows_spec.rb +24 -0
  48. data/vendor/listen/spec/listen/directory_record_spec.rb +807 -0
  49. data/vendor/listen/spec/listen/listener_spec.rb +151 -0
  50. data/vendor/listen/spec/listen/multi_listener_spec.rb +151 -0
  51. data/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
  52. data/vendor/listen/spec/listen_spec.rb +73 -0
  53. data/vendor/listen/spec/spec_helper.rb +16 -0
  54. data/vendor/listen/spec/support/adapter_helper.rb +538 -0
  55. data/vendor/listen/spec/support/directory_record_helper.rb +35 -0
  56. data/vendor/listen/spec/support/fixtures_helper.rb +29 -0
  57. data/vendor/listen/spec/support/listeners_helper.rb +133 -0
  58. data/vendor/listen/spec/support/platform_helper.rb +11 -0
  59. metadata +40 -40
  60. data/vendor/fssm/Gemfile +0 -3
  61. data/vendor/fssm/README.markdown +0 -83
  62. data/vendor/fssm/Rakefile +0 -11
  63. data/vendor/fssm/example.rb +0 -12
  64. data/vendor/fssm/ext/rakefile.rb +0 -14
  65. data/vendor/fssm/fssm.gemspec +0 -27
  66. data/vendor/fssm/lib/fssm.rb +0 -74
  67. data/vendor/fssm/lib/fssm/backends/fsevents.rb +0 -36
  68. data/vendor/fssm/lib/fssm/backends/inotify.rb +0 -26
  69. data/vendor/fssm/lib/fssm/backends/polling.rb +0 -25
  70. data/vendor/fssm/lib/fssm/backends/rbfsevent.rb +0 -42
  71. data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +0 -131
  72. data/vendor/fssm/lib/fssm/monitor.rb +0 -36
  73. data/vendor/fssm/lib/fssm/path.rb +0 -94
  74. data/vendor/fssm/lib/fssm/pathname.rb +0 -36
  75. data/vendor/fssm/lib/fssm/state/directory.rb +0 -75
  76. data/vendor/fssm/lib/fssm/state/file.rb +0 -24
  77. data/vendor/fssm/lib/fssm/support.rb +0 -87
  78. data/vendor/fssm/lib/fssm/tree.rb +0 -176
  79. data/vendor/fssm/lib/fssm/version.rb +0 -3
  80. data/vendor/fssm/profile/prof-cache.rb +0 -40
  81. data/vendor/fssm/profile/prof-fssm-pathname.html +0 -1231
  82. data/vendor/fssm/profile/prof-pathname-rubinius.rb +0 -35
  83. data/vendor/fssm/profile/prof-pathname.rb +0 -68
  84. data/vendor/fssm/profile/prof-plain-pathname.html +0 -988
  85. data/vendor/fssm/profile/prof.html +0 -2379
  86. data/vendor/fssm/spec/count_down_latch.rb +0 -151
  87. data/vendor/fssm/spec/monitor_spec.rb +0 -202
  88. data/vendor/fssm/spec/path_spec.rb +0 -96
  89. data/vendor/fssm/spec/root/duck/quack.txt +0 -0
  90. data/vendor/fssm/spec/root/file.css +0 -0
  91. data/vendor/fssm/spec/root/file.rb +0 -0
  92. data/vendor/fssm/spec/root/file.yml +0 -0
  93. data/vendor/fssm/spec/root/moo/cow.txt +0 -0
  94. data/vendor/fssm/spec/spec_helper.rb +0 -14
data/README.md CHANGED
@@ -175,16 +175,15 @@ See `sass-convert --help` for further information and options.
175
175
 
176
176
  Sass was envisioned by [Hampton Catlin](http://hamptoncatlin.com) (hcatlin).
177
177
  However, Hampton doesn't even know his way around the code anymore and now
178
- occasionally consults on the language issues. Hampton lives in Jacksonville,
179
- Florida and is the lead mobile developer for Wikimedia.
178
+ occasionally consults on the language issues. Hampton lives in Cambridge, UK and
179
+ is the owner of [Catlin Software](http://www.catlinsoftware.com/).
180
180
 
181
181
  [Nathan Weizenbaum](http://nex-3.com) is the primary developer and architect of
182
182
  Sass. His hard work has kept the project alive by endlessly answering forum
183
183
  posts, fixing bugs, refactoring, finding speed improvements, writing
184
184
  documentation, implementing new features, and getting Hampton coffee (a fitting
185
- task for a boy-genius). Nathan lives in Seattle, Washington and while not being
186
- a student at the University of Washington or working at an internship, he
187
- consults for Unspace Interactive.
185
+ task for a boy-genius). Nathan lives in Seattle, Washington and works on
186
+ [Dart](http://dartlang.org) application libraries at Google.
188
187
 
189
188
  [Chris Eppstein](http://acts-as-architect.blogspot.com) is a core contributor to
190
189
  Sass and the creator of Compass, the first Sass-based framework. Chris focuses
data/Rakefile CHANGED
@@ -115,9 +115,9 @@ task :submodules do
115
115
  if File.exist?(File.dirname(__FILE__) + "/.git")
116
116
  sh %{git submodule sync}
117
117
  sh %{git submodule update --init}
118
- elsif !File.exist?(File.dirname(__FILE__) + "/vendor/fssm/lib")
118
+ elsif !File.exist?(File.dirname(__FILE__) + "/vendor/listen/lib")
119
119
  warn <<WARN
120
- WARNING: vendor/fssm doesn't exist, and this isn't a git repository so
120
+ WARNING: vendor/listen doesn't exist, and this isn't a git repository so
121
121
  I can't get it automatically!
122
122
  WARN
123
123
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.1.15
1
+ 3.1.16
@@ -75,14 +75,29 @@ module Sass
75
75
  # @return [Tree::Node] The root node of the parsed tree
76
76
  def build_tree
77
77
  root = Sass::SCSS::CssParser.new(@template, @options[:filename]).parse
78
+ parse_selectors root
78
79
  expand_commas root
80
+ nest_seqs root
79
81
  parent_ref_rules root
80
- remove_parent_refs root
81
82
  flatten_rules root
82
83
  fold_commas root
84
+ dump_selectors root
83
85
  root
84
86
  end
85
87
 
88
+ # Parse all the selectors in the document and assign them to
89
+ # {Sass::Tree::RuleNode#parsed_rules}.
90
+ #
91
+ # @param root [Tree::Node] The parent node
92
+ def parse_selectors(root)
93
+ root.children.each do |child|
94
+ next parse_selectors(child) if child.is_a?(Tree::DirectiveNode)
95
+ next unless child.is_a?(Tree::RuleNode)
96
+ parser = Sass::SCSS::CssParser.new(child.rule.first, child.filename, child.line)
97
+ child.parsed_rules = parser.parse_selector
98
+ end
99
+ end
100
+
86
101
  # Transform
87
102
  #
88
103
  # foo, bar, baz
@@ -100,13 +115,14 @@ module Sass
100
115
  # @param root [Tree::Node] The parent node
101
116
  def expand_commas(root)
102
117
  root.children.map! do |child|
103
- unless child.is_a?(Tree::RuleNode) && child.rule.first.include?(',')
118
+ # child.parsed_rules.members.size > 1 iff the rule contains a comma
119
+ unless child.is_a?(Tree::RuleNode) && child.parsed_rules.members.size > 1
104
120
  expand_commas(child) if child.is_a?(Tree::DirectiveNode)
105
121
  next child
106
122
  end
107
- child.rule.first.split(',').map do |rule|
108
- next if rule.strip.empty?
109
- node = Tree::RuleNode.new([rule.strip])
123
+ child.parsed_rules.members.map do |seq|
124
+ node = Tree::RuleNode.new([])
125
+ node.parsed_rules = make_cseq(seq)
110
126
  node.children = child.children
111
127
  node
112
128
  end
@@ -114,22 +130,7 @@ module Sass
114
130
  root.children.flatten!
115
131
  end
116
132
 
117
- # Make rules use parent refs so that
118
- #
119
- # foo
120
- # color: green
121
- # foo.bar
122
- # color: blue
123
- #
124
- # becomes
125
- #
126
- # foo
127
- # color: green
128
- # &.bar
129
- # color: blue
130
- #
131
- # This has the side effect of nesting rules,
132
- # so that
133
+ # Make rules use nesting so that
133
134
  #
134
135
  # foo
135
136
  # color: green
@@ -142,28 +143,31 @@ module Sass
142
143
  #
143
144
  # foo
144
145
  # color: green
145
- # & bar
146
+ # bar
146
147
  # color: red
147
- # & baz
148
+ # baz
148
149
  # color: blue
149
150
  #
150
151
  # @param root [Tree::Node] The parent node
151
- def parent_ref_rules(root)
152
+ def nest_seqs(root)
152
153
  current_rule = nil
153
154
  root.children.map! do |child|
154
155
  unless child.is_a?(Tree::RuleNode)
155
- parent_ref_rules(child) if child.is_a?(Tree::DirectiveNode)
156
+ nest_seqs(child) if child.is_a?(Tree::DirectiveNode)
156
157
  next child
157
158
  end
158
159
 
159
- first, rest = child.rule.first.scan(/\A(&?(?: .|[^ ])[^.#: \[]*)([.#: \[].*)?\Z/m).first
160
+ seq = first_seq(child)
161
+ seq.members.reject! {|sseq| sseq == "\n"}
162
+ first, rest = seq.members.first, seq.members[1..-1]
160
163
 
161
- if current_rule.nil? || current_rule.rule.first != first
162
- current_rule = Tree::RuleNode.new([first])
164
+ if current_rule.nil? || first_sseq(current_rule) != first
165
+ current_rule = Tree::RuleNode.new([])
166
+ current_rule.parsed_rules = make_seq(first)
163
167
  end
164
168
 
165
- if rest
166
- child.rule = ["&" + rest]
169
+ unless rest.empty?
170
+ child.parsed_rules = make_seq(*rest)
167
171
  current_rule << child
168
172
  else
169
173
  current_rule.children += child.children
@@ -174,32 +178,57 @@ module Sass
174
178
  root.children.compact!
175
179
  root.children.uniq!
176
180
 
177
- root.children.each { |v| parent_ref_rules(v) }
181
+ root.children.each {|v| nest_seqs(v)}
178
182
  end
179
183
 
180
- # Remove useless parent refs so that
184
+ # Make rules use parent refs so that
181
185
  #
182
186
  # foo
183
- # & bar
184
- # color: blue
187
+ # color: green
188
+ # foo.bar
189
+ # color: blue
185
190
  #
186
191
  # becomes
187
192
  #
188
193
  # foo
189
- # bar
194
+ # color: green
195
+ # &.bar
190
196
  # color: blue
191
197
  #
192
198
  # @param root [Tree::Node] The parent node
193
- def remove_parent_refs(root)
194
- root.children.each do |child|
195
- case child
196
- when Tree::RuleNode
197
- child.rule.first.gsub! /^& +/, ''
198
- remove_parent_refs child
199
- when Tree::DirectiveNode
200
- remove_parent_refs child
199
+ def parent_ref_rules(root)
200
+ current_rule = nil
201
+ root.children.map! do |child|
202
+ unless child.is_a?(Tree::RuleNode)
203
+ parent_ref_rules(child) if child.is_a?(Tree::DirectiveNode)
204
+ next child
205
+ end
206
+
207
+ sseq = first_sseq(child)
208
+ next child unless sseq.is_a?(Sass::Selector::SimpleSequence)
209
+
210
+ firsts, rest = [sseq.members.first], sseq.members[1..-1]
211
+ firsts.push rest.shift if firsts.first.is_a?(Sass::Selector::Parent)
212
+
213
+ if current_rule.nil? || first_sseq(current_rule).members != firsts
214
+ current_rule = Tree::RuleNode.new([])
215
+ current_rule.parsed_rules = make_sseq(*firsts)
216
+ end
217
+
218
+ unless rest.empty?
219
+ rest.unshift Sass::Selector::Parent.new
220
+ child.parsed_rules = make_sseq(*rest)
221
+ current_rule << child
222
+ else
223
+ current_rule.children += child.children
201
224
  end
225
+
226
+ current_rule
202
227
  end
228
+ root.children.compact!
229
+ root.children.uniq!
230
+
231
+ root.children.each {|v| parent_ref_rules(v)}
203
232
  end
204
233
 
205
234
  # Flatten rules so that
@@ -236,7 +265,7 @@ module Sass
236
265
  end
237
266
  end
238
267
 
239
- # Flattens a single rule
268
+ # Flattens a single rule.
240
269
  #
241
270
  # @param rule [Tree::RuleNode] The candidate for flattening
242
271
  # @see #flatten_rules
@@ -244,10 +273,10 @@ module Sass
244
273
  while rule.children.size == 1 && rule.children.first.is_a?(Tree::RuleNode)
245
274
  child = rule.children.first
246
275
 
247
- if child.rule.first[0] == ?&
248
- rule.rule = [child.rule.first.gsub(/^&/, rule.rule.first)]
276
+ if first_simple_sel(child).is_a?(Sass::Selector::Parent)
277
+ rule.parsed_rules = child.parsed_rules.resolve_parent_refs(rule.parsed_rules)
249
278
  else
250
- rule.rule = ["#{rule.rule.first} #{child.rule.first}"]
279
+ rule.parsed_rules = make_seq(first_sseq(rule), *first_seq(child).members)
251
280
  end
252
281
 
253
282
  rule.children = child.children
@@ -280,7 +309,7 @@ module Sass
280
309
  end
281
310
 
282
311
  if prev_rule && prev_rule.children == child.children
283
- prev_rule.rule.first << ", #{child.rule.first}"
312
+ prev_rule.parsed_rules.members << first_seq(child)
284
313
  next nil
285
314
  end
286
315
 
@@ -290,5 +319,72 @@ module Sass
290
319
  end
291
320
  root.children.compact!
292
321
  end
322
+
323
+ # Dump all the parsed {Sass::Tree::RuleNode} selectors to strings.
324
+ #
325
+ # @param root [Tree::Node] The parent node
326
+ def dump_selectors(root)
327
+ root.children.each do |child|
328
+ next dump_selectors(child) if child.is_a?(Tree::DirectiveNode)
329
+ next unless child.is_a?(Tree::RuleNode)
330
+ child.rule = [child.parsed_rules.to_s]
331
+ dump_selectors(child)
332
+ end
333
+ end
334
+
335
+ # Create a {Sass::Selector::CommaSequence}.
336
+ #
337
+ # @param seqs [Array<Sass::Selector::Sequence>]
338
+ # @return [Sass::Selector::CommaSequence]
339
+ def make_cseq(*seqs)
340
+ Sass::Selector::CommaSequence.new(seqs)
341
+ end
342
+
343
+ # Create a {Sass::Selector::CommaSequence} containing only a single
344
+ # {Sass::Selector::Sequence}.
345
+ #
346
+ # @param sseqs [Array<Sass::Selector::Sequence, String>]
347
+ # @return [Sass::Selector::CommaSequence]
348
+ def make_seq(*sseqs)
349
+ make_cseq(Sass::Selector::Sequence.new(sseqs))
350
+ end
351
+
352
+ # Create a {Sass::Selector::CommaSequence} containing only a single
353
+ # {Sass::Selector::Sequence} which in turn contains only a single
354
+ # {Sass::Selector::SimpleSequence}.
355
+ #
356
+ # @param sseqs [Array<Sass::Selector::Sequence, String>]
357
+ # @return [Sass::Selector::CommaSequence]
358
+ def make_sseq(*sseqs)
359
+ make_seq(Sass::Selector::SimpleSequence.new(sseqs))
360
+ end
361
+
362
+ # Return the first {Sass::Selector::Sequence} in a {Sass::Tree::RuleNode}.
363
+ #
364
+ # @param rule [Sass::Tree::RuleNode]
365
+ # @return [Sass::Selector::Sequence]
366
+ def first_seq(rule)
367
+ rule.parsed_rules.members.first
368
+ end
369
+
370
+ # Return the first {Sass::Selector::SimpleSequence} in a
371
+ # {Sass::Tree::RuleNode}.
372
+ #
373
+ # @param rule [Sass::Tree::RuleNode]
374
+ # @return [Sass::Selector::SimpleSequence, String]
375
+ def first_sseq(rule)
376
+ first_seq(rule).members.first
377
+ end
378
+
379
+ # Return the first {Sass::Selector::Simple} in a {Sass::Tree::RuleNode},
380
+ # unless the rule begins with a combinator.
381
+ #
382
+ # @param rule [Sass::Tree::RuleNode]
383
+ # @return [Sass::Selector::Simple?]
384
+ def first_simple_sel(rule)
385
+ sseq = first_sseq(rule)
386
+ return unless sseq.is_a?(Sass::Selector::SimpleSequence)
387
+ sseq.members.first
388
+ end
293
389
  end
294
390
  end
@@ -777,8 +777,10 @@ WARNING
777
777
 
778
778
  val = scanner[1] || scanner[2]
779
779
  scanner.scan(/\s*/)
780
- if media = scanner.scan(/[^,;].*/)
780
+ if media = scanner.scan(/[a-zA-Z].*/)
781
781
  Tree::DirectiveNode.new("@import #{str || uri} #{media}")
782
+ elsif !scanner.match?(/[,;]|$/)
783
+ raise SyntaxError.new("Invalid @import: \"#{str || uri} #{scanner.rest}\"")
782
784
  elsif uri
783
785
  Tree::DirectiveNode.new("@import #{uri}")
784
786
  elsif val =~ /^http:\/\//
@@ -5,6 +5,7 @@ require 'sass'
5
5
  require 'sass/callbacks'
6
6
  require 'sass/plugin/configuration'
7
7
  require 'sass/plugin/staleness_checker'
8
+ require 'sass/plugin/listener'
8
9
 
9
10
  module Sass::Plugin
10
11
 
@@ -218,10 +219,10 @@ module Sass::Plugin
218
219
  #
219
220
  # Before the watching starts in earnest, `watch` calls \{#update\_stylesheets}.
220
221
  #
221
- # Note that `watch` uses the [FSSM](http://github.com/ttilley/fssm) library
222
+ # Note that `watch` uses the [Listen](http://github.com/guard/listen) library
222
223
  # to monitor the filesystem for changes.
223
- # FSSM isn't loaded until `watch` is run.
224
- # The version of FSSM distributed with Sass is loaded by default,
224
+ # Listen isn't loaded until `watch` is run.
225
+ # The version of Listen distributed with Sass is loaded by default,
225
226
  # but if another version has already been loaded that will be used instead.
226
227
  #
227
228
  # @param individual_files [Array<(String, String)>]
@@ -234,15 +235,15 @@ module Sass::Plugin
234
235
  update_stylesheets(individual_files)
235
236
 
236
237
  begin
237
- require 'fssm'
238
+ require 'listen'
238
239
  rescue LoadError => e
239
- dir = Sass::Util.scope("vendor/fssm/lib")
240
+ dir = Sass::Util.scope("vendor/listen/lib")
240
241
  if $LOAD_PATH.include?(dir)
241
242
  e.message << "\n" <<
242
243
  if File.exists?(scope(".git"))
243
244
  'Run "git submodule update --init" to get the recommended version.'
244
245
  else
245
- 'Run "gem install fssm" to get it.'
246
+ 'Run "gem install listen" to get it.'
246
247
  end
247
248
  raise e
248
249
  else
@@ -251,59 +252,51 @@ module Sass::Plugin
251
252
  end
252
253
  end
253
254
 
254
- unless individual_files.empty? && FSSM::Backends::Default.name == "FSSM::Backends::FSEvents"
255
- # As of FSSM 0.1.4, it doesn't support FSevents on individual files,
256
- # but it also isn't smart enough to switch to polling itself.
257
- require 'fssm/backends/polling'
258
- Sass::Util.silence_warnings do
259
- FSSM::Backends.const_set(:Default, FSSM::Backends::Polling)
260
- end
261
- end
262
-
263
255
  # TODO: Keep better track of what depends on what
264
256
  # so we don't have to run a global update every time anything changes.
265
- FSSM.monitor do |mon|
257
+ Sass::Plugin::Listener.new do |l|
266
258
  template_location_array.each do |template_location, css_location|
267
- mon.path template_location do |path|
268
- path.glob '**/*.s[ac]ss'
269
-
270
- path.update do |base, relative|
259
+ l.directory(template_location, {
260
+ :modified => lambda do |base, relative|
261
+ next if relative !~ /\.s[ac]ss$/
271
262
  run_template_modified File.join(base, relative)
272
263
  update_stylesheets(individual_files)
273
- end
264
+ end,
274
265
 
275
- path.create do |base, relative|
266
+ :added => lambda do |base, relative|
267
+ next if relative !~ /\.s[ac]ss$/
276
268
  run_template_created File.join(base, relative)
277
269
  update_stylesheets(individual_files)
278
- end
270
+ end,
279
271
 
280
- path.delete do |base, relative|
272
+ :removed => lambda do |base, relative|
273
+ next if relative !~ /\.s[ac]ss$/
281
274
  run_template_deleted File.join(base, relative)
282
275
  css = File.join(css_location, relative.gsub(/\.s[ac]ss$/, '.css'))
283
276
  try_delete_css css
284
277
  update_stylesheets(individual_files)
285
278
  end
286
- end
279
+ })
287
280
  end
288
281
 
289
282
  individual_files.each do |template, css|
290
- mon.file template do |path|
291
- path.update do
283
+ l.file(template, {
284
+ :modified => lambda do
292
285
  run_template_modified template
293
286
  update_stylesheets(individual_files)
294
- end
287
+ end,
295
288
 
296
- path.create do
289
+ :added => lambda do
297
290
  run_template_created template
298
291
  update_stylesheets(individual_files)
299
- end
292
+ end,
300
293
 
301
- path.delete do
294
+ :removed => lambda do
302
295
  run_template_deleted template
303
296
  try_delete_css css
304
297
  update_stylesheets(individual_files)
305
298
  end
306
- end
299
+ })
307
300
  end
308
301
  end
309
302
  end