mini_magick 4.0.0 → 4.0.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of mini_magick might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/mini_magick/image.rb +5 -1
- data/lib/mini_magick/version.rb +1 -1
- metadata +3 -29
- data/spec/fixtures/animation.gif +0 -0
- data/spec/fixtures/default.jpg +0 -0
- data/spec/fixtures/exif.jpg +0 -0
- data/spec/fixtures/image.psd +0 -0
- data/spec/fixtures/not_an_image.rb +0 -1
- data/spec/lib/mini_magick/configuration_spec.rb +0 -66
- data/spec/lib/mini_magick/image_spec.rb +0 -460
- data/spec/lib/mini_magick/shell_spec.rb +0 -66
- data/spec/lib/mini_magick/tool_spec.rb +0 -107
- data/spec/lib/mini_magick/utilities_spec.rb +0 -17
- data/spec/lib/mini_magick_spec.rb +0 -39
- data/spec/spec_helper.rb +0 -21
- data/spec/support/helpers.rb +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7813127461ce5e5ca5f48e6a502672535afd76d4
|
4
|
+
data.tar.gz: e82edbba8bb1af4fc07103cbaea62430f03fbb3f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0fee195089d16cd7e8f3ac7b034c1569a7f353116966000698f18153f7c0fa5a4b71b2620375b460d02497521c5d275f68072e8b4960bfc87f9df64c0d2b2014
|
7
|
+
data.tar.gz: da4fbde0cffd34084dd50340d4c8e8e51f5b26773b77370f856cc7aeb814e78ca605c053a055b54437bb9127e9c1fc0f631fd0eba581ca8e0b41d0b24217b5a5
|
data/lib/mini_magick/image.rb
CHANGED
@@ -121,7 +121,11 @@ module MiniMagick
|
|
121
121
|
#
|
122
122
|
def self.attribute(name, key = name.to_s)
|
123
123
|
define_method(name) do |*args|
|
124
|
-
|
124
|
+
if args.any? && MiniMagick::Tool::Mogrify.instance_methods.include?(name)
|
125
|
+
mogrify { |b| b.send(name, *args) }
|
126
|
+
else
|
127
|
+
@info[key, *args]
|
128
|
+
end
|
125
129
|
end
|
126
130
|
end
|
127
131
|
|
data/lib/mini_magick/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mini_magick
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Corey Johnson
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2014-11-
|
15
|
+
date: 2014-11-23 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: rake
|
@@ -76,19 +76,6 @@ files:
|
|
76
76
|
- lib/mini_magick/tool/stream.rb
|
77
77
|
- lib/mini_magick/utilities.rb
|
78
78
|
- lib/mini_magick/version.rb
|
79
|
-
- spec/fixtures/animation.gif
|
80
|
-
- spec/fixtures/default.jpg
|
81
|
-
- spec/fixtures/exif.jpg
|
82
|
-
- spec/fixtures/image.psd
|
83
|
-
- spec/fixtures/not_an_image.rb
|
84
|
-
- spec/lib/mini_magick/configuration_spec.rb
|
85
|
-
- spec/lib/mini_magick/image_spec.rb
|
86
|
-
- spec/lib/mini_magick/shell_spec.rb
|
87
|
-
- spec/lib/mini_magick/tool_spec.rb
|
88
|
-
- spec/lib/mini_magick/utilities_spec.rb
|
89
|
-
- spec/lib/mini_magick_spec.rb
|
90
|
-
- spec/spec_helper.rb
|
91
|
-
- spec/support/helpers.rb
|
92
79
|
homepage: https://github.com/minimagick/minimagick
|
93
80
|
licenses:
|
94
81
|
- MIT
|
@@ -114,17 +101,4 @@ rubygems_version: 2.2.2
|
|
114
101
|
signing_key:
|
115
102
|
specification_version: 4
|
116
103
|
summary: Manipulate images with minimal use of memory via ImageMagick / GraphicsMagick
|
117
|
-
test_files:
|
118
|
-
- spec/fixtures/animation.gif
|
119
|
-
- spec/fixtures/default.jpg
|
120
|
-
- spec/fixtures/exif.jpg
|
121
|
-
- spec/fixtures/image.psd
|
122
|
-
- spec/fixtures/not_an_image.rb
|
123
|
-
- spec/lib/mini_magick/configuration_spec.rb
|
124
|
-
- spec/lib/mini_magick/image_spec.rb
|
125
|
-
- spec/lib/mini_magick/shell_spec.rb
|
126
|
-
- spec/lib/mini_magick/tool_spec.rb
|
127
|
-
- spec/lib/mini_magick/utilities_spec.rb
|
128
|
-
- spec/lib/mini_magick_spec.rb
|
129
|
-
- spec/spec_helper.rb
|
130
|
-
- spec/support/helpers.rb
|
104
|
+
test_files: []
|
data/spec/fixtures/animation.gif
DELETED
Binary file
|
data/spec/fixtures/default.jpg
DELETED
Binary file
|
data/spec/fixtures/exif.jpg
DELETED
Binary file
|
data/spec/fixtures/image.psd
DELETED
Binary file
|
@@ -1 +0,0 @@
|
|
1
|
-
expect(__FILE__).not_to be_an_image
|
@@ -1,66 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe MiniMagick::Configuration do
|
4
|
-
subject { Object.new.extend(MiniMagick::Configuration) }
|
5
|
-
|
6
|
-
describe "#configure" do
|
7
|
-
it "yields self" do
|
8
|
-
expect { |b| subject.configure(&b) }
|
9
|
-
.to yield_with_args(subject)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
describe "#cli" do
|
14
|
-
it "can be assigned" do
|
15
|
-
subject.cli = :imagemagick
|
16
|
-
expect(subject.cli).to eq :imagemagick
|
17
|
-
end
|
18
|
-
|
19
|
-
it "returns :imagemagick if #processor is mogrify" do
|
20
|
-
allow(subject).to receive(:processor).and_return("mogrify")
|
21
|
-
expect(subject.cli).to eq :imagemagick
|
22
|
-
end
|
23
|
-
|
24
|
-
it "returns :graphicsmagick if #processor is gm" do
|
25
|
-
allow(subject).to receive(:processor).and_return("gm")
|
26
|
-
expect(subject.cli).to eq :graphicsmagick
|
27
|
-
end
|
28
|
-
|
29
|
-
it "returns nil of #processor is nil" do
|
30
|
-
allow(subject).to receive(:processor).and_return(nil)
|
31
|
-
expect(subject.cli).to eq nil
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
describe "#cli=" do
|
36
|
-
it "raises an error when set to an invalid value" do
|
37
|
-
expect { subject.cli = :grapicsmagick }
|
38
|
-
.to raise_error(ArgumentError)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe "#processor" do
|
43
|
-
it "assigns :mogrify by default" do
|
44
|
-
expect(subject.processor).to eq "mogrify"
|
45
|
-
end
|
46
|
-
|
47
|
-
it "assigns :gm if ImageMagick is not available" do
|
48
|
-
allow(MiniMagick::Utilities).to receive(:which).with("mogrify").and_return(nil)
|
49
|
-
allow(MiniMagick::Utilities).to receive(:which).with("gm").and_return(true)
|
50
|
-
expect(subject.processor).to eq "gm"
|
51
|
-
end
|
52
|
-
|
53
|
-
it "returns nil if neither ImageMagick nor GraphicsMagick are available" do
|
54
|
-
allow(MiniMagick::Utilities).to receive(:which).with("mogrify").and_return(nil)
|
55
|
-
allow(MiniMagick::Utilities).to receive(:which).with("gm").and_return(nil)
|
56
|
-
expect(subject.processor).to eq nil
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
describe "#processor=" do
|
61
|
-
it "raises an error when set to an invalid value" do
|
62
|
-
expect { subject.processor = "mogrfy" }
|
63
|
-
.to raise_error(ArgumentError)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
@@ -1,460 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require "pathname"
|
3
|
-
require "tempfile"
|
4
|
-
require "fileutils"
|
5
|
-
require "stringio"
|
6
|
-
|
7
|
-
["ImageMagick", "GraphicsMagick"].each do |cli|
|
8
|
-
RSpec.context "With #{cli}", cli: cli.downcase.to_sym do
|
9
|
-
describe MiniMagick::Image do
|
10
|
-
subject { described_class.open(image_path) }
|
11
|
-
|
12
|
-
describe ".read" do
|
13
|
-
it "reads image from String" do
|
14
|
-
string = File.binread(image_path)
|
15
|
-
image = described_class.read(string)
|
16
|
-
expect(image).to be_valid
|
17
|
-
end
|
18
|
-
|
19
|
-
it "reads image from StringIO" do
|
20
|
-
stringio = StringIO.new(File.binread(image_path))
|
21
|
-
image = described_class.read(stringio)
|
22
|
-
expect(image).to be_valid
|
23
|
-
end
|
24
|
-
|
25
|
-
it "reads image from tempfile" do
|
26
|
-
tempfile = Tempfile.open('magick')
|
27
|
-
FileUtils.cp image_path, tempfile.path
|
28
|
-
image = described_class.read(tempfile)
|
29
|
-
expect(image).to be_valid
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
describe ".import_pixels" do
|
34
|
-
let(:dimensions) { [325, 200] }
|
35
|
-
let(:depth) { 16 } # 16 bits (2 bytes) per pixel
|
36
|
-
let(:map) { 'gray' }
|
37
|
-
let(:pixels) { Array.new(dimensions.inject(:*)) { |i| i } }
|
38
|
-
let(:blob) { pixels.pack('S*') } # unsigned short, native byte order
|
39
|
-
|
40
|
-
it "can import pixels with default format" do
|
41
|
-
image = described_class.import_pixels(blob, *dimensions, depth, map)
|
42
|
-
|
43
|
-
expect(image).to be_valid
|
44
|
-
expect(image.type).to eq 'PNG'
|
45
|
-
expect(image.dimensions).to eq dimensions
|
46
|
-
end
|
47
|
-
|
48
|
-
it "can import pixels with custom format" do
|
49
|
-
image = described_class.import_pixels(blob, *dimensions, depth, map, 'jpeg')
|
50
|
-
|
51
|
-
expect(image).to be_valid
|
52
|
-
expect(image.type).to eq 'JPEG'
|
53
|
-
expect(image.dimensions).to eq dimensions
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
describe ".open" do
|
58
|
-
it "makes a copy of the image" do
|
59
|
-
image = described_class.open(image_path)
|
60
|
-
expect(image.path).not_to eq image_path
|
61
|
-
expect(image).to be_valid
|
62
|
-
end
|
63
|
-
|
64
|
-
it "accepts a Pathname" do
|
65
|
-
image = described_class.open(Pathname(image_path))
|
66
|
-
expect(image).to be_valid
|
67
|
-
end
|
68
|
-
|
69
|
-
it "loads a remote image" do
|
70
|
-
begin
|
71
|
-
image = described_class.open(image_url)
|
72
|
-
expect(image).to be_valid
|
73
|
-
rescue SocketError
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
it "validates the image" do
|
78
|
-
expect { described_class.open(image_path(:not)) }
|
79
|
-
.to raise_error(MiniMagick::Invalid)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
describe ".create" do
|
84
|
-
def create(path = image_path)
|
85
|
-
described_class.create do |f|
|
86
|
-
f.write(File.binread(path))
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
it "creates an image" do
|
91
|
-
image = create
|
92
|
-
expect(File.exists?(image.path)).to eq true
|
93
|
-
end
|
94
|
-
|
95
|
-
it "validates the image if validation is set" do
|
96
|
-
allow(MiniMagick).to receive(:validate_on_create).and_return(true)
|
97
|
-
expect { create(image_path(:not)) }
|
98
|
-
.to raise_error(MiniMagick::Invalid)
|
99
|
-
end
|
100
|
-
|
101
|
-
it "doesn't validate image if validation is disabled" do
|
102
|
-
allow(MiniMagick).to receive(:validate_on_create).and_return(false)
|
103
|
-
expect { create(image_path(:not)) }
|
104
|
-
.not_to raise_error
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
describe "#initialize" do
|
109
|
-
it "initializes a new image" do
|
110
|
-
image = described_class.new(image_path)
|
111
|
-
expect(image).to be_valid
|
112
|
-
end
|
113
|
-
|
114
|
-
it "accepts a block which it passes on to #combine_options" do
|
115
|
-
image = described_class.new(subject.path) do |b|
|
116
|
-
b.resize "100x100!"
|
117
|
-
end
|
118
|
-
expect(image.dimensions).to eq [100, 100]
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
describe "equivalence" do
|
123
|
-
subject(:image) { described_class.new(image_path) }
|
124
|
-
let(:same_image) { described_class.new(image_path) }
|
125
|
-
let(:other_image) { described_class.new(image_path(:exif)) }
|
126
|
-
|
127
|
-
it "is #== and #eql? to itself" do
|
128
|
-
expect(image).to eq(image)
|
129
|
-
expect(image).to eql(image)
|
130
|
-
end
|
131
|
-
|
132
|
-
it "is #== and #eql? to an instance of the same image" do
|
133
|
-
expect(image).to eq(same_image)
|
134
|
-
expect(image).to eql(same_image)
|
135
|
-
end
|
136
|
-
|
137
|
-
it "is not #== nor #eql? to an instance of a different image" do
|
138
|
-
expect(image).not_to eq(other_image)
|
139
|
-
expect(image).not_to eql(other_image)
|
140
|
-
end
|
141
|
-
|
142
|
-
it "generates the same hash code for an instance of the same image" do
|
143
|
-
expect(image.hash).to eq(same_image.hash)
|
144
|
-
end
|
145
|
-
|
146
|
-
it "generates different same hash codes for a different image" do
|
147
|
-
expect(image.hash).not_to eq(other_image.hash)
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
describe "#format" do
|
152
|
-
subject { described_class.open(image_path(:jpg)) }
|
153
|
-
|
154
|
-
it "changes the format of the photo" do
|
155
|
-
expect { subject.format("png") }
|
156
|
-
.to change { subject.type }
|
157
|
-
end
|
158
|
-
|
159
|
-
it "reformats an image with a given extension" do
|
160
|
-
expect { subject.format('png') }
|
161
|
-
.to change { File.extname(subject.path) }.to ".png"
|
162
|
-
end
|
163
|
-
|
164
|
-
it "creates the file with new extension" do
|
165
|
-
subject.format('png')
|
166
|
-
expect(File.exist?(subject.path)).to eq true
|
167
|
-
end
|
168
|
-
|
169
|
-
it "accepts a block of additional commands" do
|
170
|
-
expect {
|
171
|
-
subject.format("png") do |b|
|
172
|
-
b.resize("100x100!")
|
173
|
-
end
|
174
|
-
}.to change { subject.dimensions }.to [100, 100]
|
175
|
-
end
|
176
|
-
|
177
|
-
it "works without an extension" do
|
178
|
-
subject = described_class.open(image_path(:without_extension))
|
179
|
-
expect { subject.format("png") }
|
180
|
-
.to change { File.extname(subject.path) }.from("").to(".png")
|
181
|
-
end
|
182
|
-
|
183
|
-
it "deletes the previous tempfile" do
|
184
|
-
old_path = subject.path.dup
|
185
|
-
subject.format('png')
|
186
|
-
expect(File.exist?(old_path)).to eq false
|
187
|
-
end
|
188
|
-
|
189
|
-
it "doesn't delete itself when formatted to the same format" do
|
190
|
-
subject.format(subject.type.downcase)
|
191
|
-
expect(File.exists?(subject.path)).to eq true
|
192
|
-
end
|
193
|
-
|
194
|
-
it "reformats multi-image formats to multiple images" do
|
195
|
-
subject = described_class.open(image_path(:animation))
|
196
|
-
subject.format('jpg', nil)
|
197
|
-
expect(Dir[subject.path.sub('.', '*.')]).not_to be_empty
|
198
|
-
end
|
199
|
-
|
200
|
-
it "reformats multi-image formats to a single image" do
|
201
|
-
subject = described_class.open(image_path(:animation))
|
202
|
-
subject.format('jpg')
|
203
|
-
expect(subject).to be_valid
|
204
|
-
end
|
205
|
-
|
206
|
-
it "returns self" do
|
207
|
-
expect(subject.format('png')).to eq subject
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
describe "#write" do
|
212
|
-
it "writes the image" do
|
213
|
-
output_path = random_path("test output")
|
214
|
-
subject.write(output_path)
|
215
|
-
expect(described_class.new(output_path)).to be_valid
|
216
|
-
end
|
217
|
-
|
218
|
-
it "writes an image with stream" do
|
219
|
-
output_stream = StringIO.new
|
220
|
-
subject.write(output_stream)
|
221
|
-
expect(described_class.read(output_stream.string)).to be_valid
|
222
|
-
end
|
223
|
-
|
224
|
-
it "writes layers" do
|
225
|
-
output_path = random_path(["", ".#{subject.type.downcase}"])
|
226
|
-
subject = described_class.new(image_path(:gif))
|
227
|
-
subject.frames.first.write(output_path)
|
228
|
-
expect(described_class.new(output_path)).to be_valid
|
229
|
-
end
|
230
|
-
|
231
|
-
it "accepts a Pathname" do
|
232
|
-
output_path = Pathname(random_path)
|
233
|
-
subject.write(output_path)
|
234
|
-
expect(described_class.new(output_path.to_s)).to be_valid
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
describe "#valid?" do
|
239
|
-
it "returns true when image is valid" do
|
240
|
-
image = described_class.new(image_path)
|
241
|
-
expect(image).to be_valid
|
242
|
-
end
|
243
|
-
|
244
|
-
it "returns false when image is not valid" do
|
245
|
-
image = described_class.new(image_path(:not))
|
246
|
-
expect(image).not_to be_valid
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
describe "#[]" do
|
251
|
-
it "inspects image meta info" do
|
252
|
-
expect(subject[:width]).to be_a(Fixnum)
|
253
|
-
expect(subject[:height]).to be_a(Fixnum)
|
254
|
-
expect(subject[:dimensions]).to all(be_a(Fixnum))
|
255
|
-
expect(subject[:colorspace]).to be_a(String)
|
256
|
-
expect(subject[:format]).to match(/[A-Z]/)
|
257
|
-
expect(subject[:signature]).to match(/[[:alnum:]]{64}/)
|
258
|
-
end
|
259
|
-
|
260
|
-
it "supports string keys" do
|
261
|
-
expect(subject["width"]).to be_a(Fixnum)
|
262
|
-
expect(subject["height"]).to be_a(Fixnum)
|
263
|
-
expect(subject["dimensions"]).to all(be_a(Fixnum))
|
264
|
-
expect(subject["colorspace"]).to be_a(String)
|
265
|
-
expect(subject["format"]).to match(/[A-Z]/)
|
266
|
-
expect(subject['signature']).to match(/[[:alnum:]]{64}/)
|
267
|
-
end
|
268
|
-
|
269
|
-
it "reads exif" do
|
270
|
-
subject = described_class.new(image_path(:exif))
|
271
|
-
gps_latitude = subject.exif["GPSLatitude"].split(/\s*,\s*/)
|
272
|
-
gps_longitude = subject.exif["GPSLongitude"].split(/\s*,\s*/)
|
273
|
-
|
274
|
-
expect(subject["EXIF:ColorSpace"]).to eq "1"
|
275
|
-
expect(gps_latitude.size).to eq 3
|
276
|
-
expect(gps_longitude.size).to eq 3
|
277
|
-
end
|
278
|
-
|
279
|
-
it "passes unknown values directly to -format" do
|
280
|
-
expect(subject["%w %h"].split.map(&:to_i)).to eq [subject[:width], subject[:height]]
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
it "has attributes" do
|
285
|
-
expect(subject.type).to match(/^[A-Z]+$/)
|
286
|
-
expect(subject.mime_type).to match(/^image\/[a-z]+$/)
|
287
|
-
expect(subject.width).to be_a(Fixnum).and be_nonzero
|
288
|
-
expect(subject.height).to be_a(Fixnum).and be_nonzero
|
289
|
-
expect(subject.dimensions).to all(be_a(Fixnum))
|
290
|
-
expect(subject.size).to be_a(Fixnum).and be_nonzero
|
291
|
-
expect(subject.colorspace).to be_a(String)
|
292
|
-
expect(subject.resolution).to all(be_a(Fixnum))
|
293
|
-
expect(subject.signature).to match(/[[:alnum:]]{64}/)
|
294
|
-
end
|
295
|
-
|
296
|
-
describe "#exif" do
|
297
|
-
subject { described_class.new(image_path(:exif)) }
|
298
|
-
|
299
|
-
it "returns a hash of EXIF data" do
|
300
|
-
expect(subject.exif["DateTimeOriginal"]).to be_a(String)
|
301
|
-
end
|
302
|
-
|
303
|
-
it "decodes the ExifVersion" do
|
304
|
-
expect(subject.exif["ExifVersion"]).to eq("0221")
|
305
|
-
end
|
306
|
-
end
|
307
|
-
|
308
|
-
describe "#resolution" do
|
309
|
-
it "accepts units", skip_cli: :graphicsmagick do
|
310
|
-
expect(subject.resolution("PixelsPerCentimeter"))
|
311
|
-
.not_to eq subject.resolution("PixelsPerInch")
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
|
-
describe "#mime_type" do
|
316
|
-
it "returns the correct mime type" do
|
317
|
-
jpg = described_class.new(image_path(:jpg))
|
318
|
-
expect(jpg.mime_type).to eq 'image/jpeg'
|
319
|
-
end
|
320
|
-
end
|
321
|
-
|
322
|
-
describe "#layers" do
|
323
|
-
it "returns a list of images" do
|
324
|
-
expect(subject.layers).to all(be_a(MiniMagick::Image))
|
325
|
-
expect(subject.layers.first).to be_valid
|
326
|
-
end
|
327
|
-
|
328
|
-
it "returns multiple images for GIFs, PDFs and PSDs" do
|
329
|
-
gif = described_class.new(image_path(:gif))
|
330
|
-
psd = described_class.new(image_path(:psd))
|
331
|
-
|
332
|
-
expect(gif.frames.count).to be > 1
|
333
|
-
expect(psd.layers.count).to be > 1 unless MiniMagick.graphicsmagick?
|
334
|
-
end
|
335
|
-
|
336
|
-
it "returns one image for other formats" do
|
337
|
-
jpg = described_class.new(image_path(:jpg))
|
338
|
-
|
339
|
-
expect(jpg.layers.count).to eq 1
|
340
|
-
end
|
341
|
-
end
|
342
|
-
|
343
|
-
describe "missing methods" do
|
344
|
-
context "for a known method" do
|
345
|
-
it "is executed by #method_missing" do
|
346
|
-
expect { subject.resize '20x30!' }
|
347
|
-
.to change { subject.dimensions }.to [20, 30]
|
348
|
-
end
|
349
|
-
|
350
|
-
it "returns self" do
|
351
|
-
expect(subject.resize('20x30!')).to eq subject
|
352
|
-
end
|
353
|
-
|
354
|
-
it "can be responed to" do
|
355
|
-
expect(subject.respond_to?(:resize)).to eq true
|
356
|
-
end
|
357
|
-
end
|
358
|
-
|
359
|
-
context "for an unknown method" do
|
360
|
-
it "fails with a NoMethodError" do
|
361
|
-
expect { subject.foo }
|
362
|
-
.to raise_error(NoMethodError, /MiniMagick::Image/)
|
363
|
-
end
|
364
|
-
|
365
|
-
it "cannot be responded to" do
|
366
|
-
expect(subject.respond_to?(:foo)).to eq false
|
367
|
-
end
|
368
|
-
end
|
369
|
-
end
|
370
|
-
|
371
|
-
describe "#combine_options" do
|
372
|
-
it "chains multiple options and executes them in one command" do
|
373
|
-
expect {
|
374
|
-
subject.combine_options { |c| c.resize '20x30!' }
|
375
|
-
}.to change { subject.dimensions }.to [20, 30]
|
376
|
-
end
|
377
|
-
|
378
|
-
it "doesn't allow calling of #format" do
|
379
|
-
expect { subject.combine_options { |c| c.format("png") } }
|
380
|
-
.to raise_error(NoMethodError)
|
381
|
-
end
|
382
|
-
|
383
|
-
it "returns self" do
|
384
|
-
expect(subject.combine_options {}).to eq subject
|
385
|
-
end
|
386
|
-
end
|
387
|
-
|
388
|
-
describe "#composite" do
|
389
|
-
let(:other_image) { described_class.open(image_path) }
|
390
|
-
let(:mask) { described_class.open(image_path) }
|
391
|
-
|
392
|
-
it "creates a composite of two images" do
|
393
|
-
image = subject.composite(other_image)
|
394
|
-
expect(image).to be_valid
|
395
|
-
end
|
396
|
-
|
397
|
-
it "creates a composite of two images with mask" do
|
398
|
-
image = subject.composite(other_image, 'jpg', mask)
|
399
|
-
expect(image).to be_valid
|
400
|
-
end
|
401
|
-
|
402
|
-
it "yields an optional block" do
|
403
|
-
expect { |b| subject.composite(other_image, &b) }
|
404
|
-
.to yield_with_args(an_instance_of(MiniMagick::Tool::Composite))
|
405
|
-
end
|
406
|
-
|
407
|
-
it "makes the composited image with the provided extension" do
|
408
|
-
result = subject.composite(other_image, 'png')
|
409
|
-
expect(result.path).to end_with ".png"
|
410
|
-
|
411
|
-
result = subject.composite(other_image)
|
412
|
-
expect(result.path).to end_with ".jpg"
|
413
|
-
end
|
414
|
-
end
|
415
|
-
|
416
|
-
describe "#collapse!" do
|
417
|
-
subject { described_class.open(image_path(:animation)) }
|
418
|
-
|
419
|
-
it "collapses the image to one frame" do
|
420
|
-
subject.collapse!
|
421
|
-
expect(subject.identify.lines.count).to eq 1
|
422
|
-
end
|
423
|
-
|
424
|
-
it "keeps the extension" do
|
425
|
-
expect { subject.collapse! }
|
426
|
-
.not_to change { subject.type }
|
427
|
-
end
|
428
|
-
|
429
|
-
it "clears the info" do
|
430
|
-
expect { subject.collapse! }
|
431
|
-
.to change { subject.size }
|
432
|
-
end
|
433
|
-
|
434
|
-
it "returns self" do
|
435
|
-
expect(subject.collapse!).to eq subject
|
436
|
-
end
|
437
|
-
end
|
438
|
-
|
439
|
-
describe "#identify" do
|
440
|
-
it "returns the output of identify" do
|
441
|
-
expect(subject.identify).to match(subject.type)
|
442
|
-
end
|
443
|
-
|
444
|
-
it "yields an optional block" do
|
445
|
-
output = subject.identify do |b|
|
446
|
-
b.verbose
|
447
|
-
end
|
448
|
-
expect(output).to match("Format:")
|
449
|
-
end
|
450
|
-
end
|
451
|
-
|
452
|
-
describe "#run_command" do
|
453
|
-
it "runs the given command" do
|
454
|
-
output = subject.run_command("identify", "-format", "%w", subject.path)
|
455
|
-
expect(output).to eq subject.width.to_s
|
456
|
-
end
|
457
|
-
end
|
458
|
-
end
|
459
|
-
end
|
460
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe MiniMagick::Shell do
|
4
|
-
subject { described_class.new }
|
5
|
-
|
6
|
-
describe "#run" do
|
7
|
-
it "calls #execute with the command" do
|
8
|
-
expect(subject).to receive(:execute).and_call_original
|
9
|
-
subject.run(%W[identify #{image_path}])
|
10
|
-
end
|
11
|
-
|
12
|
-
it "returns stdout" do
|
13
|
-
allow(subject).to receive(:execute).and_return(["stdout", "stderr", 0])
|
14
|
-
output = subject.run(%W[foo])
|
15
|
-
expect(output).to eq "stdout"
|
16
|
-
end
|
17
|
-
|
18
|
-
it "uses stderr for error messages" do
|
19
|
-
allow(subject).to receive(:execute).and_return(["", "stderr", 1])
|
20
|
-
expect { subject.run(%W[foo]) }
|
21
|
-
.to raise_error(MiniMagick::Error, /`foo`.*stderr/m)
|
22
|
-
end
|
23
|
-
|
24
|
-
it "raises an error when executable wasn't found" do
|
25
|
-
allow(subject).to receive(:execute).and_return(["", "not found", 127])
|
26
|
-
expect { subject.run(%W[foo]) }
|
27
|
-
.to raise_error(MiniMagick::Error, /not found/)
|
28
|
-
end
|
29
|
-
|
30
|
-
it "raises errors only in whiny mode" do
|
31
|
-
subject = described_class.new(false)
|
32
|
-
allow(subject).to receive(:execute).and_return(["stdout", "", 127])
|
33
|
-
expect(subject.run(%W[foo])).to eq "stdout"
|
34
|
-
end
|
35
|
-
|
36
|
-
it "prints to stderr output to $stderr in non-whiny mode" do
|
37
|
-
subject = described_class.new(false)
|
38
|
-
allow(subject).to receive(:execute).and_return(["", "stderr", 1])
|
39
|
-
expect { subject.run(%W[foo]) }.to output("stderr").to_stderr
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
describe "#execute" do
|
44
|
-
it "executes the command in the shell" do
|
45
|
-
stdout, * = subject.execute(%W[identify #{image_path(:gif)}])
|
46
|
-
expect(stdout).to match("GIF")
|
47
|
-
end
|
48
|
-
|
49
|
-
it "logs the command and execution time in debug mode" do
|
50
|
-
allow(MiniMagick).to receive(:debug).and_return(true)
|
51
|
-
expect { subject.execute(%W[identify #{image_path(:gif)}]) }.
|
52
|
-
to output(/\[\d+.\d+s\] identify #{image_path(:gif)}/).to_stdout
|
53
|
-
end
|
54
|
-
|
55
|
-
it "returns an appropriate response when command wasn't found" do
|
56
|
-
stdout, stderr, code = subject.execute(%W[unexisting command])
|
57
|
-
expect(code).to eq 127
|
58
|
-
expect(stderr).to match(/not found/)
|
59
|
-
end
|
60
|
-
|
61
|
-
it "doesn't break on spaces" do
|
62
|
-
stdout, * = subject.execute(["identify", "-format", "%w %h", image_path])
|
63
|
-
expect(stdout).to match(/\d+ \d+/)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
@@ -1,107 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe MiniMagick::Tool do
|
4
|
-
subject { MiniMagick::Tool::Identify.new }
|
5
|
-
|
6
|
-
describe "#call" do
|
7
|
-
it "calls the shell to run the command" do
|
8
|
-
subject << image_path(:gif)
|
9
|
-
output = subject.call
|
10
|
-
expect(output).to match("GIF")
|
11
|
-
end
|
12
|
-
|
13
|
-
it "strips the output" do
|
14
|
-
subject << image_path
|
15
|
-
output = subject.call
|
16
|
-
expect(output).not_to end_with("\n")
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe ".new" do
|
21
|
-
it "accepts a block, and immediately executes the command" do
|
22
|
-
output = described_class.new("identify") do |builder|
|
23
|
-
builder << image_path(:gif)
|
24
|
-
end
|
25
|
-
expect(output).to match("GIF")
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
describe "#command" do
|
30
|
-
it "includes the executable and the arguments" do
|
31
|
-
allow(subject).to receive(:args).and_return(%W[-list Command])
|
32
|
-
expect(subject.command).to include(*%W[identify -list Command])
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
describe "#executable" do
|
37
|
-
it "prepends 'gm' to the command list when using GraphicsMagick" do
|
38
|
-
allow(MiniMagick).to receive(:cli).and_return(:graphicsmagick)
|
39
|
-
expect(subject.executable).to eq %W[gm identify]
|
40
|
-
end
|
41
|
-
|
42
|
-
it "respects #cli_path" do
|
43
|
-
allow(MiniMagick).to receive(:cli).and_return(:imagemagick)
|
44
|
-
allow(MiniMagick).to receive(:cli_path).and_return("path/to/cli")
|
45
|
-
expect(subject.executable).to eq %W[path/to/cli/identify]
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
describe "#<<" do
|
50
|
-
it "adds argument to the args list" do
|
51
|
-
subject << "foo" << "bar" << 123
|
52
|
-
expect(subject.args).to eq %W[foo bar 123]
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
describe "#merge!" do
|
57
|
-
it "adds arguments to the args list" do
|
58
|
-
subject << "pre-existing"
|
59
|
-
subject.merge! ["foo", 123]
|
60
|
-
expect(subject.args).to eq %W[pre-existing foo 123]
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
describe "#+" do
|
65
|
-
it "switches the last option to + form" do
|
66
|
-
subject.help
|
67
|
-
subject.help.+
|
68
|
-
subject.debug.+ "foo"
|
69
|
-
subject.debug.+ 8, "bar"
|
70
|
-
expect(subject.args).to eq %W[-help +help +debug foo +debug 8 bar]
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
["ImageMagick", "GraphicsMagick"].each do |cli|
|
75
|
-
context "with #{cli}", cli: cli.downcase.to_sym do
|
76
|
-
it "adds dynamically generated operator methods" do
|
77
|
-
subject.help.depth(8)
|
78
|
-
expect(subject.args).to eq %W[-help -depth 8]
|
79
|
-
end
|
80
|
-
|
81
|
-
it "doesn't just delegate to #method_missing" do
|
82
|
-
expect(subject.class.instance_methods).to include(:help)
|
83
|
-
end
|
84
|
-
|
85
|
-
it "adds dynamically generated creation operator methods" do
|
86
|
-
subject.radial_gradient.canvas "khaki"
|
87
|
-
expect(subject.args).to eq %W[radial-gradient: canvas:khaki]
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
it "resets the dynamically generated operator methods on CLI change" do
|
93
|
-
MiniMagick.cli = :imagemagick
|
94
|
-
expect(subject).to respond_to(:quiet)
|
95
|
-
|
96
|
-
MiniMagick.cli = :graphicsmagick
|
97
|
-
expect(subject).not_to respond_to(:quiet)
|
98
|
-
expect(subject).to respond_to(:ping)
|
99
|
-
end
|
100
|
-
|
101
|
-
it "doesn't raise errors when false is passed to the constructor" do
|
102
|
-
subject.help
|
103
|
-
subject.call(false)
|
104
|
-
|
105
|
-
MiniMagick::Tool::Identify.new(false, &:help)
|
106
|
-
end
|
107
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe MiniMagick::Utilities do
|
4
|
-
describe ".which" do
|
5
|
-
it "identifies when mogrify exists" do
|
6
|
-
expect(MiniMagick::Utilities.which('mogrify')).not_to be_nil
|
7
|
-
end
|
8
|
-
|
9
|
-
it "identifies when gm exists" do
|
10
|
-
expect(MiniMagick::Utilities.which('gm')).not_to be_nil
|
11
|
-
end
|
12
|
-
|
13
|
-
it "returns nil on nonexistent executables" do
|
14
|
-
expect(MiniMagick::Utilities.which('yogrify')).to be_nil
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe MiniMagick do
|
4
|
-
describe ".imagemagick?" do
|
5
|
-
it "returns true if CLI is minimagick" do
|
6
|
-
allow(described_class).to receive(:cli).and_return(:imagemagick)
|
7
|
-
expect(described_class.imagemagick?).to eq true
|
8
|
-
end
|
9
|
-
|
10
|
-
it "returns false if CLI isn't minimagick" do
|
11
|
-
allow(described_class).to receive(:cli).and_return(:graphicsmagick)
|
12
|
-
expect(described_class.imagemagick?).to eq false
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe ".graphicsmagick?" do
|
17
|
-
it "returns true if CLI is graphicsmagick" do
|
18
|
-
allow(described_class).to receive(:cli).and_return(:graphicsmagick)
|
19
|
-
expect(described_class.graphicsmagick?).to eq true
|
20
|
-
end
|
21
|
-
|
22
|
-
it "returns false if CLI isn't graphicsmagick" do
|
23
|
-
allow(described_class).to receive(:cli).and_return(:imagemagick)
|
24
|
-
expect(described_class.graphicsmagick?).to eq false
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe ".cli_version" do
|
29
|
-
it "returns ImageMagick's version" do
|
30
|
-
allow(described_class).to receive(:cli).and_return(:imagemagick)
|
31
|
-
expect(described_class.cli_version).to match(/^\d+\.\d+\.\d+-\d+$/)
|
32
|
-
end
|
33
|
-
|
34
|
-
it "returns GraphicsMagick's version" do
|
35
|
-
allow(described_class).to receive(:cli).and_return(:graphicsmagick)
|
36
|
-
expect(described_class.cli_version).to match(/^\d+\.\d+\.\d+$/)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require "bundler/setup"
|
2
|
-
require "mini_magick"
|
3
|
-
require "pry"
|
4
|
-
|
5
|
-
require_relative "support/helpers"
|
6
|
-
|
7
|
-
RSpec.configure do |config|
|
8
|
-
config.disable_monkey_patching!
|
9
|
-
config.formatter = "documentation"
|
10
|
-
config.color = true
|
11
|
-
config.fail_fast = true unless ENV["CI"]
|
12
|
-
|
13
|
-
[:imagemagick, :graphicsmagick].each do |cli|
|
14
|
-
config.around(cli: cli) do |example|
|
15
|
-
MiniMagick.with_cli(cli) { example.run }
|
16
|
-
end
|
17
|
-
config.around(skip_cli: cli) do |example|
|
18
|
-
example.run unless example.metadata[:cli] == cli
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/spec/support/helpers.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
require "tempfile"
|
2
|
-
|
3
|
-
module Helpers
|
4
|
-
def image_path(type = :default)
|
5
|
-
if type != :without_extension
|
6
|
-
File.join("spec/fixtures",
|
7
|
-
case type
|
8
|
-
when :default, :jpg then "default.jpg"
|
9
|
-
when :animation, :gif then "animation.gif"
|
10
|
-
when :pdf then "document.pdf"
|
11
|
-
when :psd then "image.psd"
|
12
|
-
when :exif then "exif.jpg"
|
13
|
-
when :not then "not_an_image.rb"
|
14
|
-
else
|
15
|
-
fail "image #{type.inspect} doesn't exist"
|
16
|
-
end
|
17
|
-
)
|
18
|
-
else
|
19
|
-
path = random_path
|
20
|
-
FileUtils.cp image_path, path
|
21
|
-
path
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def image_url
|
26
|
-
"https://avatars2.githubusercontent.com/u/795488?v=2&s=40"
|
27
|
-
end
|
28
|
-
|
29
|
-
def random_path(basename = "")
|
30
|
-
@tempfile = Tempfile.open(basename)
|
31
|
-
@tempfile.path
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
RSpec.configure do |config|
|
36
|
-
config.include Helpers
|
37
|
-
end
|