riiif 2.0.0.beta2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +2 -11
- data/.rubocop_todo.yml +76 -33
- data/README.md +17 -2
- data/app/controllers/riiif/images_controller.rb +8 -2
- data/app/models/riiif/image.rb +15 -20
- data/app/models/riiif/image_information.rb +12 -24
- data/app/services/riiif/crop.rb +99 -30
- data/app/services/riiif/image_magick_info_extractor.rb +9 -2
- data/app/services/riiif/imagemagick_command_factory.rb +9 -4
- data/app/services/riiif/kakadu_command_factory.rb +2 -2
- data/app/services/riiif/resize.rb +72 -7
- data/app/transformers/riiif/kakadu_transformer.rb +25 -2
- data/docs/benchmark.md +75 -0
- data/lib/riiif/engine.rb +2 -1
- data/lib/riiif/routes.rb +3 -0
- data/lib/riiif/version.rb +1 -1
- data/riiif.gemspec +3 -3
- data/spec/controllers/riiif/images_controller_spec.rb +14 -3
- data/spec/models/riiif/image_information_spec.rb +2 -10
- data/spec/models/riiif/image_spec.rb +10 -16
- data/spec/services/riiif/imagemagick_command_factory_spec.rb +6 -6
- data/spec/services/riiif/kakadu_command_factory_spec.rb +15 -15
- data/spec/transformers/riiif/kakadu_transformer_spec.rb +22 -22
- metadata +24 -46
- data/app/models/riiif/transformation.rb +0 -35
- data/app/services/riiif/imagemagick_transformer.rb +0 -8
- data/app/services/riiif/option_decoder.rb +0 -88
- data/app/services/riiif/region/absolute.rb +0 -23
- data/app/services/riiif/region/full.rb +0 -23
- data/app/services/riiif/region/percentage.rb +0 -68
- data/app/services/riiif/region/square.rb +0 -45
- data/app/services/riiif/size/absolute.rb +0 -39
- data/app/services/riiif/size/best_fit.rb +0 -18
- data/app/services/riiif/size/full.rb +0 -17
- data/app/services/riiif/size/height.rb +0 -24
- data/app/services/riiif/size/percent.rb +0 -44
- data/app/services/riiif/size/width.rb +0 -24
- data/spec/models/riiif/transformation_spec.rb +0 -42
- data/spec/services/riiif/region/absolute_spec.rb +0 -17
- data/spec/services/riiif/size/absolute_spec.rb +0 -17
- data/spec/services/riiif/size/height_spec.rb +0 -13
- data/spec/services/riiif/size/width_spec.rb +0 -13
@@ -2,18 +2,18 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
RSpec.describe Riiif::ImagemagickCommandFactory do
|
4
4
|
let(:path) { 'foo.tiff' }
|
5
|
-
let(:info) { double('
|
5
|
+
let(:info) { double(height: 100, width: 100, format: 'JPEG') }
|
6
6
|
|
7
7
|
describe '.command' do
|
8
8
|
subject { instance.command }
|
9
9
|
let(:instance) { described_class.new(path, info, transformation) }
|
10
10
|
|
11
11
|
let(:transformation) do
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
IIIF::Image::Transformation.new(region: IIIF::Image::Region::Full.new,
|
13
|
+
size: IIIF::Image::Size::Full.new,
|
14
|
+
quality: 'quality',
|
15
|
+
rotation: 15.2,
|
16
|
+
format: format)
|
17
17
|
end
|
18
18
|
|
19
19
|
context "when it's a jpeg" do
|
@@ -7,18 +7,18 @@ RSpec.describe Riiif::KakaduCommandFactory do
|
|
7
7
|
|
8
8
|
let(:info) { double(:info) }
|
9
9
|
let(:path) { 'foo.jp2' }
|
10
|
-
let(:region) {
|
11
|
-
let(:size) {
|
10
|
+
let(:region) { IIIF::Image::Region::Full.new }
|
11
|
+
let(:size) { IIIF::Image::Size::Full.new }
|
12
12
|
let(:quality) { nil }
|
13
13
|
let(:rotation) { nil }
|
14
14
|
let(:fmt) { nil }
|
15
15
|
|
16
16
|
let(:transformation) do
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
IIIF::Image::Transformation.new(region: region,
|
18
|
+
size: size,
|
19
|
+
quality: quality,
|
20
|
+
rotation: rotation,
|
21
|
+
format: fmt)
|
22
22
|
end
|
23
23
|
|
24
24
|
describe '#command' do
|
@@ -38,17 +38,17 @@ RSpec.describe Riiif::KakaduCommandFactory do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
context 'with absolute' do
|
41
|
-
let(:region) {
|
41
|
+
let(:region) { IIIF::Image::Region::Absolute.new(25, 75, 150, 100) }
|
42
42
|
it { is_expected.to eq ' -region "{0.25,0.08333333333333333},{0.3333333333333333,0.5}"' }
|
43
43
|
end
|
44
44
|
|
45
45
|
context 'with a square' do
|
46
|
-
let(:region) {
|
46
|
+
let(:region) { IIIF::Image::Region::Square.new }
|
47
47
|
it { is_expected.to eq ' -region "{0.0,0},{1.0,1.0}"' }
|
48
48
|
end
|
49
49
|
|
50
50
|
context 'with a percentage' do
|
51
|
-
let(:region) {
|
51
|
+
let(:region) { IIIF::Image::Region::Percent.new(20.0, 30.0, 40.0, 50.0) }
|
52
52
|
it { is_expected.to eq ' -region "{0.3,0.2},{0.5,0.4}"' }
|
53
53
|
end
|
54
54
|
end
|
@@ -56,29 +56,29 @@ RSpec.describe Riiif::KakaduCommandFactory do
|
|
56
56
|
describe '#reduction_factor' do
|
57
57
|
subject { instance.send(:reduction_factor) }
|
58
58
|
|
59
|
-
let(:info) { Riiif::ImageInformation.new(300, 300) }
|
59
|
+
let(:info) { Riiif::ImageInformation.new(width: 300, height: 300) }
|
60
60
|
|
61
61
|
context 'for a full size image' do
|
62
62
|
it { is_expected.to eq nil }
|
63
63
|
end
|
64
64
|
|
65
65
|
context 'when the aspect ratio is maintined for absolute' do
|
66
|
-
let(:size) {
|
66
|
+
let(:size) { IIIF::Image::Size::Absolute.new(145, 145) }
|
67
67
|
it { is_expected.to eq 1 }
|
68
68
|
end
|
69
69
|
|
70
70
|
context 'when the aspect ratio is not-maintined' do
|
71
|
-
let(:size) {
|
71
|
+
let(:size) { IIIF::Image::Size::Absolute.new(100, 145) }
|
72
72
|
it { is_expected.to eq nil }
|
73
73
|
end
|
74
74
|
|
75
75
|
context 'when aspect ratio is maintained for 45 pct' do
|
76
|
-
let(:size) {
|
76
|
+
let(:size) { IIIF::Image::Size::Percent.new(45.0) }
|
77
77
|
it { is_expected.to eq 1 }
|
78
78
|
end
|
79
79
|
|
80
80
|
context 'when aspect ratio is maintained for 20 pct' do
|
81
|
-
let(:size) {
|
81
|
+
let(:size) { IIIF::Image::Size::Percent.new(20.0) }
|
82
82
|
it { is_expected.to eq 2 }
|
83
83
|
end
|
84
84
|
end
|
@@ -5,20 +5,20 @@ require 'spec_helper'
|
|
5
5
|
RSpec.describe Riiif::KakaduTransformer do
|
6
6
|
subject(:instance) { described_class.new(path, image_info, transformation) }
|
7
7
|
|
8
|
-
let(:image_info) { Riiif::ImageInformation.new(6501, 4381) }
|
8
|
+
let(:image_info) { Riiif::ImageInformation.new(width: 6501, height: 4381) }
|
9
9
|
let(:path) { 'baseball.jp2' }
|
10
|
-
let(:region) {
|
11
|
-
let(:size) {
|
10
|
+
let(:region) { IIIF::Image::Region::Full.new }
|
11
|
+
let(:size) { IIIF::Image::Size::Full.new }
|
12
12
|
let(:quality) { nil }
|
13
|
-
let(:rotation) {
|
13
|
+
let(:rotation) { 0 }
|
14
14
|
let(:fmt) { 'jpg' }
|
15
15
|
|
16
16
|
let(:transformation) do
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
IIIF::Image::Transformation.new(region: region,
|
18
|
+
size: size,
|
19
|
+
quality: quality,
|
20
|
+
rotation: rotation,
|
21
|
+
format: fmt)
|
22
22
|
end
|
23
23
|
|
24
24
|
describe '#transform' do
|
@@ -32,10 +32,10 @@ RSpec.describe Riiif::KakaduTransformer do
|
|
32
32
|
|
33
33
|
context 'resize and region' do
|
34
34
|
# This is the validator test for size_region
|
35
|
-
let(:size) {
|
36
|
-
let(:region) {
|
35
|
+
let(:size) { IIIF::Image::Size::Absolute.new(38, 38) }
|
36
|
+
let(:region) { IIIF::Image::Region::Absolute.new(200, 100, 100, 100) }
|
37
37
|
|
38
|
-
let(:image_info) { Riiif::ImageInformation.new(1000, 1000) }
|
38
|
+
let(:image_info) { Riiif::ImageInformation.new(width: 1000, height: 1000) }
|
39
39
|
|
40
40
|
it 'calls the Imagemagick transform' do
|
41
41
|
expect(Riiif::CommandRunner).to receive(:execute)
|
@@ -60,8 +60,8 @@ RSpec.describe Riiif::KakaduTransformer do
|
|
60
60
|
end
|
61
61
|
|
62
62
|
context 'and size is a width' do
|
63
|
-
let(:size) {
|
64
|
-
let(:image_info) { Riiif::ImageInformation.new(1000, 1000) }
|
63
|
+
let(:size) { IIIF::Image::Size::Width.new(651) }
|
64
|
+
let(:image_info) { Riiif::ImageInformation.new(width: 1000, height: 1000) }
|
65
65
|
|
66
66
|
it 'calls the Imagemagick transform' do
|
67
67
|
expect(Riiif::CommandRunner).to receive(:execute)
|
@@ -73,8 +73,8 @@ RSpec.describe Riiif::KakaduTransformer do
|
|
73
73
|
end
|
74
74
|
|
75
75
|
context 'and size is a height' do
|
76
|
-
let(:size) {
|
77
|
-
let(:image_info) { Riiif::ImageInformation.new(1000, 1000) }
|
76
|
+
let(:size) { IIIF::Image::Size::Height.new(581) }
|
77
|
+
let(:image_info) { Riiif::ImageInformation.new(width: 1000, height: 1000) }
|
78
78
|
|
79
79
|
it 'calls the Imagemagick transform' do
|
80
80
|
expect(Riiif::CommandRunner).to receive(:execute)
|
@@ -90,7 +90,7 @@ RSpec.describe Riiif::KakaduTransformer do
|
|
90
90
|
let(:reduction_factor) { 1 }
|
91
91
|
|
92
92
|
context 'and size is a Percent' do
|
93
|
-
let(:size) {
|
93
|
+
let(:size) { IIIF::Image::Size::Percent.new(30.0) }
|
94
94
|
|
95
95
|
it 'calls the Imagemagick transform' do
|
96
96
|
expect(Riiif::CommandRunner).to receive(:execute)
|
@@ -102,8 +102,8 @@ RSpec.describe Riiif::KakaduTransformer do
|
|
102
102
|
end
|
103
103
|
|
104
104
|
context 'and size is a width' do
|
105
|
-
let(:size) {
|
106
|
-
let(:image_info) { Riiif::ImageInformation.new(1000, 1000) }
|
105
|
+
let(:size) { IIIF::Image::Size::Width.new(408) }
|
106
|
+
let(:image_info) { Riiif::ImageInformation.new(width: 1000, height: 1000) }
|
107
107
|
|
108
108
|
it 'calls the Imagemagick transform' do
|
109
109
|
expect(Riiif::CommandRunner).to receive(:execute)
|
@@ -115,8 +115,8 @@ RSpec.describe Riiif::KakaduTransformer do
|
|
115
115
|
end
|
116
116
|
|
117
117
|
context 'and size is a height' do
|
118
|
-
let(:size) {
|
119
|
-
let(:image_info) { Riiif::ImageInformation.new(1000, 1000) }
|
118
|
+
let(:size) { IIIF::Image::Size::Height.new(481) }
|
119
|
+
let(:image_info) { Riiif::ImageInformation.new(width: 1000, height: 1000) }
|
120
120
|
|
121
121
|
it 'calls the Imagemagick transform' do
|
122
122
|
expect(Riiif::CommandRunner).to receive(:execute)
|
@@ -129,7 +129,7 @@ RSpec.describe Riiif::KakaduTransformer do
|
|
129
129
|
end
|
130
130
|
|
131
131
|
context 'when reduction_factor is 2' do
|
132
|
-
let(:size) {
|
132
|
+
let(:size) { IIIF::Image::Size::Percent.new(20.0) }
|
133
133
|
let(:reduction_factor) { 2 }
|
134
134
|
it 'calls the Imagemagick transform' do
|
135
135
|
expect(Riiif::CommandRunner).to receive(:execute)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: riiif
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Coyne
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -44,6 +44,20 @@ dependencies:
|
|
44
44
|
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: 1.0.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: iiif-image-api
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.1.0
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 0.1.0
|
47
61
|
- !ruby/object:Gem::Dependency
|
48
62
|
name: bundler
|
49
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -115,33 +129,19 @@ dependencies:
|
|
115
129
|
- !ruby/object:Gem::Version
|
116
130
|
version: '0'
|
117
131
|
- !ruby/object:Gem::Dependency
|
118
|
-
name:
|
119
|
-
requirement: !ruby/object:Gem::Requirement
|
120
|
-
requirements:
|
121
|
-
- - "~>"
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
version: 0.47.1
|
124
|
-
type: :development
|
125
|
-
prerelease: false
|
126
|
-
version_requirements: !ruby/object:Gem::Requirement
|
127
|
-
requirements:
|
128
|
-
- - "~>"
|
129
|
-
- !ruby/object:Gem::Version
|
130
|
-
version: 0.47.1
|
131
|
-
- !ruby/object:Gem::Dependency
|
132
|
-
name: rubocop-rspec
|
132
|
+
name: bixby
|
133
133
|
requirement: !ruby/object:Gem::Requirement
|
134
134
|
requirements:
|
135
135
|
- - "~>"
|
136
136
|
- !ruby/object:Gem::Version
|
137
|
-
version:
|
137
|
+
version: 1.0.0
|
138
138
|
type: :development
|
139
139
|
prerelease: false
|
140
140
|
version_requirements: !ruby/object:Gem::Requirement
|
141
141
|
requirements:
|
142
142
|
- - "~>"
|
143
143
|
- !ruby/object:Gem::Version
|
144
|
-
version:
|
144
|
+
version: 1.0.0
|
145
145
|
- !ruby/object:Gem::Dependency
|
146
146
|
name: coveralls
|
147
147
|
requirement: !ruby/object:Gem::Requirement
|
@@ -158,7 +158,7 @@ dependencies:
|
|
158
158
|
version: '0'
|
159
159
|
description: A IIIF image server
|
160
160
|
email:
|
161
|
-
-
|
161
|
+
- administrator@curationexperts.com
|
162
162
|
executables: []
|
163
163
|
extensions: []
|
164
164
|
extra_rdoc_files: []
|
@@ -177,7 +177,6 @@ files:
|
|
177
177
|
- app/models/riiif/file.rb
|
178
178
|
- app/models/riiif/image.rb
|
179
179
|
- app/models/riiif/image_information.rb
|
180
|
-
- app/models/riiif/transformation.rb
|
181
180
|
- app/resolvers/riiif/abstract_file_system_resolver.rb
|
182
181
|
- app/resolvers/riiif/akubra_system_file_resolver.rb
|
183
182
|
- app/resolvers/riiif/file_system_file_resolver.rb
|
@@ -186,26 +185,15 @@ files:
|
|
186
185
|
- app/services/riiif/crop.rb
|
187
186
|
- app/services/riiif/image_magick_info_extractor.rb
|
188
187
|
- app/services/riiif/imagemagick_command_factory.rb
|
189
|
-
- app/services/riiif/imagemagick_transformer.rb
|
190
188
|
- app/services/riiif/kakadu_command_factory.rb
|
191
189
|
- app/services/riiif/link_name_service.rb
|
192
190
|
- app/services/riiif/nil_authorization_service.rb
|
193
|
-
- app/services/riiif/option_decoder.rb
|
194
|
-
- app/services/riiif/region/absolute.rb
|
195
|
-
- app/services/riiif/region/full.rb
|
196
|
-
- app/services/riiif/region/percentage.rb
|
197
|
-
- app/services/riiif/region/square.rb
|
198
191
|
- app/services/riiif/resize.rb
|
199
|
-
- app/services/riiif/size/absolute.rb
|
200
|
-
- app/services/riiif/size/best_fit.rb
|
201
|
-
- app/services/riiif/size/full.rb
|
202
|
-
- app/services/riiif/size/height.rb
|
203
|
-
- app/services/riiif/size/percent.rb
|
204
|
-
- app/services/riiif/size/width.rb
|
205
192
|
- app/transformers/riiif/abstract_transformer.rb
|
206
193
|
- app/transformers/riiif/imagemagick_transformer.rb
|
207
194
|
- app/transformers/riiif/kakadu_transformer.rb
|
208
195
|
- config/routes.rb
|
196
|
+
- docs/benchmark.md
|
209
197
|
- lib/riiif.rb
|
210
198
|
- lib/riiif/engine.rb
|
211
199
|
- lib/riiif/rails/routes.rb
|
@@ -218,15 +206,10 @@ files:
|
|
218
206
|
- spec/models/riiif/http_file_resolver_spec.rb
|
219
207
|
- spec/models/riiif/image_information_spec.rb
|
220
208
|
- spec/models/riiif/image_spec.rb
|
221
|
-
- spec/models/riiif/transformation_spec.rb
|
222
209
|
- spec/routing/redirect_spec.rb
|
223
210
|
- spec/routing/resize_routes_spec.rb
|
224
211
|
- spec/services/riiif/imagemagick_command_factory_spec.rb
|
225
212
|
- spec/services/riiif/kakadu_command_factory_spec.rb
|
226
|
-
- spec/services/riiif/region/absolute_spec.rb
|
227
|
-
- spec/services/riiif/size/absolute_spec.rb
|
228
|
-
- spec/services/riiif/size/height_spec.rb
|
229
|
-
- spec/services/riiif/size/width_spec.rb
|
230
213
|
- spec/spec_helper.rb
|
231
214
|
- spec/test_app_templates/Gemfile.extra
|
232
215
|
- spec/test_app_templates/lib/generators/test_app_generator.rb
|
@@ -246,12 +229,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
246
229
|
version: '0'
|
247
230
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
248
231
|
requirements:
|
249
|
-
- - "
|
232
|
+
- - ">="
|
250
233
|
- !ruby/object:Gem::Version
|
251
|
-
version:
|
234
|
+
version: '0'
|
252
235
|
requirements: []
|
253
236
|
rubyforge_project:
|
254
|
-
rubygems_version: 2.6
|
237
|
+
rubygems_version: 2.7.6
|
255
238
|
signing_key:
|
256
239
|
specification_version: 4
|
257
240
|
summary: A rails engine that support IIIF requests
|
@@ -262,15 +245,10 @@ test_files:
|
|
262
245
|
- spec/models/riiif/http_file_resolver_spec.rb
|
263
246
|
- spec/models/riiif/image_information_spec.rb
|
264
247
|
- spec/models/riiif/image_spec.rb
|
265
|
-
- spec/models/riiif/transformation_spec.rb
|
266
248
|
- spec/routing/redirect_spec.rb
|
267
249
|
- spec/routing/resize_routes_spec.rb
|
268
250
|
- spec/services/riiif/imagemagick_command_factory_spec.rb
|
269
251
|
- spec/services/riiif/kakadu_command_factory_spec.rb
|
270
|
-
- spec/services/riiif/region/absolute_spec.rb
|
271
|
-
- spec/services/riiif/size/absolute_spec.rb
|
272
|
-
- spec/services/riiif/size/height_spec.rb
|
273
|
-
- spec/services/riiif/size/width_spec.rb
|
274
252
|
- spec/spec_helper.rb
|
275
253
|
- spec/test_app_templates/Gemfile.extra
|
276
254
|
- spec/test_app_templates/lib/generators/test_app_generator.rb
|
@@ -1,35 +0,0 @@
|
|
1
|
-
module Riiif
|
2
|
-
# Represents a IIIF request
|
3
|
-
class Transformation
|
4
|
-
attr_reader :crop, :size, :quality, :rotation, :format
|
5
|
-
def initialize(crop, size, quality, rotation, format)
|
6
|
-
@crop = crop
|
7
|
-
@size = size
|
8
|
-
@quality = quality
|
9
|
-
@rotation = rotation
|
10
|
-
@format = format
|
11
|
-
end
|
12
|
-
|
13
|
-
# Create a clone of this Transformation, scaled by the factor
|
14
|
-
# @param [Integer] factor the scale for the new transformation
|
15
|
-
# @return [Transformation] a new transformation, scaled by factor
|
16
|
-
def reduce(factor)
|
17
|
-
Transformation.new(crop.dup,
|
18
|
-
size.reduce(factor),
|
19
|
-
quality,
|
20
|
-
rotation,
|
21
|
-
format)
|
22
|
-
end
|
23
|
-
|
24
|
-
# Create a clone of this Transformation, without the crop
|
25
|
-
# @return [Transformation] a new transformation
|
26
|
-
# TODO: it would be nice if we didn't need image_info
|
27
|
-
def without_crop(image_info)
|
28
|
-
Transformation.new(Region::Full.new(image_info),
|
29
|
-
size.dup,
|
30
|
-
quality,
|
31
|
-
rotation,
|
32
|
-
format)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,88 +0,0 @@
|
|
1
|
-
module Riiif
|
2
|
-
# Decodes the URL parameters into a Transformation object
|
3
|
-
class OptionDecoder
|
4
|
-
OUTPUT_FORMATS = %w(jpg png).freeze
|
5
|
-
|
6
|
-
# a helper method for instantiating the OptionDecoder
|
7
|
-
# @param [ActiveSupport::HashWithIndifferentAccess] options
|
8
|
-
# @param [ImageInformation] image_info
|
9
|
-
def self.decode(options, image_info)
|
10
|
-
new(options, image_info).decode
|
11
|
-
end
|
12
|
-
|
13
|
-
# @param [ActiveSupport::HashWithIndifferentAccess] options
|
14
|
-
# @param [ImageInformation] image_info
|
15
|
-
def initialize(options, image_info)
|
16
|
-
@options = options
|
17
|
-
@image_info = image_info
|
18
|
-
end
|
19
|
-
|
20
|
-
attr_reader :image_info
|
21
|
-
|
22
|
-
##
|
23
|
-
# @return [Transformation]
|
24
|
-
def decode
|
25
|
-
raise ArgumentError, "You must provide a format. You provided #{@options}" unless @options[:format]
|
26
|
-
validate_format!(@options[:format])
|
27
|
-
Riiif::Transformation.new(decode_region(@options.delete(:region)),
|
28
|
-
decode_size(@options.delete(:size)),
|
29
|
-
decode_quality(@options[:quality]),
|
30
|
-
decode_rotation(@options[:rotation]),
|
31
|
-
@options[:format])
|
32
|
-
end
|
33
|
-
|
34
|
-
def decode_quality(quality)
|
35
|
-
return if quality.nil? || %w(default color).include?(quality)
|
36
|
-
return quality if %w(bitonal grey).include?(quality)
|
37
|
-
raise InvalidAttributeError, "Unsupported quality: #{quality}"
|
38
|
-
end
|
39
|
-
|
40
|
-
def decode_rotation(rotation)
|
41
|
-
return if rotation.nil? || rotation == '0'
|
42
|
-
begin
|
43
|
-
Float(rotation)
|
44
|
-
rescue ArgumentError
|
45
|
-
raise InvalidAttributeError, "Unsupported rotation: #{rotation}"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def validate_format!(format)
|
50
|
-
raise InvalidAttributeError, "Unsupported format: #{format}" unless OUTPUT_FORMATS.include?(format)
|
51
|
-
end
|
52
|
-
|
53
|
-
def decode_region(region)
|
54
|
-
if region.nil? || region == 'full'
|
55
|
-
Riiif::Region::Full.new(image_info)
|
56
|
-
elsif md = /^pct:(\d+),(\d+),(\d+),(\d+)$/.match(region)
|
57
|
-
Riiif::Region::Percentage
|
58
|
-
.new(image_info, md[1], md[2], md[3], md[4])
|
59
|
-
elsif md = /^(\d+),(\d+),(\d+),(\d+)$/.match(region)
|
60
|
-
Riiif::Region::Absolute.new(image_info, md[1], md[2], md[3], md[4])
|
61
|
-
elsif region == 'square'
|
62
|
-
Riiif::Region::Square.new(image_info)
|
63
|
-
else
|
64
|
-
raise InvalidAttributeError, "Invalid region: #{region}"
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# rubocop:disable Metrics/PerceivedComplexity
|
69
|
-
def decode_size(size)
|
70
|
-
if size.nil? || size == 'full'
|
71
|
-
Riiif::Size::Full.new
|
72
|
-
elsif md = /^,(\d+)$/.match(size)
|
73
|
-
Riiif::Size::Height.new(image_info, md[1])
|
74
|
-
elsif md = /^(\d+),$/.match(size)
|
75
|
-
Riiif::Size::Width.new(image_info, md[1])
|
76
|
-
elsif md = /^pct:(\d+(.\d+)?)$/.match(size)
|
77
|
-
Riiif::Size::Percent.new(image_info, md[1])
|
78
|
-
elsif md = /^(\d+),(\d+)$/.match(size)
|
79
|
-
Riiif::Size::Absolute.new(image_info, md[1], md[2])
|
80
|
-
elsif md = /^!(\d+),(\d+)$/.match(size)
|
81
|
-
Riiif::Size::BestFit.new(image_info, md[1], md[2])
|
82
|
-
else
|
83
|
-
raise InvalidAttributeError, "Invalid size: #{size}"
|
84
|
-
end
|
85
|
-
end
|
86
|
-
# rubocop:enable Metrics/PerceivedComplexity
|
87
|
-
end
|
88
|
-
end
|