riiif 2.0.0 → 2.1.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 +4 -4
- data/.rubocop.yml +8 -0
- data/Gemfile +35 -0
- data/README.md +1 -0
- data/app/models/riiif/image.rb +2 -1
- data/app/models/riiif/image_information.rb +3 -2
- data/app/services/riiif/image_magick_info_extractor.rb +5 -4
- data/app/services/riiif/imagemagick_command_factory.rb +33 -3
- data/lib/riiif/version.rb +1 -1
- data/riiif.gemspec +2 -2
- data/spec/controllers/riiif/images_controller_spec.rb +2 -1
- data/spec/models/riiif/image_spec.rb +1 -1
- data/spec/services/riiif/imagemagick_command_factory_spec.rb +57 -11
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e92c056972609b8cb70468fae8b71b34e1974b2ec4caa691af4422187886fa8
|
4
|
+
data.tar.gz: eae0755c48ed444ebc292b56f30bd13520d1e34988ec6c7c37087483bbfbd8d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fe8da75c42178b50f8768cdb8f8383043d994865ab917d6b1b74083660b925265f0cd7d08f90f0670e7640c41dcf1b48736926a02855a391c51210ef96256f9
|
7
|
+
data.tar.gz: 11dbed920c6e8bd094cbd2ae01e9e5f29de71670833b3d39d231c5ad0415b39fbc4c3da95b9f79dc46d6e6e12f50a962ed4b425ad3d65fa28d960868655db9e1
|
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
@@ -3,3 +3,38 @@ source 'https://rubygems.org'
|
|
3
3
|
gem 'byebug'
|
4
4
|
# Specify your gem's dependencies in riiif.gemspec
|
5
5
|
gemspec
|
6
|
+
|
7
|
+
# BEGIN ENGINE_CART BLOCK
|
8
|
+
# engine_cart: 2.0.1
|
9
|
+
# engine_cart stanza: 0.10.0
|
10
|
+
# the below comes from engine_cart, a gem used to test this Rails engine gem in the context of a Rails app.
|
11
|
+
file = File.expand_path('Gemfile', ENV['ENGINE_CART_DESTINATION'] || ENV['RAILS_ROOT'] || File.expand_path('.internal_test_app', File.dirname(__FILE__)))
|
12
|
+
if File.exist?(file)
|
13
|
+
begin
|
14
|
+
eval_gemfile file
|
15
|
+
rescue Bundler::GemfileError => e
|
16
|
+
Bundler.ui.warn '[EngineCart] Skipping Rails application dependencies:'
|
17
|
+
Bundler.ui.warn e.message
|
18
|
+
end
|
19
|
+
else
|
20
|
+
Bundler.ui.warn "[EngineCart] Unable to find test application dependencies in #{file}, using placeholder dependencies"
|
21
|
+
|
22
|
+
if ENV['RAILS_VERSION']
|
23
|
+
if ENV['RAILS_VERSION'] == 'edge'
|
24
|
+
gem 'rails', github: 'rails/rails'
|
25
|
+
ENV['ENGINE_CART_RAILS_OPTIONS'] = '--edge --skip-turbolinks'
|
26
|
+
else
|
27
|
+
gem 'rails', ENV['RAILS_VERSION']
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
case ENV['RAILS_VERSION']
|
32
|
+
when /^4.2/
|
33
|
+
gem 'responders', '~> 2.0'
|
34
|
+
gem 'sass-rails', '>= 5.0'
|
35
|
+
gem 'coffee-rails', '~> 4.1.0'
|
36
|
+
when /^4.[01]/
|
37
|
+
gem 'sass-rails', '< 5.0'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
# END ENGINE_CART BLOCK
|
data/README.md
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
[](http://badge.fury.io/rb/riiif)
|
3
3
|
[](https://coveralls.io/github/curationexperts/riiif?branch=master)
|
4
4
|
|
5
|
+
|
5
6
|
A Ruby IIIF image server as a rails engine
|
6
7
|
|
7
8
|
## Installation
|
data/app/models/riiif/image.rb
CHANGED
@@ -11,12 +11,13 @@ module Riiif
|
|
11
11
|
@width = args.first[:width]
|
12
12
|
@height = args.first[:height]
|
13
13
|
@format = args.first[:format]
|
14
|
+
@channels = args.first[:channels]
|
14
15
|
end
|
15
16
|
end
|
16
|
-
attr_reader :format, :height, :width
|
17
|
+
attr_reader :format, :height, :width, :channels
|
17
18
|
|
18
19
|
def to_h
|
19
|
-
{ width: width, height: height, format: format }
|
20
|
+
{ width: width, height: height, format: format, channels: channels }
|
20
21
|
end
|
21
22
|
|
22
23
|
# Image information is only valid if height and width are present.
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Riiif
|
2
|
-
# Get
|
2
|
+
# Get information using imagemagick to interrogate the file
|
3
3
|
class ImageMagickInfoExtractor
|
4
4
|
# perhaps you want to use GraphicsMagick instead, set to "gm identify"
|
5
5
|
class_attribute :external_command
|
@@ -10,14 +10,15 @@ module Riiif
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def extract
|
13
|
-
height, width, format = Riiif::CommandRunner.execute(
|
14
|
-
"#{external_command} -format '%h %w %m' #{@path}[0]"
|
13
|
+
height, width, format, channels = Riiif::CommandRunner.execute(
|
14
|
+
"#{external_command} -format '%h %w %m %[channels]' #{@path}[0]"
|
15
15
|
).split(' ')
|
16
16
|
|
17
17
|
{
|
18
18
|
height: Integer(height),
|
19
19
|
width: Integer(width),
|
20
|
-
format: format
|
20
|
+
format: format,
|
21
|
+
channels: channels
|
21
22
|
}
|
22
23
|
end
|
23
24
|
end
|
@@ -27,7 +27,19 @@ module Riiif
|
|
27
27
|
|
28
28
|
# @return [String] a command for running imagemagick to produce the requested output
|
29
29
|
def command
|
30
|
-
[
|
30
|
+
[
|
31
|
+
external_command,
|
32
|
+
crop,
|
33
|
+
size,
|
34
|
+
rotation,
|
35
|
+
colorspace,
|
36
|
+
quality,
|
37
|
+
sampling,
|
38
|
+
metadata,
|
39
|
+
alpha_channel,
|
40
|
+
input,
|
41
|
+
output
|
42
|
+
].join
|
31
43
|
end
|
32
44
|
|
33
45
|
def reduction_factor
|
@@ -44,6 +56,10 @@ module Riiif
|
|
44
56
|
transformation.format == 'jpg'.freeze
|
45
57
|
end
|
46
58
|
|
59
|
+
def alpha_channel?
|
60
|
+
info.channels =~ /rgba/i
|
61
|
+
end
|
62
|
+
|
47
63
|
def layer_spec
|
48
64
|
'[0]' if info.format =~ /pdf/i
|
49
65
|
end
|
@@ -52,9 +68,15 @@ module Riiif
|
|
52
68
|
" #{path}#{layer_spec}"
|
53
69
|
end
|
54
70
|
|
71
|
+
# In cases where the input file has an alpha_channel but the transformation
|
72
|
+
# format is 'jpg', change to 'png' as jpeg does not support alpha channels
|
55
73
|
# pipe the output to STDOUT
|
56
74
|
def output
|
57
|
-
|
75
|
+
if alpha_channel? && jpeg?
|
76
|
+
" png:-"
|
77
|
+
else
|
78
|
+
" #{transformation.format}:-"
|
79
|
+
end
|
58
80
|
end
|
59
81
|
|
60
82
|
def crop
|
@@ -81,7 +103,15 @@ module Riiif
|
|
81
103
|
end
|
82
104
|
|
83
105
|
def sampling
|
84
|
-
" -sampling-factor #{sampling_factor}" if jpeg?
|
106
|
+
" -sampling-factor #{sampling_factor}" if jpeg? && !alpha_channel?
|
107
|
+
end
|
108
|
+
|
109
|
+
def alpha_channel
|
110
|
+
if info.format =~ /pdf/i
|
111
|
+
' -alpha remove'
|
112
|
+
elsif alpha_channel?
|
113
|
+
' -alpha on'
|
114
|
+
end
|
85
115
|
end
|
86
116
|
|
87
117
|
def colorspace
|
data/lib/riiif/version.rb
CHANGED
data/riiif.gemspec
CHANGED
@@ -21,9 +21,9 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_dependency 'railties', '>= 4.2', '<6'
|
22
22
|
spec.add_dependency 'deprecation', '>= 1.0.0'
|
23
23
|
spec.add_dependency 'iiif-image-api', '~> 0.1.0'
|
24
|
-
spec.add_development_dependency 'bundler'
|
24
|
+
spec.add_development_dependency 'bundler'
|
25
25
|
spec.add_development_dependency 'rake'
|
26
|
-
spec.add_development_dependency 'engine_cart', '~> 0
|
26
|
+
spec.add_development_dependency 'engine_cart', '~> 2.0'
|
27
27
|
spec.add_development_dependency 'rspec-rails'
|
28
28
|
spec.add_development_dependency 'sqlite3'
|
29
29
|
spec.add_development_dependency 'bixby', '~> 1.0.0'
|
@@ -147,7 +147,7 @@ RSpec.describe Riiif::ImagesController do
|
|
147
147
|
before do
|
148
148
|
allow(Riiif::Image).to receive(:new).with('abcd1234').and_return(image)
|
149
149
|
allow(image).to(
|
150
|
-
receive(:info).and_return(Riiif::ImageInformation.new(width: 6000, height: 4000, format: 'JPEG'))
|
150
|
+
receive(:info).and_return(Riiif::ImageInformation.new(width: 6000, height: 4000, format: 'JPEG', channels: 'rgb'))
|
151
151
|
)
|
152
152
|
end
|
153
153
|
|
@@ -159,6 +159,7 @@ RSpec.describe Riiif::ImagesController do
|
|
159
159
|
'width' => 6000,
|
160
160
|
'height' => 4000,
|
161
161
|
'format' => 'JPEG',
|
162
|
+
'channels' => 'rgb',
|
162
163
|
'profile' => ['http://iiif.io/api/image/2/level1.json', 'formats' => %w(jpg png)],
|
163
164
|
'protocol' => 'http://iiif.io/api/image'
|
164
165
|
expect(response.headers['Link']).to eq '<http://iiif.io/api/image/2/level1.json>;rel="profile"'
|
@@ -71,7 +71,7 @@ RSpec.describe Riiif::Image do
|
|
71
71
|
describe '#render' do
|
72
72
|
before do
|
73
73
|
allow(Riiif::CommandRunner).to receive(:execute)
|
74
|
-
.with("identify -format '%h %w %m' #{filename}[0]").and_return('131 175 JPEG')
|
74
|
+
.with("identify -format '%h %w %m %[channels]' #{filename}[0]").and_return('131 175 JPEG')
|
75
75
|
end
|
76
76
|
|
77
77
|
describe 'region' do
|
@@ -1,33 +1,79 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.describe Riiif::ImagemagickCommandFactory do
|
4
|
-
let(:
|
5
|
-
let(:
|
4
|
+
let(:tiff) { 'foo.tiff' }
|
5
|
+
let(:pdf) { 'faa.pdf' }
|
6
|
+
let(:png) { 'laa.png' }
|
7
|
+
let(:channels) { 'rgb' }
|
8
|
+
let(:info) { double(height: 100, width: 100, format: source, channels: channels) }
|
6
9
|
|
7
10
|
describe '.command' do
|
8
|
-
subject { instance.command }
|
9
|
-
let(:instance) { described_class.new(path, info, transformation) }
|
10
|
-
|
11
11
|
let(:transformation) do
|
12
12
|
IIIF::Image::Transformation.new(region: IIIF::Image::Region::Full.new,
|
13
13
|
size: IIIF::Image::Size::Full.new,
|
14
14
|
quality: 'quality',
|
15
15
|
rotation: 15.2,
|
16
|
-
format:
|
16
|
+
format: target)
|
17
17
|
end
|
18
18
|
|
19
|
-
context "when
|
20
|
-
|
19
|
+
context "when the target format is jpeg" do
|
20
|
+
subject { described_class.new(tiff, info, transformation).command }
|
21
|
+
|
22
|
+
let(:source) { 'tif' }
|
23
|
+
let(:target) { 'jpg' }
|
24
|
+
|
21
25
|
it { is_expected.to match(/-quality 85/) }
|
22
26
|
end
|
23
27
|
|
24
|
-
context "when
|
25
|
-
|
28
|
+
context "when the target format is tiff" do
|
29
|
+
subject { described_class.new(tiff, info, transformation).command }
|
30
|
+
|
31
|
+
let(:source) { 'tif' }
|
32
|
+
let(:target) { 'tif' }
|
33
|
+
|
26
34
|
it { is_expected.not_to match(/-quality/) }
|
27
35
|
end
|
28
36
|
|
37
|
+
context "when the source format is pdf" do
|
38
|
+
subject { described_class.new(pdf, info, transformation).command }
|
39
|
+
let(:source) { 'pdf' }
|
40
|
+
let(:target) { 'jpg' }
|
41
|
+
|
42
|
+
it { is_expected.to match(/-alpha\ remove/) }
|
43
|
+
end
|
44
|
+
|
45
|
+
context "when the source and target format is png" do
|
46
|
+
subject { described_class.new(png, info, transformation).command }
|
47
|
+
let(:source) { 'png' }
|
48
|
+
let(:target) { 'png' }
|
49
|
+
|
50
|
+
it { is_expected.to match(/png:-/) }
|
51
|
+
end
|
52
|
+
|
53
|
+
context "when the source format is png, the png has an alpha channel and the target format is png" do
|
54
|
+
subject { described_class.new(png, info, transformation).command }
|
55
|
+
let(:source) { 'png' }
|
56
|
+
let(:target) { 'png' }
|
57
|
+
let(:channels) { 'rgba' }
|
58
|
+
|
59
|
+
it { is_expected.to match(/alpha on/) }
|
60
|
+
end
|
61
|
+
|
62
|
+
context "when the source format is png, the png has an alpha channel and the target format is jpg" do
|
63
|
+
subject { described_class.new(png, info, transformation).command }
|
64
|
+
let(:source) { 'png' }
|
65
|
+
let(:target) { 'jpg' }
|
66
|
+
let(:channels) { 'rgba' }
|
67
|
+
|
68
|
+
it { is_expected.to match(/alpha on/) }
|
69
|
+
it { is_expected.to match(/png:-/) }
|
70
|
+
end
|
71
|
+
|
29
72
|
describe '#external_command' do
|
30
|
-
|
73
|
+
subject { described_class.new(tiff, info, transformation).command }
|
74
|
+
let(:source) { 'tif' }
|
75
|
+
let(:target) { 'jpg' }
|
76
|
+
|
31
77
|
around do |example|
|
32
78
|
orig = described_class.external_command
|
33
79
|
described_class.external_command = 'gm convert'
|
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.
|
4
|
+
version: 2.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:
|
11
|
+
date: 2019-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -62,16 +62,16 @@ dependencies:
|
|
62
62
|
name: bundler
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
|
-
- - "
|
65
|
+
- - ">="
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: '
|
67
|
+
version: '0'
|
68
68
|
type: :development
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
|
-
- - "
|
72
|
+
- - ">="
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: '
|
74
|
+
version: '0'
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: rake
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,14 +92,14 @@ dependencies:
|
|
92
92
|
requirements:
|
93
93
|
- - "~>"
|
94
94
|
- !ruby/object:Gem::Version
|
95
|
-
version: '0
|
95
|
+
version: '2.0'
|
96
96
|
type: :development
|
97
97
|
prerelease: false
|
98
98
|
version_requirements: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version: '0
|
102
|
+
version: '2.0'
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
104
|
name: rspec-rails
|
105
105
|
requirement: !ruby/object:Gem::Requirement
|
@@ -234,7 +234,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
234
234
|
version: '0'
|
235
235
|
requirements: []
|
236
236
|
rubyforge_project:
|
237
|
-
rubygems_version: 2.7.
|
237
|
+
rubygems_version: 2.7.9
|
238
238
|
signing_key:
|
239
239
|
specification_version: 4
|
240
240
|
summary: A rails engine that support IIIF requests
|