ocfl 0.6.0 → 0.7.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b32346d0bd14e71b28385a1e34ad4f4af73335ab64345fa374c890ccf07e4f83
4
- data.tar.gz: 4f9f6bc929cdee4f24e3b8b4bca167d69219d34fb74de00ff75414a68ee66ad2
3
+ metadata.gz: 04033b37955d5ee76f304558abce0d860317fbd019e4a84ac033e2e4b4a89b49
4
+ data.tar.gz: 24aa1a8705a985d88900f30fd59c2e19be305edb3b710293330cfb6607fb6e46
5
5
  SHA512:
6
- metadata.gz: e9a520d6bf056649a3b4c261ea27fb6d5a994d8f0bd274f5a8aca19751e24fa4c1ca08de57ee7971b927081f4dcb941a514570deba8088580579613123a1d1f1
7
- data.tar.gz: a3df7b8ae6913eee74a0bea12474ee4c7ebe937bd1b92c28c8918e2a00c46d82191e99a360dacd780b1be65f1bdab25dbca7edfa47f3d03b8d4cf8e3ef534ebe
6
+ metadata.gz: ae4c04c535047ff07f7123787cc08efa6cf2f56c5bf53f2a21366bf81f0474dfcbc35c48802c52c920c1a36d8f1bd77bc7558c4f0ac75e17afba0c131fd9dd45
7
+ data.tar.gz: cf9d0d5037ecb46946c9f8eab7407097cc0330f26d45566077ce83e61371cf1ebf8d906e13ee8ee003b40f9e2fb6b11b31d70e6de194a3f895503ccfc3947466
data/.rubocop.yml CHANGED
@@ -28,6 +28,9 @@ RSpec/MultipleExpectations:
28
28
  RSpec/ExampleLength:
29
29
  Max: 10
30
30
 
31
+ RSpec/MultipleMemoizedHelpers:
32
+ Max: 8
33
+
31
34
  RSpec/NestedGroups:
32
35
  Max: 4
33
36
 
data/README.md CHANGED
@@ -27,14 +27,39 @@ directory.exists?
27
27
  # => true
28
28
  directory.valid?
29
29
  # => true
30
+ ```
31
+
32
+ ### Versions
33
+
34
+ There are three ways to get a version with an existing object directory.
30
35
 
36
+ #### Start a new version
37
+ ```
31
38
  new_version = directory.begin_new_version
32
39
  new_version.copy_file('sig/ocfl.rbs')
33
40
  new_version.save
34
41
 
35
42
  directory.head
36
43
  # => 'v2'
44
+ ```
45
+
46
+ #### Re-open the existing head version
47
+ ```
48
+ new_version = directory.reopen_head_version
49
+ new_version.delete_file('cb6c8557fc724c636929775212c5194984d68cb1508a1')
50
+ new_version.copy_file('sig/ocfl.rbs')
51
+ new_version.save
52
+ ```
37
53
 
54
+ #### Overwrite the existing head version
55
+ ```
56
+ new_version = directory.overwrite_current_version
57
+ new_version.copy_file('sig/ocfl.rbs')
58
+ new_version.save
59
+ ```
60
+
61
+ ### File paths
62
+ ```
38
63
  # List file names that were part of a given version
39
64
  directory.versions['v2'].file_names
40
65
  # => ["ocfl.rbs"]
@@ -47,9 +72,6 @@ directory.path(filepath: "ocfl.rbs", version: "v2")
47
72
  directory.path(filepath: "ocfl.rbs")
48
73
  # => <Pathname:/files/[object_root]/v2/content/ocfl.rbs>
49
74
 
50
- new_version = directory.overwrite_current_version
51
- new_version.copy_file('sig/ocfl.rbs')
52
- new_version.save
53
75
  ```
54
76
 
55
77
  ## Development
@@ -64,10 +64,17 @@ module OCFL
64
64
  true
65
65
  end
66
66
 
67
+ # Start a completely new version
67
68
  def begin_new_version
68
69
  DraftVersion.new(object_directory: self, state: head_inventory.state)
69
70
  end
70
71
 
72
+ # Get a handle for the head version
73
+ def reopen_head_version
74
+ DraftVersion.new(object_directory: self, overwrite_head: true, state: head_inventory.state)
75
+ end
76
+
77
+ # Get a handle that will replace the existing head version
71
78
  def overwrite_current_version
72
79
  DraftVersion.new(object_directory: self, overwrite_head: true)
73
80
  end
@@ -28,6 +28,16 @@ module OCFL
28
28
  copy_one(File.basename(incoming_path), incoming_path, destination_path)
29
29
  end
30
30
 
31
+ # Note, this only removes the file from this version. Previous versions may still use it.
32
+ def delete_file(sha512_digest)
33
+ state.delete(sha512_digest)
34
+ # If the manifest points at the current content directory, then we can delete it.
35
+ file_paths = manifest[sha512_digest]
36
+ return unless file_paths.all? { |path| path.start_with?("#{version_number}/") }
37
+
38
+ File.unlink (object_directory.object_root + file_paths.first).to_s
39
+ end
40
+
31
41
  # Copies files into the object and preserves their relative paths as logical directories in the object
32
42
  def copy_recursive(incoming_path, destination_path: "")
33
43
  prepare_content_directory
@@ -93,8 +103,8 @@ module OCFL
93
103
  def build_inventory
94
104
  old_data = object_directory.inventory.data
95
105
  versions = versions(old_data.versions)
96
- # Prune items from manifest if they are not part of any version
97
106
 
107
+ # Prune items from manifest if they are not part of any version
98
108
  Inventory::InventoryStruct.new(old_data.to_h.merge(manifest: filtered_manifest(versions),
99
109
  head: version_number, versions:))
100
110
  end
@@ -108,7 +118,8 @@ module OCFL
108
118
  # The manifest after unused SHAs have been filtered out.
109
119
  def filtered_manifest(versions)
110
120
  shas_in_versions = versions.values.flat_map { |v| v.state.keys }.uniq
111
- manifest.slice(*shas_in_versions)
121
+ manifest.slice!(*shas_in_versions)
122
+ manifest
112
123
  end
113
124
  end
114
125
  end
data/lib/ocfl/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OCFL
4
- VERSION = "0.6.0"
4
+ VERSION = "0.7.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ocfl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Coyne
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-05-24 00:00:00.000000000 Z
11
+ date: 2024-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -125,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
125
  - !ruby/object:Gem::Version
126
126
  version: '0'
127
127
  requirements: []
128
- rubygems_version: 3.5.10
128
+ rubygems_version: 3.4.19
129
129
  signing_key:
130
130
  specification_version: 4
131
131
  summary: A ruby library for interacting with the Oxford Common File Layout (OCFL)