spool_pool 0.2.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.
- data/History.rdoc +15 -0
- data/LICENSE.txt +27 -0
- data/README.rdoc +53 -0
- data/TODOs +1 -0
- data/lib/spool_pool.rb +53 -0
- data/lib/spool_pool/file.rb +161 -0
- data/lib/spool_pool/pool.rb +172 -0
- data/lib/spool_pool/spool.rb +113 -0
- data/scripts/perf_test.rb +16 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/spool_pool/file_spec.rb +119 -0
- data/spec/spool_pool/pool_spec.rb +492 -0
- data/spec/spool_pool/spool_spec.rb +245 -0
- metadata +68 -0
@@ -0,0 +1,245 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SpoolPool::Spool do
|
4
|
+
before( :each ) do
|
5
|
+
@testspoolpath = File.join( TEST_SPOOL_ROOT, "spools" )
|
6
|
+
@pathname = Pathname.new( @testspoolpath )
|
7
|
+
@pathname.mkpath
|
8
|
+
@pathname.chmod 0755
|
9
|
+
@instance = SpoolPool::Spool.new( @pathname )
|
10
|
+
end
|
11
|
+
|
12
|
+
after( :each ) do
|
13
|
+
@pathname.rmtree if @pathname.exist?
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should have a pathname attribute" do
|
17
|
+
@instance.should respond_to( :pathname )
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#initialize" do
|
21
|
+
it "should set the pathname attribute" do
|
22
|
+
@instance.pathname.should == @pathname
|
23
|
+
end
|
24
|
+
|
25
|
+
context "if the directory exists" do
|
26
|
+
before( :each ) do
|
27
|
+
@pathname.mkpath
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should raise an exception if it can't create a file" do
|
31
|
+
with_fs_mode( @pathname, 0555 ) do
|
32
|
+
lambda { SpoolPool::Spool.new( @pathname ) }.should raise_error( Errno::EACCES )
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should raise an exception if it can't read a file" do
|
37
|
+
with_fs_mode( @pathname, 0333 ) do
|
38
|
+
lambda { SpoolPool::Spool.new( @pathname ) }.should raise_error( Errno::EACCES )
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "if the directory doesn't exist" do
|
44
|
+
before( :each ) do
|
45
|
+
@pathname.unlink if @pathname.exist?
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should not check accessablity" do
|
49
|
+
@pathname.should_not_receive( :readable? )
|
50
|
+
@pathname.should_not_receive( :writable? )
|
51
|
+
SpoolPool::Spool.new( @pathname )
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#put" do
|
57
|
+
before( :each ) do
|
58
|
+
@data = 'some data'
|
59
|
+
end
|
60
|
+
|
61
|
+
context "the queue directory doesn't exist" do
|
62
|
+
before( :each ) do
|
63
|
+
@pathname.rmtree if @pathname.exist?
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should try to create the queue directory" do
|
67
|
+
path = @instance.put( @data )
|
68
|
+
|
69
|
+
@pathname.should exist
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should raise an exception if it can't create the spool_dir" do
|
73
|
+
with_fs_mode( @pathname.parent, 0000 ) do
|
74
|
+
lambda { @instance.put( @data ) }.should raise_error
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should return the path of the stored file" do
|
80
|
+
path = @instance.put( @data )
|
81
|
+
Pathname.new( path ).read.should == @instance.serialize( @data )
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "the #get/#put pair" do
|
86
|
+
it "should serialize and deserialize the data written" do
|
87
|
+
data = { :foo => 2, :bar => [ "some string", 3.45, ] }
|
88
|
+
|
89
|
+
@instance.put data
|
90
|
+
read_data = @instance.get
|
91
|
+
|
92
|
+
read_data.should == data
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "#get" do
|
97
|
+
before( :each ) do
|
98
|
+
@pathname.mkpath
|
99
|
+
@pathname.chmod 0755
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should return the contents of one of the files with the oldest ctime in spool directory" do
|
103
|
+
oldest_data = 'foo'
|
104
|
+
youngest_data = 'blubb'
|
105
|
+
@instance.put oldest_data
|
106
|
+
@instance.put youngest_data
|
107
|
+
|
108
|
+
@instance.get.should == oldest_data
|
109
|
+
end
|
110
|
+
|
111
|
+
context "no file is available in the requested spool" do
|
112
|
+
before( :each ) do
|
113
|
+
@pathname.children.each { |child| child.unlink }
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should return nil" do
|
117
|
+
@instance.get.should be_nil
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should raise an exception if the queue directory is not readable" do
|
122
|
+
with_fs_mode( @pathname, 0000 ) do
|
123
|
+
lambda { @instance.get }.should raise_error
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
context "if no block is passed" do
|
128
|
+
it "should delete the read file" do
|
129
|
+
path = Pathname.new( @instance.put( @data ) )
|
130
|
+
@instance.get
|
131
|
+
path.should_not be_exist
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
context "if a block is passed" do
|
136
|
+
it "should yield the contents of one of the files with the oldest ctime in spool directory" do
|
137
|
+
oldest_data = 'foo'
|
138
|
+
youngest_data = 'blubb'
|
139
|
+
@instance.put oldest_data
|
140
|
+
@instance.put youngest_data
|
141
|
+
|
142
|
+
@instance.get { |spool_data| spool_data.should == oldest_data }
|
143
|
+
end
|
144
|
+
|
145
|
+
context "no exception was raised within the passed block" do
|
146
|
+
it "should delete the read file" do
|
147
|
+
path = Pathname.new( @instance.put( @data ) )
|
148
|
+
@instance.get{}
|
149
|
+
path.should_not be_exist
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
context "an exception was raised within the passed block" do
|
154
|
+
it "should not delete the read file" do
|
155
|
+
path = Pathname.new( @instance.put( @data ) )
|
156
|
+
lambda{ @instance.get{ raise RuntimeError } }
|
157
|
+
path.should be_exist
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should let the raised exception bubble up" do
|
161
|
+
path = Pathname.new( @instance.put( @data ) )
|
162
|
+
lambda{ @instance.get{ raise RuntimeError } }.should raise_error( RuntimeError )
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should raise an exception if the oldest file in the queue directory is not readable" do
|
168
|
+
path = Pathname.new( @instance.put( @data ) )
|
169
|
+
with_fs_mode( path, 0333 ) do
|
170
|
+
lambda { @instance.get{} }.should raise_error
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
it "should raise an exception if the oldest file in the queue directory is not deleteable" do
|
175
|
+
path = Pathname.new( @instance.put( @data ) )
|
176
|
+
with_fs_mode( @pathname, 0555 ) do
|
177
|
+
lambda { @instance.get{} }.should raise_error
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
describe "#flush" do
|
184
|
+
context "each file in the spool directory" do
|
185
|
+
before( :each ) do
|
186
|
+
@oldest_data = "oldest data"
|
187
|
+
@middle_data = "middle data"
|
188
|
+
@youngest_data = "youngest data"
|
189
|
+
@oldest_file = @instance.put @oldest_data
|
190
|
+
@middle_file = @instance.put @middle_data
|
191
|
+
@youngest_file = @instance.put @youngest_data
|
192
|
+
end
|
193
|
+
|
194
|
+
it "should be yielded to the passed block" do
|
195
|
+
times_yielded = 0
|
196
|
+
@instance.flush { times_yielded += 1 }
|
197
|
+
times_yielded.should == 3
|
198
|
+
end
|
199
|
+
|
200
|
+
it "should be yielded ordered by date, oldest first" do
|
201
|
+
times_yielded = 0
|
202
|
+
@instance.flush do |data|
|
203
|
+
times_yielded += 1
|
204
|
+
case times_yielded
|
205
|
+
when 1 then data.should == @oldest_data
|
206
|
+
when 2 then data.should == @middle_data
|
207
|
+
when 3 then data.should == @youngest_data
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
it "should be deleted after it was processed" do
|
213
|
+
times_yielded = 0
|
214
|
+
@instance.flush do |data|
|
215
|
+
times_yielded += 1
|
216
|
+
case times_yielded
|
217
|
+
when 1 then File.exist?(@oldest_file).should_not be_true
|
218
|
+
when 2 then File.exist?(@middle_file).should_not be_true
|
219
|
+
when 3 then File.exist?(@youngest_file).should_not be_true
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
it "should raise an exception if the queue directory is not readable" do
|
226
|
+
with_fs_mode( @pathname, 0000 ) do
|
227
|
+
lambda { @instance.fetch }.should raise_error
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
it "should raise an exception if the oldest file in the queue directory is not readable" do
|
232
|
+
path = Pathname.new( @instance.put( @data ) )
|
233
|
+
with_fs_mode( path, 0333 ) do
|
234
|
+
lambda { @instance.fetch }.should raise_error
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
it "should raise an exception if the oldest file in the queue directory is not deleteable" do
|
239
|
+
path = Pathname.new( @instance.put( @data ) )
|
240
|
+
with_fs_mode( @pathname, 0555 ) do
|
241
|
+
lambda { @instance.fetch }.should raise_error
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: spool_pool
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sven Riedel
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-02-11 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: A simple library for spooler pools.
|
17
|
+
email: sr@gimp.org
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- LICENSE.txt
|
24
|
+
- README.rdoc
|
25
|
+
files:
|
26
|
+
- LICENSE.txt
|
27
|
+
- README.rdoc
|
28
|
+
- History.rdoc
|
29
|
+
- TODOs
|
30
|
+
- lib/spool_pool.rb
|
31
|
+
- lib/spool_pool/pool.rb
|
32
|
+
- lib/spool_pool/spool.rb
|
33
|
+
- lib/spool_pool/file.rb
|
34
|
+
- spec/spec_helper.rb
|
35
|
+
- spec/spool_pool/pool_spec.rb
|
36
|
+
- spec/spool_pool/spool_spec.rb
|
37
|
+
- spec/spool_pool/file_spec.rb
|
38
|
+
- scripts/perf_test.rb
|
39
|
+
has_rdoc: true
|
40
|
+
homepage:
|
41
|
+
licenses: []
|
42
|
+
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options:
|
45
|
+
- --charset=UTF-8
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.9.1
|
53
|
+
version:
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: "0"
|
59
|
+
version:
|
60
|
+
requirements: []
|
61
|
+
|
62
|
+
rubyforge_project:
|
63
|
+
rubygems_version: 1.3.5
|
64
|
+
signing_key:
|
65
|
+
specification_version: 3
|
66
|
+
summary: A simple library for spooler pools.
|
67
|
+
test_files: []
|
68
|
+
|