moab-versioning 4.2.1 → 4.4.2

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.
Files changed (39) hide show
  1. checksums.yaml +5 -5
  2. data/lib/moab.rb +3 -2
  3. data/lib/moab/bagger.rb +25 -20
  4. data/lib/moab/config.rb +39 -8
  5. data/lib/moab/deposit_bag_validator.rb +22 -17
  6. data/lib/moab/exceptions.rb +10 -8
  7. data/lib/moab/file_group.rb +23 -22
  8. data/lib/moab/file_group_difference.rb +35 -35
  9. data/lib/moab/file_group_difference_subset.rb +5 -5
  10. data/lib/moab/file_instance.rb +4 -3
  11. data/lib/moab/file_instance_difference.rb +5 -5
  12. data/lib/moab/file_inventory.rb +25 -31
  13. data/lib/moab/file_inventory_difference.rb +11 -11
  14. data/lib/moab/file_manifestation.rb +8 -7
  15. data/lib/moab/file_signature.rb +35 -41
  16. data/lib/moab/signature_catalog.rb +19 -21
  17. data/lib/moab/signature_catalog_entry.rb +5 -5
  18. data/lib/moab/stanford.rb +2 -0
  19. data/lib/moab/storage_object.rb +23 -24
  20. data/lib/moab/storage_object_validator.rb +44 -16
  21. data/lib/moab/storage_object_version.rb +45 -40
  22. data/lib/moab/storage_repository.rb +59 -24
  23. data/lib/moab/storage_services.rb +17 -10
  24. data/lib/moab/utc_time.rb +3 -3
  25. data/lib/moab/verification_result.rb +3 -4
  26. data/lib/moab/version_metadata.rb +4 -4
  27. data/lib/moab/version_metadata_entry.rb +6 -6
  28. data/lib/moab/version_metadata_event.rb +1 -1
  29. data/lib/serializer.rb +2 -0
  30. data/lib/serializer/manifest.rb +9 -7
  31. data/lib/serializer/serializable.rb +41 -35
  32. data/lib/stanford/active_fedora_object.rb +1 -1
  33. data/lib/stanford/content_inventory.rb +40 -34
  34. data/lib/stanford/dor_metadata.rb +4 -3
  35. data/lib/stanford/moab_storage_directory.rb +4 -2
  36. data/lib/stanford/storage_object_validator.rb +1 -1
  37. data/lib/stanford/storage_repository.rb +9 -6
  38. data/lib/stanford/storage_services.rb +6 -6
  39. metadata +23 -38
@@ -1,4 +1,4 @@
1
- require 'moab'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Moab
4
4
  # An interface class to support access to SDR storage via a RESTful server
@@ -43,6 +43,13 @@ module Moab
43
43
  @@repository.find_storage_object(object_id, include_deposit)
44
44
  end
45
45
 
46
+ # @param object_id [String] The identifier of the digital object
47
+ # @param [Object] include_deposit
48
+ # @return [Array<StorageObject>] Representations of a digitial object's storage directories, or an empty array if none found.
49
+ def self.search_storage_objects(object_id, include_deposit = false)
50
+ @@repository.search_storage_objects(object_id, include_deposit)
51
+ end
52
+
46
53
  # @param object_id [String] The identifier of the digital object whose size is desired
47
54
  # @param include_deposit [Boolean] specifies whether to look in deposit areas for objects in process of initial ingest
48
55
  # @return [Integer] the size occupied on disk by the storage object, in bytes. this is the entire moab (all versions).
@@ -79,7 +86,7 @@ module Moab
79
86
  # @param [String] object_id The digital object identifier of the object
80
87
  # @return [Pathname] Pathname object containing the full path for the specified file
81
88
  def self.version_metadata(object_id)
82
- self.retrieve_file('metadata', 'versionMetadata.xml', object_id)
89
+ retrieve_file('metadata', 'versionMetadata.xml', object_id)
83
90
  end
84
91
 
85
92
  # @param [String] object_id The digital object identifier of the object
@@ -87,11 +94,11 @@ module Moab
87
94
  # @return [FileInventory] the file inventory for the specified object version
88
95
  def self.retrieve_file_group(file_category, object_id, version_id = nil)
89
96
  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
