mini_magick 4.3.6 → 4.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9d7353bb4abb1f24f782090a89632e2697cc8f77
4
- data.tar.gz: ec2f0d8462829f39796474f292c4d06ef9f7ec35
3
+ metadata.gz: b47a71b858d75780aca2cad04723b23ebbe03f43
4
+ data.tar.gz: 0435a6885e082c68913235ddad9219590e6d3400
5
5
  SHA512:
6
- metadata.gz: 9ceb0494e0c4d9f568482d2c7c8249ed91e01931ddfffd8e119df1de379e4f35343ba5c40af38daa4b021d359a3d44e4c3ab6e86e096d97487e9beb387697a55
7
- data.tar.gz: 9bba8837c2ee3f10751932dee4afcd46724392d7e04a01ee1527aacb8c7043a092e7de7067f85e194da9e8cfeeff03a4d9ec11ea04c93151e8e020983bc0bd20
6
+ metadata.gz: 41be6f64c5a0190da1b04e16c90bcd6c68133b165a8f8515d9231d17a8da3f6900965e7147643b8beae9515b2ab08cd23229f845e1b2dba69473374ceb7e68fc
7
+ data.tar.gz: 6eb28519339d44d5f658d4492708ebd459124c32bc0606a9fc9a2308de8eb442d0b11374bf9f486b7111f15ba05384dca346151ef410fb2bb082860a00d9ab7a
@@ -1,4 +1,5 @@
1
1
  require 'mini_magick/utilities'
2
+ require 'logger'
2
3
 
3
4
  module MiniMagick
4
5
  module Configuration
@@ -86,6 +87,7 @@ module MiniMagick
86
87
  base.validate_on_write = true
87
88
  base.whiny = true
88
89
  base.shell_api = "open3"
90
+ base.logger = Logger.new($stdout).tap { |l| l.level = Logger::INFO }
89
91
  end
90
92
 
91
93
  ##
@@ -140,13 +142,14 @@ module MiniMagick
140
142
  @cli_path || @processor_path
141
143
  end
142
144
 
143
- def logger
144
- @logger || MiniMagick::Logger.new($stdout)
145
+ def debug=(value)
146
+ warn "MiniMagick.debug is deprecated and will be removed in MiniMagick 5. Use `MiniMagick.logger.level = Logger::DEBUG` instead."
147
+ logger.level = value ? Logger::DEBUG : Logger::INFO
145
148
  end
146
149
 
147
150
  # Backwards compatibility
148
151
  def reload_tools
149
- warn "[MiniMagick] MiniMagick.reload_tools is deprecated because it is no longer necessary"
152
+ warn "MiniMagick.reload_tools is deprecated because it is no longer necessary"
150
153
  end
151
154
 
152
155
  end
@@ -106,9 +106,19 @@ module MiniMagick
106
106
  details_string = identify(&:verbose)
107
107
  key_stack = []
108
108
  details_string.lines.to_a[1..-1].each_with_object({}) do |line, details_hash|
109
- next if line.strip.length.zero?
109
+ next if !line.valid_encoding? || line.strip.length.zero?
110
+
110
111
  level = line[/^\s*/].length / 2 - 1
111
- key_stack.pop until key_stack.size <= level
112
+ if level >= 0
113
+ key_stack.pop until key_stack.size <= level
114
+ else
115
+ # Some metadata, such as SVG clipping paths, will be saved without
116
+ # indentation, resulting in a level of -1
117
+ last_key = details_hash.keys.last
118
+ details_hash[last_key] = '' if details_hash[last_key].empty?
119
+ details_hash[last_key] << line
120
+ next
121
+ end
112
122
 
113
123
  key, _, value = line.partition(/:[\s\n]/).map(&:strip)
114
124
  hash = key_stack.inject(details_hash) { |hash, key| hash.fetch(key) }
@@ -133,6 +133,10 @@ module MiniMagick
133
133
  # @return [String] The location of the current working file
134
134
  #
135
135
  attr_reader :path
136
+ ##
137
+ # @return [Tempfile] The underlying temporary file
138
+ #
139
+ attr_reader :tempfile
136
140
 
137
141
  ##
138
142
  # Create a new {MiniMagick::Image} object.
@@ -336,20 +340,23 @@ module MiniMagick
336
340
  new_tempfile = MiniMagick::Utilities.tempfile(".#{format}")
337
341
  new_path = new_tempfile.path
338
342
  else
339
- new_path = path.sub(/(\.\w+)?$/, ".#{format}")
343
+ new_path = Pathname(path).sub_ext(".#{format}").to_s
340
344
  end
341
345
 
346
+ input_path = path.dup
347
+ input_path << "[#{page}]" if page && !layer?
348
+
342
349
  MiniMagick::Tool::Convert.new do |convert|
343
- convert << (page ? "#{path}[#{page}]" : path)
350
+ convert << input_path
344
351
  yield convert if block_given?
345
352
  convert << new_path
346
353
  end
347
354
 
348
355
  if @tempfile
349
- @tempfile.unlink
356
+ destroy!
350
357
  @tempfile = new_tempfile
