riiif 0.0.10 → 0.1.0

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: 201037b36eb8a0a7b31f6953ecaf4dbc980df9d4
4
- data.tar.gz: 0eee522bedbd6e2653ef13621267dd23aeeacea0
3
+ metadata.gz: b40c5ba24332506e2dcb444e2034d45af7b96f22
4
+ data.tar.gz: 27a8f56407ceb92566925db564feb8bfff556e94
5
5
  SHA512:
6
- metadata.gz: 0789760ccc3002354ad44cd5ca29547417d6375085dc7bb27600852b88df2aed746fbcd1e436f6b74958d09a722575e9deb8afea39f36542c7ffef802b970c38
7
- data.tar.gz: dd653f25e076dc6ac8a3207132fd2652cf389158a74b2d6617e3c300ec1478f951c85f787752f9e93a29eb7dc718486129d42876118b8b73616f272f1b2b0e6e
6
+ metadata.gz: d98a5365e702626c211458f480d5b130089f4326bdd8f73c607141aaeaa52585e1b9d48fda9feb70705c57b359d6fbef8136817b10cfd95a8f4c65238cb6f59a
7
+ data.tar.gz: d42a807b1e645fa03e6d6bda49bd03b046c7b35470094cabe64b949f67203f943fe8e0e92cb521f825f0e18918c284302be2e399b5a151fe3047b6a795c9a445
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ notifications:
2
+ email: false
3
+
4
+ rvm:
5
+ - 2.2
6
+
7
+ sudo: false
8
+ language: ruby
data/README.md CHANGED
@@ -36,7 +36,7 @@ Or install it yourself as:
36
36
  By default Riiif is set to load images from the filesystem using the Riiif::FileSystemFileResolver.
37
37
  You can configure how this resolver finds the files by setting this property:
38
38
  ```
39
- Riiif::FileSystemFileResolver.base_path = '/opt/repository/images/'
39
+ Riiif::Image.file_resolver.base_path = '/opt/repository/images/'
40
40
  ```
41
41
  When the Id passed in is "foo_image", then it will look for an image file using this glob:
42
42
  ```
@@ -46,18 +46,22 @@ When the Id passed in is "foo_image", then it will look for an image file using
46
46
  ### Images retrieved over HTTP
47
47
  It's preferable to use files on the filesystem, because this avoids the overhead of downloading the file. If this is unavoidable, Riiif can be configured to fetch files from the network. To enable this behavior, configure Riiif to use an alternative resolver:
48
48
  ```
49
- Riiif::Image.file_resolver = Riiif::HTTPFileResolver
49
+ Riiif::Image.file_resolver = Riiif::HTTPFileResolver.new
50
50
  ```
51
51
  Then we configure the resolver with a mechanism for mapping the provided id to a url:
52
52
  ```
53
- Riiif::HTTPFileResolver.id_to_uri = lambda do |id|
53
+ Riiif::Image.file_resolver.id_to_uri = lambda do |id|
54
54
  "http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/#{id}.jpg/600px-#{id}.jpg"
55
55
  end
56
56
  ```
57
+ If you need to use HTTP basic authentication you can enable it like this:
58
+ ```
59
+ Riiif::Image.file_resolver.basic_auth_credentials = ['username', 's0s3kr3t']
60
+ ```
57
61
 
58
62
  This file resolver caches the network files, so you will want to clear out the old files or the cache will expand until you run out of disk space.
59
63
  Using a script like this would be a good idea: https://github.com/pulibrary/loris/blob/607567b921404a15a2111fbd7123604f4fdec087/bin/loris-cache_clean.sh
60
- By default the cache is located in `tmp/network_files`. You can set the cache path like this: `Riiif::HTTPFileResolver.cache_path = '/var/cache'`
64
+ By default the cache is located in `tmp/network_files`. You can set the cache path like this: `Riiif::Image.file_resolver.cache_path = '/var/cache'`
61
65
 
62
66
  ## Usage
63
67
 
@@ -103,11 +107,11 @@ Create an initializer like this in `config/initializers/riiif_initializer.rb`
103
107
 
104
108
  ```ruby