97
+ inventory_type = if file_category =~ /manifest/
98
+ file_category = 'manifests'
99
+ else
100
+ 'version'
101
+ end
95
102
  inventory = storage_object_version.file_inventory(inventory_type)
96
103
  inventory.group(file_category)
97
104
  end
@@ -103,7 +110,7 @@ module Moab
103
110
  # @return [Pathname] Pathname object containing the full path for the specified file
104
111
  def self.retrieve_file(file_category, file_id, object_id, version_id = nil)
105
112
  storage_object_version = @@repository.storage_object(object_id).find_object_version(version_id)
106
- file_pathname = storage_object_version.find_filepath(file_category, file_id)
113
+ storage_object_version.find_filepath(file_category, file_id)
107
114
  end
108
115
 
109
116
  # @param [String] file_category The category of file ('content', 'metdata', or 'manifest')
@@ -113,7 +120,7 @@ module Moab
113
120
  # @return [Pathname] Pathname object containing the full path for the specified file
114
121
  def self.retrieve_file_using_signature(file_category, file_signature, object_id, version_id = nil)
115
122
  storage_object_version = @@repository.storage_object(object_id).find_object_version(version_id)
116
- file_pathname = storage_object_version.find_filepath_using_signature(file_category, file_signature)
123
+ storage_object_version.find_filepath_using_signature(file_category, file_signature)
117
124
  end
118
125
 
119
126
  # @param [String] file_category The category of file ('content', 'metdata', or 'manifest')
@@ -123,7 +130,7 @@ module Moab
123
130
  # @return [FileSignature] The signature of the file
124
131
  def self.retrieve_file_signature(file_category, file_id, object_id, version_id = nil)
125
132
  storage_object_version = @@repository.storage_object(object_id).find_object_version(version_id)
126
- file_pathname = storage_object_version.find_signature(file_category, file_id)
133
+ storage_object_version.find_signature(file_category, file_id)
127
134
  end
128
135
 
129
136
  # @param [String] object_id The digital object identifier of the object
data/lib/moab/utc_time.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'time'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Moab
4
4
  # Timestamp conversion methods.
@@ -16,7 +16,7 @@ module Moab
16
16
  when Time
17
17
  datetime
18
18
  else
19
- raise "unknown time format #{datetime.inspect}"
19
+ raise(MoabRuntimeError, "unknown time format #{datetime.inspect}")
20
20
  end
21
21
  end
22
22
 
@@ -31,7 +31,7 @@ module Moab
31
31
  when Time
32
32
  datetime.utc.iso8601
33
33
  else
34
- raise "unknown time format #{datetime.inspect}"
34
+ raise(MoabRuntimeError, "unknown time format #{datetime.inspect}")
35
35
  end
36
36
  end
37
37
  end
@@ -1,4 +1,4 @@
1
- require 'moab'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Moab
4
4
  # A recursive "Tree" type object for verifications
@@ -54,10 +54,9 @@ module Moab
54
54
  # @return [Hash] The verification result serialized to a hash
55
55
  def to_hash(verbose = false, level = 0)
56
56
  hash = { 'verified' => verified }
57
- if verbose || !verified
58
- hash['details'] = details || subentities_to_hash(verbose, level)
59
- end
57
+ hash['details'] = details || subentities_to_hash(verbose, level) if verbose || !verified
60
58
  return hash if level > 0
59
+
61
60
  { entity => hash }
62
61
  end
63
62
 
@@ -1,4 +1,4 @@
1
- require 'moab'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Moab
4
4
  # The descriptive information about a digital object's collection of versions
@@ -19,16 +19,16 @@ module Moab
19
19
 
20
20
  # (see Serializable#initialize)
21
21
  def initialize(opts = {})
22
- @versions = Array.new
22
+ @versions = []
23
23
  super(opts)
24
24
  end
25
25
 
26
26
  # @attribute
27
27
  # @return [String] The digital object identifier
28
- attribute :digital_object_id, String, :tag => 'objectId'
28
+ attribute :digital_object_id, String, tag: 'objectId'
29
29
 
30
30
  # @attribute
31
31
  # @return [Array<VersionMetadataEntry>] An array of version metadata entries, one per version
32
- has_many :versions, VersionMetadataEntry, :tag => 'version'
32
+ has_many :versions, VersionMetadataEntry, tag: 'version'
33
33
  end