351
358
  else
352
- File.delete(path) unless path == new_path
359
+ File.delete(path) unless path == new_path || layer?
353
360
  end
354
361
 
355
362
  path.replace new_path
@@ -459,7 +466,10 @@ module MiniMagick
459
466
  # Destroys the tempfile (created by {.open}) if it exists.
460
467
  #
461
468
  def destroy!
462
- @tempfile.unlink if @tempfile
469
+ if @tempfile
470
+ FileUtils.rm_f @tempfile.path.sub(/mpc$/, "cache") if @tempfile.path.end_with?(".mpc")
471
+ @tempfile.unlink
472
+ end
463
473
  end
464
474
 
465
475
  ##
@@ -1,5 +1,5 @@
1
- require "mini_magick/logger"
2
1
  require "timeout"
2
+ require "benchmark"
3
3
 
4
4
  module MiniMagick
5
5
  ##
@@ -11,25 +11,25 @@ module MiniMagick
11
11
  class Shell
12
12
 
13
13
  def run(command, options = {})
14
- stdout, stderr, code = execute(command)
14
+ stdout, stderr, status = execute(command, stdin: options[:stdin])
15
15
 
16
- case code
16
+ case status
17
17
  when 1
18
18
  fail MiniMagick::Error, "`#{command.join(" ")}` failed with error:\n#{stderr}"
19
19
  when 127
20
20
  fail MiniMagick::Error, stderr
21
- end if options.fetch(:whiny, true)
21
+ end if options.fetch(:whiny, MiniMagick.whiny)
22
22
 
23
23
  $stderr.print(stderr) unless options[:stderr] == false
24
24
 
25
- stdout
25
+ [stdout, stderr, status]
26
26
  end
27
27
 
28
- def execute(command)
28
+ def execute(command, options = {})
29
29
  stdout, stderr, status =
30
- MiniMagick.logger.debug(command.join(" ")) do
30
+ log(command.join(" ")) do
31
31
  Timeout.timeout(MiniMagick.timeout) do
32
- send("execute_#{MiniMagick.shell_api.gsub("-", "_")}", *command)
32
+ send("execute_#{MiniMagick.shell_api.gsub("-", "_")}", command, options)
33
33
  end
34
34
  end
35
35
 
@@ -38,18 +38,31 @@ module MiniMagick
38
38
  ["", "executable not found: \"#{command.first}\"", 127]
39
39
  end
40
40
 
41
- def execute_open3(*command)
41
+ private
42
+
43
+ def execute_open3(command, options = {})
42
44
  require "open3"
43
- Open3.capture3(*command)
45
+
46
+ Open3.capture3(*command, binmode: true, stdin_data: options[:stdin].to_s)
44
47
  end
45
48
 
46
- def execute_posix_spawn(*command)
49
+ def execute_posix_spawn(command, options = {})
47
50
  require "posix-spawn"
51
+
48
52
  pid, stdin, stdout, stderr = POSIX::Spawn.popen4(*command)
53
+ [stdin, stdout, stderr].each(&:binmode)
54
+ stdin.write(options[:stdin].to_s)
49
55
  Process.waitpid(pid)
50
56
 
51
57
  [stdout.read, stderr.read, $?]
52
58
  end
53
59
 
60
+ def log(command, &block)
61
+ value = nil
62
+ duration = Benchmark.realtime { value = block.call }
63
+ MiniMagick.logger.debug "[%.2fs] %s" % [duration, command]
64
+ value
65
+ end
66
+
54
67
  end
55
68
  end
@@ -49,13 +49,15 @@ module MiniMagick
49
49
  # @param whiny [Boolean] Whether to raise errors on exit codes different
50
50
  # than 0.
51
51
  # @example
52
- # MiniMagick::Tool::Identify.new(false) do |identify|
52
+ # MiniMagick::Tool::Identify.new(whiny: false) do |identify|
53
53
  # identify.help # returns exit status 1, which would otherwise throw an error
54
54
  # end
55
- def initialize(name, whiny = MiniMagick.whiny)
55
+ def initialize(name, options = {})
56
+ warn "MiniMagick::Tool.new(false) is deprecated and will be removed in MiniMagick 5, use MiniMagick::Tool.new(whiny: false) instead." if !options.is_a?(Hash)
57
+
56
58
  @name = name
57
- @whiny = whiny
58
59
  @args = []
60
+ @whiny = options.is_a?(Hash) ? options.fetch(:whiny, MiniMagick.whiny) : options
59
61
  end
60
62
 
61
63
  ##
@@ -67,16 +69,30 @@ module MiniMagick
67
69
  # mogrify << "path/to/image.jpg"
68
70
  # mogrify.call # executes `mogrify -resize 500x500 path/to/image.jpg`
69
71
  #
70
- # @param whiny [Boolean] Whether you want an error to be raised when
71
- # ImageMagick returns an exit code of 1. You may want this because
72
- # some ImageMagick's commands (`identify -help`) return exit code 1,
73
- # even though no error happened.
72
+ # @example
73
+ # mogrify = MiniMagick::Tool::Mogrify.new
74
+ # # build the command
75
+ # mogrify.call do |stdout, stderr, status|
76
+ # # ...
77
+ # end
78
+ #
79
+ # @yield [Array] Optionally yields stdout, stderr, and exit status
74
80
  #
