Skip to content

Commit

Permalink
gh-107883: Argument Clinic: Handle full module/class path in Function…
Browse files Browse the repository at this point in the history
….fulldisplayname (#107884)

Co-authored-by: Alex Waygood <[email protected]>
  • Loading branch information
erlend-aasland and AlexWaygood authored Aug 12, 2023
1 parent bf70774 commit ee40b3e
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 3 deletions.
54 changes: 54 additions & 0 deletions Lib/test/test_clinic.py
Original file line number Diff line number Diff line change
Expand Up @@ -1513,6 +1513,60 @@ def test_parameters_required_after_star(self):
with self.subTest(block=block):
self.expect_failure(block, err)

def test_fulldisplayname_class(self):
dataset = (
("T", """
class T "void *" ""
T.__init__
"""),
("m.T", """
module m
class m.T "void *" ""
@classmethod
m.T.__new__
"""),
("m.T.C", """
module m
class m.T "void *" ""
class m.T.C "void *" ""
m.T.C.__init__
"""),
)
for name, code in dataset:
with self.subTest(name=name, code=code):
block = self.parse(code)
func = block.signatures[-1]
self.assertEqual(func.fulldisplayname, name)

def test_fulldisplayname_meth(self):
dataset = (
("func", "func"),
("m.func", """
module m
m.func
"""),
("T.meth", """
class T "void *" ""
T.meth
"""),
("m.T.meth", """
module m
class m.T "void *" ""
m.T.meth
"""),
("m.T.C.meth", """
module m
class m.T "void *" ""
class m.T.C "void *" ""
m.T.C.meth
"""),
)
for name, code in dataset:
with self.subTest(name=name, code=code):
block = self.parse(code)
func = block.signatures[-1]
self.assertEqual(func.fulldisplayname, name)

def test_depr_star_invalid_format_1(self):
block = """
module foo
Expand Down
13 changes: 10 additions & 3 deletions Tools/clinic/clinic.py
Original file line number Diff line number Diff line change
Expand Up @@ -2682,9 +2682,16 @@ def displayname(self) -> str:

@functools.cached_property
def fulldisplayname(self) -> str:
if isinstance(self.module, Module):
return f"{self.module.name}.{self.displayname}"
return self.displayname
parent: Class | Module | Clinic | None
if self.kind.new_or_init:
parent = getattr(self.cls, "parent", None)
else:
parent = self.parent
name = self.displayname
while isinstance(parent, (Module, Class)):
name = f"{parent.name}.{name}"
parent = parent.parent
return name

@property
def render_parameters(self) -> list[Parameter]:
Expand Down

0 comments on commit ee40b3e

Please sign in to comment.