Experimental error handling with snippets of input for OutputGenerator. #54

Merged
jan merged 5 commits from error-handling into master 2024-02-17 18:21:41 +01:00
3 changed files with 15 additions and 11 deletions
Showing only changes of commit 6de4ea2743 - Show all commits

View file

@ -7,16 +7,20 @@ from typing import Union, Callable
from .whitespace import NBSP from .whitespace import NBSP
from .elements import FQuoted from .elements import FQuoted
from .context import Group, InlineGroup, BlockGroup from .context import Group, InlineGroup, BlockGroup, Context
from .whitespace import Whitespace from .whitespace import Whitespace
from .command import BlockCommand, InlineCommand, CodeCommand, Command from .command import BlockCommand, InlineCommand, CodeCommand, Command
from .output_generator import FormatitkoRecursiveError from .output_generator import FormatitkoRecursiveError
ELCl = Union[Element, ListContainer, list[Union[Element, ListContainer]]] ELCl = Union[Element, ListContainer, list[Union[Element, ListContainer]]]
class DoubleDocError(Exception):
"TransformProcessor should only ever see a single Doc."
pass
class NOPProcessor: class NOPProcessor:
TYPE_DICT: dict[type, Callable] TYPE_DICT: dict[type, Callable]
context: Union[Context, None] = None
class UnknownElementError(Exception): class UnknownElementError(Exception):
f"An unknown Element has been passed to the NOPProcessor, probably because panflute introduced a new one." f"An unknown Element has been passed to the NOPProcessor, probably because panflute introduced a new one."
@ -120,7 +124,7 @@ class NOPProcessor:
err.add_element(e) err.add_element(e)
raise err raise err
except Exception as err: except Exception as err:
raise FormatitkoRecursiveError(e) from err raise FormatitkoRecursiveError(e, self.context.filename) from err
def transform_list(self, e: list[Union[Element, ListContainer]]) -> list[Union[Element, ListContainer]]: def transform_list(self, e: list[Union[Element, ListContainer]]) -> list[Union[Element, ListContainer]]:
for i in range(len(e)): for i in range(len(e)):
@ -301,6 +305,9 @@ class NOPProcessor:
return e return e
def transform_Doc(self, e: Doc) -> Doc: def transform_Doc(self, e: Doc) -> Doc:
if self.context is not None:
raise DoubleDocError()
self.context = Context(e, self.root_file_path)
e.content = self.transform(e.content) e.content = self.transform(e.content)
return e return e

View file

@ -21,9 +21,11 @@ class UnknownElementError(Exception):
class FormatitkoRecursiveError(Exception): class FormatitkoRecursiveError(Exception):
"A generic exception which wraps other exceptions and adds element-based traceback" "A generic exception which wraps other exceptions and adds element-based traceback"
elements: list[Union[Element, ListContainer, list[Union[Element, ListContainer]]]] elements: list[Union[Element, ListContainer, list[Union[Element, ListContainer]]]]
file: str
def __init__(self, e: Union[Element, ListContainer, list[Union[Element, ListContainer]]], *args): def __init__(self, e: Union[Element, ListContainer, list[Union[Element, ListContainer]]], file: str, *args):
self.elements = [e] self.elements = [e]
self.file = file
super().__init__(args) super().__init__(args)
def add_element(self, e: Union[Element, ListContainer, list[Union[Element, ListContainer]]]): def add_element(self, e: Union[Element, ListContainer, list[Union[Element, ListContainer]]]):
@ -32,7 +34,7 @@ class FormatitkoRecursiveError(Exception):
def pretty_print(self): def pretty_print(self):
def eprint(*args, **kwargs): def eprint(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs) print(*args, file=sys.stderr, **kwargs)
eprint("Error occured in ", end="") eprint(f"Error occured in file {self.file} in ", end="")
for i in range(len(self.elements)-1, 0, -1): for i in range(len(self.elements)-1, 0, -1):
if hasattr(self.elements[i], "content") and isinstance(self.elements[i].content[0], Inline): if hasattr(self.elements[i], "content") and isinstance(self.elements[i].content[0], Inline):
eprint() eprint()
@ -159,7 +161,7 @@ class OutputGenerator:
err.add_element(e) err.add_element(e)
raise err raise err
except Exception as err: except Exception as err:
raise FormatitkoRecursiveError(e) from err raise FormatitkoRecursiveError(e, self.context.filename) from err
def escape_special_chars(self, text: str) -> str: def escape_special_chars(self, text: str) -> str:
return text return text

View file

@ -20,15 +20,10 @@ from .context import Context, CommandCallable
from .whitespace import Whitespace, bavlna from .whitespace import Whitespace, bavlna
from .command import BlockCommand, InlineCommand, CodeCommand, Command from .command import BlockCommand, InlineCommand, CodeCommand, Command
from .command_util import handle_command_define, parse_command from .command_util import handle_command_define, parse_command
from .nop_processor import NOPProcessor, ELCl from .nop_processor import NOPProcessor, ELCl, DoubleDocError
class DoubleDocError(Exception):
"TransformProcessor should only ever see a single Doc."
pass
class TransformProcessor(NOPProcessor): class TransformProcessor(NOPProcessor):
context: Union[Context, None] = None
root_file_path: str root_file_path: str
root_highlight_style: str = "default" root_highlight_style: str = "default"
_command_modules: list[tuple[Union[dict[str, CommandCallable], ModuleType], str]] = [] _command_modules: list[tuple[Union[dict[str, CommandCallable], ModuleType], str]] = []