mini_magick 3.5.0 → 3.6.0

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.

data/lib/mini_magick.rb CHANGED
@@ -7,6 +7,7 @@ require 'shellwords'
7
7
  module MiniMagick
8
8
  class << self
9
9
  attr_accessor :processor
10
+ attr_accessor :processor_path
10
11
  attr_accessor :timeout
11
12
 
12
13
 
@@ -106,8 +107,8 @@ module MiniMagick
106
107
  image = create(".dat", validate = false) { |f| f.write(blob) }
107
108
  # Use ImageMagick to convert the raw data file to an image file of the desired format:
108
109
  converted_image_path = image.path[0..-4] + format
109
- argument = "-size #{columns}x#{rows} -depth #{depth} #{map}:#{image.path} #{converted_image_path}"
110
- cmd = CommandBuilder.new("convert", argument) #Example: convert -size 256x256 -depth 16 gray:blob.dat blob.png
110
+ arguments = ["-size", "#{columns}x#{rows}", "-depth", "#{depth}", "#{map}:#{image.path}", "#{converted_image_path}"]
111
+ cmd = CommandBuilder.new("convert", *arguments) #Example: convert -size 256x256 -depth 16 gray:blob.dat blob.png
111
112
  image.run(cmd)
112
113
  # Update the image instance with the path of the properly formatted image, and return:
113
114
  image.path = converted_image_path
@@ -186,10 +187,6 @@ module MiniMagick
186
187
  @tempfile = tempfile # ensures that the tempfile will stick around until this image is garbage collected.
187
188
  end
188
189
 
189
- def escaped_path
190
- Pathname.new(@path).to_s.inspect
191
- end
192
-
193
190
  # Checks to make sure that MiniMagick can read the file and understand it.
194
191
  #
195
192
  # This uses the 'identify' command line utility to check the file. If you are having
@@ -198,7 +195,7 @@ module MiniMagick
198
195
  #
199
196
  # @return [Boolean]
200
197
  def valid?
201
- run_command("identify", @path)
198
+ run_command("identify", path)
202
199
  true
203
200
  rescue MiniMagick::Invalid
204
201
  false
@@ -224,29 +221,29 @@ module MiniMagick
224
221
  # Why do I go to the trouble of putting in newlines? Because otherwise animated gifs screw everything up
225
222
  case value.to_s
226
223
  when "colorspace"
227
- run_command("identify", "-format", format_option("%r"), escaped_path).split("\n")[0].strip
224
+ run_command("identify", "-format", '%r\n', path).split("\n")[0].strip
228
225
  when "format"
229
- run_command("identify", "-format", format_option("%m"), escaped_path).split("\n")[0]
226
+ run_command("identify", "-format", '%m\n', path).split("\n")[0]
230
227
  when "height"
231
- run_command("identify", "-format", format_option("%h"), escaped_path).split("\n")[0].to_i
228
+ run_command("identify", "-format", '%h\n', path).split("\n")[0].to_i
232
229
  when "width"
233
- run_command("identify", "-format", format_option("%w"), escaped_path).split("\n")[0].to_i
230
+ run_command("identify", "-format", '%w\n', path).split("\n")[0].to_i
234
231
  when "dimensions"
235
- run_command("identify", "-format", format_option("%w %h"), escaped_path).split("\n")[0].split.map{|v|v.to_i}
232
+ run_command("identify", "-format", '%w %h\n', path).split("\n")[0].split.map{|v|v.to_i}
236
233
  when "size"
237
- File.size(@path) # Do this because calling identify -format "%b" on an animated gif fails!
234
+ File.size(path) # Do this because calling identify -format "%b" on an animated gif fails!
238
235
  when "original_at"
239
236
  # Get the EXIF original capture as a Time object
240
237
  Time.local(*self["EXIF:DateTimeOriginal"].split(/:|\s+/)) rescue nil
241
238
  when /^EXIF\:/i
242
- result = run_command('identify', '-format', "\"%[#{value}]\"", escaped_path).chop
239
+ result = run_command('identify', '-format', "%[#{value}]", path).chop
243
240
  if result.include?(",")
244
241
  read_character_data(result)
245
242
  else
246
243
  result
247
244
  end
248
245
  else
