riiif 1.7.1 → 2.0.0.beta1

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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +15 -41
  3. data/Gemfile +1 -37
  4. data/app/models/riiif/file.rb +19 -12
  5. data/app/models/riiif/image.rb +13 -12
  6. data/app/models/riiif/image_information.rb +4 -0
  7. data/app/models/riiif/transformation.rb +35 -0
  8. data/{lib → app/resolvers}/riiif/abstract_file_system_resolver.rb +0 -0
  9. data/{lib → app/resolvers}/riiif/akubra_system_file_resolver.rb +0 -0
  10. data/{lib → app/resolvers}/riiif/file_system_file_resolver.rb +0 -0
  11. data/{lib → app/resolvers}/riiif/http_file_resolver.rb +0 -0
  12. data/app/services/riiif/command_runner.rb +2 -0
  13. data/app/services/riiif/crop.rb +54 -0
  14. data/app/services/riiif/imagemagick_command_factory.rb +20 -19
  15. data/app/services/riiif/imagemagick_transformer.rb +8 -0
  16. data/app/services/riiif/kakadu_command_factory.rb +63 -0
  17. data/app/services/riiif/link_name_service.rb +8 -0
  18. data/{lib → app/services}/riiif/nil_authorization_service.rb +0 -0
  19. data/app/services/riiif/option_decoder.rb +11 -11
  20. data/app/services/riiif/region/absolute.rb +23 -0
  21. data/app/services/riiif/region/full.rb +23 -0
  22. data/app/services/riiif/region/percentage.rb +68 -0
  23. data/app/services/riiif/region/square.rb +45 -0
  24. data/app/services/riiif/resize.rb +45 -0
  25. data/app/services/riiif/size/absolute.rb +39 -0
  26. data/app/services/riiif/size/best_fit.rb +18 -0
  27. data/app/services/riiif/size/full.rb +17 -0
  28. data/app/services/riiif/size/height.rb +24 -0
  29. data/app/services/riiif/size/percent.rb +44 -0
  30. data/app/services/riiif/size/width.rb +24 -0
  31. data/app/transformers/riiif/abstract_transformer.rb +30 -0
  32. data/app/transformers/riiif/imagemagick_transformer.rb +8 -0
  33. data/app/transformers/riiif/kakadu_transformer.rb +39 -0
  34. data/lib/riiif.rb +4 -7
  35. data/lib/riiif/engine.rb +4 -3
  36. data/lib/riiif/version.rb +1 -1
  37. data/riiif.gemspec +1 -1
  38. data/spec/models/riiif/image_spec.rb +6 -3
  39. data/spec/models/riiif/transformation_spec.rb +42 -0
  40. data/spec/services/riiif/imagemagick_command_factory_spec.rb +6 -4
  41. data/spec/services/riiif/kakadu_command_factory_spec.rb +85 -0
  42. data/spec/services/riiif/region/absolute_spec.rb +17 -0
  43. data/spec/services/riiif/size/absolute_spec.rb +17 -0
  44. data/spec/services/riiif/size/height_spec.rb +13 -0
  45. data/spec/services/riiif/size/width_spec.rb +13 -0
  46. data/spec/transformers/riiif/kakadu_transformer_spec.rb +143 -0
  47. metadata +45 -22
  48. data/app/services/riiif/region/imagemagick/absolute_decoder.rb +0 -21
  49. data/app/services/riiif/region/imagemagick/full_decoder.rb +0 -14
  50. data/app/services/riiif/region/imagemagick/percentage_decoder.rb +0 -33
  51. data/app/services/riiif/region/imagemagick/square_decoder.rb +0 -25
  52. data/app/services/riiif/size/imagemagick/absolute_decoder.rb +0 -20
  53. data/app/services/riiif/size/imagemagick/best_fit_decoder.rb +0 -19
  54. data/app/services/riiif/size/imagemagick/full_decoder.rb +0 -14
  55. data/app/services/riiif/size/imagemagick/height_decoder.rb +0 -19
  56. data/app/services/riiif/size/imagemagick/percent_decoder.rb +0 -19
  57. data/app/services/riiif/size/imagemagick/width_decoder.rb +0 -19
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Riiif::KakaduTransformer do
6
+ subject(:instance) { described_class.new(path, image_info, transformation) }
7
+
8
+ let(:image_info) { Riiif::ImageInformation.new(6501, 4381) }
9
+ let(:path) { 'baseball.jp2' }
10
+ let(:region) { Riiif::Region::Full.new(image_info) }
11
+ let(:size) { Riiif::Size::Full.new }
12
+ let(:quality) { nil }
13
+ let(:rotation) { nil }
14
+ let(:fmt) { 'jpg' }
15
+
16
+ let(:transformation) do
17
+ Riiif::Transformation.new(region,
18
+ size,
19
+ quality,
20
+ rotation,
21
+ fmt)
22
+ end
23
+
24
+ describe '#transform' do
25
+ let(:image_data) { double }
26
+
27
+ subject(:transform) { instance.transform }
28
+
29
+ before do
30
+ allow(instance).to receive(:with_tempfile).and_yield('/tmp/foo.bmp')
31
+ end
32
+
33
+ context 'resize and region' do
34
+ # This is the validator test for size_region
35
+ let(:size) { Riiif::Size::Absolute.new(image_info, 38, 38) }
36
+ let(:region) { Riiif::Region::Absolute.new(image_info, 200, 100, 100, 100) }
37
+
38
+ let(:image_info) { Riiif::ImageInformation.new(1000, 1000) }
39
+
40
+ it 'calls the Imagemagick transform' do
41
+ expect(Riiif::CommandRunner).to receive(:execute)
42
+ .with('kdu_expand -quiet -i baseball.jp2 -num_threads 4 ' \
43
+ '-region "{0.1,0.2},{0.1,0.1}" -reduce 4 -o /tmp/foo.bmp')
44
+ expect(Riiif::CommandRunner).to receive(:execute)
45
+ .with('convert -resize 38x38! -quality 85 -sampling-factor 4:2:0 -strip /tmp/foo.bmp jpg:-')
46
+ transform
47
+ end
48
+ end
49
+
50
+ context 'when reduction_factor is 0' do
51
+ let(:reduction_factor) { 0 }
52
+ context 'and the size is full' do
53
+ it 'calls the Imagemagick transform' do
54
+ expect(Riiif::CommandRunner).to receive(:execute)
55
+ .with('kdu_expand -quiet -i baseball.jp2 -num_threads 4 -o /tmp/foo.bmp')
56
+ expect(Riiif::CommandRunner).to receive(:execute)
57
+ .with('convert -quality 85 -sampling-factor 4:2:0 -strip /tmp/foo.bmp jpg:-')
58
+ transform
59
+ end
60
+ end
61
+
62
+ context 'and size is a width' do
63
+ let(:size) { Riiif::Size::Width.new(image_info, 651) }
64
+ let(:image_info) { Riiif::ImageInformation.new(1000, 1000) }
65
+
66
+ it 'calls the Imagemagick transform' do
67
+ expect(Riiif::CommandRunner).to receive(:execute)
68
+ .with('kdu_expand -quiet -i baseball.jp2 -num_threads 4 -o /tmp/foo.bmp')
69
+ expect(Riiif::CommandRunner).to receive(:execute)
70
+ .with('convert -resize 651 -quality 85 -sampling-factor 4:2:0 -strip /tmp/foo.bmp jpg:-')
71
+ transform
72
+ end
73
+ end
74
+
75
+ context 'and size is a height' do
76
+ let(:size) { Riiif::Size::Height.new(image_info, 581) }
77
+ let(:image_info) { Riiif::ImageInformation.new(1000, 1000) }
78
+
79
+ it 'calls the Imagemagick transform' do
80
+ expect(Riiif::CommandRunner).to receive(:execute)
81
+ .with('kdu_expand -quiet -i baseball.jp2 -num_threads 4 -o /tmp/foo.bmp')
82
+ expect(Riiif::CommandRunner).to receive(:execute)
83
+ .with('convert -resize x581 -quality 85 -sampling-factor 4:2:0 -strip /tmp/foo.bmp jpg:-')
84
+ transform
85
+ end
86
+ end
87
+ end
88
+
89
+ context 'when reduction_factor is 1' do
90
+ let(:reduction_factor) { 1 }
91
+
92
+ context 'and size is a Percent' do
93
+ let(:size) { Riiif::Size::Percent.new(image_info, 30) }
94
+
95
+ it 'calls the Imagemagick transform' do
96
+ expect(Riiif::CommandRunner).to receive(:execute)
97
+ .with('kdu_expand -quiet -i baseball.jp2 -num_threads 4 -reduce 1 -o /tmp/foo.bmp')
98
+ expect(Riiif::CommandRunner).to receive(:execute)
99
+ .with('convert -resize 60.0% -quality 85 -sampling-factor 4:2:0 -strip /tmp/foo.bmp jpg:-')
100
+ transform
101
+ end
102
+ end
103
+
104
+ context 'and size is a width' do
105
+ let(:size) { Riiif::Size::Width.new(image_info, 408) }
106
+ let(:image_info) { Riiif::ImageInformation.new(1000, 1000) }
107
+
108
+ it 'calls the Imagemagick transform' do
109
+ expect(Riiif::CommandRunner).to receive(:execute)
110
+ .with('kdu_expand -quiet -i baseball.jp2 -num_threads 4 -reduce 1 -o /tmp/foo.bmp')
111
+ expect(Riiif::CommandRunner).to receive(:execute)
112
+ .with('convert -resize 408 -quality 85 -sampling-factor 4:2:0 -strip /tmp/foo.bmp jpg:-')
113
+ transform
114
+ end
115
+ end
116
+
117
+ context 'and size is a height' do
118
+ let(:size) { Riiif::Size::Height.new(image_info, 481) }
119
+ let(:image_info) { Riiif::ImageInformation.new(1000, 1000) }
120
+
121
+ it 'calls the Imagemagick transform' do
122
+ expect(Riiif::CommandRunner).to receive(:execute)
123
+ .with('kdu_expand -quiet -i baseball.jp2 -num_threads 4 -reduce 1 -o /tmp/foo.bmp')
124
+ expect(Riiif::CommandRunner).to receive(:execute)
125
+ .with('convert -resize x481 -quality 85 -sampling-factor 4:2:0 -strip /tmp/foo.bmp jpg:-')
126
+ transform
127
+ end
128
+ end
129
+ end
130
+
131
+ context 'when reduction_factor is 2' do
132
+ let(:size) { Riiif::Size::Percent.new(image_info, 20) }
133
+ let(:reduction_factor) { 2 }
134
+ it 'calls the Imagemagick transform' do
135
+ expect(Riiif::CommandRunner).to receive(:execute)
136
+ .with('kdu_expand -quiet -i baseball.jp2 -num_threads 4 -reduce 2 -o /tmp/foo.bmp')
137
+ expect(Riiif::CommandRunner).to receive(:execute)
138
+ .with('convert -resize 80.0% -quality 85 -sampling-factor 4:2:0 -strip /tmp/foo.bmp jpg:-')
139
+ transform
140
+ end
141
+ end
142
+ end
143
+ end
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: 1.7.1
4
+ version: 2.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Coyne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-14 00:00:00.000000000 Z
11
+ date: 2017-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -78,14 +78,14 @@ dependencies:
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '2.0'
81
+ version: '0.8'
82
82
  type: :development
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: '2.0'
88
+ version: '0.8'
89
89
  - !ruby/object:Gem::Dependency
