ocfl 0.7.0 → 0.8.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 +4 -4
- data/.rubocop.yml +3 -0
- data/README.md +8 -4
- data/lib/ocfl/object/directory.rb +1 -1
- data/lib/ocfl/object/directory_builder.rb +2 -2
- data/lib/ocfl/object/draft_version.rb +37 -10
- data/lib/ocfl/version.rb +1 -1
- data/lib/ocfl.rb +1 -0
- data/tmp/.keep +0 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c21578c64e68d5bdab7fcea3b08bf8210a967a52d0d6b0f2ecdc203a4f2eaca4
|
4
|
+
data.tar.gz: 48503dd0f9011c88bbf20bc6adf073d2b1ff422ac1ed06063c332f7c3bbf619e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74169c05ca7d91082db0198d252234956c7a47139d57419f5be14e8e23168af39e75b9d9e78d397bd1b65fbc688834ee84cd1456d452795163c777c6c7da15c7
|
7
|
+
data.tar.gz: acd185ad8a09d1b016d9c6867d5b4b68005fbe1227abe8848912f917c3d71f4d535cd1847cc4422606fec0d5fc01b9dbf59b6b613c4e5701dfca1703ebae79dc
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -20,7 +20,7 @@ directory = OCFL::Object::Directory.new(object_root: '/files/[object_root]')
|
|
20
20
|
directory.exists?
|
21
21
|
# => false
|
22
22
|
builder = OCFL::Object::DirectoryBuilder.new(object_root: 'spec/abc123', id: 'http://example.com/abc123')
|
23
|
-
builder.copy_file('sig/ocfl.rbs')
|
23
|
+
builder.copy_file('sig/ocfl.rbs', destination_path: 'ocfl/types/generated.rbs')
|
24
24
|
|
25
25
|
directory = builder.save
|
26
26
|
directory.exists?
|
@@ -43,10 +43,10 @@ directory.head
|
|
43
43
|
# => 'v2'
|
44
44
|
```
|
45
45
|
|
46
|
-
####
|
46
|
+
#### Modify the existing head version
|
47
47
|
```
|
48
|
-
new_version = directory.
|
49
|
-
new_version.delete_file('
|
48
|
+
new_version = directory.head_version
|
49
|
+
new_version.delete_file('sample.txt')
|
50
50
|
new_version.copy_file('sig/ocfl.rbs')
|
51
51
|
new_version.save
|
52
52
|
```
|
@@ -64,6 +64,10 @@ new_version.save
|
|
64
64
|
directory.versions['v2'].file_names
|
65
65
|
# => ["ocfl.rbs"]
|
66
66
|
|
67
|
+
# Or on the head version
|
68
|
+
directory.head_version.file_names
|
69
|
+
# => ["ocfl.rbs"]
|
70
|
+
|
67
71
|
# Get the path of a file in a given version
|
68
72
|
directory.path(filepath: "ocfl.rbs", version: "v2")
|
69
73
|
# => <Pathname:/files/[object_root]/v2/content/ocfl.rbs>
|
@@ -33,12 +33,12 @@ module OCFL
|
|
33
33
|
|
34
34
|
def create_object_directory
|
35
35
|
FileUtils.mkdir_p(object_root)
|
36
|
+
FileUtils.touch(object_directory.namaste_file) unless File.exist?(object_directory.namaste_file)
|
36
37
|
end
|
37
38
|
|
38
39
|
# @return [Directory]
|
39
40
|
def save
|
40
|
-
|
41
|
-
FileUtils.touch(object_directory.namaste_file)
|
41
|
+
create_object_directory
|
42
42
|
write_inventory
|
43
43
|
object_directory
|
44
44
|
end
|
@@ -17,19 +17,30 @@ module OCFL
|
|
17
17
|
|
18
18
|
attr_reader :object_directory, :manifest, :state, :version_number
|
19
19
|
|
20
|
+
delegate :file_names, to: :to_version_struct
|
21
|
+
|
20
22
|
def move_file(incoming_path)
|
21
23
|
prepare_content_directory
|
22
|
-
add(incoming_path)
|
24
|
+
already_stored = add(incoming_path)
|
25
|
+
return if already_stored
|
26
|
+
|
23
27
|
FileUtils.mv(incoming_path, content_path)
|
24
28
|
end
|
25
29
|
|
26
30
|
def copy_file(incoming_path, destination_path: "")
|
27
31
|
prepare_content_directory
|
28
|
-
copy_one(File.basename(incoming_path), incoming_path
|
32
|
+
copy_one(destination_path.presence || File.basename(incoming_path), incoming_path)
|
33
|
+
end
|
34
|
+
|
35
|
+
def digest_for_filename(filename)
|
36
|
+
state.find { |_, filenames| filenames.include?(filename) }&.first
|
29
37
|
end
|
30
38
|
|
31
39
|
# Note, this only removes the file from this version. Previous versions may still use it.
|
32
|
-
def delete_file(
|
40
|
+
def delete_file(filename)
|
41
|
+
sha512_digest = digest_for_filename(filename)
|
42
|
+
raise "Unknown file: #{filename}" unless sha512_digest
|
43
|
+
|
33
44
|
state.delete(sha512_digest)
|
34
45
|
# If the manifest points at the current content directory, then we can delete it.
|
35
46
|
file_paths = manifest[sha512_digest]
|
@@ -43,7 +54,10 @@ module OCFL
|
|
43
54
|
prepare_content_directory
|
44
55
|
incoming_path = incoming_path.delete_suffix("/")
|
45
56
|
Dir.glob("#{incoming_path}/**/*").reject { |fn| File.directory?(fn) }.each do |file|
|
46
|
-
|
57
|
+
logical_file_path = file.delete_prefix(incoming_path).delete_prefix("/")
|
58
|
+
logical_file_path = File.join(destination_path, logical_file_path) unless destination_path.empty?
|
59
|
+
|
60
|
+
copy_one(logical_file_path, file)
|
47
61
|
end
|
48
62
|
end
|
49
63
|
|
@@ -53,6 +67,10 @@ module OCFL
|
|
53
67
|
object_directory.reload
|
54
68
|
end
|
55
69
|
|
70
|
+
def to_version_struct
|
71
|
+
Version.new(state:, created: Time.now.utc.iso8601)
|
72
|
+
end
|
73
|
+
|
56
74
|
private
|
57
75
|
|
58
76
|
def write_inventory(inventory)
|
@@ -61,20 +79,29 @@ module OCFL
|
|
61
79
|
FileUtils.cp(path / "inventory.json.sha512", object_directory.object_root)
|
62
80
|
end
|
63
81
|
|
64
|
-
|
65
|
-
|
66
|
-
|
82
|
+
# @param [String] logical_file_path where we're going to store the file (e.g. 'object/directory_builder_spec.rb')
|
83
|
+
# @param [String] incoming_path where's this file from (e.g. 'spec/ocfl/object/directory_builder_spec.rb')
|
84
|
+
def copy_one(logical_file_path, incoming_path)
|
85
|
+
already_stored = add(incoming_path, logical_file_path:)
|
86
|
+
return if already_stored
|
87
|
+
|
67
88
|
parent_dir = (content_path / logical_file_path).parent
|
68
89
|
FileUtils.mkdir_p(parent_dir) unless parent_dir == content_path
|
69
90
|
FileUtils.cp(incoming_path, content_path / logical_file_path)
|
70
91
|
end
|
71
92
|
|
93
|
+
# @return [Boolean] true if the file already existed in this object. If false, the object must be
|
94
|
+
# moved to the content directory.
|
72
95
|
def add(incoming_path, logical_file_path: File.basename(incoming_path))
|
73
96
|
digest = Digest::SHA512.file(incoming_path).to_s
|
74
97
|
version_content_path = content_path.relative_path_from(object_directory.object_root)
|
75
98
|
file_path_relative_to_root = (version_content_path / logical_file_path).to_s
|
76
|
-
@manifest
|
77
|
-
@
|
99
|
+
result = @manifest.key?(digest)
|
100
|
+
@manifest[digest] ||= []
|
101
|
+
@state[digest] ||= []
|
102
|
+
@manifest[digest].push(file_path_relative_to_root)
|
103
|
+
@state[digest].push(logical_file_path)
|
104
|
+
result
|
78
105
|
end
|
79
106
|
|
80
107
|
def prepare_content_directory
|
@@ -112,7 +139,7 @@ module OCFL
|
|
112
139
|
# This gives the update list of versions. The old list plus this new one.
|
113
140
|
# @param [Hash] old_versions the versions prior to this one.
|
114
141
|
def versions(old_versions)
|
115
|
-
old_versions.merge(version_number =>
|
142
|
+
old_versions.merge(version_number => to_version_struct)
|
116
143
|
end
|
117
144
|
|
118
145
|
# The manifest after unused SHAs have been filtered out.
|
data/lib/ocfl/version.rb
CHANGED
data/lib/ocfl.rb
CHANGED
data/tmp/.keep
ADDED
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ocfl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Coyne
|
@@ -103,6 +103,7 @@ files:
|
|
103
103
|
- lib/ocfl/object/version.rb
|
104
104
|
- lib/ocfl/version.rb
|
105
105
|
- sig/ocfl.rbs
|
106
|
+
- tmp/.keep
|
106
107
|
homepage: https://github.com/sul-dlss/ocfl-rb
|
107
108
|
licenses: []
|
108
109
|
metadata:
|