moab-versioning 4.2.1 → 4.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,3 @@
1
- require 'moab'
2
-
3
1
  module Moab
4
2
  # A class to represent a version subdirectory within an object's home directory in preservation storage
5
3
  # ====Data Model
@@ -32,7 +30,7 @@ module Moab
32
30
  def initialize(storage_object, version_id)
33
31
  if version_id.is_a?(Integer)
34
32
  @version_id = version_id
35
- elsif version_id.is_a?(String) and version_id =~ /^v(\d+)$/
33
+ elsif version_id.is_a?(String) && version_id =~ /^v(\d+)$/
36
34
  @version_id = version_id.sub(/^v/, '').to_i
37
35
  else
38
36
  raise "version_id (#{version_id}) is not in a recognized format"
@@ -40,7 +38,7 @@ module Moab
40
38
  @version_name = StorageObject.version_dirname(@version_id)
41
39
  @version_pathname = storage_object.object_pathname.join(@version_name)
42
40
  @storage_object = storage_object
43
- @inventory_cache = Hash.new
41
+ @inventory_cache = {}
44
42
  end
45
43
 
46
44
  # @return [String] The unique identifier concatenating digital object id with version id
@@ -110,10 +108,10 @@ module Moab
110
108
  # @see FileInventory#read_xml_file
111
109
  def file_inventory(type)
112
110
  if version_id > 0
113
- return @inventory_cache[type] if @inventory_cache.has_key?(type)
111
+ return @inventory_cache[type] if @inventory_cache.key?(type)
114
112
  @inventory_cache[type] = FileInventory.read_xml_file(@version_pathname.join('manifests'), type)
115
113
  else
116
- groups = ['content', 'metadata'].collect { |id| FileGroup.new(:group_id => id) }
114
+ groups = %w[content metadata].collect { |id| FileGroup.new(:group_id => id) }
117
115
  FileInventory.new(
118
116
  :type => 'version',
119
117
  :digital_object_id => @storage_object.digital_object_id,
@@ -208,12 +206,12 @@ module Moab
208
206
  end
209
207
 
210
208
  # @return [VerificationResult] return result of testing correctness of version manifests
211
- def verify_version_storage()
212
- result = VerificationResult.new(self.composite_key)
213
- result.subentities << self.verify_manifest_inventory
214
- result.subentities << self.verify_version_inventory
215
- result.subentities << self.verify_version_additions
216
- result.verified = result.subentities.all? { |entity| entity.verified }
209
+ def verify_version_storage
210
+ result = VerificationResult.new(composite_key)
211
+ result.subentities << verify_manifest_inventory
212
+ result.subentities << verify_version_inventory
213
+ result.subentities << verify_version_additions
214
+ result.verified = result.subentities.all?(&:verified)
217
215
  result
218
216
  end
219
217
 
@@ -221,8 +219,8 @@ module Moab
221
219
  def verify_manifest_inventory
222
220
  # read/parse manifestInventory.xml
223
221
  result = VerificationResult.new("manifest_inventory")
224
- manifest_inventory = self.file_inventory('manifests')
225
- result.subentities << VerificationResult.verify_value('composite_key', self.composite_key, manifest_inventory.composite_key)
222
+ manifest_inventory = file_inventory('manifests')
223
+ result.subentities << VerificationResult.verify_value('composite_key', composite_key, manifest_inventory.composite_key)
226
224
  result.subentities << VerificationResult.verify_truth('manifests_group', !manifest_inventory.group_empty?('manifests'))
227
225
  # measure the manifest signatures of the files in the directory (excluding manifestInventory.xml)
228
226
  directory_inventory = FileInventory.new.inventory_from_directory(@version_pathname.join('manifests'), 'manifests')
@@ -236,7 +234,7 @@ module Moab
236
234
  compare_result.verified = (diff.difference_count == 0)
237
235
  compare_result.details = diff.differences_detail
238
236
  result.subentities << compare_result
239
- result.verified = result.subentities.all? { |entity| entity.verified }
237
+ result.verified = result.subentities.all?(&:verified)
240
238
  result
241
239
  end
242
240
 
@@ -244,10 +242,10 @@ module Moab
244
242
  def verify_signature_catalog
245
243
  result = VerificationResult.new("signature_catalog")
246
244
  signature_catalog = self.signature_catalog
247
- result.subentities << VerificationResult.verify_value('signature_key', self.composite_key, signature_catalog.composite_key)
245
+ result.subentities << VerificationResult.verify_value('signature_key', composite_key, signature_catalog.composite_key)
248
246
  found = 0
249
- missing = Array.new
250
- object_pathname = self.storage_object.object_pathname
247
+ missing = []
248
+ object_pathname = storage_object.object_pathname
251
249
  signature_catalog.entries.each do |catalog_entry|
252
250
  storage_location = object_pathname.join(catalog_entry.storage_path)
253
251
  if storage_location.exist?
@@ -264,19 +262,19 @@ module Moab
264
262
  }
