From 1fef4c302d076575a1ca9691e01eb96ee9262ebc Mon Sep 17 00:00:00 2001 From: Jon Yurek Date: Tue, 5 Oct 2010 20:40:08 -0400 Subject: [PATCH] Only use Tempfile subclass in 1.8.6 and below. Fixes #278. --- lib/paperclip/iostream.rb | 2 +- lib/paperclip/processor.rb | 17 +++++++++++++---- lib/paperclip/storage/s3.rb | 5 ++++- lib/paperclip/thumbnail.rb | 2 +- test/thumbnail_test.rb | 3 ++- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/lib/paperclip/iostream.rb b/lib/paperclip/iostream.rb index bd08c207c..54a6fad81 100644 --- a/lib/paperclip/iostream.rb +++ b/lib/paperclip/iostream.rb @@ -5,7 +5,7 @@ module IOStream # Returns a Tempfile containing the contents of the readable object. def to_tempfile name = respond_to?(:original_filename) ? original_filename : (respond_to?(:path) ? path : "stream") - tempfile = Paperclip::Tempfile.new("stream" + File.extname(name)) + tempfile = Paperclip::Tempfile.new(["stream", File.extname(name)]) tempfile.binmode self.stream_to(tempfile) end diff --git a/lib/paperclip/processor.rb b/lib/paperclip/processor.rb index da3e213ed..84e9b62e6 100644 --- a/lib/paperclip/processor.rb +++ b/lib/paperclip/processor.rb @@ -40,10 +40,19 @@ def self.make file, options = {}, attachment = nil # on this blog post: # http://marsorange.com/archives/of-mogrify-ruby-tempfile-dynamic-class-definitions class Tempfile < ::Tempfile - # Replaces Tempfile's +make_tmpname+ with one that honors file extensions. - def make_tmpname(basename, n) - extension = File.extname(basename) - sprintf("%s,%d,%d%s", File.basename(basename, extension), $$, n.to_i, extension) + # This is Ruby 1.8.7's implementation. + if RUBY_VERSION <= "1.8.6" + def make_tmpname(basename, n) + case basename + when Array + prefix, suffix = *basename + else + prefix, suffix = basename, '' + end + + t = time.now.strftime("%y%m%d") + path = "#{prefix}#{t}-#{$$}-#{rand(0x100000000).to_s(36)}-#{n}#{suffix}" + end end end end diff --git a/lib/paperclip/storage/s3.rb b/lib/paperclip/storage/s3.rb index 4a502e721..118f445e1 100644 --- a/lib/paperclip/storage/s3.rb +++ b/lib/paperclip/storage/s3.rb @@ -127,7 +127,10 @@ def s3_protocol # style, in the format most representative of the current storage. def to_file style = default_style return @queued_for_write[style] if @queued_for_write[style] - file = Tempfile.new(path(style)) + filename = path(style).split(".") + extname = File.extname(filename) + basename = File.basename(filename, extname) + file = Tempfile.new(basename, extname) file.write(AWS::S3::S3Object.value(path(style), bucket_name)) file.rewind return file diff --git a/lib/paperclip/thumbnail.rb b/lib/paperclip/thumbnail.rb index bf86df63b..a158cbd2e 100644 --- a/lib/paperclip/thumbnail.rb +++ b/lib/paperclip/thumbnail.rb @@ -45,7 +45,7 @@ def convert_options? # that contains the new image. def make src = @file - dst = Tempfile.new([@basename, @format].compact.join(".")) + dst = Tempfile.new([@basename, @format ? ".#{@format}" : '']) dst.binmode begin diff --git a/test/thumbnail_test.rb b/test/thumbnail_test.rb index 18d0e18ed..045bc8904 100644 --- a/test/thumbnail_test.rb +++ b/test/thumbnail_test.rb @@ -4,10 +4,11 @@ class ThumbnailTest < Test::Unit::TestCase context "A Paperclip Tempfile" do setup do - @tempfile = Paperclip::Tempfile.new("file.jpg") + @tempfile = Paperclip::Tempfile.new(["file", ".jpg"]) end should "have its path contain a real extension" do + p @tempfile.path assert_equal ".jpg", File.extname(@tempfile.path) end