aboutsummaryrefslogtreecommitdiffstats
path: root/activeresource
diff options
context:
space:
mode:
authorRick Olson <technoweenie@gmail.com>2007-06-21 15:07:15 +0000
committerRick Olson <technoweenie@gmail.com>2007-06-21 15:07:15 +0000
commit9e4461438f8ce584b635aca35579c36537a340ca (patch)
tree8c1b83901b2d7ee52d32eec792e6af1ca807e65f /activeresource
parenteb2e30ef249051713d8122a784d8fbfa378e7ae1 (diff)
downloadrails-9e4461438f8ce584b635aca35579c36537a340ca.tar.gz
rails-9e4461438f8ce584b635aca35579c36537a340ca.tar.bz2
rails-9e4461438f8ce584b635aca35579c36537a340ca.zip
Added proper handling of arrays. Closes #8537 [hasmanyjosh]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7074 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activeresource')
-rw-r--r--activeresource/lib/active_resource/connection.rb25
-rw-r--r--activeresource/test/base/custom_methods_test.rb5
-rw-r--r--activeresource/test/base_test.rb16
-rw-r--r--activeresource/test/connection_test.rb2
4 files changed, 20 insertions, 28 deletions
diff --git a/activeresource/lib/active_resource/connection.rb b/activeresource/lib/active_resource/connection.rb
index d41171270c..8245c797b3 100644
--- a/activeresource/lib/active_resource/connection.rb
+++ b/activeresource/lib/active_resource/connection.rb
@@ -81,11 +81,7 @@ module ActiveResource
end
def xml_from_response(response)
- if response = from_xml_data(Hash.from_xml(response.body))
- response.first
- else
- nil
- end
+ from_xml_data(Hash.from_xml(response.body))
end
@@ -150,21 +146,12 @@ module ActiveResource
# Manipulate from_xml Hash, because xml_simple is not exactly what we
# want for ActiveResource.
def from_xml_data(data)
- case data
- when Hash
- if data.keys.size == 1
- case data.values.first
- when Hash then [ from_xml_data(data.values.first) ]
- when Array then from_xml_data(data.values.first)
- else data.values.first
- end
- else
- data.each_key { |key| data[key] = from_xml_data(data[key]) }
- data
- end
- when Array then data.collect { |val| from_xml_data(val) }
- else data
+ if data.is_a?(Hash) && data.keys.size == 1
+ data.values.first
+ else
+ data
end
end
+
end
end
diff --git a/activeresource/test/base/custom_methods_test.rb b/activeresource/test/base/custom_methods_test.rb
index f591c14260..0e1c00c478 100644
--- a/activeresource/test/base/custom_methods_test.rb
+++ b/activeresource/test/base/custom_methods_test.rb
@@ -6,6 +6,7 @@ class CustomMethodsTest < Test::Unit::TestCase
def setup
@matz = { :id => 1, :name => 'Matz' }.to_xml(:root => 'person')
@matz_deep = { :id => 1, :name => 'Matz', :other => 'other' }.to_xml(:root => 'person')
+ @matz_array = [{ :id => 1, :name => 'Matz' }].to_xml(:root => 'people')
@ryan = { :name => 'Ryan' }.to_xml(:root => 'person')
@addy = { :id => 1, :street => '12345 Street' }.to_xml(:root => 'address')
@addy_deep = { :id => 1, :street => '12345 Street', :zip => "27519" }.to_xml(:root => 'address')
@@ -15,8 +16,8 @@ class CustomMethodsTest < Test::Unit::TestCase
mock.get "/people/1.xml", {}, @matz
mock.get "/people/1/shallow.xml", {}, @matz
mock.get "/people/1/deep.xml", {}, @matz_deep
- mock.get "/people/retrieve.xml?name=Matz", {}, "<people>#{@matz}</people>"
- mock.get "/people/managers.xml", {}, "<people>#{@matz}</people>"
+ mock.get "/people/retrieve.xml?name=Matz", {}, @matz_array
+ mock.get "/people/managers.xml", {}, @matz_array
mock.put "/people/1/promote.xml?position=Manager", {}, nil, 204
mock.put "/people/promote.xml?name=Matz", {}, nil, 204, {}
mock.put "/people/sort.xml?by=name", {}, nil, 204
diff --git a/activeresource/test/base_test.rb b/activeresource/test/base_test.rb
index 6c924447de..328d3ae133 100644
--- a/activeresource/test/base_test.rb
+++ b/activeresource/test/base_test.rb
@@ -9,6 +9,10 @@ class BaseTest < Test::Unit::TestCase
@david = { :id => 2, :name => 'David' }.to_xml(:root => 'person')
@addy = { :id => 1, :street => '12345 Street' }.to_xml(:root => 'address')
@default_request_headers = { 'Content-Type' => 'application/xml' }
+ @rick = { :name => "Rick", :age => 25 }.to_xml(:root => "person")
+ @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' }].to_xml(:root => 'addresses')
ActiveResource::HttpMock.respond_to do |mock|
mock.get "/people/1.xml", {}, @matz
@@ -18,9 +22,9 @@ class BaseTest < Test::Unit::TestCase
mock.delete "/people/1.xml", {}, nil, 200
mock.delete "/people/2.xml", {}, nil, 400
mock.get "/people/99.xml", {}, nil, 404
- mock.post "/people.xml", {}, "<person><name>Rick</name><age type='integer'>25</age></person>", 201, 'Location' => '/people/5.xml'
- mock.get "/people.xml", {}, "<people>#{@matz}#{@david}</people>"
- mock.get "/people/1/addresses.xml", {}, "<addresses>#{@addy}</addresses>"
+ mock.post "/people.xml", {}, @rick, 201, 'Location' => '/people/5.xml'
+ mock.get "/people.xml", {}, @people
+ mock.get "/people/1/addresses.xml", {}, @addresses
mock.get "/people/1/addresses/1.xml", {}, @addy
mock.get "/people/1/addresses/2.xml", {}, nil, 404
mock.get "/people/2/addresses/1.xml", {}, nil, 404
@@ -225,7 +229,7 @@ class BaseTest < Test::Unit::TestCase
end
def test_find_all_by_from
- ActiveResource::HttpMock.respond_to { |m| m.get "/companies/1/people.xml", {}, "<people>#{@david}</people>" }
+ ActiveResource::HttpMock.respond_to { |m| m.get "/companies/1/people.xml", {}, @people_david }
people = Person.find(:all, :from => "/companies/1/people.xml")
assert_equal 1, people.size
@@ -233,7 +237,7 @@ class BaseTest < Test::Unit::TestCase
end
def test_find_all_by_from_with_options
- ActiveResource::HttpMock.respond_to { |m| m.get "/companies/1/people.xml", {}, "<people>#{@david}</people>" }
+ ActiveResource::HttpMock.respond_to { |m| m.get "/companies/1/people.xml", {}, @people_david }
people = Person.find(:all, :from => "/companies/1/people.xml")
assert_equal 1, people.size
@@ -241,7 +245,7 @@ class BaseTest < Test::Unit::TestCase
end
def test_find_all_by_symbol_from
- ActiveResource::HttpMock.respond_to { |m| m.get "/people/managers.xml", {}, "<people>#{@david}</people>" }
+ ActiveResource::HttpMock.respond_to { |m| m.get "/people/managers.xml", {}, @people_david }
people = Person.find(:all, :from => :managers)
assert_equal 1, people.size
diff --git a/activeresource/test/connection_test.rb b/activeresource/test/connection_test.rb
index 13b518d782..24893f8cd3 100644
--- a/activeresource/test/connection_test.rb
+++ b/activeresource/test/connection_test.rb
@@ -115,7 +115,7 @@ class ConnectionTest < Test::Unit::TestCase
def test_get_collection_empty
people = @conn.get("/people_empty_elements.xml")
- assert_nil people
+ assert_equal [], people
end
def test_post