From 880081549d600a3d592241aadc8b2c6653a3d716 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Sun, 6 Jan 2008 20:53:47 +0000 Subject: Use a decorator module for Files instantiated by Hash.from_xml. Add test coverage. Closes #10726 [Cheah Chu Yeow] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8579 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- .../lib/active_support/core_ext/hash/conversions.rb | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'activesupport/lib') diff --git a/activesupport/lib/active_support/core_ext/hash/conversions.rb b/activesupport/lib/active_support/core_ext/hash/conversions.rb index f6ebb90400..8e80f6e4ff 100644 --- a/activesupport/lib/active_support/core_ext/hash/conversions.rb +++ b/activesupport/lib/active_support/core_ext/hash/conversions.rb @@ -24,10 +24,25 @@ class XmlSimple end end +# This module exists to decorate files deserialized using Hash.from_xml with +# the original_filename and content_type methods. +module FileLike #:nodoc: + attr_writer :original_filename, :content_type + + def original_filename + @original_filename || 'untitled' + end + + def content_type + @content_type || 'application/octet-stream' + end +end + module ActiveSupport #:nodoc: module CoreExtensions #:nodoc: module Hash #:nodoc: module Conversions + XML_TYPE_NAMES = { "Symbol" => "symbol", "Fixnum" => "integer", @@ -63,11 +78,11 @@ module ActiveSupport #:nodoc: "string" => Proc.new { |string| string.to_s }, "yaml" => Proc.new { |yaml| YAML::load(yaml) rescue yaml }, "base64Binary" => Proc.new { |bin| Base64.decode64(bin) }, - # FIXME: Get rid of eval and institute a proper decorator here "file" => Proc.new do |file, entity| f = StringIO.new(Base64.decode64(file)) - eval "def f.original_filename() '#{entity["name"]}' || 'untitled' end" - eval "def f.content_type() '#{entity["content_type"]}' || 'application/octet-stream' end" + f.extend(FileLike) + f.original_filename = entity['name'] + f.content_type = entity['content_type'] f end } -- cgit v1.2.3