MyST-Parser icon indicating copy to clipboard operation
MyST-Parser copied to clipboard

MyST crashes without error message (breathe extension)

Open arwedus opened this issue 3 years ago • 6 comments

Describe the bug

MyST crashes without error message if "directive_class" is not a class.

To Reproduce

Cannot reproduce, because the error message does not mention the problematic file and the document is confidential.

Expected behavior

MyST should catch the issue that something passed to run_directive is not a known directive class.

Environment

  • OS: Ubuntu 18.04
  • Sphinx version: 3.5.1
  • Python version: 3.6.9 (CPython)
  • Docutils version: 0.16 release
  • Jinja2 version: 2.11.3

Additional context

full trace log:

#   
# Loaded extensions:
#   sphinx.ext.mathjax (3.5.1) from /home/username/.local/lib/python3.6/site-packages/sphinx/ext/mathjax.py
#   sphinxcontrib.applehelp (1.0.2) from /home/username/.local/lib/python3.6/site-packages/sphinxcontrib/applehelp/__init__.py
#   sphinxcontrib.devhelp (1.0.2) from /home/username/.local/lib/python3.6/site-packages/sphinxcontrib/devhelp/__init__.py
#   sphinxcontrib.htmlhelp (1.0.3) from /home/username/.local/lib/python3.6/site-packages/sphinxcontrib/htmlhelp/__init__.py
#   sphinxcontrib.serializinghtml (1.1.4) from /home/username/.local/lib/python3.6/site-packages/sphinxcontrib/serializinghtml/__init__.py
#   sphinxcontrib.qthelp (1.0.3) from /home/username/.local/lib/python3.6/site-packages/sphinxcontrib/qthelp/__init__.py
#   alabaster (0.7.12) from /home/username/.local/lib/python3.6/site-packages/alabaster/__init__.py
#   breathe (4.27.0) from /home/username/.local/lib/python3.6/site-packages/breathe/__init__.py
#   sphinx.ext.autodoc.type_comment (3.5.1) from /home/username/.local/lib/python3.6/site-packages/sphinx/ext/autodoc/type_comment.py
#   sphinx.ext.autodoc (3.5.1) from /home/username/.local/lib/python3.6/site-packages/sphinx/ext/autodoc/__init__.py
#   sphinx.ext.doctest (3.5.1) from /home/username/.local/lib/python3.6/site-packages/sphinx/ext/doctest.py
#   sphinx.ext.todo (3.5.1) from /home/username/.local/lib/python3.6/site-packages/sphinx/ext/todo.py
#   sphinx.ext.ifconfig (3.5.1) from /home/username/.local/lib/python3.6/site-packages/sphinx/ext/ifconfig.py
#   sphinx.ext.viewcode (3.5.1) from /home/username/.local/lib/python3.6/site-packages/sphinx/ext/viewcode.py
#   sphinx.ext.extlinks (3.5.1) from /home/username/.local/lib/python3.6/site-packages/sphinx/ext/extlinks.py
#   sphinx_markdown_tables (<module 'sphinx_markdown_tables.__version__' from '/usr/local/lib/python3.6/dist-packages/sphinx_markdown_tables/__version__.py'>) from /usr/local/lib/python3.6/dist-packages/sphinx_markdown_tables/__init__.py
#   sphinxcontrib.confluencebuilder (1.4.0) from /home/username/.local/lib/python3.6/site-packages/sphinxcontrib/confluencebuilder/__init__.py
#   sphinxcontrib.plantuml (unknown version) from /usr/local/lib/python3.6/dist-packages/sphinxcontrib/plantuml.py
#   myst_parser (0.13.5) from /home/username/.local/lib/python3.6/site-packages/myst_parser/__init__.py
#   sphinx_git (unknown version) from /usr/local/lib/python3.6/dist-packages/sphinx_git/__init__.py
#   sphinx_rtd_theme (unknown version) from /usr/local/lib/python3.6/dist-packages/sphinx_rtd_theme/__init__.py
Traceback (most recent call last):
  File "/home/username/.local/lib/python3.6/site-packages/sphinx/cmd/build.py", line 280, in build_main
    app.build(args.force_all, filenames)
  File "/home/username/.local/lib/python3.6/site-packages/sphinx/application.py", line 352, in build
    self.builder.build_update()
  File "/home/username/.local/lib/python3.6/site-packages/sphinx/builders/__init__.py", line 298, in build_update
    len(to_build))
  File "/home/username/.local/lib/python3.6/site-packages/sphinx/builders/__init__.py", line 310, in build
    updated_docnames = set(self.read())
  File "/home/username/.local/lib/python3.6/site-packages/sphinx/builders/__init__.py", line 417, in read
    self._read_serial(docnames)
  File "/home/username/.local/lib/python3.6/site-packages/sphinx/builders/__init__.py", line 438, in _read_serial
    self.read_doc(docname)
  File "/home/username/.local/lib/python3.6/site-packages/sphinx/builders/__init__.py", line 478, in read_doc
    doctree = read_doc(self.app, self.env, self.env.doc2path(docname))
  File "/home/username/.local/lib/python3.6/site-packages/sphinx/io.py", line 221, in read_doc
    pub.publish()
  File "/home/username/.local/lib/python3.6/site-packages/docutils/core.py", line 218, in publish
    self.settings)
  File "/home/username/.local/lib/python3.6/site-packages/sphinx/io.py", line 126, in read
    self.parse()
  File "/home/username/.local/lib/python3.6/site-packages/docutils/readers/__init__.py", line 77, in parse
    self.parser.parse(self.input, document)
  File "/home/username/.local/lib/python3.6/site-packages/myst_parser/sphinx_parser.py", line 195, in parse
    parser.renderer.render(tokens, parser.options, env)
  File "/home/username/.local/lib/python3.6/site-packages/myst_parser/docutils_renderer.py", line 174, in render
    self.rules[f"render_{nest_token.type}"](nest_token)
  File "/home/username/.local/lib/python3.6/site-packages/myst_parser/docutils_renderer.py", line 449, in render_fence
    return self.render_directive(token)
  File "/home/username/.local/lib/python3.6/site-packages/myst_parser/docutils_renderer.py", line 939, in render_directive
    nodes_list = self.run_directive(name, arguments, content, position)
  File "/home/username/.local/lib/python3.6/site-packages/myst_parser/docutils_renderer.py", line 970, in run_directive
    if issubclass(directive_class, Include):
