vips-process 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 28664d855e6a202bf807e8d88369d9033c5a2161
4
+ data.tar.gz: 5d784293a361981a59145d388c46107cac41703d
5
+ SHA512:
6
+ metadata.gz: 9473e1b51f4011cad6387e3c2994c36936ceb6cae84421e76fbea7230863c27c52f90e2b0f6475c6e516bc426c8214ee44e7b09c323d3af6780a499839d5494c
7
+ data.tar.gz: 60445478ea6e610c7c59b008eacdcda359fdd9b6a34c96889a3891dcc8b2614994387acc3894f1c121d866c10acd83932e1b2ac409400c0cf363ed0c209d0828
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in vips-process.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,29 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ vips-process (0.0.1)
5
+ ruby-vips (~> 0.3.9)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ coderay (1.1.0)
11
+ cutest (1.2.1)
12
+ method_source (0.8.2)
13
+ pry (0.10.1)
14
+ coderay (~> 1.1.0)
15
+ method_source (~> 0.8.1)
16
+ slop (~> 3.4)
17
+ rake (10.3.2)
18
+ ruby-vips (0.3.9)
19
+ slop (3.6.0)
20
+
21
+ PLATFORMS
22
+ ruby
23
+
24
+ DEPENDENCIES
25
+ bundler (~> 1.7)
26
+ cutest (~> 1.2.1)
27
+ pry (~> 0.10.1)
28
+ rake (~> 10.0)
29
+ vips-process!
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Darío Javier Cravero
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,195 @@
1
+ # Vips::Process
2
+
3
+ Process your images with ruby-vips using an operation-oriented approach.
4
+
5
+ Inspired by [carrierwave-vips](https://github.com/eltiare/carrierwave-vips/blob/master/lib/carrierwave/vips.rb)
6
+ and [@jcupitt's](https://github.com/jcupitt/ruby-vips/issues/60#issuecomment-56934898) gaussian blur example.
7
+
8
+ Made with <3 @[UXtemple](http://uxtemple.com). :)
9
+
10
+ [Vips](http://www.vips.ecs.soton.ac.uk/index.php?title=VIPS) is an open source and super fast image
11
+ processing library with a very low memory footprint.
12
+ You can use it as a replacement to `ImageMagick`, `MiniMagick` and the likes.
13
+ See the benchmarks [here](http://www.vips.ecs.soton.ac.uk/index.php?title=Speed_and_Memory_Use).
14
+
15
+ ## Installation
16
+
17
+ This gem requires `libvips` in order to run. For instructions on how to get it in OS X and Linux, follow [these installation guides](https://github.com/jcupitt/ruby-vips#installation-prerequisites).
18
+
19
+ Add this line to your application's Gemfile:
20
+
21
+ ```ruby
22
+ gem 'vips-process'
23
+ ```
24
+
25
+ And then execute:
26
+
27
+ $ bundle
28
+
29
+ Or install it yourself as:
30
+
31
+ $ gem install vips-process
32
+
33
+ ## Usage
34
+
35
+ Define your image class and explicity include the processes you want to apply to it:
36
+
37
+ ```
38
+ # example.rb
39
+ require 'vips-process'
40
+ require 'vips-process/gaussian-blur'
41
+ require 'vips-process/resize'
42
+
43
+ class MyImage
44
+ include Vips::Process
45
+ include Vips::Process::GaussianBlur
46
+ include Vips::Process::Resize
47
+ include Vips::Process::Quality
48
+
49
+ attr_accessor :src, :dst
50
+
51
+ def initialize(src, dst=nil)
52
+ @src = src
53
+ @dst = dst || src
54
+ end
55
+
56
+ version(:blurred) { gaussian_blur }
57
+ version(:thumb) { resize_to_fit 150, 150 }
58
+ version :blurred_thumb, [:thumb, :blurred]
59
+ version(:blurred_thumb, [:thumb, :blurred]) { quality 50 }
60
+ end
61
+ ```
62
+
63
+ `Vips::Process` also comes with a `Base` helper class that takes care of defining `src`, `dst` and
64
+ including `Vips::Process` for you. It's the recommended way to go about it and you can use it as follows
65
+
66
+ ```
67
+ require 'vips-process/base'
68
+ require 'vips-process/gaussian-blur'
69
+
70
+ class MyImage < Vips::Process::Base
71
+ include Vips::Process::GaussianBlur
72
+
73
+ version(:blurred) { gaussian_blur }
74
+ end
75
+ ```
76
+
77
+ ## Supported processes
78
+
79
+ All examples live in the [/examples](https://github.com/dariocravero/vips-process/tree/master/examples)
80
+ folder of this repo.
81
+
82
+ ### AutoOrient
83
+
84
+ Read the camera EXIF data to determine orientation and adjust accordingly
85
+
86
+ Usage:
87
+
88
+ Include it in your image class `include Vips::Process::AutoOrient` and
89
+ call it `MyImage.new('/path/to/src').auto_orient`.
90
+
91
+ ### GaussianBlur
92
+
93
+ Applies a gaussian blur to an image.
94
+
95
+ Usage:
96
+
97
+ Include it in your image class `include Vips::Process::GaussianBlur` and
98
+ call it `MyImage.new('/path/to/src').gaussian_blur(5, 0.2)`.
99
+
100
+ The first argument is the `radius` and the second one is the `minimium amplitude` we consider,
101
+ which sets how far out the mask goes; it's optional and defaults to `0.2`.
102
+
103
+ ### Convert
104
+
105
+ Converts an image to a different format.
106
+
107
+ Usage:
108
+
109
+ Include it in your image class `include Vips::Process::Convert` and
110
+ call it `MyImage.new('/path/to/src.jpg').convert(:png)`.
111
+
112
+ The first argument is the `format` we'll conver the file to (jpeg or png) and
113
+ the second one is an optional hash of `options` to be passed to the converting function
114
+ (ie, :interlace => true for png).
115
+
116
+ ### Quality
117
+
118
+ Changes quality of the image (if supported by the file format)
119
+
120
+ Usage:
121
+
122
+ Include it in your image class `include Vips::Process::Quality` and
123
+ call it `MyImage.new('/path/to/src.jpg').quality(50)`.
124
+
125
+ It takes the `quality` as an argument which defaults to `75`. This value should be between 0 and 100.
126
+ Currently `jpegs` are only supported. Using any other image formats will be a no-op.
127
+
128
+ ### Resize
129
+
130
+ There are three resize methods. Each of them will sharpen the image after doing its work.
131
+
132
+ Usage:
133
+
134
+ Include it in your image class `include Vips::Process::Resize`.
135
+ All of them take the same arguments: `width` and `height`.
136
+
137
+ #### resize_to_fit
138
+
139
+ Resize the image to fit within the specified dimensions while retaining
140
+ the original aspect ratio. The image may be shorter or narrower than
141
+ specified in the smaller dimension but will not be larger than the
142
+ specified values.
143
+
144
+ Call it as follows: `MyImage.new('/path/to/src.jpg').resize_to_fit(150, 150)`
145
+
146
+ #### resize_to_fill
147
+
148
+ Resize the image to fit within the specified dimensions while retaining
149
+ the aspect ratio of the original image. If necessary, crop the image in
150
+ the larger dimension.
151
+
152
+ Call it as follows: `MyImage.new('/path/to/src.jpg').resize_to_fill(150, 150)`
153
+
154
+ #### resize_to_limit
155
+
156
+ Resize the image to fit within the specified dimensions while retaining
157
+ the original aspect ratio. Will only resize the image if it is larger than the
158
+ specified dimensions. The resulting image may be shorter or narrower than specified
159
+ in the smaller dimension but will not be larger than the specified values.
160
+
161
+ Call it as follows: `MyImage.new('/path/to/src.jpg').resize_to_limit(150, 150)`
162
+
163
+ ### Strip
164
+
165
+ Remove all exif and icc data when writing to a file. This method does
166
+ not actually remove any metadata but rather marks it to be removed when
167
+ writing the file.
168
+
169
+ Usage:
170
+
171
+ Include it in your image class `include Vips::Process::Strip` and
172
+ call it `MyImage.new('/path/to/src.jpg').strip`.
173
+
174
+ ## Version definition
175
+
176
+ You can also define versions and compose them as you wish.
177
+
178
+ A version is defined by calling `version` in your image class.
179
+
180
+ A version can have dependencies which will be executed sequentially. Of course composed versions
181
+ can also take a block and do more things. Maybe this can grow into a set of common versions?
182
+
183
+ ## TODO
184
+
185
+ 1. Increment test coverage.
186
+ 2. Implement version caching.
187
+ 3. Implement more processes. Feel free to add what you may need.
188
+
189
+ ## Contributing
190
+
191
+ 1. Fork it ( https://github.com/[my-github-username]/vips-process/fork )
192
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
193
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
194
+ 4. Push to the branch (`git push origin my-new-feature`)
195
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ task :test do
2
+ require 'cutest'
3
+
4
+ Cutest.run(Dir['test/*.rb'])
5
+ end
6
+
7
+ task :default => :test
@@ -0,0 +1,33 @@
1
+ module Vips
2
+ module Process
3
+ module AutoOrient
4
+ EMPTY_STRING = ''.freeze
5
+ EXIF_ORIENTATION = 'exif-Orientation'.freeze
6
+ EXIF_IFD0_ORIENTATION = 'exif-ifd0-Orientation'.freeze
7
+
8
+ # Read the camera EXIF data to determine orientation and adjust accordingly
9
+ def auto_orient
10
+ manipulate! do |image|
11
+ o = image.get(EXIF_ORIENTATION).to_i rescue nil
12
+ o ||= image.get(EXIF_IFD0_ORIENTATION).to_i rescue 1
13
+
14
+ case o
15
+ when 1
16
+ # Do nothing, everything is peachy
17
+ when 6
18
+ image.rot270
19
+ when 8
20
+ image.rot180
21
+ when 3
22
+ image.rot90
23
+ else
24
+ raise('Invalid value for Orientation: ' + o.to_s)
25
+ end
26
+ image.set EXIF_ORIENTATION, EMPTY_STRING
27
+ image.set EXIF_IFD0_ORIENTATION, EMPTY_STRING
28
+ end
29
+ self
30
+ end
31
+ end # AutoOrient
32
+ end # Process
33
+ end # Vips
@@ -0,0 +1,16 @@
1
+ require 'vips-process'
2
+
3
+ module Vips
4
+ module Process
5
+ class Base
6
+ include Vips::Process
7
+
8
+ attr_accessor :src, :dst
9
+
10
+ def initialize(src, dst=nil)
11
+ @src = src
12
+ @dst = dst || src
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ module Vips
2
+ module Process
3
+ module Convert
4
+ ALLOWED_FORMATS = [JPEG, PNG]
5
+
6
+ ##
7
+ # Converts an image to a different format
8
+ #
9
+ # @param format String the format we'll convert the file to (jpeg, png)
10
+ # @param opts Hash options to be passed to converting function (ie, :interlace => true for png)
11
+ #
12
+ def convert(format, opts = {})
13
+ format = format.to_s.downcase
14
+ raise ArgumentError, "Format must be one of: #{ALLOWED_FORMATS.join(',')}" unless ALLOWED_FORMATS.include?(format)
15
+ @_format = format
16
+ @_format_opts = opts
17
+ self
18
+ end
19
+ end # Convert
20
+ end # Process
21
+ end # Vips
@@ -0,0 +1,43 @@
1
+ module Vips
2
+ module Process
3
+ module GaussianBlur
4
+ ##
5
+ # We normalise to 20 so that the mask sum stays under 255 for most blurs.
6
+ # This will let Vips use its fast SSE path for 8-bit images
7
+ NORMALISE_TO = 20.0
8
+
9
+ # The size of the biggest mask we support
10
+ BIGGEST_MASK = 10000
11
+
12
+ ##
13
+ # Apply gaussian blur to an image.
14
+ #
15
+ # @param sigma Integer roughly the radius
16
+ # @param min_ampl Float minimium amplitude we consider, it sets how far out the mask goes
17
+ def gaussian_blur(sigma, min_ampl=0.2)
18
+ manipulate! do |image|
19
+ image.convsep gaussian_mask(sigma, min_ampl)
20
+ end
21
+ self
22
+ end
23
+
24
+ # Make a 1D int gaussian mask suitable for a separable convolution
25
+ private def gaussian_mask(sigma, min_ampl)
26
+ sigma2 = 2.0 * sigma ** 2.0
27
+
28
+ # Find the size of the mask
29
+ max_size = (1..BIGGEST_MASK).detect { |x| Math::exp(-x ** 2.0 / sigma2) < min_ampl }
30
+ throw :mask_too_large unless max_size
31
+
32
+ width = max_size * 2 + 1
33
+ mask = (0...width).map do |x|
34
+ d = (x - width / 2) ** 2
35
+ (NORMALISE_TO * Math::exp(-d / sigma2)).round
36
+ end
37
+ sum = mask.reduce(:+)
38
+
39
+ VIPS::Mask.new [mask], sum, 0
40
+ end
41
+ end # GaussianBlur
42
+ end # Process
43
+ end # Vips
@@ -0,0 +1,17 @@
1
+ module Vips
2
+ module Process
3
+ module Quality
4
+ ##
5
+ # Changes quality of the image (if supported by the file format)
6
+ #
7
+ # @param percent Integer quality from 0 to 100
8
+ def quality(percent=75)
9
+ manipulate! do |image|
10
+ @_format_opts = { quality: percent } if jpeg? || @_format == JPEG
11
+ image
12
+ end
13
+ self
14
+ end
15
+ end # Quality
16
+ end # Process
17
+ end # Vips
@@ -0,0 +1,93 @@
1
+ module Vips
2
+ module Process
3
+ module Resize
4
+ SHARPEN_MASK = begin
5
+ conv_mask = [
6
+ [ -1, -1, -1 ],
7
+ [ -1, 24, -1 ],
8
+ [ -1, -1, -1 ]
9
+ ]
10
+ ::VIPS::Mask.new conv_mask, 16
11
+ end
12
+
13
+ ##
14
+ # Resize the image to fit within the specified dimensions while retaining
15
+ # the original aspect ratio. The image may be shorter or narrower than
16
+ # specified in the smaller dimension but will not be larger than the
17
+ # specified values.
18
+ #
19
+ # @param width Integer the width to scale the image to
20
+ # @param height Integer the height to scale the image to
21
+ def resize_to_fit(width, height)
22
+ manipulate! do |image|
23
+ resize_image image, width, height
24
+ end
25
+ self
26
+ end
27
+
28
+ ##
29
+ # Resize the image to fit within the specified dimensions while retaining
30
+ # the aspect ratio of the original image. If necessary, crop the image in
31
+ # the larger dimension.
32
+ #
33
+ # @param width Integer the width to scale the image to
34
+ # @param height Integer the height to scale the image to
35
+ def resize_to_fill(width, height)
36
+ manipulate! do |image|
37
+ image = resize_image image, width, height, :max
38
+ top = 0
39
+ left = 0
40
+
41
+ if image.x_size > width
42
+ left = (image.x_size - width) / 2
43
+ elsif image.y_size > height
44
+ top = (image.y_size - height) / 2
45
+ end
46
+
47
+ image.extract_area left, top, width, height
48
+ end
49
+ self
50
+ end
51
+
52
+ ##
53
+ # Resize the image to fit within the specified dimensions while retaining
54
+ # the original aspect ratio. Will only resize the image if it is larger than the
55
+ # specified dimensions. The resulting image may be shorter or narrower than specified
56
+ # in the smaller dimension but will not be larger than the specified values.
57
+ #
58
+ # @param width Integer the width to scale the image to
59
+ # @parma height Integer the height to scale the image to
60
+ def resize_to_limit(width, height)
61
+ manipulate! do |image|
62
+ image = resize_image(image, width, height) if width < image.x_size || height < image.y_size
63
+ image
64
+ end
65
+ self
66
+ end
67
+
68
+ private def resize_image(image, width, height, min_or_max = :min)
69
+ ratio = get_ratio image, width, height, min_or_max
70
+ return image if ratio == 1
71
+ if ratio > 1
72
+ image = image.affinei_resize :nearest, ratio
73
+ else
74
+ if ratio <= 0.5
75
+ factor = (1.0 / ratio).floor
76
+ image = image.shrink factor
77
+ image = image.tile_cache image.x_size, 1, 30
78
+ ratio = get_ratio image, width, height, min_or_max
79
+ end
80
+ image = image.affinei_resize :bicubic, ratio
81
+ image = image.conv SHARPEN_MASK
82
+ end
83
+ image
84
+ end
85
+
86
+ private def get_ratio(image, width,height, min_or_max = :min)
87
+ width_ratio = width.to_f / image.x_size
88
+ height_ratio = height.to_f / image.y_size
89
+ [width_ratio, height_ratio].send min_or_max
90
+ end
91
+ end # Resize
92
+ end # Process
93
+ end # Vips
@@ -0,0 +1,22 @@
1
+ module Vips
2
+ module Process
3
+ module Strip
4
+ ##
5
+ # Remove all exif and icc data when writing to a file. This method does
6
+ # not actually remove any metadata but rather marks it to be removed when
7
+ # writing the file.
8
+ #
9
+ def strip
10
+ manipulate! do |image|
11
+ @_on_process << ->(writer) do
12
+ writer.remove_exif
13
+ writer.remove_icc
14
+ end
15
+
16
+ image
17
+ end
18
+ self
19
+ end
20
+ end # Strip
21
+ end # Process
22
+ end # Vips
@@ -0,0 +1,5 @@
1
+ module Vips
2
+ module Process
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,101 @@
1
+ require 'vips'
2
+ require 'vips-process/version'
3
+
4
+ module Vips
5
+ module Process
6
+ JPEG = 'jpeg'.freeze
7
+ PNG = 'png'.freeze
8
+
9
+ ##
10
+ # Manipulate the image with Vips. Saving of the image is delayed until after
11
+ # all the process blocks have been called. Make sure you always return an
12
+ # VIPS::Image object from the block
13
+ #
14
+ # This method yields VIPS::Image for further manipulation.
15
+ #
16
+ # It also raises an Exception if the manipulation failed.
17
+ def manipulate!
18
+ @_on_process ||= []
19
+ @_vimage ||= if jpeg?
20
+ VIPS::Image.jpeg @src, sequential: true
21
+ elsif png?
22
+ VIPS::Image.png @src, sequential: true
23
+ else
24
+ VIPS::Image.new @src
25
+ end
26
+ @_vimage = yield @_vimage
27
+ rescue => e
28
+ raise Exception.new("Failed to manipulate file, maybe it is not a supported image? Original Error: #{e}")
29
+ end
30
+
31
+ def process!
32
+ if @_vimage
33
+ tmp_name = @dst.sub /(\.[[:alnum:]]+)$/i, '_tmp\1'
34
+ writer = writer_class.send :new, @_vimage, @_format_opts
35
+
36
+ @_on_process.each { |block| block.call writer }
37
+
38
+ writer.write tmp_name
39
+ FileUtils.mv tmp_name, @dst
40
+
41
+ reset!
42
+ @dst
43
+ end
44
+ end
45
+
46
+ # Allow changing src and chain it afterwards
47
+ def src!(src)
48
+ @src = src
49
+ self
50
+ end
51
+
52
+ # Allow changing dst and chain it afterwards
53
+ def dst!(dst)
54
+ @dst = dst
55
+ self
56
+ end
57
+
58
+ private def reset!
59
+ @_on_process = []
60
+ @_format_opts = nil
61
+ @_vimage = nil
62
+ end
63
+
64
+ private def writer_class
65
+ case @_format
66
+ when JPEG then VIPS::JPEGWriter
67
+ when PNG then VIPS::PNGWriter
68
+ else VIPS::Writer
69
+ end
70
+ end
71
+
72
+ private def jpeg?(path = @src); path =~ /.*jpg$/i or path =~ /.*jpeg$/i; end
73
+ private def png?(path = @src); path =~ /.*png$/i; end
74
+
75
+ def self.included(base)
76
+ base.extend(ClassMethods)
77
+ end
78
+
79
+ module ClassMethods
80
+ ##
81
+ # Define a version
82
+ #
83
+ # @param name String the version's name
84
+ # @param deps [] the version's dependencies, it's a list of version names
85
+ # @param &block block if you send a block to it
86
+ def version(name, deps = [], &block)
87
+ throw :need_block_or_deps unless block_given? || !deps.empty?
88
+
89
+ @@_versions ||= {}
90
+ @@_versions[name] = {deps: deps, block: block}
91
+
92
+ define_method "#{name}_version" do |new_dst=nil|
93
+ @dst = new_dst if new_dst
94
+ @@_versions[name][:deps].each { |dep| instance_eval &@@_versions[dep][:block] }
95
+ instance_eval &@@_versions[name][:block]
96
+ process!
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
data/test/helpers.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'vips-process/base'
2
+ require 'vips-process/gaussian-blur'
3
+ require 'vips-process/resize'
4
+
5
+ class MyImage < Vips::Process::Base
6
+ include Vips::Process::GaussianBlur
7
+ include Vips::Process::Resize
8
+
9
+ version(:blurred) { gaussian_blur }
10
+ version(:thumb) { resize_to_fit 150, 150 }
11
+ version :blurred_thumb, [:thumb, :blurred]
12
+ version(:blurred_thumb, [:thumb, :blurred]) { quality 50 }
13
+ end
@@ -0,0 +1,36 @@
1
+ require_relative 'helpers'
2
+
3
+ test "it should allow the source to be changed and the image chained" do
4
+ original_src = '/path/to/src'
5
+ new_src = '/path/to/new/dest'
6
+
7
+ image = MyImage.new original_src, '/path/to/dst'
8
+
9
+ assert_equal image.src!(new_src), image
10
+ assert_equal image.src, new_src
11
+ end
12
+
13
+ test "it should allow the destination to be changed and the image chained" do
14
+ original_dst = '/path/to/dst'
15
+ new_dst = '/path/to/new/dst'
16
+
17
+ image = MyImage.new '/path/to/src', original_dst
18
+
19
+ assert_equal image.dst!(new_dst), image
20
+ assert_equal image.dst, new_dst
21
+ end
22
+
23
+ test "it should define a version" do
24
+ class BlurredImage
25
+ include Vips::Process
26
+ version(:blurred) { 'blurred' }
27
+ end
28
+
29
+ image = MyImage.new '/path/to/src'
30
+
31
+ assert image.respond_to?(:blurred_version)
32
+ end
33
+
34
+ test "it should allow a version to be composed out of other versions" do print 'S' end
35
+ test "it should allow a version to be composed out of other versions and have a block" do print 'S' end
36
+ test "it should reset the settings after process! runs" do print 'S' end
@@ -0,0 +1,21 @@
1
+ # coding: utf-8
2
+ require File.expand_path('../lib/vips-process/version', __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = 'vips-process'
6
+ s.version = Vips::Process::VERSION
7
+ s.authors = ['Darío Javier Cravero']
8
+ s.email = ['dario@uxtemple.com']
9
+ s.summary = %q{ruby-vips operation-oriented processing}
10
+ s.description = %q{Process your images with ruby-vips using an operation-oriented approach.}
11
+ s.homepage = 'https://github.com/dariocravero/vips-process'
12
+ s.license = 'MIT'
13
+ s.files = Dir['LICENSE', 'README.md', 'Rakefile', 'Gemfile', 'Gemfile.lock',
14
+ 'vips-process.gemspec', 'lib/**/*.rb', 'test/*.rb']
15
+
16
+ s.add_dependency 'ruby-vips', '~> 0.3.9'
17
+ s.add_development_dependency 'pry', '~> 0.10.1'
18
+ s.add_development_dependency 'cutest', '~> 1.2.1'
19
+ s.add_development_dependency 'bundler', '~> 1.7'
20
+ s.add_development_dependency 'rake', '~> 10.0'
21
+ end
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vips-process
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Darío Javier Cravero
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ruby-vips
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.3.9
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.3.9
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.10.1
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.10.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: cutest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.2.1
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.2.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.7'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.7'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ description: Process your images with ruby-vips using an operation-oriented approach.
84
+ email:
85
+ - dario@uxtemple.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - Gemfile
91
+ - Gemfile.lock
92
+ - LICENSE
93
+ - README.md
94
+ - Rakefile
95
+ - lib/vips-process.rb
96
+ - lib/vips-process/auto-orient.rb
97
+ - lib/vips-process/base.rb
98
+ - lib/vips-process/convert.rb
99
+ - lib/vips-process/gaussian-blur.rb
100
+ - lib/vips-process/quality.rb
101
+ - lib/vips-process/resize.rb
102
+ - lib/vips-process/strip.rb
103
+ - lib/vips-process/version.rb
104
+ - test/helpers.rb
105
+ - test/vips-process-test.rb
106
+ - vips-process.gemspec
107
+ homepage: https://github.com/dariocravero/vips-process
108
+ licenses:
109
+ - MIT
110
+ metadata: {}
111
+ post_install_message:
112
+ rdoc_options: []
113
+ require_paths:
114
+ - lib
115
+ required_ruby_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ required_rubygems_version: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ requirements: []
126
+ rubyforge_project:
127
+ rubygems_version: 2.2.2
128
+ signing_key:
129
+ specification_version: 4
130
+ summary: ruby-vips operation-oriented processing
131
+ test_files: []
132
+ has_rdoc: