assembly-objectfile 1.12.0 → 2.1.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 +4 -4
- data/.circleci/config.yml +14 -0
- data/.github/pull_request_template.md +1 -1
- data/.gitignore +0 -1
- data/.rubocop.yml +117 -12
- data/.rubocop_todo.yml +3 -109
- data/Gemfile.lock +97 -0
- data/README.md +7 -7
- data/assembly-objectfile.gemspec +8 -11
- data/config/boot.rb +0 -1
- data/lib/{assembly-objectfile → assembly/object_file}/version.rb +2 -2
- data/lib/{assembly-objectfile/object_fileable.rb → assembly/object_file.rb} +109 -104
- data/lib/assembly-objectfile.rb +12 -15
- data/spec/assembly/object_file_spec.rb +451 -0
- data/spec/spec_helper.rb +2 -31
- data/spec/test_data/empty.txt +0 -0
- metadata +23 -156
- data/.travis.yml +0 -20
- data/lib/assembly-objectfile/content_metadata/config.rb +0 -26
- data/lib/assembly-objectfile/content_metadata/file.rb +0 -63
- data/lib/assembly-objectfile/content_metadata/file_set.rb +0 -73
- data/lib/assembly-objectfile/content_metadata/file_set_builder.rb +0 -65
- data/lib/assembly-objectfile/content_metadata/nokogiri_builder.rb +0 -57
- data/lib/assembly-objectfile/content_metadata.rb +0 -117
- data/lib/assembly-objectfile/object_file.rb +0 -29
- data/profiles/AdobeRGB1998.icc +0 -0
- data/profiles/DotGain20.icc +0 -0
- data/profiles/sRGBIEC6196621.icc +0 -0
- data/spec/content_metadata_spec.rb +0 -809
- data/spec/object_file_spec.rb +0 -217
- data/spec/test_data/input/oo000oo0001/00/oo000oo0001_00_001.tif +0 -0
- data/spec/test_data/input/oo000oo0001/00/oo000oo0001_00_002.tif +0 -0
- data/spec/test_data/input/oo000oo0001/05/oo000oo0001_05_001.jp2 +0 -0
- data/spec/test_data/input/oo000oo0001/05/oo000oo0001_05_002.jp2 +0 -0
- data/spec/test_data/input/oo000oo0001/15/oo000oo0001_15_001.pdf +0 -1
- data/spec/test_data/input/oo000oo0001/15/oo000oo0001_15_002.pdf +0 -1
- data/spec/test_data/input/oo000oo0001/31/oo000oo0001_31_001.pdf +0 -1
- data/spec/test_data/input/oo000oo0001/50/oo000oo0001_50_001.tif +0 -0
- data/spec/test_data/input/oo000oo0001/oo000oo0001_book.pdf +0 -1
- data/spec/test_data/input/res1_image1.jp2 +0 -0
- data/spec/test_data/input/res1_image2.jp2 +0 -0
- data/spec/test_data/input/res1_image2.tif +0 -0
- data/spec/test_data/input/res1_teifile.txt +0 -1
- data/spec/test_data/input/res2_image1.jp2 +0 -0
- data/spec/test_data/input/res2_image1.tif +0 -0
- data/spec/test_data/input/res2_image2.jp2 +0 -0
- data/spec/test_data/input/res2_image2.tif +0 -0
- data/spec/test_data/input/res2_teifile.txt +0 -1
- data/spec/test_data/input/res2_textfile.txt +0 -1
- data/spec/test_data/input/res3_image1.jp2 +0 -0
- data/spec/test_data/input/res3_image1.tif +0 -0
- data/spec/test_data/input/res3_teifile.txt +0 -1
- data/spec/test_data/input/test.pdf +0 -1
- data/spec/test_data/input/test.svg +0 -2
- data/spec/test_data/input/test2.jp2 +0 -0
- data/spec/test_data/input/test2.tif +0 -0
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: 1.
|
4
|
+
version: 2.1.0
|
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-
|
14
|
+
date: 2022-07-19 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: activesupport
|
@@ -27,48 +27,6 @@ dependencies:
|
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: 5.2.0
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: deprecation
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
requirements:
|
34
|
-
- - ">="
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version: '0'
|
37
|
-
type: :runtime
|
38
|
-
prerelease: false
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
40
|
-
requirements:
|
41
|
-
- - ">="
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '0'
|
44
|
-
- !ruby/object:Gem::Dependency
|
45
|
-
name: dry-struct
|
46
|
-
requirement: !ruby/object:Gem::Requirement
|
47
|
-
requirements:
|
48
|
-
- - "~>"
|
49
|
-
- !ruby/object:Gem::Version
|
50
|
-
version: '1.0'
|
51
|
-
type: :runtime
|
52
|
-
prerelease: false
|
53
|
-
version_requirements: !ruby/object:Gem::Requirement
|
54
|
-
requirements:
|
55
|
-
- - "~>"
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
version: '1.0'
|
58
|
-
- !ruby/object:Gem::Dependency
|
59
|
-
name: dry-types
|
60
|
-
requirement: !ruby/object:Gem::Requirement
|
61
|
-
requirements:
|
62
|
-
- - "~>"
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version: '1.1'
|
65
|
-
type: :runtime
|
66
|
-
prerelease: false
|
67
|
-
version_requirements: !ruby/object:Gem::Requirement
|
68
|
-
requirements:
|
69
|
-
- - "~>"
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
version: '1.1'
|
72
30
|
- !ruby/object:Gem::Dependency
|
73
31
|
name: mime-types
|
74
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,21 +56,7 @@ dependencies:
|
|
98
56
|
- !ruby/object:Gem::Version
|
99
57
|
version: '0'
|
100
58
|
- !ruby/object:Gem::Dependency
|
101
|
-
name:
|
102
|
-
requirement: !ruby/object:Gem::Requirement
|
103
|
-
requirements:
|
104
|
-
- - ">="
|
105
|
-
- !ruby/object:Gem::Version
|
106
|
-
version: '0'
|
107
|
-
type: :runtime
|
108
|
-
prerelease: false
|
109
|
-
version_requirements: !ruby/object:Gem::Requirement
|
110
|
-
requirements:
|
111
|
-
- - ">="
|
112
|
-
- !ruby/object:Gem::Version
|
113
|
-
version: '0'
|
114
|
-
- !ruby/object:Gem::Dependency
|
115
|
-
name: json
|
59
|
+
name: pry-byebug
|
116
60
|
requirement: !ruby/object:Gem::Requirement
|
117
61
|
requirements:
|
118
62
|
- - ">="
|
@@ -157,16 +101,16 @@ dependencies:
|
|
157
101
|
name: rubocop
|
158
102
|
requirement: !ruby/object:Gem::Requirement
|
159
103
|
requirements:
|
160
|
-
- - "
|
104
|
+
- - "~>"
|
161
105
|
- !ruby/object:Gem::Version
|
162
|
-
version: '
|
106
|
+
version: '1.25'
|
163
107
|
type: :development
|
164
108
|
prerelease: false
|
165
109
|
version_requirements: !ruby/object:Gem::Requirement
|
166
110
|
requirements:
|
167
|
-
- - "
|
111
|
+
- - "~>"
|
168
112
|
- !ruby/object:Gem::Version
|
169
|
-
version: '
|
113
|
+
version: '1.25'
|
170
114
|
- !ruby/object:Gem::Dependency
|
171
115
|
name: rubocop-rspec
|
172
116
|
requirement: !ruby/object:Gem::Requirement
|
@@ -185,16 +129,16 @@ dependencies:
|
|
185
129
|
name: simplecov
|
186
130
|
requirement: !ruby/object:Gem::Requirement
|
187
131
|
requirements:
|
188
|
-
- - "
|
132
|
+
- - ">="
|
189
133
|
- !ruby/object:Gem::Version
|
190
|
-
version: 0
|
134
|
+
version: '0'
|
191
135
|
type: :development
|
192
136
|
prerelease: false
|
193
137
|
version_requirements: !ruby/object:Gem::Requirement
|
194
138
|
requirements:
|
195
|
-
- - "
|
139
|
+
- - ">="
|
196
140
|
- !ruby/object:Gem::Version
|
197
|
-
version: 0
|
141
|
+
version: '0'
|
198
142
|
description: Get exif data, file sizes and more.
|
199
143
|
email:
|
200
144
|
- pmangiafico@stanford.edu
|
@@ -202,14 +146,15 @@ executables: []
|
|
202
146
|
extensions: []
|
203
147
|
extra_rdoc_files: []
|
204
148
|
files:
|
149
|
+
- ".circleci/config.yml"
|
205
150
|
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
206
151
|
- ".github/pull_request_template.md"
|
207
152
|
- ".gitignore"
|
208
153
|
- ".rubocop.yml"
|
209
154
|
- ".rubocop_todo.yml"
|
210
155
|
- ".rvmrc.example"
|
211
|
-
- ".travis.yml"
|
212
156
|
- Gemfile
|
157
|
+
- Gemfile.lock
|
213
158
|
- LICENSE
|
214
159
|
- README.md
|
215
160
|
- Rakefile
|
@@ -218,62 +163,27 @@ files:
|
|
218
163
|
- bin/run_all_tests
|
219
164
|
- config/boot.rb
|
220
165
|
- lib/assembly-objectfile.rb
|
221
|
-
- lib/assembly
|
222
|
-
- lib/assembly
|
223
|
-
-
|
224
|
-
- lib/assembly-objectfile/content_metadata/file_set.rb
|
225
|
-
- lib/assembly-objectfile/content_metadata/file_set_builder.rb
|
226
|
-
- lib/assembly-objectfile/content_metadata/nokogiri_builder.rb
|
227
|
-
- lib/assembly-objectfile/object_file.rb
|
228
|
-
- lib/assembly-objectfile/object_fileable.rb
|
229
|
-
- lib/assembly-objectfile/version.rb
|
230
|
-
- profiles/AdobeRGB1998.icc
|
231
|
-
- profiles/DotGain20.icc
|
232
|
-
- profiles/sRGBIEC6196621.icc
|
233
|
-
- spec/content_metadata_spec.rb
|
234
|
-
- spec/object_file_spec.rb
|
166
|
+
- lib/assembly/object_file.rb
|
167
|
+
- lib/assembly/object_file/version.rb
|
168
|
+
- spec/assembly/object_file_spec.rb
|
235
169
|
- spec/spec_helper.rb
|
170
|
+
- spec/test_data/empty.txt
|
236
171
|
- spec/test_data/input/.empty
|
237
172
|
- spec/test_data/input/file_with_no_exif.xml
|
238
|
-
- spec/test_data/input/oo000oo0001/00/oo000oo0001_00_001.tif
|
239
|
-
- spec/test_data/input/oo000oo0001/00/oo000oo0001_00_002.tif
|
240
|
-
- spec/test_data/input/oo000oo0001/05/oo000oo0001_05_001.jp2
|
241
|
-
- spec/test_data/input/oo000oo0001/05/oo000oo0001_05_002.jp2
|
242
|
-
- spec/test_data/input/oo000oo0001/15/oo000oo0001_15_001.pdf
|
243
|
-
- spec/test_data/input/oo000oo0001/15/oo000oo0001_15_002.pdf
|
244
|
-
- spec/test_data/input/oo000oo0001/31/oo000oo0001_31_001.pdf
|
245
|
-
- spec/test_data/input/oo000oo0001/50/oo000oo0001_50_001.tif
|
246
|
-
- spec/test_data/input/oo000oo0001/oo000oo0001_book.pdf
|
247
|
-
- spec/test_data/input/res1_image1.jp2
|
248
173
|
- spec/test_data/input/res1_image1.tif
|
249
|
-
- spec/test_data/input/res1_image2.jp2
|
250
|
-
- spec/test_data/input/res1_image2.tif
|
251
|
-
- spec/test_data/input/res1_teifile.txt
|
252
174
|
- spec/test_data/input/res1_textfile.txt
|
253
175
|
- spec/test_data/input/res1_transcript.pdf
|
254
|
-
- spec/test_data/input/res2_image1.jp2
|
255
|
-
- spec/test_data/input/res2_image1.tif
|
256
|
-
- spec/test_data/input/res2_image2.jp2
|
257
|
-
- spec/test_data/input/res2_image2.tif
|
258
|
-
- spec/test_data/input/res2_teifile.txt
|
259
|
-
- spec/test_data/input/res2_textfile.txt
|
260
|
-
- spec/test_data/input/res3_image1.jp2
|
261
|
-
- spec/test_data/input/res3_image1.tif
|
262
|
-
- spec/test_data/input/res3_teifile.txt
|
263
176
|
- spec/test_data/input/someobject.obj
|
264
177
|
- spec/test_data/input/someobject.ply
|
265
178
|
- spec/test_data/input/test.jp2
|
266
179
|
- spec/test_data/input/test.json
|
267
|
-
- spec/test_data/input/test.pdf
|
268
|
-
- spec/test_data/input/test.svg
|
269
180
|
- spec/test_data/input/test.tif
|
270
|
-
- spec/test_data/input/test2.jp2
|
271
|
-
- spec/test_data/input/test2.tif
|
272
181
|
- spec/test_data/input/test_no_color_profile.tif
|
273
182
|
homepage: https://github.com/sul-dlss/assembly-objectfile
|
274
183
|
licenses:
|
275
184
|
- ALv2
|
276
|
-
metadata:
|
185
|
+
metadata:
|
186
|
+
rubygems_mfa_required: 'true'
|
277
187
|
post_install_message:
|
278
188
|
rdoc_options: []
|
279
189
|
require_paths:
|
@@ -282,10 +192,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
282
192
|
requirements:
|
283
193
|
- - ">="
|
284
194
|
- !ruby/object:Gem::Version
|
285
|
-
version: '
|
286
|
-
- - "<"
|
287
|
-
- !ruby/object:Gem::Version
|
288
|
-
version: '4'
|
195
|
+
version: '3.0'
|
289
196
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
290
197
|
requirements:
|
291
198
|
- - ">="
|
@@ -295,46 +202,6 @@ requirements: []
|
|
295
202
|
rubygems_version: 3.2.32
|
296
203
|
signing_key:
|
297
204
|
specification_version: 4
|
298
|
-
summary: Ruby
|
299
|
-
|
300
|
-
test_files:
|
301
|
-
- spec/content_metadata_spec.rb
|
302
|
-
- spec/object_file_spec.rb
|
303
|
-
- spec/spec_helper.rb
|
304
|
-
- spec/test_data/input/.empty
|
305
|
-
- spec/test_data/input/file_with_no_exif.xml
|
306
|
-
- spec/test_data/input/oo000oo0001/00/oo000oo0001_00_001.tif
|
307
|
-
- spec/test_data/input/oo000oo0001/00/oo000oo0001_00_002.tif
|
308
|
-
- spec/test_data/input/oo000oo0001/05/oo000oo0001_05_001.jp2
|
309
|
-
- spec/test_data/input/oo000oo0001/05/oo000oo0001_05_002.jp2
|
310
|
-
- spec/test_data/input/oo000oo0001/15/oo000oo0001_15_001.pdf
|
311
|
-
- spec/test_data/input/oo000oo0001/15/oo000oo0001_15_002.pdf
|
312
|
-
- spec/test_data/input/oo000oo0001/31/oo000oo0001_31_001.pdf
|
313
|
-
- spec/test_data/input/oo000oo0001/50/oo000oo0001_50_001.tif
|
314
|
-
- spec/test_data/input/oo000oo0001/oo000oo0001_book.pdf
|
315
|
-
- spec/test_data/input/res1_image1.jp2
|
316
|
-
- spec/test_data/input/res1_image1.tif
|
317
|
-
- spec/test_data/input/res1_image2.jp2
|
318
|
-
- spec/test_data/input/res1_image2.tif
|
319
|
-
- spec/test_data/input/res1_teifile.txt
|
320
|
-
- spec/test_data/input/res1_textfile.txt
|
321
|
-
- spec/test_data/input/res1_transcript.pdf
|
322
|
-
- spec/test_data/input/res2_image1.jp2
|
323
|
-
- spec/test_data/input/res2_image1.tif
|
324
|
-
- spec/test_data/input/res2_image2.jp2
|
325
|
-
- spec/test_data/input/res2_image2.tif
|
326
|
-
- spec/test_data/input/res2_teifile.txt
|
327
|
-
- spec/test_data/input/res2_textfile.txt
|
328
|
-
- spec/test_data/input/res3_image1.jp2
|
329
|
-
- spec/test_data/input/res3_image1.tif
|
330
|
-
- spec/test_data/input/res3_teifile.txt
|
331
|
-
- spec/test_data/input/someobject.obj
|
332
|
-
- spec/test_data/input/someobject.ply
|
333
|
-
- spec/test_data/input/test.jp2
|
334
|
-
- spec/test_data/input/test.json
|
335
|
-
- spec/test_data/input/test.pdf
|
336
|
-
- spec/test_data/input/test.svg
|
337
|
-
- spec/test_data/input/test.tif
|
338
|
-
- spec/test_data/input/test2.jp2
|
339
|
-
- spec/test_data/input/test2.tif
|
340
|
-
- spec/test_data/input/test_no_color_profile.tif
|
205
|
+
summary: Ruby implementation of file services needed to prepare objects to be accessioned
|
206
|
+
into the Stanford Digital Repository
|
207
|
+
test_files: []
|
data/.travis.yml
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
rvm:
|
3
|
-
- 2.5.7
|
4
|
-
- 2.6.5
|
5
|
-
addons:
|
6
|
-
apt:
|
7
|
-
packages:
|
8
|
-
- libimage-exiftool-perl
|
9
|
-
before_script:
|
10
|
-
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
11
|
-
- chmod +x ./cc-test-reporter
|
12
|
-
- ./cc-test-reporter before-build
|
13
|
-
script:
|
14
|
-
- bundle exec rubocop
|
15
|
-
- bundle exec rake
|
16
|
-
after_script:
|
17
|
-
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
|
18
|
-
|
19
|
-
notifications:
|
20
|
-
email: false
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'dry-struct'
|
4
|
-
require 'dry-types'
|
5
|
-
|
6
|
-
module Assembly
|
7
|
-
class ContentMetadata
|
8
|
-
# Types for the configuration
|
9
|
-
module Types
|
10
|
-
include Dry.Types()
|
11
|
-
end
|
12
|
-
|
13
|
-
# Represents a configuration for generating the content metadata
|
14
|
-
class Config < Dry::Struct
|
15
|
-
STYLES = %w[image file book map 3d document webarchive-seed].freeze
|
16
|
-
READING_ORDERS = %w[ltr rtl].freeze
|
17
|
-
attribute :auto_labels, Types::Strict::Bool.default(true)
|
18
|
-
attribute :flatten_folder_structure, Types::Strict::Bool.default(false)
|
19
|
-
attribute :add_file_attributes, Types::Strict::Bool.default(false)
|
20
|
-
attribute :add_exif, Types::Strict::Bool.default(false)
|
21
|
-
attribute :file_attributes, Types::Strict::Hash.default({}.freeze)
|
22
|
-
attribute :type, Types::Strict::String.enum(*STYLES)
|
23
|
-
attribute :reading_order, Types::Strict::String.default('ltr').enum(*READING_ORDERS)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'active_support/core_ext/module/delegation'
|
4
|
-
|
5
|
-
module Assembly
|
6
|
-
class ContentMetadata
|
7
|
-
# Represents a single File
|
8
|
-
class File
|
9
|
-
# default publish/preserve/shelve attributes used in content metadata
|
10
|
-
# if no mimetype specific attributes are specified for a given file, define some defaults, and override for specific mimetypes below
|
11
|
-
ATTRIBUTES_FOR_TYPE = {
|
12
|
-
'default' => { preserve: 'yes', shelve: 'no', publish: 'no' },
|
13
|
-
'image/tif' => { preserve: 'yes', shelve: 'no', publish: 'no' },
|
14
|
-
'image/tiff' => { preserve: 'yes', shelve: 'no', publish: 'no' },
|
15
|
-
'image/jp2' => { preserve: 'no', shelve: 'yes', publish: 'yes' },
|
16
|
-
'image/jpeg' => { preserve: 'yes', shelve: 'no', publish: 'no' },
|
17
|
-
'audio/wav' => { preserve: 'yes', shelve: 'no', publish: 'no' },
|
18
|
-
'audio/x-wav' => { preserve: 'yes', shelve: 'no', publish: 'no' },
|
19
|
-
'audio/mp3' => { preserve: 'no', shelve: 'yes', publish: 'yes' },
|
20
|
-
'audio/mpeg' => { preserve: 'no', shelve: 'yes', publish: 'yes' },
|
21
|
-
'application/pdf' => { preserve: 'yes', shelve: 'yes', publish: 'yes' },
|
22
|
-
'plain/text' => { preserve: 'yes', shelve: 'yes', publish: 'yes' },
|
23
|
-
'text/plain' => { preserve: 'yes', shelve: 'yes', publish: 'yes' },
|
24
|
-
'image/png' => { preserve: 'yes', shelve: 'yes', publish: 'no' },
|
25
|
-
'application/zip' => { preserve: 'yes', shelve: 'no', publish: 'no' },
|
26
|
-
'application/json' => { preserve: 'yes', shelve: 'yes', publish: 'yes' }
|
27
|
-
}.freeze
|
28
|
-
|
29
|
-
# @param [Symbol] bundle
|
30
|
-
# @param [Assembly::ObjectFile] file
|
31
|
-
# @param style
|
32
|
-
def initialize(file:, bundle: nil, style: nil)
|
33
|
-
@bundle = bundle
|
34
|
-
@file = file
|
35
|
-
@style = style
|
36
|
-
end
|
37
|
-
|
38
|
-
delegate :sha1, :md5, :provider_md5, :provider_sha1, :mimetype, :filesize, :image?, :valid_image?, to: :file
|
39
|
-
|
40
|
-
def file_id(common_path:, flatten_folder_structure:)
|
41
|
-
# set file id attribute, first check the relative_path parameter on the object, and if it is set, just use that
|
42
|
-
return file.relative_path if file.relative_path
|
43
|
-
|
44
|
-
# if the relative_path attribute is not set, then use the path attribute and check to see if we need to remove the common part of the path
|
45
|
-
file_id = common_path ? file.path.gsub(common_path, '') : file.path
|
46
|
-
file_id = ::File.basename(file_id) if flatten_folder_structure
|
47
|
-
file_id
|
48
|
-
end
|
49
|
-
|
50
|
-
def file_attributes(provided_file_attributes)
|
51
|
-
file.file_attributes || provided_file_attributes[mimetype] || provided_file_attributes['default'] || ATTRIBUTES_FOR_TYPE[mimetype] || ATTRIBUTES_FOR_TYPE['default']
|
52
|
-
end
|
53
|
-
|
54
|
-
def image_data
|
55
|
-
{ height: file.exif.imageheight, width: file.exif.imagewidth }
|
56
|
-
end
|
57
|
-
|
58
|
-
private
|
59
|
-
|
60
|
-
attr_reader :file
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'active_support/core_ext/object/blank'
|
4
|
-
|
5
|
-
module Assembly
|
6
|
-
class ContentMetadata
|
7
|
-
# Represents a groups of related Files, such as a single master file and the derivatives
|
8
|
-
class FileSet
|
9
|
-
# @param [Boolean] dpg (false) is it a dpg bundle?
|
10
|
-
# @param [Array<Assembly::ObjectFile>] resource_files
|
11
|
-
# @param style
|
12
|
-
def initialize(resource_files:, style:, dpg: false)
|
13
|
-
@dpg = dpg
|
14
|
-
@resource_files = resource_files
|
15
|
-
@style = style
|
16
|
-
end
|
17
|
-
|
18
|
-
# objects in the special DPG folders are always type=object when we using :bundle=>:dpg
|
19
|
-
# otherwise look at the style to determine the resource_type_description
|
20
|
-
def resource_type_description
|
21
|
-
@resource_type_description ||= special_dpg_resource? ? 'object' : resource_type_descriptions
|
22
|
-
end
|
23
|
-
|
24
|
-
def label_from_file(default:)
|
25
|
-
resource_files.find { |obj| obj.label.present? }&.label || default
|
26
|
-
end
|
27
|
-
|
28
|
-
def files
|
29
|
-
resource_files.map { |file| File.new(file: file) }
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
attr_reader :dpg, :resource_files, :style
|
35
|
-
|
36
|
-
def special_dpg_resource?
|
37
|
-
return false unless dpg
|
38
|
-
|
39
|
-
resource_files.collect { |obj| ContentMetadata.special_dpg_folder?(obj.dpg_folder) }.include?(true)
|
40
|
-
end
|
41
|
-
|
42
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
43
|
-
def resource_type_descriptions
|
44
|
-
# grab all of the file types within a resource into an array so we can decide what the resource type should be
|
45
|
-
resource_file_types = resource_files.collect(&:object_type)
|
46
|
-
resource_has_non_images = !(resource_file_types - [:image]).empty?
|
47
|
-
|
48
|
-
case style
|
49
|
-
when :simple_image, :map, :'webarchive-seed'
|
50
|
-
'image'
|
51
|
-
when :file
|
52
|
-
'file'
|
53
|
-
when :simple_book # in a simple book project, all resources are pages unless they are *all* non-images -- if so, switch the type to object
|
54
|
-
resource_has_non_images && resource_file_types.include?(:image) == false ? 'object' : 'page'
|
55
|
-
when :book_as_image # same as simple book, but all resources are images instead of pages, unless we need to switch them to object type
|
56
|
-
resource_has_non_images && resource_file_types.include?(:image) == false ? 'object' : 'image'
|
57
|
-
when :book_with_pdf # in book with PDF type, if we find a resource with *any* non images, switch it's type from book to object
|
58
|
-
resource_has_non_images ? 'object' : 'page'
|
59
|
-
when :document
|
60
|
-
'document'
|
61
|
-
when :'3d'
|
62
|
-
resource_extensions = resource_files.collect(&:ext)
|
63
|
-
if (resource_extensions & VALID_THREE_DIMENSION_EXTENTIONS).empty? # if this resource contains no known 3D file extensions, the resource type is file
|
64
|
-
'file'
|
65
|
-
else # otherwise the resource type is 3d
|
66
|
-
'3d'
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Assembly
|
4
|
-
class ContentMetadata
|
5
|
-
# Builds a groups of related Files, based on bundle
|
6
|
-
class FileSetBuilder
|
7
|
-
# @param [Symbol] bundle one of: :default, :filename, :dpg or :prebundled
|
8
|
-
# @param [Array<Assembly::ObjectFile>] objects
|
9
|
-
# @param [Symbol] style one of: :simple_image, :file, :simple_book, :book_as_image, :book_with_pdf, :map, or :'3d'
|
10
|
-
def self.build(bundle:, objects:, style:)
|
11
|
-
new(bundle: bundle, objects: objects, style: style).build
|
12
|
-
end
|
13
|
-
|
14
|
-
def initialize(bundle:, objects:, style:)
|
15
|
-
@bundle = bundle
|
16
|
-
@objects = objects
|
17
|
-
@style = style
|
18
|
-
end
|
19
|
-
|
20
|
-
# @return [Array<FileSet>] a list of filesets in the object
|
21
|
-
def build
|
22
|
-
case bundle
|
23
|
-
when :default # one resource per object
|
24
|
-
objects.collect { |obj| FileSet.new(resource_files: [obj], style: style) }
|
25
|
-
when :filename # one resource per distinct filename (excluding extension)
|
26
|
-
build_for_filename
|
27
|
-
when :dpg # group by DPG filename
|
28
|
-
build_for_dpg
|
29
|
-
when :prebundled
|
30
|
-
# if the user specifies this method, they will pass in an array of arrays, indicating resources, so we don't need to bundle in the gem
|
31
|
-
# This is used by the assemblyWF if you have stubContentMetadata.xml
|
32
|
-
objects.map { |inner| FileSet.new(resource_files: inner, style: style) }
|
33
|
-
else
|
34
|
-
raise 'Invalid bundle method'
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
attr_reader :bundle, :objects, :style
|
41
|
-
|
42
|
-
def build_for_filename
|
43
|
-
# loop over distinct filenames, this determines how many resources we will have and
|
44
|
-
# create one resource node per distinct filename, collecting the relevant objects with the distinct filename into that resource
|
45
|
-
distinct_filenames = objects.collect(&:filename_without_ext).uniq # find all the unique filenames in the set of objects, leaving off extensions and base paths
|
46
|
-
distinct_filenames.map do |distinct_filename|
|
47
|
-
FileSet.new(resource_files: objects.collect { |obj| obj if obj.filename_without_ext == distinct_filename }.compact,
|
48
|
-
style: style)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def build_for_dpg
|
53
|
-
# loop over distinct dpg base names, this determines how many resources we will have and
|
54
|
-
# create one resource node per distinct dpg base name, collecting the relevant objects with the distinct names into that resource
|
55
|
-
|
56
|
-
distinct_filenames = objects.collect(&:dpg_basename).uniq # find all the unique DPG filenames in the set of objects
|
57
|
-
resources = distinct_filenames.map do |distinct_filename|
|
58
|
-
FileSet.new(dpg: true, resource_files: objects.collect { |obj| obj if obj.dpg_basename == distinct_filename && !ContentMetadata.special_dpg_folder?(obj.dpg_folder) }.compact, style: style)
|
59
|
-
end
|
60
|
-
objects.each { |obj| resources << FileSet.new(dpg: true, resource_files: [obj], style: style) if ContentMetadata.special_dpg_folder?(obj.dpg_folder) } # certain subfolders require individual resources for files within them regardless of file-naming convention
|
61
|
-
resources
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
@@ -1,57 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Assembly
|
4
|
-
class ContentMetadata
|
5
|
-
# Builds a nokogiri representation of the content metadata
|
6
|
-
class NokogiriBuilder
|
7
|
-
# @param [Array<Fileset>] filesets
|
8
|
-
# @param [String] druid
|
9
|
-
# @param [String] common_path
|
10
|
-
# @param [Config] config
|
11
|
-
def self.build(filesets:, druid:, common_path:, config:)
|
12
|
-
# a counter to use when creating auto-labels for resources, with incremenets for each type
|
13
|
-
resource_type_counters = Hash.new(0)
|
14
|
-
pid = druid.gsub('druid:', '') # remove druid prefix when creating IDs
|
15
|
-
|
16
|
-
Nokogiri::XML::Builder.new do |xml|
|
17
|
-
xml.contentMetadata(objectId: druid.to_s, type: config.type) do
|
18
|
-
xml.bookData(readingOrder: config.reading_order) if config.type == 'book'
|
19
|
-
|
20
|
-
filesets.each_with_index do |fileset, index| # iterate over all the resources
|
21
|
-
# start a new resource element
|
22
|
-
sequence = index + 1
|
23
|
-
|
24
|
-
resource_type_counters[fileset.resource_type_description] += 1 # each resource type description gets its own incrementing counter
|
25
|
-
|
26
|
-
xml.resource(id: "#{pid}_#{sequence}", sequence: sequence, type: fileset.resource_type_description) do
|
27
|
-
# create a generic resource label if needed
|
28
|
-
default_label = config.auto_labels ? "#{fileset.resource_type_description.capitalize} #{resource_type_counters[fileset.resource_type_description]}" : ''
|
29
|
-
|
30
|
-
# but if one of the files has a label, use it instead
|
31
|
-
resource_label = fileset.label_from_file(default: default_label)
|
32
|
-
|
33
|
-
xml.label(resource_label) unless resource_label.empty?
|
34
|
-
fileset.files.each do |cm_file| # iterate over all the files in a resource
|
35
|
-
xml_file_params = { id: cm_file.file_id(common_path: common_path, flatten_folder_structure: config.flatten_folder_structure) }
|
36
|
-
xml_file_params.merge!(cm_file.file_attributes(config.file_attributes)) if config.add_file_attributes
|
37
|
-
xml_file_params.merge!(mimetype: cm_file.mimetype, size: cm_file.filesize) if config.add_exif
|
38
|
-
|
39
|
-
xml.file(xml_file_params) do
|
40
|
-
if config.add_exif # add exif info if the user requested it
|
41
|
-
xml.checksum(cm_file.sha1, type: 'sha1')
|
42
|
-
xml.checksum(cm_file.md5, type: 'md5')
|
43
|
-
xml.imageData(cm_file.image_data) if cm_file.valid_image? # add image data for an image
|
44
|
-
elsif cm_file.provider_md5 || cm_file.provider_sha1 # if we did not add exif info, see if there are user supplied checksums to add
|
45
|
-
xml.checksum(cm_file.provider_sha1, type: 'sha1') if cm_file.provider_sha1
|
46
|
-
xml.checksum(cm_file.provider_md5, type: 'md5') if cm_file.provider_md5
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|