sass 3.2.0.alpha.104 → 3.2.0.alpha.236

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 (49) hide show
  1. data/REVISION +1 -1
  2. data/Rakefile +2 -2
  3. data/VERSION +1 -1
  4. data/lib/sass/engine.rb +8 -1
  5. data/lib/sass/exec.rb +2 -2
  6. data/lib/sass/plugin/compiler.rb +51 -43
  7. data/lib/sass/script/color.rb +4 -9
  8. data/lib/sass/script/funcall.rb +11 -2
  9. data/lib/sass/script/functions.rb +16 -30
  10. data/lib/sass/script/lexer.rb +7 -1
  11. data/lib/sass/script/list.rb +2 -2
  12. data/lib/sass/script/literal.rb +8 -0
  13. data/lib/sass/script/null.rb +34 -0
  14. data/lib/sass/script/operation.rb +4 -0
  15. data/lib/sass/script/parser.rb +4 -2
  16. data/lib/sass/scss/parser.rb +1 -5
  17. data/lib/sass/scss/rx.rb +1 -1
  18. data/lib/sass/tree/directive_node.rb +5 -0
  19. data/lib/sass/tree/media_node.rb +3 -0
  20. data/lib/sass/tree/prop_node.rb +7 -3
  21. data/lib/sass/tree/visitors/base.rb +1 -1
  22. data/lib/sass/tree/visitors/check_nesting.rb +21 -18
  23. data/lib/sass/tree/visitors/convert.rb +1 -0
  24. data/lib/sass/tree/visitors/perform.rb +3 -2
  25. data/lib/sass/tree/visitors/to_css.rb +1 -0
  26. data/lib/sass/util.rb +28 -0
  27. data/test/sass/conversion_test.rb +33 -0
  28. data/test/sass/engine_test.rb +118 -3
  29. data/test/sass/functions_test.rb +56 -24
  30. data/test/sass/script_test.rb +60 -4
  31. data/test/sass/scss/scss_test.rb +10 -0
  32. data/vendor/listen/CHANGELOG.md +19 -1
  33. data/vendor/listen/README.md +27 -12
  34. data/vendor/listen/lib/listen/adapter.rb +9 -1
  35. data/vendor/listen/lib/listen/adapters/linux.rb +18 -7
  36. data/vendor/listen/lib/listen/adapters/windows.rb +7 -8
  37. data/vendor/listen/lib/listen/directory_record.rb +108 -48
  38. data/vendor/listen/lib/listen/listener.rb +28 -11
  39. data/vendor/listen/lib/listen/multi_listener.rb +6 -6
  40. data/vendor/listen/lib/listen/version.rb +1 -1
  41. data/vendor/listen/spec/listen/adapters/linux_spec.rb +11 -0
  42. data/vendor/listen/spec/listen/directory_record_spec.rb +268 -41
  43. data/vendor/listen/spec/listen/listener_spec.rb +8 -4
  44. data/vendor/listen/spec/listen/multi_listener_spec.rb +9 -4
  45. data/vendor/listen/spec/support/adapter_helper.rb +178 -0
  46. data/vendor/listen/spec/support/directory_record_helper.rb +24 -4
  47. data/vendor/listen/spec/support/listeners_helper.rb +11 -0
  48. metadata +11 -11
  49. data/lib/sass/plugin/listener.rb +0 -61
@@ -1,21 +1,34 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Listen::DirectoryRecord do
4
- let(:base_directory) { Dir.tmpdir }
4
+ let(:base_directory) { File.dirname(__FILE__) }
5
5
 
6
6
  subject { described_class.new(base_directory) }
7
7
 
8
+ describe '.generate_default_ignoring_patterns' do
9
+ it 'creates regexp patterns from the default ignored directories and extensions' do
10
+ described_class.generate_default_ignoring_patterns.should include(
11
+ %r{^(?:\.rbx|\.bundle|\.git|\.svn|log|tmp|vendor)/},
12
+ %r{(?:\.DS_Store)$}
13
+ )
14
+ end
15
+
16
+ it 'memoizes the generated results' do
17
+ described_class.generate_default_ignoring_patterns.should equal described_class.generate_default_ignoring_patterns
18
+ end
19
+ end
20
+
8
21
  describe '#initialize' do
9
22
  it 'sets the base directory' do
10
23
  subject.directory.should eq base_directory
