druid-tools 0.4.0 → 0.4.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 +5 -13
- data/.rspec +1 -0
- data/.travis.yml +8 -0
- data/README.md +69 -55
- data/VERSION +1 -1
- data/lib/druid_tools/druid.rb +18 -19
- data/spec/druid_tools_spec.rb +160 -151
- metadata +12 -10
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
MDllNDUwYWUzMzJiZDUzZDUxZTA3NmQyYjFkMDQ1Y2FkMDQ3OWFhNg==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ff667823f90ed97f46171b13552720e11baf161b
|
4
|
+
data.tar.gz: e49db2f65f8a5734d67d7619d42477f56361cc9b
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
ZDI3NDc2NTU4NDNlOTBiMWRmOWFiNjM5NDAzNzBlOWY3NGU5MDI5NTU3ZmJk
|
11
|
-
NTgxMThjYTlmODU0NTJhYTBhNDYzZDk5NTg4ODU2NmNlNTZlZWU=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
N2E4ODdiZGEwMzI1YTU5ODE5ZDA1MjIxMmVjNmNhODZmZmQ0YTE1ZGY4Yzhl
|
14
|
-
ODYwOTY3NWEwOTU1ZWE4NDcwYzdhODcwYTI1YzliMmRkZTNkNDFjMjE1ZmI2
|
15
|
-
YzAwYTdlZjJkNTA3NDQxM2QyMzRmZWJkNGEyYjUzNTRjNDZhNzA=
|
6
|
+
metadata.gz: c95447c9d7b356c96894ea5de798d4292786e8fa2a9c86d696cf3cc87e764ec29c3e97b4ff0aec8007a528ebe6c9d0fefba825bcd63c4f7508c104e74e8b9a2a
|
7
|
+
data.tar.gz: 222ec27e234269a5606092d3889dbf40b68f22bc6a37e3b5e7791e9a8cfd3255addf873fdfe7ada1656be71e6e0203b03aa0b5e2cd9eb235ddf78112a44fe6c1
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -6,85 +6,99 @@ Tools to manipulate DRUID trees and content directories
|
|
6
6
|
|
7
7
|
### Get attributes and paths
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
9
|
+
```ruby
|
10
|
+
d = DruidTools::Druid.new('druid:ab123cd4567', '/dor/workspace')
|
11
|
+
d.druid
|
12
|
+
=> "druid:ab123cd4567"
|
13
|
+
d.id
|
14
|
+
=> "ab123cd4567"
|
15
|
+
d.path
|
16
|
+
=> "/dor/workspace/ab/123/cd/4567/ab123cd4567"
|
17
|
+
d.content_dir
|
18
|
+
=> "/dor/workspace/ab/123/cd/4567/ab123cd4567/content"
|
19
|
+
d.path('content/my_file.jpg')
|
20
|
+
=> "/dor/workspace/ab/123/cd/4567/ab123cd4567/content/my_file.jpg"
|
21
|
+
```
|
20
22
|
|
21
23
|
### Check whether a druid is valid
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
```ruby
|
26
|
+
d = DruidTools::Druid.valid?('druid:ab123cd4567')
|
27
|
+
=> true
|
28
|
+
d = DruidTools::Druid.valid?('blah')
|
29
|
+
=> false
|
30
|
+
```
|
27
31
|
|
28
32
|
### Manipulate directories and symlinks
|
29
33
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
34
|
+
```ruby
|
35
|
+
# Make the druid tree
|
36
|
+
d.mkdir
|
37
|
+
# Make a directory within the druid triee
|
38
|
+
d.mkdir('temp')
|
39
|
+
# Remove a druid tree, but only up to the last shared branch directory
|
40
|
+
d.rmdir
|
41
|
+
# Link content from another source into a druid tree
|
42
|
+
d.mkdir_with_final_link('/some/other/content/location')
|
43
|
+
```
|
38
44
|
|
39
45
|
### Content-specific methods create the relevant directories if they don't exist
|
40
46
|
|
41
47
|
Pass `false` as a parameter to prevent directory creation, or `true` (default) to create directories.
|
42
48
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
49
|
+
```ruby
|
50
|
+
d.content_dir(false)
|
51
|
+
=> "/dor/workspace/ab/123/cd/4567/ab123cd4567/content"
|
52
|
+
File.directory?(d.content_dir(false))
|
53
|
+
=> false
|
54
|
+
File.directory?(d.content_dir)
|
55
|
+
=> true
|
56
|
+
d.metadata_dir(false)
|
57
|
+
=> "/dor/workspace/ab/123/cd/4567/ab123cd4567/metadata"
|
58
|
+
d.temp_dir(false)
|
59
|
+
=> "/dor/workspace/ab/123/cd/4567/ab123cd4567/temp"
|
60
|
+
```
|
53
61
|
|
54
62
|
### Locate existing content within the druid tree
|
55
63
|
|
56
|
-
|
57
|
-
|
58
|
-
|
64
|
+
```ruby
|
65
|
+
# In the correct directory
|
66
|
+
d.find_metadata('contentMetadata.xml')
|
67
|
+
=> "/dor/workspace/ab/123/cd/4567/ab123cd4567/metadata/contentMetadata.xml"
|
59
68
|
|
60
|
-
|
61
|
-
|
62
|
-
|
69
|
+
# In other known previous locations, for backward compatibility
|
70
|
+
d.find_metadata('contentMetadata.xml')
|
71
|
+
=> "/dor/workspace/ab/123/cd/4567/ab123cd4567/contentMetadata.xml"
|
63
72
|
|
64
|
-
|
65
|
-
|
73
|
+
d.find_metadata('contentMetadata.xml')
|
74
|
+
=> "/dor/workspace/ab/123/cd/4567/contentMetadata.xml"
|
66
75
|
|
67
|
-
|
68
|
-
|
76
|
+
d.find_content('this/file/does/not/exist.jpg')
|
77
|
+
=> nil
|
78
|
+
```
|
69
79
|
|
70
80
|
### Pruning: removes leaves of tree up to non-empty branches
|
71
81
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
82
|
+
```ruby
|
83
|
+
d1 = DruidTools::Druid.new 'druid:cd456ef7890', '/workspace'
|
84
|
+
d1.mkdir
|
85
|
+
d2 = DruidTools::Druid.new 'druid:cd456gh1234', '/workspace'
|
86
|
+
d2.mkdir
|
76
87
|
|
77
|
-
|
78
|
-
|
79
|
-
|
88
|
+
# /workspace/cd/456/gh/1234/cd456gh1234 pruned down to /workspace/cd/456
|
89
|
+
# /workspace/cd/456/ef/7890/cd456ef7890 left intact
|
90
|
+
d2.prune!
|
91
|
+
```
|
80
92
|
|
81
93
|
### Stacks and Purl compatible Druid. All files at the leaf directories
|
82
94
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
95
|
+
```ruby
|
96
|
+
pd = DruidTools::PurlDruid.new 'druid:ab123cd4567', '/purl'
|
97
|
+
pd.path
|
98
|
+
=> "/purl/ab/123/cd/4567"
|
99
|
+
pd.content_dir
|
100
|
+
=> "/purl/ab/123/cd/4567"
|
101
|
+
```
|
88
102
|
|
89
103
|
### History
|
90
104
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.1
|
data/lib/druid_tools/druid.rb
CHANGED
@@ -138,47 +138,47 @@ module DruidTools
|
|
138
138
|
parent = this_path.parent
|
139
139
|
parent.rmtree if parent.exist? && parent != base_pathname
|
140
140
|
prune_ancestors parent.parent
|
141
|
-
creates_delete_record
|
141
|
+
creates_delete_record
|
142
142
|
end
|
143
|
-
|
144
|
-
#This function checks for existance of a .deletes dir one level into the path (ex: stacks/.deletes or purl/.deletes).
|
143
|
+
|
144
|
+
#This function checks for existance of a .deletes dir one level into the path (ex: stacks/.deletes or purl/.deletes).
|
145
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.
|
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
147
|
#
|
148
148
|
#@raises [Errno::EACCES] If write priveleges are denied
|
149
149
|
#
|
150
|
-
#@return [void]
|
150
|
+
#@return [void]
|
151
151
|
def prep_deletes_dir
|
152
|
-
#Check for existences of deletes dir
|
152
|
+
#Check for existences of deletes dir
|
153
153
|
create_deletes_dir if !deletes_dir_exists?
|
154
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
155
|
|
156
|
-
#Check to see if this druid has been deleted before, meaning file currently exists
|
156
|
+
#Check to see if this druid has been deleted before, meaning file currently exists
|
157
157
|
deletes_delete_record if deletes_record_exists?
|
158
158
|
end
|
159
|
-
|
159
|
+
|
160
160
|
#Provide the location for the .deletes directory in the tree
|
161
161
|
#
|
162
162
|
#@return [Pathname] the path to the directory, ex: "stacks/.deletes"
|
163
163
|
def deletes_dir_pathname
|
164
164
|
return Pathname(self.base.to_s + (File::SEPARATOR+@@deletes_directory_name))
|
165
165
|
end
|
166
|
-
|
166
|
+
|
167
167
|
def deletes_record_pathname
|
168
168
|
return Pathname(deletes_dir_pathname.to_s + File::SEPARATOR + self.id)
|
169
169
|
end
|
170
|
-
|
171
|
-
#Using the deletes directory path supplied by deletes_dir_pathname, this function determines if this directory exists
|
170
|
+
|
171
|
+
#Using the deletes directory path supplied by deletes_dir_pathname, this function determines if this directory exists
|
172
172
|
#
|
173
173
|
#@return [Boolean] true if if exists, false if it does not
|
174
174
|
def deletes_dir_exists?
|
175
|
-
return File.directory?(deletes_dir_pathname)
|
175
|
+
return File.directory?(deletes_dir_pathname)
|
176
176
|
end
|
177
|
-
|
177
|
+
|
178
178
|
def deletes_record_exists?
|
179
179
|
return File.exists?(deletes_dir_pathname.to_s + File::SEPARATOR + self.id)
|
180
180
|
end
|
181
|
-
|
181
|
+
|
182
182
|
#Creates the deletes dir using the path supplied by deletes_dir_pathname
|
183
183
|
#
|
184
184
|
#@raises [Errno::EACCES] If write priveleges are denied
|
@@ -187,7 +187,7 @@ module DruidTools
|
|
187
187
|
def create_deletes_dir
|
188
188
|
FileUtils::mkdir_p deletes_dir_pathname
|
189
189
|
end
|
190
|
-
|
190
|
+
|
191
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
192
|
#
|
193
193
|
#@raises [Errno::EACCES] If write priveleges are denied
|
@@ -196,7 +196,7 @@ module DruidTools
|
|
196
196
|
def deletes_delete_record
|
197
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
198
|
end
|
199
|
-
|
199
|
+
|
200
200
|
#Creates an empty (pointer) file using the object's id in the .deletes dir
|
201
201
|
#
|
202
202
|
#@raises [Errno::EACCES] If write priveleges are denied
|
@@ -206,16 +206,15 @@ module DruidTools
|
|
206
206
|
prep_deletes_dir
|
207
207
|
FileUtils.touch(deletes_record_pathname)
|
208
208
|
end
|
209
|
-
|
209
|
+
|
210
210
|
# @param [Pathname] outermost_branch The branch at which pruning begins
|
211
211
|
# @return [void] Ascend the druid tree and prune empty branches
|
212
212
|
def prune_ancestors(outermost_branch)
|
213
|
-
while outermost_branch.children.size == 0
|
213
|
+
while outermost_branch.exist? && outermost_branch.children.size == 0
|
214
214
|
outermost_branch.rmdir
|
215
215
|
outermost_branch = outermost_branch.parent
|
216
216
|
break if outermost_branch == base_pathname
|
217
217
|
end
|
218
|
-
rescue
|
219
218
|
end
|
220
219
|
|
221
220
|
end
|
data/spec/druid_tools_spec.rb
CHANGED
@@ -40,54 +40,54 @@ describe DruidTools::Druid do
|
|
40
40
|
[true, 'druid:zz943vx1492']
|
41
41
|
]
|
42
42
|
tests.each do |exp, dru|
|
43
|
-
DruidTools::Druid.valid?(dru).
|
43
|
+
expect(DruidTools::Druid.valid?(dru)).to eq(exp)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
it "provides the full druid including the prefix" do
|
48
|
-
DruidTools::Druid.new('druid:cd456ef7890',@fixture_dir).druid.
|
49
|
-
DruidTools::Druid.new('cd456ef7890',@fixture_dir).druid.
|
48
|
+
expect(DruidTools::Druid.new('druid:cd456ef7890',@fixture_dir).druid).to eq('druid:cd456ef7890')
|
49
|
+
expect(DruidTools::Druid.new('cd456ef7890',@fixture_dir).druid).to eq('druid:cd456ef7890')
|
50
50
|
end
|
51
51
|
|
52
52
|
it "extracts the ID from the stem" do
|
53
|
-
DruidTools::Druid.new('druid:cd456ef7890',@fixture_dir).id.
|
54
|
-
DruidTools::Druid.new('cd456ef7890',@fixture_dir).id.
|
53
|
+
expect(DruidTools::Druid.new('druid:cd456ef7890',@fixture_dir).id).to eq('cd456ef7890')
|
54
|
+
expect(DruidTools::Druid.new('cd456ef7890',@fixture_dir).id).to eq('cd456ef7890')
|
55
55
|
end
|
56
56
|
|
57
57
|
it "raises an exception if the druid is invalid" do
|
58
|
-
|
59
|
-
|
58
|
+
expect { DruidTools::Druid.new('nondruid:cd456ef7890',@fixture_dir) }.to raise_error(ArgumentError)
|
59
|
+
expect { DruidTools::Druid.new('druid:cd4567ef890',@fixture_dir) }.to raise_error(ArgumentError)
|
60
60
|
end
|
61
61
|
|
62
62
|
it "builds a druid tree from a druid" do
|
63
63
|
druid = DruidTools::Druid.new(@druid_1,@fixture_dir)
|
64
|
-
druid.tree.
|
65
|
-
druid.path.
|
64
|
+
expect(druid.tree).to eq(['cd','456','ef','7890','cd456ef7890'])
|
65
|
+
expect(druid.path).to eq(@tree_1)
|
66
66
|
end
|
67
67
|
|
68
68
|
it "creates and destroys druid directories" do
|
69
|
-
File.exists?(@tree_1).
|
70
|
-
File.exists?(@tree_2).
|
69
|
+
expect(File.exists?(@tree_1)).to eq false
|
70
|
+
expect(File.exists?(@tree_2)).to eq false
|
71
71
|
|
72
72
|
druid_1 = DruidTools::Druid.new(@druid_1,@fixture_dir)
|
73
73
|
druid_2 = DruidTools::Druid.new(@druid_2,@fixture_dir)
|
74
74
|
|
75
75
|
druid_1.mkdir
|
76
|
-
File.exists?(@tree_1).
|
77
|
-
File.exists?(@tree_2).
|
76
|
+
expect(File.exists?(@tree_1)).to eq true
|
77
|
+
expect(File.exists?(@tree_2)).to eq false
|
78
78
|
|
79
79
|
druid_2.mkdir
|
80
|
-
File.exists?(@tree_1).
|
81
|
-
File.exists?(@tree_2).
|
80
|
+
expect(File.exists?(@tree_1)).to eq true
|
81
|
+
expect(File.exists?(@tree_2)).to eq true
|
82
82
|
|
83
83
|
druid_2.rmdir
|
84
|
-
File.exists?(@tree_1).
|
85
|
-
File.exists?(@tree_2).
|
84
|
+
expect(File.exists?(@tree_1)).to eq true
|
85
|
+
expect(File.exists?(@tree_2)).to eq false
|
86
86
|
|
87
87
|
druid_1.rmdir
|
88
|
-
File.exists?(@tree_1).
|
89
|
-
File.exists?(@tree_2).
|
90
|
-
File.exists?(File.join(@fixture_dir,'cd')).
|
88
|
+
expect(File.exists?(@tree_1)).to eq false
|
89
|
+
expect(File.exists?(@tree_2)).to eq false
|
90
|
+
expect(File.exists?(File.join(@fixture_dir,'cd'))).to eq false
|
91
91
|
end
|
92
92
|
|
93
93
|
describe "alternate prefixes" do
|
@@ -100,39 +100,39 @@ describe DruidTools::Druid do
|
|
100
100
|
end
|
101
101
|
|
102
102
|
it "handles alternate prefixes" do
|
103
|
-
|
104
|
-
DruidTools::Druid.new('sulair:cd456ef7890',@fixture_dir).id.
|
105
|
-
DruidTools::Druid.new('cd456ef7890',@fixture_dir).druid.
|
103
|
+
expect { DruidTools::Druid.new('druid:cd456ef7890',@fixture_dir) }.to raise_error(ArgumentError)
|
104
|
+
expect(DruidTools::Druid.new('sulair:cd456ef7890',@fixture_dir).id).to eq('cd456ef7890')
|
105
|
+
expect(DruidTools::Druid.new('cd456ef7890',@fixture_dir).druid).to eq('sulair:cd456ef7890')
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
109
|
describe "content directories" do
|
110
110
|
it "knows where its content goes" do
|
111
111
|
druid = DruidTools::Druid.new(@druid_1,@fixture_dir)
|
112
|
-
druid.content_dir(false).
|
113
|
-
druid.metadata_dir(false).
|
114
|
-
druid.temp_dir(false).
|
112
|
+
expect(druid.content_dir(false)).to eq(File.join(@tree_1,'content'))
|
113
|
+
expect(druid.metadata_dir(false)).to eq(File.join(@tree_1,'metadata'))
|
114
|
+
expect(druid.temp_dir(false)).to eq(File.join(@tree_1,'temp'))
|
115
115
|
|
116
|
-
File.exists?(File.join(@tree_1,'content')).
|
117
|
-
File.exists?(File.join(@tree_1,'metadata')).
|
118
|
-
File.exists?(File.join(@tree_1,'temp')).
|
116
|
+
expect(File.exists?(File.join(@tree_1,'content'))).to eq false
|
117
|
+
expect(File.exists?(File.join(@tree_1,'metadata'))).to eq false
|
118
|
+
expect(File.exists?(File.join(@tree_1,'temp'))).to eq false
|
119
119
|
end
|
120
120
|
|
121
121
|
it "creates its content directories on the fly" do
|
122
122
|
druid = DruidTools::Druid.new(@druid_1,@fixture_dir)
|
123
|
-
druid.content_dir.
|
124
|
-
druid.metadata_dir.
|
125
|
-
druid.temp_dir.
|
123
|
+
expect(druid.content_dir).to eq(File.join(@tree_1,'content'))
|
124
|
+
expect(druid.metadata_dir).to eq(File.join(@tree_1,'metadata'))
|
125
|
+
expect(druid.temp_dir).to eq(File.join(@tree_1,'temp'))
|
126
126
|
|
127
|
-
File.exists?(File.join(@tree_1,'content')).
|
128
|
-
File.exists?(File.join(@tree_1,'metadata')).
|
129
|
-
File.exists?(File.join(@tree_1,'temp')).
|
127
|
+
expect(File.exists?(File.join(@tree_1,'content'))).to eq true
|
128
|
+
expect(File.exists?(File.join(@tree_1,'metadata'))).to eq true
|
129
|
+
expect(File.exists?(File.join(@tree_1,'temp'))).to eq true
|
130
130
|
end
|
131
131
|
|
132
132
|
it "matches glob" do
|
133
133
|
druid = DruidTools::Druid.new(@druid_1,@fixture_dir)
|
134
134
|
druid.mkdir
|
135
|
-
Dir.glob(File.join(File.dirname(druid.path), DruidTools::Druid::glob)).size.
|
135
|
+
expect(Dir.glob(File.join(File.dirname(druid.path), DruidTools::Druid::glob)).size).to eq(1)
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
@@ -145,31 +145,31 @@ describe DruidTools::Druid do
|
|
145
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
|
-
@druid.find_content('someContent').
|
148
|
+
expect(@druid.find_content('someContent')).to eq(File.join(location,'someContent'))
|
149
149
|
end
|
150
150
|
|
151
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
|
-
@druid.find_content('someContent').
|
154
|
+
expect(@druid.find_content('someContent')).to eq(File.join(location,'someContent'))
|
155
155
|
end
|
156
156
|
|
157
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
|
-
@druid.find_content('someContent').
|
160
|
+
expect(@druid.find_content('someContent')).to eq(File.join(location,'someContent'))
|
161
161
|
end
|
162
162
|
|
163
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
|
-
@druid.find_content('someContent').
|
166
|
+
expect(@druid.find_content('someContent')).to be_nil
|
167
167
|
end
|
168
168
|
|
169
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
|
-
@druid.find_content('someContent').
|
172
|
+
expect(@druid.find_content('someContent')).to be_nil
|
173
173
|
end
|
174
174
|
|
175
175
|
it "finds a filelist in the content directory" do
|
@@ -177,7 +177,7 @@ describe DruidTools::Druid do
|
|
177
177
|
@filelist.each do |filename|
|
178
178
|
location.join(filename).open('w') { |f| f.write "This is #{filename}" }
|
179
179
|
end
|
180
|
-
@druid.find_filelist_parent('content',@filelist).
|
180
|
+
expect(@druid.find_filelist_parent('content',@filelist)).to eq(location)
|
181
181
|
end
|
182
182
|
|
183
183
|
it "finds a filelist in the root directory" do
|
@@ -185,7 +185,7 @@ describe DruidTools::Druid do
|
|
185
185
|
@filelist.each do |filename|
|
186
186
|
location.join(filename).open('w') { |f| f.write "This is #{filename}" }
|
187
187
|
end
|
188
|
-
@druid.find_filelist_parent('content',@filelist).
|
188
|
+
expect(@druid.find_filelist_parent('content',@filelist)).to eq(location)
|
189
189
|
end
|
190
190
|
|
191
191
|
it "finds a filelist in the leaf directory" do
|
@@ -193,18 +193,18 @@ describe DruidTools::Druid do
|
|
193
193
|
@filelist.each do |filename|
|
194
194
|
location.join(filename).open('w') { |f| f.write "This is #{filename}" }
|
195
195
|
end
|
196
|
-
@druid.find_filelist_parent('content',@filelist).
|
196
|
+
expect(@druid.find_filelist_parent('content',@filelist)).to eq(location)
|
197
197
|
end
|
198
198
|
|
199
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
|
+
expect{@druid.find_filelist_parent('content',@filelist)}.to raise_exception(/content dir not found for 'someFile1' when searching/)
|
202
202
|
end
|
203
203
|
|
204
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
|
+
expect{@druid.find_filelist_parent('content',@filelist)}.to raise_exception(/File 'someFile2' not found/)
|
208
208
|
end
|
209
209
|
|
210
210
|
end
|
@@ -213,7 +213,7 @@ describe DruidTools::Druid do
|
|
213
213
|
it "raises SameContentExistsError if the directory already exists" do
|
214
214
|
druid_2 = DruidTools::Druid.new(@druid_2,@fixture_dir)
|
215
215
|
druid_2.mkdir
|
216
|
-
|
216
|
+
expect { druid_2.mkdir }.to raise_error(DruidTools::SameContentExistsError)
|
217
217
|
end
|
218
218
|
|
219
219
|
it "raises DifferentContentExistsError if a link already exists in the workspace for this druid" do
|
@@ -221,7 +221,7 @@ describe DruidTools::Druid do
|
|
221
221
|
FileUtils.mkdir_p(source_dir)
|
222
222
|
dr = DruidTools::Druid.new(@druid_2,@fixture_dir)
|
223
223
|
dr.mkdir_with_final_link(source_dir)
|
224
|
-
|
224
|
+
expect { dr.mkdir }.to raise_error(DruidTools::DifferentContentExistsError)
|
225
225
|
end
|
226
226
|
end
|
227
227
|
|
@@ -235,23 +235,21 @@ describe DruidTools::Druid do
|
|
235
235
|
|
236
236
|
it "creates a druid tree in the workspace with the final directory being a link to the passed in source" do
|
237
237
|
@dr.mkdir_with_final_link(@source_dir)
|
238
|
-
|
239
|
-
File.
|
240
|
-
File.readlink(@tree_2).should == @source_dir
|
238
|
+
expect(File).to be_symlink(@dr.path)
|
239
|
+
expect(File.readlink(@tree_2)).to eq(@source_dir)
|
241
240
|
end
|
242
241
|
|
243
242
|
it "does not error out if the link to source already exists" do
|
244
243
|
@dr.mkdir_with_final_link(@source_dir)
|
245
|
-
File.
|
246
|
-
File.readlink(@tree_2).
|
244
|
+
expect(File).to be_symlink(@dr.path)
|
245
|
+
expect(File.readlink(@tree_2)).to eq(@source_dir)
|
247
246
|
end
|
248
247
|
|
249
248
|
it "raises DifferentContentExistsError if a directory already exists in the workspace for this druid" do
|
250
249
|
@dr.mkdir(@fixture_dir)
|
251
|
-
|
250
|
+
expect { @dr.mkdir_with_final_link(@source_di) }.to raise_error(DruidTools::DifferentContentExistsError)
|
252
251
|
end
|
253
|
-
|
254
|
-
|
252
|
+
|
255
253
|
end
|
256
254
|
|
257
255
|
describe "#prune!" do
|
@@ -261,17 +259,29 @@ describe DruidTools::Druid do
|
|
261
259
|
let(:dr1) { DruidTools::Druid.new @druid_1, workspace }
|
262
260
|
let(:dr2) { DruidTools::Druid.new @druid_2, workspace }
|
263
261
|
let(:pathname1) { dr1.pathname }
|
264
|
-
|
265
|
-
|
262
|
+
|
266
263
|
after(:each) do
|
267
264
|
FileUtils.remove_entry workspace
|
268
265
|
end
|
269
266
|
|
267
|
+
it "throws error on misconfig when base dir cannot be created" do
|
268
|
+
dir = '/some/dir/that/does/not/exist' # we don't have permissions to create
|
269
|
+
dr0 = DruidTools::Druid.new @druid_1, dir
|
270
|
+
expect {dr0.prune!}.to raise_error()
|
271
|
+
expect(File).to_not exist(dir)
|
272
|
+
end
|
273
|
+
|
274
|
+
it "does not throw error when base can be created" do
|
275
|
+
subdir = File.join(Dir.mktmpdir, 'some', 'nonexistant', 'subdir') # but this one *can* be created
|
276
|
+
dr2 = DruidTools::Druid.new @druid_2, subdir
|
277
|
+
expect {dr2.prune!}.not_to raise_error()
|
278
|
+
expect(File).to exist(subdir)
|
279
|
+
end
|
280
|
+
|
270
281
|
context "shared ancestor" do
|
271
282
|
|
272
283
|
before(:each) do
|
273
284
|
#Nil the create records for this context because we're in a known read only one
|
274
|
-
|
275
285
|
dr1.mkdir
|
276
286
|
dr2.mkdir
|
277
287
|
dr1.prune!
|
@@ -297,13 +307,13 @@ describe DruidTools::Druid do
|
|
297
307
|
it "removes all directories up to the base path when there are no common ancestors" do
|
298
308
|
#Make sure a delete record is not present
|
299
309
|
expect(dr1.deletes_record_exists?).to be_falsey
|
300
|
-
|
301
|
-
#Nil the create records for this test
|
310
|
+
|
311
|
+
#Nil the create records for this test
|
302
312
|
dr1.mkdir
|
303
313
|
dr1.prune!
|
304
314
|
expect(File).to_not exist(File.join(workspace, 'cd'))
|
305
315
|
expect(File).to exist(workspace)
|
306
|
-
|
316
|
+
|
307
317
|
#Make sure a delete record was created
|
308
318
|
expect(dr1.deletes_dir_exists?).to be_truthy
|
309
319
|
expect(dr1.deletes_record_exists?).to be_truthy
|
@@ -312,106 +322,105 @@ describe DruidTools::Druid do
|
|
312
322
|
it "removes directories with symlinks" do
|
313
323
|
#Make sure a delete record is not present
|
314
324
|
expect(dr2.deletes_record_exists?).to be_falsey
|
315
|
-
|
316
|
-
#Nil the create records for this test
|
325
|
+
|
326
|
+
#Nil the create records for this test
|
317
327
|
source_dir = File.join workspace, 'src_dir'
|
318
328
|
FileUtils.mkdir_p(source_dir)
|
319
329
|
dr2.mkdir_with_final_link(source_dir)
|
320
330
|
dr2.prune!
|
321
331
|
expect(File).to_not exist(dr2.path)
|
322
332
|
expect(File).to_not exist(File.join(workspace, 'cd'))
|
323
|
-
|
333
|
+
|
324
334
|
#Make sure a delete record was created
|
325
335
|
expect(dr2.deletes_dir_exists?).to be_truthy
|
326
336
|
expect(dr2.deletes_record_exists?).to be_truthy
|
327
337
|
end
|
328
|
-
|
338
|
+
|
329
339
|
describe "logging deleted druids" do
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
end
|
340
|
+
|
341
|
+
#Purge any paths or delete records created in the test
|
342
|
+
after :each do
|
343
|
+
#Remove the .deletes dir to clean up
|
344
|
+
dr2.deletes_delete_record if dr2.deletes_record_exists?
|
345
|
+
FileUtils.rm_rf dr2.deletes_dir_pathname
|
346
|
+
end
|
347
|
+
|
348
|
+
it "returns the path to the .deletes directory as a Pathname" do
|
349
|
+
expect(dr2.deletes_dir_pathname.class).to eq(Pathname)
|
350
|
+
end
|
351
|
+
|
352
|
+
it "returns the path to the delete record for a druid as a Pathname" do
|
353
|
+
expect(dr2.deletes_record_pathname.class).to eq(Pathname)
|
354
|
+
end
|
355
|
+
|
356
|
+
it "returns the path to the delete record for a druid as top_level/.deletes/druid" do
|
357
|
+
expect(dr2.deletes_record_pathname.to_s).to eq("#{dr2.base}/.deletes/#{dr2.id}")
|
358
|
+
end
|
359
|
+
|
360
|
+
it "returns false when the .deletes dir is not present on the file system" do
|
361
|
+
expect(dr2.deletes_dir_exists?).to be_falsey
|
362
|
+
end
|
363
|
+
|
364
|
+
it "creates the .deletes dir and detect it exists" do
|
365
|
+
|
366
|
+
#Clean the .deletes dir if present
|
367
|
+
FileUtils.rm_rf dr2.deletes_dir_pathname
|
368
|
+
|
369
|
+
#Test for exists? and create
|
370
|
+
expect(dr2.deletes_dir_exists?).to be_falsey
|
371
|
+
dr2.create_deletes_dir
|
372
|
+
expect(dr2.deletes_dir_exists?).to be_truthy
|
373
|
+
end
|
374
|
+
|
375
|
+
it "returns false when the .deletes dir does not have a deleted record for a druid" do
|
376
|
+
expect(dr2.deletes_record_exists?).to be_falsey
|
377
|
+
end
|
378
|
+
|
379
|
+
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
|
380
|
+
#Expect there not to be a .deletes dir or file (the file expectation is redundant I know)
|
381
|
+
expect(dr2.deletes_dir_exists?).to be_falsey
|
382
|
+
expect(dr2.deletes_record_exists?).to be_falsey
|
383
|
+
|
384
|
+
#Create the delete record
|
385
|
+
dr2.creates_delete_record
|
386
|
+
|
387
|
+
#Check to ensure items were created
|
388
|
+
expect(dr2.deletes_dir_exists?).to be_truthy
|
389
|
+
expect(dr2.deletes_record_exists?).to be_truthy
|
390
|
+
end
|
391
|
+
|
392
|
+
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
|
393
|
+
#Expect there not to be a .deletes dir or file (the file expectation is redundant I know)
|
394
|
+
expect(dr2.deletes_dir_exists?).to be_falsey
|
395
|
+
expect(dr2.deletes_record_exists?).to be_falsey
|
396
|
+
|
397
|
+
#Creates the deletes dir and check
|
398
|
+
dr2.create_deletes_dir
|
399
|
+
expect(dr2.deletes_dir_exists?).to be_truthy
|
400
|
+
expect(dr2.deletes_record_exists?).to be_falsey
|
401
|
+
|
402
|
+
#Create the delete record
|
403
|
+
dr2.creates_delete_record
|
404
|
+
|
405
|
+
#Check to ensure items were created
|
406
|
+
expect(dr2.deletes_dir_exists?).to be_truthy
|
407
|
+
expect(dr2.deletes_record_exists?).to be_truthy
|
408
|
+
end
|
409
|
+
|
410
|
+
it "creates a delete record with a parent directory that does not have a .deletes directory and contains an older delete record" do
|
411
|
+
#Expect there not to be a .deletes dir or file (the file expectation is redundant I know)
|
412
|
+
expect(dr2.deletes_dir_exists?).to be_falsey
|
413
|
+
expect(dr2.deletes_record_exists?).to be_falsey
|
414
|
+
|
415
|
+
dr2.creates_delete_record
|
416
|
+
time = Time.now
|
417
|
+
expect(File.mtime(dr2.deletes_record_pathname)).to be <= time
|
418
|
+
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
|
419
|
+
|
420
|
+
dr2.creates_delete_record
|
421
|
+
#Should have a new newer deleted record
|
422
|
+
expect(File.mtime(dr2.deletes_record_pathname)).to be > time
|
423
|
+
end
|
415
424
|
end
|
416
425
|
end
|
417
426
|
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.
|
4
|
+
version: 0.4.1
|
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-04-20 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,9 @@ executables: []
|
|
46
46
|
extensions: []
|
47
47
|
extra_rdoc_files: []
|
48
48
|
files:
|
49
|
-
- .gitignore
|
49
|
+
- ".gitignore"
|
50
|
+
- ".rspec"
|
51
|
+
- ".travis.yml"
|
50
52
|
- Gemfile
|
51
53
|
- LICENSE
|
52
54
|
- README.md
|
@@ -103,17 +105,17 @@ require_paths:
|
|
103
105
|
- lib
|
104
106
|
required_ruby_version: !ruby/object:Gem::Requirement
|
105
107
|
requirements:
|
106
|
-
- -
|
108
|
+
- - ">="
|
107
109
|
- !ruby/object:Gem::Version
|
108
110
|
version: '0'
|
109
111
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
112
|
requirements:
|
111
|
-
- -
|
113
|
+
- - ">="
|
112
114
|
- !ruby/object:Gem::Version
|
113
115
|
version: '0'
|
114
116
|
requirements: []
|
115
117
|
rubyforge_project:
|
116
|
-
rubygems_version: 2.
|
118
|
+
rubygems_version: 2.4.5
|
117
119
|
signing_key:
|
118
120
|
specification_version: 4
|
119
121
|
summary: Tools to manipulate DRUID trees and content directories
|