105
109
  # Tell RIIIF to get files via HTTP (not from the local disk)
106
- Riiif::Image.file_resolver = Riiif::HTTPFileResolver
110
+ Riiif::Image.file_resolver = Riiif::HTTPFileResolver.new
107
111
 
108
112
  # This tells RIIIF how to resolve the identifier to a URI in Fedora
109
113
  DATASTREAM = 'imageContent'
110
- Riiif::HTTPFileResolver.id_to_uri = lambda do |id|
114
+ Riiif::Image.file_resolver.id_to_uri = lambda do |id|
111
115
  connection = ActiveFedora::Base.connection_for_pid(id)
112
116
  host = connection.config[:url]
113
117
  path = connection.api.datastream_content_url(id, DATASTREAM, {})
data/Rakefile CHANGED
@@ -4,6 +4,8 @@ require 'rspec/core/rake_task'
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
6
  require 'engine_cart/rake_task'
7
- task :ci => ['engine_cart:generate'] do
8
- # run the tests
7
+ task ci: ['engine_cart:generate'] do
8
+ Rake::Task["spec"].invoke
9
9
  end
10
+
11
+ task default: :ci
@@ -3,11 +3,11 @@ module Riiif
3
3
  before_filter :link_header, only: [:show, :info]
4
4
  def show
5
5
  begin
6
- image = Image.new(params[:id])
6
+ image = model.new(image_id)
7
7
  status = :ok
8
8
  rescue ImageNotFoundError
9
9
  if Riiif.not_found_image.present?
10
- image = Riiif::Image.new(params[:id], Riiif::File.new(Riiif.not_found_image))
10
+ image = model.new(image_id, Riiif::File.new(Riiif.not_found_image))
11
11
  status = :not_found
12
12
  else
13
13
  raise
@@ -18,17 +18,20 @@ module Riiif
18
18
  end
19
19
 
20
20
  def info
21
- image = Image.new(params[:id])
21
+ image = model.new(image_id)
22
22
  render json: image.info.merge(server_info)
23
23
  end
24
24
 
25
- def view
26
- @image = Image.new(params[:id])
27
- end
28
-
29
25
  protected
30
26
 
31
27
  LEVEL2 = 'http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level2'
28
+ def model
29
+ params.fetch(:model, "riiif/image").camelize.constantize
30
+ end
31
+
32
+ def image_id
33
+ params[:id]
34
+ end
32
35
 
33
36
  def link_header
34
37
  response.headers["Link"] = "<#{LEVEL2}>;rel=\"profile\""
@@ -38,7 +41,7 @@ module Riiif
38
41
  {
39
42
  "@context" => "http://library.stanford.edu/iiif/image-api/1.1/context.json",
40
43
  "@id" => request.original_url.sub('/info.json', ''),
41
- "formats" => Image::OUTPUT_FORMATS,
44
+ "formats" => model::OUTPUT_FORMATS,
42
45
  "profile" => "#{LEVEL2}"
43
46
 
44
47
  }
@@ -3,7 +3,7 @@ module Riiif
3
3
  class Image
4
4
 
5
5
  class_attribute :file_resolver, :info_service
6
- self.file_resolver = FileSystemFileResolver
6
+ self.file_resolver = FileSystemFileResolver.new
7
7
 
8
8
  # this is the default info service
9
9
  # returns a hash with the original image dimensions.
data/config/routes.rb CHANGED
@@ -1,11 +1,3 @@
1
1
  Riiif::Engine.routes.draw do
2
- ALLOW_DOTS ||= /[\w.]+/
3
- SIZES ||= /(pct:)?[\w.,]+/
4
- get "/:id/:region/:size/:rotation/:quality.:format" => "images#show",
5
- constraints: { rotation: ALLOW_DOTS, size: SIZES },
6
- defaults: { format: 'jpg', rotation: '0', region: 'full', quality: 'native' },
7
- as: 'image'
8
-
9
- get "/:id/info.json" => "images#info", defaults: { format: 'json' }, as: 'info'
10
- get "/:id/view(.:format)" => "images#view"
2
+ iiif_for 'riiif/image'
11
3
  end
