From 9c6caeca87fdcc17d607ca6ea526328ab9bcaabb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janko=20Marohni=C4=87?= Date: Mon, 16 Apr 2018 17:41:00 +0200 Subject: [PATCH] [minimagick] Add #define as a wrapper around `-define` There is no reason this method shouldn't be public, and it's nice in cases where settings we're defining don't apply to neither saving nor loading images. --- CHANGELOG.md | 4 +++ doc/minimagick.md | 10 ++++++ lib/image_processing/mini_magick.rb | 30 ++++++++++-------- test/mini_magick_test.rb | 48 +++++++++++++++++++++-------- 4 files changed, 66 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3490496..659d2a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## HEAD + +* [minimagick] Add `#define` as a wrapper around `-define` (@janko-m) + ## 1.1.0 (2018-04-05) * [minimagick] Disallow splitting multi-layer images into multiple single-layer diff --git a/doc/minimagick.md b/doc/minimagick.md index 2b632b6..8e1c3d6 100644 --- a/doc/minimagick.md +++ b/doc/minimagick.md @@ -153,6 +153,16 @@ File.extname(result.path) By default the original format is retained when writing the image to a file. If the source file doesn't have a file extension, the format will default to JPEG. +#### `#define` + +Adds coder/decoder options with [`-define`] from the specified Hash. + +```rb +ImageProcessing::MiniMagick + .define(png: { compression_level: 8, format: "png8" }) # -define png:compression-level=8 -define png:format=png8 + # ... +``` + #### `#method_missing` Any unknown methods will be delegated to [`MiniMagick::Tool::Convert`]. diff --git a/lib/image_processing/mini_magick.rb b/lib/image_processing/mini_magick.rb index edc7e22..2fc667a 100644 --- a/lib/image_processing/mini_magick.rb +++ b/lib/image_processing/mini_magick.rb @@ -43,6 +43,22 @@ module ImageProcessing magick.extent "#{width}x#{height}" end + def define(magick, options) + return magick.define(options) if options.is_a?(String) + + options.each do |namespace, options| + namespace = namespace.to_s.gsub("_", "-") + + options.each do |key, value| + key = key.to_s.gsub("_", "-") + + magick.define "#{namespace}:#{key}=#{value}" + end + end + + magick + end + def limits(magick, options) limit_args = options.flat_map { |type, value| %W[-limit #{type} #{value}] } prepend_args(magick, limit_args) @@ -98,19 +114,7 @@ module ImageProcessing def apply_options(magick, define: {}, **options) apply(magick, options) - apply_define(magick, define) - end - - def apply_define(magick, define) - define.each do |namespace, options| - namespace = namespace.to_s.gsub("_", "-") - - options.each do |key, value| - key = key.to_s.gsub("_", "-") - - magick.define "#{namespace}:#{key}=#{value}" - end - end + define(magick, define) end def prepend_args(magick, args) diff --git a/test/mini_magick_test.rb b/test/mini_magick_test.rb index 5966131..1a238a3 100644 --- a/test/mini_magick_test.rb +++ b/test/mini_magick_test.rb @@ -39,19 +39,6 @@ describe "ImageProcessing::MiniMagick" do assert_similar expected, actual end - it "applies appended options" do - actual = ImageProcessing::MiniMagick.append("-resize", "400x400").call(@portrait) - expected = Tempfile.new(["result", ".jpg"], binmode: true).tap do |tempfile| - MiniMagick::Tool::Convert.new do |cmd| - cmd << @portrait.path - cmd.resize("400x400") - cmd << tempfile.path - end - end - - assert_similar expected, actual - end - it "applies format" do result = ImageProcessing::MiniMagick.convert("png").call(@portrait) assert_equal ".png", File.extname(result.path) @@ -301,6 +288,26 @@ describe "ImageProcessing::MiniMagick" do end end + describe "#define" do + it "adds -define options from a Hash" do + magick = ImageProcessing::MiniMagick + .source(@portrait) + .define(png: { compression_level: 8, format: "png8" }) + .call(save: false) + + assert_equal %W[-define png:compression-level=8 -define png:format=png8], magick.args[2..-1] + end + + it "adds -define options from a String" do + magick = ImageProcessing::MiniMagick + .source(@portrait) + .define("png:compression-level=8") + .call(save: false) + + assert_equal %W[-define png:compression-level=8], magick.args[2..-1] + end + end + describe "#limits" do it "adds resource limits" do pipeline = ImageProcessing::MiniMagick.limits(time: 0.001).source(@portrait) @@ -308,4 +315,19 @@ describe "ImageProcessing::MiniMagick" do assert_includes exception.message, "time limit exceeded" end end + + describe "#append" do + it "appends CLI arguments" do + actual = ImageProcessing::MiniMagick.append("-resize", "400x400").call(@portrait) + expected = Tempfile.new(["result", ".jpg"], binmode: true).tap do |tempfile| + MiniMagick::Tool::Convert.new do |cmd| + cmd << @portrait.path + cmd.resize("400x400") + cmd << tempfile.path + end + end + + assert_similar expected, actual + end + end end