11
24
  end
12
25
 
13
- it 'sets the default ignored paths' do
14
- subject.ignored_paths.should =~ described_class::DEFAULT_IGNORED_PATHS
26
+ it 'sets the default ignoring patterns' do
27
+ subject.ignoring_patterns.should =~ described_class.generate_default_ignoring_patterns
15
28
  end
16
29
 
17
- it 'sets the default filters' do
18
- subject.filters.should eq []
30
+ it 'sets the default filtering patterns' do
31
+ subject.filtering_patterns.should eq []
19
32
  end
20
33
 
21
34
  it 'raises an error when the passed path does not exist' do
@@ -29,39 +42,76 @@ describe Listen::DirectoryRecord do
29
42
 
30
43
  describe '#ignore' do
31
44
  it 'adds the passed paths to the list of ignoted paths in the record' do
32
- subject.ignore('.old', '.pid')
33
- subject.ignored_paths.should include('.old', '.pid')
45
+ subject.ignore(%r{^\.old/}, %r{\.pid$})
46
+ subject.ignoring_patterns.should include(%r{^\.old/}, %r{\.pid$})
34
47
  end
35
48
  end
36
49
 
37
50
  describe '#filter' do
38
51
  it 'adds the passed regexps to the list of filters that determine the stored paths' do
39
52
  subject.filter(%r{\.(?:jpe?g|gif|png)}, %r{\.(?:mp3|ogg|a3c)})
40
- subject.filters.should include(%r{\.(?:jpe?g|gif|png)}, %r{\.(?:mp3|ogg|a3c)})
53
+ subject.filtering_patterns.should include(%r{\.(?:jpe?g|gif|png)}, %r{\.(?:mp3|ogg|a3c)})
41
54
  end
42
55
  end
43
56
 
44
57
  describe '#ignored?' do
58
+ before { subject.stub(:relative_to_base) { |path| path } }
59
+
60
+ it 'tests paths relative to the base directory' do
61
+ subject.should_receive(:relative_to_base).with('file.txt')
62
+ subject.ignored?('file.txt')
63
+ end
64
+
65
+ it 'returns true when the passed path is a default ignored path' do
66
+ subject.ignored?('tmp/some_process.pid').should be_true
67
+ subject.ignored?('dir/.DS_Store').should be_true
68
+ subject.ignored?('.git/config').should be_true
69
+ end
70
+
71
+ it 'returns false when the passed path is not a default ignored path' do
72
+ subject.ignored?('nested/tmp/some_process.pid').should be_false
73
+ subject.ignored?('nested/.git').should be_false
74
+ subject.ignored?('dir/.DS_Store/file').should be_false
75
+ subject.ignored?('file.git').should be_false
76
+ end
77
+
45
78
  it 'returns true when the passed path is ignored' do
46
- subject.ignore('.pid')
47
- subject.ignored?('/tmp/some_process.pid').should be_true
79
+ subject.ignore(%r{\.pid$})
80
+ subject.ignored?('dir/some_process.pid').should be_true
48
81
  end
49
82
 
50
83
  it 'returns false when the passed path is not ignored' do
51
- subject.ignore('.pid')
52
- subject.ignored?('/tmp/some_file.txt').should be_false
84
+ subject.ignore(%r{\.pid$})
85
+ subject.ignored?('dir/some_file.txt').should be_false
53
86
  end
54
87
  end
55
88
 
56
- describe '#filterd?' do
57
- it 'returns true when the passed path is filtered' do
58
- subject.filter(%r{\.(?:jpe?g|gif|png)})
59
- subject.filtered?('/tmp/picture.jpeg').should be_true
89
+ describe '#filtered?' do
90
+ before { subject.stub(:relative_to_base) { |path| path } }
91
+
92
+ context 'when no filtering patterns are set' do
93
+ it 'returns true for any path' do
94
+ subject.filtered?('file.txt').should be_true
95
+ end
60
96
  end
61
97
 
