From 6b8a7f9473c46bb77917231c1e34544407b3d09e Mon Sep 17 00:00:00 2001 From: Bart ten Brinke Date: Wed, 25 Feb 2009 11:17:18 +0100 Subject: [PATCH] Added namespacing to active resource --- activeresource/lib/active_resource/base.rb | 20 +++++++++++++++++--- activeresource/test/base/load_test.rb | 11 +++++++++++ activeresource/test/base_test.rb | 11 +++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/activeresource/lib/active_resource/base.rb b/activeresource/lib/active_resource/base.rb index a8c0da3..8b1b031 100644 --- a/activeresource/lib/active_resource/base.rb +++ b/activeresource/lib/active_resource/base.rb @@ -278,6 +278,19 @@ module ActiveResource @password = password end + # Gets the \namespace of the resource + def namespace + if defined?(@namespace) + @namespace + elsif superclass != Object and superclass.namespace + superclass.namespace.dup.freeze + end + end + + # Set the \namespace for the REST resources + def namespace=(namespace) + @namespace = namespace + end # Sets the format that attributes are sent and received in from a mime type reference: # # Person.format = :json @@ -1039,7 +1052,7 @@ module ActiveResource # Tries to find a resource for a given name; if it fails, then the resource is created def find_or_create_resource_for(name) - resource_name = name.to_s.camelize + resource_name = self.class.namespace.nil? ? name.to_s.camelize : (self.class.namespace.to_s.camelize + name.to_s.camelize) ancestors = self.class.name.split("::") if ancestors.size > 1 find_resource_in_modules(resource_name, ancestors) @@ -1052,8 +1065,9 @@ module ActiveResource else resource = self.class.const_set(resource_name, Class.new(ActiveResource::Base)) end - resource.prefix = self.class.prefix - resource.site = self.class.site + resource.prefix = self.class.prefix + resource.site = self.class.site + resource.namespace = self.class.namespace resource end diff --git a/activeresource/test/base/load_test.rb b/activeresource/test/base/load_test.rb index a475fab..cc3e4a0 100644 --- a/activeresource/test/base/load_test.rb +++ b/activeresource/test/base/load_test.rb @@ -107,6 +107,17 @@ class BaseLoadTest < Test::Unit::TestCase addresses.each { |address| assert_kind_of Person::Address, address } assert_equal [ @first_address ].map(&:stringify_keys), addresses.map(&:attributes) end + + def test_load_collection_with_single_unknown_resource_with_namespace + # This is used when you have a local address class that has different fields as the ar-address class + Person.__send__(:remove_const, :Address) if Person.const_defined?(:Address) + Person.namespace = 'ExternalApp' + assert !Person.const_defined?(:Address), "Address shouldn't exist anymore" + + addresses = silence_warnings { @person.load(:addresses => [ @first_address ]).addresses } + assert Person.const_defined?(:ExternalAppAddress), "ExternalAppAddress should have been autocreated" + Person.namespace = nil + end def test_recursively_loaded_collections person = @person.load(@deep) diff --git a/activeresource/test/base_test.rb b/activeresource/test/base_test.rb index e22388f..d0de967 100644 --- a/activeresource/test/base_test.rb +++ b/activeresource/test/base_test.rb @@ -520,6 +520,17 @@ class BaseTest < Test::Unit::TestCase assert_equal '/people/1/', StreetAddress.prefix(:person_id => 1) assert_equal [:person_id].to_set, StreetAddress.__send__(:prefix_parameters) end + + def test_resource_name + assert ActiveResource::Base.class.constants.include?('StreetAddress') + end + + def test_set_namespace + ar = Class.new(ActiveResource::Base) + assert_nil ar.namespace + ar.namespace = 'ExternalApp' + assert_equal ar.namespace, 'ExternalApp' + end def test_find_by_id matz = Person.find(1) -- 1.6.0.6