diff --git a/duties.py b/duties.py index fc960af6..e1a1608a 100644 --- a/duties.py +++ b/duties.py @@ -304,6 +304,7 @@ def fuzz( """ import logging + from griffe.loader import GriffeLoader from griffe.cli import _load_packages as load_packages def find_pdm_packages() -> list[str]: @@ -314,21 +315,41 @@ def find_pdm_packages() -> list[str]: ).split("\n") if not profile: - stblib_packages = sorted([m for m in sys.stdlib_module_names if not m.startswith("_")]) # type: ignore[attr-defined] logging.basicConfig(level=getattr(logging, level)) + stblib_packages = sorted([m for m in sys.stdlib_module_names if not m.startswith("_")]) # type: ignore[attr-defined] griffe_load = lazy(load_packages, name="griffe.load") + # fuzz on standard lib - ctx.run( - griffe_load(stblib_packages, resolve_aliases=True, resolve_implicit=True, resolve_external=False), - title="Fuzz on standard library", - capture=None, - ) + def compute_inherited_members(obj): + try: + is_class = obj.is_class + except Exception: + return + if is_class: + assert obj.inherited_members is not None + else: + for cls in obj.classes.values(): + compute_inherited_members(cls) + + def fuzz_stdlib(): + loader = GriffeLoader() + for package in stblib_packages: + try: + loader.load_module(package) + except ModuleNotFoundError: + pass + loader.resolve_aliases(implicit=True, external=True) + for package in loader.modules_collection.members.values(): + compute_inherited_members(package) + + ctx.run(fuzz_stdlib, title="Fuzz on standard library", capture=False) + # fuzz on all PDM cached packages if pdm: packages = find_pdm_packages() ctx.run( griffe_load(packages, resolve_aliases=True), - title=f"Loading {len(packages)} packages", + title=f"Fuzz on {len(packages)} packages from PDM cache", capture=None, ) else: diff --git a/src/griffe/dataclasses.py b/src/griffe/dataclasses.py index 58d3d00c..342206f7 100644 --- a/src/griffe/dataclasses.py +++ b/src/griffe/dataclasses.py @@ -983,6 +983,14 @@ def aliases(self) -> dict[str, Alias]: # noqa: D102 def member_is_exported(self, member: Object | Alias, *, explicitely: bool = True) -> bool: # noqa: D102 return self.final_target.member_is_exported(member, explicitely=explicitely) + @property + def inherited_members(self) -> dict[str, Alias]: # noqa: D102 + return self.final_target.inherited_members + + @property + def all_members(self) -> dict[str, Object | Alias]: # noqa: D102 + return self.final_target.all_members + def is_kind(self, kind: str | Kind | set[str | Kind]) -> bool: # noqa: D102 return self.final_target.is_kind(kind) @@ -1113,6 +1121,10 @@ def annotation(self) -> str | Name | Expression | None: # noqa: D102 def annotation(self, annotation: str | Name | Expression | None) -> None: cast(Attribute, self.target).annotation = annotation + @property + def resolved_bases(self) -> list[Object]: # noqa: D102 + return cast(Class, self.final_target).resolved_bases + def mro(self) -> list[Class]: # noqa: D102 return cast(Class, self.final_target).mro()