62
- it 'returns false when the passed path is not filtered' do
63
- subject.filter(%r{\.(?:jpe?g|gif|png)})
64
- subject.filtered?('/tmp/song.mp3').should be_false
98
+ context 'when filtering patterns are set' do
99
+ before { subject.filter(%r{\.(?:jpe?g|gif|png)}) }
100
+
101
+ it 'tests paths relative to the base directory' do
102
+ subject.should_receive(:relative_to_base).with('file.txt')
103
+ subject.filtered?('file.txt')
104
+ end
105
+
106
+ it 'returns true when the passed path is filtered' do
107
+ subject.filter(%r{\.(?:jpe?g|gif|png)})
108
+ subject.filtered?('dir/picture.jpeg').should be_true
109
+ end
110
+
111
+ it 'returns false when the passed path is not filtered' do
112
+ subject.filter(%r{\.(?:jpe?g|gif|png)})
113
+ subject.filtered?('dir/song.mp3').should be_false
114
+ end
65
115
  end
66
116
  end
67
117
 
@@ -75,9 +125,9 @@ describe Listen::DirectoryRecord do
75
125
  record = described_class.new(path)
76
126
  record.build
77
127
 
78
- record.paths[path]['file.rb'].should eq 'File'
79
- record.paths[path]['a_directory'].should eq 'Dir'
80
- record.paths["#{path}/a_directory"]['file.txt'].should eq 'File'
128
+ record.paths[path]['file.rb'].type.should eq 'File'
129
+ record.paths[path]['a_directory'].type.should eq 'Dir'
130
+ record.paths["#{path}/a_directory"]['file.txt'].type.should eq 'File'
81
131
  end
82
132
  end
83
133
 
@@ -89,7 +139,7 @@ describe Listen::DirectoryRecord do
89
139
  touch 'ignored_directory/file.txt'
90
140
 
91
141
  record = described_class.new(path)
92
- record.ignore 'ignored_directory'
142
+ record.ignore %r{^ignored_directory/}
93
143
  record.build
94
144
 
95
145
  record.paths[path]['/a_ignored_directory'].should be_nil
@@ -103,7 +153,7 @@ describe Listen::DirectoryRecord do
103
153
  touch 'ignored_file.rb'
104
154
 
105
155
  record = described_class.new(path)
106
- record.ignore 'ignored_file.rb'
156
+ record.ignore %r{^ignored_file.rb$}
107
157
  record.build
108
158
 
109
159
  record.paths[path]['ignored_file.rb'].should be_nil
@@ -125,15 +175,26 @@ describe Listen::DirectoryRecord do
125
175
  record.build
126
176
 
127
177
  record.paths[path]['file.rb'].should be_nil
128
- record.paths[path]['file.zip'].should eq 'File'
129
- record.paths[path]['a_directory'].should eq 'Dir'
130
- record.paths["#{path}/a_directory"]['file.txt'].should eq 'File'
178
+ record.paths[path]['file.zip'].type.should eq 'File'
179
+ record.paths[path]['a_directory'].type.should eq 'Dir'
180
+ record.paths["#{path}/a_directory"]['file.txt'].type.should eq 'File'
131
181
  record.paths["#{path}/a_directory"]['file.rb'].should be_nil
132
182
  end
133
183
  end
134
184
  end
135
185
  end
136
186
 
187
+ describe '#relative_to_base' do
188
+ it 'removes the path of the base-directory from the passed path' do
189
+ path = 'dir/to/app/file.rb'
190
+ subject.relative_to_base(File.join(base_directory, path)).should eq path
191
+ end
192
+
193
+ it 'returns nil when the passed path is not inside the base-directory' do
194
+ subject.relative_to_base('/tmp/some_random_path').should be_nil
195
+ end
196
+ end
197
+
137
198
  describe '#fetch_changes' do
138
199
  context 'with single file changes' do
139
200
  context 'when a file is created' do
@@ -211,7 +272,7 @@ describe Listen::DirectoryRecord do
211
272
  fixtures do |path|
212
273
  mkdir 'ignored_directory'
213
274
 
214
- modified, added, removed = changes(path, :ignore => 'ignored_directory', :recursive => true) do
275
+ modified, added, removed = changes(path, :ignore => %r{^ignored_directory/}, :recursive => true) do
215
276
  touch 'ignored_directory/new_file.rb'
216
277
  end
217
278
 
@@ -225,7 +286,7 @@ describe Listen::DirectoryRecord do
225
286
  fixtures do |path|
226
287
  mkdir 'ignored_directory'
227
288
 
