Skip to content

Commit

Permalink
Adjust Module.parent_name to work when frozen; fixes #27637
Browse files Browse the repository at this point in the history
  • Loading branch information
coreyward committed Jan 18, 2017
1 parent a8a673f commit 1d3ddac
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 32 deletions.
Expand Up @@ -5,10 +5,12 @@ class Module
#
# M::N.parent_name # => "M"
def parent_name
if defined? @parent_name
if defined?(@parent_name)
@parent_name
else
@parent_name = name =~ /::[^:]+\Z/ ? $`.freeze : nil
parent_name = name =~ /::[^:]+\Z/ ? $`.freeze : nil
@parent_name = parent_name unless frozen?
parent_name
end
end

Expand Down
37 changes: 37 additions & 0 deletions activesupport/test/core_ext/module/introspection_test.rb
@@ -0,0 +1,37 @@
require "abstract_unit"
require "active_support/core_ext/module/introspection"

module ParentA
module B
module C; end
module FrozenC; end
FrozenC.freeze
end

module FrozenB; end
FrozenB.freeze
end

class IntrospectionTest < ActiveSupport::TestCase
def test_parent_name
assert_equal "ParentA", ParentA::B.parent_name
assert_equal "ParentA::B", ParentA::B::C.parent_name
assert_nil ParentA.parent_name
end

def test_parent_name_when_frozen
assert_equal "ParentA", ParentA::FrozenB.parent_name
assert_equal "ParentA::B", ParentA::B::FrozenC.parent_name
end

def test_parent
assert_equal ParentA::B, ParentA::B::C.parent
assert_equal ParentA, ParentA::B.parent
assert_equal Object, ParentA.parent
end

def test_parents
assert_equal [ParentA::B, ParentA, Object], ParentA::B::C.parents
assert_equal [ParentA, Object], ParentA::B.parents
end
end
30 changes: 0 additions & 30 deletions activesupport/test/core_ext/module_test.rb
@@ -1,25 +1,6 @@
require "abstract_unit"
require "active_support/core_ext/module"

module One
Constant1 = "Hello World"
Constant2 = "What's up?"
end

class Ab
include One
Constant1 = "Hello World" # Will have different object id than One::Constant1
Constant3 = "Goodbye World"
end

module Yz
module Zy
class Cd
include One
end
end
end

Somewhere = Struct.new(:street, :city) do
attr_accessor :name
end
Expand Down Expand Up @@ -375,17 +356,6 @@ def test_delegate_to_missing_does_not_delegate_to_fake_methods
assert_match(/undefined method `my_fake_method' for/, e.message)
end

def test_parent
assert_equal Yz::Zy, Yz::Zy::Cd.parent
assert_equal Yz, Yz::Zy.parent
assert_equal Object, Yz.parent
end

def test_parents
assert_equal [Yz::Zy, Yz, Object], Yz::Zy::Cd.parents
assert_equal [Yz, Object], Yz::Zy.parents
end

def test_delegate_with_case
event = Event.new(Tester.new)
assert_equal 1, event.foo
Expand Down

0 comments on commit 1d3ddac

Please sign in to comment.