sass 3.3.0.rc.6 → 3.3.0

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 (52) hide show
  1. checksums.yaml +5 -13
  2. data/VERSION +1 -1
  3. data/VERSION_DATE +1 -1
  4. data/lib/sass/exec.rb +2 -2
  5. data/lib/sass/importers/filesystem.rb +7 -7
  6. data/lib/sass/plugin/compiler.rb +1 -2
  7. data/lib/sass/selector/simple.rb +12 -2
  8. data/lib/sass/source/map.rb +2 -4
  9. data/lib/sass/tree/visitors/to_css.rb +9 -8
  10. data/lib/sass/util.rb +11 -0
  11. data/test/sass/extend_test.rb +10 -0
  12. data/vendor/listen/CHANGELOG.md +228 -0
  13. data/vendor/listen/CONTRIBUTING.md +38 -0
  14. data/vendor/listen/Gemfile +30 -0
  15. data/vendor/listen/Guardfile +8 -0
  16. data/vendor/listen/LICENSE +20 -0
  17. data/vendor/listen/README.md +315 -0
  18. data/vendor/listen/Rakefile +47 -0
  19. data/vendor/listen/Vagrantfile +96 -0
  20. data/vendor/listen/lib/listen.rb +40 -0
  21. data/vendor/listen/lib/listen/adapter.rb +214 -0
  22. data/vendor/listen/lib/listen/adapters/bsd.rb +112 -0
  23. data/vendor/listen/lib/listen/adapters/darwin.rb +85 -0
  24. data/vendor/listen/lib/listen/adapters/linux.rb +113 -0
  25. data/vendor/listen/lib/listen/adapters/polling.rb +67 -0
  26. data/vendor/listen/lib/listen/adapters/windows.rb +87 -0
  27. data/vendor/listen/lib/listen/dependency_manager.rb +126 -0
  28. data/vendor/listen/lib/listen/directory_record.rb +371 -0
  29. data/vendor/listen/lib/listen/listener.rb +225 -0
  30. data/vendor/listen/lib/listen/multi_listener.rb +143 -0
  31. data/vendor/listen/lib/listen/turnstile.rb +28 -0
  32. data/vendor/listen/lib/listen/version.rb +3 -0
  33. data/vendor/listen/listen.gemspec +22 -0
  34. data/vendor/listen/spec/listen/adapter_spec.rb +183 -0
  35. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +36 -0
  36. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +37 -0
  37. data/vendor/listen/spec/listen/adapters/linux_spec.rb +47 -0
  38. data/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
  39. data/vendor/listen/spec/listen/adapters/windows_spec.rb +30 -0
  40. data/vendor/listen/spec/listen/dependency_manager_spec.rb +107 -0
  41. data/vendor/listen/spec/listen/directory_record_spec.rb +1225 -0
  42. data/vendor/listen/spec/listen/listener_spec.rb +169 -0
  43. data/vendor/listen/spec/listen/multi_listener_spec.rb +174 -0
  44. data/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
  45. data/vendor/listen/spec/listen_spec.rb +73 -0
  46. data/vendor/listen/spec/spec_helper.rb +21 -0
  47. data/vendor/listen/spec/support/adapter_helper.rb +629 -0
  48. data/vendor/listen/spec/support/directory_record_helper.rb +55 -0
  49. data/vendor/listen/spec/support/fixtures_helper.rb +29 -0
  50. data/vendor/listen/spec/support/listeners_helper.rb +156 -0
  51. data/vendor/listen/spec/support/platform_helper.rb +15 -0
  52. metadata +275 -234
