diff options
| author | Matthijs Langenberg <mlangenberg@gmail.com> | 2010-09-24 22:37:26 +0200 | 
|---|---|---|
| committer | José Valim <jose.valim@gmail.com> | 2010-09-27 23:10:55 +0200 | 
| commit | 67a838574be000f329c0f340474bc9cec1aeca16 (patch) | |
| tree | ea3c23a7a5b4df852e5fa041da1c03fc6f42576c | |
| parent | dd83140b24dcb8a27e226c9de286318a44d7fab1 (diff) | |
| download | rails-67a838574be000f329c0f340474bc9cec1aeca16.tar.gz rails-67a838574be000f329c0f340474bc9cec1aeca16.tar.bz2 rails-67a838574be000f329c0f340474bc9cec1aeca16.zip | |
Fix broken module namespacing in ActiveResource with Ruby 1.9 [#5699 state:resolved]
Following namespace use case was broken with Ruby 1.9:
  class Author < ActiveRecord::Base
    ...
  end
  module Api
    class Book < ActiveResouce::Base
    end
  end
Let's say XML contains <book><author><name>John</name></author>....
  Api::Book.first.author.class.to_s #=>
    Ruby 1.8.7: "Api::Book::Author" (namespaced, correct),
    Ruby 1.9: "Author" (toplevel, broken)
Signed-off-by: José Valim <jose.valim@gmail.com>
| -rw-r--r-- | activeresource/lib/active_resource/base.rb | 10 | ||||
| -rw-r--r-- | activeresource/test/abstract_unit.rb | 6 | ||||
| -rw-r--r-- | activeresource/test/cases/base_test.rb | 5 | ||||
| -rw-r--r-- | activeresource/test/fixtures/sound.rb | 6 | 
4 files changed, 22 insertions, 5 deletions
| diff --git a/activeresource/lib/active_resource/base.rb b/activeresource/lib/active_resource/base.rb index 6135ce4ec1..cd279d890e 100644 --- a/activeresource/lib/active_resource/base.rb +++ b/activeresource/lib/active_resource/base.rb @@ -1374,8 +1374,9 @@ module ActiveResource          namespaces = module_names[0, module_names.size-1].map do |module_name|            receiver = receiver.const_get(module_name)          end -        if namespace = namespaces.reverse.detect { |ns| ns.const_defined?(resource_name) } -          return namespace.const_get(resource_name) +        const_args = RUBY_VERSION < "1.9" ? [resource_name] : [resource_name, false] +        if namespace = namespaces.reverse.detect { |ns| ns.const_defined?(*const_args) } +          return namespace.const_get(*const_args)          else            raise NameError          end @@ -1391,8 +1392,9 @@ module ActiveResource            self.class.const_get(resource_name)          end        rescue NameError -        if self.class.const_defined?(resource_name) -          resource = self.class.const_get(resource_name) +        const_args = RUBY_VERSION < "1.9" ? [resource_name] : [resource_name, false] +        if self.class.const_defined?(*const_args) +          resource = self.class.const_get(*const_args)          else            resource = self.class.const_set(resource_name, Class.new(ActiveResource::Base))          end diff --git a/activeresource/test/abstract_unit.rb b/activeresource/test/abstract_unit.rb index 544aede002..195f93f2a6 100644 --- a/activeresource/test/abstract_unit.rb +++ b/activeresource/test/abstract_unit.rb @@ -75,6 +75,10 @@ def setup_response      </person>    eof +  @startup_sound = {  +      :name => "Mac Startup Sound", :author => { :name => "Jim Reekes" }  +    }.to_xml(:root => 'sound')  +    ActiveResource::HttpMock.respond_to do |mock|      mock.get    "/people/1.xml",                {}, @matz      mock.get    "/people/2.xml",                {}, @david @@ -112,6 +116,8 @@ def setup_response      mock.head   "/people/Greg/addresses/1.xml", {}, nil, 200      # customer      mock.get    "/customers/1.xml",             {}, @luis +    # sound +    mock.get    "/sounds/1.xml",                {}, @startup_sound    end    Person.user = nil diff --git a/activeresource/test/cases/base_test.rb b/activeresource/test/cases/base_test.rb index 18c732b2ab..abf4259a54 100644 --- a/activeresource/test/cases/base_test.rb +++ b/activeresource/test/cases/base_test.rb @@ -1097,4 +1097,9 @@ class BaseTest < Test::Unit::TestCase      plan.save!      assert_equal 10.00, plan.price    end +   +  def test_namespacing +    sound = Asset::Sound.find(1) +    assert_equal "Asset::Sound::Author", sound.author.class.to_s +  end  end diff --git a/activeresource/test/fixtures/sound.rb b/activeresource/test/fixtures/sound.rb index 5c0ef5d55c..d9d2b99fcd 100644 --- a/activeresource/test/fixtures/sound.rb +++ b/activeresource/test/fixtures/sound.rb @@ -1,5 +1,9 @@ -module Asset +module Asset      class Sound < ActiveResource::Base      self.site = "http://37s.sunrise.i:3000"    end  end + +# to test namespacing in a module +class Author +end
\ No newline at end of file | 
