class MiniMagick::Shell

Sends commands to the shell (more precisely, it sends commands directly to the operating system).

@private

Public Instance Methods

execute(command, stdin: "", timeout: MiniMagick.timeout) click to toggle source
# File lib/mini_magick/shell.rb, line 29
def execute(command, stdin: "", timeout: MiniMagick.timeout)
  stdout, stderr, status = log(command.join(" ")) do
    Open3.capture3({ "MAGICK_TIME_LIMIT" => timeout&.to_s }, *command, stdin_data: stdin)
  end

  [stdout, stderr, status&.exitstatus]
rescue Errno::ENOENT, IOError
  ["", "executable not found: \"#{command.first}\"", 127]
end
run(command, errors: MiniMagick.errors, warnings: MiniMagick.warnings, **options) click to toggle source
# File lib/mini_magick/shell.rb, line 13
def run(command, errors: MiniMagick.errors, warnings: MiniMagick.warnings, **options)
  stdout, stderr, status = execute(command, **options)

  if status != 0
    if stderr.include?("time limit exceeded")
      fail MiniMagick::TimeoutError, "`#{command.join(" ")}` has timed out"
    elsif errors
      fail MiniMagick::Error, "`#{command.join(" ")}` failed with status: #{status.inspect} and error:\n#{stderr}"
    end
  end

  $stderr.print(stderr) if warnings

  [stdout, stderr, status]
end

Private Instance Methods

log(command, &block) click to toggle source
# File lib/mini_magick/shell.rb, line 41
def log(command, &block)
  value = nil
  duration = Benchmark.realtime { value = block.call }
  MiniMagick.logger.debug "[%.2fs] %s" % [duration, command]
  value
end