Skip to content

Commit 5e06b33

Browse files
committed
fix: Resolve names in Unpack, instead of naively trying to get them from the parent of the function being handled
Issue-11: #11
1 parent 0b43e5c commit 5e06b33

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

src/griffe_typingdoc/_static.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ def _other_parameters_docs(func: Function, **kwargs: Any) -> DocstringSectionPar
127127
"typing.Unpack",
128128
"typing_extensions.Unpack",
129129
}:
130-
typed_dict = annotation.slice.parent.get_member(annotation.slice.name) # type: ignore[attr-defined]
130+
slice_path = annotation.slice.canonical_path
131+
typed_dict = func.modules_collection[slice_path]
131132
params_doc = {
132133
attr.name: {"annotation": attr.annotation, "description": _metadata(attr.annotation).get("doc", "")}
133134
for attr in typed_dict.members.values()

tests/test_extension.py

+55
Original file line numberDiff line numberDiff line change
@@ -147,3 +147,58 @@ def test_return_doc() -> None:
147147
extensions=Extensions(TypingDocExtension()),
148148
) as package:
149149
assert package["f"].docstring.parsed[1].value[0].description == "Hello."
150+
151+
152+
def test_unpacking_typed_dict() -> None:
153+
"""Unpack typed dicts, resolving them to their right location."""
154+
with temporary_visited_package(
155+
"package",
156+
{
157+
"__init__.py": """
158+
from typing import TypedDict
159+
from typing_extensions import Annotated, Doc, Unpack
160+
161+
from package import module
162+
163+
class Options(TypedDict):
164+
foo: Annotated[int, Doc("Foo's description.")]
165+
166+
class A:
167+
def __init__(self, **kwargs: Unpack[Options]) -> None:
168+
'''Init.'''
169+
self.options = kwargs
170+
171+
class B:
172+
def __init__(self, **kwargs: Unpack[module.Options]) -> None:
173+
'''Init.'''
174+
self.options = kwargs
175+
""",
176+
"module.py": """
177+
from typing import TypedDict
178+
from typing_extensions import Annotated, Doc
179+
180+
class Options(TypedDict):
181+
bar: Annotated[str, Doc("Bar's description.")]
182+
""",
183+
},
184+
extensions=Extensions(TypingDocExtension()),
185+
) as package:
186+
sections = package["A.__init__"].docstring.parsed
187+
assert len(sections) == 3
188+
assert sections[0].kind is DocstringSectionKind.text
189+
assert sections[1].kind is DocstringSectionKind.parameters
190+
assert sections[2].kind is DocstringSectionKind.other_parameters
191+
foo = sections[2].value[0]
192+
assert foo.name == "foo"
193+
assert foo.description == "Foo's description."
194+
assert str(foo.annotation).startswith("Annotated[int")
195+
196+
sections = package["B.__init__"].docstring.parsed
197+
assert len(sections) == 3
198+
assert sections[0].kind is DocstringSectionKind.text
199+
assert sections[1].kind is DocstringSectionKind.parameters
200+
assert sections[2].kind is DocstringSectionKind.other_parameters
201+
bar = sections[2].value[0]
202+
assert bar.name == "bar"
203+
assert bar.description == "Bar's description."
204+
assert str(bar.annotation).startswith("Annotated[str")

0 commit comments

Comments
 (0)