249
- run_command('identify', '-format', "\"#{value}\"", escaped_path).split("\n")[0]
246
+ run_command('identify', '-format', value, path).split("\n")[0]
250
247
  end
251
248
  end
252
249
 
@@ -256,7 +253,7 @@ module MiniMagick
256
253
  #
257
254
  # @return [String] Whatever the result from the command line is. May not be terribly useful.
258
255
  def <<(*args)
259
- run_command("mogrify", *args << escaped_path)
256
+ run_command("mogrify", *args << path)
260
257
  end
261
258
 
262
259
  # This is used to change the format of the image. That is, from "tiff to jpg" or something like that.
@@ -282,17 +279,17 @@ module MiniMagick
282
279
  c = CommandBuilder.new('mogrify', '-format', format)
283
280
  yield c if block_given?
284
281
  if page
285
- c << @path + "[#{page}]"
282
+ c << "#{path}[#{page}]"
286
283
  else
287
- c << @path
284
+ c << path
288
285
  end
289
286
  run(c)
290
287
 
291
- old_path = @path.dup
292
- @path.sub!(/(\.\w*)?$/, ".#{format}")
293
- File.delete(old_path) if old_path != @path
288
+ old_path = path
289
+ self.path = path.sub(/(\.\w*)?$/, ".#{format}")
290
+ File.delete(old_path) if old_path != path
294
291
 
295
- unless File.exists?(@path)
292
+ unless File.exists?(path)
296
293
  raise MiniMagick::Error, "Unable to format to #{format}"
297
294
  end
298
295
  end
@@ -311,10 +308,10 @@ module MiniMagick
311
308
  # Writes the temporary image that we are using for processing to the output path
312
309
  def write(output_to)
313
310
  if output_to.kind_of?(String) || !output_to.respond_to?(:write)
314
- FileUtils.copy_file @path, output_to
315
- run_command "identify", output_to.to_s.inspect # Verify that we have a good image
311
+ FileUtils.copy_file path, output_to
312
+ run_command "identify", output_to.to_s # Verify that we have a good image
316
313
  else # stream
317
- File.open(@path, "rb") do |f|
314
+ File.open(path, "rb") do |f|
318
315
  f.binmode
319
316
  while chunk = f.read(8192)
320
317
  output_to.write(chunk)
@@ -327,7 +324,7 @@ module MiniMagick
327
324
  # Gives you raw image data back
328
325
  # @return [String] binary string
329
326
  def to_blob
330
- f = File.new @path
327
+ f = File.new path
331
328
  f.binmode
332
329
  f.read
333
330
  ensure
@@ -360,17 +357,12 @@ module MiniMagick
360
357
  def combine_options(tool = "mogrify", &block)
361
358
  c = CommandBuilder.new(tool)
362
359
 
363
- c << @path if tool.to_s == "convert"
360
+ c << path if tool.to_s == "convert"
364
361
  block.call(c)
365
- c << @path
362
+ c << path
366
363
  run(c)
367
364
  end
368
365
 
369
- # Check to see if we are running on win32 -- we need to escape things differently
370
- def windows?
371
- RUBY_PLATFORM =~ /mswin|mingw|cygwin/
372
- end
373
-
374
366
  def composite(other_image, output_extension = 'jpg', &block)
375
367
  begin
376
368
  second_tempfile = Tempfile.new(output_extension)
@@ -389,11 +381,6 @@ module MiniMagick
389
381
  return Image.new(second_tempfile.path, second_tempfile)
390
382
  end
391
383
 
392
- # Outputs a carriage-return delimited format string for Unix and Windows
393
- def format_option(format)
394
- windows? ? "\"#{format}\\n\"" : "\"#{format}\\\\n\""
395
- end
396
-
397
384
  def run_command(command, *args)
398
385
  # -ping "efficiently determine image characteristics."
399
386
  if command == 'identify'
@@ -445,8 +432,6 @@ module MiniMagick
445
432
  end
446
433
 
447
434
  class CommandBuilder
448
- attr_reader :args
449
-
450
435
  def initialize(tool, *options)
451
436
  @tool = tool
452
437
  @args = []
@@ -454,7 +439,15 @@ module MiniMagick
454
439
  end
455
440
 
456
441
  def command
