moab-versioning 4.2.1 → 4.4.2

Sign up to get free protection for your applications and to get access to all the features.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8226ecfe5e815a81aa72bc564fc1abc341b4f570
4
- data.tar.gz: 9d085cad25bc601caec626edb5cf4f778a979fc3
2
+ SHA256:
3
+ metadata.gz: 4b576c73187205ae4548c6460bac2b68cedab5dc7c3b94a66a5d8ec13729c6ae
4
+ data.tar.gz: e714a158d2e1388dec94482c1fa858a2ee29a6eca6e0f9004658446801088476
5
5
  SHA512:
6
- metadata.gz: 6c0072f1cd34f7bd192a4231b6c496e81d4ce380edaf08cd5fb997b240ad64b09c8ce94ed4083a65f812c11971b1e11eadf2d8099edb898226d904a8e58c3d17
7
- data.tar.gz: 71aa7a0ff75185089d2a7705a13635b67b0fbaa600b438a35fde7f75a4bd83061f050b1c4eeef98162e38b64a66e6c23e3f45748bde93b5de42acaee32fadf9e
6
+ metadata.gz: 251925f9e4c45f20f6ae4270fc73adfe9f4645689bda08ebd42c2b707909177ab575e0427c83e321c2ebc039c735f9bc141b29037f28cb65249c25bd9e76d520
7
+ data.tar.gz: '053391d53a3a3a46bbfedce8e7a04ea0f28a7f5c43689c2bde3c1901f9303eae7356d507904ec1892d9da61f2d4c9c6e58ed3fec894985e19b9ab85dd5fa65fd'
data/lib/moab.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Moab is a module that provides a distintive namespace for the collection of classes it contains.
2
4
  #
3
5
  # ====Data Model
@@ -29,11 +31,10 @@
29
31
  # @note Copyright (c) 2012 by The Board of Trustees of the Leland Stanford Junior University.
30
32
  # All rights reserved. See {file:LICENSE.rdoc} for details.
31
33
  module Moab
32
- DEFAULT_CHECKSUM_TYPES = [:md5, :sha1, :sha256].freeze
34
+ DEFAULT_CHECKSUM_TYPES = %i[md5 sha1 sha256].freeze
33
35
  end
34
36
 
35
37
  require 'serializer'
36
- require 'confstruct/configuration'
37
38
  require 'moab/config'
38
39
  require 'moab/utc_time'
39
40
  require 'moab/file_signature'
data/lib/moab/bagger.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moab
2
4
  # A class used to create a BagIt package from a version inventory and a set of source files.
3
5
  # The {#fill_bag} method is called with a package_mode parameter that specifies
@@ -25,7 +27,7 @@ module Moab
25
27
  @version_inventory = version_inventory
26
28
  @signature_catalog = signature_catalog
27
29
  @bag_pathname = Pathname.new(bag_pathname)
28
- create_bagit_txt()
30
+ create_bagit_txt
29
31
  end
30
32
 
31
33
  # @return [FileInventory] The complete inventory of the files comprising a digital object version
@@ -54,7 +56,7 @@ module Moab
54
56
 
55
57
  # @api internal
56
58
  # @return [void] Generate the bagit.txt tag file
57
- def create_bagit_txt()
59
+ def create_bagit_txt
58
60
  bag_pathname.mkpath
59
61
  bag_pathname.join("bagit.txt").open('w') do |f|
60
62
  f.puts "Tag-File-Character-Encoding: UTF-8"
@@ -63,13 +65,13 @@ module Moab
63
65
  end
64
66
 
65
67
  # @return [NilClass] Delete the bagit files
66
- def delete_bag()
68
+ def delete_bag
67
69
  # make sure this looks like a bag before deleting
68
70
  if bag_pathname.join('bagit.txt').exist?
69
71
  if bag_pathname.join('data').exist?
70
72
  bag_pathname.rmtree
71
73
  else
72
- bag_pathname.children.each { |file| file.delete }
74
+ bag_pathname.children.each(&:delete)
73
75
  bag_pathname.rmdir
74
76
  end
75
77
  end
@@ -77,7 +79,7 @@ module Moab
77
79
  end
78
80
 
79
81
  # @param tar_pathname [Pathname] The location of the tar file (default is based on bag location)
