assembly-objectfile 1.13.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/.rubocop.yml +1 -1
- data/.rubocop_todo.yml +14 -80
- data/Gemfile.lock +106 -0
- data/assembly-objectfile.gemspec +1 -3
- data/lib/assembly-objectfile/object_file.rb +253 -3
- data/lib/assembly-objectfile/version.rb +1 -1
- data/lib/assembly-objectfile.rb +0 -5
- data/spec/object_file_spec.rb +411 -172
- data/spec/spec_helper.rb +2 -31
- metadata +19 -107
- 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_fileable.rb +0 -275
- data/spec/content_metadata_spec.rb +0 -809
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3c456d372ab0804ebcaad06ac2b8695376f9ffe57ccb8a23b8a57d711df5561
|
4
|
+
data.tar.gz: 1797606727f148ee128dedc102ad68480fbd9f55983c318b91c8f5f52a546a9b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c927cb2cffef41a699c0f2e1f0fa0d8e6d4b1cc92c9fdb26b80ca5c9e851d7de0a9b1204cc4a4290213a9d7a642c2d3233db56396efb3b626cdd4d6e7b3bfdda
|
7
|
+
data.tar.gz: 473f2ead345feaf0afd518da399751a86f526f27b19dd0bfd75fb55354bd055d00ccbbb06a96ca905f2e0de6fcdbf25d4e42e8da23fc167225afb8a9958038e3
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/.rubocop_todo.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2022-
|
3
|
+
# on 2022-07-07 21:26:21 UTC using RuboCop version 1.31.0.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
@@ -11,41 +11,10 @@ Lint/UselessAssignment:
|
|
11
11
|
Exclude:
|
12
12
|
- 'config/boot.rb'
|
13
13
|
|
14
|
-
# Offense count: 3
|
15
|
-
# Configuration parameters: IgnoredMethods, CountRepeatedAttributes.
|
16
|
-
Metrics/AbcSize:
|
17
|
-
Max: 55
|
18
|
-
|
19
|
-
# Offense count: 1
|
20
|
-
# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
|
21
|
-
# IgnoredMethods: refine
|
22
|
-
Metrics/BlockLength:
|
23
|
-
Max: 27
|
24
|
-
|
25
|
-
# Offense count: 2
|
26
|
-
# Configuration parameters: IgnoredMethods.
|
27
|
-
Metrics/CyclomaticComplexity:
|
28
|
-
Max: 14
|
29
|
-
|
30
|
-
# Offense count: 4
|
31
|
-
# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
|
32
|
-
Metrics/MethodLength:
|
33
|
-
Max: 31
|
34
|
-
|
35
14
|
# Offense count: 1
|
36
15
|
# Configuration parameters: CountComments, CountAsOne.
|
37
|
-
Metrics/
|
38
|
-
Max:
|
39
|
-
|
40
|
-
# Offense count: 1
|
41
|
-
# Configuration parameters: CountKeywordArgs, MaxOptionalParameters.
|
42
|
-
Metrics/ParameterLists:
|
43
|
-
Max: 12
|
44
|
-
|
45
|
-
# Offense count: 2
|
46
|
-
# Configuration parameters: IgnoredMethods.
|
47
|
-
Metrics/PerceivedComplexity:
|
48
|
-
Max: 15
|
16
|
+
Metrics/ClassLength:
|
17
|
+
Max: 122
|
49
18
|
|
50
19
|
# Offense count: 1
|
51
20
|
# Configuration parameters: ExpectMatchingDefinition, CheckDefinitionPathHierarchy, CheckDefinitionPathHierarchyRoots, Regex, IgnoreExecutableScripts, AllowedAcronyms.
|
@@ -64,66 +33,31 @@ Naming/FileName:
|
|
64
33
|
Naming/PredicateName:
|
65
34
|
Exclude:
|
66
35
|
- 'spec/**/*'
|
67
|
-
- 'lib/assembly-objectfile/
|
68
|
-
|
69
|
-
# Offense count: 1
|
70
|
-
# Configuration parameters: Prefixes.
|
71
|
-
# Prefixes: when, with, without
|
72
|
-
RSpec/ContextWording:
|
73
|
-
Exclude:
|
74
|
-
- 'spec/content_metadata_spec.rb'
|
36
|
+
- 'lib/assembly-objectfile/object_file.rb'
|
75
37
|
|
76
|
-
# Offense count:
|
38
|
+
# Offense count: 2
|
77
39
|
# Configuration parameters: CountAsOne.
|
78
40
|
RSpec/ExampleLength:
|
79
|
-
Max:
|
41
|
+
Max: 7
|
80
42
|
|
81
|
-
# Offense count:
|
43
|
+
# Offense count: 1
|
82
44
|
# Configuration parameters: Include, CustomTransform, IgnoreMethods, SpecSuffixOnly.
|
83
45
|
# Include: **/*_spec*rb*, **/spec/**/*
|
84
46
|
RSpec/FilePath:
|
85
47
|
Exclude:
|
86
|
-
- 'spec/content_metadata_spec.rb'
|
87
48
|
- 'spec/object_file_spec.rb'
|
88
49
|
|
89
|
-
# Offense count:
|
90
|
-
# Configuration parameters: AssignmentOnly.
|
91
|
-
RSpec/InstanceVariable:
|
92
|
-
Exclude:
|
93
|
-
- 'spec/object_file_spec.rb'
|
94
|
-
|
95
|
-
# Offense count: 41
|
50
|
+
# Offense count: 8
|
96
51
|
RSpec/MultipleExpectations:
|
97
|
-
Max:
|
52
|
+
Max: 6
|
98
53
|
|
99
|
-
# Offense count:
|
54
|
+
# Offense count: 3
|
100
55
|
RSpec/NestedGroups:
|
101
56
|
Max: 4
|
102
57
|
|
103
|
-
# Offense count:
|
104
|
-
|
105
|
-
|
106
|
-
- 'spec/object_file_spec.rb'
|
107
|
-
|
108
|
-
# Offense count: 2
|
109
|
-
RSpec/RepeatedExample:
|
110
|
-
Exclude:
|
111
|
-
- 'spec/object_file_spec.rb'
|
112
|
-
|
113
|
-
# Offense count: 5
|
114
|
-
RSpec/RepeatedExampleGroupDescription:
|
115
|
-
Exclude:
|
116
|
-
- 'spec/content_metadata_spec.rb'
|
117
|
-
|
118
|
-
# Offense count: 2
|
119
|
-
# Cop supports --auto-correct.
|
120
|
-
Style/CommentedKeyword:
|
121
|
-
Exclude:
|
122
|
-
- 'lib/assembly-objectfile/content_metadata.rb'
|
123
|
-
|
124
|
-
# Offense count: 123
|
125
|
-
# Cop supports --auto-correct.
|
126
|
-
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
58
|
+
# Offense count: 24
|
59
|
+
# This cop supports safe autocorrection (--autocorrect).
|
60
|
+
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns, IgnoredPatterns.
|
127
61
|
# URISchemes: http, https
|
128
62
|
Layout/LineLength:
|
129
|
-
Max:
|
63
|
+
Max: 187
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
assembly-objectfile (2.0.0)
|
5
|
+
activesupport (>= 5.2.0)
|
6
|
+
deprecation
|
7
|
+
mime-types (> 3)
|
8
|
+
mini_exiftool
|
9
|
+
nokogiri
|
10
|
+
|
11
|
+
GEM
|
12
|
+
remote: http://rubygems.org/
|
13
|
+
specs:
|
14
|
+
activesupport (7.0.3)
|
15
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
16
|
+
i18n (>= 1.6, < 2)
|
17
|
+
minitest (>= 5.1)
|
18
|
+
tzinfo (~> 2.0)
|
19
|
+
ast (2.4.2)
|
20
|
+
byebug (11.1.3)
|
21
|
+
coderay (1.1.3)
|
22
|
+
concurrent-ruby (1.1.10)
|
23
|
+
deprecation (1.1.0)
|
24
|
+
activesupport
|
25
|
+
diff-lcs (1.5.0)
|
26
|
+
docile (1.4.0)
|
27
|
+
i18n (1.10.0)
|
28
|
+
concurrent-ruby (~> 1.0)
|
29
|
+
json (2.6.2)
|
30
|
+
method_source (1.0.0)
|
31
|
+
mime-types (3.4.1)
|
32
|
+
mime-types-data (~> 3.2015)
|
33
|
+
mime-types-data (3.2022.0105)
|
34
|
+
mini_exiftool (2.10.2)
|
35
|
+
mini_portile2 (2.8.0)
|
36
|
+
minitest (5.16.2)
|
37
|
+
nokogiri (1.13.6)
|
38
|
+
mini_portile2 (~> 2.8.0)
|
39
|
+
racc (~> 1.4)
|
40
|
+
parallel (1.22.1)
|
41
|
+
parser (3.1.2.0)
|
42
|
+
ast (~> 2.4.1)
|
43
|
+
pry (0.13.1)
|
44
|
+
coderay (~> 1.1)
|
45
|
+
method_source (~> 1.0)
|
46
|
+
pry-byebug (3.9.0)
|
47
|
+
byebug (~> 11.0)
|
48
|
+
pry (~> 0.13.0)
|
49
|
+
racc (1.6.0)
|
50
|
+
rainbow (3.1.1)
|
51
|
+
rake (13.0.6)
|
52
|
+
regexp_parser (2.5.0)
|
53
|
+
rexml (3.2.5)
|
54
|
+
rspec (3.11.0)
|
55
|
+
rspec-core (~> 3.11.0)
|
56
|
+
rspec-expectations (~> 3.11.0)
|
57
|
+
rspec-mocks (~> 3.11.0)
|
58
|
+
rspec-core (3.11.0)
|
59
|
+
rspec-support (~> 3.11.0)
|
60
|
+
rspec-expectations (3.11.0)
|
61
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
62
|
+
rspec-support (~> 3.11.0)
|
63
|
+
rspec-mocks (3.11.1)
|
64
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
65
|
+
rspec-support (~> 3.11.0)
|
66
|
+
rspec-support (3.11.0)
|
67
|
+
rubocop (1.31.0)
|
68
|
+
parallel (~> 1.10)
|
69
|
+
parser (>= 3.1.0.0)
|
70
|
+
rainbow (>= 2.2.2, < 4.0)
|
71
|
+
regexp_parser (>= 1.8, < 3.0)
|
72
|
+
rexml (>= 3.2.5, < 4.0)
|
73
|
+
rubocop-ast (>= 1.18.0, < 2.0)
|
74
|
+
ruby-progressbar (~> 1.7)
|
75
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
76
|
+
rubocop-ast (1.18.0)
|
77
|
+
parser (>= 3.1.1.0)
|
78
|
+
rubocop-rspec (2.11.1)
|
79
|
+
rubocop (~> 1.19)
|
80
|
+
ruby-progressbar (1.11.0)
|
81
|
+
simplecov (0.21.2)
|
82
|
+
docile (~> 1.1)
|
83
|
+
simplecov-html (~> 0.11)
|
84
|
+
simplecov_json_formatter (~> 0.1)
|
85
|
+
simplecov-html (0.12.3)
|
86
|
+
simplecov_json_formatter (0.1.4)
|
87
|
+
tzinfo (2.0.4)
|
88
|
+
concurrent-ruby (~> 1.0)
|
89
|
+
unicode-display_width (2.2.0)
|
90
|
+
|
91
|
+
PLATFORMS
|
92
|
+
ruby
|
93
|
+
|
94
|
+
DEPENDENCIES
|
95
|
+
assembly-objectfile!
|
96
|
+
byebug
|
97
|
+
json
|
98
|
+
pry-byebug
|
99
|
+
rake
|
100
|
+
rspec (~> 3.0)
|
101
|
+
rubocop (~> 1.25)
|
102
|
+
rubocop-rspec
|
103
|
+
simplecov
|
104
|
+
|
105
|
+
BUNDLED WITH
|
106
|
+
2.3.4
|
data/assembly-objectfile.gemspec
CHANGED
@@ -16,7 +16,6 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.metadata['rubygems_mfa_required'] = 'true'
|
17
17
|
|
18
18
|
s.files = `git ls-files`.split("\n")
|
19
|
-
s.test_files = `git ls-files -- spec/*`.split("\n")
|
20
19
|
s.bindir = 'exe'
|
21
20
|
s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
21
|
s.require_paths = ['lib']
|
@@ -25,13 +24,12 @@ Gem::Specification.new do |s|
|
|
25
24
|
|
26
25
|
s.add_dependency 'activesupport', '>= 5.2.0'
|
27
26
|
s.add_dependency 'deprecation'
|
28
|
-
s.add_dependency 'dry-struct', '~> 1.0'
|
29
|
-
s.add_dependency 'dry-types', '~> 1.1'
|
30
27
|
s.add_dependency 'mime-types', '> 3'
|
31
28
|
s.add_dependency 'mini_exiftool'
|
32
29
|
s.add_dependency 'nokogiri'
|
33
30
|
|
34
31
|
s.add_development_dependency 'json'
|
32
|
+
s.add_development_dependency 'pry-byebug'
|
35
33
|
s.add_development_dependency 'rake'
|
36
34
|
s.add_development_dependency 'rspec', '~> 3.0'
|
37
35
|
s.add_development_dependency 'rubocop', '~> 1.25'
|
@@ -1,14 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'mini_exiftool'
|
4
|
+
require 'mime/types'
|
5
|
+
require 'active_support/core_ext/object/blank'
|
6
|
+
|
3
7
|
module Assembly
|
4
8
|
# This class contains generic methods to operate on any file.
|
5
9
|
class ObjectFile
|
6
|
-
include Assembly::ObjectFileable
|
7
|
-
|
8
10
|
# Class level method that given an array of strings, return the longest common initial path. Useful for removing a common path from a set of filenames when producing content metadata
|
9
11
|
#
|
10
12
|
# @param [Array] strings Array of filenames with paths to operate on
|
11
|
-
# @return [String]
|
13
|
+
# @return [String] longest common initial part of path of filenames passed in
|
12
14
|
#
|
13
15
|
# Example:
|
14
16
|
# puts Assembly::ObjectFile.common_prefix(['/Users/peter/00/test.tif','/Users/peter/05/test.jp2']) # '/Users/peter/0'
|
@@ -25,5 +27,253 @@ module Assembly
|
|
25
27
|
"#{common_prefix.split('/')[0..-2].join('/')}/" # if it was, then return the common prefix directly
|
26
28
|
end
|
27
29
|
end
|
30
|
+
|
31
|
+
attr_accessor :file_attributes, :label, :path, :provider_md5, :provider_sha1, :relative_path, :mime_type_order
|
32
|
+
|
33
|
+
VALID_MIMETYPE_METHODS = %i[override exif file extension].freeze
|
34
|
+
|
35
|
+
# @param [String] path full path to the file to be worked with
|
36
|
+
# @param [Hash<Symbol => Object>] params options used during content metadata generation
|
37
|
+
# @option params [Hash<Symbol => ['yes', 'no']>] :file_attributes e.g. {:preserve=>'yes',:shelve=>'no',:publish=>'no'}, defaults pulled from mimetype
|
38
|
+
# @option params [String] :label a resource label (files bundlded together will just get the first file's label attribute if set)
|
39
|
+
# @option params [String] :provider_md5 pre-computed MD5 checksum
|
40
|
+
# @option params [String] :provider_sha1 pre-computed SHA1 checksum
|
41
|
+
# @option params [String] :relative_path if you want the file ids in the content metadata it can be set, otherwise content metadata will get the full path
|
42
|
+
# @option params [Array] :mime_type_order can be set to the order in which you want mimetypes to be determined
|
43
|
+
# options are :override (from manual overide mapping if exists), :exif (from exif if exists),
|
44
|
+
# :extension (from file extension), and :file (from unix file system command)
|
45
|
+
# the default is defined in the private `default_mime_type_order` method but you can override to set your own order
|
46
|
+
# @example
|
47
|
+
# Assembly::ObjectFile.new('/input/path_to_file.tif')
|
48
|
+
def initialize(path, params = {})
|
49
|
+
@path = path
|
50
|
+
@label = params[:label]
|
51
|
+
@file_attributes = params[:file_attributes]
|
52
|
+
@relative_path = params[:relative_path]
|
53
|
+
@provider_md5 = params[:provider_md5]
|
54
|
+
@provider_sha1 = params[:provider_sha1]
|
55
|
+
@mime_type_order = params[:mime_type_order] || default_mime_type_order
|
56
|
+
end
|
57
|
+
|
58
|
+
# @return [String] base filename
|
59
|
+
# @example
|
60
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
|
61
|
+
# puts source_file.filename # "path_to_file.tif"
|
62
|
+
def filename
|
63
|
+
File.basename(path)
|
64
|
+
end
|
65
|
+
|
66
|
+
# @return [String] base directory
|
67
|
+
# @example
|
68
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
|
69
|
+
# puts source_file.dirname # "/input"
|
70
|
+
def dirname
|
71
|
+
File.dirname(path)
|
72
|
+
end
|
73
|
+
|
74
|
+
# @return [String] filename extension
|
75
|
+
# @example
|
76
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
|
77
|
+
# puts source_file.ext # ".tif"
|
78
|
+
def ext
|
79
|
+
File.extname(path)
|
80
|
+
end
|
81
|
+
|
82
|
+
# @return [String] base filename without extension
|
83
|
+
# @example
|
84
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
|
85
|
+
# puts source_file.filename # "path_to_file"
|
86
|
+
def filename_without_ext
|
87
|
+
File.basename(path, ext)
|
88
|
+
end
|
89
|
+
|
90
|
+
# @return [MiniExiftool] exif information stored as a hash and an object
|
91
|
+
# @example
|
92
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
|
93
|
+
# puts source_file.exif # hash with exif information
|
94
|
+
def exif
|
95
|
+
@exif ||= begin
|
96
|
+
check_for_file
|
97
|
+
MiniExiftool.new(path, replace_invalid_chars: '?')
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Computes md5 checksum or returns cached value
|
102
|
+
# @return [String] md5 checksum
|
103
|
+
# @example
|
104
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
|
105
|
+
# puts source_file.md5 # 'XXX123XXX1243XX1243'
|
106
|
+
def md5
|
107
|
+
check_for_file unless @md5
|
108
|
+
@md5 ||= Digest::MD5.file(path).hexdigest
|
109
|
+
end
|
110
|
+
|
111
|
+
# Computes sha1 checksum or return cached value
|
112
|
+
# @return [String] sha1 checksum
|
113
|
+
# @example
|
114
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
|
115
|
+
# puts source_file.sha1 # 'XXX123XXX1243XX1243'
|
116
|
+
def sha1
|
117
|
+
check_for_file unless @sha1
|
118
|
+
@sha1 ||= Digest::SHA1.file(path).hexdigest
|
119
|
+
end
|
120
|
+
|
121
|
+
# Returns mimetype information for the current file based on the ordering set in default_mime_type_order
|
122
|
+
# We stop computing mimetypes as soon as we have a method that returns a value
|
123
|
+
# @return [String] mime type
|
124
|
+
# @example
|
125
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.txt')
|
126
|
+
# puts source_file.mimetype # 'text/plain'
|
127
|
+
def mimetype
|
128
|
+
@mimetype ||= begin
|
129
|
+
check_for_file
|
130
|
+
mimetype = ''
|
131
|
+
mime_type_order.each do |mime_type_method|
|
132
|
+
mimetype = send("#{mime_type_method}_mimetype") if VALID_MIMETYPE_METHODS.include?(mime_type_method)
|
133
|
+
break if mimetype.present?
|
134
|
+
end
|
135
|
+
mimetype
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# @return [Symbol] the type of object, could be :application (for PDF or Word, etc), :audio, :image, :message, :model, :multipart, :text or :video
|
140
|
+
# @example
|
141
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
|
142
|
+
# puts source_file.object_type # :image
|
143
|
+
def object_type
|
144
|
+
lookup = MIME::Types[mimetype][0]
|
145
|
+
lookup.nil? ? :other : lookup.media_type.to_sym
|
146
|
+
end
|
147
|
+
|
148
|
+
# @return [Boolean] if object is an image
|
149
|
+
# @example
|
150
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
|
151
|
+
# puts source_file.image? # true
|
152
|
+
def image?
|
153
|
+
object_type == :image
|
154
|
+
end
|
155
|
+
|
156
|
+
# Examines the input image for validity. Used to determine if image is a valid and useful image.
|
157
|
+
# If image is not a jp2, also checks if it is jp2able?
|
158
|
+
# @return [Boolean] true if image is valid, false if not.
|
159
|
+
# @example
|
160
|
+
# source_img = Assembly::ObjectFile.new('/input/path_to_file.tif')
|
161
|
+
# puts source_img.valid_image? # true
|
162
|
+
def valid_image?
|
163
|
+
return false unless image?
|
164
|
+
|
165
|
+
mimetype == 'image/jp2' || jp2able?
|
166
|
+
end
|
167
|
+
|
168
|
+
# @return [Boolean] true if image has a color profile, false if not.
|
169
|
+
# @example
|
170
|
+
# source_img = Assembly::ObjectFile.new('/input/path_to_file.tif')
|
171
|
+
# puts source_img.has_color_profile? # true
|
172
|
+
def has_color_profile?
|
173
|
+
return false unless exif
|
174
|
+
|
175
|
+
exif['profiledescription'] || exif['colorspace'] ? true : false
|
176
|
+
end
|
177
|
+
|
178
|
+
# Examines the input image for validity to create a jp2. Same as valid_image? but also confirms the existence of a profile description and further restricts mimetypes.
|
179
|
+
# It is used by the assembly robots to decide if a jp2 will be created and is also called before you create a jp2 using assembly-image.
|
180
|
+
# @return [Boolean] true if image should have a jp2 created, false if not.
|
181
|
+
# @example
|
182
|
+
# source_img = Assembly::ObjectFile.new('/input/path_to_file.tif')
|
183
|
+
# puts source_img.jp2able? # true
|
184
|
+
def jp2able?
|
185
|
+
return false unless exif
|
186
|
+
|
187
|
+
Assembly::VALID_IMAGE_MIMETYPES.include?(mimetype)
|
188
|
+
end
|
189
|
+
|
190
|
+
# Returns file size information for the current file in bytes.
|
191
|
+
# @return [Integer] file size in bytes
|
192
|
+
# @example
|
193
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
|
194
|
+
# puts source_file.filesize # 1345
|
195
|
+
def filesize
|
196
|
+
check_for_file
|
197
|
+
@filesize ||= File.size(path)
|
198
|
+
end
|
199
|
+
|
200
|
+
# Determines if the file exists (and is not a directory)
|
201
|
+
# @return [Boolean] file exists
|
202
|
+
# @example
|
203
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.tif')
|
204
|
+
# puts source_file.file_exists? # true
|
205
|
+
def file_exists?
|
206
|
+
@file_exists ||= (File.exist?(path) && !File.directory?(path))
|
207
|
+
end
|
208
|
+
|
209
|
+
private
|
210
|
+
|
211
|
+
# private method to check for file existence before operating on it
|
212
|
+
def check_for_file
|
213
|
+
raise "input file #{path} does not exist or is a directory" unless file_exists?
|
214
|
+
end
|
215
|
+
|
216
|
+
# prive method defining default preferred ordering of how mimetypes are determined
|
217
|
+
def default_mime_type_order
|
218
|
+
%i[override exif file extension]
|
219
|
+
end
|
220
|
+
|
221
|
+
# Returns mimetype information using the mime-types gem (based on a file extension lookup)
|
222
|
+
# @return [String] mime type for supplied file
|
223
|
+
# @example
|
224
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.txt')
|
225
|
+
# puts source_file.extension_mimetype # 'text/plain'
|
226
|
+
def extension_mimetype
|
227
|
+
@extension_mimetype ||= begin
|
228
|
+
mtype = MIME::Types.type_for(path).first
|
229
|
+
mtype ? mtype.content_type : ''
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
# Returns mimetype information for the current file based on unix file system command.
|
234
|
+
# @return [String] mime type for supplied file
|
235
|
+
# @example
|
236
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.txt')
|
237
|
+
# puts source_file.file_mimetype # 'text/plain'
|
238
|
+
def file_mimetype
|
239
|
+
@file_mimetype ||= begin
|
240
|
+
check_for_file
|
241
|
+
`file --mime-type "#{path}"`.delete("\n").split(':')[1].strip # first try and get the mimetype from the unix file command
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
# Returns mimetype information for the current file based on exif data (if available and not a trusted source that we'd rather get from the file system command)
|
246
|
+
# @return [String] mime type for supplied file
|
247
|
+
# @example
|
248
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.txt')
|
249
|
+
# puts source_file.exif_mimetype # 'text/plain'
|
250
|
+
def exif_mimetype
|
251
|
+
@exif_mimetype ||= begin
|
252
|
+
check_for_file
|
253
|
+
prefer_exif = !Assembly::TRUSTED_MIMETYPES.include?(file_mimetype) # if it's not a "trusted" mimetype and there is exif data; get the mimetype from the exif
|
254
|
+
exif.mimetype if exif&.mimetype && prefer_exif
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
# Returns mimetype information using the manual override mapping (based on a file extension lookup)
|
259
|
+
# @return [String] mime type for supplied file if a mapping exists for the file's extension
|
260
|
+
# @example
|
261
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.json')
|
262
|
+
# puts source_file.override_mimetype # 'application/json'
|
263
|
+
def override_mimetype
|
264
|
+
@override_mimetype ||= Assembly::OVERRIDE_MIMETYPES.fetch(ext.to_sym, '')
|
265
|
+
end
|
266
|
+
|
267
|
+
# @note Uses shell call to "file", only expected to work on unix based systems
|
268
|
+
# @return [String] encoding for supplied file
|
269
|
+
# @example
|
270
|
+
# source_file = Assembly::ObjectFile.new('/input/path_to_file.txt')
|
271
|
+
# puts source_file.encoding # 'us-ascii'
|
272
|
+
def encoding
|
273
|
+
@encoding ||= begin
|
274
|
+
check_for_file
|
275
|
+
`file --mime-encoding "#{path}"`.delete("\n").split(':')[1].strip
|
276
|
+
end
|
277
|
+
end
|
28
278
|
end
|
29
279
|
end
|
data/lib/assembly-objectfile.rb
CHANGED
@@ -7,9 +7,6 @@ module Assembly
|
|
7
7
|
# if input image is not one of these mime types, it will not be regarded as a valid image for the purpose of generating a JP2 derivative
|
8
8
|
VALID_IMAGE_MIMETYPES = ['image/jpeg', 'image/tiff', 'image/tif', 'image/png'].freeze
|
9
9
|
|
10
|
-
# if input file has one of these extensions in a 3D object, it will get the 3d resource type
|
11
|
-
VALID_THREE_DIMENSION_EXTENTIONS = ['.obj'].freeze
|
12
|
-
|
13
10
|
# the list of mimetypes that will be "trusted" by the unix file command; if a mimetype other than one of these is returned
|
14
11
|
# by the file command, then a check will be made to see if exif data exists...if so, the mimetype returned by the exif data will be used
|
15
12
|
# if no exif data exists, then the mimetype returned by the unix file command will be used
|
@@ -24,7 +21,5 @@ module Assembly
|
|
24
21
|
}.freeze
|
25
22
|
end
|
26
23
|
|
27
|
-
require 'assembly-objectfile/content_metadata'
|
28
|
-
require 'assembly-objectfile/object_fileable'
|
29
24
|
require 'assembly-objectfile/object_file'
|
30
25
|
require 'assembly-objectfile/version'
|