457
- "#{MiniMagick.processor} #{@tool} #{@args.join(' ')}".strip
442
+ com = "#{@tool} #{args.join(' ')}".strip
443
+ com = "#{MiniMagick.processor} #{com}" unless MiniMagick.processor.nil?
444
+
445
+ com = File.join MiniMagick.processor_path, com unless MiniMagick.processor_path.nil?
446
+ com.strip
447
+ end
448
+
449
+ def args
450
+ @args.map(&:shellescape)
458
451
  end
459
452
 
460
453
  # Add each mogrify command in both underscore and dash format
@@ -493,7 +486,7 @@ module MiniMagick
493
486
  push(@args.pop.gsub(/^-/, '+'))
494
487
  if options.any?
495
488
  options.each do |o|
496
- push escape_string(o)
489
+ push o
497
490
  end
498
491
  end
499
492
  end
@@ -502,15 +495,11 @@ module MiniMagick
502
495
  push "-#{command}"
503
496
  if options.any?
504
497
  options.each do |o|
505
- push escape_string(o)
498
+ push o
506
499
  end
507
500
  end
508
501
  end
509
502
 
510
- def escape_string(value)
511
- Shellwords.escape(value.to_s)
512
- end
513
-
514
503
  def add_creation_operator(command, *options)
515
504
  creation_command = command
516
505
  if options.any?
@@ -1,3 +1,3 @@
1
1
  module MiniMagick
2
- VERSION = "3.5.0"
2
+ VERSION = "3.6.0"
3
3
  end
@@ -3,6 +3,16 @@ require 'test_helper'
3
3
  class CommandBuilderTest < Test::Unit::TestCase
4
4
  include MiniMagick
5
5
 
6
+ def setup
7
+ @processor_path = MiniMagick.processor_path
8
+ @processor = MiniMagick.processor
9
+ end
10
+
11
+ def teardown
12
+ MiniMagick.processor_path = @processor_path
13
+ MiniMagick.processor = @processor
14
+ end
15
+
6
16
  def test_basic
7
17
  c = CommandBuilder.new("test")
8
18
  c.resize "30x40"
@@ -26,7 +36,7 @@ class CommandBuilderTest < Test::Unit::TestCase
26
36
  def test_plus_modifier_and_multiple_options
27
37
  c = CommandBuilder.new("test")
28
38
  c.distort.+ 'srt', '0.6 20'
29
- assert_equal '+distort srt 0.6\ 20', c.args.join(" ")
39
+ assert_equal '\+distort srt 0.6\ 20', c.args.join(" ")
30
40
  end
31
41
 
32
42
  def test_valid_command
@@ -63,4 +73,18 @@ class CommandBuilderTest < Test::Unit::TestCase
63
73
  assert_equal 'test -set colorspace\ RGB', c.command
64
74
  end
65
75
 
76
+ def test_processor_path
77
+ MiniMagick.processor_path = "/a/strange/path"
78
+ c = CommandBuilder.new('test')
79
+ c.auto_orient
80
+ assert_equal c.command, "/a/strange/path/test -auto-orient"
81
+ end
82
+
83
+ def test_processor_path_with_processor
84
+ MiniMagick.processor_path = "/a/strange/path"
85
+ MiniMagick.processor = "processor"
86
+ c = CommandBuilder.new('test')
87
+ c.auto_orient
88
+ assert_equal c.command, "/a/strange/path/processor test -auto-orient"
89
+ end
66
90
  end
Binary file
data/test/image_test.rb CHANGED
@@ -199,6 +199,16 @@ class ImageTest < Test::Unit::TestCase
199
199
  image.destroy!
200
200
  end
201
201
 
202
+ def test_image_combine_options_with_filename_with_special_characters_in_it
203
+ image = Image.new(SPECIAL_CHARS_IMAGE_PATH)
204
+ assert_nothing_raised do
205
+ image.combine_options("identify") do |c|
206
+ c.ping
207
+ end
208
+ end
209
+ image.destroy!
210
+ end
211
+
202
212
  def test_exif
203
213
  image = Image.open(EXIF_IMAGE_PATH)
204
214
  assert_equal('0220', image["exif:ExifVersion"])
@@ -236,6 +246,23 @@ class ImageTest < Test::Unit::TestCase
236
246
  image.destroy!
237
247
  end
238
248
 
