assembly-objectfile 2.1.1 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 76dac08191a4c118cf16e4736b9538c9d2a60811cf9547e0ad395ab468b1b51a
4
- data.tar.gz: b9fec1e99d03941f658cd6716e1c00db37ce2f2042816e4ba8f77246b102d1f4
3
+ metadata.gz: '0931aac97a88ba77ac0cfa8ff018d19fddcfe909c81cd82e9dfc13dca12ed4f4'
4
+ data.tar.gz: 4eb596c2799586b3298cd1019be16606b4a371a175c4630b1ac826296dacb5bb
5
5
  SHA512:
6
- metadata.gz: '082fc021ca4f4dde1f3eaaac937e66862d8ea36f5198bdece9866a72e5be068021665e10bd40b8ea2835d848c062886982ed41033935120525c8d4e57efadafd'
7
- data.tar.gz: cf2e4facd4248532c5f92c741f80b5e8d27e04b8cc23e3b7959b59118cceaf8122d03aa92af8faf99c8000bb4298b74d9ab86001744c6f852cd148ceda21d675
6
+ metadata.gz: a252cfc25b6e2a11f50a6eb2976997fdcbf387ba3855fbca03d188a2f7e9572ca1a3ed605da191700551e34a685deb9dec810e63dfbff59bf9bfd09f6a6a9504
7
+ data.tar.gz: db0fdbf6583455bce118aa14bc29692d90fbb35c1e9746f3748548094ff53e0f33fe79c08cf5baace3869a08e4f9e3080d1906b810ce38d64022efa573e8c500
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- assembly-objectfile (2.1.1)
4
+ assembly-objectfile (2.1.2)
5
5
  activesupport (>= 5.2.0)
6
6
  mime-types (> 3)
7
7
  mini_exiftool
@@ -28,9 +28,9 @@ GEM
28
28
  mime-types-data (~> 3.2015)
29
29
  mime-types-data (3.2022.0105)
30
30
  mini_exiftool (2.10.2)
31
- minitest (5.16.2)
31
+ minitest (5.16.3)
32
32
  parallel (1.22.1)
33
- parser (3.1.2.0)
33
+ parser (3.1.2.1)
34
34
  ast (~> 2.4.1)
35
35
  pry (0.13.1)
36
36
  coderay (~> 1.1)
@@ -55,17 +55,17 @@ GEM
55
55
  diff-lcs (>= 1.2.0, < 2.0)
56
56
  rspec-support (~> 3.11.0)
57
57
  rspec-support (3.11.0)
58
- rubocop (1.31.2)
58
+ rubocop (1.35.0)
59
59
  json (~> 2.3)
60
60
  parallel (~> 1.10)
61
- parser (>= 3.1.0.0)
61
+ parser (>= 3.1.2.1)
62
62
  rainbow (>= 2.2.2, < 4.0)
63
63
  regexp_parser (>= 1.8, < 3.0)
64
64
  rexml (>= 3.2.5, < 4.0)
65
- rubocop-ast (>= 1.18.0, < 2.0)
65
+ rubocop-ast (>= 1.20.1, < 2.0)
66
66
  ruby-progressbar (~> 1.7)
67
67
  unicode-display_width (>= 1.4.0, < 3.0)
68
- rubocop-ast (1.19.1)
68
+ rubocop-ast (1.21.0)
69
69
  parser (>= 3.1.1.0)
70
70
  rubocop-rspec (2.12.1)
71
71
  rubocop (~> 1.31)
@@ -4,6 +4,6 @@
4
4
  module Assembly
5
5
  class ObjectFile
6
6
  # Gem version
7
- VERSION = '2.1.1'
7
+ VERSION = '2.1.2'
8
8
  end
9
9
  end
@@ -7,11 +7,8 @@ require 'active_support/core_ext/object/blank'
7
7
  module Assembly
8
8
  # This class contains generic methods to operate on any file.
9
9
  class ObjectFile
10
- # Class level method that given an array of strings, return the longest common initial path.
11
- # Useful for removing a common path from a set of filenames when producing content metadata
12
- #
13
- # @param [Array] strings Array of filenames with paths to operate on
14
- # @return [String] longest common initial part of path of filenames passed in
10
+ # @param [Array] strings Array of filenames with paths
11
+ # @return [String] longest common initial path of filenames passed in
15
12
  #
