diff --git a/quartodoc/autosummary.py b/quartodoc/autosummary.py index c6bea4e..22d5ae5 100644 --- a/quartodoc/autosummary.py +++ b/quartodoc/autosummary.py @@ -186,7 +186,7 @@ def _resolve_target(obj: dc.Alias): return target -def replace_docstring(obj: dc.Object | dc.Alias, f=None): +def replace_docstring(obj: dc.Object | dc.Alias, f=None, loader=None): """Replace (in place) a docstring for a griffe object. Parameters @@ -200,6 +200,9 @@ def replace_docstring(obj: dc.Object | dc.Alias, f=None): """ import importlib + if loader is None: + raise NotImplementedError("Loader may not be None.") + if isinstance(obj, dc.Alias): obj = _resolve_target(obj) @@ -208,7 +211,7 @@ def replace_docstring(obj: dc.Object | dc.Alias, f=None): # also have the effect of updating the class docstring. if isinstance(obj, dc.Class): for child_obj in obj.members.values(): - replace_docstring(child_obj) + replace_docstring(child_obj, loader=loader) if f is None: mod = importlib.import_module(obj.module.canonical_path) @@ -237,8 +240,8 @@ def replace_docstring(obj: dc.Object | dc.Alias, f=None): lineno=getattr(old, "lineno", None), endlineno=getattr(old, "endlineno", None), parent=getattr(old, "parent", None), - parser=getattr(old, "parser", None), - parser_options=getattr(old, "parser_options", None), + parser=loader.docstring_parser, + parser_options=loader.docstring_options, ) obj.docstring = new @@ -344,7 +347,7 @@ def dynamic_alias( obj = get_object(canonical_path, loader=loader) # use dynamically imported object's docstring - replace_docstring(obj, attr) + replace_docstring(obj, attr, loader=loader) if obj.canonical_path == path.replace(":", "."): return obj diff --git a/quartodoc/tests/test_basic.py b/quartodoc/tests/test_basic.py index b46b8f8..0f1642c 100644 --- a/quartodoc/tests/test_basic.py +++ b/quartodoc/tests/test_basic.py @@ -28,10 +28,26 @@ def test_replace_docstring(): from quartodoc.autosummary import get_object, replace_docstring from quartodoc.tests.example_dynamic import f + # TODO: expose a default loader factory, etc.. + from quartodoc._griffe_compat import ( + GriffeLoader, + Parser, + ModulesCollection, + LinesCollection, + ) + from quartodoc.parsers import get_parser_defaults + + loader = GriffeLoader( + docstring_parser=Parser("numpy"), + docstring_options=get_parser_defaults("numpy"), + modules_collection=ModulesCollection(), + lines_collection=LinesCollection(), + ) + obj = get_object("quartodoc", "tests.example_dynamic.f") old = obj.docstring - replace_docstring(obj, f) + replace_docstring(obj, f, loader=loader) assert obj.docstring is not old # just check the end of the piece dynamically added to docstring, since