90
90
  name: rspec-rails
91
91
  requirement: !ruby/object:Gem::Requirement
@@ -177,28 +177,37 @@ 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
+ - app/resolvers/riiif/abstract_file_system_resolver.rb
182
+ - app/resolvers/riiif/akubra_system_file_resolver.rb
183
+ - app/resolvers/riiif/file_system_file_resolver.rb
184
+ - app/resolvers/riiif/http_file_resolver.rb
180
185
  - app/services/riiif/command_runner.rb
186
+ - app/services/riiif/crop.rb
181
187
  - app/services/riiif/image_magick_info_extractor.rb
182
188
  - app/services/riiif/imagemagick_command_factory.rb
189
+ - app/services/riiif/imagemagick_transformer.rb
190
+ - app/services/riiif/kakadu_command_factory.rb
191
+ - app/services/riiif/link_name_service.rb
192
+ - app/services/riiif/nil_authorization_service.rb
183
193
  - app/services/riiif/option_decoder.rb
184
- - app/services/riiif/region/imagemagick/absolute_decoder.rb
185
- - app/services/riiif/region/imagemagick/full_decoder.rb
186
- - app/services/riiif/region/imagemagick/percentage_decoder.rb
187
- - app/services/riiif/region/imagemagick/square_decoder.rb
188
- - app/services/riiif/size/imagemagick/absolute_decoder.rb
189
- - app/services/riiif/size/imagemagick/best_fit_decoder.rb
190
- - app/services/riiif/size/imagemagick/full_decoder.rb
191
- - app/services/riiif/size/imagemagick/height_decoder.rb
192
- - app/services/riiif/size/imagemagick/percent_decoder.rb
193
- - app/services/riiif/size/imagemagick/width_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
+ - 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
+ - app/transformers/riiif/abstract_transformer.rb
206
+ - app/transformers/riiif/imagemagick_transformer.rb
207
+ - app/transformers/riiif/kakadu_transformer.rb
194
208
  - config/routes.rb
