autoclasstoc icon indicating copy to clipboard operation
autoclasstoc copied to clipboard

Error when module's qualified name is different from the module file location

Open whitews opened this issue 2 years ago • 3 comments

Hi Kale,

Thanks for your work on this project, I find it very useful for documenting large classes.

I have a project where, via __init__ files, the qualified names differ from the file path for files containing some class definitions. When I try to add .. autoclasstoc:: to an existing RST doc (that successfully builds prior to adding), I get a ModuleNotFound error. For example, I have a RectangleGate class that has the qualified path flowkit.gates.RectangleGate and would be imported like:

from flowkit.gates import RectangleGate

but the actual file path to the module where the class is defined is:

flowkit/_models/gates/_gates.py

This was a working docs build prior to adding the autoclasstoc line for this class. The RST file that triggers the error:

RectangleGate Class
===================

.. currentmodule:: flowkit.gates

.. autoclass:: RectangleGate
    :members:

    .. autoclasstoc::

Full stack trace:

Traceback (most recent call last):
  File "../envs/flowkit-dev/lib/python3.10/site-packages/sphinx/cmd/build.py", line 276, in build_main
    app.build(args.force_all, filenames)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/sphinx/application.py", line 329, in build
    self.builder.build_update()
  File "../envs/flowkit-dev/lib/python3.10/site-packages/sphinx/builders/__init__.py", line 288, in build_update
    self.build(to_build,
  File "../envs/flowkit-dev/lib/python3.10/site-packages/sphinx/builders/__init__.py", line 302, in build
    updated_docnames = set(self.read())
  File "../envs/flowkit-dev/lib/python3.10/site-packages/sphinx/builders/__init__.py", line 409, in read
    self._read_serial(docnames)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/sphinx/builders/__init__.py", line 430, in _read_serial
    self.read_doc(docname)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/sphinx/builders/__init__.py", line 483, in read_doc
    publisher.publish()
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/core.py", line 217, in publish
    self.document = self.reader.read(self.source, self.parser,
  File "../envs/flowkit-dev/lib/python3.10/site-packages/sphinx/io.py", line 103, in read
    self.parse()
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/readers/__init__.py", line 78, in parse
    self.parser.parse(self.input, document)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/sphinx/parsers.py", line 78, in parse
    self.statemachine.run(inputlines, document, inliner=self.inliner)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 170, in run
    results = StateMachineWS.run(self, input_lines, input_offset,
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/statemachine.py", line 240, in run
    context, next_state, result = self.check_line(
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/statemachine.py", line 452, in check_line
    return method(match, context, next_state)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2779, in underline
    self.section(title, source, style, lineno - 1, messages)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 327, in section
    self.new_subsection(title, lineno, messages)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 393, in new_subsection
    newabsoffset = self.nested_parse(
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 281, in nested_parse
    state_machine.run(block, input_offset, memo=self.memo,
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/statemachine.py", line 240, in run
    context, next_state, result = self.check_line(
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/statemachine.py", line 452, in check_line
    return method(match, context, next_state)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2354, in explicit_markup
    self.explicit_list(blank_finish)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2379, in explicit_list
    newline_offset, blank_finish = self.nested_list_parse(
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 318, in nested_list_parse
    state_machine.run(block, input_offset, memo=self.memo,
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/statemachine.py", line 240, in run
    context, next_state, result = self.check_line(
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/statemachine.py", line 452, in check_line
    return method(match, context, next_state)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2354, in explicit_markup
    self.explicit_list(blank_finish)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2379, in explicit_list
    newline_offset, blank_finish = self.nested_list_parse(
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 318, in nested_list_parse
    state_machine.run(block, input_offset, memo=self.memo,
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/statemachine.py", line 240, in run
    context, next_state, result = self.check_line(
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/statemachine.py", line 452, in check_line
    return method(match, context, next_state)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2657, in explicit_markup
    nodelist, blank_finish = self.explicit_construct(match)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2364, in explicit_construct
    return method(self, expmatch)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2101, in directive
    return self.run_directive(
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2151, in run_directive
    result = directive_instance.run()
  File "../envs/flowkit-dev/lib/python3.10/site-packages/sphinx/ext/autodoc/directive.py", line 159, in run
    result = parse_generated_content(self.state, params.result, documenter)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/sphinx/ext/autodoc/directive.py", line 106, in parse_generated_content
    state.nested_parse(content, 0, node)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 281, in nested_parse
    state_machine.run(block, input_offset, memo=self.memo,
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/statemachine.py", line 240, in run
    context, next_state, result = self.check_line(
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/statemachine.py", line 452, in check_line
    return method(match, context, next_state)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2352, in explicit_markup
    nodelist, blank_finish = self.explicit_construct(match)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2364, in explicit_construct
    return method(self, expmatch)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2101, in directive
    return self.run_directive(
 File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2151, in run_directive
    result = directive_instance.run()
  File "../envs/flowkit-dev/lib/python3.10/site-packages/sphinx/domains/__init__.py", line 281, in run
    return super().run()
  File "../envs/flowkit-dev/lib/python3.10/site-packages/sphinx/directives/__init__.py", line 199, in run
    self.state.nested_parse(self.content, self.content_offset, contentnode)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 281, in nested_parse
    state_machine.run(block, input_offset, memo=self.memo,
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/statemachine.py", line 240, in run
    context, next_state, result = self.check_line(
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/statemachine.py", line 452, in check_line
    return method(match, context, next_state)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2352, in explicit_markup
    nodelist, blank_finish = self.explicit_construct(match)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2364, in explicit_construct
    return method(self, expmatch)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2101, in directive
    return self.run_directive(
  File "../envs/flowkit-dev/lib/python3.10/site-packages/docutils/parsers/rst/states.py", line 2151, in run_directive
    result = directive_instance.run()
  File "../envs/flowkit-dev/lib/python3.10/site-packages/autoclasstoc/plugin.py", line 29, in run
    mod, cls = utils.load_class(mod_name, cls_name)
  File "../envs/flowkit-dev/lib/python3.10/site-packages/autoclasstoc/utils.py", line 46, in load_class
    mod = import_module(mod_name)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'flowkit.gates'

whitews avatar Jun 08 '22 13:06 whitews