34
34
  end
@@ -1,4 +1,4 @@
1
- require 'moab'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Moab
4
4
  # The descriptive attributes of a digital object version.
@@ -18,13 +18,13 @@ module Moab
18
18
 
19
19
  # (see Serializable#initialize)
20
20
  def initialize(opts = {})
21
- @events = Array.new
21
+ @events = []
22
22
  super(opts)
23
23
  end
24
24
 
25
25
  # @attribute
26
26
  # @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 }
27
+ attribute :version_id, Integer, tag: 'versionId', key: true, on_save: proc { |n| n.to_s }
28
28
 
29
29
  # @attribute
30
30
  # @return [String] "an external version label that increments the most significant digit for major revisions,
@@ -46,14 +46,14 @@ module Moab
46
46
 
47
47
  # @attribute
48
48
  # @return [FileGroupDifference] Summary of content file differences since previous version
49
- element :content_changes, FileGroupDifference, :tag => 'fileGroupDifference'
49
+ element :content_changes, FileGroupDifference, tag: 'fileGroupDifference'
50
50
 
51
51
  # @attribute
52
52
  # @return [FileGroupDifference] Summary of metadata file differences since previous version
53
- element :metadata_changes, FileGroupDifference, :tag => 'fileGroupDifference'
53
+ element :metadata_changes, FileGroupDifference, tag: 'fileGroupDifference'
54
54
 
55
55
  # @attribute
56
56
  # @return [Array<VersionMetadataEvent>] Array of events with timestamps that track lifecycle stages
57
- has_many :events, VersionMetadataEvent, :tag => 'event'
57
+ has_many :events, VersionMetadataEvent, tag: 'event'
58
58
  end
59
59
  end
@@ -1,4 +1,4 @@
1
- require 'moab'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Moab
4
4
  # A container element to record object version lifecycle events with timestamps
data/lib/serializer.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Serializer is a module containing classes whose methods faciliate serialization
2
4
  # of data fields to various formats. To obtain those benefits, a dependent class
3
5
  # should inherit from {Serializable} or {Manifest}
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Serializer
2
4
  # Subclass of {Serializable} that adds methods for marshalling/unmarshalling data
3
5
  # to a persistent XML file format.
@@ -19,8 +21,8 @@ module Serializer
19
21
  if filename
20
22
  filename
21
23
  else
22
- cname = self.name.split(/::/).last
23
- cname[0, 1].downcase + cname[1..-1] + '.xml'
24
+ cname = name.split(/::/).last
25
+ "#{cname[0, 1].downcase}#{cname[1..]}.xml"
24
26
  end
25
27
  end
26
28
 
@@ -29,7 +31,7 @@ module Serializer
29
31
  # @param filename [String] Optional filename if one wishes to override the default filename
30
32
  # @return [Pathname] The location of the xml file
31
33
  def self.xml_pathname(parent_dir, filename = nil)
32
- Pathname.new(parent_dir).join(self.xml_filename(filename))
34
+ Pathname.new(parent_dir).join(xml_filename(filename))
33
35
  end
34
36
 
35
37
  # @api external
@@ -37,7 +39,7 @@ module Serializer
37
39
  # @param filename [String] Optional filename if one wishes to override the default filename
38
40
  # @return [Boolean] Returns true if the xml file exists
39
41
  def self.xml_pathname_exist?(parent_dir, filename = nil)
40
- self.xml_pathname(parent_dir, filename).exist?
42
+ xml_pathname(parent_dir, filename).exist?
41
43
  end
42
44
 
43
45
  # @api external
@@ -46,7 +48,7 @@ module Serializer
46
48
  # @return [Serializable] Read the xml file and return the parsed XML
47
49
  # @example {include:file:spec/features/serializer/read_xml_spec.rb}
48
50
  def self.read_xml_file(parent_dir, filename = nil)
49
- self.parse(self.xml_pathname(parent_dir, filename).read)
51
+ parse(xml_pathname(parent_dir, filename).read)
50
52
  end
51
53
 
52
54
  # @api external
@@ -56,8 +58,8 @@ module Serializer
56
58
  # @return [void] Serializize the in-memory object to a xml file instance
57
59
  def self.write_xml_file(xml_object, parent_dir, filename = nil)
