riiif 1.5.1 → 1.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 467ee3abb93cc36ac8131647ebe8a7bd074abe34
4
- data.tar.gz: cb3acc22191a073f47522887ee649674b7196839
3
+ metadata.gz: c0bb1c35a0544e1cf55ab8af94b47ba48edcb6de
4
+ data.tar.gz: a591cfb9fe134db6b9ab8e68ca20b4d6008e859d
5
5
  SHA512:
6
- metadata.gz: 6467d2920aac954f97b7b290fb3e7b18481865f6fbe359a005bfedbb8b76ce24f35b404d2d8c2436b415a2eaa861597f9fa31c9a43c105893a9b9fe7fdd49e15
7
- data.tar.gz: fc26e3a58da0f6328bd76bdf5f4881aeeb8293b79dd383124a091196d9d2b7d476f7824c65f0b1bf12ad2d82a24786dc953698db9e51d9502ba533e43626fd40
6
+ metadata.gz: 69e0af123b2b0d0bf47f7c8c156bb58f88fa48f8534ce3b15a3b30c24b214acbfc832d238fbf7bf7afbd71b3df6898d91d0756ecb462f45d7cc6e032c28e0a5a
7
+ data.tar.gz: 9fe0ca382348abcb23fc7f5b684a125b14116d96a98fdfc62e13b11644c7907f69e1035c90ef2735c1c9ef8a8bc79fc0f81c95a4349a2bc56d6935c0c14eb039
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # Riiif
2
2
  [![Gem Version](https://badge.fury.io/rb/riiif.png)](http://badge.fury.io/rb/riiif)
3
+ [![Coverage Status](https://coveralls.io/repos/github/curationexperts/riiif/badge.svg?branch=master)](https://coveralls.io/github/curationexperts/riiif?branch=master)
3
4
 
4
5
  A Ruby IIIF image server as a rails engine
5
6
 
@@ -77,9 +77,9 @@ module Riiif
77
77
  ##
78
78
  # @return [ActiveSupport::HashWithIndifferentAccess]
79
79
  def image_request_params
80
- result = params.permit(:region, :size, :rotation, :quality, :format).to_h
80
+ result = params.permit(:region, :size, :rotation, :quality, :format, :model, :id).to_h
81
81
  return result.with_indifferent_access if Rails.version < '5'
82
- result
82
+ result.except(:model, :id)
83
83
  end
84
84
 
85
85
  def authorization_service
@@ -18,6 +18,7 @@ module Riiif
18
18
  end
19
19
  end
20
20
  end
21
+ deprecation_deprecate read: 'Riiif::File.read is deprecated and will be removed in version 2.0'
21
22
 
22
23
  def self.create(ext = nil, _validate = true, &block)
23
24
  tempfile = Tempfile.new(['mini_magick', ext.to_s.downcase])
@@ -28,6 +29,7 @@ module Riiif
28
29
  ensure
29
30
  tempfile.close if tempfile
30
31
  end
32
+ deprecation_deprecate create: 'Riiif::File.create is deprecated and will be removed in version 2.0'
31
33
 
32
34
  # @param [Transformation] transformation
33
35
  def extract(transformation)
@@ -17,9 +17,12 @@ require_dependency 'riiif/size/imagemagick/percent_decoder'
17
17
  require_dependency 'riiif/size/imagemagick/width_decoder'
18
18
 
19
19
  module Riiif
20
+ # rubocop:disable Metrics/ClassLength
20
21
  class Image
22
+ extend Deprecation
23
+
21
24
  class_attribute :file_resolver, :info_service, :authorization_service, :cache
22
- self.file_resolver = FileSystemFileResolver.new
25
+ self.file_resolver = FileSystemFileResolver.new(base_path: File.join(Rails.root, 'tmp'))
23
26
  self.authorization_service = NilAuthorizationService
24
27
  self.cache = Rails.cache
25
28
 
@@ -40,27 +43,32 @@ module Riiif
40
43
 
41
44
  # @param [String] id The identifier of the file to be looked up.
42
45
  # @param [Riiif::File] file Optional: The Riiif::File to use instead of looking one up.
43
- def initialize(id, file = nil)
46
+ def initialize(id, passed_file = nil)
44
47
  @id = id
45
- @image = file if file.present?
48
+ @file = passed_file if passed_file.present?
46
49
  end
47
50
 
48
- def image
49
- @image ||= file_resolver.find(id)
51
+ def file
52
+ @file ||= file_resolver.find(id)
50
53
  end
51
54
 
55
+ alias image file
56
+ deprecation_deprecate image: 'Use Image#file instead. This will be removed in riiif 2.0'
57
+
52
58
  ##
53
59
  # @param [ActiveSupport::HashWithIndifferentAccess] args
54
60
  def render(args)
55
- options = decode_options!(args)
56
- cache.fetch(Image.cache_key(id, options), compress: true, expires_in: Image.expires_in) do
57
- image.extract(options)
61
+ cache_opts = args.select { |a| %w(region size quality rotation format).include? a.to_s }
62
+ key = Image.cache_key(id, cache_opts)
63
+
64
+ cache.fetch(key, compress: true, expires_in: Image.expires_in) do
65
+ file.extract(decode_options!(args))
58
66
  end
59
67
  end
60
68
 
61
69
  def info
62
70
  @info ||= begin
63
- result = info_service.call(id, image)
71
+ result = info_service.call(id, file)
64
72
  ImageInformation.new(result[:width], result[:height])
65
73
  end
66
74
  end
@@ -71,7 +79,11 @@ module Riiif
71
79
  end
72
80
 
73
81
  def cache_key(id, options)
74
- str = options.to_h.merge(id: id).delete_if { |_, v| v.nil? }.to_s
82
+ str = options.to_h.merge(id: id)
83
+ .delete_if { |_, v| v.nil? }
84
+ .sort_by { |k, _v| k.to_s }
85
+ .to_s
86
+
75
87
  # Use a MD5 digest to ensure the keys aren't too long, and a prefix
76
88
  # to avoid collisions with other components in shared cache.
77
89
  'riiif:' + Digest::MD5.hexdigest(str)
@@ -147,4 +159,5 @@ module Riiif
147
159
  end
148
160
  # rubocop:enable Metrics/PerceivedComplexity
149
161
  end
162
+ # rubocop:enable Metrics/ClassLength
150
163
  end
@@ -1,12 +1,23 @@
1
+ require 'deprecation'
1
2
  module Riiif
2
3
  class AbstractFileSystemResolver
3
- attr_accessor :root, :base_path
4
+ extend Deprecation
5
+ attr_accessor :base_path
4
6
 
5
- def initialize
6
- @root = ::File.expand_path(::File.join(::File.dirname(__FILE__), '../..'))
7
- @base_path = ::File.join(root, 'spec/samples')
7
+ def initialize(base_path: nil)
8
+ @base_path = base_path || default_base_path
8
9
  end
9
10
 
11
+ def default_base_path
12
+ Deprecation.warn(self, 'Initializing a file resolver without setting the base path ' \
13
+ 'is deprecated and will be removed in Riiif 2.0', caller(2))
14
+ @root ||= ::File.expand_path(::File.join(::File.dirname(__FILE__), '../..'))
15
+ ::File.join(@root, 'spec/samples')
16
+ end
17
+
18
+ attr_reader :root
19
+ deprecation_deprecate :root
20
+
10
21
  def find(id)
11
22
  Riiif::File.new(path(id))
12
23
  end
data/lib/riiif/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Riiif
2
- VERSION = '1.5.1'.freeze
2
+ VERSION = '1.6.0'.freeze
3
3
  end
data/riiif.gemspec CHANGED
@@ -27,4 +27,5 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency 'sqlite3'
28
28
  spec.add_development_dependency 'rubocop', '~> 0.47.1'
29
29
  spec.add_development_dependency 'rubocop-rspec', '~> 1.13'
30
+ spec.add_development_dependency 'coveralls'
30
31
  end
@@ -1,7 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Riiif::FileSystemFileResolver do
4
- let(:resolver) { described_class.new }
4
+ let(:root) { File.expand_path(::File.join(::File.dirname(__FILE__), '../../..')) }
5
+ let(:base_path) { ::File.join(root, 'spec/samples') }
6
+ let(:resolver) { described_class.new(base_path: base_path) }
5
7
 
6
8
  describe '#find' do
7
9
  subject { resolver.find(id) }
@@ -16,13 +18,13 @@ describe Riiif::FileSystemFileResolver do
16
18
  context 'when a jpeg2000 file is found' do
17
19
  let(:id) { 'world' }
18
20
  it 'returns the jpeg2000 file' do
19
- expect(subject.path).to eq resolver.root + '/spec/samples/world.jp2'
21
+ expect(subject.path).to eq base_path + '/world.jp2'
20
22
  end
21
23
  end
22
24
  end
23
25
 
24
26
  describe '#input_types' do
25
- subject { described_class.new.send(:input_types) }
27
+ subject { resolver.send(:input_types) }
26
28
 
27
29
  it 'includes jp2 extension' do
28
30
  expect(subject).to include 'jp2'
@@ -1,12 +1,21 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe Riiif::Image do
4
- before { Riiif::Image.cache.clear }
4
+ subject(:image) { described_class.new('world') }
5
+
6
+ let(:root) { File.expand_path(::File.join(::File.dirname(__FILE__), '../../..')) }
7
+ let(:base_path) { ::File.join(root, 'spec/samples') }
8
+ let(:resolver) { Riiif::FileSystemFileResolver.new(base_path: base_path) }
5
9
  let(:filename) { File.expand_path('spec/samples/world.jp2') }
6
- subject { described_class.new('world') }
10
+
11
+ before do
12
+ described_class.file_resolver = resolver
13
+ Riiif::Image.cache.clear
14
+ end
15
+
7
16
  describe 'happy path' do
8
17
  before do
9
- expect(subject.image).to receive(:execute)
18
+ expect(subject.file).to receive(:execute)
10
19
  .with("convert -quality 85 -sampling-factor 4:2:0 -strip #{filename} jpg:-")
11
20
  .and_return('imagedata')
12
21
  end
@@ -41,7 +50,7 @@ RSpec.describe Riiif::Image do
41
50
  end
42
51
  end
43
52
  after do
44
- described_class.file_resolver = Riiif::FileSystemFileResolver.new
53
+ described_class.file_resolver = resolver
45
54
  end
46
55
 
47
56
  describe 'get info' do
@@ -62,104 +71,226 @@ RSpec.describe Riiif::Image do
62
71
  end
63
72
  end
64
73
 
65
- describe 'mogrify' do
74
+ describe '#render' do
66
75
  describe 'region' do
67
- it 'returns the original when specifing full size' do
68
- expect(Riiif::CommandRunner).to receive(:execute).with("convert -strip #{filename} png:-")
69
- subject.render(region: 'full', format: 'png')
76
+ subject(:render) { image.render(region: region, format: 'png') }
77
+
78
+ before do
79
+ allow(Riiif::CommandRunner).to receive(:execute)
80
+ .with("identify -format %hx%w #{filename}[0]").and_return('131x175')
70
81
  end
71
- it 'handles absolute geometry' do
72
- expect(Riiif::CommandRunner).to receive(:execute).with("convert -crop 60x75+80+15 -strip #{filename} png:-")
73
- subject.render(region: '80,15,60,75', format: 'png')
82
+
83
+ context 'when specifing full size' do
84
+ let(:region) { 'full' }
85
+
86
+ it 'returns the original' do
87
+ expect(Riiif::CommandRunner).to receive(:execute)
88
+ .with("convert -strip #{filename} png:-")
89
+ render
90
+ end
74
91
  end
75
92
 
76
- it 'handles percent geometry' do
77
- expect(Riiif::CommandRunner).to receive(:execute)
78
- .with("identify -format %hx%w #{filename}[0]").and_return('131x175')
79
- expect(Riiif::CommandRunner).to receive(:execute).with("convert -crop 80%x70+18+13 -strip #{filename} png:-")
80
- subject.render(region: 'pct:10,10,80,70', format: 'png')
93
+ context 'when specifing absolute geometry' do
94
+ let(:region) { '80,15,60,75' }
95
+
96
+ it 'runs the correct imagemagick command' do
97
+ expect(Riiif::CommandRunner).to receive(:execute)
98
+ .with("convert -crop 60x75+80+15 -strip #{filename} png:-")
99
+ render
100
+ end
81
101
  end
82
102
 
83
- it 'handles square geometry' do
84
- expect(Riiif::CommandRunner).to receive(:execute)
85
- .with("identify -format %hx%w #{filename}[0]").and_return('131x175')
86
- expect(Riiif::CommandRunner).to receive(:execute).with("convert -crop 131x131+22+0 -strip #{filename} png:-")
87
- subject.render(region: 'square', format: 'png')
103
+ context 'when specifing percent geometry' do
104
+ let(:region) { 'pct:10,10,80,70' }
105
+
106
+ it 'runs the correct imagemagick command' do
107
+ expect(Riiif::CommandRunner).to receive(:execute)
108
+ .with("convert -crop 80%x70+18+13 -strip #{filename} png:-")
109
+ render
110
+ end
88
111
  end
89
- it 'raises an error for invalid geometry' do
90
- expect { subject.render(region: '150x75', format: 'png') }.to raise_error Riiif::InvalidAttributeError
112
+
113
+ context 'when specifing square geometry' do
114
+ let(:region) { 'square' }
115
+
116
+ it 'runs the correct imagemagick command' do
117
+ expect(Riiif::CommandRunner).to receive(:execute)
118
+ .with("convert -crop 131x131+22+0 -strip #{filename} png:-")
119
+ render
120
+ end
121
+ end
122
+
123
+ context 'when the geometry is invalid' do
124
+ let(:region) { '150x75' }
125
+
126
+ it 'raises an error' do
127
+ expect { render }.to raise_error Riiif::InvalidAttributeError
128
+ end
91
129
  end
92
130
  end
93
131
 
94
132
  describe 'resize' do
95
- it 'returns the original when specifing full size' do
96
- expect(Riiif::CommandRunner).to receive(:execute).with("convert -strip #{filename} png:-")
97
- subject.render(size: 'full', format: 'png')
133
+ subject(:render) { image.render(size: size, format: 'png') }
134
+
135
+ context 'when specifing full size' do
136
+ let(:size) { 'full' }
137
+
138
+ it 'returns the original' do
139
+ expect(Riiif::CommandRunner).to receive(:execute)
140
+ .with("convert -strip #{filename} png:-")
141
+ render
142
+ end
98
143
  end
99
- it 'handles integer percent sizes' do
100
- expect(Riiif::CommandRunner).to receive(:execute).with("convert -resize 50% -strip #{filename} png:-")
101
- subject.render(size: 'pct:50', format: 'png')
144
+
145
+ context 'when specifing percent size' do
146
+ let(:size) { 'pct:50' }
147
+
148
+ it 'runs the correct imagemagick command' do
149
+ expect(Riiif::CommandRunner).to receive(:execute)
150
+ .with("convert -resize 50% -strip #{filename} png:-")
151
+ render
152
+ end
102
153
  end
103
- it 'handles float percent sizes' do
104
- expect(Riiif::CommandRunner).to receive(:execute).with("convert -resize 12.5% -strip #{filename} png:-")
105
- subject.render(size: 'pct:12.5', format: 'png')
154
+
155
+ context 'when specifing float percent size' do
156
+ let(:size) { 'pct:12.5' }
157
+
158
+ it 'runs the correct imagemagick command' do
159
+ expect(Riiif::CommandRunner).to receive(:execute)
160
+ .with("convert -resize 12.5% -strip #{filename} png:-")
161
+ render
162
+ end
106
163
  end
107
- it 'handles w,' do
108
- expect(Riiif::CommandRunner).to receive(:execute).with("convert -resize 50 -strip #{filename} png:-")
109
- subject.render(size: '50,', format: 'png')
164
+
165
+ context 'when specifing w, size' do
166
+ let(:size) { '50,' }
167
+
168
+ it 'runs the correct imagemagick command' do
169
+ expect(Riiif::CommandRunner).to receive(:execute)
170
+ .with("convert -resize 50 -strip #{filename} png:-")
171
+ render
172
+ end
110
173
  end
111
- it 'handles ,h' do
112
- expect(Riiif::CommandRunner).to receive(:execute).with("convert -resize x50 -strip #{filename} png:-")
113
- subject.render(size: ',50', format: 'png')
174
+
175
+ context 'when specifing ,h size' do
176
+ let(:size) { ',50' }
177
+
178
+ it 'runs the correct imagemagick command' do
179
+ expect(Riiif::CommandRunner).to receive(:execute)
180
+ .with("convert -resize x50 -strip #{filename} png:-")
181
+ render
182
+ end
114
183
  end
115
- it 'handles w,h' do
116
- expect(Riiif::CommandRunner).to receive(:execute).with("convert -resize 150x75! -strip #{filename} png:-")
117
- subject.render(size: '150,75', format: 'png')
184
+
185
+ context 'when specifing w,h size' do
186
+ let(:size) { '150,75' }
187
+
188
+ it 'runs the correct imagemagick command' do
189
+ expect(Riiif::CommandRunner).to receive(:execute)
190
+ .with("convert -resize 150x75! -strip #{filename} png:-")
191
+ render
192
+ end
118
193
  end
119
- it 'handles bestfit (!w,h)' do
120
- expect(Riiif::CommandRunner).to receive(:execute).with("convert -resize 150x75 -strip #{filename} png:-")
121
- subject.render(size: '!150,75', format: 'png')
194
+ context 'when specifing bestfit (!w,h) size' do
195
+ let(:size) { '!150,75' }
196
+
197
+ it 'runs the correct imagemagick command' do
198
+ expect(Riiif::CommandRunner).to receive(:execute)
199
+ .with("convert -resize 150x75 -strip #{filename} png:-")
200
+ render
201
+ end
122
202
  end
123
- it 'raises an error for invalid size' do
124
- expect { subject.render(size: '150x75', format: 'png') }.to raise_error Riiif::InvalidAttributeError
203
+
204
+ context 'when the geometry is invalid' do
205
+ let(:size) { '150x75' }
206
+
207
+ it 'raises an error' do
208
+ expect { render }.to raise_error Riiif::InvalidAttributeError
209
+ end
125
210
  end
126
211
  end
127
212
 
128
213
  describe 'rotate' do
129
- it 'returns the original when specifing full size' do
130
- expect(Riiif::CommandRunner).to receive(:execute).with("convert -strip #{filename} png:-")
131
- subject.render(rotation: '0', format: 'png')
214
+ subject(:render) { image.render(rotation: rotation, format: 'png') }
215
+
216
+ context 'without rotating' do
217
+ let(:rotation) { '0' }
218
+
219
+ it 'returns the original' do
220
+ expect(Riiif::CommandRunner).to receive(:execute)
221
+ .with("convert -strip #{filename} png:-")
222
+ render
223
+ end
132
224
  end
133
- it 'handles floats' do
134
- expect(Riiif::CommandRunner).to receive(:execute)
135
- .with("convert -virtual-pixel white +distort srt 22.5 -strip #{filename} png:-")
136
- subject.render(rotation: '22.5', format: 'png')
225
+
226
+ context 'with a float value' do
227
+ let(:rotation) { '22.5' }
228
+
229
+ it 'handles floats' do
230
+ expect(Riiif::CommandRunner).to receive(:execute)
231
+ .with("convert -virtual-pixel white +distort srt 22.5 -strip #{filename} png:-")
232
+ render
233
+ end
137
234
  end
138
- it 'raises an error for invalid angle' do
139
- expect { subject.render(rotation: '150x', format: 'png') }.to raise_error Riiif::InvalidAttributeError
235
+
236
+ context 'with an invalid value' do
237
+ let(:rotation) { '150x' }
238
+
239
+ it 'raises an error for invalid angle' do
240
+ expect { render }.to raise_error Riiif::InvalidAttributeError
241
+ end
140
242
  end
141
243
  end
142
244
 
143
245
  describe 'quality' do
144
- it 'returns the original when specifing default' do
145
- expect(Riiif::CommandRunner).to receive(:execute).with("convert -strip #{filename} png:-")
146
- subject.render(quality: 'default', format: 'png')
246
+ subject(:render) { image.render(quality: quality, format: 'png') }
247
+
248
+ context 'when default is specified' do
249
+ let(:quality) { 'default' }
250
+
251
+ it 'returns the original when specifing default' do
252
+ expect(Riiif::CommandRunner).to receive(:execute)
253
+ .with("convert -strip #{filename} png:-")
254
+ render
255
+ end
147
256
  end
148
- it 'returns the original when specifing color' do
149
- expect(Riiif::CommandRunner).to receive(:execute).with("convert -strip #{filename} png:-")
150
- subject.render(quality: 'color', format: 'png')
257
+
258
+ context 'when color is specified' do
259
+ let(:quality) { 'color' }
260
+
261
+ it 'returns the original when specifing color' do
262
+ expect(Riiif::CommandRunner).to receive(:execute)
263
+ .with("convert -strip #{filename} png:-")
264
+ render
265
+ end
151
266
  end
152
- it 'converts to grayscale' do
153
- expect(Riiif::CommandRunner).to receive(:execute).with("convert -colorspace Gray -strip #{filename} png:-")
154
- subject.render(quality: 'grey', format: 'png')
267
+
268
+ context 'when grey is specified' do
269
+ let(:quality) { 'grey' }
270
+
271
+ it 'converts to grayscale' do
272
+ expect(Riiif::CommandRunner).to receive(:execute)
273
+ .with("convert -colorspace Gray -strip #{filename} png:-")
274
+ render
275
+ end
155
276
  end
156
- it 'converts to bitonal' do
157
- expect(Riiif::CommandRunner).to receive(:execute)
158
- .with("convert -colorspace Gray -type Bilevel -strip #{filename} png:-")
159
- subject.render(quality: 'bitonal', format: 'png')
277
+
278
+ context 'when bitonal is specified' do
279
+ let(:quality) { 'bitonal' }
280
+
281
+ it 'converts to bitonal' do
282
+ expect(Riiif::CommandRunner).to receive(:execute)
283
+ .with("convert -colorspace Gray -type Bilevel -strip #{filename} png:-")
284
+ render
285
+ end
160
286
  end
161
- it 'raises an error for invalid angle' do
162
- expect { subject.render(rotation: '150x', format: 'png') }.to raise_error Riiif::InvalidAttributeError
287
+
288
+ context 'when an invalid quality is specified' do
289
+ let(:quality) { 'best' }
290
+
291
+ it 'raises an error' do
292
+ expect { render }.to raise_error Riiif::InvalidAttributeError
293
+ end
163
294
  end
164
295
  end
165
296
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,13 @@
1
+ require 'coveralls'
2
+ require 'simplecov'
3
+
4
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
5
+ SimpleCov::Formatter::HTMLFormatter,
6
+ Coveralls::SimpleCov::Formatter
7
+ ])
8
+
9
+ SimpleCov.start('rails')
10
+
1
11
  require 'engine_cart'
2
12
  ENV['RAILS_ENV'] ||= 'test'
3
13
 
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.5.1
4
+ version: 1.6.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: 2017-08-01 00:00:00.000000000 Z
11
+ date: 2017-09-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -142,6 +142,20 @@ dependencies:
142
142
  - - "~>"
143
143
  - !ruby/object:Gem::Version
144
144
  version: '1.13'
145
+ - !ruby/object:Gem::Dependency
146
+ name: coveralls
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
145
159
  description: A IIIF image server
146
160
  email:
147
161
  - justin@curationexperts.com
@@ -220,7 +234,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
220
234
  version: '0'
221
235
  requirements: []
222
236
  rubyforge_project:
223
- rubygems_version: 2.6.12
237
+ rubygems_version: 2.6.13
224
238
  signing_key:
225
239
  specification_version: 4
226
240
  summary: A rails engine that support IIIF requests