diff env/lib/python3.9/site-packages/schema_salad/exceptions.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.9/site-packages/schema_salad/exceptions.py	Mon Mar 22 18:12:50 2021 +0000
@@ -0,0 +1,130 @@
+from typing import List, Optional, Sequence, Tuple, Union
+
+from .sourceline import SourceLine, reflow_all, strip_duplicated_lineno
+
+
+class SchemaSaladException(Exception):
+    """Base class for all schema-salad exceptions."""
+
+    def __init__(
+        self,
+        msg: str,
+        sl: Optional[SourceLine] = None,
+        children: Optional[Sequence["SchemaSaladException"]] = None,
+        bullet_for_children: str = "",
+    ) -> None:
+        super().__init__(msg)
+        self.message = self.args[0]
+        self.file = None  # type: Optional[str]
+        self.start = None  # type: Optional[Tuple[int, int]]
+        self.end = None  # type: Optional[Tuple[int, int]]
+
+        self.is_warning = False  # type: bool
+
+        # It will be set by its parent
+        self.bullet = ""  # type: str
+
+        def simplify(exc: "SchemaSaladException") -> List["SchemaSaladException"]:
+            return [exc] if len(exc.message) else exc.children
+
+        def with_bullet(
+            exc: "SchemaSaladException", bullet: str
+        ) -> "SchemaSaladException":
+            if exc.bullet == "":
+                exc.bullet = bullet
+            return exc
+
+        if children is None:
+            self.children = []  # type: List["SchemaSaladException"]
+        elif len(children) <= 1:
+            self.children = sum((simplify(c) for c in children), [])
+        else:
+            self.children = sum(
+                (simplify(with_bullet(c, bullet_for_children)) for c in children), []
+            )
+
+        self.with_sourceline(sl)
+        self.propagate_sourceline()
+
+    def propagate_sourceline(self) -> None:
+        if self.file is None:
+            return
+        for c in self.children:
+            if c.file is None:
+                c.file = self.file
+                c.start = self.start
+                c.end = self.end
+                c.propagate_sourceline()
+
+    def as_warning(self) -> "SchemaSaladException":
+        self.is_warning = True
+        for c in self.children:
+            c.as_warning()
+        return self
+
+    def with_sourceline(self, sl: Optional[SourceLine]) -> "SchemaSaladException":
+        if sl and sl.file():
+            self.file = sl.file()
+            self.start = sl.start()
+            self.end = sl.end()
+        else:
+            self.file = None
+            self.start = None
+            self.end = None
+        return self
+
+    def leaves(self) -> List["SchemaSaladException"]:
+        if len(self.children):
+            return sum((c.leaves() for c in self.children), [])
+        if len(self.message):
+            return [self]
+        return []
+
+    def prefix(self) -> str:
+        pre = ""  # type:str
+        if self.file:
+            linecol0 = ""  # type: Union[int, str]
+            linecol1 = ""  # type: Union[int, str]
+            if self.start:
+                linecol0, linecol1 = self.start
+            pre = f"{self.file}:{linecol0}:{linecol1}: "
+
+        return pre + "Warning: " if self.is_warning else pre
+
+    def summary(self, level: int = 0, with_bullet: bool = False) -> str:
+        indent_per_level = 2
+        spaces = (level * indent_per_level) * " "
+        bullet = self.bullet + " " if len(self.bullet) and with_bullet else ""
+        return f"{self.prefix()}{spaces}{bullet}{self.message}"
+
+    def __str__(self) -> str:
+        return str(self.pretty_str())
+
+    def pretty_str(self, level: int = 0) -> str:
+        messages = len(self.message)
+        my_summary = [self.summary(level, True)] if messages else []
+        next_level = level + 1 if messages else level
+
+        ret = "\n".join(
+            e for e in my_summary + [c.pretty_str(next_level) for c in self.children]
+        )
+        if level == 0:
+            return strip_duplicated_lineno(reflow_all(ret))
+        else:
+            return ret
+
+
+class SchemaException(SchemaSaladException):
+    """Indicates error with the provided schema definition."""
+
+
+class ValidationException(SchemaSaladException):
+    """Indicates error with document against the provided schema."""
+
+
+class ClassValidationException(ValidationException):
+    pass
+
+
+def to_one_line_messages(exc: SchemaSaladException) -> str:
+    return "\n".join(c.summary() for c in exc.leaves())