58
60
  parent_dir.mkpath
59
- self.xml_pathname(parent_dir, filename).open('w') do |f|
60
- xmlBuilder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8')
61
+ xml_pathname(parent_dir, filename).open('w') do |f|
62
+ xmlBuilder = Nokogiri::XML::Builder.new(encoding: 'UTF-8')
61
63
  xmlBuilder = xml_object.to_xml(xmlBuilder)
62
64
  f << xmlBuilder.to_xml
63
65
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Serializer
2
4
  # Some utility methods to faciliate serialization of data fields to Hash, JSON, or YAML shared by all subclasses.
3
5
  # This class assumes that HappyMapper is used for declaration of fields to be serialized.
@@ -19,11 +21,10 @@ module Serializer
19
21
  # The symbols should correspond to attributes declared using HappyMapper syntax
20
22
  def initialize(opts = {})
21
23
  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
24
+ errmsg = "#{key} is not a variable name in #{self.class.name}"
25
+ raise(Moab::MoabRuntimeError, errmsg) unless variable_names.include?(key.to_s) || key == :test
26
+
27
+ instance_variable_set("@#{key}", value)
27
28
  end
28
29
  end
29
30
 
@@ -45,7 +46,7 @@ module Serializer
45
46
  # @api internal
46
47
  # @return [Array] Extract the names of the variables
47
48
  def variable_names
48
- variables.collect { |variable| variable.name }
49
+ variables.collect(&:name)
49
50
  end
50
51
 
51
52
  # @api internal
@@ -54,7 +55,7 @@ module Serializer
54
55
  # This follows the same convention as used by DataMapper
55
56
  # @see http://datamapper.org/docs/properties.html
56
57
  def key_name
57
- if not defined?(@key_name)
58
+ unless defined?(@key_name)
58
59
  @key_name = nil
59
60
  self.class.attributes.each do |attribute|
60
61
  if attribute.options[:key]
@@ -69,7 +70,8 @@ module Serializer
69
70
  # @api internal
70
71
  # @return [String] For the current object instance, return the string to use as a hash key
71
72
  def key
72
- return self.send(key_name) if key_name
73
+ return send(key_name) if key_name
74
+
73
75
  nil
74
76
  end
75
77
 
@@ -79,10 +81,10 @@ module Serializer
79
81
  # If the array member has a field tagged as a key, that field will be used as the hash.key.
80
82
  # Otherwise the index position of the array member will be used as the key
81
83
  def array_to_hash(array, summary = false)
82
- item_hash = Hash.new
84
+ item_hash = {}
83
85
  array.each_index do |index|
84
86
  item = array[index]
85
- ikey = (item.respond_to?(:key) && item.key) ? item.key : index
87
+ ikey = item.respond_to?(:key) && item.key ? item.key : index
86
88
  item_hash[ikey] = item.respond_to?(:to_hash) ? item.to_hash(summary) : item
87
89
  end
88
90
  item_hash
@@ -92,41 +94,42 @@ module Serializer
92
94
  # @return [Hash] Recursively generate an Hash containing the object's properties
93
95
  # @param summary [Boolean] Controls the depth and detail of recursion
94
96
  def to_hash(summary = false)
95
- oh = Hash.new
97
+ oh = {}
96
98
  vars = summary ? variables.select { |v| summary_fields.include?(v.name) } : variables
97
99
  vars.each do |variable|
98
100
  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
101
+ value = send(variable.name)
102
+ oh[key] = case value
103
+ when Array
104
+ array_to_hash(value, summary)
105
+ when Serializable
106
+ value.to_hash
107
+ else
108
+ value
109
+ end
108
110
  end
109
111
  oh
110
112
  end
111
113
 
112
114
  # @return [Hash] Calls to_hash(summary=true)
113
115
  def summary
114
- self.to_hash(summary = true)
116
+ to_hash(true)
115
117
  end
116
118
 
117
119
  # @api internal
118
120
  # @param other [Serializable] The other object being compared
119
121
  # @return [Hash] Generate a hash containing the differences between two objects of the same type
120
122
  def diff(other)
121
- raise "Cannot compare different classes" if self.class != other.class
123
+ raise(Moab::MoabRuntimeError, "Cannot compare different classes") if self.class != other.class
124
+
122
125
  left = other.to_hash
