Skip to content

Commit b4f1a91

Browse files
committed
Add Module#set_temporary_name method
1 parent 0851dbd commit b4f1a91

File tree

2 files changed

+59
-3
lines changed

2 files changed

+59
-3
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module ModuleSpecs
2+
module SetTemporaryNameSpec
3+
end
4+
end

core/module/set_temporary_name_spec.rb

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require_relative '../../spec_helper'
2+
require_relative 'fixtures/set_temporary_name'
23

34
ruby_version_is "3.3" do
45
describe "Module#set_temporary_name" do
@@ -13,13 +14,34 @@
1314
m.name.should be_nil
1415
end
1516

17+
it "returns self" do
18+
m = Module.new
19+
m.set_temporary_name("fake_name").should.equal? m
20+
end
21+
1622
it "can assign a temporary name which is not a valid constant path" do
1723
m = Module.new
18-
m.set_temporary_name("a::B")
19-
m.name.should == "a::B"
24+
25+
m.set_temporary_name("name")
26+
m.name.should == "name"
2027

2128
m.set_temporary_name("Template['foo.rb']")
2229
m.name.should == "Template['foo.rb']"
30+
31+
m.set_temporary_name("a::B")
32+
m.name.should == "a::B"
33+
34+
m.set_temporary_name("A::b")
35+
m.name.should == "A::b"
36+
37+
m.set_temporary_name("A::B::")
38+
m.name.should == "A::B::"
39+
40+
m.set_temporary_name("A::::B")
41+
m.name.should == "A::::B"
42+
43+
m.set_temporary_name("A=")
44+
m.name.should == "A="
2345
end
2446

2547
it "can't assign empty string as name" do
@@ -43,7 +65,7 @@
4365
-> { Object.set_temporary_name("fake_name") }.should raise_error(RuntimeError, "can't change permanent name")
4466
end
4567

46-
it "can assign a temporary name to a nested module" do
68+
it "can assign a temporary name to a module nested into an anonymous module" do
4769
m = Module.new
4870
module m::N; end
4971
m::N.name.should =~ /\A#<Module:0x\h+>::N\z/
@@ -55,6 +77,17 @@ module m::N; end
5577
m::N.name.should be_nil
5678
end
5779

80+
it "discards a temporary name when an outer anonymous module gets a permanent name" do
81+
m = Module.new
82+
module m::N; end
83+
84+
m::N.set_temporary_name("fake_name")
85+
m::N.name.should == "fake_name"
86+
87+
ModuleSpecs::SetTemporaryNameSpec::M = m
88+
m::N.name.should == "ModuleSpecs::SetTemporaryNameSpec::M::N"
89+
end
90+
5891
it "can update the name when assigned to a constant" do
5992
m = Module.new
6093
m::N = Module.new
@@ -64,5 +97,24 @@ module m::N; end
6497
m::M = m::N
6598
m::M.name.should =~ /\A#<Module:0x\h+>::M\z/m
6699
end
100+
101+
it "can reassign a temporary name repeatedly" do
102+
m = Module.new
103+
104+
m.set_temporary_name("fake_name")
105+
m.name.should == "fake_name"
106+
107+
m.set_temporary_name("fake_name_2")
108+
m.name.should == "fake_name_2"
109+
end
110+
111+
it "does not affect a name of a module nested into an anonymous module with a temporary name" do
112+
m = Module.new
113+
m::N = Module.new
114+
m::N.name.should =~ /\A#<Module:0x\h+>::N\z/
115+
116+
m.set_temporary_name("foo")
117+
m::N.name.should =~ /\A#<Module:0x\h+>::N\z/
118+
end
67119
end
68120
end

0 commit comments

Comments
 (0)