listen 2.7.4 → 2.7.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +232 -0
- data/.travis.yml +6 -3
- data/Gemfile +9 -1
- data/Guardfile +6 -1
- data/README.md +17 -4
- data/lib/listen.rb +9 -4
- data/lib/listen/adapter.rb +5 -7
- data/lib/listen/adapter/base.rb +8 -5
- data/lib/listen/adapter/bsd.rb +58 -21
- data/lib/listen/adapter/darwin.rb +2 -4
- data/lib/listen/adapter/linux.rb +20 -10
- data/lib/listen/adapter/polling.rb +0 -2
- data/lib/listen/adapter/tcp.rb +6 -5
- data/lib/listen/adapter/windows.rb +8 -6
- data/lib/listen/change.rb +1 -2
- data/lib/listen/cli.rb +25 -22
- data/lib/listen/directory.rb +8 -6
- data/lib/listen/listener.rb +25 -19
- data/lib/listen/record.rb +4 -2
- data/lib/listen/silencer.rb +55 -25
- data/lib/listen/tcp.rb +9 -0
- data/lib/listen/tcp/broadcaster.rb +0 -2
- data/lib/listen/tcp/listener.rb +13 -8
- data/lib/listen/tcp/message.rb +0 -2
- data/lib/listen/version.rb +1 -1
- data/listen.gemspec +4 -3
- data/spec/acceptance/listen_spec.rb +190 -109
- data/spec/acceptance/tcp_spec.rb +28 -26
- data/spec/lib/listen/adapter/base_spec.rb +14 -12
- data/spec/lib/listen/adapter/bsd_spec.rb +5 -2
- data/spec/lib/listen/adapter/darwin_spec.rb +5 -2
- data/spec/lib/listen/adapter/linux_spec.rb +40 -25
- data/spec/lib/listen/adapter/polling_spec.rb +29 -14
- data/spec/lib/listen/adapter/tcp_spec.rb +24 -6
- data/spec/lib/listen/adapter/windows_spec.rb +5 -2
- data/spec/lib/listen/adapter_spec.rb +20 -17
- data/spec/lib/listen/change_spec.rb +36 -26
- data/spec/lib/listen/directory_spec.rb +128 -71
- data/spec/lib/listen/file_spec.rb +67 -34
- data/spec/lib/listen/listener_spec.rb +135 -105
- data/spec/lib/listen/record_spec.rb +32 -29
- data/spec/lib/listen/silencer_spec.rb +78 -56
- data/spec/lib/listen/tcp/broadcaster_spec.rb +3 -2
- data/spec/lib/listen/tcp/listener_spec.rb +17 -11
- data/spec/lib/listen/tcp/message_spec.rb +1 -1
- data/spec/lib/listen_spec.rb +18 -6
- data/spec/spec_helper.rb +5 -1
- data/spec/support/acceptance_helper.rb +3 -3
- data/spec/support/fixtures_helper.rb +10 -9
- metadata +17 -15
@@ -7,86 +7,89 @@ describe Listen::Record do
|
|
7
7
|
let(:path) { '/dir/path/file.rb' }
|
8
8
|
let(:data) { { type: 'File' } }
|
9
9
|
|
10
|
-
describe
|
11
|
-
it
|
10
|
+
describe '#set_path' do
|
11
|
+
it 'sets path by spliting direname and basename' do
|
12
12
|
record.set_path(path, data)
|
13
|
-
expect(record.paths).to eq(
|
13
|
+
expect(record.paths).to eq('/dir/path' => { 'file.rb' => data })
|
14
14
|
end
|
15
15
|
|
16
|
-
it
|
16
|
+
it 'sets path and keeps old data not overwritten' do
|
17
17
|
record.set_path(path, data.merge(foo: 1, bar: 2))
|
18
18
|
record.set_path(path, data.merge(foo: 3))
|
19
|
-
|
19
|
+
expected = { '/dir/path' => { 'file.rb' => data.merge(foo: 3, bar: 2) } }
|
20
|
+
expect(record.paths).to eq(expected)
|
20
21
|
end
|
21
22
|
end
|
22
23
|
|
23
|
-
describe
|
24
|
-
context
|
24
|
+
describe '#unset_path' do
|
25
|
+
context 'path is present' do
|
25
26
|
before { record.set_path(path, data) }
|
26
27
|
|
27
|
-
it
|
28
|
+
it 'unsets path' do
|
28
29
|
record.unset_path(path)
|
29
|
-
expect(record.paths).to eq(
|
30
|
+
expect(record.paths).to eq('/dir/path' => {})
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
33
|
-
context
|
34
|
-
it
|
34
|
+
context 'path not present' do
|
35
|
+
it 'unsets path' do
|
35
36
|
record.unset_path(path)
|
36
|
-
expect(record.paths).to eq(
|
37
|
+
expect(record.paths).to eq('/dir/path' => {})
|
37
38
|
end
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
41
|
-
describe
|
42
|
-
context
|
42
|
+
describe '#file_data' do
|
43
|
+
context 'path is present' do
|
43
44
|
before { record.set_path(path, data) }
|
44
45
|
|
45
|
-
it
|
46
|
+
it 'returns file data' do
|
46
47
|
expect(record.file_data(path)).to eq data
|
47
48
|
end
|
48
49
|
end
|
49
50
|
|
50
|
-
context
|
51
|
-
it
|
51
|
+
context 'path not present' do
|
52
|
+
it 'return empty hash' do
|
52
53
|
expect(record.file_data(path)).to be_empty
|
53
54
|
end
|
54
55
|
end
|
55
56
|
end
|
56
57
|
|
57
|
-
describe
|
58
|
-
context
|
58
|
+
describe '#dir_entries' do
|
59
|
+
context 'path is present' do
|
59
60
|
before { record.set_path(path, data) }
|
60
61
|
|
61
|
-
it
|
62
|
-
expect(record.dir_entries('/dir/path')).to eq(
|
62
|
+
it 'returns file path' do
|
63
|
+
expect(record.dir_entries('/dir/path')).to eq('file.rb' => data)
|
63
64
|
end
|
64
65
|
end
|
65
66
|
|
66
|
-
context
|
67
|
-
it
|
67
|
+
context 'path not present' do
|
68
|
+
it 'unsets path' do
|
68
69
|
expect(record.dir_entries('/dir/path')).to eq({})
|
69
70
|
end
|
70
71
|
end
|
71
72
|
end
|
72
73
|
|
73
|
-
describe
|
74
|
+
describe '#build' do
|
74
75
|
let(:directories) { ['dir_path'] }
|
75
76
|
let(:change_pool) { double(Listen::Change, terminate: true) }
|
76
|
-
before
|
77
|
+
before do
|
77
78
|
change_pool.stub(:change)
|
78
79
|
registry.stub(:[]).with(:change_pool) { change_pool }
|
79
80
|
listener.stub(:directories) { directories }
|
80
|
-
|
81
|
+
end
|
81
82
|
|
82
|
-
it
|
83
|
+
it 're-inits paths' do
|
83
84
|
record.set_path(path, data)
|
84
85
|
record.build
|
85
86
|
expect(record.file_data(path)).to be_empty
|
86
87
|
end
|
87
88
|
|
88
|
-
it
|
89
|
-
expect(change_pool).to receive(:change).
|
89
|
+
it 'calls change asynchronously on all directories to build record' do
|
90
|
+
expect(change_pool).to receive(:change).
|
91
|
+
with('dir_path', type: 'Dir', recursive: true, silence: true)
|
92
|
+
|
90
93
|
record.build
|
91
94
|
end
|
92
95
|
end
|
@@ -2,17 +2,23 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Listen::Silencer do
|
4
4
|
let(:options) { {} }
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
|
6
|
+
let(:listener) do
|
7
|
+
double(Listen::Listener,
|
8
|
+
directories: [Pathname.pwd, Pathname.new('/Users/Shared/')],
|
9
|
+
options: options
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
9
13
|
let(:silencer) { Listen::Silencer.new(listener) }
|
10
14
|
|
11
|
-
describe
|
12
|
-
let(:pwd) { Pathname.
|
15
|
+
describe '#silenced?' do
|
16
|
+
let(:pwd) { Pathname.pwd }
|
13
17
|
|
14
|
-
context
|
15
|
-
|
18
|
+
context 'default ignore' do
|
19
|
+
hidden_dirs = %w(.git .svn .hg .rbx .bundle)
|
20
|
+
other_dirs = %w(bundle vendor/bundle log tmp vendor/ruby)
|
21
|
+
(hidden_dirs + other_dirs).each do |dir|
|
16
22
|
describe do
|
17
23
|
let(:path) { pwd.join(dir) }
|
18
24
|
|
@@ -20,7 +26,7 @@ describe Listen::Silencer do
|
|
20
26
|
expect(silencer.silenced?(path)).to be_true
|
21
27
|
end
|
22
28
|
|
23
|
-
context
|
29
|
+
context 'with a directory beginning with the same name' do
|
24
30
|
let(:path) { pwd.join("#{dir}foo") }
|
25
31
|
|
26
32
|
it "doesn't silences default ignored directory: #{dir}foo" do
|
@@ -28,7 +34,7 @@ describe Listen::Silencer do
|
|
28
34
|
end
|
29
35
|
end
|
30
36
|
|
31
|
-
context
|
37
|
+
context 'with a directory ending with the same name' do
|
32
38
|
let(:path) { pwd.join("foo#{dir}") }
|
33
39
|
|
34
40
|
it "doesn't silences default ignored directory: foo#{dir}" do
|
@@ -38,10 +44,12 @@ describe Listen::Silencer do
|
|
38
44
|
end
|
39
45
|
end
|
40
46
|
|
41
|
-
%w(.
|
47
|
+
gedit_files = %w(.goutputstream-S3FBGX)
|
48
|
+
kate_files = %w(foo.rbo54321.new foo.rbB22583.new foo.rb.kate-swp)
|
49
|
+
(%w(.DS_Store foo.tmp foo~) + kate_files + gedit_files).each do |path|
|
42
50
|
describe do
|
43
51
|
it "by default silences files like: #{path}" do
|
44
|
-
expect(silencer.silenced?(pwd
|
52
|
+
expect(silencer.silenced?(pwd + path)).to be_true
|
45
53
|
end
|
46
54
|
end
|
47
55
|
end
|
@@ -49,7 +57,7 @@ describe Listen::Silencer do
|
|
49
57
|
%w(foo.tmpl file.new file54321.new).each do |path|
|
50
58
|
describe do
|
51
59
|
it "by default does not silence files like: #{path}" do
|
52
|
-
expect(silencer.silenced?(pwd
|
60
|
+
expect(silencer.silenced?(pwd + path)).to be_false
|
53
61
|
end
|
54
62
|
end
|
55
63
|
end
|
@@ -58,102 +66,116 @@ describe Listen::Silencer do
|
|
58
66
|
context 'with ignore options (regexp)' do
|
59
67
|
let(:options) { { ignore: /\.pid$/ } }
|
60
68
|
|
61
|
-
it
|
62
|
-
expect(silencer.silenced?(pwd
|
69
|
+
it 'silences path matching custom ignore regex' do
|
70
|
+
expect(silencer.silenced?(pwd + 'foo.pid')).to be_true
|
63
71
|
end
|
64
72
|
end
|
65
73
|
|
66
74
|
context 'with ignore options (array)' do
|
67
75
|
let(:options) { { ignore: [%r{^foo/bar}, /\.pid$/] } }
|
68
76
|
|
69
|
-
it
|
70
|
-
expect(silencer.silenced?(pwd
|
71
|
-
expect(silencer.silenced?(pwd
|
77
|
+
it 'silences paths matching custom ignore regexes' do
|
78
|
+
expect(silencer.silenced?(pwd + 'foo/bar/baz')).to be_true
|
79
|
+
expect(silencer.silenced?(pwd + 'foo.pid')).to be_true
|
72
80
|
end
|
73
81
|
end
|
74
82
|
|
75
|
-
context
|
83
|
+
context 'with ignore! options' do
|
76
84
|
let(:options) { { ignore!: /\.pid$/ } }
|
77
85
|
|
78
|
-
it
|
79
|
-
expect(silencer.silenced?(pwd
|
86
|
+
it 'silences custom ignored directory' do
|
87
|
+
expect(silencer.silenced?(pwd + 'foo.pid')).to be_true
|
80
88
|
end
|
81
89
|
|
82
90
|
it "doesn't silence default ignored directory" do
|
83
|
-
|
84
|
-
expect(silencer.silenced?(path)).to be_false
|
91
|
+
expect(silencer.silenced?(pwd + '.git')).to be_false
|
85
92
|
end
|
86
93
|
end
|
87
94
|
|
88
|
-
context
|
95
|
+
context 'with only options (regexp)' do
|
89
96
|
let(:options) { { only: %r{foo} } }
|
90
97
|
|
91
|
-
it
|
92
|
-
|
93
|
-
expect(silencer.silenced?(path)).to be_false
|
98
|
+
it 'do not take only regex in account if type is Unknown' do
|
99
|
+
expect(silencer.silenced?(pwd + 'baz')).to be_false
|
94
100
|
end
|
95
101
|
|
96
|
-
it
|
97
|
-
|
98
|
-
expect(silencer.silenced?(path, 'File')).to be_false
|
102
|
+
it 'do not silence path matches only regex if type is File' do
|
103
|
+
expect(silencer.silenced?(pwd + 'foo', 'File')).to be_false
|
99
104
|
end
|
100
105
|
|
101
|
-
it
|
102
|
-
|
103
|
-
expect(silencer.silenced?(path, 'File')).to be_true
|
106
|
+
it 'silences other directory' do
|
107
|
+
expect(silencer.silenced?(pwd + 'bar', 'File')).to be_true
|
104
108
|
end
|
105
109
|
end
|
106
110
|
|
107
|
-
context
|
111
|
+
context 'with only options (array)' do
|
108
112
|
let(:options) { { only: [%r{^foo/}, %r{\.txt$}] } }
|
109
113
|
|
110
|
-
it
|
111
|
-
expect(silencer.silenced?(pwd
|
114
|
+
it 'do not take only regex in account if type is Unknown' do
|
115
|
+
expect(silencer.silenced?(pwd + 'baz')).to be_false
|
112
116
|
end
|
113
117
|
|
114
118
|
it "doesn't silence good directory" do
|
115
|
-
expect(silencer.silenced?(pwd
|
119
|
+
expect(silencer.silenced?(pwd + 'foo/bar.rb', 'File')).to be_false
|
116
120
|
end
|
117
121
|
|
118
122
|
it "doesn't silence good file" do
|
119
|
-
expect(silencer.silenced?(pwd
|
123
|
+
expect(silencer.silenced?(pwd + 'bar.txt', 'File')).to be_false
|
120
124
|
end
|
121
125
|
|
122
|
-
it
|
123
|
-
expect(silencer.silenced?(pwd
|
126
|
+
it 'silences other directory' do
|
127
|
+
expect(silencer.silenced?(pwd + 'bar/baz.rb', 'File')).to be_true
|
124
128
|
end
|
125
129
|
|
126
|
-
it
|
127
|
-
expect(silencer.silenced?(pwd
|
130
|
+
it 'silences other file' do
|
131
|
+
expect(silencer.silenced?(pwd + 'bar.rb', 'File')).to be_true
|
128
132
|
end
|
129
133
|
end
|
130
134
|
|
131
135
|
context 'with ignore and only options' do
|
132
136
|
let(:options) { { only: /\.pid$/, ignore: %r{^bar} } }
|
133
137
|
|
134
|
-
|
135
|
-
|
136
|
-
|
138
|
+
context 'with Unknown type' do
|
139
|
+
context 'when not matching :only' do
|
140
|
+
context 'when not matching :ignore' do
|
141
|
+
it 'does not silence' do
|
142
|
+
expect(silencer.silenced?(pwd + 'baz')).to be_false
|
143
|
+
end
|
144
|
+
end
|
137
145
|
|
138
|
-
|
139
|
-
|
146
|
+
context 'when matching :ignore' do
|
147
|
+
it 'silences' do
|
148
|
+
expect(silencer.silenced?(pwd + 'bar')).to be_true
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
140
152
|
end
|
141
153
|
|
142
|
-
|
143
|
-
|
144
|
-
|
154
|
+
context 'with File type' do
|
155
|
+
context 'when not matching :only' do
|
156
|
+
it 'silences' do
|
157
|
+
expect(silencer.silenced?(pwd + 'foo.rb', 'File')).to be_true
|
158
|
+
end
|
159
|
+
end
|
145
160
|
|
146
|
-
|
147
|
-
|
148
|
-
|
161
|
+
context 'when matching :only' do
|
162
|
+
context 'when matching :ignore' do
|
163
|
+
it 'silences' do
|
164
|
+
expect(silencer.silenced?(pwd + 'bar.pid', 'File')).to be_true
|
165
|
+
end
|
166
|
+
end
|
149
167
|
|
150
|
-
|
151
|
-
|
168
|
+
context 'when not matching :ignore' do
|
169
|
+
it 'does not silence' do
|
170
|
+
expect(silencer.silenced?(pwd + 'foo.pid', 'File')).to be_false
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
152
174
|
end
|
153
175
|
end
|
154
176
|
|
155
177
|
it "doesn't silence normal path" do
|
156
|
-
path = pwd
|
178
|
+
path = pwd + 'some_dir' + 'some_file.rb'
|
157
179
|
expect(silencer.silenced?(path)).to be_false
|
158
180
|
end
|
159
181
|
end
|
@@ -6,12 +6,13 @@ describe Listen::TCP::Broadcaster do
|
|
6
6
|
let(:port) { 4000 }
|
7
7
|
|
8
8
|
subject { described_class.new(host, port) }
|
9
|
-
let(:server)
|
9
|
+
let(:server) { double(described_class::TCPServer, close: true, accept: nil) }
|
10
10
|
let(:socket) { double(described_class::TCPSocket, write: true) }
|
11
11
|
let(:payload) { Listen::TCP::Message.new.payload }
|
12
12
|
|
13
13
|
before do
|
14
|
-
expect(described_class::TCPServer).to receive(:new).
|
14
|
+
expect(described_class::TCPServer).to receive(:new).
|
15
|
+
with(host, port).and_return server
|
15
16
|
end
|
16
17
|
|
17
18
|
after do
|
@@ -8,14 +8,18 @@ describe Listen::TCP::Listener do
|
|
8
8
|
subject { described_class.new("#{host}:#{port}", :recipient, options) }
|
9
9
|
let(:options) { {} }
|
10
10
|
let(:registry) { double(Celluloid::Registry, :[]= => true) }
|
11
|
-
|
11
|
+
|
12
|
+
let(:supervisor) do
|
13
|
+
double(Celluloid::SupervisionGroup, add: true, pool: true)
|
14
|
+
end
|
15
|
+
|
12
16
|
let(:record) { double(Listen::Record, terminate: true, build: true) }
|
13
17
|
let(:silencer) { double(Listen::Silencer, terminate: true) }
|
14
18
|
let(:adapter) { double(Listen::Adapter::Base) }
|
15
19
|
let(:broadcaster) { double(Listen::TCP::Broadcaster) }
|
16
20
|
let(:change_pool) { double(Listen::Change, terminate: true) }
|
17
21
|
let(:change_pool_async) { double('ChangePoolAsync') }
|
18
|
-
before
|
22
|
+
before do
|
19
23
|
Celluloid::Registry.stub(:new) { registry }
|
20
24
|
Celluloid::SupervisionGroup.stub(:run!) { supervisor }
|
21
25
|
registry.stub(:[]).with(:silencer) { silencer }
|
@@ -23,7 +27,7 @@ describe Listen::TCP::Listener do
|
|
23
27
|
registry.stub(:[]).with(:record) { record }
|
24
28
|
registry.stub(:[]).with(:change_pool) { change_pool }
|
25
29
|
registry.stub(:[]).with(:broadcaster) { broadcaster }
|
26
|
-
|
30
|
+
end
|
27
31
|
|
28
32
|
describe '#initialize' do
|
29
33
|
its(:mode) { should be :recipient }
|
@@ -64,7 +68,8 @@ describe Listen::TCP::Listener do
|
|
64
68
|
end
|
65
69
|
|
66
70
|
it 'registers broadcaster' do
|
67
|
-
expect(supervisor).to receive(:add).
|
71
|
+
expect(supervisor).to receive(:add).
|
72
|
+
with(Listen::TCP::Broadcaster, as: :broadcaster, args: [nil, port])
|
68
73
|
subject.start
|
69
74
|
end
|
70
75
|
|
@@ -77,11 +82,9 @@ describe Listen::TCP::Listener do
|
|
77
82
|
describe '#block' do
|
78
83
|
let(:async) { double('TCP broadcaster async', broadcast: true) }
|
79
84
|
let(:callback) { double(call: true) }
|
80
|
-
let(:changes)
|
81
|
-
modified: ['/foo'],
|
82
|
-
|
83
|
-
removed: []
|
84
|
-
}}
|
85
|
+
let(:changes) do
|
86
|
+
{ modified: ['/foo'], added: [], removed: [] }
|
87
|
+
end
|
85
88
|
|
86
89
|
before do
|
87
90
|
broadcaster.stub(:async).and_return async
|
@@ -101,7 +104,10 @@ describe Listen::TCP::Listener do
|
|
101
104
|
|
102
105
|
context 'when stopped' do
|
103
106
|
it 'honours stopped state and does nothing' do
|
104
|
-
allow(subject).to receive(:supervisor)
|
107
|
+
allow(subject).to receive(:supervisor) do
|
108
|
+
double('SupervisionGroup', terminate: true)
|
109
|
+
end
|
110
|
+
|
105
111
|
subject.stop
|
106
112
|
expect(broadcaster).not_to receive(:async)
|
107
113
|
expect(callback).not_to receive(:call)
|
@@ -115,7 +121,7 @@ describe Listen::TCP::Listener do
|
|
115
121
|
|
116
122
|
it 'invokes original callback block' do
|
117
123
|
subject.block = callback
|
118
|
-
expect(callback).to receive(:call).with
|
124
|
+
expect(callback).to receive(:call).with(*changes.values)
|
119
125
|
end
|
120
126
|
end
|
121
127
|
end
|
@@ -4,7 +4,7 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
describe Listen::TCP::Message do
|
6
6
|
|
7
|
-
let(:object) { [1, 2, {'foo' => 'bar'}] }
|
7
|
+
let(:object) { [1, 2, { 'foo' => 'bar' }] }
|
8
8
|
let(:body) { '[1,2,{"foo":"bar"}]' }
|
9
9
|
let(:size) { 19 }
|
10
10
|
let(:payload) { "\x00\x00\x00\x13[1,2,{\"foo\":\"bar\"}]" }
|