From 88f03280d0f499b3cd3437c99b964e72b3801882 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Wed, 27 May 2009 01:04:57 +0000 Subject: [PATCH] gobbled up a bunch of remvees patches --- History.txt | 4 - License.txt => MIT-LICENSE | 5 +- Manifest.txt | 16 - README.rdoc | 72 + README.txt | 97 -- Rakefile | 44 +- config/hoe.rb | 70 - config/requirements.rb | 17 - lib/image_temp_file.rb | 9 + lib/mini_magick.rb | 179 ++- lib/mini_magick/image_temp_file.rb | 13 - lib/mini_magick/mini_magick.rb | 165 -- lib/mini_magick/version.rb | 9 - log/debug.log | 0 mini_magick.gemspec | 18 + script/destroy | 14 - script/generate | 14 - script/txt2html | 74 - setup.rb | 1585 ------------------- tasks/deployment.rake | 34 - tasks/environment.rake | 7 - tasks/website.rake | 17 - test/animation.gif | Bin test/command_builder_test.rb | 20 + test/image_temp_file_test.rb | 17 + test/{test_mini_magick.rb => image_test.rb} | 77 +- test/leaves.tiff | Bin test/not_an_image.php | 0 test/simple.gif | Bin test/test_helper.rb | 2 - test/test_image_temp_file.rb | 14 - test/trogdor.jpg | Bin 32 files changed, 399 insertions(+), 2194 deletions(-) delete mode 100644 History.txt rename License.txt => MIT-LICENSE (88%) mode change 100644 => 100755 delete mode 100644 Manifest.txt create mode 100755 README.rdoc delete mode 100644 README.txt mode change 100644 => 100755 Rakefile delete mode 100644 config/hoe.rb delete mode 100644 config/requirements.rb create mode 100755 lib/image_temp_file.rb mode change 100644 => 100755 lib/mini_magick.rb delete mode 100644 lib/mini_magick/image_temp_file.rb delete mode 100644 lib/mini_magick/mini_magick.rb delete mode 100644 lib/mini_magick/version.rb delete mode 100644 log/debug.log create mode 100755 mini_magick.gemspec delete mode 100755 script/destroy delete mode 100755 script/generate delete mode 100755 script/txt2html delete mode 100644 setup.rb delete mode 100644 tasks/deployment.rake delete mode 100644 tasks/environment.rake delete mode 100644 tasks/website.rake mode change 100644 => 100755 test/animation.gif create mode 100755 test/command_builder_test.rb create mode 100755 test/image_temp_file_test.rb rename test/{test_mini_magick.rb => image_test.rb} (78%) mode change 100644 => 100755 mode change 100644 => 100755 test/leaves.tiff mode change 100644 => 100755 test/not_an_image.php mode change 100644 => 100755 test/simple.gif delete mode 100644 test/test_helper.rb delete mode 100644 test/test_image_temp_file.rb mode change 100644 => 100755 test/trogdor.jpg diff --git a/History.txt b/History.txt deleted file mode 100644 index cc69e99e..00000000 --- a/History.txt +++ /dev/null @@ -1,4 +0,0 @@ -== 0.2.0 2008-05-20 - -* Add << method to images. Let's you send raw commands to mogrify - diff --git a/License.txt b/MIT-LICENSE old mode 100644 new mode 100755 similarity index 88% rename from License.txt rename to MIT-LICENSE index 10aab649..3a20ad43 --- a/License.txt +++ b/MIT-LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2008 FIXME full name +Copyright (c) 2005 Corey Johnson probablycorey@gmail.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -17,4 +17,5 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/Manifest.txt b/Manifest.txt deleted file mode 100644 index a7a3691c..00000000 --- a/Manifest.txt +++ /dev/null @@ -1,16 +0,0 @@ -History.txt -License.txt -README.txt -lib/mini_magick.rb -lib/mini_magick/image_temp_file.rb -lib/mini_magick/mini_magick.rb -lib/mini_magick/version.rb -test/actually_a_gif.jpg -test/animation.gif -test/leaves.tiff -test/not_an_image.php -test/simple.gif -test/test_helper.rb -test/test_image_temp_file.rb -test/test_mini_magick.rb -test/trogdor.jpg diff --git a/README.rdoc b/README.rdoc new file mode 100755 index 00000000..ca791fa0 --- /dev/null +++ b/README.rdoc @@ -0,0 +1,72 @@ += MiniMagick + +A ruby wrapper for ImageMagick command line. + + +== Why? + +I was using RMagick and loving it, but it was eating up huge amounts +of memory. A simple script like this... + + Magick::read("image.jpg") do |f| + f.write("manipulated.jpg") + end + +...would use over 100 Megs of Ram. On my local machine this wasn't a +problem, but on my hosting server the ruby apps would crash because of +their 100 Meg memory limit. + + +== Solution! + +Using MiniMagick the ruby processes memory remains small (it spawns +ImageMagick's command line program mogrify which takes up some memory +as well, but is much smaller compared to RMagick) + +MiniMagick gives you access to all the commandline options ImageMagick +has (Found here http://www.imagemagick.org/script/mogrify.php) + + +== Examples + +Want to make a thumbnail from a file... + + image = MiniMagick::Image.from_file("input.jpg") + image.resize "100x100" + image.write("output.jpg") + +Want to make a thumbnail from a blob... + + image = MiniMagick::Image.from_blob(blob) + image.resize "100x100" + image.write("output.jpg") + +Need to combine several options? + + image = MiniMagick::Image.from_file("input.jpg") + image.combine_options do |c| + c.sample "50%" + c.rotate "-90>" + end + image.write("output.jpg") + +Want to manipulate an image at its source (You won't have to write it +out because the transformations are done on that file) + + image = MiniMagick::Image.new("input.jpg") + image.resize "100x100" + +Want to get some meta-information out? + + image = MiniMagick::Image.from_file("input.jpg") + image[:width] # will get the width (you can also use :height and :format) + image["EXIF:BitsPerSample"] # It also can get all the EXIF tags + image["%m:%f %wx%h"] # Or you can use one of the many options of the format command + +For more on the format command see +http://www.imagemagick.org/script/command-line-options.php#format + + +== Requirements + +You must have ImageMagick installed. diff --git a/README.txt b/README.txt deleted file mode 100644 index b1f5d5e0..00000000 --- a/README.txt +++ /dev/null @@ -1,97 +0,0 @@ -= MiniMagick - -* http://github.com/probablycorey/mini_magick` - -== DESCRIPTION: - -A ruby wrapper for ImageMagick command line. - -== FEATURES/PROBLEMS: - -I was using RMagick and loving it, but it was eating up huge amounts of memory. A simple script like this... - -Magick::read("image.jpg") do |f| - f.write("manipulated.jpg") -end - -...would use over 100 Megs of Ram. On my local machine this wasn't a problem, but on my hosting server the ruby apps would crash because of their 100 Meg memory limit. - -Solution! ---------- -Using MiniMagick the ruby processes memory remains small (it spawns ImageMagick's command line program mogrify which takes up some memory as well, but is much smaller compared to RMagick) - -MiniMagick gives you access to all the commandline options ImageMagick has (Found here http://www.imagemagick.org/script/mogrify.php) - -== SYNOPSIS: - -Want to make a thumbnail from a file... - -image = MiniMagick::Image.from_file("input.jpg") -image.resize "100x100" -image.write("output.jpg") - -Want to make a thumbnail from a blob... - -image = MiniMagick::Image.from_blob(blob) -image.resize "100x100" -image.write("output.jpg") - -Need to combine several options? - -image = MiniMagick::Image.from_file("input.jpg") -image.combine_options do |c| - c.sample "50%" - c.rotate "-90>" -end -image.write("output.jpg") - -Want to manipulate an image at its source (You won't have to write it out because the transformations are done on that file) - -image = MiniMagick::Image.new("input.jpg") -image.resize "100x100" - -Want to get some meta-information out? - -image = MiniMagick::Image.from_file("input.jpg") -image[:width] # will get the width (you can also use :height and :format) -image["EXIF:BitsPerSample"] # It also can get all the EXIF tags -image["%m:%f %wx%h"] # Or you can use one of the many options of the format command found here http://www.imagemagick.org/script/command-line-options.php#format - -== REQUIREMENTS: - -You must have ImageMagick installed. - -== INSTALL: - -sudo gem install mini_magick - -For Rails ---------- - -If want to use as a plugin, just drop the files into RAILS_ROOT/plugins/ -If you installed this as a gem, then to get it to work add to RAILS_ROOT/config/environment.rb - -== LICENSE: - -(The MIT License) - -Copyright (c) 2008 FIX - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Rakefile b/Rakefile old mode 100644 new mode 100755 index e469154c..dfb30164 --- a/Rakefile +++ b/Rakefile @@ -1,4 +1,40 @@ -require 'config/requirements' -require 'config/hoe' # setup Hoe + all gem configuration - -Dir['tasks/**/*.rake'].each { |rake| load rake } \ No newline at end of file +require 'rake' +require 'rake/testtask' +require 'rake/rdoctask' + +$:.unshift(File.dirname(__FILE__) + "/lib") +require 'mini_magick' + +desc 'Default: run unit tests.' +task :default => :test + +desc 'Clean generated files.' +task :clean => :clobber_rdoc do + rm FileList['test/output/*.png'] +end + +desc 'Test the mini_magick plugin.' +Rake::TestTask.new(:test) do |t| + t.libs << 'lib' + t.pattern = 'test/**/*_test.rb' + t.verbose = true +end + +desc 'Generate documentation for the mini_magick plugin.' +Rake::RDocTask.new(:rdoc) do |rdoc| + rdoc.rdoc_dir = 'rdoc' + rdoc.title = 'MiniMagick' + rdoc.options << '--line-numbers' + rdoc.options << '--inline-source' + rdoc.rdoc_files.include('README.rdoc') + rdoc.rdoc_files.include('lib/**/*.rb') +end + +desc 'Update gemspec.' +task :update_gemspec => :clean do + files = `git-ls-files`.split + data = File.read('mini_magick.gemspec') + data.sub!(/^ s.version = .*$/, " s.version = #{MiniMagick::VERSION.inspect}") + data.sub!(/^ s.files = .*$/, " s.files = %w(#{files.join(' ')})") + open('mini_magick.gemspec', 'w'){|f| f.write(data)} +end diff --git a/config/hoe.rb b/config/hoe.rb deleted file mode 100644 index 41309eab..00000000 --- a/config/hoe.rb +++ /dev/null @@ -1,70 +0,0 @@ -require 'mini_magick/version' - -AUTHOR = 'Corey Johnson' # can also be an array of Authors -EMAIL = "probablycorey+minimagick@gmail.com" -DESCRIPTION = "Ruby interface to ImageMagick." -GEM_NAME = 'mini_magick' # what ppl will type to install your gem -RUBYFORGE_PROJECT = 'mini_magick' # The unix name for your project -HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org" -DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}" - -@config_file = "~/.rubyforge/user-config.yml" -@config = nil -RUBYFORGE_USERNAME = "unknown" -def rubyforge_username - unless @config - begin - @config = YAML.load(File.read(File.expand_path(@config_file))) - rescue - puts <<-EOS -ERROR: No rubyforge config file found: #{@config_file} -Run 'rubyforge setup' to prepare your env for access to Rubyforge - - See http://newgem.rubyforge.org/rubyforge.html for more details - EOS - exit - end - end - RUBYFORGE_USERNAME.replace @config["username"] -end - - -REV = nil -# UNCOMMENT IF REQUIRED: -# REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil -VERS = MiniMagick::VERSION::STRING + (REV ? ".#{REV}" : "") -RDOC_OPTS = ['--quiet', '--title', 'mini_magick documentation', - "--opname", "index.html", - "--line-numbers", - "--main", "README", - "--inline-source"] - -class Hoe - def extra_deps - @extra_deps.reject! { |x| Array(x).first == 'hoe' } - @extra_deps - end -end - -# Generate all the Rake tasks -# Run 'rake -T' to see list of generated tasks (from gem root directory) -hoe = Hoe.new(GEM_NAME, VERS) do |p| - p.developer(AUTHOR, EMAIL) - p.description = DESCRIPTION - p.summary = DESCRIPTION - p.url = HOMEPATH - p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT - p.test_globs = ["test/**/test_*.rb"] - p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean. - - # == Optional - p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n") - #p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ] - - #p.spec_extras = {} # A hash of extra values to set in the gemspec. - -end - -CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n") -PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}" -hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc') -hoe.rsync_args = '-av --delete --ignore-errors' \ No newline at end of file diff --git a/config/requirements.rb b/config/requirements.rb deleted file mode 100644 index 67102c45..00000000 --- a/config/requirements.rb +++ /dev/null @@ -1,17 +0,0 @@ -require 'fileutils' -include FileUtils - -require 'rubygems' -%w[rake hoe newgem rubigen].each do |req_gem| - begin - require req_gem - rescue LoadError - puts "This Rakefile requires the '#{req_gem}' RubyGem." - puts "Installation: gem install #{req_gem} -y" - exit - end -end - -$:.unshift(File.join(File.dirname(__FILE__), %w[.. lib])) - -require 'mini_magick' \ No newline at end of file diff --git a/lib/image_temp_file.rb b/lib/image_temp_file.rb new file mode 100755 index 00000000..8bb30272 --- /dev/null +++ b/lib/image_temp_file.rb @@ -0,0 +1,9 @@ +require "tempfile" + +module MiniMagick + class ImageTempFile < Tempfile + def make_tmpname(ext, n) + 'mini_magick%d-%d%s' % [$$, n, ext ? ".#{ext}" : ''] + end + end +end diff --git a/lib/mini_magick.rb b/lib/mini_magick.rb old mode 100644 new mode 100755 index 0f85b113..5f1f3919 --- a/lib/mini_magick.rb +++ b/lib/mini_magick.rb @@ -1,3 +1,178 @@ -$:.unshift File.dirname(__FILE__) +require "open-uri" +require "stringio" +require "fileutils" +require "open3" -require 'mini_magick/mini_magick' \ No newline at end of file +require File.join(File.dirname(__FILE__), '/image_temp_file') + +module MiniMagick + class MiniMagickError < RuntimeError; end + + VERSION = '1.2.5' + + class Image + attr :path + attr :tempfile + attr :output + + # Class Methods + # ------------- + class << self + def from_blob(blob, ext = nil) + begin + tempfile = ImageTempFile.new(ext) + tempfile.binmode + tempfile.write(blob) + ensure + tempfile.close if tempfile + end + + return self.new(tempfile.path, tempfile) + end + + # Use this if you don't want to overwrite the image file + def open(image_path) + File.open(image_path, "rb") do |f| + self.from_blob(f.read, File.extname(image_path)) + end + end + alias_method :from_file, :open + end + + # Instance Methods + # ---------------- + def initialize(input_path, tempfile=nil) + @path = input_path + @tempfile = tempfile # ensures that the tempfile will stick around until this image is garbage collected. + + # Ensure that the file is an image + run_command("identify", @path) + end + + # For reference see http://www.imagemagick.org/script/command-line-options.php#format + def [](value) + # Why do I go to the trouble of putting in newlines? Because otherwise animated gifs screw everything up + case value.to_s + when "format" + run_command("identify", "-format", format_option("%m"), @path).split("\n")[0] + when "height" + run_command("identify", "-format", format_option("%h"), @path).split("\n")[0].to_i + when "width" + run_command("identify", "-format", format_option("%w"), @path).split("\n")[0].to_i + when "dimensions" + run_command("identify", "-format", format_option("%w %h"), @path).split("\n")[0].split.map{|v|v.to_i} + when "size" + File.size(@path) # Do this because calling identify -format "%b" on an animated gif fails! + when "original_at" + # Get the EXIF original capture as a Time object + Time.local(*self["EXIF:DateTimeOriginal"].split(/:|\s+/)) rescue nil + when /^EXIF\:/i + run_command('identify', '-format', "\"%[#{value}]\"", @path).chop + else + run_command('identify', '-format', "\"#{value}\"", @path).split("\n")[0] + end + end + + # Sends raw commands to imagemagick's mogrify command. The image path is automatically appended to the command + def <<(*args) + run_command("mogrify", *args << @path) + end + + # This is a 'special' command because it needs to change @path to reflect the new extension + # Formatting an animation into a non-animated type will result in ImageMagick creating multiple + # pages (starting with 0). You can choose which page you want to manipulate. We default to the + # first page. + def format(format, page=0) + run_command("mogrify", "-format", format, @path) + + old_path = @path.dup + @path.sub!(/(\.\w+)?$/, ".#{format}") + File.unlink(old_path) unless old_path == @path + + unless File.exists?(@path) + begin + FileUtils.copy_file(@path.sub(".#{format}", "-#{page}.#{format}"), @path) + rescue => ex + raise MiniMagickError, "Unable to format to #{format}; #{ex}" unless File.exist?(@path) + end + end + ensure + Dir[@path.sub(/(\.\w+)?$/, "-[0-9]*.#{format}")].each do |fname| + File.unlink(fname) + end + end + + # Writes the temporary image that we are using for processing to the output path + def write(output_path) + FileUtils.copy_file @path, output_path + run_command "identify", output_path # Verify that we have a good image + end + + # Give you raw data back + def to_blob + f = File.new @path + f.binmode + f.read + ensure + f.close if f + end + + # If an unknown method is called then it is sent through the morgrify program + # Look here to find all the commands (http://www.imagemagick.org/script/mogrify.php) + def method_missing(symbol, *args) + args.push(@path) # push the path onto the end + run_command("mogrify", "-#{symbol}", *args) + self + end + + # You can use multiple commands together using this method + def combine_options(&block) + c = CommandBuilder.new + block.call c + run_command("mogrify", *c.args << @path) + end + + # Check to see if we are running on win32 -- we need to escape things differently + def windows? + !(RUBY_PLATFORM =~ /win32/).nil? + end + + # Outputs a carriage-return delimited format string for Unix and Windows + def format_option(format) + windows? ? "#{format}\\n" : "#{format}\\\\n" + end + + def run_command(command, *args) + args.collect! do |arg| + # values quoted because they can contain characters like '>', but don't quote switches + arg =~ /^\+|\-/) ? %|"#{arg}"| : arg.to_s + end + + command = "#{command} #{args.join(' ')}" + output = `#{command} 2>&1` + + if $?.exitstatus != 0 + raise MiniMagickError, "ImageMagick command (#{command.inspect}) failed: #{{:status_code => $?, :output => output}.inspect}" + else + output + end + end + end + + class CommandBuilder + attr :args + + def initialize + @args = [] + end + + def method_missing(symbol, *args) + @args << "-#{symbol}" + @args += args + end + + def +(value) + @args << "+#{value}" + end + end +end diff --git a/lib/mini_magick/image_temp_file.rb b/lib/mini_magick/image_temp_file.rb deleted file mode 100644 index 229ff389..00000000 --- a/lib/mini_magick/image_temp_file.rb +++ /dev/null @@ -1,13 +0,0 @@ -require "tempfile" - -module MiniMagick - class ImageTempFile < Tempfile - def make_tmpname(basename, n) - # force tempfile to use basename's extension if provided - ext = File.extname(basename) - - # force hyphens instead of periods in name - sprintf('%s%d-%d%s', File.basename(basename, ext), $$, n, ext) - end - end -end \ No newline at end of file diff --git a/lib/mini_magick/mini_magick.rb b/lib/mini_magick/mini_magick.rb deleted file mode 100644 index 43e4b494..00000000 --- a/lib/mini_magick/mini_magick.rb +++ /dev/null @@ -1,165 +0,0 @@ -require "open-uri" -require "stringio" -require "fileutils" - -require File.join(File.dirname(__FILE__), '/image_temp_file') - -module MiniMagick - class MiniMagickError < RuntimeError; end - - VERSION = '1.2.3' - - class Image - attr :path - attr :tempfile - attr :output - - # Class Methods - # ------------- - class <', but don't quote switches - arg - end - - @output = `#{command} #{args.join(' ')}` - - if $? != 0 - raise MiniMagickError, "ImageMagick command (#{command} #{args.join(' ')}) failed: Error Given #{$?}" - else - @output - end - end - end - - class CommandBuilder - attr :args - - def initialize - @args = [] - end - - def method_missing(symbol, *args) - @args << "-#{symbol}" - @args += args - end - - def +(value) - @args << "+#{value}" - end - end -end diff --git a/lib/mini_magick/version.rb b/lib/mini_magick/version.rb deleted file mode 100644 index 219cd8d9..00000000 --- a/lib/mini_magick/version.rb +++ /dev/null @@ -1,9 +0,0 @@ -module MiniMagick #:nodoc: - module VERSION #:nodoc: - MAJOR = 0 - MINOR = 2 - TINY = 0 - - STRING = [MAJOR, MINOR, TINY].join('.') - end -end diff --git a/log/debug.log b/log/debug.log deleted file mode 100644 index e69de29b..00000000 diff --git a/mini_magick.gemspec b/mini_magick.gemspec new file mode 100755 index 00000000..553b2e1e --- /dev/null +++ b/mini_magick.gemspec @@ -0,0 +1,18 @@ +Gem::Specification.new do |s| + s.platform = Gem::Platform::RUBY + s.name = 'mini_magick' + s.version = "1.5" + s.summary = "Manipulate images with minimal use of memory." + s.description = %q{Uses command-line ImageMagick tools to resize, rotate, and mogrify images.} + + s.author = "Corey Johnson" + s.email = "probablycorey@gmail.com" + s.rubyforge_project = 'mini_magick' + s.homepage = "http://github.com/probablycorey/mini_magick" + + s.has_rdoc = true + s.requirements << 'none' + s.require_path = 'lib' + + s.files = %w(.gitignore MIT-LICENSE README.rdoc Rakefile lib/image_temp_file.rb lib/mini_magick.rb mini_magick.gemspec test/actually_a_gif.jpg test/animation.gif test/command_builder_test.rb test/image_temp_file_test.rb test/image_test.rb test/leaves.tiff test/not_an_image.php test/simple.gif test/trogdor.jpg) +end diff --git a/script/destroy b/script/destroy deleted file mode 100755 index e48464df..00000000 --- a/script/destroy +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env ruby -APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..')) - -begin - require 'rubigen' -rescue LoadError - require 'rubygems' - require 'rubigen' -end -require 'rubigen/scripts/destroy' - -ARGV.shift if ['--help', '-h'].include?(ARGV[0]) -RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit] -RubiGen::Scripts::Destroy.new.run(ARGV) diff --git a/script/generate b/script/generate deleted file mode 100755 index c27f6559..00000000 --- a/script/generate +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env ruby -APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..')) - -begin - require 'rubigen' -rescue LoadError - require 'rubygems' - require 'rubigen' -end -require 'rubigen/scripts/generate' - -ARGV.shift if ['--help', '-h'].include?(ARGV[0]) -RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit] -RubiGen::Scripts::Generate.new.run(ARGV) diff --git a/script/txt2html b/script/txt2html deleted file mode 100755 index 76cead99..00000000 --- a/script/txt2html +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env ruby - -require 'rubygems' -begin - require 'newgem' -rescue LoadError - puts "\n\nGenerating the website requires the newgem RubyGem" - puts "Install: gem install newgem\n\n" - exit(1) -end -require 'redcloth' -require 'syntax/convertors/html' -require 'erb' -require File.dirname(__FILE__) + '/../lib/mini_magick/version.rb' - -version = MiniMagick::VERSION::STRING -download = 'http://rubyforge.org/projects/mini_magick' - -class Fixnum - def ordinal - # teens - return 'th' if (10..19).include?(self % 100) - # others - case self % 10 - when 1: return 'st' - when 2: return 'nd' - when 3: return 'rd' - else return 'th' - end - end -end - -class Time - def pretty - return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}" - end -end - -def convert_syntax(syntax, source) - return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^
|
$!,'') -end - -if ARGV.length >= 1 - src, template = ARGV - template ||= File.join(File.dirname(__FILE__), '/../website/template.rhtml') - -else - puts("Usage: #{File.split($0).last} source.txt [template.rhtml] > output.html") - exit! -end - -template = ERB.new(File.open(template).read) - -title = nil -body = nil -File.open(src) do |fsrc| - title_text = fsrc.readline - body_text = fsrc.read - syntax_items = [] - body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)!m){ - ident = syntax_items.length - element, syntax, source = $1, $2, $3 - syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}" - "syntax-temp-#{ident}" - } - title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip - body = RedCloth.new(body_text).to_html - body.gsub!(%r!(?:
)?syntax-temp-(\d+)(?:
)?!){ syntax_items[$1.to_i] } -end -stat = File.stat(src) -created = stat.ctime -modified = stat.mtime - -$stdout << template.result(binding) diff --git a/setup.rb b/setup.rb deleted file mode 100644 index 424a5f37..00000000 --- a/setup.rb +++ /dev/null @@ -1,1585 +0,0 @@ -# -# setup.rb -# -# Copyright (c) 2000-2005 Minero Aoki -# -# This program is free software. -# You can distribute/modify this program under the terms of -# the GNU LGPL, Lesser General Public License version 2.1. -# - -unless Enumerable.method_defined?(:map) # Ruby 1.4.6 - module Enumerable - alias map collect - end -end - -unless File.respond_to?(:read) # Ruby 1.6 - def File.read(fname) - open(fname) {|f| - return f.read - } - end -end - -unless Errno.const_defined?(:ENOTEMPTY) # Windows? - module Errno - class ENOTEMPTY - # We do not raise this exception, implementation is not needed. - end - end -end - -def File.binread(fname) - open(fname, 'rb') {|f| - return f.read - } -end - -# for corrupted Windows' stat(2) -def File.dir?(path) - File.directory?((path[-1,1] == '/') ? path : path + '/') -end - - -class ConfigTable - - include Enumerable - - def initialize(rbconfig) - @rbconfig = rbconfig - @items = [] - @table = {} - # options - @install_prefix = nil - @config_opt = nil - @verbose = true - @no_harm = false - end - - attr_accessor :install_prefix - attr_accessor :config_opt - - attr_writer :verbose - - def verbose? - @verbose - end - - attr_writer :no_harm - - def no_harm? - @no_harm - end - - def [](key) - lookup(key).resolve(self) - end - - def []=(key, val) - lookup(key).set val - end - - def names - @items.map {|i| i.name } - end - - def each(&block) - @items.each(&block) - end - - def key?(name) - @table.key?(name) - end - - def lookup(name) - @table[name] or setup_rb_error "no such config item: #{name}" - end - - def add(item) - @items.push item - @table[item.name] = item - end - - def remove(name) - item = lookup(name) - @items.delete_if {|i| i.name == name } - @table.delete_if {|name, i| i.name == name } - item - end - - def load_script(path, inst = nil) - if File.file?(path) - MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path - end - end - - def savefile - '.config' - end - - def load_savefile - begin - File.foreach(savefile()) do |line| - k, v = *line.split(/=/, 2) - self[k] = v.strip - end - rescue Errno::ENOENT - setup_rb_error $!.message + "\n#{File.basename($0)} config first" - end - end - - def save - @items.each {|i| i.value } - File.open(savefile(), 'w') {|f| - @items.each do |i| - f.printf "%s=%s\n", i.name, i.value if i.value? and i.value - end - } - end - - def load_standard_entries - standard_entries(@rbconfig).each do |ent| - add ent - end - end - - def standard_entries(rbconfig) - c = rbconfig - - rubypath = File.join(c['bindir'], c['ruby_install_name'] + c['EXEEXT']) - - major = c['MAJOR'].to_i - minor = c['MINOR'].to_i - teeny = c['TEENY'].to_i - version = "#{major}.#{minor}" - - # ruby ver. >= 1.4.4? - newpath_p = ((major >= 2) or - ((major == 1) and - ((minor >= 5) or - ((minor == 4) and (teeny >= 4))))) - - if c['rubylibdir'] - # V > 1.6.3 - libruby = "#{c['prefix']}/lib/ruby" - librubyver = c['rubylibdir'] - librubyverarch = c['archdir'] - siteruby = c['sitedir'] - siterubyver = c['sitelibdir'] - siterubyverarch = c['sitearchdir'] - elsif newpath_p - # 1.4.4 <= V <= 1.6.3 - libruby = "#{c['prefix']}/lib/ruby" - librubyver = "#{c['prefix']}/lib/ruby/#{version}" - librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}" - siteruby = c['sitedir'] - siterubyver = "$siteruby/#{version}" - siterubyverarch = "$siterubyver/#{c['arch']}" - else - # V < 1.4.4 - libruby = "#{c['prefix']}/lib/ruby" - librubyver = "#{c['prefix']}/lib/ruby/#{version}" - librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}" - siteruby = "#{c['prefix']}/lib/ruby/#{version}/site_ruby" - siterubyver = siteruby - siterubyverarch = "$siterubyver/#{c['arch']}" - end - parameterize = lambda {|path| - path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix') - } - - if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg } - makeprog = arg.sub(/'/, '').split(/=/, 2)[1] - else - makeprog = 'make' - end - - [ - ExecItem.new('installdirs', 'std/site/home', - 'std: install under libruby; site: install under site_ruby; home: install under $HOME')\ - {|val, table| - case val - when 'std' - table['rbdir'] = '$librubyver' - table['sodir'] = '$librubyverarch' - when 'site' - table['rbdir'] = '$siterubyver' - table['sodir'] = '$siterubyverarch' - when 'home' - setup_rb_error '$HOME was not set' unless ENV['HOME'] - table['prefix'] = ENV['HOME'] - table['rbdir'] = '$libdir/ruby' - table['sodir'] = '$libdir/ruby' - end - }, - PathItem.new('prefix', 'path', c['prefix'], - 'path prefix of target environment'), - PathItem.new('bindir', 'path', parameterize.call(c['bindir']), - 'the directory for commands'), - PathItem.new('libdir', 'path', parameterize.call(c['libdir']), - 'the directory for libraries'), - PathItem.new('datadir', 'path', parameterize.call(c['datadir']), - 'the directory for shared data'), - PathItem.new('mandir', 'path', parameterize.call(c['mandir']), - 'the directory for man pages'), - PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']), - 'the directory for system configuration files'), - PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']), - 'the directory for local state data'), - PathItem.new('libruby', 'path', libruby, - 'the directory for ruby libraries'), - PathItem.new('librubyver', 'path', librubyver, - 'the directory for standard ruby libraries'), - PathItem.new('librubyverarch', 'path', librubyverarch, - 'the directory for standard ruby extensions'), - PathItem.new('siteruby', 'path', siteruby, - 'the directory for version-independent aux ruby libraries'), - PathItem.new('siterubyver', 'path', siterubyver, - 'the directory for aux ruby libraries'), - PathItem.new('siterubyverarch', 'path', siterubyverarch, - 'the directory for aux ruby binaries'), - PathItem.new('rbdir', 'path', '$siterubyver', - 'the directory for ruby scripts'), - PathItem.new('sodir', 'path', '$siterubyverarch', - 'the directory for ruby extentions'), - PathItem.new('rubypath', 'path', rubypath, - 'the path to set to #! line'), - ProgramItem.new('rubyprog', 'name', rubypath, - 'the ruby program using for installation'), - ProgramItem.new('makeprog', 'name', makeprog, - 'the make program to compile ruby extentions'), - SelectItem.new('shebang', 'all/ruby/never', 'ruby', - 'shebang line (#!) editing mode'), - BoolItem.new('without-ext', 'yes/no', 'no', - 'does not compile/install ruby extentions') - ] - end - private :standard_entries - - def load_multipackage_entries - multipackage_entries().each do |ent| - add ent - end - end - - def multipackage_entries - [ - PackageSelectionItem.new('with', 'name,name...', '', 'ALL', - 'package names that you want to install'), - PackageSelectionItem.new('without', 'name,name...', '', 'NONE', - 'package names that you do not want to install') - ] - end - private :multipackage_entries - - ALIASES = { - 'std-ruby' => 'librubyver', - 'stdruby' => 'librubyver', - 'rubylibdir' => 'librubyver', - 'archdir' => 'librubyverarch', - 'site-ruby-common' => 'siteruby', # For backward compatibility - 'site-ruby' => 'siterubyver', # For backward compatibility - 'bin-dir' => 'bindir', - 'bin-dir' => 'bindir', - 'rb-dir' => 'rbdir', - 'so-dir' => 'sodir', - 'data-dir' => 'datadir', - 'ruby-path' => 'rubypath', - 'ruby-prog' => 'rubyprog', - 'ruby' => 'rubyprog', - 'make-prog' => 'makeprog', - 'make' => 'makeprog' - } - - def fixup - ALIASES.each do |ali, name| - @table[ali] = @table[name] - end - @items.freeze - @table.freeze - @options_re = /\A--(#{@table.keys.join('|')})(?:=(.*))?\z/ - end - - def parse_opt(opt) - m = @options_re.match(opt) or setup_rb_error "config: unknown option #{opt}" - m.to_a[1,2] - end - - def dllext - @rbconfig['DLEXT'] - end - - def value_config?(name) - lookup(name).value? - end - - class Item - def initialize(name, template, default, desc) - @name = name.freeze - @template = template - @value = default - @default = default - @description = desc - end - - attr_reader :name - attr_reader :description - - attr_accessor :default - alias help_default default - - def help_opt - "--#{@name}=#{@template}" - end - - def value? - true - end - - def value - @value - end - - def resolve(table) - @value.gsub(%r<\$([^/]+)>) { table[$1] } - end - - def set(val) - @value = check(val) - end - - private - - def check(val) - setup_rb_error "config: --#{name} requires argument" unless val - val - end - end - - class BoolItem < Item - def config_type - 'bool' - end - - def help_opt - "--#{@name}" - end - - private - - def check(val) - return 'yes' unless val - case val - when /\Ay(es)?\z/i, /\At(rue)?\z/i then 'yes' - when /\An(o)?\z/i, /\Af(alse)\z/i then 'no' - else - setup_rb_error "config: --#{@name} accepts only yes/no for argument" - end - end - end - - class PathItem < Item - def config_type - 'path' - end - - private - - def check(path) - setup_rb_error "config: --#{@name} requires argument" unless path - path[0,1] == '$' ? path : File.expand_path(path) - end - end - - class ProgramItem < Item - def config_type - 'program' - end - end - - class SelectItem < Item - def initialize(name, selection, default, desc) - super - @ok = selection.split('/') - end - - def config_type - 'select' - end - - private - - def check(val) - unless @ok.include?(val.strip) - setup_rb_error "config: use --#{@name}=#{@template} (#{val})" - end - val.strip - end - end - - class ExecItem < Item - def initialize(name, selection, desc, &block) - super name, selection, nil, desc - @ok = selection.split('/') - @action = block - end - - def config_type - 'exec' - end - - def value? - false - end - - def resolve(table) - setup_rb_error "$#{name()} wrongly used as option value" - end - - undef set - - def evaluate(val, table) - v = val.strip.downcase - unless @ok.include?(v) - setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})" - end - @action.call v, table - end - end - - class PackageSelectionItem < Item - def initialize(name, template, default, help_default, desc) - super name, template, default, desc - @help_default = help_default - end - - attr_reader :help_default - - def config_type - 'package' - end - - private - - def check(val) - unless File.dir?("packages/#{val}") - setup_rb_error "config: no such package: #{val}" - end - val - end - end - - class MetaConfigEnvironment - def initialize(config, installer) - @config = config - @installer = installer - end - - def config_names - @config.names - end - - def config?(name) - @config.key?(name) - end - - def bool_config?(name) - @config.lookup(name).config_type == 'bool' - end - - def path_config?(name) - @config.lookup(name).config_type == 'path' - end - - def value_config?(name) - @config.lookup(name).config_type != 'exec' - end - - def add_config(item) - @config.add item - end - - def add_bool_config(name, default, desc) - @config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc) - end - - def add_path_config(name, default, desc) - @config.add PathItem.new(name, 'path', default, desc) - end - - def set_config_default(name, default) - @config.lookup(name).default = default - end - - def remove_config(name) - @config.remove(name) - end - - # For only multipackage - def packages - raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer - @installer.packages - end - - # For only multipackage - def declare_packages(list) - raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer - @installer.packages = list - end - end - -end # class ConfigTable - - -# This module requires: #verbose?, #no_harm? -module FileOperations - - def mkdir_p(dirname, prefix = nil) - dirname = prefix + File.expand_path(dirname) if prefix - $stderr.puts "mkdir -p #{dirname}" if verbose? - return if no_harm? - - # Does not check '/', it's too abnormal. - dirs = File.expand_path(dirname).split(%r<(?=/)>) - if /\A[a-z]:\z/i =~ dirs[0] - disk = dirs.shift - dirs[0] = disk + dirs[0] - end - dirs.each_index do |idx| - path = dirs[0..idx].join('') - Dir.mkdir path unless File.dir?(path) - end - end - - def rm_f(path) - $stderr.puts "rm -f #{path}" if verbose? - return if no_harm? - force_remove_file path - end - - def rm_rf(path) - $stderr.puts "rm -rf #{path}" if verbose? - return if no_harm? - remove_tree path - end - - def remove_tree(path) - if File.symlink?(path) - remove_file path - elsif File.dir?(path) - remove_tree0 path - else - force_remove_file path - end - end - - def remove_tree0(path) - Dir.foreach(path) do |ent| - next if ent == '.' - next if ent == '..' - entpath = "#{path}/#{ent}" - if File.symlink?(entpath) - remove_file entpath - elsif File.dir?(entpath) - remove_tree0 entpath - else - force_remove_file entpath - end - end - begin - Dir.rmdir path - rescue Errno::ENOTEMPTY - # directory may not be empty - end - end - - def move_file(src, dest) - force_remove_file dest - begin - File.rename src, dest - rescue - File.open(dest, 'wb') {|f| - f.write File.binread(src) - } - File.chmod File.stat(src).mode, dest - File.unlink src - end - end - - def force_remove_file(path) - begin - remove_file path - rescue - end - end - - def remove_file(path) - File.chmod 0777, path - File.unlink path - end - - def install(from, dest, mode, prefix = nil) - $stderr.puts "install #{from} #{dest}" if verbose? - return if no_harm? - - realdest = prefix ? prefix + File.expand_path(dest) : dest - realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest) - str = File.binread(from) - if diff?(str, realdest) - verbose_off { - rm_f realdest if File.exist?(realdest) - } - File.open(realdest, 'wb') {|f| - f.write str - } - File.chmod mode, realdest - - File.open("#{objdir_root()}/InstalledFiles", 'a') {|f| - if prefix - f.puts realdest.sub(prefix, '') - else - f.puts realdest - end - } - end - end - - def diff?(new_content, path) - return true unless File.exist?(path) - new_content != File.binread(path) - end - - def command(*args) - $stderr.puts args.join(' ') if verbose? - system(*args) or raise RuntimeError, - "system(#{args.map{|a| a.inspect }.join(' ')}) failed" - end - - def ruby(*args) - command config('rubyprog'), *args - end - - def make(task = nil) - command(*[config('makeprog'), task].compact) - end - - def extdir?(dir) - File.exist?("#{dir}/MANIFEST") or File.exist?("#{dir}/extconf.rb") - end - - def files_of(dir) - Dir.open(dir) {|d| - return d.select {|ent| File.file?("#{dir}/#{ent}") } - } - end - - DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn ) - - def directories_of(dir) - Dir.open(dir) {|d| - return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT - } - end - -end - - -# This module requires: #srcdir_root, #objdir_root, #relpath -module HookScriptAPI - - def get_config(key) - @config[key] - end - - alias config get_config - - # obsolete: use metaconfig to change configuration - def set_config(key, val) - @config[key] = val - end - - # - # srcdir/objdir (works only in the package directory) - # - - def curr_srcdir - "#{srcdir_root()}/#{relpath()}" - end - - def curr_objdir - "#{objdir_root()}/#{relpath()}" - end - - def srcfile(path) - "#{curr_srcdir()}/#{path}" - end - - def srcexist?(path) - File.exist?(srcfile(path)) - end - - def srcdirectory?(path) - File.dir?(srcfile(path)) - end - - def srcfile?(path) - File.file?(srcfile(path)) - end - - def srcentries(path = '.') - Dir.open("#{curr_srcdir()}/#{path}") {|d| - return d.to_a - %w(. ..) - } - end - - def srcfiles(path = '.') - srcentries(path).select {|fname| - File.file?(File.join(curr_srcdir(), path, fname)) - } - end - - def srcdirectories(path = '.') - srcentries(path).select {|fname| - File.dir?(File.join(curr_srcdir(), path, fname)) - } - end - -end - - -class ToplevelInstaller - - Version = '3.4.1' - Copyright = 'Copyright (c) 2000-2005 Minero Aoki' - - TASKS = [ - [ 'all', 'do config, setup, then install' ], - [ 'config', 'saves your configurations' ], - [ 'show', 'shows current configuration' ], - [ 'setup', 'compiles ruby extentions and others' ], - [ 'install', 'installs files' ], - [ 'test', 'run all tests in test/' ], - [ 'clean', "does `make clean' for each extention" ], - [ 'distclean',"does `make distclean' for each extention" ] - ] - - def ToplevelInstaller.invoke - config = ConfigTable.new(load_rbconfig()) - config.load_standard_entries - config.load_multipackage_entries if multipackage? - config.fixup - klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller) - klass.new(File.dirname($0), config).invoke - end - - def ToplevelInstaller.multipackage? - File.dir?(File.dirname($0) + '/packages') - end - - def ToplevelInstaller.load_rbconfig - if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg } - ARGV.delete(arg) - load File.expand_path(arg.split(/=/, 2)[1]) - $".push 'rbconfig.rb' - else - require 'rbconfig' - end - ::Config::CONFIG - end - - def initialize(ardir_root, config) - @ardir = File.expand_path(ardir_root) - @config = config - # cache - @valid_task_re = nil - end - - def config(key) - @config[key] - end - - def inspect - "#<#{self.class} #{__id__()}>" - end - - def invoke - run_metaconfigs - case task = parsearg_global() - when nil, 'all' - parsearg_config - init_installers - exec_config - exec_setup - exec_install - else - case task - when 'config', 'test' - ; - when 'clean', 'distclean' - @config.load_savefile if File.exist?(@config.savefile) - else - @config.load_savefile - end - __send__ "parsearg_#{task}" - init_installers - __send__ "exec_#{task}" - end - end - - def run_metaconfigs - @config.load_script "#{@ardir}/metaconfig" - end - - def init_installers - @installer = Installer.new(@config, @ardir, File.expand_path('.')) - end - - # - # Hook Script API bases - # - - def srcdir_root - @ardir - end - - def objdir_root - '.' - end - - def relpath - '.' - end - - # - # Option Parsing - # - - def parsearg_global - while arg = ARGV.shift - case arg - when /\A\w+\z/ - setup_rb_error "invalid task: #{arg}" unless valid_task?(arg) - return arg - when '-q', '--quiet' - @config.verbose = false - when '--verbose' - @config.verbose = true - when '--help' - print_usage $stdout - exit 0 - when '--version' - puts "#{File.basename($0)} version #{Version}" - exit 0 - when '--copyright' - puts Copyright - exit 0 - else - setup_rb_error "unknown global option '#{arg}'" - end - end - nil - end - - def valid_task?(t) - valid_task_re() =~ t - end - - def valid_task_re - @valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/ - end - - def parsearg_no_options - unless ARGV.empty? - task = caller(0).first.slice(%r<`parsearg_(\w+)'>, 1) - setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}" - end - end - - alias parsearg_show parsearg_no_options - alias parsearg_setup parsearg_no_options - alias parsearg_test parsearg_no_options - alias parsearg_clean parsearg_no_options - alias parsearg_distclean parsearg_no_options - - def parsearg_config - evalopt = [] - set = [] - @config.config_opt = [] - while i = ARGV.shift - if /\A--?\z/ =~ i - @config.config_opt = ARGV.dup - break - end - name, value = *@config.parse_opt(i) - if @config.value_config?(name) - @config[name] = value - else - evalopt.push [name, value] - end - set.push name - end - evalopt.each do |name, value| - @config.lookup(name).evaluate value, @config - end - # Check if configuration is valid - set.each do |n| - @config[n] if @config.value_config?(n) - end - end - - def parsearg_install - @config.no_harm = false - @config.install_prefix = '' - while a = ARGV.shift - case a - when '--no-harm' - @config.no_harm = true - when /\A--prefix=/ - path = a.split(/=/, 2)[1] - path = File.expand_path(path) unless path[0,1] == '/' - @config.install_prefix = path - else - setup_rb_error "install: unknown option #{a}" - end - end - end - - def print_usage(out) - out.puts 'Typical Installation Procedure:' - out.puts " $ ruby #{File.basename $0} config" - out.puts " $ ruby #{File.basename $0} setup" - out.puts " # ruby #{File.basename $0} install (may require root privilege)" - out.puts - out.puts 'Detailed Usage:' - out.puts " ruby #{File.basename $0} " - out.puts " ruby #{File.basename $0} [] []" - - fmt = " %-24s %s\n" - out.puts - out.puts 'Global options:' - out.printf fmt, '-q,--quiet', 'suppress message outputs' - out.printf fmt, ' --verbose', 'output messages verbosely' - out.printf fmt, ' --help', 'print this message' - out.printf fmt, ' --version', 'print version and quit' - out.printf fmt, ' --copyright', 'print copyright and quit' - out.puts - out.puts 'Tasks:' - TASKS.each do |name, desc| - out.printf fmt, name, desc - end - - fmt = " %-24s %s [%s]\n" - out.puts - out.puts 'Options for CONFIG or ALL:' - @config.each do |item| - out.printf fmt, item.help_opt, item.description, item.help_default - end - out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's" - out.puts - out.puts 'Options for INSTALL:' - out.printf fmt, '--no-harm', 'only display what to do if given', 'off' - out.printf fmt, '--prefix=path', 'install path prefix', '' - out.puts - end - - # - # Task Handlers - # - - def exec_config - @installer.exec_config - @config.save # must be final - end - - def exec_setup - @installer.exec_setup - end - - def exec_install - @installer.exec_install - end - - def exec_test - @installer.exec_test - end - - def exec_show - @config.each do |i| - printf "%-20s %s\n", i.name, i.value if i.value? - end - end - - def exec_clean - @installer.exec_clean - end - - def exec_distclean - @installer.exec_distclean - end - -end # class ToplevelInstaller - - -class ToplevelInstallerMulti < ToplevelInstaller - - include FileOperations - - def initialize(ardir_root, config) - super - @packages = directories_of("#{@ardir}/packages") - raise 'no package exists' if @packages.empty? - @root_installer = Installer.new(@config, @ardir, File.expand_path('.')) - end - - def run_metaconfigs - @config.load_script "#{@ardir}/metaconfig", self - @packages.each do |name| - @config.load_script "#{@ardir}/packages/#{name}/metaconfig" - end - end - - attr_reader :packages - - def packages=(list) - raise 'package list is empty' if list.empty? - list.each do |name| - raise "directory packages/#{name} does not exist"\ - unless File.dir?("#{@ardir}/packages/#{name}") - end - @packages = list - end - - def init_installers - @installers = {} - @packages.each do |pack| - @installers[pack] = Installer.new(@config, - "#{@ardir}/packages/#{pack}", - "packages/#{pack}") - end - with = extract_selection(config('with')) - without = extract_selection(config('without')) - @selected = @installers.keys.select {|name| - (with.empty? or with.include?(name)) \ - and not without.include?(name) - } - end - - def extract_selection(list) - a = list.split(/,/) - a.each do |name| - setup_rb_error "no such package: #{name}" unless @installers.key?(name) - end - a - end - - def print_usage(f) - super - f.puts 'Inluded packages:' - f.puts ' ' + @packages.sort.join(' ') - f.puts - end - - # - # Task Handlers - # - - def exec_config - run_hook 'pre-config' - each_selected_installers {|inst| inst.exec_config } - run_hook 'post-config' - @config.save # must be final - end - - def exec_setup - run_hook 'pre-setup' - each_selected_installers {|inst| inst.exec_setup } - run_hook 'post-setup' - end - - def exec_install - run_hook 'pre-install' - each_selected_installers {|inst| inst.exec_install } - run_hook 'post-install' - end - - def exec_test - run_hook 'pre-test' - each_selected_installers {|inst| inst.exec_test } - run_hook 'post-test' - end - - def exec_clean - rm_f @config.savefile - run_hook 'pre-clean' - each_selected_installers {|inst| inst.exec_clean } - run_hook 'post-clean' - end - - def exec_distclean - rm_f @config.savefile - run_hook 'pre-distclean' - each_selected_installers {|inst| inst.exec_distclean } - run_hook 'post-distclean' - end - - # - # lib - # - - def each_selected_installers - Dir.mkdir 'packages' unless File.dir?('packages') - @selected.each do |pack| - $stderr.puts "Processing the package `#{pack}' ..." if verbose? - Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}") - Dir.chdir "packages/#{pack}" - yield @installers[pack] - Dir.chdir '../..' - end - end - - def run_hook(id) - @root_installer.run_hook id - end - - # module FileOperations requires this - def verbose? - @config.verbose? - end - - # module FileOperations requires this - def no_harm? - @config.no_harm? - end - -end # class ToplevelInstallerMulti - - -class Installer - - FILETYPES = %w( bin lib ext data conf man ) - - include FileOperations - include HookScriptAPI - - def initialize(config, srcroot, objroot) - @config = config - @srcdir = File.expand_path(srcroot) - @objdir = File.expand_path(objroot) - @currdir = '.' - end - - def inspect - "#<#{self.class} #{File.basename(@srcdir)}>" - end - - def noop(rel) - end - - # - # Hook Script API base methods - # - - def srcdir_root - @srcdir - end - - def objdir_root - @objdir - end - - def relpath - @currdir - end - - # - # Config Access - # - - # module FileOperations requires this - def verbose? - @config.verbose? - end - - # module FileOperations requires this - def no_harm? - @config.no_harm? - end - - def verbose_off - begin - save, @config.verbose = @config.verbose?, false - yield - ensure - @config.verbose = save - end - end - - # - # TASK config - # - - def exec_config - exec_task_traverse 'config' - end - - alias config_dir_bin noop - alias config_dir_lib noop - - def config_dir_ext(rel) - extconf if extdir?(curr_srcdir()) - end - - alias config_dir_data noop - alias config_dir_conf noop - alias config_dir_man noop - - def extconf - ruby "#{curr_srcdir()}/extconf.rb", *@config.config_opt - end - - # - # TASK setup - # - - def exec_setup - exec_task_traverse 'setup' - end - - def setup_dir_bin(rel) - files_of(curr_srcdir()).each do |fname| - update_shebang_line "#{curr_srcdir()}/#{fname}" - end - end - - alias setup_dir_lib noop - - def setup_dir_ext(rel) - make if extdir?(curr_srcdir()) - end - - alias setup_dir_data noop - alias setup_dir_conf noop - alias setup_dir_man noop - - def update_shebang_line(path) - return if no_harm? - return if config('shebang') == 'never' - old = Shebang.load(path) - if old - $stderr.puts "warning: #{path}: Shebang line includes too many args. It is not portable and your program may not work." if old.args.size > 1 - new = new_shebang(old) - return if new.to_s == old.to_s - else - return unless config('shebang') == 'all' - new = Shebang.new(config('rubypath')) - end - $stderr.puts "updating shebang: #{File.basename(path)}" if verbose? - open_atomic_writer(path) {|output| - File.open(path, 'rb') {|f| - f.gets if old # discard - output.puts new.to_s - output.print f.read - } - } - end - - def new_shebang(old) - if /\Aruby/ =~ File.basename(old.cmd) - Shebang.new(config('rubypath'), old.args) - elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby' - Shebang.new(config('rubypath'), old.args[1..-1]) - else - return old unless config('shebang') == 'all' - Shebang.new(config('rubypath')) - end - end - - def open_atomic_writer(path, &block) - tmpfile = File.basename(path) + '.tmp' - begin - File.open(tmpfile, 'wb', &block) - File.rename tmpfile, File.basename(path) - ensure - File.unlink tmpfile if File.exist?(tmpfile) - end - end - - class Shebang - def Shebang.load(path) - line = nil - File.open(path) {|f| - line = f.gets - } - return nil unless /\A#!/ =~ line - parse(line) - end - - def Shebang.parse(line) - cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ') - new(cmd, args) - end - - def initialize(cmd, args = []) - @cmd = cmd - @args = args - end - - attr_reader :cmd - attr_reader :args - - def to_s - "#! #{@cmd}" + (@args.empty? ? '' : " #{@args.join(' ')}") - end - end - - # - # TASK install - # - - def exec_install - rm_f 'InstalledFiles' - exec_task_traverse 'install' - end - - def install_dir_bin(rel) - install_files targetfiles(), "#{config('bindir')}/#{rel}", 0755 - end - - def install_dir_lib(rel) - install_files libfiles(), "#{config('rbdir')}/#{rel}", 0644 - end - - def install_dir_ext(rel) - return unless extdir?(curr_srcdir()) - install_files rubyextentions('.'), - "#{config('sodir')}/#{File.dirname(rel)}", - 0555 - end - - def install_dir_data(rel) - install_files targetfiles(), "#{config('datadir')}/#{rel}", 0644 - end - - def install_dir_conf(rel) - # FIXME: should not remove current config files - # (rename previous file to .old/.org) - install_files targetfiles(), "#{config('sysconfdir')}/#{rel}", 0644 - end - - def install_dir_man(rel) - install_files targetfiles(), "#{config('mandir')}/#{rel}", 0644 - end - - def install_files(list, dest, mode) - mkdir_p dest, @config.install_prefix - list.each do |fname| - install fname, dest, mode, @config.install_prefix - end - end - - def libfiles - glob_reject(%w(*.y *.output), targetfiles()) - end - - def rubyextentions(dir) - ents = glob_select("*.#{@config.dllext}", targetfiles()) - if ents.empty? - setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first" - end - ents - end - - def targetfiles - mapdir(existfiles() - hookfiles()) - end - - def mapdir(ents) - ents.map {|ent| - if File.exist?(ent) - then ent # objdir - else "#{curr_srcdir()}/#{ent}" # srcdir - end - } - end - - # picked up many entries from cvs-1.11.1/src/ignore.c - JUNK_FILES = %w( - core RCSLOG tags TAGS .make.state - .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb - *~ *.old *.bak *.BAK *.orig *.rej _$* *$ - - *.org *.in .* - ) - - def existfiles - glob_reject(JUNK_FILES, (files_of(curr_srcdir()) | files_of('.'))) - end - - def hookfiles - %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt| - %w( config setup install clean ).map {|t| sprintf(fmt, t) } - }.flatten - end - - def glob_select(pat, ents) - re = globs2re([pat]) - ents.select {|ent| re =~ ent } - end - - def glob_reject(pats, ents) - re = globs2re(pats) - ents.reject {|ent| re =~ ent } - end - - GLOB2REGEX = { - '.' => '\.', - '$' => '\$', - '#' => '\#', - '*' => '.*' - } - - def globs2re(pats) - /\A(?:#{ - pats.map {|pat| pat.gsub(/[\.\$\#\*]/) {|ch| GLOB2REGEX[ch] } }.join('|') - })\z/ - end - - # - # TASK test - # - - TESTDIR = 'test' - - def exec_test - unless File.directory?('test') - $stderr.puts 'no test in this package' if verbose? - return - end - $stderr.puts 'Running tests...' if verbose? - begin - require 'test/unit' - rescue LoadError - setup_rb_error 'test/unit cannot loaded. You need Ruby 1.8 or later to invoke this task.' - end - runner = Test::Unit::AutoRunner.new(true) - runner.to_run << TESTDIR - runner.run - end - - # - # TASK clean - # - - def exec_clean - exec_task_traverse 'clean' - rm_f @config.savefile - rm_f 'InstalledFiles' - end - - alias clean_dir_bin noop - alias clean_dir_lib noop - alias clean_dir_data noop - alias clean_dir_conf noop - alias clean_dir_man noop - - def clean_dir_ext(rel) - return unless extdir?(curr_srcdir()) - make 'clean' if File.file?('Makefile') - end - - # - # TASK distclean - # - - def exec_distclean - exec_task_traverse 'distclean' - rm_f @config.savefile - rm_f 'InstalledFiles' - end - - alias distclean_dir_bin noop - alias distclean_dir_lib noop - - def distclean_dir_ext(rel) - return unless extdir?(curr_srcdir()) - make 'distclean' if File.file?('Makefile') - end - - alias distclean_dir_data noop - alias distclean_dir_conf noop - alias distclean_dir_man noop - - # - # Traversing - # - - def exec_task_traverse(task) - run_hook "pre-#{task}" - FILETYPES.each do |type| - if type == 'ext' and config('without-ext') == 'yes' - $stderr.puts 'skipping ext/* by user option' if verbose? - next - end - traverse task, type, "#{task}_dir_#{type}" - end - run_hook "post-#{task}" - end - - def traverse(task, rel, mid) - dive_into(rel) { - run_hook "pre-#{task}" - __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '') - directories_of(curr_srcdir()).each do |d| - traverse task, "#{rel}/#{d}", mid - end - run_hook "post-#{task}" - } - end - - def dive_into(rel) - return unless File.dir?("#{@srcdir}/#{rel}") - - dir = File.basename(rel) - Dir.mkdir dir unless File.dir?(dir) - prevdir = Dir.pwd - Dir.chdir dir - $stderr.puts '---> ' + rel if verbose? - @currdir = rel - yield - Dir.chdir prevdir - $stderr.puts '<--- ' + rel if verbose? - @currdir = File.dirname(rel) - end - - def run_hook(id) - path = [ "#{curr_srcdir()}/#{id}", - "#{curr_srcdir()}/#{id}.rb" ].detect {|cand| File.file?(cand) } - return unless path - begin - instance_eval File.read(path), path, 1 - rescue - raise if $DEBUG - setup_rb_error "hook #{path} failed:\n" + $!.message - end - end - -end # class Installer - - -class SetupError < StandardError; end - -def setup_rb_error(msg) - raise SetupError, msg -end - -if $0 == __FILE__ - begin - ToplevelInstaller.invoke - rescue SetupError - raise if $DEBUG - $stderr.puts $!.message - $stderr.puts "Try 'ruby #{$0} --help' for detailed usage." - exit 1 - end -end diff --git a/tasks/deployment.rake b/tasks/deployment.rake deleted file mode 100644 index 2f437425..00000000 --- a/tasks/deployment.rake +++ /dev/null @@ -1,34 +0,0 @@ -desc 'Release the website and new gem version' -task :deploy => [:check_version, :website, :release] do - puts "Remember to create SVN tag:" - puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " + - "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} " - puts "Suggested comment:" - puts "Tagging release #{CHANGES}" -end - -desc 'Runs tasks website_generate and install_gem as a local deployment of the gem' -task :local_deploy => [:website_generate, :install_gem] - -task :check_version do - unless ENV['VERSION'] - puts 'Must pass a VERSION=x.y.z release version' - exit - end - unless ENV['VERSION'] == VERS - puts "Please update your version.rb to match the release version, currently #{VERS}" - exit - end -end - -desc 'Install the package as a gem, without generating documentation(ri/rdoc)' -task :install_gem_no_doc => [:clean, :package] do - sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri" -end - -namespace :manifest do - desc 'Recreate Manifest.txt to include ALL files' - task :refresh do - `rake check_manifest | patch -p0 > Manifest.txt` - end -end \ No newline at end of file diff --git a/tasks/environment.rake b/tasks/environment.rake deleted file mode 100644 index 691ed3b6..00000000 --- a/tasks/environment.rake +++ /dev/null @@ -1,7 +0,0 @@ -task :ruby_env do - RUBY_APP = if RUBY_PLATFORM =~ /java/ - "jruby" - else - "ruby" - end unless defined? RUBY_APP -end diff --git a/tasks/website.rake b/tasks/website.rake deleted file mode 100644 index 93e03faa..00000000 --- a/tasks/website.rake +++ /dev/null @@ -1,17 +0,0 @@ -desc 'Generate website files' -task :website_generate => :ruby_env do - (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt| - sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} } - end -end - -desc 'Upload website files to rubyforge' -task :website_upload do - host = "#{rubyforge_username}@rubyforge.org" - remote_dir = "/var/www/gforge-projects/#{PATH}/" - local_dir = 'website' - sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}} -end - -desc 'Generate and upload website files' -task :website => [:website_generate, :website_upload, :publish_docs] diff --git a/test/animation.gif b/test/animation.gif old mode 100644 new mode 100755 diff --git a/test/command_builder_test.rb b/test/command_builder_test.rb new file mode 100755 index 00000000..ac3487be --- /dev/null +++ b/test/command_builder_test.rb @@ -0,0 +1,20 @@ +require 'test/unit' +require File.join(File.dirname(__FILE__), '../lib/mini_magick') + +class CommandBuilderTest < Test::Unit::TestCase + include MiniMagick + + def test_basic + c = CommandBuilder.new + c.resize "30x40" + assert_equal "-resize 30x40", c.args.join(" ") + end + + def test_complicated + c = CommandBuilder.new + c.resize "30x40" + c.input 1, 3, 4 + c.lingo "mome fingo" + assert_equal "-resize 30x40 -input 1 3 4 -lingo mome fingo", c.args.join(" ") + end +end diff --git a/test/image_temp_file_test.rb b/test/image_temp_file_test.rb new file mode 100755 index 00000000..bf6a3680 --- /dev/null +++ b/test/image_temp_file_test.rb @@ -0,0 +1,17 @@ +require 'test/unit' +require File.join(File.dirname(__FILE__), '../lib/image_temp_file') + +class ImageTempFileTest < Test::Unit::TestCase + include MiniMagick + + def test_multiple_calls_yield_different_files + first = ImageTempFile.new('test') + second = ImageTempFile.new('test') + assert_not_equal first.path, second.path + end + + def test_temp_file_has_given_extension + assert_match /^[^.]+\.jpg$/, ImageTempFile.new('jpg').path + assert_match /^[^.]+\.png$/, ImageTempFile.new('png').path + end +end diff --git a/test/test_mini_magick.rb b/test/image_test.rb old mode 100644 new mode 100755 similarity index 78% rename from test/test_mini_magick.rb rename to test/image_test.rb index 19d9c27f..7b6c05c1 --- a/test/test_mini_magick.rb +++ b/test/image_test.rb @@ -3,7 +3,7 @@ class ImageTest < Test::Unit::TestCase include MiniMagick - + CURRENT_DIR = File.dirname(File.expand_path(__FILE__)) + "/" SIMPLE_IMAGE_PATH = CURRENT_DIR + "simple.gif" @@ -12,68 +12,70 @@ class ImageTest < Test::Unit::TestCase GIF_WITH_JPG_EXT = CURRENT_DIR + "actually_a_gif.jpg" EXIF_IMAGE_PATH = CURRENT_DIR + "trogdor.jpg" ANIMATION_PATH = CURRENT_DIR + "animation.gif" - + def test_image_from_blob File.open(SIMPLE_IMAGE_PATH, "rb") do |f| image = Image.from_blob(f.read) end end - + def test_image_from_file image = Image.from_file(SIMPLE_IMAGE_PATH) end - + def test_image_new image = Image.new(SIMPLE_IMAGE_PATH) end - + def test_image_write output_path = "output.gif" begin image = Image.new(SIMPLE_IMAGE_PATH) image.write output_path - + assert File.exists?(output_path) ensure File.delete output_path end end - + def test_not_an_image assert_raise(MiniMagickError) do image = Image.new(NOT_AN_IMAGE_PATH) end end - + def test_image_meta_info image = Image.new(SIMPLE_IMAGE_PATH) assert_equal 150, image[:width] assert_equal 55, image[:height] + assert_equal [150, 55], image[:dimensions] assert_match(/^gif$/i, image[:format]) end def test_tiff - image = Image.new(TIFF_IMAGE_PATH) + image = Image.new(TIFF_IMAGE_PATH) assert_equal "tiff", image[:format].downcase assert_equal 295, image[:width] assert_equal 242, image[:height] end - + def test_animation_pages image = Image.from_file(ANIMATION_PATH) image.format "png", 0 + assert_equal "png", image[:format].downcase end def test_animation_size image = Image.from_file(ANIMATION_PATH) assert_equal image[:size], 76631 end - + def test_gif_with_jpg_format - image = Image.new(GIF_WITH_JPG_EXT) + image = Image.new(GIF_WITH_JPG_EXT) assert_equal "gif", image[:format].downcase end - + def test_image_resize image = Image.from_file(SIMPLE_IMAGE_PATH) image.resize "20x30!" @@ -81,8 +83,8 @@ def test_image_resize assert_equal 20, image[:width] assert_equal 30, image[:height] assert_match(/^gif$/i, image[:format]) - end - + end + def test_image_resize_with_minimum image = Image.from_file(SIMPLE_IMAGE_PATH) original_width, original_height = image[:width], image[:height] @@ -91,7 +93,7 @@ def test_image_resize_with_minimum assert_equal original_width, image[:width] assert_equal original_height, image[:height] end - + def test_image_combine_options_resize_blur image = Image.from_file(SIMPLE_IMAGE_PATH) image.combine_options do |c| @@ -103,36 +105,43 @@ def test_image_combine_options_resize_blur assert_equal 30, image[:height] assert_match(/^gif$/i, image[:format]) end - + def test_exif image = Image.from_file(EXIF_IMAGE_PATH) assert_equal('0220', image["exif:ExifVersion"]) image = Image.from_file(SIMPLE_IMAGE_PATH) assert_equal('', image["EXIF:ExifVersion"]) end - + def test_original_at image = Image.from_file(EXIF_IMAGE_PATH) assert_equal(Time.local('2005', '2', '23', '23', '17', '24'), image[:original_at]) image = Image.from_file(SIMPLE_IMAGE_PATH) assert_nil(image[:original_at]) end -end -class CommandBuilderTest < Test::Unit::TestCase - include MiniMagick - - def test_basic - c = CommandBuilder.new - c.resize "30x40" - assert_equal "-resize 30x40", c.args.join(" ") - end - - def test_complicated - c = CommandBuilder.new - c.resize "30x40" - c.input 1, 3, 4 - c.lingo "mome fingo" - assert_equal "-resize 30x40 -input 1 3 4 -lingo mome fingo", c.args.join(" ") + def test_tempfile_at_path + image = Image.from_file(TIFF_IMAGE_PATH) + assert_equal image.path, image.tempfile.path + end + + def test_tempfile_at_path_after_format + image = Image.from_file(TIFF_IMAGE_PATH) + image.format('png') + assert_equal image.path, image.tempfile.path + end + + def test_previous_tempfile_deleted_after_format + image = Image.from_file(TIFF_IMAGE_PATH) + before = image.path.dup + image.format('png') + assert !File.exist?(before) + end + + def test_mini_magick_error_when_referencing_not_existing_page + image = Image.from_file(ANIMATION_PATH) + assert_raises MiniMagickError do + image.format('png', 31415) + end end end diff --git a/test/leaves.tiff b/test/leaves.tiff old mode 100644 new mode 100755 diff --git a/test/not_an_image.php b/test/not_an_image.php old mode 100644 new mode 100755 diff --git a/test/simple.gif b/test/simple.gif old mode 100644 new mode 100755 diff --git a/test/test_helper.rb b/test/test_helper.rb deleted file mode 100644 index df84f168..00000000 --- a/test/test_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -require 'test/unit' -require File.dirname(__FILE__) + '/../lib/mini_magick' diff --git a/test/test_image_temp_file.rb b/test/test_image_temp_file.rb deleted file mode 100644 index 530da670..00000000 --- a/test/test_image_temp_file.rb +++ /dev/null @@ -1,14 +0,0 @@ -require 'test/unit' -require File.join(File.dirname(__FILE__), '../lib/image_temp_file') - -class ImageTest < Test::Unit::TestCase - include MiniMagick - - def test_image_temp_file - tmp = ImageTempFile.new('test') - assert_match %r{^test}, File::basename(tmp.path) - tmp = ImageTempFile.new('test.jpg') - assert_match %r{^test}, File::basename(tmp.path) - assert_match %r{\.jpg$}, File::basename(tmp.path) - end -end diff --git a/test/trogdor.jpg b/test/trogdor.jpg old mode 100644 new mode 100755