riiif 1.4.3 → 1.4.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9f437c07332a02c21a6dee64125a02b1d124bdec
4
- data.tar.gz: ac97febcbbfb128653e242a47120cfce675f40a0
3
+ metadata.gz: 5a89139fdccd2b6824042ae7bdae9880eb28d334
4
+ data.tar.gz: 7b13b9280123669a73aa533a50f218f9daccdb53
5
5
  SHA512:
6
- metadata.gz: c876a1694e4d26f2bfccb67b1182fb8659410cf740fa0abacb3e796d9ab31f0044bc90bed00e788f6c205752a237eb84bac9f2f6cea42b559157a55c6a9c87f5
7
- data.tar.gz: 3b5733068a706304b8dd2920fdd34dcf3853a2cef5bc7d9ef5dfcc4ccd568c5b7cb7bdf48f03fa4811331abae4418a5c9aa6d4c562c75ec541834568ac548935
6
+ metadata.gz: a3174488a09bcb1ecad59db2a8d7e338ab863af1d2a5afe07bbd746fd161ced2a0cf4bfc4ac85c9d4067fd41d089525e8419c0bc489be8f1cd8755e7718dfeed
7
+ data.tar.gz: 6afbc6db3a6029f38c35f46c204402c84de393ea1327fd3455e4ae0e798856e8c8726e9ad8e8e8526c5846392880d35c1ba60f45badb5a6c76d6942ef8cea323
@@ -33,10 +33,12 @@ module Riiif
33
33
  def info
34
34
  image = model.new(image_id)
35
35
  if authorization_service.can?(:info, image)
36
+ image_info = image.info
37
+ return render json: { error: 'no info' }, status: :not_found unless image_info.valid?
36
38
  headers['Access-Control-Allow-Origin'] = '*'
37
39
  # Set a Cache-Control header
38
40
  expires_in cache_expires, public: public_cache?
39
- render json: image.info.to_h.merge(server_info), content_type: 'application/ld+json'
41
+ render json: image_info.to_h.merge(server_info), content_type: 'application/ld+json'
40
42
  else
41
43
  render json: { error: 'unauthorized' }, status: :unauthorized
42
44
  end
@@ -0,0 +1,28 @@
1
+ module Riiif
2
+ # This is the result of calling the Riiif.image_info service. It stores the height & width
3
+ class ImageInformation
4
+ def initialize(width, height)
5
+ @width = width
6
+ @height = height
7
+ end
8
+
9
+ attr_reader :width, :height
10
+
11
+ def to_h
12
+ { width: width, height: height }
13
+ end
14
+
15
+ # Image information is only valid if height and width are present.
16
+ # If an image info service doesn't have the value yet (not characterized perhaps?)
17
+ # then we wouldn't want to cache this value.
18
+ def valid?
19
+ width.present? && height.present?
20
+ end
21
+
22
+ def ==(other)
23
+ other.class == self.class &&
24
+ other.width == width &&
25
+ other.height == height
26
+ end
27
+ end
28
+ end
data/lib/riiif/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Riiif
2
- VERSION = '1.4.3'.freeze
2
+ VERSION = '1.4.4'.freeze
3
3
  end
data/lib/riiif.rb CHANGED
@@ -13,11 +13,11 @@ module Riiif
13
13
  class Error < RuntimeError; end
14
14
  class InvalidAttributeError < Error; end
15
15
  class ImageNotFoundError < Error; end
16
+
16
17
  # This error is raised when Riiif can't convert an image
17
18
  class ConversionError < Error; end
18
19
 
19
20
  Transformation = Struct.new(:crop, :size, :quality, :rotation, :format)
20
- ImageInformation = Struct.new(:width, :height)
21
21
  mattr_accessor :not_found_image # the image to use when a lookup fails
22
- mattr_accessor :unauthorized_image # the image to use when a lookup fails
22
+ mattr_accessor :unauthorized_image # the image to use when a user doesn't have access
23
23
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'open-uri'
3
3
 
4
- describe Riiif::ImagesController do
4
+ RSpec.describe Riiif::ImagesController do
5
5
  let(:filename) { File.expand_path('spec/samples/world.jp2') }
6
6
  routes { Riiif::Engine.routes }
7
7
 
@@ -19,6 +19,7 @@ describe Riiif::ImagesController do
19
19
  end
20
20
  end
21
21
  end
22
+
22
23
  describe '#show' do
23
24
  it 'sends images to the service' do
24
25
  image = double
@@ -131,23 +132,45 @@ describe Riiif::ImagesController do
131
132
  end
132
133
 
133
134
  describe 'info' do