195
209
  - lib/riiif.rb
196
- - lib/riiif/abstract_file_system_resolver.rb
197
- - lib/riiif/akubra_system_file_resolver.rb
198
210
  - lib/riiif/engine.rb
199
- - lib/riiif/file_system_file_resolver.rb
200
- - lib/riiif/http_file_resolver.rb
201
- - lib/riiif/nil_authorization_service.rb
202
211
  - lib/riiif/rails/routes.rb
203
212
  - lib/riiif/routes.rb
204
213
  - lib/riiif/version.rb
@@ -209,12 +218,19 @@ files:
209
218
  - spec/models/riiif/http_file_resolver_spec.rb
210
219
  - spec/models/riiif/image_information_spec.rb
211
220
  - spec/models/riiif/image_spec.rb
221
+ - spec/models/riiif/transformation_spec.rb
212
222
  - spec/routing/redirect_spec.rb
213
223
  - spec/routing/resize_routes_spec.rb
214
224
  - spec/services/riiif/imagemagick_command_factory_spec.rb
225
+ - 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
215
230
  - spec/spec_helper.rb
216
231
  - spec/test_app_templates/Gemfile.extra
217
232
  - spec/test_app_templates/lib/generators/test_app_generator.rb
233
+ - spec/transformers/riiif/kakadu_transformer_spec.rb
218
234
  homepage: https://github.com/curationexperts/riiif