249
+ def test_change_format_of_image_with_special_characters
250
+ tempfile = Tempfile.new('magick with special! "chars\'')
251
+
252
+ File.open(SIMPLE_IMAGE_PATH, 'rb') do |f|
253
+ tempfile.write(f.read)
254
+ tempfile.rewind
255
+ end
256
+
257
+ image = Image.new(tempfile.path)
258
+ image.format('png')
259
+ assert File.exists?(image.path)
260
+ image.destroy!
261
+
262
+ File.delete(image.path)
263
+ tempfile.unlink
264
+ end
265
+
239
266
  def test_bad_method_bug
240
267
  image = Image.open(TIFF_IMAGE_PATH)
241
268
  begin
data/test/test_helper.rb CHANGED
@@ -7,15 +7,16 @@ require File.expand_path('../../lib/mini_magick', __FILE__)
7
7
 
8
8
  module MiniMagickTestFiles
9
9
  test_files = File.expand_path(File.dirname(__FILE__) + "/files")
10
- SIMPLE_IMAGE_PATH = test_files + "/simple.gif"
11
- MINUS_IMAGE_PATH = test_files + "/simple-minus.gif"
12
- TIFF_IMAGE_PATH = test_files + "/leaves (spaced).tiff"
13
- NOT_AN_IMAGE_PATH = test_files + "/not_an_image.php"
14
- GIF_WITH_JPG_EXT = test_files + "/actually_a_gif.jpg"
15
- EXIF_IMAGE_PATH = test_files + "/trogdor.jpg"
16
- CAP_EXT_PATH = test_files + "/trogdor_capitalized.JPG"
17
- ANIMATION_PATH = test_files + "/animation.gif"
18
- PNG_PATH = test_files + "/png.png"
19
- COMP_IMAGE_PATH = test_files + "/composited.jpg"
20
- ERRONEOUS_IMAGE_PATH = test_files + "/erroneous.jpg"
10
+ SIMPLE_IMAGE_PATH = test_files + "/simple.gif"
11
+ MINUS_IMAGE_PATH = test_files + "/simple-minus.gif"
12
+ SPECIAL_CHARS_IMAGE_PATH = test_files + "/special! \"chars'.gif"
13
+ TIFF_IMAGE_PATH = test_files + "/leaves (spaced).tiff"
14
+ NOT_AN_IMAGE_PATH = test_files + "/not_an_image.php"
15
+ GIF_WITH_JPG_EXT = test_files + "/actually_a_gif.jpg"
16
+ EXIF_IMAGE_PATH = test_files + "/trogdor.jpg"
17
+ CAP_EXT_PATH = test_files + "/trogdor_capitalized.JPG"
18
+ ANIMATION_PATH = test_files + "/animation.gif"
19
+ PNG_PATH = test_files + "/png.png"
20
+ COMP_IMAGE_PATH = test_files + "/composited.jpg"
21
+ ERRONEOUS_IMAGE_PATH = test_files + "/erroneous.jpg"
21
22
  end
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: 3.5.0
4
+ version: 3.6.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-02-14 00:00:00.000000000 Z
14
+ date: 2013-05-21 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: subexec
@@ -85,6 +85,7 @@ files:
85
85
  - test/files/png.png
86
86
  - test/files/simple-minus.gif
87
87
  - test/files/simple.gif
88
+ - test/files/special! "chars'.gif
88
89
  - test/files/trogdor.jpg
89
90
  - test/files/trogdor_capitalized.JPG
90
91
  - test/image_test.rb
@@ -109,7 +110,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
110
  - - ! '>='
110
111
  - !ruby/object:Gem::Version
111
112
  version: '0'
112
- requirements: []
113
+ requirements:
114
+ - You must have ImageMagick or GraphicsMagick installed
113
115
  rubyforge_project:
114
116
  rubygems_version: 1.8.23
115
117
  signing_key:
@@ -126,9 +128,11 @@ test_files:
126
128
  - test/files/png.png
127
129
  - test/files/simple-minus.gif
128
130
  - test/files/simple.gif
131
+ - test/files/special! "chars'.gif
129
132
  - test/files/trogdor.jpg
130
133
  - test/files/trogdor_capitalized.JPG
131
134
  - test/image_test.rb
132
135
  - test/leaves (spaced).tiff
133
136
  - test/test_helper.rb
134
137
  - test/trogdor_capitalized.JPG
138
+ has_rdoc: