Skip to content

Unhandled AttributeError on wierdly reexported members #459

Open
@USSX-Hares

Description

@USSX-Hares

Steps to Reproduce

I attempted to investigate the issue and determine its root cause or simpler steps to reproduce, but did not succeed in doing so.

To reproduce, check-out this repo and perform HTML documentation generation:

git clone git@gitlab.com:Hares-Lab/report-maker/report-maker.git
cd report-maker
python -m virtualenv --python=3.12 .venv
source .venv/bin/activate
pip install -e .[all]
pip install pdoc3
pdoc3 report_maker --html

Error:

Long stacktrace
Traceback (most recent call last):
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/__init__.py", line 157, in _render_template
    return t.render(**config).strip()
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/mako/template.py", line 434, in render
    return runtime._render(self, self.callable_, args, data)
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/mako/runtime.py", line 874, in _render
    _render_context(
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/mako/runtime.py", line 916, in _render_context
    _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/mako/runtime.py", line 943, in _exec_template
    callable_(context, *args, **kwargs)
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/templates/html.mako", line 451, in render_body
    ${show_module(module)}
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/templates/html.mako", line 0, in show_module

  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/templates/html.mako", line 243, in render_show_module
    <dd>${show_desc(v)}</dd>
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/templates/html.mako", line 100, in show_desc
    <%def name="show_module(module)">
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/templates/html.mako", line 67, in render_show_desc
    ${show_source(d)}
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/templates/html.mako", line 51, in show_source
    <%def name="show_desc(d, short=False)">
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/templates/html.mako", line 31, in render_show_source
    % if (show_source_code or git_link_template) and \
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/__init__.py", line 572, in source
    lines, _ = inspect.getsourcelines(_unwrap_descriptor(self))
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/__init__.py", line 446, in _unwrap_descriptor
    obj = getattr(dobj.module.obj, class_name)
AttributeError: module 'report_maker.extensions.builtin.code_converter' has no attribute 'ComposerPartTypeSourceCode'

Traceback (most recent call last):
  File "/home/peter/git/temp/report-maker/.venv/bin/pdoc3", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/cli.py", line 609, in main
    recursive_write_files(module, ext='.html', **template_config)
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/cli.py", line 353, in recursive_write_files
    recursive_write_files(submodule, ext=ext, **kwargs)
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/cli.py", line 353, in recursive_write_files
    recursive_write_files(submodule, ext=ext, **kwargs)
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/cli.py", line 353, in recursive_write_files
    recursive_write_files(submodule, ext=ext, **kwargs)
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/cli.py", line 348, in recursive_write_files
    f.write(m.html(**kwargs))
            ^^^^^^^^^^^^^^^^
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/__init__.py", line 905, in html
    html = _render_template('/html.mako', module=self, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/__init__.py", line 157, in _render_template
    return t.render(**config).strip()
           ^^^^^^^^^^^^^^^^^^
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/mako/template.py", line 434, in render
    return runtime._render(self, self.callable_, args, data)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/mako/runtime.py", line 874, in _render
    _render_context(
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/mako/runtime.py", line 916, in _render_context
    _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/mako/runtime.py", line 943, in _exec_template
    callable_(context, *args, **kwargs)
  File "_html_mako", line 145, in render_body
  File "_html_mako", line 47, in show_module
  File "_html_mako", line 504, in render_show_module
  File "_html_mako", line 318, in show_desc
  File "_html_mako", line 246, in render_show_desc
  File "_html_mako", line 216, in show_source
  File "_html_mako", line 188, in render_show_source
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/__init__.py", line 572, in source
    lines, _ = inspect.getsourcelines(_unwrap_descriptor(self))
                                      ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/peter/git/temp/report-maker/.venv/lib/python3.12/site-packages/pdoc/__init__.py", line 446, in _unwrap_descriptor
    obj = getattr(dobj.module.obj, class_name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'report_maker.extensions.builtin.code_converter' has no attribute 'ComposerPartTypeSourceCode'

Meta

  • pdoc3 version: 0.11.6
  • Platforms:
    • Windows 10 64bit: 19045.5965
    • WSL: Ubuntu 22.04.5 LTS
  • Python versions:
    • 3.12.1
    • 3.12.11
    • 3.13.5

What I've Found

Or, to be precise, what I have not.

The root looks to lie in the combination of these facts:

  1. I am re-exporting ComposerPartTypeSourceCode from report_maker.config as CodeConverterConfig in report_maker.extensions.builtin.code_converter.
  2. This class is decorated via @dataclassabc, which somehow erases docstring and changes __module__ attribute: Applying @dataclassabc sets class __module__ to be abc MichaelSchneeberger/dataclass-abc#3
  3. pdoc's Doc.source method has try/except block for ValueError, TypeError, and OSError, but AttributeError is raised and thus not caught.

The code below does similar things (almost exactly these things), but causes no exception.

Similar example but no error

other.py

"""
This is the module `pdoc_issues.reexport.other`.
It just defines `CoolClassWithExtremelyLongName`.
"""
from abc import ABC, abstractmethod

from dataclassabc import dataclassabc


@dataclassabc(kw_only=True, frozen=True, slots=True)
class TheMostCoolestOfAllAbstractClasses(ABC):
    """
    This is the most coolest of all abstract classes ever existed.
    It defines `some_field` abstract property
    which might be implemented as a dataclass member via `@dataclassabc` decoration.
    """
    
    @property
    @abstractmethod
    def some_field(self) -> int:
        ...

@dataclassabc(kw_only=True, frozen=True, slots=True)
class CoolClassWithExtremelyLongName(TheMostCoolestOfAllAbstractClasses):
    """
    This is a very cool class,
    with a very and cool and long name,
    and even cooler and longer description.
    
    It also has a member `some_field` implementing `TheMostCoolestOfAllAbstractClasses`
    and just a boolean `other_field`.
    """
    
    some_field: int
    other_field: bool


__all__ = \
[
    'CoolClassWithExtremelyLongName',
]

this.py

"""
This is the module `pdoc_issues.reexport.this`.
It just reexports `CoolClassWithExtremelyLongName` as `CoolClass`.
"""

from .other import CoolClassWithExtremelyLongName as CoolClass

__all__ = \
[
    'CoolClass',
]

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions