Skip to content

Commit

Permalink
delegate to the @tempfile instance variable
Browse files Browse the repository at this point in the history
  • Loading branch information
tenderlove committed Oct 7, 2010
1 parent 1e50fae commit c4528de
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 13 deletions.
18 changes: 5 additions & 13 deletions actionpack/lib/action_dispatch/http/upload.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,19 @@

module ActionDispatch
module Http
class UploadedFile < Tempfile
class UploadedFile
attr_accessor :original_filename, :content_type, :tempfile, :headers

def initialize(hash)
@original_filename = hash[:filename]
@content_type = hash[:type]
@headers = hash[:head]

# To the untrained eye, this may appear as insanity. Given the alternatives,
# such as busting the method cache on every request or breaking backwards
# compatibility with is_a?(Tempfile), this solution is the best available
# option.
#
# TODO: Deprecate is_a?(Tempfile) and define a real API for this parameter
tempfile = hash[:tempfile]
tempfile.instance_variables.each do |ivar|
instance_variable_set(ivar, tempfile.instance_variable_get(ivar))
end
@tempfile = hash[:tempfile]
end

alias local_path path
def method_missing(name, *args, &block)
@tempfile.send(name, *args, &block)
end
end

module Upload
Expand Down
18 changes: 18 additions & 0 deletions actionpack/test/dispatch/uploaded_file_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,23 @@ def test_tempfile
uf = Http::UploadedFile.new(:tempfile => 'foo')
assert_equal 'foo', uf.tempfile
end

def test_delegates_to_tempfile
tf = Class.new { def tenderlove; 'thunderhorse' end }
uf = Http::UploadedFile.new(:tempfile => tf.new)
assert_equal 'thunderhorse', uf.tenderlove
end

def test_delegates_to_tempfile_with_params
tf = Class.new { def tenderlove *args; args end }
uf = Http::UploadedFile.new(:tempfile => tf.new)
assert_equal %w{ thunder horse }, uf.tenderlove(*%w{ thunder horse })
end

def test_delegates_to_tempfile_with_block
tf = Class.new { def tenderlove; yield end }
uf = Http::UploadedFile.new(:tempfile => tf.new)
assert_equal('thunderhorse', uf.tenderlove { 'thunderhorse' })
end
end
end

0 comments on commit c4528de

Please sign in to comment.