16
13
  # Example:
17
14
  # puts Assembly::ObjectFile.common_prefix(['/Users/peter/00/test.tif','/Users/peter/05/test.jp2'])
@@ -52,8 +49,6 @@ module Assembly
52
49
  # :file (from unix file system command)
53
50
  # the default is defined in the private `default_mime_type_order` method
54
51
  # but you can override to set your own order
55
- # @example
56
- # Assembly::ObjectFile.new('/input/path_to_file.tif')
57
52
  def initialize(path, params = {})
58
53
  @path = path
59
54
  @label = params[:label]
@@ -64,71 +59,41 @@ module Assembly
64
59
  @mime_type_order = params[:mime_type_order] || default_mime_type_order
65
60
  end
66
61
 
67
- # @return [String] base filename
68
- # @example
69
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
70
- # puts source_file.filename # "path_to_file.tif"
71
62
  def filename
72
63
  File.basename(path)
73
64
  end
74
65
 
75
- # @return [String] base directory
76
- # @example
77
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
78
- # puts source_file.dirname # "/input"
79
66
  def dirname
80
67
  File.dirname(path)
81
68
  end
82
69
 
83
- # @return [String] filename extension
84
- # @example
85
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
86
- # puts source_file.ext # ".tif"
87
70
  def ext
88
71
  File.extname(path)
89
72
  end
90
73
 
91
- # @return [String] base filename without extension
92
- # @example
93
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
94
- # puts source_file.filename # "path_to_file"
95
74
  def filename_without_ext
96
75
  File.basename(path, ext)
97
76
  end
98
77
 
99
- # @return [MiniExiftool] exif information stored as a hash and an object
100
- # @example
101
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
102
- # puts source_file.exif # hash with exif information
78
+ # @return [MiniExiftool] exif mini_exiftool gem object wrapper for exiftool
103
79
  def exif
104
80
  @exif ||= begin
105
81
  check_for_file
106
82
  MiniExiftool.new(path, replace_invalid_chars: '?')
107
83
  rescue MiniExiftool::Error
108
- # MiniExiftool will throw an exception when it tries to initialize for problematic files,
109
- # but the exception it throws does not tell you the file that caused the problem.
110
- # Instead, we will raise our own exception with more context in logging/reporting upstream.
111
- # Note: if the file that causes the problem should NOT use exiftool to determine mimetype, add it to the skipped
112
- # mimetypes in Assembly::TRUSTED_MIMETYPES to bypass initialization of MiniExiftool for mimetype generation
113
- raise MiniExiftool::Error, "error initializing MiniExiftool for #{path}"
84
+ # MiniExiftool may raise an error on files it doesn't know how to handle (disk images for example)
85
+ # but we don't want this to prevent an ObjectFile from being created, so just swallow it.
86
+ nil
114
87
  end
115
88
  end
116
89
 
117
- # Computes md5 checksum or returns cached value
118
- # @return [String] md5 checksum
119
- # @example
120
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
121
- # puts source_file.md5 # 'XXX123XXX1243XX1243'
90
+ # @return [String] computed md5 checksum
122
91
  def md5
123
92
  check_for_file unless @md5
124
93
  @md5 ||= Digest::MD5.file(path).hexdigest
125
94
  end
126
95
 
127
- # Computes sha1 checksum or return cached value
128
- # @return [String] sha1 checksum
129
- # @example
130
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
131
- # puts source_file.sha1 # 'XXX123XXX1243XX1243'
96
+ # @return [String] computed sha1 checksum
132
97
  def sha1
133
98
  check_for_file unless @sha1
134
99
  @sha1 ||= Digest::SHA1.file(path).hexdigest
@@ -136,10 +101,7 @@ module Assembly
136
101
 
137
102
  # Returns mimetype information for the current file based on the ordering set in default_mime_type_order
138
103
  # We stop computing mimetypes as soon as we have a method that returns a value
139
- # @return [String] mime type
140
- # @example
141
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.txt')
142
- # puts source_file.mimetype # 'text/plain'
104
+ # @return [String] mimetype of the file
143
105
  def mimetype
144
106
  @mimetype ||= begin