data/lib/riiif/engine.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Riiif
2
2
  class Engine < ::Rails::Engine
3
- isolate_namespace Riiif
3
+ require 'riiif/rails/routes'
4
4
 
5
5
  # How long to cache the tiles for.
6
6
  config.cache_duration_in_days = 3
@@ -1,23 +1,24 @@
1
1
  module Riiif
2
- module FileSystemFileResolver
3
- mattr_accessor :root, :base_path, :input_types
4
-
5
- self.root = File.expand_path(File.join(File.dirname(__FILE__), '../..'))
6
- self.base_path = File.join(root, 'spec/samples')
7
- self.input_types = %W{png jpg tiff jp jp2}
2
+ class FileSystemFileResolver
3
+ attr_accessor :root, :base_path, :input_types
8
4
 
5
+ def initialize
6
+ @root = ::File.expand_path(::File.join(::File.dirname(__FILE__), '../..'))
7
+ @base_path = ::File.join(root, 'spec/samples')
8
+ @input_types = %W{png jpg tiff jp jp2}
9
+ end
9
10
 
10
- def self.find(id)
11
+ def find(id)
11
12
  Riiif::File.new(path(id))
12
13
  end
13
14
 
14
- def self.path(id)
15
+ def path(id)
15
16
  search = pattern(id)
16
17
  Dir.glob(search).first || raise(ImageNotFoundError, search)
17
18
  end
18
19
 
19
20
 
20
- def self.pattern(id)
21
+ def pattern(id)
21
22
  raise ArgumentError, "Invalid characters in id `#{id}`" unless /^[\w\-:]+$/.match(id)
22
23
  ::File.join(base_path, "#{id}.{#{input_types.join(',')}}")
23
24
  end
@@ -2,32 +2,46 @@ require 'open-uri'
2
2
  require 'active_support/core_ext/file/atomic'
3
3
 
4
4
  module Riiif
5
- module HTTPFileResolver
5
+ class HTTPFileResolver
6
6
 
7
7
  # Set a lambda that maps the first parameter (id) to a URL
8
8
  # Example:
9
9
  #
10
- # Riiif::HTTPFileResolver.id_to_uri = lambda do |id|
10
+ # resolver = Riiif::HTTPFileResolver.new
11
+ # resolver.id_to_uri = lambda do |id|
11
12
  # "http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/#{id}.jpg/600px-#{id}.jpg"
12
13
  # end
13
14
  #
14
- mattr_accessor :id_to_uri
15
-
16
- mattr_accessor :cache_path
17
- self.cache_path = 'tmp/network_files'
15
+ attr_accessor :id_to_uri
16
+ attr_accessor :basic_auth_credentials
17
+ attr_accessor :cache_path
18
18
 
19
+ def initialize
20
+ @cache_path = 'tmp/network_files'
21
+ end
19
22
 
20
- def self.find(id)
21
- remote = RemoteFile.new(uri(id))
23
+ def find(id)
24
+ remote = RemoteFile.new(uri(id),
25
+ cache_path: cache_path,
26
+ basic_auth_credentials: basic_auth_credentials)
22
27
  Riiif::File.new(remote.fetch)
23
28
  end
24
29
 
25
30
  class RemoteFile
26
31
  include ActiveSupport::Benchmarkable
27
32
  delegate :logger, to: :Rails
28
- attr_reader :url
29
- def initialize(url)
30
- @url = url
33
+ attr_reader :url, :cache_path
34
+ def initialize(url, options = {})
35
+ @url = url
36
+ @options = options
37
+ end
38
+
39
+ def cache_path
40
+ @options.fetch(:cache_path)
41
+ end
42
+
43
+ def basic_auth_credentials
44
+ @options[:basic_auth_credentials]
31
45
  end
32
46
 
33
47
  def fetch
@@ -42,15 +56,15 @@ module Riiif
42
56
  end
43
57
 
44
58
  def file_name