123
- right = self.to_hash
124
- if self.key.nil? or other.key.nil?
126
+ right = to_hash
127
+ if key.nil? || other.key.nil?
125
128
  ltag = :old
126
129
  rtag = :new
127
130
  else
128
131
  ltag = other.key
129
- rtag = self.key
132
+ rtag = key
130
133
  end
131
134
  Serializable.deep_diff(ltag, left, rtag, right)
132
135
  end
@@ -136,23 +139,26 @@ module Serializer
136
139
  # @return [Hash] Generate a hash containing the differences between two hashes
137
140
  # (recursively descend parallel trees of hashes)
138
141
  # @see https://gist.github.com/146844
139
- def Serializable.deep_diff(*hashes)
140
- diff = Hash.new
142
+ def self.deep_diff(*hashes)
143
+ diff = {}
141
144
  case hashes.length
142
145
  when 4
143
146
  ltag, left, rtag, right = hashes
144
147
  when 2
145
- ltag, left, rtag, right = :left, hashes[0], :right, hashes[1]
148
+ ltag = :left
149
+ left = hashes[0]
150
+ rtag = :right
151
+ right = hashes[1]
146
152
  else
147
153
  raise ArgumentError, "wrong number of arguments (#{hashes.length} for 2 or 4)"
148
154
  end
149
155
  (left.keys | right.keys).each do |k|
150
156
  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
157
+ diff[k] = if left[k].is_a?(Hash) && right[k].is_a?(Hash)
158
+ deep_diff(ltag, left[k], rtag, right[k])
159
+ else
160
+ Hash.[](ltag, left[k], rtag, right[k])
161
+ end
156
162
  end
157
163
  end
158
164
  diff
@@ -161,14 +167,14 @@ module Serializer
161
167
  # @api internal
162
168
  # @return [String] Generate JSON output from a hash of the object's variables
163
169
  def to_json(summary = false)
164
- hash = self.to_hash(summary)
170
+ hash = to_hash(summary)
165
171
  JSON.pretty_generate(hash)
166
172
  end
167
173
 
168
174
  # @api internal
169
175
  # @return [String] Generate YAML output from a hash of the object's variables
170
176
  def to_yaml(summary = false)
171
- self.to_hash(summary).to_yaml
177
+ to_hash(summary).to_yaml
172
178
  end
173
179
  end
174
180
  end
@@ -1,4 +1,4 @@
1
- require 'moab/stanford'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Stanford
4
4
  # Utility Class for extracting content or other information from a Fedora Instance
@@ -1,4 +1,4 @@
1
- require 'moab/stanford'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Stanford
4
4
  # Stanford-specific utility methods for transforming contentMetadata to versionInventory and doing comparisons
@@ -23,7 +23,7 @@ module Stanford
23
23
  # Many of these objects have contentMetadata with no child elements, such as this:
24
24
  # <contentMetadata objectId="bd608mj3166" type="file"/>
25
25
  # but there are also objects that have no datasteam of this name at all
26
- cm_inventory = Moab::FileInventory.new(:type => "version", :digital_object_id => object_id, :version_id => version_id)
26
+ cm_inventory = Moab::FileInventory.new(type: "version", digital_object_id: object_id, version_id: version_id)
27
27
  content_group = group_from_cm(content_metadata, subset)
28
28
  cm_inventory.groups << content_group
29
29
  cm_inventory
@@ -47,9 +47,9 @@ module Stanford
47
47
  when 'all'
48
48
  ng_doc.xpath("//file")
49
49
  else
50
- raise "Unknown disposition subset (#{subset})"
50
+ raise(Moab::MoabRuntimeError, "Unknown disposition subset (#{subset})")
51
51
  end
52
- content_group = Moab::FileGroup.new(:group_id => 'content', :data_source => "contentMetadata-#{subset}")
52
+ content_group = Moab::FileGroup.new(group_id: 'content', data_source: "contentMetadata-#{subset}")
53
53
  nodeset.each do |file_node|
54
54
  signature = generate_signature(file_node)
55
55
  instance = generate_instance(file_node)
@@ -62,7 +62,7 @@ module Stanford
62
62
  # @param node [Nokogiri::XML::Node] The XML node containing file information
