sass 3.3.0 → 3.3.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.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/lib/sass/importers/filesystem.rb +3 -3
- data/lib/sass/plugin/compiler.rb +95 -52
- data/lib/sass/script/functions.rb +1 -1
- data/lib/sass/source/map.rb +3 -3
- data/lib/sass/util.rb +16 -1
- data/vendor/listen/CHANGELOG.md +175 -35
- data/vendor/listen/Gemfile +5 -15
- data/vendor/listen/README.md +111 -77
- data/vendor/listen/Rakefile +0 -42
- data/vendor/listen/lib/listen.rb +33 -19
- data/vendor/listen/lib/listen/adapter.rb +193 -82
- data/vendor/listen/lib/listen/adapters/bsd.rb +27 -64
- data/vendor/listen/lib/listen/adapters/darwin.rb +21 -58
- data/vendor/listen/lib/listen/adapters/linux.rb +23 -55
- data/vendor/listen/lib/listen/adapters/polling.rb +25 -34
- data/vendor/listen/lib/listen/adapters/windows.rb +50 -46
- data/vendor/listen/lib/listen/directory_record.rb +96 -61
- data/vendor/listen/lib/listen/listener.rb +135 -37
- data/vendor/listen/lib/listen/turnstile.rb +9 -5
- data/vendor/listen/lib/listen/version.rb +1 -1
- data/vendor/listen/listen.gemspec +6 -0
- data/vendor/listen/spec/listen/adapter_spec.rb +37 -82
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +8 -8
- data/vendor/listen/spec/listen/directory_record_spec.rb +81 -56
- data/vendor/listen/spec/listen/listener_spec.rb +128 -39
- data/vendor/listen/spec/listen_spec.rb +15 -21
- data/vendor/listen/spec/spec_helper.rb +4 -0
- data/vendor/listen/spec/support/adapter_helper.rb +52 -15
- data/vendor/listen/spec/support/directory_record_helper.rb +7 -5
- data/vendor/listen/spec/support/listeners_helper.rb +30 -7
- metadata +3 -23
- data/ext/mkrf_conf.rb +0 -27
- data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
- data/vendor/listen/lib/listen/multi_listener.rb +0 -143
- data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
- data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
@@ -1,28 +1,32 @@
|
|
1
1
|
module Listen
|
2
|
+
|
2
3
|
# Allows two threads to wait on eachother.
|
3
4
|
#
|
4
5
|
# @note Only two threads can be used with this Turnstile
|
5
6
|
# because of the current implementation.
|
6
7
|
class Turnstile
|
8
|
+
attr_accessor :queue
|
7
9
|
|
8
10
|
# Initialize the turnstile.
|
9
11
|
#
|
10
12
|
def initialize
|
11
|
-
# Until
|
13
|
+
# Until Ruby offers semahpores, only queues can be used
|
12
14
|
# to implement a turnstile.
|
13
|
-
@
|
15
|
+
@queue = Queue.new
|
14
16
|
end
|
15
17
|
|
16
18
|
# Blocks the current thread until a signal is received.
|
17
19
|
#
|
18
20
|
def wait
|
19
|
-
|
21
|
+
queue.pop if queue.num_waiting == 0
|
20
22
|
end
|
21
23
|
|
22
|
-
# Unblocks the waiting thread if
|
24
|
+
# Unblocks the waiting thread if any.
|
23
25
|
#
|
24
26
|
def signal
|
25
|
-
|
27
|
+
queue.push(:dummy) if queue.num_waiting == 1
|
26
28
|
end
|
29
|
+
|
27
30
|
end
|
31
|
+
|
28
32
|
end
|
@@ -9,13 +9,19 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.authors = ['Thibaud Guillaume-Gentil', 'Maher Sallam']
|
10
10
|
s.email = ['thibaud@thibaud.me', 'maher@sallam.me']
|
11
11
|
s.homepage = 'https://github.com/guard/listen'
|
12
|
+
s.license = 'MIT'
|
12
13
|
s.summary = 'Listen to file modifications'
|
13
14
|
s.description = 'The Listen gem listens to file modifications and notifies you about the changes. Works everywhere!'
|
14
15
|
|
15
16
|
s.required_rubygems_version = '>= 1.3.6'
|
16
17
|
s.rubyforge_project = 'listen'
|
17
18
|
|
19
|
+
s.add_dependency 'rb-fsevent', '>= 0.9.3'
|
20
|
+
s.add_dependency 'rb-inotify', '>= 0.9'
|
21
|
+
s.add_dependency 'rb-kqueue', '>= 0.2'
|
22
|
+
|
18
23
|
s.add_development_dependency 'bundler'
|
24
|
+
s.add_development_dependency 'rspec'
|
19
25
|
|
20
26
|
s.files = Dir.glob('{lib}/**/*') + %w[CHANGELOG.md LICENSE README.md]
|
21
27
|
s.require_path = 'lib'
|
@@ -19,10 +19,23 @@ describe Listen::Adapter do
|
|
19
19
|
|
20
20
|
describe ".select_and_initialize" do
|
21
21
|
before do
|
22
|
-
Listen::
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
Listen::Adapter::OPTIMIZED_ADAPTERS.each do |adapter|
|
23
|
+
Listen::Adapters.const_get(adapter).stub(:usable_and_works?) { false }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "with force_adapter option" do
|
28
|
+
it "returns an instance of the given adapter class" do
|
29
|
+
expected_adapter = Object.new
|
30
|
+
adapter_class = double('adapter_class')
|
31
|
+
options = {:force_adapter => adapter_class}
|
32
|
+
|
33
|
+
adapter_class.should_receive(:load_dependent_adapter)
|
34
|
+
adapter_class.should_receive(:new).with('dir', options) { expected_adapter }
|
35
|
+
|
36
|
+
adapter = described_class.select_and_initialize('dir', options)
|
37
|
+
adapter.should be(expected_adapter)
|
38
|
+
end
|
26
39
|
end
|
27
40
|
|
28
41
|
context "with no specific adapter usable" do
|
@@ -37,20 +50,6 @@ describe Listen::Adapter do
|
|
37
50
|
described_class.select_and_initialize('dir')
|
38
51
|
end
|
39
52
|
|
40
|
-
context 'when the dependencies of an adapter are not satisfied' do
|
41
|
-
before do
|
42
|
-
Listen::Adapters::Darwin.stub(:usable_and_works?).and_raise(Listen::DependencyManager::Error)
|
43
|
-
Listen::Adapters::Linux.stub(:usable_and_works?).and_raise(Listen::DependencyManager::Error)
|
44
|
-
Listen::Adapters::BSD.stub(:usable_and_works?).and_raise(Listen::DependencyManager::Error)
|
45
|
-
Listen::Adapters::Windows.stub(:usable_and_works?).and_raise(Listen::DependencyManager::Error)
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'invites the user to satisfy the dependencies of the adapter in the warning' do
|
49
|
-
Kernel.should_receive(:warn).with(/#{Listen::Adapter::MISSING_DEPENDENCY_MESSAGE}/)
|
50
|
-
described_class.select_and_initialize('dir')
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
53
|
context "with custom polling_fallback_message option" do
|
55
54
|
it "warns with the custom polling fallback message" do
|
56
55
|
Kernel.should_receive(:warn).with(/custom/)
|
@@ -66,83 +65,39 @@ describe Listen::Adapter do
|
|
66
65
|
end
|
67
66
|
end
|
68
67
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
it "uses Listen::Adapters::Darwin" do
|
73
|
-
Listen::Adapters::Darwin.should_receive(:new).with('dir', {})
|
74
|
-
described_class.select_and_initialize('dir')
|
75
|
-
end
|
76
|
-
|
77
|
-
context 'when the use of the polling adapter is forced' do
|
78
|
-
it 'uses Listen::Adapters::Polling' do
|
79
|
-
Listen::Adapters::Polling.should_receive(:new).with('dir', {})
|
80
|
-
described_class.select_and_initialize('dir', :force_polling => true)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
68
|
+
Listen::Adapter::OPTIMIZED_ADAPTERS.each do |adapter|
|
69
|
+
adapter_class = Listen::Adapters.const_get(adapter)
|
84
70
|
|
85
|
-
|
86
|
-
|
71
|
+
context "on #{adapter}" do
|
72
|
+
before { adapter_class.stub(:usable_and_works?) { true } }
|
87
73
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
end
|
92
|
-
|
93
|
-
context 'when the use of the polling adapter is forced' do
|
94
|
-
it 'uses Listen::Adapters::Polling' do
|
95
|
-
Listen::Adapters::Polling.should_receive(:new).with('dir', {})
|
96
|
-
described_class.select_and_initialize('dir', :force_polling => true)
|
74
|
+
it "uses Listen::Adapters::#{adapter}" do
|
75
|
+
adapter_class.should_receive(:new).with('dir', {})
|
76
|
+
described_class.select_and_initialize('dir')
|
97
77
|
end
|
98
|
-
end
|
99
|
-
end
|
100
78
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
described_class.select_and_initialize('dir')
|
107
|
-
end
|
108
|
-
|
109
|
-
context 'when the use of the polling adapter is forced' do
|
110
|
-
it 'uses Listen::Adapters::Polling' do
|
111
|
-
Listen::Adapters::Polling.should_receive(:new).with('dir', {})
|
112
|
-
described_class.select_and_initialize('dir', :force_polling => true)
|
79
|
+
context 'when the use of the polling adapter is forced' do
|
80
|
+
it 'uses Listen::Adapters::Polling' do
|
81
|
+
Listen::Adapters::Polling.should_receive(:new).with('dir', {})
|
82
|
+
described_class.select_and_initialize('dir', :force_polling => true)
|
83
|
+
end
|
113
84
|
end
|
114
85
|
end
|
115
86
|
end
|
87
|
+
end
|
116
88
|
|
117
|
-
|
118
|
-
|
89
|
+
describe '.load_dependend_adapter' do
|
90
|
+
it 'returns true (success) even if the adapter_gem has already been required' do
|
91
|
+
described_class.stub(:adapter_gem => 'already_loaded_gem')
|
92
|
+
described_class.stub(:require => false)
|
119
93
|
|
120
|
-
|
121
|
-
Listen::Adapters::Windows.should_receive(:new).with('dir', {})
|
122
|
-
described_class.select_and_initialize('dir')
|
123
|
-
end
|
124
|
-
|
125
|
-
context 'when the use of the polling adapter is forced' do
|
126
|
-
it 'uses Listen::Adapters::Polling' do
|
127
|
-
Listen::Adapters::Polling.should_receive(:new).with('dir', {})
|
128
|
-
described_class.select_and_initialize('dir', :force_polling => true)
|
129
|
-
end
|
130
|
-
end
|
94
|
+
described_class.load_dependent_adapter.should be_true
|
131
95
|
end
|
132
96
|
end
|
133
97
|
|
134
|
-
|
135
|
-
|
136
|
-
|adapter_class|
|
98
|
+
Listen::Adapter::OPTIMIZED_ADAPTERS.each do |adapter|
|
99
|
+
adapter_class = Listen::Adapters.const_get(adapter)
|
137
100
|
if adapter_class.usable?
|
138
|
-
describe '.usable?' do
|
139
|
-
it 'checks the dependencies' do
|
140
|
-
adapter_class.should_receive(:load_depenencies)
|
141
|
-
adapter_class.should_receive(:dependencies_loaded?)
|
142
|
-
adapter_class.usable?
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
101
|
describe '.usable_and_works?' do
|
147
102
|
it 'checks if the adapter is usable' do
|
148
103
|
adapter_class.stub(:works?)
|
@@ -12,8 +12,8 @@ describe Listen::Adapters::Polling do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
describe '#poll' do
|
15
|
-
let(:listener) {
|
16
|
-
let(:callback) { lambda { |
|
15
|
+
let(:listener) { double(Listen::Listener) }
|
16
|
+
let(:callback) { lambda { |changed_directories, options| @called = true; listener.on_change(changed_directories, options) } }
|
17
17
|
|
18
18
|
after { subject.stop }
|
19
19
|
|
@@ -22,20 +22,20 @@ describe Listen::Adapters::Polling do
|
|
22
22
|
|
23
23
|
it 'calls listener.on_change' do
|
24
24
|
listener.should_receive(:on_change).at_least(1).times.with(['dir'], :recursive => true)
|
25
|
-
subject.start
|
25
|
+
subject.start
|
26
26
|
subject.wait_for_callback
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'calls listener.on_change continuously' do
|
30
30
|
subject.latency = 0.001
|
31
31
|
listener.should_receive(:on_change).at_least(10).times.with(['dir'], :recursive => true)
|
32
|
-
subject.start
|
32
|
+
subject.start
|
33
33
|
10.times { subject.wait_for_callback }
|
34
34
|
end
|
35
35
|
|
36
36
|
it "doesn't call listener.on_change if paused" do
|
37
37
|
subject.paused = true
|
38
|
-
subject.start
|
38
|
+
subject.start
|
39
39
|
subject.wait_for_callback
|
40
40
|
@called.should be_nil
|
41
41
|
end
|
@@ -46,20 +46,20 @@ describe Listen::Adapters::Polling do
|
|
46
46
|
|
47
47
|
it 'calls listener.on_change' do
|
48
48
|
listener.should_receive(:on_change).at_least(1).times.with(%w{dir1 dir2}, :recursive => true)
|
49
|
-
subject.start
|
49
|
+
subject.start
|
50
50
|
subject.wait_for_callback
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'calls listener.on_change continuously' do
|
54
54
|
subject.latency = 0.001
|
55
55
|
listener.should_receive(:on_change).at_least(10).times.with(%w{dir1 dir2}, :recursive => true)
|
56
|
-
subject.start
|
56
|
+
subject.start
|
57
57
|
10.times { subject.wait_for_callback }
|
58
58
|
end
|
59
59
|
|
60
60
|
it "doesn't call listener.on_change if paused" do
|
61
61
|
subject.paused = true
|
62
|
-
subject.start
|
62
|
+
subject.start
|
63
63
|
subject.wait_for_callback
|
64
64
|
@called.should be_nil
|
65
65
|
end
|
@@ -9,7 +9,7 @@ describe Listen::DirectoryRecord do
|
|
9
9
|
describe '.generate_default_ignoring_patterns' do
|
10
10
|
it 'creates regexp patterns from the default ignored directories and extensions' do
|
11
11
|
described_class.generate_default_ignoring_patterns.should include(
|
12
|
-
%r{^(?:\.rbx|\.bundle|\.git|\.svn|log|tmp|vendor)/},
|
12
|
+
%r{^(?:\.rbx|\.bundle|\.git|\.svn|bundle|log|tmp|vendor)/},
|
13
13
|
%r{(?:\.DS_Store)$}
|
14
14
|
)
|
15
15
|
end
|
@@ -24,6 +24,12 @@ describe Listen::DirectoryRecord do
|
|
24
24
|
subject.directory.should eq base_directory
|
25
25
|
end
|
26
26
|
|
27
|
+
it 'sets the base directory expanded' do
|
28
|
+
cd File.dirname(base_directory)
|
29
|
+
subject = described_class.new(File.basename(base_directory))
|
30
|
+
subject.directory.should eq base_directory
|
31
|
+
end
|
32
|
+
|
27
33
|
it 'sets the default ignoring patterns' do
|
28
34
|
subject.ignoring_patterns.should =~ described_class.generate_default_ignoring_patterns
|
29
35
|
end
|
@@ -43,28 +49,31 @@ describe Listen::DirectoryRecord do
|
|
43
49
|
|
44
50
|
describe '#ignore' do
|
45
51
|
it 'adds the passed paths to the list of ignored paths in the record' do
|
46
|
-
subject.ignore(%r{^\.old/}, %r{\.pid$})
|
52
|
+
subject.ignore(%r{^\.old/}, %r{\.pid$}, nil)
|
47
53
|
subject.ignoring_patterns.should include(%r{^\.old/}, %r{\.pid$})
|
54
|
+
subject.ignoring_patterns.should_not include(nil)
|
48
55
|
end
|
49
56
|
end
|
50
57
|
|
51
58
|
describe '#ignore!' do
|
52
59
|
it 'replace the ignored paths in the record' do
|
53
|
-
subject.ignore!(%r{^\.old/}, %r{\.pid$})
|
54
|
-
subject.ignoring_patterns.should
|
60
|
+
subject.ignore!(%r{^\.old/}, %r{\.pid$}, nil)
|
61
|
+
subject.ignoring_patterns.should eq [%r{^\.old/}, %r{\.pid$}]
|
55
62
|
end
|
56
63
|
end
|
57
64
|
|
58
65
|
describe '#filter' do
|
59
66
|
it 'adds the passed regexps to the list of filters that determine the stored paths' do
|
60
|
-
subject.filter(%r{\.(?:jpe?g|gif|png)}, %r{\.(?:mp3|ogg|a3c)})
|
67
|
+
subject.filter(%r{\.(?:jpe?g|gif|png)}, %r{\.(?:mp3|ogg|a3c)}, nil)
|
61
68
|
subject.filtering_patterns.should include(%r{\.(?:jpe?g|gif|png)}, %r{\.(?:mp3|ogg|a3c)})
|
69
|
+
subject.filtering_patterns.should_not include(nil)
|
62
70
|
end
|
63
71
|
end
|
64
72
|
|
65
73
|
describe '#filter!' do
|
66
74
|
it 'replaces the passed regexps in the list of filters that determine the stored paths' do
|
67
75
|
subject.filter!(%r{\.(?:jpe?g|gif|png)}, %r{\.(?:mp3|ogg|a3c)})
|
76
|
+
subject.filtering_patterns.should have(2).regexps
|
68
77
|
subject.filtering_patterns.should =~ [%r{\.(?:mp3|ogg|a3c)}, %r{\.(?:jpe?g|gif|png)}]
|
69
78
|
end
|
70
79
|
end
|
@@ -214,6 +223,21 @@ describe Listen::DirectoryRecord do
|
|
214
223
|
subject.relative_to_base(File.join(base_directory, path))
|
215
224
|
end
|
216
225
|
|
226
|
+
context 'when there are utf-8 chars in base directory' do
|
227
|
+
before do
|
228
|
+
fixtures do |path|
|
229
|
+
mkdir '目录'
|
230
|
+
@dir = described_class.new(path + '/目录')
|
231
|
+
@dir.build
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
it 'works' do
|
236
|
+
path = File.join @dir.directory, 'tmp/file.rb'
|
237
|
+
@dir.relative_to_base path
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
217
241
|
context 'when containing regexp characters in the base directory' do
|
218
242
|
before do
|
219
243
|
fixtures do |path|
|
@@ -394,7 +418,7 @@ describe Listen::DirectoryRecord do
|
|
394
418
|
touch 'existing_file.txt'
|
395
419
|
|
396
420
|
modified, added, removed = changes(path) do
|
397
|
-
|
421
|
+
small_time_difference
|
398
422
|
touch 'existing_file.txt'
|
399
423
|
end
|
400
424
|
|
@@ -414,7 +438,7 @@ describe Listen::DirectoryRecord do
|
|
414
438
|
touch 'existing_file.txt'
|
415
439
|
|
416
440
|
modified, added, removed = changes(path) do
|
417
|
-
|
441
|
+
small_time_difference
|
418
442
|
touch 'existing_file.txt'
|
419
443
|
end
|
420
444
|
|
@@ -428,7 +452,7 @@ describe Listen::DirectoryRecord do
|
|
428
452
|
# This issue was the result of checking a file for content changes when
|
429
453
|
# the mtime and the checking time are the same. In this case there
|
430
454
|
# is no checksum saved, so the file was reported as being changed.
|
431
|
-
it '
|
455
|
+
it 'does not report any changes' do
|
432
456
|
fixtures do |path|
|
433
457
|
touch 'a_file.rb'
|
434
458
|
|
@@ -441,34 +465,17 @@ describe Listen::DirectoryRecord do
|
|
441
465
|
end
|
442
466
|
end
|
443
467
|
|
444
|
-
it "doesn't detects the modified file the second time if the content haven't changed" do
|
445
|
-
fixtures do |path|
|
446
|
-
touch 'existing_file.txt'
|
447
|
-
|
448
|
-
changes(path) do
|
449
|
-
touch 'existing_file.txt'
|
450
|
-
end
|
451
|
-
|
452
|
-
modified, added, removed = changes(path, :use_last_record => true) do
|
453
|
-
touch 'existing_file.txt'
|
454
|
-
end
|
455
|
-
|
456
|
-
added.should be_empty
|
457
|
-
modified.should be_empty
|
458
|
-
removed.should be_empty
|
459
|
-
end
|
460
|
-
end
|
461
|
-
|
462
468
|
it 'detects the modified file the second time if the content have changed' do
|
463
469
|
fixtures do |path|
|
464
470
|
touch 'existing_file.txt'
|
471
|
+
|
465
472
|
# Set sha1 path checksum
|
466
473
|
changes(path) do
|
467
474
|
touch 'existing_file.txt'
|
468
475
|
end
|
469
|
-
small_time_difference
|
470
476
|
|
471
477
|
changes(path) do
|
478
|
+
small_time_difference
|
472
479
|
touch 'existing_file.txt'
|
473
480
|
end
|
474
481
|
|
@@ -482,16 +489,36 @@ describe Listen::DirectoryRecord do
|
|
482
489
|
end
|
483
490
|
end
|
484
491
|
|
485
|
-
it "doesn't
|
492
|
+
it "doesn't checksum the contents of local sockets (#85)", :unless => windows? do
|
493
|
+
require 'socket'
|
494
|
+
fixtures do |path|
|
495
|
+
Digest::SHA1.should_not_receive(:file)
|
496
|
+
socket_path = File.join(path, "unix_domain_socket")
|
497
|
+
server = UNIXServer.new(socket_path)
|
498
|
+
modified, added, removed = changes(path) do
|
499
|
+
t = Thread.new do
|
500
|
+
client = UNIXSocket.new(socket_path)
|
501
|
+
client.write("foo")
|
502
|
+
end
|
503
|
+
t.join
|
504
|
+
end
|
505
|
+
added.should be_empty
|
506
|
+
modified.should be_empty
|
507
|
+
removed.should be_empty
|
508
|
+
end
|
509
|
+
end
|
510
|
+
|
511
|
+
it "doesn't detects the modified file the second time if just touched - #62", :unless => described_class::HIGH_PRECISION_SUPPORTED do
|
486
512
|
fixtures do |path|
|
487
513
|
touch 'existing_file.txt'
|
514
|
+
|
488
515
|
# Set sha1 path checksum
|
489
516
|
changes(path) do
|
490
517
|
touch 'existing_file.txt'
|
491
518
|
end
|
492
|
-
small_time_difference
|
493
519
|
|
494
520
|
changes(path, :use_last_record => true) do
|
521
|
+
small_time_difference
|
495
522
|
open('existing_file.txt', 'w') { |f| f.write('foo') }
|
496
523
|
end
|
497
524
|
|
@@ -508,9 +535,9 @@ describe Listen::DirectoryRecord do
|
|
508
535
|
it "adds the path in the paths checksums if just touched - #62" do
|
509
536
|
fixtures do |path|
|
510
537
|
touch 'existing_file.txt'
|
511
|
-
small_time_difference
|
512
538
|
|
513
539
|
changes(path) do
|
540
|
+
small_time_difference
|
514
541
|
touch 'existing_file.txt'
|
515
542
|
end
|
516
543
|
|
@@ -518,23 +545,21 @@ describe Listen::DirectoryRecord do
|
|
518
545
|
end
|
519
546
|
end
|
520
547
|
|
521
|
-
|
522
|
-
|
523
|
-
|
548
|
+
it "deletes the path from the paths checksums" do
|
549
|
+
fixtures do |path|
|
550
|
+
touch 'unnecessary.txt'
|
524
551
|
|
525
|
-
|
526
|
-
|
552
|
+
changes(path) do
|
553
|
+
@record.sha1_checksums["#{path}/unnecessary.txt"] = 'foo'
|
527
554
|
|
528
|
-
|
529
|
-
|
555
|
+
rm 'unnecessary.txt'
|
556
|
+
end
|
530
557
|
|
531
|
-
|
558
|
+
@record.sha1_checksums["#{path}/unnecessary.txt"].should be_nil
|
559
|
+
end
|
532
560
|
end
|
533
561
|
end
|
534
562
|
|
535
|
-
|
536
|
-
end
|
537
|
-
|
538
563
|
context 'given a hidden file' do
|
539
564
|
it 'detects the modified file' do
|
540
565
|
fixtures do |path|
|
@@ -556,9 +581,9 @@ describe Listen::DirectoryRecord do
|
|
556
581
|
it 'does not detect the mode change' do
|
557
582
|
fixtures do |path|
|
558
583
|
touch 'run.rb'
|
559
|
-
sleep 1.5 # make a difference in the mtime of the file
|
560
584
|
|
561
585
|
modified, added, removed = changes(path) do
|
586
|
+
small_time_difference
|
562
587
|
chmod 0777, 'run.rb'
|
563
588
|
end
|
564
589
|
|
@@ -985,9 +1010,8 @@ describe Listen::DirectoryRecord do
|
|
985
1010
|
touch 'a_directory/a_file.rb'
|
986
1011
|
touch 'a_directory/b_file.rb'
|
987
1012
|
|
988
|
-
small_time_difference
|
989
|
-
|
990
1013
|
modified, added, removed = changes(path) do
|
1014
|
+
small_time_difference
|
991
1015
|
touch 'b_file.rb'
|
992
1016
|
touch 'a_directory/a_file.rb'
|
993
1017
|
end
|
@@ -1022,16 +1046,18 @@ describe Listen::DirectoryRecord do
|
|
1022
1046
|
it 'detects a moved directory' do
|
1023
1047
|
fixtures do |path|
|
1024
1048
|
mkdir 'a_directory'
|
1049
|
+
mkdir 'a_directory/nested'
|
1025
1050
|
touch 'a_directory/a_file.rb'
|
1026
1051
|
touch 'a_directory/b_file.rb'
|
1052
|
+
touch 'a_directory/nested/c_file.rb'
|
1027
1053
|
|
1028
1054
|
modified, added, removed = changes(path) do
|
1029
1055
|
mv 'a_directory', 'renamed'
|
1030
1056
|
end
|
1031
1057
|
|
1032
|
-
added.should =~ %w(renamed/a_file.rb renamed/b_file.rb)
|
1058
|
+
added.should =~ %w(renamed/a_file.rb renamed/b_file.rb renamed/nested/c_file.rb)
|
1033
1059
|
modified.should be_empty
|
1034
|
-
removed.should =~ %w(a_directory/a_file.rb a_directory/b_file.rb)
|
1060
|
+
removed.should =~ %w(a_directory/a_file.rb a_directory/b_file.rb a_directory/nested/c_file.rb)
|
1035
1061
|
end
|
1036
1062
|
end
|
1037
1063
|
|
@@ -1134,7 +1160,7 @@ describe Listen::DirectoryRecord do
|
|
1134
1160
|
chmod 000, 'unreadable_file.txt'
|
1135
1161
|
|
1136
1162
|
modified, added, removed = changes(path) do
|
1137
|
-
|
1163
|
+
small_time_difference
|
1138
1164
|
touch 'unreadable_file.txt'
|
1139
1165
|
end
|
1140
1166
|
|
@@ -1171,22 +1197,21 @@ describe Listen::DirectoryRecord do
|
|
1171
1197
|
# change event is tracked, but before the hash is calculated
|
1172
1198
|
Digest::SHA1.should_receive(:file).twice.and_raise(Errno::ENOENT)
|
1173
1199
|
|
1174
|
-
|
1175
|
-
|
1176
|
-
|
1177
|
-
touch
|
1178
|
-
|
1179
|
-
|
1180
|
-
}.should_not raise_error(Errno::ENOENT)
|
1200
|
+
fixtures do |path|
|
1201
|
+
lambda {
|
1202
|
+
touch 'removed_file.txt'
|
1203
|
+
changes(path) { touch 'removed_file.txt' }
|
1204
|
+
}.should_not raise_error
|
1205
|
+
end
|
1181
1206
|
end
|
1182
1207
|
end
|
1183
1208
|
|
1184
|
-
context 'within a directory containing a unix domain socket file' do
|
1209
|
+
context 'within a directory containing a unix domain socket file', :unless => windows? do
|
1185
1210
|
it 'does not raise an exception when hashing a unix domain socket file' do
|
1186
1211
|
fixtures do |path|
|
1187
1212
|
require 'socket'
|
1188
1213
|
UNIXServer.new('unix_domain_socket.sock')
|
1189
|
-
lambda { changes(path){} }.should_not raise_error
|
1214
|
+
lambda { changes(path){} }.should_not raise_error
|
1190
1215
|
end
|
1191
1216
|
end
|
1192
1217
|
end
|