docconvert
docconvert copied to clipboard
failure parsing `class test: ...` in context manager
Docconvert fails to parse a somewhat edge case pattern involving ... in a context manager. Here is a minimal example:
import pytest
def test_x():
with pytest.warns(UserWarning, match="this is a somewhat sus pattern but it exists in my codebase"):
class testclass: ...
print('done')
This pattern is valid in pytest, but when I run docconvert (docconvert testfile.py --config ./docconvert_config.json --in-place) on it, I get a convoluted error.
docconvert.core:ERROR: Child process error, attempting to convert '/home/mbrown/code/testfile.py'
docconvert.core:ERROR: unindent does not match any outer indentation level (<tokenize>, line 3)
Traceback (most recent call last):
File "/home/mbrown/miniconda3/lib/python3.9/site-packages/docconvert/core.py", line 148, in __call__
return convert_file(filename, self.config, self.in_place)
File "/home/mbrown/miniconda3/lib/python3.9/site-packages/docconvert/core.py", line 95, in convert_file
module.parse()
File "/home/mbrown/miniconda3/lib/python3.9/site-packages/docconvert/parser/module.py", line 381, in parse
self._generic_visit(tree)
File "/home/mbrown/miniconda3/lib/python3.9/site-packages/docconvert/parser/module.py", line 359, in _generic_visit
visit_func(node)
File "/home/mbrown/miniconda3/lib/python3.9/site-packages/docconvert/parser/module.py", line 284, in _visit_module
self._generic_visit(child)
File "/home/mbrown/miniconda3/lib/python3.9/site-packages/docconvert/parser/module.py", line 359, in _generic_visit
visit_func(node)
File "/home/mbrown/miniconda3/lib/python3.9/site-packages/docconvert/parser/module.py", line 305, in _visit_functiondef
self._generic_visit(child)
File "/home/mbrown/miniconda3/lib/python3.9/site-packages/docconvert/parser/module.py", line 366, in _generic_visit
self._generic_visit(child)
File "/home/mbrown/miniconda3/lib/python3.9/site-packages/docconvert/parser/module.py", line 359, in _generic_visit
visit_func(node)
File "/home/mbrown/miniconda3/lib/python3.9/site-packages/docconvert/parser/module.py", line 324, in _visit_classdef
docstring = self._parse_definition(node.lineno - 1)
File "/home/mbrown/miniconda3/lib/python3.9/site-packages/docconvert/parser/module.py", line 257, in _parse_definition
tokens.skip(kinds=(tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE))
File "/home/mbrown/miniconda3/lib/python3.9/site-packages/docconvert/parser/module.py", line 136, in skip
self.next()
File "/home/mbrown/miniconda3/lib/python3.9/site-packages/docconvert/parser/module.py", line 122, in next
new_token = next(self._generator, None)
File "/home/mbrown/miniconda3/lib/python3.9/tokenize.py", line 512, in _tokenize
raise IndentationError(
File "<tokenize>", line 3
print('done')
IndentationError: unindent does not match any outer indentation level
A workaround in the code currently is to change the class definition in question to:
class testclass:
pass
But obviously it would be nice for docconvert to not bug out.