134
- it 'returns info' do
135
- image = double
136
- expect(Riiif::Image).to receive(:new).with('abcd1234').and_return(image)
137
- expect(image).to receive(:info).and_return(Riiif::ImageInformation.new(6000, 4000))
138
- get :info, params: { id: 'abcd1234', format: 'json' }
139
- expect(response).to be_successful
140
- json = JSON.parse(response.body)
141
- expect(json).to eq '@context' => 'http://iiif.io/api/image/2/context.json',
142
- '@id' => 'http://test.host/abcd1234',
143
- 'width' => 6000,
144
- 'height' => 4000,
145
- 'profile' => ['http://iiif.io/api/image/2/level1.json', 'formats' => %w(jpg png)],
146
- 'protocol' => 'http://iiif.io/api/image'
147
- expect(response.headers['Link']).to eq '<http://iiif.io/api/image/2/level1.json>;rel="profile"'
148
- expect(response.headers['Content-Type']).to eq 'application/ld+json; charset=utf-8'
149
- expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
150
- expect(response.headers['Cache-Control']).to eq "max-age=#{1.year.to_i}, private"
135
+ context 'the happy path' do
136
+ let(:image) { double }
137
+ let(:json) { JSON.parse(response.body) }
138
+
139
+ before do
140
+ allow(Riiif::Image).to receive(:new).with('abcd1234').and_return(image)
141
+ allow(image).to receive(:info).and_return(Riiif::ImageInformation.new(6000, 4000))
142
+ end
143
+
144
+ it 'returns info' do
145
+ get :info, params: { id: 'abcd1234', format: 'json' }
146
+ expect(response).to be_successful
147
+ expect(json).to eq '@context' => 'http://iiif.io/api/image/2/context.json',
148
+ '@id' => 'http://test.host/abcd1234',
149
+ 'width' => 6000,
150
+ 'height' => 4000,
151
+ 'profile' => ['http://iiif.io/api/image/2/level1.json', 'formats' => %w(jpg png)],
152
+ 'protocol' => 'http://iiif.io/api/image'
153
+ expect(response.headers['Link']).to eq '<http://iiif.io/api/image/2/level1.json>;rel="profile"'
154
+ expect(response.headers['Content-Type']).to eq 'application/ld+json; charset=utf-8'
155
+ expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
156
+ expect(response.headers['Cache-Control']).to eq "max-age=#{1.year.to_i}, private"
157
+ end
158
+ end
159
+
160
+ context 'when the info_service has an invalid result' do
161
+ let(:image) { double }
162
+ let(:json) { JSON.parse(response.body) }
163
+
164
+ before do
165
+ allow(Riiif::Image).to receive(:new).with('abcd1234').and_return(image)
166
+ allow(image).to receive(:info).and_return(Riiif::ImageInformation.new(nil, nil))
167
+ end
168
+
169
+ it 'returns an error' do
170
+ get :info, params: { id: 'abcd1234', format: 'json' }
171
+ expect(response).to be_not_found
172
+ expect(json).to eq 'error' => 'no info'
173
+ end
151
174
  end
152
175
 
153
176
  context 'with an unauthorized image' do
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Riiif::ImageInformation do
4
+ describe '#valid?' do
5
+ subject { info.valid? }
6
+
7
+ context 'with valid dimensions' do
8
+ let(:info) { described_class.new(100, 200) }
9
+
10
+ it { is_expected.to be true }
11
+ end
12
+
13
+ context 'with nil dimensions' do
14
+ let(:info) { described_class.new(nil, nil) }
15
+
16
+ it { is_expected.to be false }
17
+ end
18
+ end
19
+ 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.4.3
4
+ version: 1.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Coyne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-20 00:00:00.000000000 Z
11
+ date: 2017-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -148,6 +148,7 @@ files:
148
148
  - app/controllers/riiif/images_controller.rb
149
149
  - app/models/riiif/file.rb
150
150
  - app/models/riiif/image.rb
151
+ - app/models/riiif/image_information.rb
151
152
  - app/services/riiif/command_runner.rb
152
153
  - app/services/riiif/image_magick_info_extractor.rb
153
154
  - app/services/riiif/imagemagick_command_factory.rb
@@ -177,6 +178,7 @@ files:
177
178
  - spec/models/riiif/akubra_system_file_resolver_spec.rb
178
179
  - spec/models/riiif/file_system_file_resolver_spec.rb
179
180
  - spec/models/riiif/http_file_resolver_spec.rb
181
+ - spec/models/riiif/image_information_spec.rb
180
182
  - spec/models/riiif/image_spec.rb
181
183
  - spec/routing/redirect_spec.rb
182
184
  - spec/routing/resize_routes_spec.rb
@@ -204,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
204
206
  version: '0'
205
207
  requirements: []
206
208
  rubyforge_project:
207
- rubygems_version: 2.5.2
209
+ rubygems_version: 2.6.12
208
210
  signing_key:
209
211
  specification_version: 4
210
212
  summary: A rails engine that support IIIF requests
@@ -213,6 +215,7 @@ test_files:
213
215
  - spec/models/riiif/akubra_system_file_resolver_spec.rb
214
216
  - spec/models/riiif/file_system_file_resolver_spec.rb
215
217
  - spec/models/riiif/http_file_resolver_spec.rb
218
+ - spec/models/riiif/image_information_spec.rb
216
219
  - spec/models/riiif/image_spec.rb
217
220
  - spec/routing/redirect_spec.rb
218
221
  - spec/routing/resize_routes_spec.rb