Browse Source

Error handling now contains filename.

error-handling
Jan Černohorský 4 months ago
parent
commit
6de4ea2743
  1. 11
      src/formatitko/nop_processor.py
  2. 8
      src/formatitko/output_generator.py
  3. 7
      src/formatitko/transform_processor.py

11
src/formatitko/nop_processor.py

@ -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

8
src/formatitko/output_generator.py

@ -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

7
src/formatitko/transform_processor.py

@ -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]] = []

Loading…
Cancel
Save