@@ -0,0 +1,21 @@
1
+ require 'listen'
2
+
3
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
4
+
5
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
6
+ RSpec.configure do |config|
7
+ config.color_enabled = true
8
+ config.order = :random
9
+ config.filter_run :focus => true
10
+ config.treat_symbols_as_metadata_keys_with_true_values = true
11
+ config.run_all_when_everything_filtered = true
12
+ config.filter_run_excluding :broken => true
13
+ config.fail_fast = true
14
+ end
15
+
16
+ def test_latency
17
+ 0.1
18
+ end
19
+
20
+ # Crash loud in tests!
21
+ Thread.abort_on_exception = true
@@ -0,0 +1,629 @@
1
+ # Adapter watch
2
+ #
3
+ # @param [Listen::Listener] listener the adapter listener
4
+ # @param [String] path the path to watch
5
+ #
6
+ def watch(listener, expected_changes, *paths)
7
+ callback = lambda { |changed_dirs, options| @called = true; listener.on_change(changed_dirs) }
8
+ @adapter = Listen::Adapter.select_and_initialize(paths, { :report_changes => false, :latency => test_latency }, &callback)
9
+
10
+ forced_stop = false
11
+ prevent_deadlock = Proc.new { sleep(10); puts "Forcing stop"; @adapter.stop; forced_stop = true }
12
+
13
+ @adapter.start(false)
14
+
15
+ yield
16
+
17
+ t = Thread.new(&prevent_deadlock)
18
+ @adapter.wait_for_changes(expected_changes)
19
+
20
+ unless forced_stop
21
+ Thread.kill(t)
22
+ @adapter.report_changes
23
+ end
24
+ ensure
25
+ unless forced_stop
26
+ Thread.kill(t) if t
27
+ @adapter.stop
28
+ end
29
+ end
30
+
31
+ shared_examples_for 'a filesystem adapter' do
32
+ subject { described_class.new(File.dirname(__FILE__), &Proc.new {}) }
33
+
34
+ describe '#start' do
35
+ after { subject.stop }
36
+
37
+ context 'with the blocking param set to true' do
38
+ it 'blocks the current thread after starting the workers' do
39
+ @called = false
40
+ t = Thread.new { subject.start(true); @called = true }
41
+ sleep(test_latency * 3)
42
+ Thread.kill(t) if t
43
+ @called.should be_false
44
+ end
45
+ end
46
+
47
+ context 'with the blocking param set to false' do
48
+ it 'does not block the current thread after starting the workers' do
49
+ @called = false
50
+ t = Thread.new { subject.start(false); @called = true }
51
+ sleep(test_latency * 3)
52
+ Thread.kill(t) if t
53
+ @called.should be_true
54
+ end
55
+ end
56
+ end
57
+
58
+ describe '#started?' do
59
+ context 'with a new adapter' do
60
+ it 'returns false' do
61
+ subject.should_not be_started
62
+ end
63
+ end
64
+
65
+ context 'with a stopped adapter' do
66
+ before { subject.start(false); subject.stop }
67
+
68
+ it 'returns false' do
69
+ subject.should_not be_started
70
+ end
71
+ end
72
+
73
+ context 'with a started adapter' do
74
+ before { subject.start(false) }
75
+ after { subject.stop }
76
+
77
+ it 'returns true' do
78
+ subject.should be_started
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ shared_examples_for 'an adapter that call properly listener#on_change' do |*args|
85
+ options = (args.first && args.first.is_a?(Hash)) ? args.first : {}
86
+ let(:listener) { mock(Listen::Listener) }
87
+ before { described_class.stub(:works?) { true } }
88
+
89
+ context 'single file operations' do
90
+ context 'when a file is created' do
91
+ it 'detects the added file' do
92
+ fixtures do |path|
93
+ listener.should_receive(:on_change).once.with do |array|
94
+ array.should include(path)
95
+ end
96
+
97
+ watch(listener, 1, path) do
98
+ touch 'new_file.rb'
99
+ end
100
+ end
101
+ end
102
+
103
+ context 'given a symlink', :unless => windows? do
104
+ it 'detects the added file' do
105
+ fixtures do |path|
106
+ listener.should_receive(:on_change).once.with do |array|
107
+ array.should include(path)
108
+ end
109
+
110
+ touch 'new_file.rb'
111
+
112
+ watch(listener, 1, path) do
113
+ ln_s 'new_file.rb', 'new_file_symlink.rb'
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ context 'given a new created directory' do
120
+ it 'detects the added file' do
121
+ fixtures do |path|
122
+ listener.should_receive(:on_change).once.with do |array|
123
+ array.should include(path, "#{path}/a_directory")
124
+ end
125
+
126
+ watch(listener, 2, path) do
127
+ mkdir 'a_directory'
128
+ # Needed for INotify, because of :recursive rb-inotify custom flag?
129
+ sleep 0.05
130
+ touch 'a_directory/new_file.rb'
131
+ end
132
+ end
133
+ end
134
+ end
135
+
136
+ context 'given an existing directory' do
137
+ it 'detects the added file' do
138
+ fixtures do |path|
139
+ listener.should_receive(:on_change).once.with do |array|
140
+ array.should include("#{path}/a_directory")
141
+ end
142
+
143
+ mkdir 'a_directory'
144
+
145
+ watch(listener, 1, path) do
146
+ touch 'a_directory/new_file.rb'
147
+ end
148
+ end
149
+ end
150
+ end
151
+
152
+ context 'given a directory with subdirectories' do
153
+ it 'detects the added file' do
154
+ fixtures do |path|
155
+ listener.should_receive(:on_change).once.with do |array|
156
+ array.should include("#{path}/a_directory/subdirectory")
157
+ end
158
+
159
+ mkdir_p 'a_directory/subdirectory'
160
+
161
+ watch(listener, 1, path) do
162
+ touch 'a_directory/subdirectory/new_file.rb'
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
168
+
169
+ context 'when a file is modified' do
170
+ it 'detects the modified file' do
171
+ fixtures do |path|
172
+ listener.should_receive(:on_change).once.with do |array|
173
+ array.should include(path)
174
+ end
175
+
176
+ touch 'existing_file.txt'
177
+
178
+ watch(listener, 1, path) do
179
+ touch 'existing_file.txt'
180
+ end
181
+ end
182
+ end
183
+
184
+ context 'given a symlink', :unless => windows? do
185
+ it 'detects the modified file' do
186
+ fixtures do |path|
187
+ listener.should_receive(:on_change).once.with do |array|
188
+ array.should include(path)
189
+ end
190
+
191
+ touch 'existing_file.rb'
192
+ ln_s 'existing_file.rb', 'existing_file_symlink.rb'
193
+
194
+ watch(listener, 1, path) do
195
+ touch 'existing_file.rb'
196
+ end
197
+ end
198
+ end
199
+ end
200
+
201
+ context 'given a hidden file' do
202
+ it 'detects the modified file' do
203
+ fixtures do |path|
204
+ listener.should_receive(:on_change).once.with do |array|
205
+ array.should include(path)
206
+ end
207
+
208
+ touch '.hidden'
209
+
210
+ watch(listener, 1, path) do
211
+ touch '.hidden'
212
+ end
213
+ end
214
+ end
215
+ end
216
+
217
+ context 'given a file mode change', :unless => windows? do
218
+ it 'does not detect the mode change' do
219
+ fixtures do |path|
220
+ listener.should_receive(:on_change).once.with do |array|
221
+ array.should include(path)
222
+ end
223
+
224
+ touch 'run.rb'
225
+
226
+ watch(listener, 1, path) do
227
+ chmod 0777, 'run.rb'
228
+ end
229
+ end
230
+ end
231
+ end
232
+
233
+ context 'given an existing directory' do
234
+ it 'detects the modified file' do
235
+ fixtures do |path|
236
+ listener.should_receive(:on_change).once.with do |array|
237
+ array.should include("#{path}/a_directory")
238
+ end
239
+
240
+ mkdir 'a_directory'
241
+ touch 'a_directory/existing_file.txt'
242
+
243
+ watch(listener, 1, path) do
244
+ touch 'a_directory/existing_file.txt'
245
+ end
246
+ end
247
+ end
248
+ end
249
+
250
+ context 'given a directory with subdirectories' do
251
+ it 'detects the modified file' do
252
+ fixtures do |path|
253
+ listener.should_receive(:on_change).once.with do |array|
254
+ array.should include("#{path}/a_directory/subdirectory")
255
+ end
256
+
257
+ mkdir_p 'a_directory/subdirectory'
258
+ touch 'a_directory/subdirectory/existing_file.txt'
259
+
260
+ watch(listener, 1, path) do
261
+ touch 'a_directory/subdirectory/new_file.rb'
262
+ end
263
+ end
264
+ end
265
+ end
266
+ end
267
+
268
+ context 'when a file is moved' do
269
+ it 'detects the file move' do
270
+ fixtures do |path|
271
+ listener.should_receive(:on_change).once.with do |array|
272
+ array.should include(path)
273
+ end
274
+
275
+ touch 'move_me.txt'
276
+
277
+ watch(listener, 1, path) do
278
+ mv 'move_me.txt', 'new_name.txt'
279
+ end
280
+ end
281
+ end
282
+
283
+ context 'given a symlink', :unless => windows? do
284
+ it 'detects the file move' do
285
+ fixtures do |path|
286
+ listener.should_receive(:on_change).once.with do |array|
287
+ array.should include(path)
288
+ end
289
+
290
+ touch 'move_me.rb'
291
+ ln_s 'move_me.rb', 'move_me_symlink.rb'
292
+
293
+ watch(listener, 1, path) do
294
+ mv 'move_me_symlink.rb', 'new_symlink.rb'
295
+ end
296
+ end
297
+ end
298
+ end
299
+
300
+ context 'given an existing directory' do
301
+ it 'detects the file move into the directory' do
302
+ fixtures do |path|
303
+ listener.should_receive(:on_change).once.with do |array|
304
+ array.should include(path, "#{path}/a_directory")
305
+ end
306
+
307
+ mkdir 'a_directory'
308
+ touch 'move_me.txt'
309
+
310
+ watch(listener, 2, path) do
311
+ mv 'move_me.txt', 'a_directory/move_me.txt'
312
+ end
313
+ end
314
+ end
315
+
316
+ it 'detects a file move out of the directory' do
317
+ fixtures do |path|
318
+ listener.should_receive(:on_change).once.with do |array|
319
+ array.should include(path, "#{path}/a_directory")
320
+ end
321
+
322
+ mkdir 'a_directory'
323
+ touch 'a_directory/move_me.txt'
324
+
325
+ watch(listener, 2, path) do
326
+ mv 'a_directory/move_me.txt', 'i_am_here.txt'
327
+ end
328
+ end
329
+ end
330
+
331
+ it 'detects a file move between two directories' do
332
+ fixtures do |path|
333
+ listener.should_receive(:on_change).once.with do |array|
334
+ array.should include("#{path}/from_directory", "#{path}/to_directory")
335
+ end
336
+
337
+ mkdir 'from_directory'
338
+ touch 'from_directory/move_me.txt'
339
+ mkdir 'to_directory'
340
+
341
+ watch(listener, 2, path) do
342
+ mv 'from_directory/move_me.txt', 'to_directory/move_me.txt'
343
+ end
344
+ end
345
+ end
346
+ end
347
+
348
+ context 'given a directory with subdirectories' do
349
+ it 'detects files movements between subdirectories' do
350
+ fixtures do |path|
351
+ listener.should_receive(:on_change).once.with do |array|
352
+ array.should include("#{path}/a_directory/subdirectory", "#{path}/b_directory/subdirectory")
353
+ end
354
+
355
+ mkdir_p 'a_directory/subdirectory'
356
+ mkdir_p 'b_directory/subdirectory'
357
+ touch 'a_directory/subdirectory/move_me.txt'
358
+
359
+ watch(listener, 2, path) do
360
+ mv 'a_directory/subdirectory/move_me.txt', 'b_directory/subdirectory'
361
+ end
362
+ end
363
+ end
364
+ end
365
+ end
366
+
367
+ context 'when a file is deleted' do
368
+ it 'detects the file removal' do
369
+ fixtures do |path|
370
+ listener.should_receive(:on_change).once.with do |array|
371
+ array.should include(path)
372
+ end
373
+
374
+ touch 'unnecessary.txt'
375
+
376
+ watch(listener, 1, path) do
377
+ rm 'unnecessary.txt'
378
+ end
379
+ end
380
+ end
381
+
382
+ context 'given a symlink', :unless => windows? do
383
+ it 'detects the file removal' do
384
+ fixtures do |path|
385
+ listener.should_receive(:on_change).once.with do |array|
386
+ array.should include(path)
387
+ end
388
+
389
+ touch 'unnecessary.rb'
390
+ ln_s 'unnecessary.rb', 'unnecessary_symlink.rb'
391
+
392
+ watch(listener, 1, path) do
393
+ rm 'unnecessary_symlink.rb'
394
+ end
395
+ end
396
+ end
397
+ end
398
+
399
+ context 'given an existing directory' do
400
+ it 'detects the file removal' do
401
+ fixtures do |path|
402
+ listener.should_receive(:on_change).once.with do |array|
403
+ array.should include("#{path}/a_directory")
404
+ end
405
+
406
+ mkdir 'a_directory'
407
+ touch 'a_directory/do_not_use.rb'
408
+
409
+ watch(listener, 1, path) do
410
+ rm 'a_directory/do_not_use.rb'
411
+ end
412
+ end
413
+ end
414
+ end
415
+
416
+ context 'given a directory with subdirectories' do
417
+ it 'detects the file removal' do
418
+ fixtures do |path|
419
+ listener.should_receive(:on_change).once.with do |array|
420
+ array.should include("#{path}/a_directory/subdirectory")
421
+ end
422
+
423
+ mkdir_p 'a_directory/subdirectory'
424
+ touch 'a_directory/subdirectory/do_not_use.rb'
425
+
426
+ watch(listener, 1, path) do
427
+ rm 'a_directory/subdirectory/do_not_use.rb'
428
+ end
429
+ end
430
+ end
431
+ end
432
+ end
433
+ end
434
+
435
+ context 'multiple file operations' do
436
+ it 'detects the added files' do
437
+ fixtures do |path|
438
+ listener.should_receive(:on_change).once.with do |array|
439
+ array.should include(path, "#{path}/a_directory")
440
+ end
441
+
442
+ watch(listener, 2, path) do
443
+ touch 'a_file.rb'
444
+ touch 'b_file.rb'
445
+ mkdir 'a_directory'
446
+ # Needed for INotify, because of :recursive rb-inotify custom flag?
447
+ # Also needed for the osx adapter
448
+ sleep 0.05
449
+ touch 'a_directory/a_file.rb'
450
+ touch 'a_directory/b_file.rb'
451
+ end
452
+ end
453
+ end
454
+
455
+ it 'detects the modified files' do
456
+ fixtures do |path|
457
+ listener.should_receive(:on_change).once.with do |array|
458
+ array.should include(path, "#{path}/a_directory")
459
+ end
460
+
461
+ touch 'a_file.rb'
462
+ touch 'b_file.rb'
463
+ mkdir 'a_directory'
464
+ touch 'a_directory/a_file.rb'
465
+ touch 'a_directory/b_file.rb'
466
+
467
+ watch(listener, 2, path) do
468
+ touch 'b_file.rb'
469
+ touch 'a_directory/a_file.rb'
470
+ end
471
+ end
472
+ end
473
+
474
+ it 'detects the removed files' do
475
+ fixtures do |path|
476
+ listener.should_receive(:on_change).once.with do |array|
477
+ array.should include(path, "#{path}/a_directory")
478
+ end
479
+
480
+ touch 'a_file.rb'
481
+ touch 'b_file.rb'
482
+ mkdir 'a_directory'
483
+ touch 'a_directory/a_file.rb'
484
+ touch 'a_directory/b_file.rb'
485
+
486
+ watch(listener, 2, path) do
487
+ rm 'b_file.rb'
488
+ rm 'a_directory/a_file.rb'
489
+ end
490
+ end
491
+ end
492
+ end
493
+
494
+ context 'single directory operations' do
495
+ it 'detects a moved directory' do
496
+ fixtures do |path|
497
+ listener.should_receive(:on_change).once.with do |array|
498
+ array.should include(path)
499
+ end
500
+
501
+ mkdir 'a_directory'
502
+ touch 'a_directory/a_file.rb'
503
+ touch 'a_directory/b_file.rb'
504
+
505
+ watch(listener, 1, path) do
506
+ mv 'a_directory', 'renamed'
507
+ end
508
+ end
509
+ end
510
+
511
+ it 'detects a removed directory' do
512
+ fixtures do |path|
513
+ listener.should_receive(:on_change).once.with do |array|
514
+ array.should include(path, "#{path}/a_directory")
515
+ end
516
+
517
+ mkdir 'a_directory'
518
+ touch 'a_directory/a_file.rb'
519
+ touch 'a_directory/b_file.rb'
520
+
521
+ watch(listener, 2, path) do
522
+ rm_rf 'a_directory'
523
+ end
524
+ end
525
+ end
526
+ end
527
+
528
+ context "paused adapter" do
529
+ context 'when a file is created' do
530
+ it "doesn't detects the added file" do
531
+ fixtures do |path|
532
+ watch(listener, 1, path) do # The expected changes param is set to one!
533
+ @adapter.paused = true
534
+ touch 'new_file.rb'
535
+ end
536
+ @called.should be_nil
537
+ end
538
+ end
539
+ end
540
+ end
541
+
542
+ context "when multiple directories are listened to" do
543
+ context 'when files are added to one of multiple directories' do
544
+ it 'detects added files' do
545
+ fixtures(2) do |path1, path2|
546
+ listener.should_receive(:on_change).once.with do |array|
547
+ array.should include(path2)
548
+ end
549
+
550
+ watch(listener, 1, path1, path2) do
551
+ touch "#{path2}/new_file.rb"
552
+ end
553
+ end
554
+ end
555
+ end
556
+
557
+ context 'when files are added to multiple directories' do
558
+ it 'detects added files' do
559
+ fixtures(2) do |path1, path2|
560
+ listener.should_receive(:on_change).once.with do |array|
561
+ array.should include(path1, path2)
562
+ end
563
+
564
+ watch(listener, 2, path1, path2) do
565
+ touch "#{path1}/new_file.rb"
566
+ touch "#{path2}/new_file.rb"
567
+ end
568
+ end
569
+ end
570
+ end
571
+
572
+ context 'given a new and an existing directory on multiple directories' do
573
+ it 'detects the added file' do
574
+ fixtures(2) do |path1, path2|
575
+ listener.should_receive(:on_change).once.with do |array|
576
+ array.should include(path2, "#{path1}/a_directory", "#{path2}/b_directory")
577
+ end
578
+
579
+ mkdir "#{path1}/a_directory"
580
+
581
+ watch(listener, 3, path1, path2) do
582
+ mkdir "#{path2}/b_directory"
583
+ # Needed for INotify
584
+ sleep 0.05
585
+ touch "#{path1}/a_directory/new_file.rb"
586
+ touch "#{path2}/b_directory/new_file.rb"
587
+ end
588
+ end
589
+ end
590
+ end
591
+
592
+ context 'when a file is moved between the multiple watched directories' do
593
+ it 'detects the movements of the file' do
594
+ fixtures(3) do |path1, path2, path3|
595
+ listener.should_receive(:on_change).once.with do |array|
596
+ array.should include("#{path1}/from_directory", path2, "#{path3}/to_directory")
597
+ end
598
+
599
+ mkdir "#{path1}/from_directory"
600
+ touch "#{path1}/from_directory/move_me.txt"
601
+ mkdir "#{path3}/to_directory"
602
+
603
+ watch(listener, 3, path1, path2, path3) do
604
+ mv "#{path1}/from_directory/move_me.txt", "#{path2}/move_me.txt"
605
+ mv "#{path2}/move_me.txt", "#{path3}/to_directory/move_me.txt"
606
+ end
607
+ end
608
+ end
609
+ end
610
+
611
+ context 'when files are deleted from the multiple watched directories' do
612
+ it 'detects the files removal' do
613
+ fixtures(2) do |path1, path2|
614
+ listener.should_receive(:on_change).once.with do |array|
615
+ array.should include(path1, path2)
616
+ end
617
+
618
+ touch "#{path1}/unnecessary.txt"
619
+ touch "#{path2}/unnecessary.txt"
620
+
621
+ watch(listener, 2, path1, path2) do
622
+ rm "#{path1}/unnecessary.txt"
623
+ rm "#{path2}/unnecessary.txt"
624
+ end
625
+ end
626
+ end
627
+ end
628
+ end
629
+ end