Skip to content

Commit 3c782f5

Browse files
committed
ci: Fix type-checking issues
1 parent bb49b15 commit 3c782f5

5 files changed

Lines changed: 30 additions & 23 deletions

File tree

scripts/griffe_extensions.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,14 @@ def on_attribute_instance(
2323
"""Fetch descriptions from `Field` annotations."""
2424
if attr.docstring:
2525
return
26+
annotation = attr.annotation
27+
if not isinstance(annotation, griffe.ExprSubscript) or not isinstance(annotation.slice, griffe.ExprTuple):
28+
return
2629
try:
27-
field: griffe.ExprCall = attr.annotation.slice.elements[1]
28-
except AttributeError:
30+
field = annotation.slice.elements[1]
31+
except IndexError:
32+
return
33+
if not isinstance(field, griffe.ExprCall):
2934
return
3035

3136
if field.canonical_path == "mkdocstrings_handlers.python._internal.config._Field":

src/mkdocstrings_handlers/python/_internal/handler.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -228,18 +228,17 @@ def collect(self, identifier: str, options: PythonOptions) -> CollectorItem:
228228

229229
parser_name = options.docstring_style
230230
parser = parser_name and Parser(parser_name)
231-
parser_options = options.docstring_options
232-
if parser_options is not None:
233-
parser_options = asdict(parser_options)
234-
parser_options = _filter_parser_options(parser, parser_options)
231+
parser_options: dict[str, Any] | None = None
232+
if options.docstring_options is not None:
233+
parser_options = _filter_parser_options(parser, asdict(options.docstring_options))
235234

236235
if unknown_module:
237236
extensions = self.normalize_extension_paths(options.extensions)
238237
loader = GriffeLoader(
239238
extensions=load_extensions(*extensions),
240239
search_paths=self._paths,
241240
docstring_parser=parser,
242-
docstring_options=parser_options,
241+
docstring_options=parser_options, # type: ignore[arg-type]
243242
modules_collection=self._modules_collection,
244243
lines_collection=self._lines_collection,
245244
allow_inspection=options.allow_inspection,

src/mkdocstrings_handlers/python/_internal/rendering.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -420,22 +420,20 @@ def _keep_object(name: str, filters: Sequence[tuple[Pattern, bool]]) -> bool:
420420

421421

422422
def _parents(obj: Alias) -> set[str]:
423-
parent: Object | Alias = obj.parent
424-
parents = {obj.path, parent.path}
425-
if parent.is_alias:
426-
parents.add(parent.final_target.path)
427-
while parent.parent:
428-
parent = parent.parent
423+
parents = {obj.path}
424+
parent = obj.parent
425+
while parent is not None:
429426
parents.add(parent.path)
430-
if parent.is_alias:
427+
if isinstance(parent, Alias):
431428
parents.add(parent.final_target.path)
429+
parent = parent.parent
432430
return parents
433431

434432

435433
def _remove_cycles(objects: list[Object | Alias]) -> Iterator[Object | Alias]:
436434
suppress_errors = suppress(AliasResolutionError, CyclicAliasError)
437435
for obj in objects:
438-
if obj.is_alias:
436+
if isinstance(obj, Alias):
439437
with suppress_errors:
440438
if obj.final_target.path in _parents(obj):
441439
continue
@@ -784,6 +782,8 @@ def expand_identifier(self, identifier: str) -> str:
784782
obj = self.current_object
785783
while identifier and identifier[0] == ".":
786784
identifier = identifier[1:]
785+
if obj.parent is None:
786+
break
787787
obj = obj.parent
788788
identifier = f"{obj.path}.{identifier}" if identifier else obj.path
789789

@@ -814,12 +814,13 @@ def get_context(self) -> AutorefsHookInterface.Context:
814814
"module": "mod",
815815
}.get(self.current_object.kind.value.lower(), "obj")
816816
origin = self.current_object.path
817-
try:
818-
filepath = self.current_object.docstring.parent.filepath
819-
lineno = self.current_object.docstring.lineno or 0
820-
except AttributeError:
817+
docstring = self.current_object.docstring
818+
if docstring is None or docstring.parent is None:
821819
filepath = self.current_object.filepath
822820
lineno = 0
821+
else:
822+
filepath = docstring.parent.filepath
823+
lineno = docstring.lineno or 0
823824

824825
return AutorefsHookInterface.Context(
825826
domain="py",

tests/test_api.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def _fixture_public_api(loader: griffe.GriffeLoader) -> griffe.Module:
3636

3737

3838
def _yield_public_objects(
39-
obj: griffe.Module | griffe.Class,
39+
obj: griffe.Module | griffe.Class | griffe.Alias,
4040
*,
4141
modules: bool = False,
4242
modulelevel: bool = True,
@@ -48,6 +48,7 @@ def _yield_public_objects(
4848
if member.is_module:
4949
if member.is_alias or not member.is_public:
5050
continue
51+
assert isinstance(member, griffe.Module)
5152
if modules:
5253
yield member
5354
yield from _yield_public_objects(
@@ -62,6 +63,7 @@ def _yield_public_objects(
6263
else:
6364
continue
6465
if member.is_class and not modulelevel:
66+
assert isinstance(member, (griffe.Class, griffe.Alias))
6567
yield from _yield_public_objects(
6668
member,
6769
modules=modules,

tests/test_rendering.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44

55
import re
66
from dataclasses import dataclass
7-
from typing import TYPE_CHECKING, Any, Callable
7+
from typing import TYPE_CHECKING, Any, Callable, cast
88

99
import pytest
10-
from griffe import ModulesCollection, temporary_visited_module
10+
from griffe import Alias, ModulesCollection, Object, temporary_visited_module
1111

1212
from mkdocstrings_handlers.python._internal import rendering
1313

@@ -78,7 +78,7 @@ def test_filter_objects(names: list[str], filter_params: dict[str, Any], expecte
7878
expected_names: Names expected to be kept.
7979
"""
8080
objects = {name: _FakeObject(name) for name in names}
81-
filtered = rendering.do_filter_objects(objects, **filter_params)
81+
filtered = rendering.do_filter_objects(cast("dict[str, Object | Alias]", objects), **filter_params)
8282
filtered_names = {obj.name for obj in filtered}
8383
assert set(filtered_names) == set(expected_names)
8484

0 commit comments

Comments
 (0)