219
235
  licenses:
220
236
  - APACHE2
@@ -230,12 +246,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
230
246
  version: '0'
231
247
  required_rubygems_version: !ruby/object:Gem::Requirement
232
248
  requirements:
233
- - - ">="
249
+ - - ">"
234
250
  - !ruby/object:Gem::Version
235
- version: '0'
251
+ version: 1.3.1
236
252
  requirements: []
237
253
  rubyforge_project:
238
- rubygems_version: 2.6.11
254
+ rubygems_version: 2.6.13
239
255
  signing_key:
240
256
  specification_version: 4
241
257
  summary: A rails engine that support IIIF requests
@@ -246,9 +262,16 @@ test_files:
246
262
  - spec/models/riiif/http_file_resolver_spec.rb
247
263
  - spec/models/riiif/image_information_spec.rb
248
264
  - spec/models/riiif/image_spec.rb
265
+ - spec/models/riiif/transformation_spec.rb
249
266
  - spec/routing/redirect_spec.rb
250
267
  - spec/routing/resize_routes_spec.rb
251
268
  - spec/services/riiif/imagemagick_command_factory_spec.rb
269
+ - 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
252
274
  - spec/spec_helper.rb
253
275
  - spec/test_app_templates/Gemfile.extra
254
276
  - spec/test_app_templates/lib/generators/test_app_generator.rb
277
+ - spec/transformers/riiif/kakadu_transformer_spec.rb
@@ -1,21 +0,0 @@
1
- module Riiif
2
- module Region
3
- module Imagemagick
4
- # decodes requested cooridnates into an imagemagick crop directive
5
- class AbsoluteDecoder
6
- def initialize(x, y, width, height)
7
- @x = x
8
- @y = y
9
- @width = width
10
- @height = height
11
- end
12
-
13
- # @return [String] a region for imagemagick to decode
14
- # (appropriate for passing to the -crop parameter)
15
- def decode
16
- "#{@width}x#{@height}+#{@x}+#{@y}"
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,14 +0,0 @@
1
- module Riiif
2
- module Region
3
- module Imagemagick
4
- # The image or region is not scaled, and is returned at its full size.
5
- class FullDecoder
6
- # @return [NilClass] a region for imagemagick to decode
7
- # the nil implies no cropping needed
8
- def decode
9
- nil
10
- end
11
- end
12
- end
13
- end
14
- end
@@ -1,33 +0,0 @@
1
- module Riiif
2
- module Region
3
- module Imagemagick
4
- # decodes requested cooridnates into an imagemagick crop directive
5
- class PercentageDecoder
6
- def initialize(image_info, x, y, width, height)
7
- @image_info = image_info
8
- @x = x
9
- @y = y
10
- @width = width
11
- @height = height
12
- end
13
-
14
- # Imagemagick can't do percentage offsets, so we have to calculate it
15
- # @return [String] a region for imagemagick to decode
16
- # (appropriate for passing to the -crop parameter)
17
- def decode
18
- "#{@width}%x#{@height}+#{offset_x}+#{offset_y}"
19
- end
20
-
21
- private
22
-
23
- def offset_x
24
- (@image_info.width * Integer(@x).to_f / 100).round
25
- end
26
-
27
- def offset_y
28
- (@image_info.height * Integer(@y).to_f / 100).round
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,25 +0,0 @@
1
- module Riiif
2
- module Region
3
- module Imagemagick
4
- # decodes requested cooridnates into an imagemagick crop directive
5
- class SquareDecoder
6
- def initialize(image_info)
7
- @image_info = image_info
8
- end
9
-
10
- # @return [String] a square region for imagemagick to decode
11
- # (appropriate for passing to the -crop parameter)
12
- def decode
13
- min, max = [@image_info.width, @image_info.height].minmax
14
-
15
- offset = (max - min) / 2
16
- if @image_info.height >= @image_info.width
17
- "#{min}x#{min}+0+#{offset}"
18
- else
19
- "#{min}x#{min}+#{offset}+0"
20
- end
21
- end
22
- end
23
- end
24
- end
25
- end
@@ -1,20 +0,0 @@
1
- module Riiif
2
- module Size
3
- module Imagemagick
4
- # The width and height of the returned image are exactly w and h.
5
- # The aspect ratio of the returned image may be different than the extracted
6
- # region, resulting in a distorted image.
7
- class AbsoluteDecoder
8
- def initialize(width, height)
9
- @width = width
10
- @height = height
11
- end
12
-
13
- # @return [String] a resize directive for imagemagick to use
14
- def decode
15
- "#{@width}x#{@height}!"
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,19 +0,0 @@
1
- module Riiif
2
- module Size
3
- module Imagemagick
4
- # The image content is scaled for the best fit such that the resulting width and
5
- # height are less than or equal to the requested width and height.
6
- class BestFitDecoder
7
- def initialize(width, height)
8
- @width = width
9
- @height = height
10
- end
11
-
12
- # @return [String] a resize directive for imagemagick to use
13
- def decode
14
- "#{@width}x#{@height}"
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,14 +0,0 @@
1
- module Riiif
2
- module Size
3
- module Imagemagick
4
- # decodes requested size into an imagemagick resize directive
5
- class FullDecoder
6
- # @return [NilClass] a size for imagemagick to decode
7
- # the nil implies no resizing needed
8
- def decode
9
- nil
10
- end
11
- end
12
- end
13
- end
14
- end
@@ -1,19 +0,0 @@
1
- module Riiif
2
- module Size
3
- module Imagemagick
4
- # The image or region should be scaled so that its height is exactly equal
5
- # to the provided parameter, and the width will be a calculated value that
6
- # maintains the aspect ratio of the extracted region
7
- class HeightDecoder
8
- def initialize(height)
9
- @height = height
10
- end
11
-
12
- # @return [String] a resize directive for imagemagick to use
13
- def decode
14
- "x#{@height}"
15
- end
16
- end
17
- end
18
- end
19
- end