Source code for fsm_tools.exception

"""
This module provides exception classes for Finite State Machines and Automata.
"""

from typing import List

from .constants import ACTIONS, CHOMSKY_GRAMMARS, COMPONENTS
from .utils.json import generate_message


class AutomatonGroup:
    """
    This class implements the automaton group for automata. This will be used with pythion versions upper 3.11.

    """

    def __init__(self):
        self.exceptions: List[Exception] = []

    def add_exception(self, exception: Exception) -> None:
        self.exceptions.append(exception)


[docs] class AutomatonException(Exception): """ Generic exception for errors in formal automata. Computes a unique error code based on the Chomsky grammar hierarchy level, the component, and the action. Localized error codes are fetched from `errors.mo`. General exception messages are fetched from `exception_msg.mo`. """ def __init__( self, grammar: str, component: str, action: str, locale: str = None, **event ) -> None: """ This class implements the exception basis for formal grammar automata. :param grammar: name of the formal grammar hierarchy level. :type grammar: str :param component: name of a formal grammar's component . :type component: str :param action: name of an action on a formal grammar's component. :type action: str :param locale: name of the locale if not the environment locale will be used. :type locale: str :return: None :rtype: None :raises: ValueError. """ if grammar not in CHOMSKY_GRAMMARS.keys(): raise ValueError("Unknown grammar hierarchy name.") else: self.grammar = grammar if component not in COMPONENTS.keys(): raise ValueError("Unknown component name.") else: self.component = component if action not in ACTIONS.keys(): raise ValueError("Unknown action name.") else: self.action = action self.value = ( 1000 * CHOMSKY_GRAMMARS[self.grammar] + 100 * COMPONENTS[self.component] + ACTIONS[self.action] ) self.locale = locale self.domains = ["automata"] self.message = generate_message( self.grammar, self.component, self.action, self.domains[0], self.locale ) self.group = AutomatonGroup() super().__init__(self.message) self.group.add_exception(self)
[docs] def set_locale(self, new_locale: str) -> None: self.locale = new_locale self.message = self.generate_message(self.locale)
[docs] def generate_message(self, locale: str) -> str: """ """ return generate_message(self.grammar, self.component, self.action, self.domains[0], locale)
def __str__(self): return self.message
# Specialized exceptions
[docs] class AutomatonError(AutomatonException): event = {} def __init__( self, grammar: str, component: str, action: str, locale: str = None, **event ) -> None: super().__init__(grammar, component, action, locale) self.domains.append("errors") if event: self.event["format"] = event self.message = self.generate_message(self.locale)
[docs] def generate_message(self, locale: str) -> str: automaton_msg = super().generate_message(locale) if len(self.event) > 0: try: error_msg = generate_message( self.grammar, self.component, self.action, self.domains[1], self.locale, **self.event["format"], ) for exc in self.group.exceptions: if type(exc) is self.event["cls"]: self.group.exceptions.remove(exc) self.group.add_exception(self.event["cls"](error_msg)) automaton_msg += "\n" + error_msg except KeyError as e: raise e return automaton_msg
[docs] class ReadError(AutomatonError): """Error raised for reading actions (01, AttributeError).""" def __init__(self, grammar_level, component, locale=None, **event): if event: self.event["cls"] = AttributeError super().__init__(grammar_level, component, "read", locale, **event)
[docs] class AddError(AutomatonError): """Error raised for addition actions (02, ValueError).""" def __init__(self, grammar_level, component, locale=None, **event): if event: self.event["cls"] = ValueError super().__init__(grammar_level, component, "add", locale, **event)
[docs] class RemoveError(AutomatonError): """Error raised for removal actions (03, KeyError).""" def __init__(self, grammar_level, component, locale=None, **event): if event: self.event["cls"] = KeyError super().__init__(grammar_level, component, "remove", locale, **event)
[docs] class ModifyError(AutomatonError): """Error raised for modification actions (04, ValueError).""" def __init__(self, grammar_level, component, locale=None, **event): if event: self.event["cls"] = ValueError super().__init__(grammar_level, component, "modify", locale, **event)
[docs] class ValidationError(AutomatonError): """Error raised for validation actions (05, AssertionError).""" def __init__(self, grammar_level, component, locale=None, **event): if event: self.event["cls"] = AssertionError super().__init__(grammar_level, component, "validate", locale, **event)
[docs] class SearchError(AutomatonError): """Error raised for search actions (06, KeyError).""" def __init__(self, grammar_level, component, locale=None, **event): if event: self.event["cls"] = KeyError super().__init__(grammar_level, component, "search", locale, **event)
[docs] class RemoveComponentError(AutomatonError): """Error raised for component withdrawal actions (19, RuntimeError).""" def __init__(self, grammar_level, component, locale=None, **event): if event: self.event["cls"] = RuntimeError super().__init__(grammar_level, component, "withdraw", locale, **event)