45
- @cache_file_name ||= ::File.join(HTTPFileResolver.cache_path, Digest::MD5.hexdigest(url)+"#{ext}")
59
+ @cache_file_name ||= ::File.join(cache_path, Digest::MD5.hexdigest(url)+"#{ext}")
46
60
  end
47
61
 
48
62
  def download_file
49
63
  ensure_cache_path(::File.dirname(file_name))
50
64
  benchmark ("Riiif downloaded #{url}") do
51
- ::File.atomic_write(file_name, HTTPFileResolver.cache_path) do |local|
65
+ ::File.atomic_write(file_name, cache_path) do |local|
52
66
  begin
53
- Kernel::open(url) do |remote|
67
+ Kernel::open(url, download_opts) do |remote|
54
68
  while chunk = remote.read(8192)
55
69
  local.write(chunk)
56
70
  end
@@ -62,6 +76,12 @@ module Riiif
62
76
  end
63
77
  end
64
78
 
79
+ # Get a hash of options for passing to Kernel::open
80
+ # This is the primary pathway for passing basic auth credentials
81
+ def download_opts
82
+ basic_auth_credentials ? { http_basic_authentication: basic_auth_credentials } : {}
83
+ end
84
+
65
85
  # Make sure a file path's directories exist.
66
86
  def ensure_cache_path(path)
67
87
  FileUtils.makedirs(path) unless ::File.exist?(path)
@@ -71,7 +91,7 @@ module Riiif
71
91
 
72
92
  protected
73
93
 
74
- def self.uri(id)
94
+ def uri(id)
75
95
  raise "Must set the id_to_uri lambda" if id_to_uri.nil?
76
96
  id_to_uri.call(id)
77
97
  end
@@ -0,0 +1,12 @@
1
+ module ActionDispatch::Routing
2
+ class Mapper
3
+ # example
4
+ # iiif_for :image
5
+ def iiif_for(*resources)
6
+ options = resources.extract_options!
7
+
8
+ Riiif::Routes.new(self, options.merge(resource: resources.first)).draw
9
+
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,29 @@
1
+ module Riiif
2
+ class Routes
3
+ ALLOW_DOTS ||= /[\w.]+/
4
+ SIZES ||= /(pct:)?[\w.,]+/
5
+
6
+ def initialize(router, options)
7
+ @router = router
8
+ @options = options
9
+ end
10
+
11
+ def add_routes &blk
12
+ @router.instance_exec(@options, &blk)
13
+ end
14
+
15
+ def draw
16
+ add_routes do |options|
17
+ resource = options.fetch(:resource)
18
+ route_prefix = options[:at]
19
+ route_prefix ||= "/#{options[:as]}" if options[:as]
20
+ get "#{route_prefix}/:id/:region/:size/:rotation/:quality.:format" => "riiif/images#show",
21
+ constraints: { rotation: ALLOW_DOTS, size: SIZES },
22
+ defaults: { format: 'jpg', rotation: '0', region: 'full', quality: 'native', model: resource },
23
+ as: options[:as] || "image"
24
+
25
+ get "#{route_prefix}/:id/info.json" => "riiif/images#info", defaults: { format: 'json', model: resource }, as: [options[:as], "info"].compact.join("_")
26
+ end
27
+ end
28
+ end
29
+ end
data/lib/riiif/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Riiif
2
- VERSION = "0.0.10"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/riiif.rb CHANGED
@@ -6,6 +6,7 @@ module Riiif
6
6
  autoload :Image
7
7
  autoload :FileSystemFileResolver
8
8
  autoload :HTTPFileResolver
9
+ autoload :Routes
9
10
 
10
11
  class Error < RuntimeError; end
11
12
  class InvalidAttributeError < Error; end
@@ -25,7 +25,7 @@ describe Riiif::ImagesController do
25
25
  expect(response).to be_successful
26
26
  json = JSON.parse(response.body)
27
27
  expect(json).to eq "@context"=>"http://library.stanford.edu/iiif/image-api/1.1/context.json",
28
- "@id" =>"http://test.host/image-service/abcd1234",
28
+ "@id" =>"http://test.host/abcd1234",
29
29
  "width" =>6000,
30
30
  "height" =>4000,