265
263
  file_result.details['missing'] = missing unless missing.empty?
266
264
  result.subentities << file_result
267
- result.verified = result.subentities.all? { |entity| entity.verified }
265
+ result.verified = result.subentities.all?(&:verified)
268
266
  result
269
267
  end
270
268
 
271
269
  # @return [Boolean] true if files & signatures listed in version inventory can all be found
272
270
  def verify_version_inventory
273
271
  result = VerificationResult.new("version_inventory")
274
- version_inventory = self.file_inventory('version')
275
- result.subentities << VerificationResult.verify_value('inventory_key', self.composite_key, version_inventory.composite_key)
272
+ version_inventory = file_inventory('version')
273
+ result.subentities << VerificationResult.verify_value('inventory_key', composite_key, version_inventory.composite_key)
276
274
  signature_catalog = self.signature_catalog
277
- result.subentities << VerificationResult.verify_value('signature_key', self.composite_key, signature_catalog.composite_key)
275
+ result.subentities << VerificationResult.verify_value('signature_key', composite_key, signature_catalog.composite_key)
278
276
  found = 0
279
- missing = Array.new
277
+ missing = []
280
278
  version_inventory.groups.each do |group|
281
279
  group.files.each do |file|
282
280
  file.instances.each do |instance|
@@ -298,15 +296,15 @@ module Moab
298
296
  }
299
297
  file_result.details['missing'] = missing unless missing.empty?
300
298
  result.subentities << file_result
301
- result.verified = result.subentities.all? { |entity| entity.verified }
299
+ result.verified = result.subentities.all?(&:verified)
302
300
  result
303
301
  end
304
302
 
305
303
  # @return [Boolean] returns true if files in data folder match files listed in version addtions inventory
306
304
  def verify_version_additions
307
305
  result = VerificationResult.new("version_additions")
308
- version_additions = self.file_inventory('additions')
309
- result.subentities << VerificationResult.verify_value('composite_key', self.composite_key, version_additions.composite_key)
306
+ version_additions = file_inventory('additions')
307
+ result.subentities << VerificationResult.verify_value('composite_key', composite_key, version_additions.composite_key)
310
308
  data_directory = @version_pathname.join('data')
311
309
  directory_inventory = FileInventory.new(:type => 'directory').inventory_from_directory(data_directory)
312
310
  diff = FileInventoryDifference.new
@@ -315,7 +313,7 @@ module Moab
315
313
  compare_result.verified = (diff.difference_count == 0)
316
314
  compare_result.details = diff.differences_detail
317
315
  result.subentities << compare_result
318
- result.verified = result.subentities.all? { |entity| entity.verified }
316
+ result.verified = result.subentities.all?(&:verified)
319
317
  result
320
318
  end
321
319
 
@@ -1,5 +1,3 @@
1
- require 'moab'
2
-
3
1
  module Moab
4
2
  # A class to represent the SDR repository store
5
3
  #
@@ -58,9 +56,9 @@ module Moab
58
56
  end
59
57
 
60
58
  # @param object_id [String] The identifier of the digital object
61
- # @return [Pathname] The branch segment of the object deposit path
59
+ # @return [String] The branch segment of the object deposit path
60
+ # @note Override this method in a subclass
62
61
  def deposit_branch(object_id)
63
- #todo This method should be customized, or overridden in a subclass
64
62
  object_id
65
63
  end
66
64
 
@@ -77,7 +75,7 @@ module Moab
77
75
  return root if root_trunk_branch.exist?
78
76
  end
79
77
  # Search for the object's directory in the deposit areas
80
- if include_deposit and deposit_trunk
78
+ if include_deposit && deposit_trunk
81
79
  branch = deposit_branch(object_id)
82
80
  storage_roots.each do |root|
83
81
  root_trunk = root.join(deposit_trunk)