228
- modified, added, removed = changes(path, :paths => ["#{path}/ignored_directory"], :ignore => 'ignored_directory', :recursive => true) do
289
+ modified, added, removed = changes(path, :paths => ["#{path}/ignored_directory"], :ignore => %r{^ignored_directory/}, :recursive => true) do
229
290
  touch 'ignored_directory/new_file.rb'
230
291
  end
231
292
 
@@ -253,6 +314,39 @@ describe Listen::DirectoryRecord do
253
314
  end
254
315
  end
255
316
  end
317
+
318
+ context 'given a directory with subdirectories' do
319
+ it 'detects the added file' do
320
+ fixtures do |path|
321
+ mkdir_p 'a_directory/subdirectory'
322
+
323
+ modified, added, removed = changes(path, :recursive => true) do
324
+ touch 'a_directory/subdirectory/new_file.rb'
325
+ end
326
+
327
+ added.should =~ %w(a_directory/subdirectory/new_file.rb)
328
+ modified.should be_empty
329
+ removed.should be_empty
330
+ end
331
+ end
332
+
333
+ context 'with an ignored directory' do
334
+ it "doesn't detect added files in neither the directory nor the subdirectory" do
335
+ fixtures do |path|
336
+ mkdir_p 'ignored_directory/subdirectory'
337
+
338
+ modified, added, removed = changes(path, :ignore => %r{^ignored_directory/}, :recursive => true) do
339
+ touch 'ignored_directory/new_file.rb'
340
+ touch 'ignored_directory/subdirectory/new_file.rb'
341
+ end
342
+
343
+ added.should be_empty
344
+ modified.should be_empty
345
+ removed.should be_empty
346
+ end
347
+ end
348
+ end
349
+ end
256
350
  end
257
351
 
258
352
  context 'when a file is modified' do
@@ -261,7 +355,7 @@ describe Listen::DirectoryRecord do
261
355
  touch 'existing_file.txt'
262
356
 
263
357
  modified, added, removed = changes(path) do
264
- sleep 1.5 # make a diffrence in the mtime of the file
358
+ sleep 1.5 # make a difference in the mtime of the file
265
359
  touch 'existing_file.txt'
266
360
  end
267
361
 
@@ -271,14 +365,17 @@ describe Listen::DirectoryRecord do
271
365
  end
272
366
  end
273
367
 
274
- context 'during the same second' do
368
+ context 'during the same second at which we are checking for changes' do
275
369
  before { ensure_same_second }
276
370
 
277
- it 'always detects the modified file the first time' do
371
+ # The following test can only be run on systems that report
372
+ # modification times in milliseconds.
373
+ it 'always detects the modified file the first time', :if => described_class::HIGH_PRECISION_SUPPORTED do
278
374
  fixtures do |path|
279
375
  touch 'existing_file.txt'
280
376
 
281
377
  modified, added, removed = changes(path) do
378
+ sleep 0.3 # make sure the mtime is changed a bit
282
379
  touch 'existing_file.txt'
283
380
  end
284
381
 
@@ -288,6 +385,23 @@ describe Listen::DirectoryRecord do
288
385
  end
289
386
  end
290
387
 
388
+ context '#27 - when a file is created and then checked for modifications at the same second' do
389
+ # This issue was the result of checking a file for content changes when
390
+ # the mtime and the checking time are the same. In this case there
391
+ # is no checksum saved, so the file was reported as being changed.
392
+ it ' does not report any changes' do
393
+ fixtures do |path|
394
+ touch 'a_file.rb'
395
+
396
+ modified, added, removed = changes(path)
397
+
398
+ added.should be_empty
399
+ modified.should be_empty
400
+ removed.should be_empty
401
+ end
402
+ end
403
+ end
404
+
291
405
  it "doesn't detects the modified file the second time if the content haven't changed" do
292
406
  fixtures do |path|
293
407
  touch 'existing_file.txt'
@@ -306,7 +420,7 @@ describe Listen::DirectoryRecord do
306
420
  end
307
421
  end
308
422
 
309
- it "detects the modified file the second time if the content have changed" do
423
+ it 'detects the modified file the second time if the content have changed' do
310
424
  fixtures do |path|
311
425
  touch 'existing_file.txt'
312
426
 
@@ -331,6 +445,7 @@ describe Listen::DirectoryRecord do
331
445
  touch '.hidden'
332
446
 
333
447
  modified, added, removed = changes(path) do
448
+ small_time_difference
334
449
  touch '.hidden'
