mojo_magick 0.5.7 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.circleci/config.yml +24 -0
- data/.github/dependabot.yml +8 -0
- data/.rubocop-common.yml +99 -0
- data/.rubocop-performance.yml +2 -0
- data/.rubocop-rspec.yml +33 -0
- data/.rubocop.yml +10 -0
- data/Gemfile +6 -1
- data/Gemfile.lock +51 -12
- data/README.md +17 -3
- data/Rakefile +15 -6
- data/examples/animated_gif.rb +11 -13
- data/examples/composite.rb +11 -13
- data/init.rb +1 -1
- data/lib/image_magick/fonts.rb +6 -6
- data/lib/initializers/hash.rb +4 -4
- data/lib/mojo_magick.rb +40 -39
- data/lib/mojo_magick/command_status.rb +1 -1
- data/lib/mojo_magick/opt_builder.rb +15 -24
- data/lib/mojo_magick/util/parser.rb +5 -42
- data/lib/mojo_magick/version.rb +1 -1
- data/mojo_magick.gemspec +20 -16
- data/test/fixtures/roll with it.jpg +0 -0
- data/test/font_test.rb +5 -5
- data/test/fonts_test.rb +1 -1
- data/test/mojo_magick_test.rb +58 -53
- data/test/opt_builder_test.rb +40 -40
- data/test/parser_test.rb +4 -4
- data/test/test_helper.rb +8 -6
- metadata +57 -10
- data/lib/image_magick/resource_limits.rb +0 -91
- data/test/resource_limits_test.rb +0 -49
data/lib/initializers/hash.rb
CHANGED
data/lib/mojo_magick.rb
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
cwd = File.dirname(__FILE__)
|
2
|
-
require
|
3
|
-
initializers_dir = File.expand_path(File.join(cwd,
|
4
|
-
Dir.glob(File.join(initializers_dir,
|
5
|
-
require File.join(cwd,
|
6
|
-
require File.join(cwd,
|
7
|
-
require File.join(cwd,
|
8
|
-
require File.join(cwd,
|
9
|
-
require File.join(cwd,
|
10
|
-
require File.join(cwd,
|
11
|
-
require
|
12
|
-
require 'tempfile'
|
2
|
+
require "open3"
|
3
|
+
initializers_dir = File.expand_path(File.join(cwd, "initializers"))
|
4
|
+
Dir.glob(File.join(initializers_dir, "*.rb")).sort.each { |f| require f }
|
5
|
+
require File.join(cwd, "mojo_magick/util/parser")
|
6
|
+
require File.join(cwd, "mojo_magick/errors")
|
7
|
+
require File.join(cwd, "mojo_magick/command_status")
|
8
|
+
require File.join(cwd, "image_magick/fonts")
|
9
|
+
require File.join(cwd, "mojo_magick/opt_builder")
|
10
|
+
require File.join(cwd, "mojo_magick/font")
|
11
|
+
require "tempfile"
|
13
12
|
|
14
13
|
# MojoMagick is a stateless set of module methods which present a convient interface
|
15
14
|
# for accessing common tasks for ImageMagick command line library.
|
@@ -35,7 +34,8 @@ require 'tempfile'
|
|
35
34
|
#
|
36
35
|
# Equivalent to:
|
37
36
|
#
|
38
|
-
# MojoMagick::raw_command('convert', 'source.jpg -crop 250x250+0+0
|
37
|
+
# MojoMagick::raw_command('convert', 'source.jpg -crop 250x250+0+0\
|
38
|
+
# +repage -strip -set comment "my favorite file" dest.jpg')
|
39
39
|
#
|
40
40
|
# Example #mogrify usage:
|
41
41
|
#
|
@@ -61,32 +61,27 @@ require 'tempfile'
|
|
61
61
|
# instead of '-' versions.
|
62
62
|
#
|
63
63
|
module MojoMagick
|
64
|
-
# enable resource limiting functionality
|
65
|
-
extend ImageMagick::ResourceLimits
|
66
64
|
extend ImageMagick::Fonts
|
67
65
|
|
68
66
|
def self.windows?
|
69
67
|
!(RUBY_PLATFORM =~ /win32/).nil?
|
70
68
|
end
|
71
69
|
|
72
|
-
def self.execute(command, args
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
execute = "#{command} #{get_limits_as_params} #{args}"
|
77
|
-
out, outerr, status = Open3.capture3(execute)
|
70
|
+
def self.execute(command, *args)
|
71
|
+
execute = "#{command} #{args}"
|
72
|
+
out, outerr, status = Open3.capture3(command, *args.map(&:to_s))
|
78
73
|
CommandStatus.new execute, out, outerr, status
|
79
74
|
rescue Exception => e
|
80
75
|
raise MojoError, "#{e.class}: #{e.message}"
|
81
76
|
end
|
82
77
|
|
83
|
-
def self.execute!(command, args
|
84
|
-
|
85
|
-
# err_pipe = windows? ? "2>nul" : "2>/dev/null"
|
86
|
-
status = execute(command, args, options)
|
78
|
+
def self.execute!(command, *args)
|
79
|
+
status = execute(command, *args)
|
87
80
|
unless status.success?
|
88
|
-
err_msg =
|
89
|
-
raise(MojoFailed, "#{err_msg} (Exit status: #{status.exit_code})\n
|
81
|
+
err_msg = "MojoMagick command failed: #{command}."
|
82
|
+
raise(MojoFailed, "#{err_msg} (Exit status: #{status.exit_code})\n" +
|
83
|
+
" Command: #{status.command}\n" +
|
84
|
+
" Error: #{status.error}")
|
90
85
|
end
|
91
86
|
status.return_value
|
92
87
|
end
|
@@ -114,10 +109,10 @@ module MojoMagick
|
|
114
109
|
# :percent => scale image to this percentage (do not specify :width/:height in this case)
|
115
110
|
def self.resize(source_file, dest_file, options)
|
116
111
|
scale_options = []
|
117
|
-
scale_options <<
|
118
|
-
scale_options <<
|
119
|
-
scale_options <<
|
120
|
-
scale_options <<
|
112
|
+
scale_options << ">" unless options[:shrink_only].nil?
|
113
|
+
scale_options << "<" unless options[:expand_only].nil?
|
114
|
+
scale_options << "!" unless options[:absolute_aspect].nil?
|
115
|
+
scale_options << "^" unless options[:fill].nil?
|
121
116
|
scale_options = scale_options.join
|
122
117
|
|
123
118
|
extras = []
|
@@ -129,10 +124,15 @@ module MojoMagick
|
|
129
124
|
raise MojoMagickError, "Unknown options for method resize: #{options.inspect}"
|
130
125
|
end
|
131
126
|
if !options[:fill].nil? && !options[:crop].nil?
|
132
|
-
extras <<
|
133
|
-
extras << "
|
127
|
+
extras << "-gravity"
|
128
|
+
extras << "Center"
|
129
|
+
extras << "-extent"
|
130
|
+
extras << geometry.to_s
|
134
131
|
end
|
135
|
-
raw_command(
|
132
|
+
raw_command("convert",
|
133
|
+
source_file,
|
134
|
+
"-resize", "#{geometry}#{scale_options}",
|
135
|
+
*extras, dest_file)
|
136
136
|
dest_file
|
137
137
|
end
|
138
138
|
|
@@ -142,14 +142,14 @@ module MojoMagick
|
|
142
142
|
end
|
143
143
|
|
144
144
|
def self.get_format(source_file, format_string)
|
145
|
-
raw_command(
|
145
|
+
raw_command("identify", "-format", format_string, source_file)
|
146
146
|
end
|
147
147
|
|
148
148
|
# returns an empty hash or a hash with :width and :height set (e.g. {:width => INT, :height => INT})
|
149
149
|
# raises MojoFailed when results are indeterminate (width and height could not be determined)
|
150
150
|
def self.get_image_size(source_file)
|
151
151
|
# returns width, height of image if available, nil if not
|
152
|
-
retval = get_format(source_file,
|
152
|
+
retval = get_format(source_file, "w:%w h:%h")
|
153
153
|
return {} unless retval
|
154
154
|
|
155
155
|
width = retval.match(/w:([0-9]+) /)
|
@@ -166,25 +166,26 @@ module MojoMagick
|
|
166
166
|
opts.file source if source
|
167
167
|
yield opts
|
168
168
|
opts.file dest if dest
|
169
|
-
|
169
|
+
|
170
|
+
raw_command("convert", *opts.to_a)
|
170
171
|
end
|
171
172
|
|
172
173
|
def self.mogrify(dest = nil)
|
173
174
|
opts = OptBuilder.new
|
174
175
|
yield opts
|
175
176
|
opts.file dest if dest
|
176
|
-
raw_command(
|
177
|
+
raw_command("mogrify", *opts.to_a)
|
177
178
|
end
|
178
179
|
|
179
180
|
def self.tempfile(*opts)
|
180
181
|
data = opts[0]
|
181
182
|
rest = opts[1]
|
182
183
|
ext = rest && rest[:format]
|
183
|
-
file = Tempfile.new([
|
184
|
+
file = Tempfile.new(["mojo", ext ? ".#{ext}" : ""])
|
184
185
|
file.binmode
|
185
186
|
file.write(data)
|
186
187
|
file.path
|
187
188
|
ensure
|
188
189
|
file.close
|
189
190
|
end
|
190
|
-
end
|
191
|
+
end
|
@@ -17,9 +17,7 @@ module MojoMagick
|
|
17
17
|
|
18
18
|
# Add files to command line, formatted if necessary
|
19
19
|
def file(*args)
|
20
|
-
|
21
|
-
add_formatted arg
|
22
|
-
end
|
20
|
+
@opts << args
|
23
21
|
self
|
24
22
|
end
|
25
23
|
alias files file
|
@@ -30,20 +28,16 @@ module MojoMagick
|
|
30
28
|
|
31
29
|
# annotate takes non-standard args
|
32
30
|
def annotate(*args)
|
33
|
-
@opts <<
|
31
|
+
@opts << "-annotate"
|
34
32
|
arguments = args.join.split
|
35
|
-
arguments.unshift
|
36
|
-
|
37
|
-
add_formatted arg
|
38
|
-
end
|
33
|
+
arguments.unshift "0" if arguments.length == 1
|
34
|
+
@opts << arguments
|
39
35
|
end
|
40
36
|
|
41
37
|
# Create a temporary file for the given image and add to command line
|
42
38
|
def format(*args)
|
43
|
-
@opts <<
|
44
|
-
|
45
|
-
add_formatted arg
|
46
|
-
end
|
39
|
+
@opts << "-format"
|
40
|
+
@opts << args
|
47
41
|
end
|
48
42
|
|
49
43
|
def blob(*args)
|
@@ -65,32 +59,29 @@ module MojoMagick
|
|
65
59
|
|
66
60
|
# Generic commands. Arguments will be formatted if necessary
|
67
61
|
def method_missing(command, *args)
|
68
|
-
@opts << if command.to_s[-1, 1] ==
|
62
|
+
@opts << if command.to_s[-1, 1] == "!"
|
69
63
|
"+#{command.to_s.chop}"
|
70
64
|
else
|
71
65
|
"-#{command}"
|
72
66
|
end
|
73
|
-
|
74
|
-
add_formatted arg
|
75
|
-
end
|
67
|
+
@opts << args
|
76
68
|
self
|
77
69
|
end
|
78
70
|
|
79
71
|
def to_s
|
80
|
-
|
72
|
+
to_a.join " "
|
81
73
|
end
|
82
74
|
|
83
|
-
|
84
|
-
|
85
|
-
def add_formatted(arg)
|
86
|
-
# Quote anything that would cause problems on *nix or windows
|
87
|
-
@opts << quoted_arg(arg)
|
75
|
+
def to_a
|
76
|
+
@opts.flatten
|
88
77
|
end
|
89
78
|
|
79
|
+
protected
|
80
|
+
|
90
81
|
def quoted_arg(arg)
|
91
|
-
return arg unless
|
82
|
+
return arg unless /[#'<>^|&();` ]/.match?(arg)
|
92
83
|
|
93
|
-
['"', arg.gsub('"', '\"').
|
84
|
+
['"', arg.gsub('"', '\"').tr("'", "\'"), '"'].join
|
94
85
|
end
|
95
86
|
end
|
96
87
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# rubocop:disable Lint/AssignmentInCondition
|
1
2
|
module MojoMagick
|
2
3
|
module Util
|
3
4
|
class Parser
|
@@ -10,9 +11,10 @@ module MojoMagick
|
|
10
11
|
while begin; line = enumerator.next; rescue StopIteration; line = nil; end
|
11
12
|
line.chomp!
|
12
13
|
line = enumerator.next if line.nil? || line.empty? || (/^\s+$/ =~ line)
|
13
|
-
|
14
|
+
m = /^\s*Font:\s+(.*)$/.match(line)
|
15
|
+
if m
|
14
16
|
name = m[1].strip
|
15
|
-
fonts[name] = {name: name}
|
17
|
+
fonts[name] = { name: name }
|
16
18
|
else
|
17
19
|
key_val = line.split(/:/).map(&:strip)
|
18
20
|
k = key_val[0].downcase.to_sym
|
@@ -20,46 +22,7 @@ module MojoMagick
|
|
20
22
|
fonts[name][k] = v if k && name
|
21
23
|
end
|
22
24
|
end
|
23
|
-
fonts.values.map { |f| MojoMagick::Font.new f}
|
24
|
-
end
|
25
|
-
|
26
|
-
def parse_limits(raw_limits)
|
27
|
-
row_limits = raw_limits.split("\n")
|
28
|
-
header = row_limits[0].chomp
|
29
|
-
data = row_limits[2].chomp
|
30
|
-
resources = header.strip.split
|
31
|
-
limits = data.strip.split
|
32
|
-
|
33
|
-
actual_values = {}
|
34
|
-
readable_values = {}
|
35
|
-
|
36
|
-
resources.each_index do |i|
|
37
|
-
resource = resources[i].downcase.to_sym
|
38
|
-
scale = limits[i].match(/[a-z]+$/) || []
|
39
|
-
value = limits[i].match(/^[0-9]+/)
|
40
|
-
unscaled_value = value ? value[0].to_i : -1
|
41
|
-
scaled_value = case scale[0]
|
42
|
-
when 'eb'
|
43
|
-
unscaled_value * (2**60)
|
44
|
-
when 'pb'
|
45
|
-
unscaled_value * (2**50)
|
46
|
-
when 'tb'
|
47
|
-
unscaled_value * (2**40)
|
48
|
-
when 'gb'
|
49
|
-
unscaled_value * (2**30)
|
50
|
-
when 'mb'
|
51
|
-
unscaled_value * (2**20)
|
52
|
-
when 'kb'
|
53
|
-
unscaled_value * (2**10)
|
54
|
-
when 'b'
|
55
|
-
unscaled_value
|
56
|
-
else
|
57
|
-
unscaled_value
|
58
|
-
end
|
59
|
-
actual_values[resource] = scaled_value
|
60
|
-
readable_values[resource] = limits[i]
|
61
|
-
end
|
62
|
-
[actual_values, readable_values]
|
25
|
+
fonts.values.map { |f| MojoMagick::Font.new f }
|
63
26
|
end
|
64
27
|
end
|
65
28
|
end
|
data/lib/mojo_magick/version.rb
CHANGED
data/mojo_magick.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
|
2
|
-
require
|
1
|
+
$LOAD_PATH.push File.expand_path("lib", __dir__)
|
2
|
+
require "mojo_magick/version"
|
3
3
|
|
4
|
-
post_install_message = <<~
|
4
|
+
post_install_message = <<~EOPOST_INSTALL
|
5
5
|
|
6
6
|
Thanks for installing MojoMagick - keepin it simple!
|
7
7
|
|
@@ -10,29 +10,33 @@ post_install_message = <<~EOF
|
|
10
10
|
If you plan to build images with text (using the "label" method) you'll need freetype and ghostscript as well.
|
11
11
|
Check out http://www.freetype.org and http://ghostscript.com respectively for installation info.
|
12
12
|
|
13
|
-
|
13
|
+
EOPOST_INSTALL
|
14
14
|
|
15
15
|
Gem::Specification.new do |s|
|
16
|
-
s.name =
|
17
|
-
s.license =
|
16
|
+
s.name = "mojo_magick"
|
17
|
+
s.license = "MIT"
|
18
18
|
s.version = MojoMagick::VERSION
|
19
19
|
s.platform = Gem::Platform::RUBY
|
20
|
-
s.authors = [
|
21
|
-
s.email = [
|
22
|
-
s.homepage =
|
20
|
+
s.authors = ["Steve Midgley", "Elliot Nelson", "Jon Rogers"]
|
21
|
+
s.email = ["science@misuse.org", "jon@rcode5.com"]
|
22
|
+
s.homepage = "http://github.com/rcode5/mojo_magick"
|
23
23
|
s.summary = "mojo_magick-#{MojoMagick::VERSION}"
|
24
|
-
s.description =
|
24
|
+
s.description = "Simple Ruby stateless module interface to imagemagick."
|
25
|
+
s.required_ruby_version = ">= 2.6.0"
|
25
26
|
|
26
|
-
s.rubyforge_project =
|
27
|
+
s.rubyforge_project = "mojo_magick"
|
27
28
|
|
28
29
|
s.files = `git ls-files`.split("\n")
|
29
30
|
s.test_files = `git ls-files -- {test,features}/*`.split("\n")
|
30
31
|
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
31
|
-
s.require_paths = [
|
32
|
-
s.add_development_dependency(
|
33
|
-
s.add_development_dependency(
|
34
|
-
s.add_development_dependency(
|
35
|
-
s.add_development_dependency(
|
32
|
+
s.require_paths = ["lib"]
|
33
|
+
s.add_development_dependency("bundler")
|
34
|
+
s.add_development_dependency("bundle-audit")
|
35
|
+
s.add_development_dependency("minitest")
|
36
|
+
s.add_development_dependency("rake")
|
37
|
+
s.add_development_dependency("rspec-expectations")
|
38
|
+
s.add_development_dependency("rubocop")
|
39
|
+
s.add_development_dependency("rubocop-performance")
|
36
40
|
|
37
41
|
s.post_install_message = post_install_message
|
38
42
|
end
|
Binary file
|
data/test/font_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
require_relative "test_helper"
|
2
2
|
|
3
|
-
IDENTIFY_FONT_RESPONSE = <<~
|
3
|
+
IDENTIFY_FONT_RESPONSE = <<~EO_FONTS
|
4
4
|
Font: Zapf-Dingbats
|
5
5
|
family: Zapf Dingbats
|
6
6
|
style: Normal
|
@@ -13,7 +13,7 @@ IDENTIFY_FONT_RESPONSE = <<~EOF.freeze
|
|
13
13
|
stretch: Normal
|
14
14
|
weight: 400
|
15
15
|
glyphs: /Library/Fonts/Zapfino.ttf
|
16
|
-
|
16
|
+
EO_FONTS
|
17
17
|
|
18
18
|
class FontTest < MiniTest::Test
|
19
19
|
def test_font
|
@@ -21,8 +21,8 @@ class FontTest < MiniTest::Test
|
|
21
21
|
assert_nil f.name
|
22
22
|
assert_equal f.valid?, false
|
23
23
|
|
24
|
-
f = MojoMagick::Font.new(name:
|
25
|
-
assert_equal f.name,
|
24
|
+
f = MojoMagick::Font.new(name: "Zapfino", weight: 400)
|
25
|
+
assert_equal f.name, "Zapfino"
|
26
26
|
assert_equal f.valid?, true
|
27
27
|
assert_equal f.weight, 400
|
28
28
|
end
|
data/test/fonts_test.rb
CHANGED
data/test/mojo_magick_test.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
|
1
|
+
require_relative "test_helper"
|
2
2
|
|
3
3
|
class MojoMagickTest < MiniTest::Test
|
4
4
|
# we keep a fixtures path and a working path so that we can easily test image
|
5
5
|
# manipulation routines without tainting the original images
|
6
6
|
def setup
|
7
|
-
@fixtures_path = File.expand_path(File.join(File.dirname(__FILE__),
|
8
|
-
@working_path = File.join(@fixtures_path,
|
7
|
+
@fixtures_path = File.expand_path(File.join(File.dirname(__FILE__), "fixtures"))
|
8
|
+
@working_path = File.join(@fixtures_path, "tmp")
|
9
9
|
end
|
10
10
|
|
11
11
|
def reset_images
|
12
12
|
FileUtils.rm_r(@working_path) if File.exist?(@working_path)
|
13
13
|
FileUtils.mkdir(@working_path)
|
14
|
-
Dir.glob(File.join(@fixtures_path,
|
14
|
+
Dir.glob(File.join(@fixtures_path, "*")).each do |file|
|
15
15
|
FileUtils.cp(file, @working_path) if File.file?(file)
|
16
16
|
end
|
17
|
-
@test_image = File.join(@working_path,
|
17
|
+
@test_image = File.join(@working_path, "5742.jpg")
|
18
18
|
end
|
19
19
|
|
20
20
|
def test_get_image_size
|
@@ -30,9 +30,9 @@ class MojoMagickTest < MiniTest::Test
|
|
30
30
|
# test basic resizing
|
31
31
|
reset_images
|
32
32
|
orig_image_size = File.size(@test_image)
|
33
|
-
size_test_temp = Tempfile.new(
|
33
|
+
size_test_temp = Tempfile.new("mojo_test")
|
34
34
|
size_test = size_test_temp.path
|
35
|
-
retval = MojoMagick.resize(@test_image, size_test, {width: 100, height: 100})
|
35
|
+
retval = MojoMagick.resize(@test_image, size_test, { width: 100, height: 100 })
|
36
36
|
assert_equal size_test, retval
|
37
37
|
assert_equal orig_image_size, File.size(@test_image)
|
38
38
|
assert_equal retval, size_test
|
@@ -41,7 +41,7 @@ class MojoMagickTest < MiniTest::Test
|
|
41
41
|
assert_equal 67, new_dimensions[:width]
|
42
42
|
|
43
43
|
# we should be able to resize image right over itself
|
44
|
-
retval = MojoMagick.resize(@test_image, @test_image, {width: 100, height: 100})
|
44
|
+
retval = MojoMagick.resize(@test_image, @test_image, { width: 100, height: 100 })
|
45
45
|
assert_equal @test_image, retval
|
46
46
|
refute_equal orig_image_size, File.size(@test_image)
|
47
47
|
new_dimensions = MojoMagick.get_image_size(@test_image)
|
@@ -52,7 +52,7 @@ class MojoMagickTest < MiniTest::Test
|
|
52
52
|
def test_image_resize_with_percentage
|
53
53
|
reset_images
|
54
54
|
original_size = MojoMagick.get_image_size(@test_image)
|
55
|
-
retval = MojoMagick.resize(@test_image, @test_image, {percent: 50})
|
55
|
+
retval = MojoMagick.resize(@test_image, @test_image, { percent: 50 })
|
56
56
|
assert_equal @test_image, retval
|
57
57
|
new_dimensions = MojoMagick.get_image_size(@test_image)
|
58
58
|
%i[height width].each do |dim|
|
@@ -63,9 +63,9 @@ class MojoMagickTest < MiniTest::Test
|
|
63
63
|
def test_shrink_with_big_dimensions
|
64
64
|
# image shouldn't resize if we specify very large dimensions and specify "shrink_only"
|
65
65
|
reset_images
|
66
|
-
size_test_temp = Tempfile.new(
|
66
|
+
size_test_temp = Tempfile.new("mojo_test")
|
67
67
|
size_test = size_test_temp.path
|
68
|
-
retval = MojoMagick.shrink(@test_image, size_test, {width: 1000, height: 1000})
|
68
|
+
retval = MojoMagick.shrink(@test_image, size_test, { width: 1000, height: 1000 })
|
69
69
|
assert_equal size_test, retval
|
70
70
|
new_dimensions = MojoMagick.get_image_size(@test_image)
|
71
71
|
assert_equal 500, new_dimensions[:height]
|
@@ -75,7 +75,7 @@ class MojoMagickTest < MiniTest::Test
|
|
75
75
|
def test_shrink
|
76
76
|
reset_images
|
77
77
|
# image should resize if we specify small dimensions and shrink_only
|
78
|
-
retval = MojoMagick.shrink(@test_image, @test_image, {width: 1000, height: 100})
|
78
|
+
retval = MojoMagick.shrink(@test_image, @test_image, { width: 1000, height: 100 })
|
79
79
|
assert_equal @test_image, retval
|
80
80
|
new_dimensions = MojoMagick.get_image_size(@test_image)
|
81
81
|
assert_equal 100, new_dimensions[:height]
|
@@ -85,7 +85,7 @@ class MojoMagickTest < MiniTest::Test
|
|
85
85
|
def test_resize_with_shrink_only_options
|
86
86
|
reset_images
|
87
87
|
# image should resize if we specify small dimensions and shrink_only
|
88
|
-
retval = MojoMagick.resize(@test_image, @test_image, {shrink_only: true, width: 400, height: 400})
|
88
|
+
retval = MojoMagick.resize(@test_image, @test_image, { shrink_only: true, width: 400, height: 400 })
|
89
89
|
assert_equal @test_image, retval
|
90
90
|
new_dimensions = MojoMagick.get_image_size(@test_image)
|
91
91
|
assert_equal 400, new_dimensions[:height]
|
@@ -95,7 +95,8 @@ class MojoMagickTest < MiniTest::Test
|
|
95
95
|
def test_expand_with_small_dim
|
96
96
|
# image shouldn't resize if we specify small dimensions and expand_only
|
97
97
|
reset_images
|
98
|
-
|
98
|
+
_orig_image_size = File.size(@test_image)
|
99
|
+
retval = MojoMagick.expand(@test_image, @test_image, { width: 10, height: 10 })
|
99
100
|
assert_equal @test_image, retval
|
100
101
|
new_dimensions = MojoMagick.get_image_size(@test_image)
|
101
102
|
assert_equal 500, new_dimensions[:height]
|
@@ -105,7 +106,7 @@ class MojoMagickTest < MiniTest::Test
|
|
105
106
|
def test_expand
|
106
107
|
reset_images
|
107
108
|
# image should resize if we specify large dimensions and expand_only
|
108
|
-
retval = MojoMagick.expand(@test_image, @test_image, {width: 1000, height: 1000})
|
109
|
+
retval = MojoMagick.expand(@test_image, @test_image, { width: 1000, height: 1000 })
|
109
110
|
assert_equal @test_image, retval
|
110
111
|
new_dimensions = MojoMagick.get_image_size(@test_image)
|
111
112
|
assert_equal 1000, new_dimensions[:height]
|
@@ -114,17 +115,19 @@ class MojoMagickTest < MiniTest::Test
|
|
114
115
|
|
115
116
|
def test_invalid_images
|
116
117
|
# test bad images
|
117
|
-
bad_image = File.join(@working_path,
|
118
|
-
zero_image = File.join(@working_path,
|
119
|
-
assert_raises(MojoMagick::MojoFailed) {MojoMagick.get_image_size(bad_image)}
|
120
|
-
assert_raises(MojoMagick::MojoFailed) {MojoMagick.get_image_size(zero_image)}
|
121
|
-
assert_raises(MojoMagick::MojoFailed)
|
118
|
+
bad_image = File.join(@working_path, "not_an_image.jpg")
|
119
|
+
zero_image = File.join(@working_path, "zero_byte_image.jpg")
|
120
|
+
assert_raises(MojoMagick::MojoFailed) { MojoMagick.get_image_size(bad_image) }
|
121
|
+
assert_raises(MojoMagick::MojoFailed) { MojoMagick.get_image_size(zero_image) }
|
122
|
+
assert_raises(MojoMagick::MojoFailed) do
|
123
|
+
MojoMagick.get_image_size("/file_does_not_exist_here_ok.jpg")
|
124
|
+
end
|
122
125
|
end
|
123
126
|
|
124
127
|
def test_resize_with_fill
|
125
128
|
reset_images
|
126
|
-
@test_image = File.join(@working_path,
|
127
|
-
MojoMagick.resize(@test_image, @test_image, {fill: true, width: 100, height: 100})
|
129
|
+
@test_image = File.join(@working_path, "5742.jpg")
|
130
|
+
MojoMagick.resize(@test_image, @test_image, { fill: true, width: 100, height: 100 })
|
128
131
|
dim = MojoMagick.get_image_size(@test_image)
|
129
132
|
assert_equal 100, dim[:width]
|
130
133
|
assert_equal 150, dim[:height]
|
@@ -132,8 +135,8 @@ class MojoMagickTest < MiniTest::Test
|
|
132
135
|
|
133
136
|
def test_resize_with_fill_and_crop
|
134
137
|
reset_images
|
135
|
-
@test_image = File.join(@working_path,
|
136
|
-
MojoMagick.resize(@test_image, @test_image, {fill: true, crop: true, width: 150, height: 120})
|
138
|
+
@test_image = File.join(@working_path, "5742.jpg")
|
139
|
+
MojoMagick.resize(@test_image, @test_image, { fill: true, crop: true, width: 150, height: 120 })
|
137
140
|
dim = MojoMagick.get_image_size(@test_image)
|
138
141
|
assert_equal 150, dim[:width]
|
139
142
|
assert_equal 120, dim[:height]
|
@@ -141,25 +144,25 @@ class MojoMagickTest < MiniTest::Test
|
|
141
144
|
|
142
145
|
def test_tempfile
|
143
146
|
# Create a tempfile and return the path
|
144
|
-
filename = MojoMagick.tempfile(
|
145
|
-
File.open(filename,
|
146
|
-
assert_equal f.read,
|
147
|
+
filename = MojoMagick.tempfile("binary data")
|
148
|
+
File.open(filename, "rb") do |f|
|
149
|
+
assert_equal f.read, "binary data"
|
147
150
|
end
|
148
151
|
end
|
149
152
|
|
150
153
|
def test_label
|
151
154
|
reset_images
|
152
|
-
out_image = File.join(@working_path,
|
155
|
+
out_image = File.join(@working_path, "label_test.png")
|
153
156
|
|
154
157
|
MojoMagick.convert do |c|
|
155
|
-
c.label
|
158
|
+
c.label "rock the house"
|
156
159
|
c.file out_image
|
157
160
|
end
|
158
161
|
end
|
159
162
|
|
160
163
|
def test_label_with_quote
|
161
164
|
reset_images
|
162
|
-
out_image = File.join(@working_path,
|
165
|
+
out_image = File.join(@working_path, "label_test.png")
|
163
166
|
|
164
167
|
MojoMagick.convert do |c|
|
165
168
|
c.label 'rock "the house'
|
@@ -169,17 +172,17 @@ class MojoMagickTest < MiniTest::Test
|
|
169
172
|
|
170
173
|
def test_label_with_apostrophe
|
171
174
|
reset_images
|
172
|
-
out_image = File.join(@working_path,
|
175
|
+
out_image = File.join(@working_path, "label_test.png")
|
173
176
|
|
174
177
|
MojoMagick.convert do |c|
|
175
|
-
c.label
|
178
|
+
c.label "rock 'the house"
|
176
179
|
c.file out_image
|
177
180
|
end
|
178
181
|
end
|
179
182
|
|
180
183
|
def test_label_with_quotes
|
181
184
|
reset_images
|
182
|
-
out_image = File.join(@working_path,
|
185
|
+
out_image = File.join(@working_path, "label_test.png")
|
183
186
|
|
184
187
|
MojoMagick.convert do |c|
|
185
188
|
c.label 'this is "it!"'
|
@@ -189,23 +192,25 @@ class MojoMagickTest < MiniTest::Test
|
|
189
192
|
|
190
193
|
def test_bad_command
|
191
194
|
MojoMagick.convert do |c|
|
192
|
-
c.unknown_option
|
193
|
-
c.file
|
195
|
+
c.unknown_option "fail"
|
196
|
+
c.file "boogabooga.whatever"
|
194
197
|
end
|
195
198
|
rescue MojoMagick::MojoFailed => e
|
196
|
-
assert e.message.include?(
|
197
|
-
|
199
|
+
assert e.message.include?("unrecognized option"),
|
200
|
+
"Unable to find ImageMagick commandline error in the message"
|
201
|
+
assert e.message.include?("convert.c/ConvertImageCommand"),
|
202
|
+
"Unable to find ImageMagick commandline error in the message"
|
198
203
|
end
|
199
204
|
|
200
205
|
def test_blob
|
201
206
|
reset_images
|
202
207
|
|
203
208
|
# RGB8 test
|
204
|
-
data = (16
|
205
|
-
bdata = data.pack
|
206
|
-
out =
|
209
|
+
data = (Array.new(16) { [rand > 0.5 ? 0 : 255] * 3 }).flatten
|
210
|
+
bdata = data.pack "C" * data.size
|
211
|
+
out = "out.png"
|
207
212
|
MojoMagick.convert(nil, "png:#{out}") do |c|
|
208
|
-
c.blob bdata, format: :rgb, depth: 8, size:
|
213
|
+
c.blob bdata, format: :rgb, depth: 8, size: "4x4"
|
209
214
|
end
|
210
215
|
r = MojoMagick.get_image_size(out)
|
211
216
|
assert r[:height] == 4
|
@@ -214,13 +219,13 @@ class MojoMagickTest < MiniTest::Test
|
|
214
219
|
|
215
220
|
def test_command_helpers
|
216
221
|
reset_images
|
217
|
-
test_image = File.join(@working_path,
|
218
|
-
out_image = File.join(@working_path,
|
222
|
+
test_image = File.join(@working_path, "5742.jpg")
|
223
|
+
out_image = File.join(@working_path, "out1.jpg")
|
219
224
|
|
220
225
|
# Simple convert test
|
221
226
|
MojoMagick.convert do |c|
|
222
227
|
c.file test_image
|
223
|
-
c.crop
|
228
|
+
c.crop "92x64+0+0"
|
224
229
|
c.repage!
|
225
230
|
c.file out_image
|
226
231
|
end
|
@@ -230,7 +235,7 @@ class MojoMagickTest < MiniTest::Test
|
|
230
235
|
|
231
236
|
# Simple mogrify test
|
232
237
|
MojoMagick.mogrify do |m|
|
233
|
-
m.crop
|
238
|
+
m.crop "32x32+0+0"
|
234
239
|
m.repage!
|
235
240
|
m.file out_image
|
236
241
|
end
|
@@ -240,7 +245,7 @@ class MojoMagickTest < MiniTest::Test
|
|
240
245
|
|
241
246
|
# Convert test, using file shortcuts
|
242
247
|
MojoMagick.convert(test_image, out_image) do |c|
|
243
|
-
c.crop
|
248
|
+
c.crop "100x100+0+0"
|
244
249
|
c.repage!
|
245
250
|
end
|
246
251
|
retval = MojoMagick.get_image_size(out_image)
|
@@ -248,26 +253,26 @@ class MojoMagickTest < MiniTest::Test
|
|
248
253
|
assert_equal 100, retval[:height]
|
249
254
|
|
250
255
|
# Mogrify test, using file shortcut
|
251
|
-
MojoMagick.mogrify(out_image) { |m| m.shave(
|
256
|
+
MojoMagick.mogrify(out_image) { |m| m.shave("25x25").repage! }
|
252
257
|
retval = MojoMagick.get_image_size(out_image)
|
253
258
|
assert_equal 50, retval[:width]
|
254
259
|
assert_equal 50, retval[:height]
|
255
260
|
|
256
261
|
# RGB8 test
|
257
|
-
bdata =
|
258
|
-
out =
|
262
|
+
bdata = "aaaaaabbbbbbccc"
|
263
|
+
out = "out.png"
|
259
264
|
MojoMagick.convert do |c|
|
260
|
-
c.blob bdata, format: :rgb, depth: 8, size:
|
265
|
+
c.blob bdata, format: :rgb, depth: 8, size: "5x1"
|
261
266
|
c.file out
|
262
267
|
end
|
263
268
|
r = MojoMagick.get_image_size(out)
|
264
269
|
assert r[:height] == 1
|
265
270
|
assert r[:width] == 5
|
266
271
|
|
267
|
-
bdata =
|
268
|
-
out =
|
272
|
+
bdata = "1111222233334444"
|
273
|
+
out = "out.png"
|
269
274
|
MojoMagick.convert do |c|
|
270
|
-
c.blob bdata, format: :rgba, depth: 8, size:
|
275
|
+
c.blob bdata, format: :rgba, depth: 8, size: "4x1"
|
271
276
|
c.file out
|
272
277
|
end
|
273
278
|
r = MojoMagick.get_image_size(out)
|