63
63
  # @return [FileSignature] The {FileSignature} object generated from the XML data
64
64
  def generate_signature(node)
65
- signature = Moab::FileSignature.new()
65
+ signature = Moab::FileSignature.new
66
66
  signature.size = node.attributes['size'].content
67
67
  checksum_nodes = node.xpath('checksum')
68
68
  checksum_nodes.each do |checksum_node|
@@ -82,9 +82,13 @@ module Stanford
82
82
  # @param node (see #generate_signature)
83
83
  # @return [FileInstance] The {FileInstance} object generated from the XML data
84
84
  def generate_instance(node)
85
- instance = Moab::FileInstance.new()
85
+ instance = Moab::FileInstance.new
86
86
  instance.path = node.attributes['id'].content
87
- instance.datetime = node.attributes['datetime'].content rescue nil
87
+ instance.datetime = begin
88
+ node.attributes['datetime'].content
89
+ rescue
90
+ nil
91
+ end
88
92
  instance
89
93
  end
90
94
 
@@ -94,28 +98,28 @@ module Stanford
94
98
  # @example {include:file:spec/features/stanford/content_metadata_write_spec.rb}
95
99
  def generate_content_metadata(file_group, object_id, version_id)
96
100
  cm = Nokogiri::XML::Builder.new do |xml|
97
- xml.contentMetadata(:type => "sample", :objectId => object_id) {
98
- xml.resource(:type => "version", :sequence => "1", :id => "version-#{version_id}") {
101
+ xml.contentMetadata(type: "sample", objectId: object_id) do
102
+ xml.resource(type: "version", sequence: "1", id: "version-#{version_id}") do
99
103
  file_group.files.each do |file_manifestation|
100
104
  signature = file_manifestation.signature
101
105
  file_manifestation.instances.each do |instance|
102
106
  xml.file(
103
- :id => instance.path,
104
- :size => signature.size,
105
- :datetime => instance.datetime,
106
- :shelve => 'yes',
107
- :publish => 'yes',
108
- :preserve => 'yes'
109
- ) {
107
+ id: instance.path,
108
+ size: signature.size,
109
+ datetime: instance.datetime,
110
+ shelve: 'yes',
111
+ publish: 'yes',
112
+ preserve: 'yes'
113
+ ) do
110
114
  fixity = signature.fixity
111
- xml.checksum(:type => "MD5") { xml.text signature.md5 } if fixity[:md5]
112
- xml.checksum(:type => "SHA-1") { xml.text signature.sha1 } if fixity[:sha1]
113
- xml.checksum(:type => "SHA-256") { xml.text signature.sha256 } if fixity[:sha256]
114
- }
115
+ xml.checksum(type: "MD5") { xml.text signature.md5 } if fixity[:md5]
116
+ xml.checksum(type: "SHA-1") { xml.text signature.sha1 } if fixity[:sha1]
117
+ xml.checksum(type: "SHA-256") { xml.text signature.sha256 } if fixity[:sha256]
118
+ end
115
119
  end
116
120
  end
117
- }
118
- }
121
+ end
122
+ end
119
123
  end
120
124
  cm.to_xml
121
125
  end
@@ -124,7 +128,8 @@ module Stanford
124
128
  # @return [Boolean] True if contentMetadata has essential file attributes, else raise exception
125
129
  def validate_content_metadata(content_metadata)
126
130
  result = validate_content_metadata_details(content_metadata)
127
- raise Moab::InvalidMetadataException, result[0] + " ..." if result.size > 0
131
+ raise Moab::InvalidMetadataException, "#{result[0]} ..." unless result.empty?
132
+
128
133
  true
129
134
  end
130
135
 
@@ -145,7 +150,7 @@ module Stanford
145
150
  end
146
151
  nodeset = content_metadata_doc.xpath("//file")
147
152
  nodeset.each do |file_node|
148
- missing = ['id', 'size', 'md5', 'sha1']
153
+ missing = %w[id size md5 sha1]
149
154
  missing.delete('id') if file_node.has_attribute?('id')
150
155
  missing.delete('size') if file_node.has_attribute?('size')
151
156
  checksum_nodes = file_node.xpath('checksum')
@@ -159,7 +164,7 @@ module Stanford
159
164
  end