80
- def delete_tarfile()
82
+ def delete_tarfile
81
83
  bag_name = bag_pathname.basename
82
84
  bag_parent = bag_pathname.parent
83
85
  tar_pathname = bag_parent.join("#{bag_name}.tar")
@@ -140,7 +142,8 @@ module Moab
140
142
  # Return true if successful or nil if the group was not found in the inventory
141
143
  def deposit_group(group_id, source_dir)
142
144
  group = bag_inventory.group(group_id)
143
- return nil? if group.nil? or group.files.empty?
145
+ return nil? if group.nil? || group.files.empty?
146
+
144
147
  target_dir = bag_pathname.join('data', group_id)
145
148
  group.path_list.each do |relative_path|
146
149
  source = source_dir.join(relative_path)
@@ -157,7 +160,8 @@ module Moab
157
160
  # Return true if successful or nil if the group was not found in the inventory
158
161
  def reconstuct_group(group_id, storage_object_dir)
159
162
  group = bag_inventory.group(group_id)
160
- return nil? if group.nil? or group.files.empty?
163
+ return nil? if group.nil? || group.files.empty?
164
+
161
165
  target_dir = bag_pathname.join('data', group_id)
162
166
  group.files.each do |file|
163
167
  catalog_entry = signature_catalog.signature_hash[file.signature]
@@ -165,7 +169,7 @@ module Moab
165
169
  file.instances.each do |instance|
166
170
  target = target_dir.join(instance.path)
167
171
  target.parent.mkpath
168
- FileUtils.symlink source, target
172
+ FileUtils.symlink source, target unless target.exist?
169
173
  end
170
174
  end
171
175
  true
@@ -183,8 +187,8 @@ module Moab
183
187
  # @api internal
184
188
  # @return [void] Using the checksum information from the inventory, create BagIt manifest files for the payload
185
189
  def create_payload_manifests
186
- manifest_pathname = Hash.new
187
- manifest_file = Hash.new
190
+ manifest_pathname = {}
191
+ manifest_file = {}
188
192
  DEFAULT_CHECKSUM_TYPES.each do |type|
189
193
  manifest_pathname[type] = bag_pathname.join("manifest-#{type}.txt")
190
194
  manifest_file[type] = manifest_pathname[type].open('w')
@@ -205,7 +209,7 @@ module Moab
205
209
  if manifest_file[type]
206
210
  manifest_file[type].close
207
211
  manifest_pathname[type].delete if
208
- manifest_pathname[type].exist? and manifest_pathname[type].size == 0
212
+ manifest_pathname[type].exist? && manifest_pathname[type].size == 0
209
213
  end
210
214
  end
211
215
  end
@@ -222,9 +226,9 @@ module Moab
222
226
 
223
227
  # @api internal
224
228
  # @return [void] create BagIt tag manifest files containing checksums for all files in the bag's root directory
225
- def create_tagfile_manifests()
226
- manifest_pathname = Hash.new
227
- manifest_file = Hash.new
229
+ def create_tagfile_manifests
230
+ manifest_pathname = {}
231
+ manifest_file = {}
228
232
  DEFAULT_CHECKSUM_TYPES.each do |type|
229
233
  manifest_pathname[type] = bag_pathname.join("tagmanifest-#{type}.txt")
230
234
  manifest_file[type] = manifest_pathname[type].open('w')
@@ -243,7 +247,7 @@ module Moab
243
247
  if manifest_file[type]
244
248
  manifest_file[type].close
245
249
  manifest_pathname[type].delete if
246
- manifest_pathname[type].exist? and manifest_pathname[type].size == 0
250
+ manifest_pathname[type].exist? && manifest_pathname[type].size == 0
247
251
  end
248
252
  end
249
253
  end
@@ -259,8 +263,9 @@ module Moab
259
263
  rescue
260
264
  shell_execute(tar_cmd.sub('--force-local', ''))
261
265
  end
262
- raise "Unable to create tarfile #{tar_pathname}" unless tar_pathname.exist?
263
- return true
266
+ raise(MoabRuntimeError, "Unable to create tarfile #{tar_pathname}") unless tar_pathname.exist?
267
+
268
+ true
264
269
  end
265
270
 
266
271
  # Executes a system command in a subprocess
@@ -273,12 +278,12 @@ module Moab
273
278
  stdout