335
450
  end
336
451
 
@@ -345,7 +460,7 @@ describe Listen::DirectoryRecord do
345
460
  it 'does not detect the mode change' do
346
461
  fixtures do |path|
347
462
  touch 'run.rb'
348
- sleep 1.5 # make a diffrence in the mtime of the file
463
+ sleep 1.5 # make a difference in the mtime of the file
349
464
 
350
465
  modified, added, removed = changes(path) do
351
466
  chmod 0777, 'run.rb'
@@ -366,6 +481,7 @@ describe Listen::DirectoryRecord do
366
481
  touch 'a_directory/existing_file.txt'
367
482
 
368
483
  modified, added, removed = changes(path, :recursive => true) do
484
+ small_time_difference
369
485
  touch 'a_directory/existing_file.txt'
370
486
  end
371
487
 
@@ -383,6 +499,7 @@ describe Listen::DirectoryRecord do
383
499
  touch 'a_directory/existing_file.txt'
384
500
 
385
501
  modified, added, removed = changes(path, :recursive => false) do
502
+ small_time_difference
386
503
  touch 'a_directory/existing_file.txt'
387
504
  end
388
505
 
@@ -393,6 +510,43 @@ describe Listen::DirectoryRecord do
393
510
  end
394
511
  end
395
512
  end
513
+
514
+ context 'given a directory with subdirectories' do
515
+ it 'detects the modified file' do
516
+ fixtures do |path|
517
+ mkdir_p 'a_directory/subdirectory'
518
+ touch 'a_directory/subdirectory/existing_file.txt'
519
+
520
+ modified, added, removed = changes(path, :recursive => true) do
521
+ small_time_difference
522
+ touch 'a_directory/subdirectory/existing_file.txt'
523
+ end
524
+
525
+ added.should be_empty
526
+ modified.should =~ %w(a_directory/subdirectory/existing_file.txt)
527
+ removed.should be_empty
528
+ end
529
+ end
530
+
531
+ context 'with an ignored subdirectory' do
532
+ it "doesn't detect the modified files in neither the directory nor the subdirectory" do
533
+ fixtures do |path|
534
+ mkdir_p 'ignored_directory/subdirectory'
535
+ touch 'ignored_directory/existing_file.txt'
536
+ touch 'ignored_directory/subdirectory/existing_file.txt'
537
+
538
+ modified, added, removed = changes(path, :ignore => %r{^ignored_directory/}, :recursive => true) do
539
+ touch 'ignored_directory/existing_file.txt'
540
+ touch 'ignored_directory/subdirectory/existing_file.txt'
541
+ end
542
+
543
+ added.should be_empty
544
+ modified.should be_empty
545
+ removed.should be_empty
546
+ end
547
+ end
548
+ end
549
+ end
396
550
  end
397
551
 
398
552
  context 'when a file is moved' do
@@ -506,7 +660,43 @@ describe Listen::DirectoryRecord do
506
660
  end
507
661
  end
508
662
 
509
- context 'with all paths are passed as params' do
663
+ context 'given a directory with subdirectories' do
664
+ it 'detects a file movement between two subdirectories' do
665
+ fixtures do |path|
666
+ mkdir_p 'a_directory/subdirectory'
667
+ mkdir_p 'b_directory/subdirectory'
668
+ touch 'a_directory/subdirectory/move_me.txt'
669
+
670
+ modified, added, removed = changes(path, :recursive => true) do
671
+ mv 'a_directory/subdirectory/move_me.txt', 'b_directory/subdirectory'
672
+ end
673
+
674
+ added.should =~ %w(b_directory/subdirectory/move_me.txt)
675
+ modified.should be_empty
676
+ removed.should =~ %w(a_directory/subdirectory/move_me.txt)
677
+ end
678
+ end
679
+
680
+ context 'with an ignored subdirectory' do
681
+ it "doesn't detect the file movement between subdirectories" do
682
+ fixtures do |path|
683
+ mkdir_p 'a_ignored_directory/subdirectory'
684
+ mkdir_p 'b_ignored_directory/subdirectory'
685
+ touch 'a_ignored_directory/subdirectory/move_me.txt'
686
+
687
+ modified, added, removed = changes(path, :ignore => %r{^(?:a|b)_ignored_directory/}, :recursive => true) do
688
+ mv 'a_ignored_directory/subdirectory/move_me.txt', 'b_ignored_directory/subdirectory'
689
+ end
690
+
691
+ added.should be_empty
692
+ modified.should be_empty
693
+ removed.should be_empty
694
+ end
695
+ end
696
+ end
697
+ end
698
+
699
+ context 'with all paths passed as params' do
510
700
  it 'detects the file movement into the directory' do
