1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Merge pull request #27713 from coreyward/module_freeze_parent_name

Module#parent_name broken for frozen classes
This commit is contained in:
Rafael França 2017-01-17 23:21:05 -05:00 committed by GitHub
commit 5ac8af2033
3 changed files with 41 additions and 32 deletions

View file

@ -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

View file

@ -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

View file

@ -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
@ -375,17 +356,6 @@ class ModuleTest < ActiveSupport::TestCase
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