druid-tools 0.3.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +13 -5
- data/VERSION +1 -1
- data/lib/druid_tools/druid.rb +72 -2
- data/spec/druid_tools_spec.rb +131 -23
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YWYwNmM0OTExYjMwZDEyZTI4OTlmMGIzMGE5NzQ2NWY0NTlmNGVlOQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MDllNDUwYWUzMzJiZDUzZDUxZTA3NmQyYjFkMDQ1Y2FkMDQ3OWFhNg==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YWQ4NzY4ODNiYWI3NjZmZTQ0MDE3NDQzYTE5OWNiMjJhZTk3N2Y0ZTlhM2U5
|
10
|
+
ZDI3NDc2NTU4NDNlOTBiMWRmOWFiNjM5NDAzNzBlOWY3NGU5MDI5NTU3ZmJk
|
11
|
+
NTgxMThjYTlmODU0NTJhYTBhNDYzZDk5NTg4ODU2NmNlNTZlZWU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
N2E4ODdiZGEwMzI1YTU5ODE5ZDA1MjIxMmVjNmNhODZmZmQ0YTE1ZGY4Yzhl
|
14
|
+
ODYwOTY3NWEwOTU1ZWE4NDcwYzdhODcwYTI1YzliMmRkZTNkNDFjMjE1ZmI2
|
15
|
+
YzAwYTdlZjJkNTA3NDQxM2QyMzRmZWJkNGEyYjUzNTRjNDZhNzA=
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/lib/druid_tools/druid.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
require 'pathname'
|
2
|
+
require 'fileutils'
|
2
3
|
|
3
4
|
module DruidTools
|
4
5
|
class Druid
|
6
|
+
@@deletes_directory_name = '.deletes'
|
5
7
|
attr_accessor :druid, :base
|
6
8
|
|
7
9
|
class << self
|
@@ -136,16 +138,84 @@ module DruidTools
|
|
136
138
|
parent = this_path.parent
|
137
139
|
parent.rmtree if parent.exist? && parent != base_pathname
|
138
140
|
prune_ancestors parent.parent
|
141
|
+
creates_delete_record
|
139
142
|
end
|
140
|
-
|
143
|
+
|
144
|
+
#This function checks for existance of a .deletes dir one level into the path (ex: stacks/.deletes or purl/.deletes).
|
145
|
+
#If the directory does not exist, it is created. If the directory exists, check to see if the current druid has an entry there, if it does delete it.
|
146
|
+
#This is done because a file might be deleted, then republishing, then deleted we again, and we want to log the most recent delete.
|
147
|
+
#
|
148
|
+
#@raises [Errno::EACCES] If write priveleges are denied
|
149
|
+
#
|
150
|
+
#@return [void]
|
151
|
+
def prep_deletes_dir
|
152
|
+
#Check for existences of deletes dir
|
153
|
+
create_deletes_dir if !deletes_dir_exists?
|
154
|
+
#In theory we could return true after this step (if it fires), since if there was no deletes dir then the file can't be present in the dir
|
155
|
+
|
156
|
+
#Check to see if this druid has been deleted before, meaning file currently exists
|
157
|
+
deletes_delete_record if deletes_record_exists?
|
158
|
+
end
|
159
|
+
|
160
|
+
#Provide the location for the .deletes directory in the tree
|
161
|
+
#
|
162
|
+
#@return [Pathname] the path to the directory, ex: "stacks/.deletes"
|
163
|
+
def deletes_dir_pathname
|
164
|
+
return Pathname(self.base.to_s + (File::SEPARATOR+@@deletes_directory_name))
|
165
|
+
end
|
166
|
+
|
167
|
+
def deletes_record_pathname
|
168
|
+
return Pathname(deletes_dir_pathname.to_s + File::SEPARATOR + self.id)
|
169
|
+
end
|
170
|
+
|
171
|
+
#Using the deletes directory path supplied by deletes_dir_pathname, this function determines if this directory exists
|
172
|
+
#
|
173
|
+
#@return [Boolean] true if if exists, false if it does not
|
174
|
+
def deletes_dir_exists?
|
175
|
+
return File.directory?(deletes_dir_pathname)
|
176
|
+
end
|
177
|
+
|
178
|
+
def deletes_record_exists?
|
179
|
+
return File.exists?(deletes_dir_pathname.to_s + File::SEPARATOR + self.id)
|
180
|
+
end
|
181
|
+
|
182
|
+
#Creates the deletes dir using the path supplied by deletes_dir_pathname
|
183
|
+
#
|
184
|
+
#@raises [Errno::EACCES] If write priveleges are denied
|
185
|
+
#
|
186
|
+
#@return [void]
|
187
|
+
def create_deletes_dir
|
188
|
+
FileUtils::mkdir_p deletes_dir_pathname
|
189
|
+
end
|
190
|
+
|
191
|
+
#Deletes the delete record if it currently exists. This is done to change the filed created, not just last modified time, on the system
|
192
|
+
#
|
193
|
+
#@raises [Errno::EACCES] If write priveleges are denied
|
194
|
+
#
|
195
|
+
#return [void]
|
196
|
+
def deletes_delete_record
|
197
|
+
FileUtils.rm(deletes_record_pathname) if deletes_record_exists? #thrown in to prevent an Errno::ENOENT if you call this on something without a delete record
|
198
|
+
end
|
199
|
+
|
200
|
+
#Creates an empty (pointer) file using the object's id in the .deletes dir
|
201
|
+
#
|
202
|
+
#@raises [Errno::EACCES] If write priveleges are denied
|
203
|
+
#
|
204
|
+
#@return [void]
|
205
|
+
def creates_delete_record
|
206
|
+
prep_deletes_dir
|
207
|
+
FileUtils.touch(deletes_record_pathname)
|
208
|
+
end
|
209
|
+
|
141
210
|
# @param [Pathname] outermost_branch The branch at which pruning begins
|
142
211
|
# @return [void] Ascend the druid tree and prune empty branches
|
143
212
|
def prune_ancestors(outermost_branch)
|
144
|
-
while outermost_branch.
|
213
|
+
while outermost_branch.children.size == 0
|
145
214
|
outermost_branch.rmdir
|
146
215
|
outermost_branch = outermost_branch.parent
|
147
216
|
break if outermost_branch == base_pathname
|
148
217
|
end
|
218
|
+
rescue
|
149
219
|
end
|
150
220
|
|
151
221
|
end
|
data/spec/druid_tools_spec.rb
CHANGED
@@ -16,7 +16,7 @@ describe DruidTools::Druid do
|
|
16
16
|
FileUtils.rm_rf(File.join(@fixture_dir,'cd'))
|
17
17
|
end
|
18
18
|
|
19
|
-
it "
|
19
|
+
it "validate druid strings using the valid? class method" do
|
20
20
|
tests = [
|
21
21
|
# Expected Input druid
|
22
22
|
[true, 'druid:aa000bb0001'],
|
@@ -44,28 +44,28 @@ describe DruidTools::Druid do
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
it "
|
47
|
+
it "provides the full druid including the prefix" do
|
48
48
|
DruidTools::Druid.new('druid:cd456ef7890',@fixture_dir).druid.should == 'druid:cd456ef7890'
|
49
49
|
DruidTools::Druid.new('cd456ef7890',@fixture_dir).druid.should == 'druid:cd456ef7890'
|
50
50
|
end
|
51
51
|
|
52
|
-
it "
|
52
|
+
it "extracts the ID from the stem" do
|
53
53
|
DruidTools::Druid.new('druid:cd456ef7890',@fixture_dir).id.should == 'cd456ef7890'
|
54
54
|
DruidTools::Druid.new('cd456ef7890',@fixture_dir).id.should == 'cd456ef7890'
|
55
55
|
end
|
56
56
|
|
57
|
-
it "
|
57
|
+
it "raises an exception if the druid is invalid" do
|
58
58
|
lambda { DruidTools::Druid.new('nondruid:cd456ef7890',@fixture_dir) }.should raise_error(ArgumentError)
|
59
59
|
lambda { DruidTools::Druid.new('druid:cd4567ef890',@fixture_dir) }.should raise_error(ArgumentError)
|
60
60
|
end
|
61
61
|
|
62
|
-
it "
|
62
|
+
it "builds a druid tree from a druid" do
|
63
63
|
druid = DruidTools::Druid.new(@druid_1,@fixture_dir)
|
64
64
|
druid.tree.should == ['cd','456','ef','7890','cd456ef7890']
|
65
65
|
druid.path.should == @tree_1
|
66
66
|
end
|
67
67
|
|
68
|
-
it "
|
68
|
+
it "creates and destroys druid directories" do
|
69
69
|
File.exists?(@tree_1).should eq false
|
70
70
|
File.exists?(@tree_2).should eq false
|
71
71
|
|
@@ -99,7 +99,7 @@ describe DruidTools::Druid do
|
|
99
99
|
DruidTools::Druid.prefix = 'druid'
|
100
100
|
end
|
101
101
|
|
102
|
-
it "
|
102
|
+
it "handles alternate prefixes" do
|
103
103
|
lambda { DruidTools::Druid.new('druid:cd456ef7890',@fixture_dir) }.should raise_error(ArgumentError)
|
104
104
|
DruidTools::Druid.new('sulair:cd456ef7890',@fixture_dir).id.should == 'cd456ef7890'
|
105
105
|
DruidTools::Druid.new('cd456ef7890',@fixture_dir).druid.should == 'sulair:cd456ef7890'
|
@@ -107,7 +107,7 @@ describe DruidTools::Druid do
|
|
107
107
|
end
|
108
108
|
|
109
109
|
describe "content directories" do
|
110
|
-
it "
|
110
|
+
it "knows where its content goes" do
|
111
111
|
druid = DruidTools::Druid.new(@druid_1,@fixture_dir)
|
112
112
|
druid.content_dir(false).should == File.join(@tree_1,'content')
|
113
113
|
druid.metadata_dir(false).should == File.join(@tree_1,'metadata')
|
@@ -118,7 +118,7 @@ describe DruidTools::Druid do
|
|
118
118
|
File.exists?(File.join(@tree_1,'temp')).should eq false
|
119
119
|
end
|
120
120
|
|
121
|
-
it "
|
121
|
+
it "creates its content directories on the fly" do
|
122
122
|
druid = DruidTools::Druid.new(@druid_1,@fixture_dir)
|
123
123
|
druid.content_dir.should == File.join(@tree_1,'content')
|
124
124
|
druid.metadata_dir.should == File.join(@tree_1,'metadata')
|
@@ -129,7 +129,7 @@ describe DruidTools::Druid do
|
|
129
129
|
File.exists?(File.join(@tree_1,'temp')).should eq true
|
130
130
|
end
|
131
131
|
|
132
|
-
it "
|
132
|
+
it "matches glob" do
|
133
133
|
druid = DruidTools::Druid.new(@druid_1,@fixture_dir)
|
134
134
|
druid.mkdir
|
135
135
|
Dir.glob(File.join(File.dirname(druid.path), DruidTools::Druid::glob)).size.should == 1
|
@@ -142,37 +142,37 @@ describe DruidTools::Druid do
|
|
142
142
|
@filelist = %w(1 2 3 4).collect { |num| "someFile#{num}" }
|
143
143
|
end
|
144
144
|
|
145
|
-
it "
|
145
|
+
it "finds content in content directories" do
|
146
146
|
location = @druid.content_dir
|
147
147
|
File.open(File.join(location,'someContent'),'w') { |f| f.write 'This is the content' }
|
148
148
|
@druid.find_content('someContent').should == File.join(location,'someContent')
|
149
149
|
end
|
150
150
|
|
151
|
-
it "
|
151
|
+
it "finds content in the root directory" do
|
152
152
|
location = @druid.path(nil,true)
|
153
153
|
File.open(File.join(location,'someContent'),'w') { |f| f.write 'This is the content' }
|
154
154
|
@druid.find_content('someContent').should == File.join(location,'someContent')
|
155
155
|
end
|
156
156
|
|
157
|
-
it "
|
157
|
+
it "finds content in the leaf directory" do
|
158
158
|
location = File.expand_path('..',@druid.path(nil,true))
|
159
159
|
File.open(File.join(location,'someContent'),'w') { |f| f.write 'This is the content' }
|
160
160
|
@druid.find_content('someContent').should == File.join(location,'someContent')
|
161
161
|
end
|
162
162
|
|
163
|
-
it "
|
163
|
+
it "does not find content in the wrong content directory" do
|
164
164
|
location = @druid.metadata_dir
|
165
165
|
File.open(File.join(location,'someContent'),'w') { |f| f.write 'This is the content' }
|
166
166
|
@druid.find_content('someContent').should be_nil
|
167
167
|
end
|
168
168
|
|
169
|
-
it "
|
169
|
+
it "does not find content in a higher-up directory" do
|
170
170
|
location = File.expand_path('../..',@druid.path(nil,true))
|
171
171
|
File.open(File.join(location,'someContent'),'w') { |f| f.write 'This is the content' }
|
172
172
|
@druid.find_content('someContent').should be_nil
|
173
173
|
end
|
174
174
|
|
175
|
-
it "
|
175
|
+
it "finds a filelist in the content directory" do
|
176
176
|
location = Pathname(@druid.content_dir)
|
177
177
|
@filelist.each do |filename|
|
178
178
|
location.join(filename).open('w') { |f| f.write "This is #{filename}" }
|
@@ -180,7 +180,7 @@ describe DruidTools::Druid do
|
|
180
180
|
@druid.find_filelist_parent('content',@filelist).should == location
|
181
181
|
end
|
182
182
|
|
183
|
-
it "
|
183
|
+
it "finds a filelist in the root directory" do
|
184
184
|
location = Pathname(@druid.path(nil,true))
|
185
185
|
@filelist.each do |filename|
|
186
186
|
location.join(filename).open('w') { |f| f.write "This is #{filename}" }
|
@@ -188,7 +188,7 @@ describe DruidTools::Druid do
|
|
188
188
|
@druid.find_filelist_parent('content',@filelist).should == location
|
189
189
|
end
|
190
190
|
|
191
|
-
it "
|
191
|
+
it "finds a filelist in the leaf directory" do
|
192
192
|
location = Pathname(File.expand_path('..',@druid.path(nil,true)))
|
193
193
|
@filelist.each do |filename|
|
194
194
|
location.join(filename).open('w') { |f| f.write "This is #{filename}" }
|
@@ -196,12 +196,12 @@ describe DruidTools::Druid do
|
|
196
196
|
@druid.find_filelist_parent('content',@filelist).should == location
|
197
197
|
end
|
198
198
|
|
199
|
-
it "
|
199
|
+
it "raises an exception if the first file in the filelist is not found" do
|
200
200
|
location = Pathname(@druid.content_dir)
|
201
201
|
lambda{@druid.find_filelist_parent('content',@filelist)}.should raise_exception(/content dir not found for 'someFile1' when searching/)
|
202
202
|
end
|
203
203
|
|
204
|
-
it "
|
204
|
+
it "raises an exception if any other file in the filelist is not found" do
|
205
205
|
location = Pathname(@druid.content_dir)
|
206
206
|
location.join(@filelist.first).open('w') { |f| f.write "This is #{@filelist.first}" }
|
207
207
|
lambda{@druid.find_filelist_parent('content',@filelist)}.should raise_exception(/File 'someFile2' not found/)
|
@@ -240,7 +240,7 @@ describe DruidTools::Druid do
|
|
240
240
|
File.readlink(@tree_2).should == @source_dir
|
241
241
|
end
|
242
242
|
|
243
|
-
it "
|
243
|
+
it "does not error out if the link to source already exists" do
|
244
244
|
@dr.mkdir_with_final_link(@source_dir)
|
245
245
|
File.should be_symlink(@dr.path)
|
246
246
|
File.readlink(@tree_2).should == @source_dir
|
@@ -250,6 +250,8 @@ describe DruidTools::Druid do
|
|
250
250
|
@dr.mkdir(@fixture_dir)
|
251
251
|
lambda { @dr.mkdir_with_final_link(@source_di) }.should raise_error(DruidTools::DifferentContentExistsError)
|
252
252
|
end
|
253
|
+
|
254
|
+
|
253
255
|
end
|
254
256
|
|
255
257
|
describe "#prune!" do
|
@@ -259,7 +261,8 @@ describe DruidTools::Druid do
|
|
259
261
|
let(:dr1) { DruidTools::Druid.new @druid_1, workspace }
|
260
262
|
let(:dr2) { DruidTools::Druid.new @druid_2, workspace }
|
261
263
|
let(:pathname1) { dr1.pathname }
|
262
|
-
|
264
|
+
|
265
|
+
|
263
266
|
after(:each) do
|
264
267
|
FileUtils.remove_entry workspace
|
265
268
|
end
|
@@ -267,6 +270,8 @@ describe DruidTools::Druid do
|
|
267
270
|
context "shared ancestor" do
|
268
271
|
|
269
272
|
before(:each) do
|
273
|
+
#Nil the create records for this context because we're in a known read only one
|
274
|
+
|
270
275
|
dr1.mkdir
|
271
276
|
dr2.mkdir
|
272
277
|
dr1.prune!
|
@@ -290,20 +295,123 @@ describe DruidTools::Druid do
|
|
290
295
|
end
|
291
296
|
|
292
297
|
it "removes all directories up to the base path when there are no common ancestors" do
|
298
|
+
#Make sure a delete record is not present
|
299
|
+
expect(dr1.deletes_record_exists?).to be_falsey
|
300
|
+
|
301
|
+
#Nil the create records for this test
|
293
302
|
dr1.mkdir
|
294
303
|
dr1.prune!
|
295
304
|
expect(File).to_not exist(File.join(workspace, 'cd'))
|
296
305
|
expect(File).to exist(workspace)
|
306
|
+
|
307
|
+
#Make sure a delete record was created
|
308
|
+
expect(dr1.deletes_dir_exists?).to be_truthy
|
309
|
+
expect(dr1.deletes_record_exists?).to be_truthy
|
297
310
|
end
|
298
311
|
|
299
312
|
it "removes directories with symlinks" do
|
313
|
+
#Make sure a delete record is not present
|
314
|
+
expect(dr2.deletes_record_exists?).to be_falsey
|
315
|
+
|
316
|
+
#Nil the create records for this test
|
300
317
|
source_dir = File.join workspace, 'src_dir'
|
301
318
|
FileUtils.mkdir_p(source_dir)
|
302
319
|
dr2.mkdir_with_final_link(source_dir)
|
303
320
|
dr2.prune!
|
304
321
|
expect(File).to_not exist(dr2.path)
|
305
322
|
expect(File).to_not exist(File.join(workspace, 'cd'))
|
323
|
+
|
324
|
+
#Make sure a delete record was created
|
325
|
+
expect(dr2.deletes_dir_exists?).to be_truthy
|
326
|
+
expect(dr2.deletes_record_exists?).to be_truthy
|
327
|
+
end
|
328
|
+
|
329
|
+
describe "logging deleted druids" do
|
330
|
+
|
331
|
+
#Purge any paths or delete records created in the test
|
332
|
+
after :each do
|
333
|
+
#Remove the .deletes dir to clean up
|
334
|
+
dr2.deletes_delete_record if dr2.deletes_record_exists?
|
335
|
+
FileUtils.rm_rf dr2.deletes_dir_pathname
|
336
|
+
|
337
|
+
end
|
338
|
+
|
339
|
+
it "returns the path to the .deletes directory as a Pathname" do
|
340
|
+
expect(dr2.deletes_dir_pathname.class).to eq(Pathname)
|
341
|
+
end
|
342
|
+
|
343
|
+
it "returns the path to the delete record for a druid as a Pathname" do
|
344
|
+
expect(dr2.deletes_record_pathname.class).to eq(Pathname)
|
345
|
+
end
|
346
|
+
|
347
|
+
it "returns the path to the delete record for a druid as top_level/.deletes/druid" do
|
348
|
+
expect(dr2.deletes_record_pathname.to_s).to eq("#{dr2.base}/.deletes/#{dr2.id}")
|
349
|
+
end
|
350
|
+
|
351
|
+
it "returns false when the .deletes dir is not present on the file system" do
|
352
|
+
expect(dr2.deletes_dir_exists?).to be_falsey
|
353
|
+
end
|
354
|
+
|
355
|
+
it "creates the .deletes dir and detect it exists" do
|
356
|
+
|
357
|
+
#Clean the .deletes dir if present
|
358
|
+
FileUtils.rm_rf dr2.deletes_dir_pathname
|
359
|
+
|
360
|
+
#Test for exists? and create
|
361
|
+
expect(dr2.deletes_dir_exists?).to be_falsey
|
362
|
+
dr2.create_deletes_dir
|
363
|
+
expect(dr2.deletes_dir_exists?).to be_truthy
|
364
|
+
end
|
365
|
+
|
366
|
+
it "returns false when the .deletes dir does not have a deleted record for a druid" do
|
367
|
+
expect(dr2.deletes_record_exists?).to be_falsey
|
368
|
+
end
|
369
|
+
|
370
|
+
it "creates a deleted record with a parent directory that has no .deletes directory and no deleted for the file and successfully create a delete record there" do
|
371
|
+
#Expect there not to be a .deletes dir or file (the file expectation is redundant I know)
|
372
|
+
expect(dr2.deletes_dir_exists?).to be_falsey
|
373
|
+
expect(dr2.deletes_record_exists?).to be_falsey
|
374
|
+
|
375
|
+
#Create the delete record
|
376
|
+
dr2.creates_delete_record
|
377
|
+
|
378
|
+
#Check to ensure items were created
|
379
|
+
expect(dr2.deletes_dir_exists?).to be_truthy
|
380
|
+
expect(dr2.deletes_record_exists?).to be_truthy
|
381
|
+
end
|
382
|
+
|
383
|
+
it "creates a delete record with a parent directory that has a .deletes directory that does not contain a delete record for this druid" do
|
384
|
+
#Expect there not to be a .deletes dir or file (the file expectation is redundant I know)
|
385
|
+
expect(dr2.deletes_dir_exists?).to be_falsey
|
386
|
+
expect(dr2.deletes_record_exists?).to be_falsey
|
387
|
+
|
388
|
+
#Creates the deletes dir and check
|
389
|
+
dr2.create_deletes_dir
|
390
|
+
expect(dr2.deletes_dir_exists?).to be_truthy
|
391
|
+
expect(dr2.deletes_record_exists?).to be_falsey
|
392
|
+
|
393
|
+
#Create the delete record
|
394
|
+
dr2.creates_delete_record
|
395
|
+
|
396
|
+
#Check to ensure items were created
|
397
|
+
expect(dr2.deletes_dir_exists?).to be_truthy
|
398
|
+
expect(dr2.deletes_record_exists?).to be_truthy
|
399
|
+
end
|
400
|
+
|
401
|
+
it "creates a delete record with a parent directory that does not have a .deletes directory and contains an older delete record" do
|
402
|
+
#Expect there not to be a .deletes dir or file (the file expectation is redundant I know)
|
403
|
+
expect(dr2.deletes_dir_exists?).to be_falsey
|
404
|
+
expect(dr2.deletes_record_exists?).to be_falsey
|
405
|
+
|
406
|
+
dr2.creates_delete_record
|
407
|
+
time = Time.now
|
408
|
+
expect(File.mtime(dr2.deletes_record_pathname)).to be <= time
|
409
|
+
sleep(1) #force a one second pause in case the machine is fast (as in not some old Commodore64), since mtime only goes down to the second
|
410
|
+
|
411
|
+
dr2.creates_delete_record
|
412
|
+
#Should have a new newer deleted record
|
413
|
+
expect(File.mtime(dr2.deletes_record_pathname)).to be > time
|
414
|
+
end
|
306
415
|
end
|
307
416
|
end
|
308
|
-
|
309
417
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: druid-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Klein
|
@@ -9,34 +9,34 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-03-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ! '>='
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: 10.1.0
|
21
21
|
type: :development
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - ! '>='
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: 10.1.0
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rspec
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - ~>
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '3.0'
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- -
|
39
|
+
- - ~>
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '3.0'
|
42
42
|
description: Tools to manipulate DRUID trees and content directories
|
@@ -46,7 +46,7 @@ executables: []
|
|
46
46
|
extensions: []
|
47
47
|
extra_rdoc_files: []
|
48
48
|
files:
|
49
|
-
-
|
49
|
+
- .gitignore
|
50
50
|
- Gemfile
|
51
51
|
- LICENSE
|
52
52
|
- README.md
|
@@ -103,17 +103,17 @@ require_paths:
|
|
103
103
|
- lib
|
104
104
|
required_ruby_version: !ruby/object:Gem::Requirement
|
105
105
|
requirements:
|
106
|
-
- -
|
106
|
+
- - ! '>='
|
107
107
|
- !ruby/object:Gem::Version
|
108
108
|
version: '0'
|
109
109
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
110
|
requirements:
|
111
|
-
- -
|
111
|
+
- - ! '>='
|
112
112
|
- !ruby/object:Gem::Version
|
113
113
|
version: '0'
|
114
114
|
requirements: []
|
115
115
|
rubyforge_project:
|
116
|
-
rubygems_version: 2.
|
116
|
+
rubygems_version: 2.1.2
|
117
117
|
signing_key:
|
118
118
|
specification_version: 4
|
119
119
|
summary: Tools to manipulate DRUID trees and content directories
|