511
701
  fixtures do |path|
512
702
  mkdir 'a_directory'
@@ -635,6 +825,42 @@ describe Listen::DirectoryRecord do
635
825
  end
636
826
  end
637
827
  end
828
+
829
+ context 'given a directory with subdirectories' do
830
+ it 'detects the file removal in subdirectories' do
831
+ fixtures do |path|
832
+ mkdir_p 'a_directory/subdirectory'
833
+ touch 'a_directory/subdirectory/do_not_use.rb'
834
+
835
+ modified, added, removed = changes(path, :recursive => true) do
836
+ rm 'a_directory/subdirectory/do_not_use.rb'
837
+ end
838
+
839
+ added.should be_empty
840
+ modified.should be_empty
841
+ removed.should =~ %w(a_directory/subdirectory/do_not_use.rb)
842
+ end
843
+ end
844
+
845
+ context 'with an ignored subdirectory' do
846
+ it "doesn't detect files removals in neither the directory nor its subdirectories" do
847
+ fixtures do |path|
848
+ mkdir_p 'ignored_directory/subdirectory'
849
+ touch 'ignored_directory/do_not_use.rb'
850
+ touch 'ignored_directory/subdirectory/do_not_use.rb'
851
+
852
+ modified, added, removed = changes(path, :ignore => %r{^ignored_directory/}, :recursive => true) do
853
+ rm 'ignored_directory/do_not_use.rb'
854
+ rm 'ignored_directory/subdirectory/do_not_use.rb'
855
+ end
856
+
857
+ added.should be_empty
858
+ modified.should be_empty
859
+ removed.should be_empty
860
+ end
861
+ end
862
+ end
863
+ end
638
864
  end
639
865
  end
640
866
 
@@ -662,7 +888,8 @@ describe Listen::DirectoryRecord do
662
888
  mkdir 'a_directory'
663
889
  touch 'a_directory/a_file.rb'
664
890
  touch 'a_directory/b_file.rb'
665
- sleep 1.5 # make files mtime old
891
+
892
+ small_time_difference
666
893
 
667
894
  modified, added, removed = changes(path) do
668
895
  touch 'b_file.rb'
@@ -682,7 +909,6 @@ describe Listen::DirectoryRecord do
682
909
  mkdir 'a_directory'
683
910
  touch 'a_directory/a_file.rb'
684
911
  touch 'a_directory/b_file.rb'
685
- sleep 1.5 # make files mtime old
686
912
 
687
913
  modified, added, removed = changes(path) do
688
914
  rm 'b_file.rb'
@@ -751,16 +977,16 @@ describe Listen::DirectoryRecord do
751
977
  context 'with nested paths' do
752
978
  it 'detects removals without crashing - #18' do
753
979
  fixtures do |path|
754
- mkdir_p 'a_directory/b_directory'
755
- touch 'a_directory/b_directory/do_not_use.rb'
980
+ mkdir_p 'a_directory/subdirectory'
981
+ touch 'a_directory/subdirectory/do_not_use.rb'
756
982
 
757
- modified, added, removed = changes(path, :paths => [path, "#{path}/a_directory", "#{path}/b_directory"]) do
983
+ modified, added, removed = changes(path) do
758
984
  rm_r 'a_directory'
759
985
  end
760
986
 
761
987
  added.should be_empty
762
988
  modified.should be_empty
763
- removed.should =~ %w(a_directory/b_directory/do_not_use.rb)
989
+ removed.should =~ %w(a_directory/subdirectory/do_not_use.rb)
764
990
  end
765
991
  end
766
992
  end
@@ -790,6 +1016,7 @@ describe Listen::DirectoryRecord do
790
1016
  touch 'b_file.rb'
791
1017
 
792
1018
  modified, added, removed = changes(path, :relative_paths => false) do
1019
+ small_time_difference
793
1020
  rm 'a_file.rb'
794
1021
  touch 'b_file.rb'
795
1022
  touch 'c_file.rb'