TypeError: issubclass() arg 1 must be a class

arwedus avatar Mar 02 '21 12:03 arwedus

it actually helped to just put a try ... except around the if-clause in docutils_renderer.py, line 970.

arwedus avatar Mar 02 '21 12:03 arwedus

heya, hmm yes it seems that one of your sphinx extensions is using app.add_directive('name', Directive) and adding a directive that is not a class, which seems weird.

I can certainly add a try/except, but also out of interest could you try adding this try/except locally and print out what directive it is?

chrisjsewell avatar Mar 02 '21 12:03 chrisjsewell

At a guess this something to do with the way breathe handles directive registration: https://github.com/michaeljones/breathe/blob/4ce8c7a0d79f79f0ae3e7c7fbaa9c4fbb5c84888/breathe/directives.py#L564-L573

chrisjsewell avatar Mar 02 '21 12:03 chrisjsewell

I'll set up a mini sphinx+breathe+MyST example later, I guess that's what happens here. See also my related issue. I put a try... execpt around the line 970 locally, and since then I've been seing the doxygenstruct related error messages.

arwedus avatar Mar 02 '21 13:03 arwedus

@arwedus, from the Breathe side it would be great with a small example to reproduce. The directive registration indeed seems iffy, so feel free to open an issue over at Breathe (or point me to an existing one if I missed it).

jakobandersen avatar Dec 16 '21 12:12 jakobandersen

This should be fixed in the next Breathe release.

jakobandersen avatar Jan 22 '22 11:01 jakobandersen