aboutsummaryrefslogtreecommitdiffstats
path: root/activeresource
diff options
context:
space:
mode:
authorSantiago Pastorino <santiago@wyeworks.com>2010-04-26 18:27:16 -0300
committerJeremy Kemper <jeremy@bitsweat.net>2010-04-26 15:00:26 -0700
commit7cd1d37a51f5f53f8fc1360f886d26cabf12d969 (patch)
treecdbc079bb7d025e37efbf5effa6a0fca6b032dd9 /activeresource
parent76d6a993647f3bbe39f31faa0b8ed8767a228301 (diff)
downloadrails-7cd1d37a51f5f53f8fc1360f886d26cabf12d969.tar.gz
rails-7cd1d37a51f5f53f8fc1360f886d26cabf12d969.tar.bz2
rails-7cd1d37a51f5f53f8fc1360f886d26cabf12d969.zip
Reuse Active Model serialization in Active Resource. [#2584 state:committed]
Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
Diffstat (limited to 'activeresource')
-rw-r--r--activeresource/lib/active_resource/base.rb66
-rw-r--r--activeresource/test/cases/base_test.rb28
2 files changed, 25 insertions, 69 deletions
diff --git a/activeresource/lib/active_resource/base.rb b/activeresource/lib/active_resource/base.rb
index bf775a14c8..ad994214f6 100644
--- a/activeresource/lib/active_resource/base.rb
+++ b/activeresource/lib/active_resource/base.rb
@@ -1176,73 +1176,11 @@ module ActiveResource
!new? && self.class.exists?(to_param, :params => prefix_options)
end
- # Converts the resource to an XML string representation.
- #
- # ==== Options
- # The +options+ parameter is handed off to the +to_xml+ method on each
- # attribute, so it has the same options as the +to_xml+ methods in
- # Active Support.
- #
- # * <tt>:indent</tt> - Set the indent level for the XML output (default is +2+).
- # * <tt>:dasherize</tt> - Boolean option to determine whether or not element names should
- # replace underscores with dashes (default is <tt>false</tt>).
- # * <tt>:skip_instruct</tt> - Toggle skipping the +instruct!+ call on the XML builder
- # that generates the XML declaration (default is <tt>false</tt>).
- #
- # ==== Examples
- # my_group = SubsidiaryGroup.find(:first)
- # my_group.to_xml
- # # => <?xml version="1.0" encoding="UTF-8"?>
- # # <subsidiary_group> [...] </subsidiary_group>
- #
- # my_group.to_xml(:dasherize => true)
- # # => <?xml version="1.0" encoding="UTF-8"?>
- # # <subsidiary-group> [...] </subsidiary-group>
- #
- # my_group.to_xml(:skip_instruct => true)
- # # => <subsidiary_group> [...] </subsidiary_group>
- def to_xml(options={})
- attributes.to_xml({:root => self.class.element_name}.merge(options))
- end
-
- # Coerces to a hash for JSON encoding.
- #
- # ==== Options
- # The +options+ are passed to the +to_json+ method on each
- # attribute, so the same options as the +to_json+ methods in
- # Active Support.
- #
- # * <tt>:only</tt> - Only include the specified attribute or list of
- # attributes in the serialized output. Attribute names must be specified
- # as strings.
- # * <tt>:except</tt> - Do not include the specified attribute or list of
- # attributes in the serialized output. Attribute names must be specified
- # as strings.
- #
- # ==== Examples
- # person = Person.new(:first_name => "Jim", :last_name => "Smith")
- # person.to_json
- # # => {"first_name": "Jim", "last_name": "Smith"}
- #
- # person.to_json(:only => ["first_name"])
- # # => {"first_name": "Jim"}
- #
- # person.to_json(:except => ["first_name"])
- # # => {"last_name": "Smith"}
- def as_json(options = nil)
- attributes.as_json(options)
- end
-
# Returns the serialized string representation of the resource in the configured
# serialization format specified in ActiveResource::Base.format. The options
# applicable depend on the configured encoding format.
def encode(options={})
- case self.class.format
- when ActiveResource::Formats::XmlFormat
- self.class.format.encode(attributes, {:root => self.class.element_name}.merge(options))
- else
- self.class.format.encode(attributes, options)
- end
+ send("to_#{self.class.format.extension}", options)
end
# A method to \reload the attributes of this object from the remote web service.
@@ -1466,5 +1404,7 @@ module ActiveResource
class Base
extend ActiveModel::Naming
include CustomMethods, Observing, Validations
+ include ActiveModel::Serializers::JSON
+ include ActiveModel::Serializers::Xml
end
end
diff --git a/activeresource/test/cases/base_test.rb b/activeresource/test/cases/base_test.rb
index 0f10a0e4d7..2ed7e1c95f 100644
--- a/activeresource/test/cases/base_test.rb
+++ b/activeresource/test/cases/base_test.rb
@@ -4,20 +4,22 @@ require "fixtures/customer"
require "fixtures/street_address"
require "fixtures/beast"
require "fixtures/proxy"
+require 'active_support/json'
require 'active_support/core_ext/hash/conversions'
require 'mocha'
class BaseTest < Test::Unit::TestCase
def setup
- @matz = { :id => 1, :name => 'Matz' }.to_xml(:root => 'person')
- @david = { :id => 2, :name => 'David' }.to_xml(:root => 'person')
- @greg = { :id => 3, :name => 'Greg' }.to_xml(:root => 'person')
- @addy = { :id => 1, :street => '12345 Street', :country => 'Australia' }.to_xml(:root => 'address')
@default_request_headers = { 'Content-Type' => 'application/xml' }
- @rick = { :name => "Rick", :age => 25 }.to_xml(:root => "person")
+ @matz = { :id => 1, :name => 'Matz' }.to_xml(:root => 'person')
+ @david = { :id => 2, :name => 'David' }.to_xml(:root => 'person')
+ @greg = { :id => 3, :name => 'Greg' }.to_xml(:root => 'person')
+ @addy = { :id => 1, :street => '12345 Street', :country => 'Australia' }.to_xml(:root => 'address')
+ @rick = { :name => "Rick", :age => 25 }.to_xml(:root => "person")
+ @joe = { 'person' => { :id => 6, :name => 'Joe' }}.to_json
@people = [{ :id => 1, :name => 'Matz' }, { :id => 2, :name => 'David' }].to_xml(:root => 'people')
@people_david = [{ :id => 2, :name => 'David' }].to_xml(:root => 'people')
- @addresses = [{ :id => 1, :street => '12345 Street', :country => 'Australia' }].to_xml(:root => 'addresses')
+ @addresses = [{ :id => 1, :street => '12345 Street', :country => 'Australia' }].to_xml(:root => 'addresses')
# - deep nested resource -
# - Luis (Customer)
@@ -66,6 +68,7 @@ class BaseTest < Test::Unit::TestCase
ActiveResource::HttpMock.respond_to do |mock|
mock.get "/people/1.xml", {}, @matz
mock.get "/people/2.xml", {}, @david
+ mock.get "/people/6.json", {}, @joe
mock.get "/people/5.xml", {}, @marty
mock.get "/people/Greg.xml", {}, @greg
mock.get "/people/4.xml", {'key' => 'value'}, nil, 404
@@ -1012,6 +1015,19 @@ class BaseTest < Test::Unit::TestCase
assert xml.include?('<id type="integer">1</id>')
end
+ def test_to_json
+ Person.include_root_in_json = true
+ Person.format = :json
+ joe = Person.find(6)
+ json = joe.encode
+ Person.format = :xml
+
+ assert_match %r{^\{"person":\{"person":\{}, json
+ assert_match %r{"id":6}, json
+ assert_match %r{"name":"Joe"}, json
+ assert_match %r{\}\}\}$}, json
+ end
+
def test_to_param_quacks_like_active_record
new_person = Person.new
assert_nil new_person.to_param