gluer 0.0.3 → 0.0.4
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.
- data/lib/gluer/file.rb +1 -1
- data/lib/gluer/file_pool.rb +15 -10
- data/lib/gluer/version.rb +1 -1
- data/spec/file_pool_spec.rb +121 -0
- metadata +6 -4
data/lib/gluer/file.rb
CHANGED
data/lib/gluer/file_pool.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'gluer/configuration'
|
2
2
|
require 'gluer/file'
|
3
|
-
require '
|
3
|
+
require 'set'
|
4
4
|
|
5
5
|
module Gluer
|
6
6
|
class FilePool
|
@@ -9,19 +9,21 @@ module Gluer
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def get(path)
|
12
|
-
files.
|
12
|
+
files.fetch(path)
|
13
13
|
end
|
14
14
|
|
15
15
|
def clear
|
16
|
-
@files =
|
16
|
+
@files = Hash.new
|
17
17
|
end
|
18
18
|
|
19
19
|
def update
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
updated_file_paths = Set.new(collect)
|
21
|
+
(current_file_paths - updated_file_paths).each do |old_path|
|
22
|
+
files.delete(old_path).unload
|
23
|
+
end
|
24
|
+
updated_file_paths.each do |path|
|
25
|
+
(files[path] ||= File.new(path)).reload
|
26
|
+
end
|
25
27
|
end
|
26
28
|
|
27
29
|
private
|
@@ -30,8 +32,11 @@ module Gluer
|
|
30
32
|
def collect
|
31
33
|
base_path = Gluer.config.base_path
|
32
34
|
signature = Gluer.config.magic_signature
|
33
|
-
|
34
|
-
|
35
|
+
Gluer.config.file_filter.call(base_path, signature)
|
36
|
+
end
|
37
|
+
|
38
|
+
def current_file_paths
|
39
|
+
Set.new(files.keys)
|
35
40
|
end
|
36
41
|
end
|
37
42
|
end
|
data/lib/gluer/version.rb
CHANGED
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'gluer/file_pool'
|
2
|
+
require 'set'
|
3
|
+
|
4
|
+
describe Gluer::FilePool do
|
5
|
+
subject { Gluer::FilePool.new }
|
6
|
+
|
7
|
+
let(:file_paths) { ['path1', 'path2', 'path3'] }
|
8
|
+
let(:reloaded_files) { Hash.new }
|
9
|
+
|
10
|
+
def stub_file(path)
|
11
|
+
stub('File', :path => path).tap do |file|
|
12
|
+
file.stub(:unload)
|
13
|
+
file.stub(:reload) { reloaded_files[path] = file }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
before do
|
18
|
+
@old_file_filter = Gluer.config.file_filter
|
19
|
+
Gluer.config.file_filter = ->(base_path, signature) { file_paths }
|
20
|
+
|
21
|
+
Gluer::File.stub(:new) { |path| stub_file(path) }
|
22
|
+
|
23
|
+
reloaded_files.clear
|
24
|
+
end
|
25
|
+
|
26
|
+
after do
|
27
|
+
Gluer.config.file_filter = @old_file_filter
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#update" do
|
31
|
+
before { subject.update }
|
32
|
+
|
33
|
+
it "reloads each file" do
|
34
|
+
Set[*reloaded_files.keys].should == Set[*file_paths]
|
35
|
+
end
|
36
|
+
|
37
|
+
it "makes them available from #get" do
|
38
|
+
expect { subject.get('path1') }.to_not raise_error
|
39
|
+
expect { subject.get('path2') }.to_not raise_error
|
40
|
+
expect { subject.get('path3') }.to_not raise_error
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when filtering doesn't change in next call" do
|
44
|
+
before do
|
45
|
+
@file1 = reloaded_files['path1']
|
46
|
+
@file2 = reloaded_files['path2']
|
47
|
+
@file3 = reloaded_files['path3']
|
48
|
+
|
49
|
+
reloaded_files.clear
|
50
|
+
end
|
51
|
+
|
52
|
+
it "does not unload existing files" do
|
53
|
+
@file1.should_not_receive(:unload)
|
54
|
+
@file2.should_not_receive(:unload)
|
55
|
+
@file3.should_not_receive(:unload)
|
56
|
+
|
57
|
+
subject.update
|
58
|
+
end
|
59
|
+
|
60
|
+
it "keeps existing files available from #get" do
|
61
|
+
subject.update
|
62
|
+
expect { subject.get('path1') }.to_not raise_error
|
63
|
+
end
|
64
|
+
|
65
|
+
it "reloads existing files" do
|
66
|
+
@file1.should_receive(:reload)
|
67
|
+
@file2.should_receive(:reload)
|
68
|
+
@file3.should_receive(:reload)
|
69
|
+
|
70
|
+
subject.update
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "when filtering changes in next call" do
|
75
|
+
before do
|
76
|
+
new_file_paths = file_paths - ['path1'] + ['path4']
|
77
|
+
Gluer.config.file_filter = ->(base_path, signature) { new_file_paths }
|
78
|
+
|
79
|
+
@file1 = reloaded_files['path1']
|
80
|
+
@file2 = reloaded_files['path2']
|
81
|
+
@file3 = reloaded_files['path3']
|
82
|
+
|
83
|
+
reloaded_files.clear
|
84
|
+
end
|
85
|
+
|
86
|
+
it "unloads the filtered out file" do
|
87
|
+
@file1.should_receive(:unload)
|
88
|
+
|
89
|
+
subject.update
|
90
|
+
end
|
91
|
+
|
92
|
+
it "does not reload the filtered out file" do
|
93
|
+
@file1.should_not_receive(:reload)
|
94
|
+
|
95
|
+
subject.update
|
96
|
+
end
|
97
|
+
|
98
|
+
specify "getting the unloaded file results in key error" do
|
99
|
+
subject.update
|
100
|
+
expect { subject.get('path1') }.to raise_error(KeyError)
|
101
|
+
end
|
102
|
+
|
103
|
+
it "reloads existing files" do
|
104
|
+
@file2.should_receive(:reload)
|
105
|
+
@file3.should_receive(:reload)
|
106
|
+
|
107
|
+
subject.update
|
108
|
+
end
|
109
|
+
|
110
|
+
it "loads the new file" do
|
111
|
+
subject.update
|
112
|
+
expect(reloaded_files.keys).to include('path4')
|
113
|
+
end
|
114
|
+
|
115
|
+
it "makes the new file available from #get" do
|
116
|
+
subject.update
|
117
|
+
expect { subject.get('path4') }.to_not raise_error
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gluer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -119,6 +119,7 @@ files:
|
|
119
119
|
- lib/gluer/registration_hook.rb
|
120
120
|
- lib/gluer/registration_pool.rb
|
121
121
|
- lib/gluer/version.rb
|
122
|
+
- spec/file_pool_spec.rb
|
122
123
|
- spec/integration/default_usage_spec.rb
|
123
124
|
- spec/registration_spec.rb
|
124
125
|
- spec/spec_helper.rb
|
@@ -137,7 +138,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
137
138
|
version: '0'
|
138
139
|
segments:
|
139
140
|
- 0
|
140
|
-
hash: -
|
141
|
+
hash: -2018170584366941344
|
141
142
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
143
|
none: false
|
143
144
|
requirements:
|
@@ -146,7 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
147
|
version: '0'
|
147
148
|
segments:
|
148
149
|
- 0
|
149
|
-
hash: -
|
150
|
+
hash: -2018170584366941344
|
150
151
|
requirements: []
|
151
152
|
rubyforge_project:
|
152
153
|
rubygems_version: 1.8.25
|
@@ -154,6 +155,7 @@ signing_key:
|
|
154
155
|
specification_version: 3
|
155
156
|
summary: Configuration reloader
|
156
157
|
test_files:
|
158
|
+
- spec/file_pool_spec.rb
|
157
159
|
- spec/integration/default_usage_spec.rb
|
158
160
|
- spec/registration_spec.rb
|
159
161
|
- spec/spec_helper.rb
|