docconvert icon indicating copy to clipboard operation
docconvert copied to clipboard

failure parsing `class test: ...` in context manager

Open aquirdTurtle opened this issue 1 year ago • 0 comments

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.

aquirdTurtle avatar Aug 15 '24 21:08 aquirdTurtle