diff options
author | Jeremy Kemper <jeremy@bitsweat.net> | 2007-03-18 07:30:09 +0000 |
---|---|---|
committer | Jeremy Kemper <jeremy@bitsweat.net> | 2007-03-18 07:30:09 +0000 |
commit | 27ba5edef1c4264a8d1c0e54675723d37a391dd8 (patch) | |
tree | 83e5292708b2452b26d92f4a95dd6094f298c64e | |
parent | 3202fbabe6df3591d7e2c35727ea9c8b68df8828 (diff) | |
download | rails-27ba5edef1c4264a8d1c0e54675723d37a391dd8.tar.gz rails-27ba5edef1c4264a8d1c0e54675723d37a391dd8.tar.bz2 rails-27ba5edef1c4264a8d1c0e54675723d37a391dd8.zip |
Hash#to_xml supports YAML attributes; ActiveRecord::Base#to_xml support serialized attributes. Closes #7502.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6444 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r-- | activerecord/CHANGELOG | 2 | ||||
-rw-r--r-- | activerecord/lib/active_record/xml_serialization.rb | 2 | ||||
-rwxr-xr-x | activerecord/test/base_test.rb | 2 | ||||
-rw-r--r-- | activerecord/test/xml_serialization_test.rb | 23 | ||||
-rw-r--r-- | activesupport/CHANGELOG | 2 | ||||
-rw-r--r-- | activesupport/lib/active_support/core_ext/hash/conversions.rb | 6 | ||||
-rw-r--r-- | activesupport/test/core_ext/hash_ext_test.rb | 8 |
7 files changed, 32 insertions, 13 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index 9b1ac32f23..bf3a893e7f 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Base#to_xml supports serialized attributes. #7502 [jonathan] + * Base.update_all :order and :limit options. Useful for MySQL updates that must be ordered to avoid violating unique constraints. [Jeremy Kemper] * Remove deprecated object transactions. People relying on this functionality should install the object_transactions plugin at http://code.bitsweat.net/svn/object_transactions. Closes #5637 [Koz, Jeremy Kemper] diff --git a/activerecord/lib/active_record/xml_serialization.rb b/activerecord/lib/active_record/xml_serialization.rb index 7a8167534d..ff7720d786 100644 --- a/activerecord/lib/active_record/xml_serialization.rb +++ b/activerecord/lib/active_record/xml_serialization.rb @@ -275,7 +275,7 @@ module ActiveRecord #:nodoc: protected def compute_type - type = @record.class.columns_hash[name].type + type = @record.class.serialized_attributes.has_key?(name) ? :yaml : @record.class.columns_hash[name].type case type when :text diff --git a/activerecord/test/base_test.rb b/activerecord/test/base_test.rb index c3ae9a08b9..7f629a91f4 100755 --- a/activerecord/test/base_test.rb +++ b/activerecord/test/base_test.rb @@ -1509,7 +1509,7 @@ class BasicsTest < Test::Unit::TestCase assert xml.include?(%(<id type="integer">1</id>)) assert xml.include?(%(<replies-count type="integer">1</replies-count>)) assert xml.include?(%(<written-on type="datetime">#{written_on_in_current_timezone}</written-on>)) - assert xml.include?(%(<content>Have a nice day</content>)) + assert xml.include?(%(<content type="yaml">--- Have a nice day\n</content>)) assert xml.include?(%(<author-email-address>david@loudthinking.com</author-email-address>)) assert xml.match(%(<parent-id type="integer"></parent-id>)) if current_adapter?(:SybaseAdapter, :SQLServerAdapter, :OracleAdapter) diff --git a/activerecord/test/xml_serialization_test.rb b/activerecord/test/xml_serialization_test.rb index 73ff354c48..61da81fe2d 100644 --- a/activerecord/test/xml_serialization_test.rb +++ b/activerecord/test/xml_serialization_test.rb @@ -9,11 +9,14 @@ class Contact < ActiveRecord::Base columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null) end - column :name, :string - column :age, :integer - column :avatar, :binary - column :created_at, :datetime - column :awesome, :boolean + column :name, :string + column :age, :integer + column :avatar, :binary + column :created_at, :datetime + column :awesome, :boolean + column :preferences, :string + + serialize :preferences end class XmlSerializationTest < Test::Unit::TestCase @@ -57,7 +60,7 @@ end class DefaultXmlSerializationTest < Test::Unit::TestCase def setup - @xml = Contact.new(:name => 'aaron stack', :age => 25, :avatar => 'binarydata', :created_at => Time.utc(2006, 8, 1), :awesome => false).to_xml + @xml = Contact.new(:name => 'aaron stack', :age => 25, :avatar => 'binarydata', :created_at => Time.utc(2006, 8, 1), :awesome => false, :preferences => { :gem => 'ruby' }).to_xml end def test_should_serialize_string @@ -81,6 +84,10 @@ class DefaultXmlSerializationTest < Test::Unit::TestCase def test_should_serialize_boolean assert_match %r{<awesome type=\"boolean\">false</awesome>}, @xml end + + def test_should_serialize_yaml + assert_match %r{<preferences type=\"yaml\">--- \n:gem: ruby\n</preferences>}, @xml + end end class NilXmlSerializationTest < Test::Unit::TestCase @@ -109,6 +116,10 @@ class NilXmlSerializationTest < Test::Unit::TestCase def test_should_serialize_boolean assert_match %r{<awesome type=\"boolean\"></awesome>}, @xml end + + def test_should_serialize_yaml + assert_match %r{<preferences type=\"yaml\"></preferences>}, @xml + end end class DatabaseConnectedXmlSerializationTest < Test::Unit::TestCase diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG index 368989877e..e0108f27bc 100644 --- a/activesupport/CHANGELOG +++ b/activesupport/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Hash#to_xml supports YAML attributes. #7502 [jonathan] + * Refactor ActiveSupport::JSON to be less obtuse. Add support for JSON decoding by way of Syck with ActiveSupport::JSON.decode(json_string). Prevent hash keys that are JavaScript reserved words from being unquoted during encoding. [Sam Stephenson] * alias_method_chain preserves the original method's visibility. #7854 [Jonathan Viney] diff --git a/activesupport/lib/active_support/core_ext/hash/conversions.rb b/activesupport/lib/active_support/core_ext/hash/conversions.rb index f0ce27508f..bbfc2502a1 100644 --- a/activesupport/lib/active_support/core_ext/hash/conversions.rb +++ b/activesupport/lib/active_support/core_ext/hash/conversions.rb @@ -38,7 +38,8 @@ module ActiveSupport #:nodoc: XML_FORMATTING = { "date" => Proc.new { |date| date.to_s(:db) }, "datetime" => Proc.new { |time| time.xmlschema }, - "binary" => Proc.new { |binary| Base64.encode64(binary) } + "binary" => Proc.new { |binary| Base64.encode64(binary) }, + "yaml" => Proc.new { |yaml| yaml.to_yaml } } unless defined? XML_FORMATTING def self.included(klass) @@ -105,7 +106,7 @@ module ActiveSupport #:nodoc: module ClassMethods def from_xml(xml) # TODO: Refactor this into something much cleaner that doesn't rely on XmlSimple - undasherize_keys(typecast_xml_value(XmlSimple.xml_in(xml, + typecast_xml_value(undasherize_keys(XmlSimple.xml_in(xml, 'forcearray' => false, 'forcecontent' => true, 'keeproot' => true, @@ -129,6 +130,7 @@ module ActiveSupport #:nodoc: when "boolean" then content.strip == "true" when "datetime" then ::Time.parse(content).utc when "date" then ::Date.parse(content) + when "yaml" then YAML::load(content) rescue content else content end else diff --git a/activesupport/test/core_ext/hash_ext_test.rb b/activesupport/test/core_ext/hash_ext_test.rb index 64d550aaf5..5a5bd7fe5a 100644 --- a/activesupport/test/core_ext/hash_ext_test.rb +++ b/activesupport/test/core_ext/hash_ext_test.rb @@ -376,7 +376,7 @@ class HashToXmlTest < Test::Unit::TestCase <replies-close-in type="integer">2592000000</replies-close-in> <written-on type="date">2003-07-16</written-on> <viewed-at type="datetime">2003-07-16T09:28:00+0000</viewed-at> - <content>Have a nice day</content> + <content type="yaml">--- \n1: should be an integer\n:message: Have a nice day\narray: \n- should-have-dashes: true\n should_have_underscores: true\n</content> <author-email-address>david@loudthinking.com</author-email-address> <parent-id></parent-id> </topic> @@ -391,7 +391,7 @@ class HashToXmlTest < Test::Unit::TestCase :replies_close_in => 2592000000, :written_on => Date.new(2003, 7, 16), :viewed_at => Time.utc(2003, 7, 16, 9, 28), - :content => "Have a nice day", + :content => { :message => "Have a nice day", 1 => "should be an integer", "array" => [{ "should-have-dashes" => true, "should_have_underscores" => true }] }, :author_email_address => "david@loudthinking.com", :parent_id => nil }.stringify_keys @@ -407,6 +407,7 @@ class HashToXmlTest < Test::Unit::TestCase <approved type="boolean"></approved> <written-on type="date"></written-on> <viewed-at type="datetime"></viewed-at> + <content type="yaml"></content> <parent-id></parent-id> </topic> EOT @@ -416,7 +417,8 @@ class HashToXmlTest < Test::Unit::TestCase :id => nil, :approved => nil, :written_on => nil, - :viewed_at => nil, + :viewed_at => nil, + :content => nil, :parent_id => nil }.stringify_keys |