75
- # @return [String] Output of the command
81
+ # @return [String] Returns the output of the command
76
82
  #
77
- def call(whiny = @whiny, options = {})
83
+ def call(*args)
84
+ options = args[-1].is_a?(Hash) ? args.pop : {}
85
+ warn "Passing whiny to MiniMagick::Tool#call is deprecated and will be removed in MiniMagick 5, use MiniMagick::Tool.new(whiny: false) instead." if args.any?
86
+ whiny = args.fetch(0, @whiny)
87
+
88
+ options[:whiny] = whiny
89
+ options[:stderr] = false if block_given?
90
+
78
91
  shell = MiniMagick::Shell.new
79
- shell.run(command, options.merge(whiny: whiny)).strip
92
+ stdout, stderr, status = shell.run(command, options)
93
+ yield stdout, stderr, status if block_given?
94
+
95
+ stdout.strip
80
96
  end
81
97
 
82
98
  ##
@@ -171,6 +187,19 @@ module MiniMagick
171
187
  self << ")"
172
188
  end
173
189
 
190
+ ##
191
+ # Adds ImageMagick's pseudo-filename `-` for standard input.
192
+ #
193
+ # @example
194
+ # identify = MiniMagick::Tool::Identify.new
195
+ # identify.stdin
196
+ # identify.call(stdin: image_content)
197
+ # # executes `identify -` with the given standard input
198
+ #
199
+ def stdin
200
+ self << "-"
201
+ end
202
+
174
203
  ##
175
204
  # Define creator operator methods
176
205
  #
@@ -185,6 +214,16 @@ module MiniMagick
185
214
  end
186
215
  end
187
216
 
217
+ ##
218
+ # This option is a valid ImageMagick option, but it's also a Ruby method,
219
+ # so we need to override it so that it correctly acts as an option method.
220
+ #
221
+ def clone(*args)
222
+ self << '-clone'
223
+ self.merge!(args)
224
+ self
225
+ end
226
+
188
227
  ##
189
228
  # Any undefined method will be transformed into a CLI option
190
229
  #
@@ -206,9 +245,9 @@ module MiniMagick
206
245
 
207
246
  def self.option_methods
208
247
  @option_methods ||= (
209
- tool = new
248
+ tool = new(whiny: false)
210
249
  tool << "-help"
211
- help_page = tool.call(false, stderr: false)
250
+ help_page = tool.call(stderr: false)
212
251
 
213
252
  cli_options = help_page.scan(/^\s+-[a-z\-]+/).map(&:strip)
214
253
  if tool.name == "mogrify" && MiniMagick.graphicsmagick?
@@ -8,8 +8,8 @@ module MiniMagick
8
8
 
9
9
  module VERSION
10
10
  MAJOR = 4
11
- MINOR = 3
12
- TINY = 6
11
+ MINOR = 5
12
+ TINY = 1
13
13
  PRE = nil
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
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.3.6
4
+ version: 4.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Corey Johnson
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2015-10-12 00:00:00.000000000 Z
16
+ date: 2016-03-25 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: rake
@@ -76,7 +76,6 @@ files:
76
76
  - lib/mini_magick/configuration.rb
77
77
  - lib/mini_magick/image.rb
78
78
  - lib/mini_magick/image/info.rb
79
- - lib/mini_magick/logger.rb
80
79
  - lib/mini_magick/shell.rb
81
80
  - lib/mini_magick/tool.rb
82
81
  - lib/mini_magick/tool/animate.rb
@@ -113,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
112
  requirements:
114
113
  - You must have ImageMagick or GraphicsMagick installed
115
114
  rubyforge_project:
116
- rubygems_version: 2.4.5
115
+ rubygems_version: 2.5.1
117
116
  signing_key:
118
117
  specification_version: 4
119
118
  summary: Manipulate images with minimal use of memory via ImageMagick / GraphicsMagick
@@ -1,38 +0,0 @@
1
- require "benchmark"
2
-
3
- module MiniMagick
4
- ##
5
- # Responsible for logging commands to stdout (activated when
6
- # `MiniMagick.debug` is set to `true`). Implements a simplified Logger
7
- # interface.
8
- #
9
- # @private
10
- #
11
- class Logger
12
-
13
- attr_accessor :format
14
-
15
- def initialize(io)
16
- @io = io
17
- @format = "[%<duration>.2fs] %<command>s"
18
- end
19
-
20
- def debug(command, &action)
21
- benchmark(action) do |duration|
22
- output(duration: duration, command: command) if MiniMagick.debug
23
- end
24
- end
25
-
26
- def output(data)
27
- printf @io, "#{format}\n", data
28
- end
29
-
30
- def benchmark(action)
31
- return_value = nil
32
- duration = Benchmark.realtime { return_value = action.call }
33
- yield duration
34
- return_value
35
- end
36
-
37
- end
38
- end