@@ -119,11 +117,8 @@ module Moab
119
117
  def storage_object(object_id, create = false)
120
118
  storage_object = find_storage_object(object_id)
121
119
  unless storage_object.object_pathname.exist?
122
- if create
123
- storage_object.object_pathname.mkpath
124
- else
125
- raise Moab::ObjectNotFoundException, "No storage object found for #{object_id}"
126
- end
120
+ raise Moab::ObjectNotFoundException, "No storage object found for #{object_id}" unless create
121
+ storage_object.object_pathname.mkpath
127
122
  end
128
123
  storage_object
129
124
  end
@@ -132,9 +127,7 @@ module Moab
132
127
  # @param druid [String] The object identifier
133
128
  # @return [void] transfer the object to the preservation repository
134
129
  def store_new_object_version(druid, bag_pathname)
135
- storage_object = self.storage_object(druid, create = true)
136
- new_version = storage_object.ingest_bag(bag_pathname)
137
- new_version
130
+ storage_object(druid, create = true).ingest_bag(bag_pathname)
138
131
  end
139
132
  end
140
133
  end
@@ -1,5 +1,3 @@
1
- require 'moab'
2
-
3
1
  module Moab
4
2
  # An interface class to support access to SDR storage via a RESTful server
5
3
  #
@@ -79,7 +77,7 @@ module Moab
79
77
  # @param [String] object_id The digital object identifier of the object
80
78
  # @return [Pathname] Pathname object containing the full path for the specified file
81
79
  def self.version_metadata(object_id)
82
- self.retrieve_file('metadata', 'versionMetadata.xml', object_id)
80
+ retrieve_file('metadata', 'versionMetadata.xml', object_id)
83
81
  end
84
82
 
85
83
  # @param [String] object_id The digital object identifier of the object
@@ -87,11 +85,11 @@ module Moab
87
85
  # @return [FileInventory] the file inventory for the specified object version
88
86
  def self.retrieve_file_group(file_category, object_id, version_id = nil)
89
87
  storage_object_version = @@repository.storage_object(object_id).find_object_version(version_id)
90
- if file_category =~ /manifest/
91
- inventory_type = file_category = 'manifests'
92
- else
93
- inventory_type = 'version'
94
- end
88
+ inventory_type = if file_category =~ /manifest/
89
+ file_category = 'manifests'
90
+ else
91
+ 'version'
92
+ end
95
93
  inventory = storage_object_version.file_inventory(inventory_type)
96
94
  inventory.group(file_category)
97
95
  end
@@ -1,5 +1,3 @@
1
- require 'time'
2
-
3
1
  module Moab
4
2
  # Timestamp conversion methods.
5
3
  class UtcTime
@@ -1,5 +1,3 @@
1
- require 'moab'
2
-
3
1
  module Moab
4
2
  # A recursive "Tree" type object for verifications
5
3
  class VerificationResult
@@ -1,5 +1,3 @@
1
- require 'moab'
2
-
3
1
  module Moab
4
2
  # The descriptive information about a digital object's collection of versions
5
3
  #
@@ -19,7 +17,7 @@ module Moab
19
17
 
20
18
  # (see Serializable#initialize)
21
19
  def initialize(opts = {})
22
- @versions = Array.new
20
+ @versions = []
23
21
  super(opts)
24
22
  end
25
23
 
@@ -1,5 +1,3 @@
1
- require 'moab'
2
-
3
1
  module Moab
4
2
  # The descriptive attributes of a digital object version.
5
3
  #
@@ -18,13 +16,13 @@ module Moab
18
16
 
19
17
  # (see Serializable#initialize)
20
18
  def initialize(opts = {})
21
- @events = Array.new
19
+ @events = []
22
20
  super(opts)
23
21
  end
24
22
 
25
23
  # @attribute
26
24
  # @return [Integer] The object version number (A sequential integer)
27
- attribute :version_id, Integer, :tag => 'versionId', :key => true, :on_save => Proc.new { |n| n.to_s }
25
+ attribute :version_id, Integer, :tag => 'versionId', :key => true, :on_save => proc { |n| n.to_s }
28
26
 
29
27
  # @attribute
30
28
  # @return [String] "an external version label that increments the most significant digit for major revisions,
@@ -1,5 +1,3 @@
1
- require 'moab'
2
-
3
1
  module Moab
4
2
  # A container element to record object version lifecycle events with timestamps
5
3
  #
@@ -19,7 +19,7 @@ module Serializer
19
19
  if filename
20
20
  filename
21
21
  else
22
- cname = self.name.split(/::/).last
22
+ cname = name.split(/::/).last
23
23
  cname[0, 1].downcase + cname[1..-1] + '.xml'
24
24
  end
25
25
  end
@@ -29,7 +29,7 @@ module Serializer
29
29
  # @param filename [String] Optional filename if one wishes to override the default filename
30
30
  # @return [Pathname] The location of the xml file
31
31
  def self.xml_pathname(parent_dir, filename = nil)
32
- Pathname.new(parent_dir).join(self.xml_filename(filename))
32
+ Pathname.new(parent_dir).join(xml_filename(filename))
33
33
  end
34
34
 
35
35
  # @api external
@@ -37,7 +37,7 @@ module Serializer
37
37
  # @param filename [String] Optional filename if one wishes to override the default filename
38
38
  # @return [Boolean] Returns true if the xml file exists
39
39
  def self.xml_pathname_exist?(parent_dir, filename = nil)
40
- self.xml_pathname(parent_dir, filename).exist?
40
+ xml_pathname(parent_dir, filename).exist?
41
41
  end
42
42
 
43
43
  # @api external
@@ -46,7 +46,7 @@ module Serializer
46
46
  # @return [Serializable] Read the xml file and return the parsed XML
47
47
  # @example {include:file:spec/features/serializer/read_xml_spec.rb}
48
48
  def self.read_xml_file(parent_dir, filename = nil)
49
- self.parse(self.xml_pathname(parent_dir, filename).read)
49
+ parse(xml_pathname(parent_dir, filename).read)
50
50
  end
51
51
 
52
52
  # @api external
@@ -56,7 +56,7 @@ module Serializer
56
56
  # @return [void] Serializize the in-memory object to a xml file instance
57
57
  def self.write_xml_file(xml_object, parent_dir, filename = nil)
58
58
  parent_dir.mkpath
59
- self.xml_pathname(parent_dir, filename).open('w') do |f|
59
+ xml_pathname(parent_dir, filename).open('w') do |f|
60
60
  xmlBuilder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8')
61
61
  xmlBuilder = xml_object.to_xml(xmlBuilder)
62
62
  f << xmlBuilder.to_xml
@@ -19,11 +19,8 @@ module Serializer
19
19
  # The symbols should correspond to attributes declared using HappyMapper syntax
20
20
  def initialize(opts = {})
21
21
  opts.each do |key, value|
22
- if variable_names.include?(key.to_s) || key == :test
23
- instance_variable_set("@#{key}", value)
24
- else
25
- raise "#{key} is not a variable name in #{self.class.name}"
26
- end
22
+ raise "#{key} is not a variable name in #{self.class.name}" unless variable_names.include?(key.to_s) || key == :test
23
+ instance_variable_set("@#{key}", value)
27
24
  end
28
25
  end
29
26
 
@@ -45,7 +42,7 @@ module Serializer
45
42
  # @api internal
46
43
  # @return [Array] Extract the names of the variables
47
44
  def variable_names
48
- variables.collect { |variable| variable.name }
45
+ variables.collect(&:name)
49
46
  end
50
47
 
51
48
  # @api internal
@@ -54,7 +51,7 @@ module Serializer
54
51
  # This follows the same convention as used by DataMapper
55
52
  # @see http://datamapper.org/docs/properties.html
56
53
  def key_name
57
- if not defined?(@key_name)
54
+ unless defined?(@key_name)
58
55
  @key_name = nil
59
56
  self.class.attributes.each do |attribute|
60
57
  if attribute.options[:key]
@@ -69,7 +66,7 @@ module Serializer
69
66
  # @api internal
70
67
  # @return [String] For the current object instance, return the string to use as a hash key
71
68
  def key
72
- return self.send(key_name) if key_name
69
+ return send(key_name) if key_name
73
70
  nil
74
71
  end
75
72
 
@@ -79,10 +76,10 @@ module Serializer
79
76
  # If the array member has a field tagged as a key, that field will be used as the hash.key.
80
77
  # Otherwise the index position of the array member will be used as the key
81
78
  def array_to_hash(array, summary = false)
82
- item_hash = Hash.new
79
+ item_hash = {}
83
80
  array.each_index do |index|
84
81
  item = array[index]
85
- ikey = (item.respond_to?(:key) && item.key) ? item.key : index
82
+ ikey = item.respond_to?(:key) && item.key ? item.key : index
86
83
  item_hash[ikey] = item.respond_to?(:to_hash) ? item.to_hash(summary) : item
87
84
  end
88
85
  item_hash
@@ -92,26 +89,26 @@ module Serializer
92
89
  # @return [Hash] Recursively generate an Hash containing the object's properties
93
90
  # @param summary [Boolean] Controls the depth and detail of recursion
94
91
  def to_hash(summary = false)
95
- oh = Hash.new
92
+ oh = {}
96
93
  vars = summary ? variables.select { |v| summary_fields.include?(v.name) } : variables
97
94
  vars.each do |variable|
98
95
  key = variable.name.to_s
99
- value = self.send(variable.name)
100
- case value
101
- when Array
102
- oh[key] = array_to_hash(value, summary)
103
- when Serializable
104
- oh[key] = value.to_hash
105
- else
106
- oh[key] = value
107
- end
96
+ value = send(variable.name)
97
+ oh[key] = case value
98
+ when Array
99
+ array_to_hash(value, summary)
100
+ when Serializable
101
+ value.to_hash
102
+ else
103
+ value
104
+ end
108
105
  end
109
106
  oh
110
107
  end
111
108
 
112
109
  # @return [Hash] Calls to_hash(summary=true)
113
110
  def summary
114
- self.to_hash(summary = true)
111
+ to_hash(summary = true)
115
112
  end
116
113
 
117
114
  # @api internal
@@ -120,13 +117,13 @@ module Serializer
120
117
  def diff(other)
121
118
  raise "Cannot compare different classes" if self.class != other.class
122
119
  left = other.to_hash
123
- right = self.to_hash
124
- if self.key.nil? or other.key.nil?
120
+ right = to_hash
121
+ if key.nil? || other.key.nil?
125
122
  ltag = :old
126
123
  rtag = :new
127
124
  else
128
125
  ltag = other.key
129
- rtag = self.key
126
+ rtag = key
130
127
  end
131
128
  Serializable.deep_diff(ltag, left, rtag, right)
132
129
  end
@@ -136,23 +133,26 @@ module Serializer
136
133
  # @return [Hash] Generate a hash containing the differences between two hashes
137
134
  # (recursively descend parallel trees of hashes)
138
135
  # @see https://gist.github.com/146844
139
- def Serializable.deep_diff(*hashes)
140
- diff = Hash.new
136
+ def self.deep_diff(*hashes)
137
+ diff = {}
141
138
  case hashes.length
142
139
  when 4
143
140
  ltag, left, rtag, right = hashes
144
141
  when 2
145
- ltag, left, rtag, right = :left, hashes[0], :right, hashes[1]
142
+ ltag = :left
143
+ left = hashes[0]
144
+ rtag = :right
145
+ right = hashes[1]
146
146
  else
147
147
  raise ArgumentError, "wrong number of arguments (#{hashes.length} for 2 or 4)"
148
148
  end
149
149
  (left.keys | right.keys).each do |k|
150
150
  if left[k] != right[k]
151
- if left[k].is_a?(Hash) && right[k].is_a?(Hash)
152
- diff[k] = deep_diff(ltag, left[k], rtag, right[k])
153
- else
154
- diff[k] = Hash.[](ltag, left[k], rtag, right[k])
155
- end
151
+ diff[k] = if left[k].is_a?(Hash) && right[k].is_a?(Hash)
152
+ deep_diff(ltag, left[k], rtag, right[k])
153
+ else
154
+ Hash.[](ltag, left[k], rtag, right[k])
155
+ end
156
156
  end
157
157
  end
158
158
  diff
@@ -161,14 +161,14 @@ module Serializer
161
161
  # @api internal
162
162
  # @return [String] Generate JSON output from a hash of the object's variables
163
163
  def to_json(summary = false)
164
- hash = self.to_hash(summary)
164
+ hash = to_hash(summary)
165
165
  JSON.pretty_generate(hash)
166
166
  end
167
167
 
168
168
  # @api internal
169
169
  # @return [String] Generate YAML output from a hash of the object's variables
170
170
  def to_yaml(summary = false)
171
- self.to_hash(summary).to_yaml
171
+ to_hash(summary).to_yaml
172
172
  end
173
173
  end
174
174
  end