dragonfly_libvips 2.1.3 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +7 -0
- data/README.md +19 -8
- data/dragonfly_libvips.gemspec +3 -3
- data/lib/dragonfly_libvips.rb +23 -0
- data/lib/dragonfly_libvips/analysers/image_properties.rb +10 -6
- data/lib/dragonfly_libvips/plugin.rb +14 -33
- data/lib/dragonfly_libvips/processors/encode.rb +25 -5
- data/lib/dragonfly_libvips/processors/extract_area.rb +39 -0
- data/lib/dragonfly_libvips/processors/rotate.rb +12 -11
- data/lib/dragonfly_libvips/processors/thumb.rb +30 -24
- data/lib/dragonfly_libvips/version.rb +1 -1
- data/samples/{landscape_beach.png → landscape_sample.png} +0 -0
- data/samples/sample.gif +0 -0
- data/samples/sample.jpg +0 -0
- data/samples/{memo.pdf → sample.pdf} +0 -0
- data/samples/{beach.png → sample.png} +0 -0
- data/samples/sample.svg +4 -0
- data/samples/sample.tif +0 -0
- data/samples/{cmyk.jpg → sample_cmyk.jpg} +0 -0
- metadata +26 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5550340dee7a433f18f190dce904f2fe02caa339677626503f05d408f9e21cd5
|
4
|
+
data.tar.gz: 2b1055e2d247034322a5a6113a7af655d7762e83f4fb22525c26578db14c65a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6dd9e3e8cba7f60fd0eb3ee480f6362f88d1e3270d93ed2503b6ae69a4cb954a4f7994dd9fe1d7c24a7b0266361ea1c930bb2d22fa94ccf5f095b2ef2aabc897
|
7
|
+
data.tar.gz: c56578890115a8c235458b7893bcc07757c0c5422d1b73d006904032924b6fa2f450f8c2644038ac023742430ca37b9452271d405437113bfe8c96bece9ce55c
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 2.2.0
|
4
|
+
|
5
|
+
* add `SUPPORTED_FORMATS` and `SUPPORTED_OUTPUT_FORMATS` and raise errors when formats are not matching
|
6
|
+
* add more thorough tests for supported formats
|
7
|
+
* skip unnecessary conversion from-to same format
|
8
|
+
* add `extract_area` processor
|
9
|
+
|
3
10
|
## 2.1.3
|
4
11
|
|
5
12
|
* make sure the downcase analyser survives nil
|
data/README.md
CHANGED
@@ -46,9 +46,18 @@ Dragonfly.app.configure do
|
|
46
46
|
end
|
47
47
|
```
|
48
48
|
|
49
|
-
|
49
|
+
## Supported Formats
|
50
50
|
|
51
|
-
|
51
|
+
List of supported formats (based on your build and version of the `libvips` library) is available as:
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
DragonflyLibvips::SUPPORTED_FORMATS # => ["csv", "dz", "gif", …]
|
55
|
+
DragonflyLibvips::SUPPORTED_OUTPUT_FORMATS # => ["csv", "dz", "gif", …]
|
56
|
+
```
|
57
|
+
|
58
|
+
## Processors
|
59
|
+
|
60
|
+
### Thumb
|
52
61
|
|
53
62
|
Create a thumbnail by resizing/cropping
|
54
63
|
|
@@ -66,7 +75,7 @@ Below are some examples of geometry strings for `thumb`:
|
|
66
75
|
'400x300>' # resize only if the image is larger than this
|
67
76
|
```
|
68
77
|
|
69
|
-
|
78
|
+
### Encode
|
70
79
|
|
71
80
|
Change the encoding with
|
72
81
|
|
@@ -74,13 +83,15 @@ Change the encoding with
|
|
74
83
|
image.encode('jpg')
|
75
84
|
```
|
76
85
|
|
77
|
-
|
86
|
+
### Extract Area
|
87
|
+
|
88
|
+
Extract an area from an image.
|
78
89
|
|
79
90
|
```ruby
|
80
|
-
image.
|
91
|
+
image.extract_area(x, y, width, height)
|
81
92
|
```
|
82
93
|
|
83
|
-
|
94
|
+
### Rotate
|
84
95
|
|
85
96
|
Rotate a number of degrees with
|
86
97
|
|
@@ -88,7 +99,7 @@ Rotate a number of degrees with
|
|
88
99
|
image.rotate(90)
|
89
100
|
```
|
90
101
|
|
91
|
-
|
102
|
+
### Options
|
92
103
|
|
93
104
|
All processors support `input_options` and `output_options` for passing additional options to vips. For example:
|
94
105
|
|
@@ -104,7 +115,7 @@ input_options: { access: :sequential }
|
|
104
115
|
output_options: { profile: … } # embeds 'sRGB_v4_ICC_preference.icc' profile included with this gem
|
105
116
|
```
|
106
117
|
|
107
|
-
|
118
|
+
## Analysers
|
108
119
|
|
109
120
|
The following methods are provided
|
110
121
|
|
data/dragonfly_libvips.gemspec
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path('
|
1
|
+
|
2
|
+
lib = File.expand_path('lib', __dir__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
4
|
require 'dragonfly_libvips/version'
|
5
5
|
|
@@ -20,11 +20,11 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_dependency 'dragonfly', '~> 1.0'
|
22
22
|
spec.add_dependency 'ruby-vips', '~> 2.0', '>= 2.0.6'
|
23
|
-
spec.add_dependency 'activesupport', '>= 4.0'
|
24
23
|
|
25
24
|
spec.add_development_dependency 'bundler', '~> 1.12'
|
26
25
|
spec.add_development_dependency 'guard'
|
27
26
|
spec.add_development_dependency 'guard-minitest'
|
28
27
|
spec.add_development_dependency 'minitest', '~> 5.0'
|
28
|
+
spec.add_development_dependency 'minitest-reporters'
|
29
29
|
spec.add_development_dependency 'rake', '~> 10.0'
|
30
30
|
end
|
data/lib/dragonfly_libvips.rb
CHANGED
@@ -5,6 +5,29 @@ require 'dragonfly_libvips/version'
|
|
5
5
|
require 'vips'
|
6
6
|
|
7
7
|
module DragonflyLibvips
|
8
|
+
class UnsupportedFormat < RuntimeError; end
|
9
|
+
class UnsupportedOutputormat < RuntimeError; end
|
10
|
+
|
8
11
|
CMYK_PROFILE_PATH = File.expand_path('../vendor/cmyk.icm', __dir__)
|
9
12
|
EPROFILE_PATH = File.expand_path('../vendor/sRGB_v4_ICC_preference.icc', __dir__)
|
13
|
+
|
14
|
+
SUPPORTED_FORMATS = begin
|
15
|
+
output = `vips -l | grep -i ForeignLoad`
|
16
|
+
output.scan(/\.(\w{1,4})/).flatten.sort.uniq
|
17
|
+
end
|
18
|
+
|
19
|
+
SUPPORTED_OUTPUT_FORMATS = begin
|
20
|
+
output = `vips -l | grep -i ForeignSave`
|
21
|
+
output.scan(/\.(\w{1,4})/).flatten.sort.uniq
|
22
|
+
end - %w[
|
23
|
+
csv
|
24
|
+
mat
|
25
|
+
pbm
|
26
|
+
pfm
|
27
|
+
pgm
|
28
|
+
ppm
|
29
|
+
v
|
30
|
+
vips
|
31
|
+
webp
|
32
|
+
]
|
10
33
|
end
|
@@ -6,18 +6,22 @@ module DragonflyLibvips
|
|
6
6
|
DPI = 300
|
7
7
|
|
8
8
|
def call(content)
|
9
|
+
return {} unless SUPPORTED_FORMATS.include?(content.ext)
|
10
|
+
|
9
11
|
input_options = {}
|
10
|
-
input_options[
|
11
|
-
input_options[
|
12
|
-
input_options[
|
12
|
+
input_options['access'] = 'sequential'
|
13
|
+
input_options['autorotate'] = true if content.mime_type == 'image/jpeg'
|
14
|
+
input_options['dpi'] = DPI if content.mime_type == 'application/pdf'
|
13
15
|
|
14
16
|
img = ::Vips::Image.new_from_file(content.path, input_options)
|
15
17
|
|
16
|
-
width
|
17
|
-
|
18
|
+
width = img.width
|
19
|
+
height = img.height
|
20
|
+
xres = img.xres
|
21
|
+
yres = img.yres
|
18
22
|
|
19
23
|
{
|
20
|
-
'format' => content.ext.
|
24
|
+
'format' => content.ext.to_s,
|
21
25
|
'width' => width,
|
22
26
|
'height' => height,
|
23
27
|
'xres' => xres,
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'dragonfly_libvips/analysers/image_properties'
|
2
2
|
require 'dragonfly_libvips/processors/encode'
|
3
|
+
require 'dragonfly_libvips/processors/extract_area'
|
3
4
|
require 'dragonfly_libvips/processors/rotate'
|
4
5
|
require 'dragonfly_libvips/processors/thumb'
|
5
6
|
|
@@ -9,43 +10,22 @@ module DragonflyLibvips
|
|
9
10
|
# Analysers
|
10
11
|
app.add_analyser :image_properties, DragonflyLibvips::Analysers::ImageProperties.new
|
11
12
|
|
12
|
-
|
13
|
-
|
13
|
+
%w[ width
|
14
|
+
height
|
15
|
+
xres
|
16
|
+
yres
|
17
|
+
format
|
18
|
+
].each do |name|
|
19
|
+
app.add_analyser(name) { |c| c.analyse(:image_properties)[name] }
|
14
20
|
end
|
15
21
|
|
16
|
-
app.add_analyser
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
app.add_analyser :xres do |content|
|
21
|
-
content.analyse(:image_properties)['xres']
|
22
|
-
end
|
23
|
-
|
24
|
-
app.add_analyser :yres do |content|
|
25
|
-
content.analyse(:image_properties)['yres']
|
26
|
-
end
|
27
|
-
|
28
|
-
app.add_analyser :format do |content|
|
29
|
-
content.analyse(:image_properties)['format']
|
30
|
-
end
|
31
|
-
|
32
|
-
app.add_analyser :aspect_ratio do |content|
|
33
|
-
attrs = content.analyse(:image_properties)
|
34
|
-
attrs['width'].to_f / attrs['height']
|
35
|
-
end
|
36
|
-
|
37
|
-
app.add_analyser :portrait do |content|
|
38
|
-
attrs = content.analyse(:image_properties)
|
39
|
-
attrs['width'] <= attrs['height']
|
40
|
-
end
|
41
|
-
|
42
|
-
app.add_analyser :landscape do |content|
|
43
|
-
!content.analyse(:portrait)
|
44
|
-
end
|
22
|
+
app.add_analyser(:aspect_ratio) { |c| c.analyse(:width).to_f / c.analyse(:height).to_f }
|
23
|
+
app.add_analyser(:portrait) { |c| c.analyse(:aspect_ratio) < 1.0 }
|
24
|
+
app.add_analyser(:landscape) { |c| !c.analyse(:portrait) }
|
45
25
|
|
46
|
-
app.add_analyser
|
26
|
+
app.add_analyser(:image) do |c|
|
47
27
|
begin
|
48
|
-
|
28
|
+
c.analyse(:image_properties).key?('format')
|
49
29
|
rescue ::Vips::Error
|
50
30
|
false
|
51
31
|
end
|
@@ -58,6 +38,7 @@ module DragonflyLibvips
|
|
58
38
|
|
59
39
|
# Processors
|
60
40
|
app.add_processor :encode, Processors::Encode.new
|
41
|
+
app.add_processor :extract_area, Processors::ExtractArea.new
|
61
42
|
app.add_processor :thumb, Processors::Thumb.new
|
62
43
|
app.add_processor :rotate, Processors::Rotate.new
|
63
44
|
end
|
@@ -1,10 +1,24 @@
|
|
1
|
-
require 'active_support/core_ext/hash'
|
2
|
-
|
3
1
|
module DragonflyLibvips
|
4
2
|
module Processors
|
5
3
|
class Encode
|
4
|
+
FORMATS_WITHOUT_PROFILE_SUPPORT = %w[dz webp hdr]
|
5
|
+
|
6
6
|
def call(content, format, options = {})
|
7
|
-
|
7
|
+
raise UnsupportedFormat unless SUPPORTED_FORMATS.include?(content.ext)
|
8
|
+
|
9
|
+
format = format.to_s
|
10
|
+
format = 'tif' if format == 'tiff'
|
11
|
+
format = 'jpg' if format == 'jpeg'
|
12
|
+
|
13
|
+
raise UnsupportedOutputFormat unless SUPPORTED_OUTPUT_FORMATS.include?(format)
|
14
|
+
|
15
|
+
if content.mime_type == Rack::Mime.mime_type(".#{format}")
|
16
|
+
content.ext ||= format
|
17
|
+
content.meta['format'] = format
|
18
|
+
return
|
19
|
+
end
|
20
|
+
|
21
|
+
options = options.each_with_object({}) { |(k, v), memo| memo[k.to_s] = v } # stringify keys
|
8
22
|
|
9
23
|
input_options = options.fetch('input_options', {})
|
10
24
|
output_options = options.fetch('output_options', {})
|
@@ -13,12 +27,18 @@ module DragonflyLibvips
|
|
13
27
|
if content.mime_type == 'image/jpeg'
|
14
28
|
input_options['autorotate'] = true unless input_options.has_key?('autorotate')
|
15
29
|
end
|
16
|
-
|
30
|
+
|
31
|
+
output_options['profile'] ||= EPROFILE_PATH
|
32
|
+
output_options.delete('profile') if FORMATS_WITHOUT_PROFILE_SUPPORT.include?(format)
|
17
33
|
|
18
34
|
require 'vips'
|
19
35
|
img = ::Vips::Image.new_from_file(content.path, input_options)
|
20
36
|
|
21
|
-
content.update(
|
37
|
+
content.update(
|
38
|
+
img.write_to_buffer(".#{format}", output_options),
|
39
|
+
'name' => "temp.#{format}",
|
40
|
+
'format' => format
|
41
|
+
)
|
22
42
|
content.ext = format
|
23
43
|
end
|
24
44
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module DragonflyLibvips
|
2
|
+
module Processors
|
3
|
+
class ExtractArea
|
4
|
+
def call(content, x, y, width, height, options = {})
|
5
|
+
raise UnsupportedFormat unless SUPPORTED_FORMATS.include?(content.ext)
|
6
|
+
|
7
|
+
options = options.each_with_object({}) { |(k, v), memo| memo[k.to_s] = v } # stringify keys
|
8
|
+
format = options.fetch('format', content.ext)
|
9
|
+
|
10
|
+
input_options = options.fetch('input_options', {})
|
11
|
+
output_options = options.fetch('output_options', {})
|
12
|
+
|
13
|
+
# input_options['access'] ||= 'sequential'
|
14
|
+
if content.mime_type == 'image/jpeg'
|
15
|
+
input_options['autorotate'] = true unless input_options.has_key?('autorotate')
|
16
|
+
end
|
17
|
+
output_options['profile'] ||= EPROFILE_PATH
|
18
|
+
|
19
|
+
require 'vips'
|
20
|
+
img = ::Vips::Image.new_from_file(content.path, input_options)
|
21
|
+
|
22
|
+
img = img.extract_area(x, y, width, height)
|
23
|
+
|
24
|
+
content.update(
|
25
|
+
img.write_to_buffer(".#{format}", output_options),
|
26
|
+
'name' => "temp.#{format}",
|
27
|
+
'format' => format
|
28
|
+
)
|
29
|
+
content.ext = format
|
30
|
+
end
|
31
|
+
|
32
|
+
def update_url(url_attributes, _, _, _, _, options = {})
|
33
|
+
options = options.each_with_object({}) { |(k, v), memo| memo[k.to_s] = v } # stringify keys
|
34
|
+
return unless format = options.fetch('format', nil)
|
35
|
+
url_attributes.ext = format
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -1,37 +1,38 @@
|
|
1
|
-
require 'active_support/core_ext/hash'
|
2
|
-
|
3
1
|
module DragonflyLibvips
|
4
2
|
module Processors
|
5
3
|
class Rotate
|
6
4
|
def call(content, rotate, options = {})
|
7
|
-
|
5
|
+
raise UnsupportedFormat unless SUPPORTED_FORMATS.include?(content.ext)
|
8
6
|
|
7
|
+
options = options.each_with_object({}) { |(k, v), memo| memo[k.to_s] = v } # stringify keys
|
9
8
|
format = options.fetch('format', content.ext)
|
10
9
|
|
11
10
|
input_options = options.fetch('input_options', {})
|
12
11
|
output_options = options.fetch('output_options', {})
|
13
12
|
|
14
|
-
input_options['access'] ||= 'sequential'
|
13
|
+
# input_options['access'] ||= 'sequential'
|
15
14
|
if content.mime_type == 'image/jpeg'
|
16
15
|
input_options['autorotate'] = true unless input_options.has_key?('autorotate')
|
17
16
|
end
|
18
|
-
output_options['profile'] ||=
|
17
|
+
output_options['profile'] ||= EPROFILE_PATH
|
19
18
|
|
20
19
|
require 'vips'
|
21
20
|
img = ::Vips::Image.new_from_file(content.path, input_options)
|
22
21
|
|
23
22
|
img = img.rot("d#{rotate}")
|
24
23
|
|
25
|
-
content.update(
|
24
|
+
content.update(
|
25
|
+
img.write_to_buffer(".#{format}", output_options),
|
26
|
+
'name' => "temp.#{format}",
|
27
|
+
'format' => format
|
28
|
+
)
|
26
29
|
content.ext = format
|
27
30
|
end
|
28
31
|
|
29
32
|
def update_url(url_attributes, _, options = {})
|
30
|
-
options = options.
|
31
|
-
|
32
|
-
|
33
|
-
url_attributes.ext = format
|
34
|
-
end
|
33
|
+
options = options.each_with_object({}) { |(k, v), memo| memo[k.to_s] = v } # stringify keys
|
34
|
+
return unless format = options.fetch('format', nil)
|
35
|
+
url_attributes.ext = format
|
35
36
|
end
|
36
37
|
end
|
37
38
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'active_support/core_ext/hash'
|
2
1
|
require 'dragonfly_libvips/dimensions'
|
3
2
|
require 'vips'
|
4
3
|
|
@@ -10,56 +9,63 @@ module DragonflyLibvips
|
|
10
9
|
DPI = 300
|
11
10
|
|
12
11
|
def call(content, geometry, options = {})
|
13
|
-
|
12
|
+
raise UnsupportedFormat unless SUPPORTED_FORMATS.include?(content.ext)
|
13
|
+
|
14
|
+
options = options.each_with_object({}) { |(k, v), memo| memo[k.to_s] = v } # stringify keys
|
14
15
|
|
15
16
|
filename = content.path
|
16
|
-
format = options.fetch(
|
17
|
+
format = options.fetch('format', content.ext).to_s
|
17
18
|
|
18
|
-
input_options = options.fetch(
|
19
|
-
input_options[
|
20
|
-
input_options[
|
19
|
+
input_options = options.fetch('input_options', {})
|
20
|
+
input_options['access'] = input_options.fetch('access', 'sequential')
|
21
|
+
input_options['autorotate'] = input_options.fetch('autorotate', true) if content.mime_type == 'image/jpeg'
|
21
22
|
|
22
23
|
if content.mime_type == 'application/pdf'
|
23
|
-
input_options[
|
24
|
-
input_options[
|
24
|
+
input_options['dpi'] = input_options.fetch('dpi', DPI) if content.mime_type == 'application/pdf'
|
25
|
+
input_options['page'] = input_options.fetch('page', 0) if content.mime_type == 'application/pdf'
|
25
26
|
else
|
26
|
-
input_options.delete(
|
27
|
-
input_options.delete(
|
27
|
+
input_options.delete('page')
|
28
|
+
input_options.delete('dpi')
|
28
29
|
end
|
29
30
|
|
30
|
-
output_options = options.fetch(
|
31
|
-
output_options[
|
31
|
+
output_options = options.fetch('output_options', {})
|
32
|
+
output_options['profile'] = input_options.fetch('profile', EPROFILE_PATH)
|
32
33
|
|
34
|
+
input_options = input_options.each_with_object({}) { |(k, v), memo| memo[k.to_sym] = v } # symbolize
|
33
35
|
img = ::Vips::Image.new_from_file(filename, input_options)
|
34
36
|
|
35
37
|
dimensions = case geometry
|
36
|
-
when RESIZE_GEOMETRY then
|
38
|
+
when RESIZE_GEOMETRY then Dimensions.call(geometry, img.width, img.height)
|
37
39
|
else raise ArgumentError, "Didn't recognise the geometry string: #{geometry}"
|
38
40
|
end
|
39
41
|
|
40
|
-
thumbnail_options = options.fetch(
|
41
|
-
thumbnail_options[
|
42
|
-
thumbnail_options[
|
43
|
-
thumbnail_options[
|
44
|
-
thumbnail_options[
|
42
|
+
thumbnail_options = options.fetch('thumbnail_options', {})
|
43
|
+
thumbnail_options['auto_rotate'] = input_options.fetch('autorotate', true) if content.mime_type == 'image/jpeg'
|
44
|
+
thumbnail_options['height'] = thumbnail_options.fetch('height', dimensions.height.ceil)
|
45
|
+
thumbnail_options['import_profile'] = CMYK_PROFILE_PATH if img.get('interpretation') == :cmyk
|
46
|
+
thumbnail_options['size'] ||= case geometry
|
45
47
|
when />\z/ then :down # do_not_resize_if_image_smaller_than_requested
|
46
48
|
when /<\z/ then :up # do_not_resize_if_image_larger_than_requested
|
47
49
|
else :both
|
48
50
|
end
|
49
51
|
|
50
52
|
filename += "[page=#{input_options[:page]}]" if content.mime_type == 'application/pdf'
|
53
|
+
|
54
|
+
thumbnail_options = thumbnail_options.each_with_object({}) { |(k, v), memo| memo[k.to_sym] = v } # symbolize
|
51
55
|
thumb = ::Vips::Image.thumbnail(filename, dimensions.width.ceil, thumbnail_options)
|
52
56
|
|
53
|
-
content.update(
|
57
|
+
content.update(
|
58
|
+
thumb.write_to_buffer(".#{format}", output_options),
|
59
|
+
'name' => "temp.#{format}",
|
60
|
+
'format' => format
|
61
|
+
)
|
54
62
|
content.ext = format
|
55
63
|
end
|
56
64
|
|
57
65
|
def update_url(url_attributes, _, options = {})
|
58
|
-
options = options.
|
59
|
-
|
60
|
-
|
61
|
-
url_attributes.ext = format
|
62
|
-
end
|
66
|
+
options = options.each_with_object({}) { |(k, v), memo| memo[k.to_s] = v } # stringify keys
|
67
|
+
return unless format = options.fetch('format', nil)
|
68
|
+
url_attributes.ext = format
|
63
69
|
end
|
64
70
|
end
|
65
71
|
end
|
File without changes
|
data/samples/sample.gif
ADDED
Binary file
|
data/samples/sample.jpg
ADDED
Binary file
|
File without changes
|
File without changes
|
data/samples/sample.svg
ADDED
data/samples/sample.tif
ADDED
Binary file
|
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dragonfly_libvips
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomas Celizna
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dragonfly
|
@@ -44,20 +44,6 @@ dependencies:
|
|
44
44
|
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: 2.0.6
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: activesupport
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
50
|
-
requirements:
|
51
|
-
- - ">="
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '4.0'
|
54
|
-
type: :runtime
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
requirements:
|
58
|
-
- - ">="
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: '4.0'
|
61
47
|
- !ruby/object:Gem::Dependency
|
62
48
|
name: bundler
|
63
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,6 +100,20 @@ dependencies:
|
|
114
100
|
- - "~>"
|
115
101
|
- !ruby/object:Gem::Version
|
116
102
|
version: '5.0'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: minitest-reporters
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
117
|
- !ruby/object:Gem::Dependency
|
118
118
|
name: rake
|
119
119
|
requirement: !ruby/object:Gem::Requirement
|
@@ -151,13 +151,18 @@ files:
|
|
151
151
|
- lib/dragonfly_libvips/dimensions.rb
|
152
152
|
- lib/dragonfly_libvips/plugin.rb
|
153
153
|
- lib/dragonfly_libvips/processors/encode.rb
|
154
|
+
- lib/dragonfly_libvips/processors/extract_area.rb
|
154
155
|
- lib/dragonfly_libvips/processors/rotate.rb
|
155
156
|
- lib/dragonfly_libvips/processors/thumb.rb
|
156
157
|
- lib/dragonfly_libvips/version.rb
|
157
|
-
- samples/
|
158
|
-
- samples/
|
159
|
-
- samples/
|
160
|
-
- samples/
|
158
|
+
- samples/landscape_sample.png
|
159
|
+
- samples/sample.gif
|
160
|
+
- samples/sample.jpg
|
161
|
+
- samples/sample.pdf
|
162
|
+
- samples/sample.png
|
163
|
+
- samples/sample.svg
|
164
|
+
- samples/sample.tif
|
165
|
+
- samples/sample_cmyk.jpg
|
161
166
|
- samples/white pixel.png
|
162
167
|
- vendor/cmyk.icm
|
163
168
|
- vendor/sRGB_v4_ICC_preference.icc
|
@@ -181,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
181
186
|
version: '0'
|
182
187
|
requirements: []
|
183
188
|
rubyforge_project:
|
184
|
-
rubygems_version: 2.
|
189
|
+
rubygems_version: 2.7.6
|
185
190
|
signing_key:
|
186
191
|
specification_version: 4
|
187
192
|
summary: Dragonfly analysers and processors for libvips image processing library.
|