31
31
  "formats" => [ "jpg", "png" ],
@@ -1,13 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Riiif::FileSystemFileResolver do
4
- subject { Riiif::FileSystemFileResolver }
4
+ subject { Riiif::FileSystemFileResolver.new }
5
5
  it "should raise an error when the file isn't found" do
6
6
  expect{subject.find('1234')}.to raise_error Riiif::ImageNotFoundError
7
7
  end
8
8
 
9
9
  it "should get the jpeg2000 file" do
10
- expect(subject.find('world').path).to eq Riiif::FileSystemFileResolver.root + '/spec/samples/world.jp2'
10
+ expect(subject.find('world').path).to eq subject.root + '/spec/samples/world.jp2'
11
11
  end
12
12
 
13
13
  it "should accept ids with dashes" do
@@ -1,15 +1,16 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Riiif::HTTPFileResolver do
4
- subject { Riiif::HTTPFileResolver }
5
- around do |example|
6
- old_value = Riiif::HTTPFileResolver.id_to_uri
7
- Riiif::HTTPFileResolver.id_to_uri = lambda {|id| id}
8
- example.run
9
- Riiif::HTTPFileResolver.id_to_uri = old_value
4
+ subject { Riiif::HTTPFileResolver.new }
5
+
6
+ before do
7
+ Dir.glob("tmp/network_files/*") do |f|
8
+ File.unlink(f)
9
+ end
10
+ subject.id_to_uri = lambda {|id| id}
10
11
  end
11
12
 
12
- it "should raise an error when the file isn't found" do
13
+ it "raises an error when the file isn't found" do
13
14
  expect(Kernel).to receive(:open).and_raise(OpenURI::HTTPError.new("failure", StringIO.new))
14
15
  begin
15
16
  subject.find('1234')
@@ -18,5 +19,16 @@ describe Riiif::HTTPFileResolver do
18
19
  expect(e).to be_a Riiif::ImageNotFoundError
19
20
  expect(e.original_exception).to be_an OpenURI::HTTPError
20
21
  end
21
- end
22
22
 
23
+ context "when basic authentication credentials are set" do
24
+ let(:credentials) { ['username', 's0s3kr3t'] }
25
+ before do
26
+ subject.basic_auth_credentials = credentials
27
+ end
28
+
29
+ it "should use basic auth credentials" do
30
+ expect(Kernel).to receive(:open).with("1234", { http_basic_authentication: credentials })
31
+ subject.find('1234')
32
+ end
33
+ end
34
+ end
@@ -33,13 +33,13 @@ describe Riiif::Image do
33
33
 
34
34
  context "using HTTPFileResolver" do
35
35
  before do
36
- Riiif::Image.file_resolver = Riiif::HTTPFileResolver
37
- Riiif::HTTPFileResolver.id_to_uri = lambda do |id|
36
+ Riiif::Image.file_resolver = Riiif::HTTPFileResolver.new
37
+ Riiif::Image.file_resolver.id_to_uri = lambda do |id|
38
38
  "http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/#{id}.jpg/600px-#{id}.jpg"
39
39
  end
40
40
  end
41
41
  after do
42
- Riiif::Image.file_resolver = Riiif::FileSystemFileResolver
42
+ Riiif::Image.file_resolver = Riiif::FileSystemFileResolver.new
43
43
  end
44
44
 
45
45
  describe "get info" do
@@ -9,7 +9,7 @@ describe "routes" do
9
9
  get: "/abcd1234/full/full/0/native.jpg"
10
10
  ).to route_to(controller: "riiif/images", id: 'abcd1234', action: "show",
11
11
  region: 'full', size: 'full', rotation: '0',
12
- quality: 'native', format: 'jpg')
12
+ quality: 'native', format: 'jpg', model: "riiif/image")
13
13
  end
14
14
 
15
15
  it "routes requests with floating point percent size" do
@@ -17,30 +17,30 @@ describe "routes" do
17
17
  get: "/abcd1234/full/pct:12.5/22.5/native.jpg"