274
279
  else
275
280
  msg = "Shell command failed: [#{command}] caused by <STDERR = #{stderr}>"
276
- msg << " STDOUT = #{stdout}" if stdout && stdout.length.positive?
277
- raise(StandardError, msg)
281
+ msg << " STDOUT = #{stdout}" if stdout&.length&.positive?
282
+ raise(MoabStandardError, msg)
278
283
  end
279
284
  rescue SystemCallError => e
280
285
  msg = "Shell command failed: [#{command}] caused by #{e.inspect}"
281
- raise(StandardError, msg)
286
+ raise(MoabStandardError, msg)
282
287
  end
283
288
  end
284
289
  end
data/lib/moab/config.rb CHANGED
@@ -1,12 +1,43 @@
1
- require 'moab'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Moab
4
- # @return [Confstruct::Configuration] the configuration data
5
- Config = Confstruct::Configuration.new do
6
- storage_roots nil
7
- storage_trunk nil
8
- deposit_trunk nil
9
- path_method :druid_tree
10
- checksum_algos [:md5, :sha1, :sha256]
4
+ # A place to store configuration for the gem
5
+ class Configuration
6
+ def initialize
7
+ @path_method = :druid_tree
8
+ @checksum_algos = [:md5, :sha1, :sha256]
9
+ end
10
+
11
+ def configure(&block)
12
+ instance_eval(&block)
13
+ end
14
+
15
+ def storage_roots(new_value = nil)
16
+ @storage_roots = new_value if new_value
17
+ @storage_roots
18
+ end
19
+
20
+ def storage_trunk(new_value = nil)
21
+ @storage_trunk = new_value if new_value
22
+ @storage_trunk
23
+ end
24
+
25
+ def deposit_trunk(new_value = nil)
26
+ @deposit_trunk = new_value if new_value
27
+ @deposit_trunk
28
+ end
29
+
30
+ def path_method(new_value = nil)
31
+ @path_method = new_value if new_value
32
+ @path_method
33
+ end
34
+
35
+ def checksum_algos(new_value = nil)
36
+ @checksum_algos = new_value if new_value
37
+ @checksum_algos
38
+ end
11
39
  end
40
+
41
+ # @return [Moab::Configuration] the configuration data
42
+ Config = Configuration.new
12
43
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moab
2
4
  # Given a deposit bag, ensures the contents valid for becoming a StorageObjectVersion
3
5
  # this is a Shameless Green implementation, combining code from:
@@ -30,23 +32,23 @@ module Moab
30
32
  VERSION_MISSING_FROM_FILE => "Version xml file %{version_file} missing data at %{xpath} containing version id"
31
33
  }.freeze
32
34
 
33
- REQUIRED_MANIFEST_CHECKSUM_TYPE = 'sha256'.freeze
34
- RECOGNIZED_CHECKSUM_ALGORITHMS = [:md5, :sha1, :sha256, :sha384, :sha512].freeze
35
+ REQUIRED_MANIFEST_CHECKSUM_TYPE = 'sha256'
36
+ RECOGNIZED_CHECKSUM_ALGORITHMS = %i[md5 sha1 sha256 sha384 sha512].freeze
35
37
 
36
- TAGMANIFEST = 'tagmanifest'.freeze
37
- MANIFEST = 'manifest'.freeze
38
- DATA_DIR_BASENAME = 'data'.freeze
39
- BAG_INFO_TXT_BASENAME = 'bag-info.txt'.freeze
40
- VERSION_ADDITIONS_BASENAME = 'versionAdditions.xml'.freeze
41
- VERSION_INVENTORY_BASENAME = 'versionInventory.xml'.freeze
42
- VERSION_METADATA_PATH = "#{DATA_DIR_BASENAME}/metadata/versionMetadata.xml".freeze
38
+ TAGMANIFEST = 'tagmanifest'
39
+ MANIFEST = 'manifest'
40
+ DATA_DIR_BASENAME = 'data'
41
+ BAG_INFO_TXT_BASENAME = 'bag-info.txt'
42
+ VERSION_ADDITIONS_BASENAME = 'versionAdditions.xml'
43
+ VERSION_INVENTORY_BASENAME = 'versionInventory.xml'
44
+ VERSION_METADATA_PATH = "#{DATA_DIR_BASENAME}/metadata/versionMetadata.xml"
43
45
 