145
107
  check_for_file
@@ -154,84 +116,55 @@ module Assembly
154
116
 
155
117
  # @return [Symbol] the type of object, could be :application (for PDF or Word, etc),
156
118
  # :audio, :image, :message, :model, :multipart, :text or :video
157
- # @example
158
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
159
- # puts source_file.object_type # :image
160
119
  def object_type
161
120
  lookup = MIME::Types[mimetype][0]
162
121
  lookup.nil? ? :other : lookup.media_type.to_sym
163
122
  end
164
123
 
165
- # @return [Boolean] if object is an image
166
- # @example
167
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
168
- # puts source_file.image? # true
124
+ # @return [Boolean] true if the mime-types gem recognizes it as an image (from file extension lookup)
169
125
  def image?
170
126
  object_type == :image
171
127
  end
172
128
 
173
- # Examines the input image for validity. Used to determine if image is a valid and useful image.
174
- # If image is not a jp2, also checks if it is jp2able?
175
- # @return [Boolean] true if image is valid, false if not.
176
- # @example
177
- # source_img = Assembly::ObjectFile.new('/input/path_to_file.tif')
178
- # puts source_img.valid_image? # true
129
+ # @return [Boolean] true if the mime-types gem recognizes it as an image (from file extension lookup)
130
+ # AND it is a jp2 or jp2able?
179
131
  def valid_image?
180
132
  return false unless image?
181
133
 
182
134
  mimetype == 'image/jp2' || jp2able?
183
135
  end
184
136
 
185
- # Examines the input image for validity to create a jp2. Same as valid_image? but also confirms
186
- # the existence of a profile description and further restricts mimetypes.
187
- # It is used by the assembly robots to decide if a jp2 will be created and is also called before
188
- # you create a jp2 using assembly-image.
189
- # @return [Boolean] true if image should have a jp2 created, false if not.
190
- # @example
191
- # source_img = Assembly::ObjectFile.new('/input/path_to_file.tif')
192
- # puts source_img.jp2able? # true
137
+ # @return [Boolean] true if we can create a jp2 from the file
193
138
  def jp2able?
194
139
  return false unless exif
195
140
 
196
141
  Assembly::VALID_IMAGE_MIMETYPES.include?(mimetype)
197
142
  end
198
143
 
199
- # Returns file size information for the current file in bytes.
200
144
  # @return [Integer] file size in bytes
201
- # @example
202
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
203
- # puts source_file.filesize # 1345
204
145
  def filesize
205
146
  check_for_file
206
147
  @filesize ||= File.size(path)
207
148
  end
208
149
 
209
- # Determines if the file exists (and is not a directory)
210
- # @return [Boolean] file exists
211
- # @example
212
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
213
- # puts source_file.file_exists? # true
150
+ # @return [Boolean] file exists and is not a directory
214
151
  def file_exists?
215
152
  @file_exists ||= (File.exist?(path) && !File.directory?(path))
216
153
  end
217
154
 
218
155
  private
219
156
 
220
- # private method to check for file existence before operating on it
157
+ # check for file existence before operating on it
221
158
  def check_for_file
222
159
  raise "input file #{path} does not exist or is a directory" unless file_exists?
223
160
  end
224
161
 
225
- # prive method defining default preferred ordering of how mimetypes are determined
162
+ # defines default preferred ordering of how mimetypes are determined
226
163
  def default_mime_type_order
227
164
  %i[override exif file extension]
228
165
  end
229
166
 
230
- # Returns mimetype information using the mime-types gem (based on a file extension lookup)
231
- # @return [String] mime type for supplied file
232
- # @example
233
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.txt')
234
- # puts source_file.extension_mimetype # 'text/plain'
167
+ # @return [String] mime type for supplied file using the mime-types gem (based on a file extension lookup)
235
168
  def extension_mimetype
236
169
  @extension_mimetype ||= begin
237
170
  mtype = MIME::Types.type_for(path).first
@@ -239,11 +172,7 @@ module Assembly
239
172
  end
240
173
  end
241
174
 
242
- # Returns mimetype information for the current file based on unix file system command.
243
- # @return [String] mime type for supplied file
244
- # @example
245
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.txt')
246
- # puts source_file.file_mimetype # 'text/plain'
175
+ # @return [String] mime type for supplied file based on unix file system command
247
176
  def file_mimetype
248
177
  @file_mimetype ||= begin
249
178
  check_for_file
@@ -251,12 +180,9 @@ module Assembly
251
180
  end
252
181
  end
253
182
 
254
- # Returns mimetype information for the current file based on exif data
255
- # (if available and not a trusted source that we'd rather get from the file system command)
256
- # @return [String] mime type for supplied file
257
- # @example
258
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.txt')
259
- # puts source_file.exif_mimetype # 'text/plain'
183
+ # @return [String] mimetype information for the current file based on exif data,
184
+ # unless mimetype is configured as one we'd rather get from the file system command
185
+ # (e.g. exif struggles or we get better info from file system command)
260
186
  def exif_mimetype
261
187
  @exif_mimetype ||= begin
262
188
  check_for_file
@@ -268,23 +194,8 @@ module Assembly
268
194
 
269
195
  # Returns mimetype information using the manual override mapping (based on a file extension lookup)
270
196
  # @return [String] mime type for supplied file if a mapping exists for the file's extension
271
- # @example
272
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.json')
273
- # puts source_file.override_mimetype # 'application/json'
274
197
  def override_mimetype
275
198
  @override_mimetype ||= Assembly::OVERRIDE_MIMETYPES.fetch(ext.to_sym, '')
276
199
  end
277
-
278
- # @note Uses shell call to "file", only expected to work on unix based systems
279
- # @return [String] encoding for supplied file
280
- # @example
281
- # source_file = Assembly::ObjectFile.new('/input/path_to_file.txt')
282
- # puts source_file.encoding # 'us-ascii'
283
- def encoding
284
- @encoding ||= begin
285
- check_for_file
286
- `file --mime-encoding "#{path}"`.delete("\n").split(':')[1].strip
287
- end
288
- end
289
200
  end
290
201
  end
@@ -387,33 +387,17 @@ describe Assembly::ObjectFile do
387
387
  end
388
388
  end
389
389
 
390
- describe '#encoding' do
391
- context 'with .tif file' do
392
- it 'binary' do
393
- object_file = described_class.new(TEST_TIF_INPUT_FILE)
394
- expect(object_file.send(:encoding)).to eq('binary')
395
- end
396
- end
390
+ describe '#exif' do
391
+ subject(:exif) { object_file.exif }
397
392
 
398
- context 'with .txt file' do
399
- it 'binary' do
400
- object_file = described_class.new(TEST_RES1_TEXT)
401
- expect(object_file.send(:encoding)).to eq('us-ascii')
402
- end
403
- end
404
- end
393
+ let(:object_file) { described_class.new(TEST_TIF_INPUT_FILE) }
405
394
 
406
- describe '#exif' do
407
- it 'returns MiniExiftool object' do
408
- object_file = described_class.new(TEST_TIF_INPUT_FILE)
409
- expect(object_file.exif).not_to be_nil
410
- expect(object_file.exif.class).to eq MiniExiftool
411
- end
395
+ it { is_expected.to be_kind_of MiniExiftool }
396
+
397
+ context 'when exiftool raises an error initializing the file' do
398
+ let(:object_file) { described_class.new('spec/test_data/empty.txt') }
412
399
 
413
- it 'raises MiniExiftool::Error with file path if exiftool raises one' do
414
- object_file = described_class.new('spec/test_data/empty.txt')
415
- expect { object_file.exif }.to raise_error(MiniExiftool::Error,
416
- "error initializing MiniExiftool for #{object_file.path}")
400
+ it { is_expected.to be_nil }
417
401
  end
418
402
  end
419
403
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: assembly-objectfile
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 2.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Mangiafico
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: exe
13
13
  cert_chain: []
14
- date: 2022-07-20 00:00:00.000000000 Z
14
+ date: 2022-08-18 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activesupport
@@ -199,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
199
199
  - !ruby/object:Gem::Version
200
200
  version: '0'
201
201
  requirements: []
202
- rubygems_version: 3.2.32
202
+ rubygems_version: 3.3.7
203
203
  signing_key:
204
204
  specification_version: 4
205
205
  summary: Ruby implementation of file services needed to prepare objects to be accessioned