160
165
  if missing.include?('id')
161
166
  result << "File node #{nodeset.index(file_node)} is missing #{missing.join(',')}"
162
- elsif missing.size > 0
167
+ elsif !missing.empty?
163
168
  id = file_node['id']
164
169
  result << "File node having id='#{id}' is missing #{missing.join(',')}"
165
170
  end
@@ -173,11 +178,12 @@ module Stanford
173
178
  # @see http://blog.slashpoundbang.com/post/1454850669/how-to-pretty-print-xml-with-nokogiri
174
179
  def remediate_content_metadata(content_metadata, content_group)
175
180
  return nil if content_metadata.nil?
176
- return content_metadata if content_group.nil? or content_group.files.size < 1
181
+ return content_metadata if content_group.nil? || content_group.files.empty?
182
+
177
183
  signature_for_path = content_group.path_hash
178
184
  @type_for_name = Moab::FileSignature.checksum_type_for_name
179
185
  @names_for_type = Moab::FileSignature.checksum_names_for_type
180
- ng_doc = Nokogiri::XML(content_metadata) { |x| x.noblanks }
186
+ ng_doc = Nokogiri::XML(content_metadata, &:noblanks)
181
187
  nodeset = ng_doc.xpath("//file")
182
188
  nodeset.each do |file_node|
183
189
  filepath = file_node['id']
@@ -185,7 +191,7 @@ module Stanford
185
191
  remediate_file_size(file_node, signature)
186
192
  remediate_checksum_nodes(file_node, signature)
187
193
  end
188
- ng_doc.to_xml(:indent => 2)
194
+ ng_doc.to_xml(indent: 2)
189
195
  end
190
196
 
191
197
  # @param [Nokogiri::XML::Element] file_node the File stanza being remediated
@@ -193,10 +199,10 @@ module Stanford
193
199
  # @return [void] update the file size attribute if missing, raise exception if inconsistent
194
200
  def remediate_file_size(file_node, signature)
195
201
  file_size = file_node['size']
196
- if file_size.nil? or file_size.empty?
202
+ if file_size.nil? || file_size.empty?
197
203
  file_node['size'] = signature.size.to_s
198
204
  elsif file_size != signature.size.to_s
199
- raise "Inconsistent size for #{file_node['id']}: #{file_size} != #{signature.size}"
205
+ raise(Moab::MoabRuntimeError, "Inconsistent size for #{file_node['id']}: #{file_size} != #{signature.size}")
200
206
  end
201
207
  end
202
208
 
@@ -205,14 +211,14 @@ module Stanford
205
211
  # @return [void] update the file's checksum elements if data missing, raise exception if inconsistent
206
212
  def remediate_checksum_nodes(file_node, signature)
207
213
  # collect <checksum> elements for checksum types that are already present
208
- checksum_nodes = Hash.new
214
+ checksum_nodes = {}
209
215
  file_node.xpath('checksum').each do |checksum_node|
210
216
  type = @type_for_name[checksum_node['type']]
211
217
  checksum_nodes[type] = checksum_node
212
218
  end
213
219
  # add new <checksum> elements for the other checksum types that were missing
214
220
  @names_for_type.each do |type, names|
215
- unless checksum_nodes.has_key?(type)
221
+ unless checksum_nodes.key?(type)
216
222
  checksum_node = Nokogiri::XML::Element.new('checksum', file_node.document)
217
223
  checksum_node['type'] = names[0]
218
224
  file_node << checksum_node
@@ -223,10 +229,10 @@ module Stanford
223
229
  checksum_nodes.each do |type, checksum_node|
224
230
  cm_checksum = checksum_node.content
225
231
  sig_checksum = signature.checksums[type]
226
- if cm_checksum.nil? or cm_checksum.empty?
232
+ if cm_checksum.nil? || cm_checksum.empty?
227
233
  checksum_node.content = sig_checksum
228
234
  elsif cm_checksum != sig_checksum
229
- raise "Inconsistent #{type} for #{file_node['id']}: #{cm_checksum} != #{sig_checksum}"
235
+ raise(Moab::MoabRuntimeError, "Inconsistent #{type} for #{file_node['id']}: #{cm_checksum} != #{sig_checksum}")
230
236
  end
231
237
  end
232
238
  end