44
46
  REQUIRED_BAG_FILES = [
45
47
  DATA_DIR_BASENAME,
46
- 'bagit.txt'.freeze,
48
+ 'bagit.txt',
47
49
  BAG_INFO_TXT_BASENAME,
48
- "#{MANIFEST}-#{REQUIRED_MANIFEST_CHECKSUM_TYPE}.txt".freeze,
49
- "#{TAGMANIFEST}-#{REQUIRED_MANIFEST_CHECKSUM_TYPE}.txt".freeze,
50
+ "#{MANIFEST}-#{REQUIRED_MANIFEST_CHECKSUM_TYPE}.txt",
51
+ "#{TAGMANIFEST}-#{REQUIRED_MANIFEST_CHECKSUM_TYPE}.txt",
50
52
  VERSION_ADDITIONS_BASENAME,
51
53
  VERSION_INVENTORY_BASENAME,
52
54
  VERSION_METADATA_PATH
@@ -64,6 +66,7 @@ module Moab
64
66
  def validation_errors
65
67
  return [single_error_hash(BAG_DIR_NOT_FOUND, bag_dir: deposit_bag_pathname)] unless deposit_bag_pathname.exist?
66
68
  return result_array unless required_bag_files_exist?
69
+
67
70
  verify_version
68
71
  verify_tagmanifests
69
72
  verify_payload_size
@@ -112,6 +115,7 @@ module Moab
112
115
  doc = Nokogiri::XML(File.open(pathname.to_s), &:strict)
113
116
  version_id = doc.xpath(xpath).last.text unless doc.xpath(xpath).empty?
114
117
  return version_id.to_i if version_id
118
+
115
119
  err_data = {
116
120
  version_file: pathname,
117
121
  xpath: xpath
@@ -129,6 +133,7 @@ module Moab
129
133
 
130
134
  def verify_version_from_xml_file(file_pathname, found)
131
135
  return if found == expected_new_version
136
+
132
137
  err_data = {
133
138
  file_pathname: file_pathname,
134
139
  new_version: expected_new_version,
@@ -186,7 +191,7 @@ module Moab
186
191
  home_dir_pathnames = deposit_bag_pathname.children.reject { |file| file.basename.to_s.start_with?(TAGMANIFEST) }
187
192
  hash_with_full_pathnames = generate_checksums_hash(home_dir_pathnames, types_to_generate)
188
193
  # return hash keys as basenames only
189
- hash_with_full_pathnames.map { |k, v| [Pathname.new(k).basename.to_s, v] }.to_h
194
+ hash_with_full_pathnames.transform_keys { |k| Pathname.new(k).basename.to_s }
190
195
  end
191
196
 
192
197
  # generate hash of checksums by file name for bag data dir files
@@ -194,7 +199,7 @@ module Moab
194
199
  data_pathnames = deposit_bag_pathname.join(DATA_DIR_BASENAME).find
195
200
  hash_with_full_pathnames = generate_checksums_hash(data_pathnames, types_to_generate)
196
201
  # return hash keys beginning with 'data/'
197
- hash_with_full_pathnames.map { |k, v| [Pathname.new(k).relative_path_from(deposit_bag_pathname).to_s, v] }.to_h
202
+ hash_with_full_pathnames.transform_keys { |k| Pathname.new(k).relative_path_from(deposit_bag_pathname).to_s }
198
203
  end
199
204
 
200
205
  def generate_checksums_hash(pathnames, types_to_generate)
@@ -251,6 +256,7 @@ module Moab
251
256
  end
252
257
  end
253
258
  return if diff_hash.empty?
259
+
254
260
  err_data = {
255
261
  manifest_type: manifest_type,
256
262
  diffs: diff_hash
@@ -266,9 +272,7 @@ module Moab
266
272
  checksum_types_to_compare.each do |type|
267
273
  left_checksum = left_checksums[type]
268
274
  right_checksum = right_checksums[type]
269
- if left_checksum != right_checksum
270
- diff_hash[type] = { left_label => left_checksum, right_label => right_checksum }
271
- end
275
+ diff_hash[type] = { left_label => left_checksum, right_label => right_checksum } if left_checksum != right_checksum
272
276
  end
273
277
  diff_hash.empty? ? nil : diff_hash
274
278
  end
@@ -277,6 +281,7 @@ module Moab
277
281
  sizes_from_bag_info_file = bag_info_payload_size
278
282
  generated_sizes = generated_payload_size
279
283
  return if sizes_from_bag_info_file == generated_sizes
284
+
280
285
  err_data = {
281
286
  bag_info_sizes: sizes_from_bag_info_file,
282
287
  generated_sizes: generated_sizes
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moab
2
- class ObjectNotFoundException < RuntimeError
3
- end
4
+ class MoabRuntimeError < RuntimeError; end
5
+
6
+ class MoabStandardError < StandardError; end
7
+
8
+ class FileNotFoundException < MoabRuntimeError; end
4
9
 
5
- class FileNotFoundException < RuntimeError
6
- end
10
+ class InvalidMetadataException < MoabRuntimeError; end
7
11
 
8
- class InvalidMetadataException < RuntimeError
9
- end
12
+ class InvalidSuriSyntaxError < MoabRuntimeError; end
10
13
 
11
- class ValidationException < RuntimeError
12
- end
14
+ class ObjectNotFoundException < MoabRuntimeError; end
13
15
  end
@@ -1,4 +1,4 @@
1
- require 'moab'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Moab
4
4
  # A container for a standard subset of a digital objects {FileManifestation} objects
@@ -22,22 +22,23 @@ module Moab
22
22
 
23
23
  # (see Serializable#initialize)
24
24
  def initialize(opts = {})
25
- @signature_hash = Hash.new
25
+ @signature_hash = {}
26
26
  @data_source = ""
27
+ @signatures_from_bag = nil # prevents later warning: instance variable @signatures_from_bag not initialized
27
28
  super(opts)
28
29
  end
29
30
 
30
31
  # @attribute
31
32
  # @return [String] The name of the file group
32
- attribute :group_id, String, :tag => 'groupId', :key => true
33
+ attribute :group_id, String, tag: 'groupId', key: true
33
34
 
34
35
  # @attribute
35
36
  # @return [String] The directory location or other source of this groups file data
36
- attribute :data_source, String, :tag => 'dataSource'
37
+ attribute :data_source, String, tag: 'dataSource'
37
38
 
38
39
  # @attribute
39
40
  # @return [Integer] The total number of data files (dynamically calculated)
40
- attribute :file_count, Integer, :tag => 'fileCount', :on_save => Proc.new { |i| i.to_s }
41
+ attribute :file_count, Integer, tag: 'fileCount', on_save: proc { |i| i.to_s }
41
42
 
42
43
  def file_count
43
44
  files.inject(0) { |sum, manifestation| sum + manifestation.file_count }
@@ -45,7 +46,7 @@ module Moab
45
46
 
46
47
  # @attribute
47
48
  # @return [Integer] The total size (in bytes) of all data files (dynamically calculated)
48
- attribute :byte_count, Integer, :tag => 'byteCount', :on_save => Proc.new { |i| i.to_s }
49
+ attribute :byte_count, Integer, tag: 'byteCount', on_save: proc { |i| i.to_s }
49
50
 
50
51
  def byte_count
51
52
  files.inject(0) { |sum, manifestation| sum + manifestation.byte_count }
@@ -53,7 +54,7 @@ module Moab
53
54
 
54
55
  # @attribute
55
56
  # @return [Integer] The total disk usage (in 1 kB blocks) of all data files (estimating du -k result) (dynamically calculated)
56
- attribute :block_count, Integer, :tag => 'blockCount', :on_save => Proc.new { |i| i.to_s }
57
+ attribute :block_count, Integer, tag: 'blockCount', on_save: proc { |i| i.to_s }
57
58
 
58
59
  def block_count
59
60
  files.inject(0) { |sum, manifestation| sum + manifestation.block_count }
@@ -61,12 +62,12 @@ module Moab
61
62
 
62
63
  # @return [Array<String>] The data fields to include in summary reports
63
64
  def summary_fields
64
- %w{group_id file_count byte_count block_count}
65
+ %w[group_id file_count byte_count block_count]
65
66
  end
66
67
 
67
68
  # @attribute
68
69
  # @return [Array<FileManifestation>] The set of files comprising the group
69
- has_many :files, FileManifestation, :tag => 'file'
70
+ has_many :files, FileManifestation, tag: 'file'
70
71
 
71
72
  def files
72
73
  signature_hash.values
@@ -80,7 +81,7 @@ module Moab
80
81
  # @return [Hash<String,FileSignature>] An index of file paths,
81
82
  # used to test for existence of a filename in this file group
82
83
  def path_hash
83
- path_hash = Hash.new
84
+ path_hash = {}
84
85
  signature_hash.each do |signature, manifestation|
85
86
  manifestation.instances.each do |instance|
86
87
  path_hash[instance.path] = signature
@@ -91,14 +92,14 @@ module Moab
91
92
 
92
93
  # @return [Array<String>] The list of file paths in this group
93
94
  def path_list
94
- files.collect { |file| file.instances.collect { |instance| instance.path } }.flatten
95
+ files.collect { |file| file.instances.collect(&:path) }.flatten
95
96
  end
96
97
 
97
98
  # @api internal
98
99
  # @param signature_subset [Array<FileSignature>] The signatures used to select the entries to return
99
100
  # @return [Hash<String,FileSignature>] A pathname,signature hash containing a subset of the filenames in this file group
100
101
  def path_hash_subset(signature_subset)
101
- path_hash = Hash.new
102
+ path_hash = {}
102
103
  signature_subset.each do |signature|
103
104
  manifestation = signature_hash[signature]
104
105
  manifestation.instances.each do |instance|
@@ -132,7 +133,7 @@ module Moab
132
133
  # @return [void] Add a single {FileSignature},{FileInstance} key/value pair to this group.
133
134
  # Data is actually stored in the {#signature_hash}
134
135
  def add_file_instance(signature, instance)
135
- if signature_hash.has_key?(signature)
136
+ if signature_hash.key?(signature)
136
137
  manifestation = signature_hash[signature]
137
138
  else
138
139
  manifestation = FileManifestation.new
@@ -146,7 +147,7 @@ module Moab
146
147
  # @return [void] Remove a file from the inventory
147
148
  # for example, the manifest inventory does not contain a file entry for itself
148
149
  def remove_file_having_path(path)
149
- signature = self.path_hash[path]
150
+ signature = path_hash[path]
150
151
  signature_hash.delete(signature)
151
152
  end
152
153
 
@@ -161,10 +162,12 @@ module Moab
161
162
  # @param pathname [Pathname] The file path to be tested
162
163
  # @return [Boolean] Test whether the given path is contained within the {#base_directory}
163
164
  def is_descendent_of_base?(pathname)
164
- raise("base_directory has not been set") if @base_directory.nil?
165
+ raise(MoabRuntimeError, "base_directory has not been set") if @base_directory.nil?
166
+
165
167
  is_descendent = false
166
168
  pathname.expand_path.ascend { |ancestor| is_descendent ||= (ancestor == @base_directory) }
167
- raise("#{pathname} is not a descendent of #{@base_directory}") unless is_descendent
169
+ raise(MoabRuntimeError, "#{pathname} is not a descendent of #{@base_directory}") unless is_descendent
170
+
168
171
  is_descendent
169
172
  end
170
173
 
@@ -203,9 +206,9 @@ module Moab
203
206
  pathname = Pathname.new(path).expand_path
204
207
  validated ||= is_descendent_of_base?(pathname)
205
208
  pathname.children.sort.each do |child|
206
- if child.basename.to_s == ".DS_Store"
207
- next
208
- elsif child.directory?
209
+ next if child.basename.to_s == '.DS_Store'
210
+
211
+ if child.directory?
209
212
  harvest_directory(child, recursive, validated) if recursive
210
213
  else
211
214
  add_physical_file(child, validated)
@@ -224,9 +227,7 @@ module Moab
224
227
  instance = FileInstance.new.instance_from_file(pathname, @base_directory)
225
228
  if @signatures_from_bag && @signatures_from_bag[pathname]
226
229
  signature = @signatures_from_bag[pathname]
227
- unless signature.complete?
228
- signature = signature.normalized_signature(pathname)
229
- end
230
+ signature = signature.normalized_signature(pathname) unless signature.complete?
230
231
  else
231
232
  signature = FileSignature.new.signature_from_file(pathname)
232
233
  end