18
18
  ).to route_to(controller: "riiif/images", id: 'abcd1234', action: "show",
19
19
  region: 'full', size: 'pct:12.5', rotation: '22.5',
20
- quality: 'native', format: 'jpg')
20
+ quality: 'native', format: 'jpg', model: "riiif/image")
21
21
  end
22
22
  it "routes requests with pixel size" do
23
23
  expect(
24
24
  get: "/abcd1234/full/100,50/22.5/native.jpg"
25
25
  ).to route_to(controller: "riiif/images", id: 'abcd1234', action: "show",
26
26
  region: 'full', size: '100,50', rotation: '22.5',
27
- quality: 'native', format: 'jpg')
27
+ quality: 'native', format: 'jpg', model: "riiif/image")
28
28
  end
29
29
  it "routes requests with dashes in the id" do
30
30
  expect(
31
31
  get: "/abcd-1234-5678/full/full/0/native.jpg"
32
32
  ).to route_to(controller: "riiif/images", id: 'abcd-1234-5678', action: "show",
33
33
  region: 'full', size: 'full', rotation: '0',
34
- quality: 'native', format: 'jpg')
34
+ quality: 'native', format: 'jpg', model: "riiif/image")
35
35
  end
36
36
 
37
37
  describe "route helper" do
38
38
  it "takes all the options" do
39
39
  expect(image_path('abcd1234', region: 'full', size: '100,50', rotation: '22.5', quality: 'native',
40
- format: 'jpg')).to eq '/image-service/abcd1234/full/100,50/22.5/native.jpg'
40
+ format: 'jpg')).to eq '/abcd1234/full/100,50/22.5/native.jpg'
41
41
  end
42
42
  it "has defaults" do
43
- expect(image_path('abcd1234', size: '100,50')).to eq '/image-service/abcd1234/full/100,50/0/native.jpg'
43
+ expect(image_path('abcd1234', size: '100,50')).to eq '/abcd1234/full/100,50/0/native.jpg'
44
44
  end
45
45
  end
46
46
  end
@@ -50,10 +50,10 @@ describe "routes" do
50
50
  expect(
51
51
  get: "/abcd1234/info.json"
52
52
  ).to route_to(controller: "riiif/images", id: 'abcd1234',
53
- action: "info", format: 'json')
53
+ action: "info", format: 'json', model: "riiif/image")
54
54
  end
55
55
  it "should have a route helper" do
56
- expect(info_path('abcd1234')).to eq '/image-service/abcd1234/info.json'
56
+ expect(info_path('abcd1234')).to eq '/abcd1234/info.json'
57
57
  end
58
58
  end
59
59
  end
@@ -4,7 +4,7 @@ class TestAppGenerator < Rails::Generators::Base
4
4
  source_root "spec/test_app_templates"
5
5
 
6
6
  def add_routes
7
- route "mount Riiif::Engine => '/image-service'"
7
+ route "iiif_for 'riiif/image', at: '/image-service'"
8
8
  end
9
9
 
10
10
  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: 0.0.10
4
+ version: 0.1.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: 2015-01-16 00:00:00.000000000 Z
11
+ date: 2015-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -103,6 +103,7 @@ extra_rdoc_files: []
103
103
  files:
104
104
  - ".gitignore"
105
105
  - ".rspec"
106
+ - ".travis.yml"
106
107
  - Gemfile
107
108
  - LICENSE
108
109
  - README.md
@@ -115,6 +116,8 @@ files:
115
116
  - lib/riiif/engine.rb
116
117
  - lib/riiif/file_system_file_resolver.rb
117
118
  - lib/riiif/http_file_resolver.rb
119
+ - lib/riiif/rails/routes.rb
120
+ - lib/riiif/routes.rb
118
121
  - lib/riiif/version.rb
119
122
  - riiif.gemspec
120
123
  - spec/controllers/images_controller_spec.rb
@@ -145,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
148
  version: '0'
146
149
  requirements: []
147
150
  rubyforge_project:
148
- rubygems_version: 2.2.2
151
+ rubygems_version: 2.4.5
149
152
  signing_key:
150
153
  specification_version: 4
151
154
  summary: A rails engine that support IIIF requests