diff env/lib/python3.7/site-packages/schema_salad/exceptions.py @ 0:26e78fe6e8c4 draft

"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author shellac
date Sat, 02 May 2020 07:14:21 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.7/site-packages/schema_salad/exceptions.py	Sat May 02 07:14:21 2020 -0400
@@ -0,0 +1,124 @@
+from typing import Any, Sequence, Optional, Tuple, List
+from typing_extensions import Text
+from .sourceline import reflow_all, strip_duplicated_lineno, SourceLine
+
+
+def to_one_line_messages(exc):  # type: (SchemaSaladException) -> Text
+    return "\n".join((c.summary() for c in exc.leaves()))
+
+
+class SchemaSaladException(Exception):
+    """Base class for all schema-salad exceptions."""
+
+    def __init__(
+        self,
+        msg,  # type: Text
+        sl=None,  # type: Optional[SourceLine]
+        children=None,  # type: Optional[Sequence[SchemaSaladException]]
+        bullet_for_children="",  # type: Text
+    ):  # type: (...) -> None
+        super(SchemaSaladException, self).__init__(msg)
+        self.message = self.args[0]
+
+        # It will be set by its parent
+        self.bullet = ""  # type: Text
+
+        def simplify(exc):  # type: (SchemaSaladException) -> List[SchemaSaladException]
+            return [exc] if len(exc.message) else exc.children
+
+        def with_bullet(exc, bullet):
+            # type: (SchemaSaladException, Text) -> 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):  # type: () -> 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 with_sourceline(
+        self, sl
+    ):  # type: (Optional[SourceLine]) -> SchemaSaladException
+        if sl and sl.file():
+            self.file = sl.file()  # type: Optional[Text]
+            self.start = sl.start()  # type: Optional[Tuple[int, int]]
+            self.end = sl.end()  # type: Optional[Tuple[int, int]]
+        else:
+            self.file = None
+            self.start = None
+            self.end = None
+        return self
+
+    def leaves(self):  # type: () -> List[SchemaSaladException]
+        if len(self.children):
+            return sum((c.leaves() for c in self.children), [])
+        elif len(self.message):
+            return [self]
+        else:
+            return []
+
+    def prefix(self):  # type: () -> Text
+        if self.file:
+            linecol = self.start if self.start else ("", "")  # type: Tuple[Any, Any]
+            return "{}:{}:{}: ".format(self.file, linecol[0], linecol[1])
+        else:
+            return ""
+
+    def summary(self, level=0, with_bullet=False):  # type: (int, bool) -> Text
+        indent_per_level = 2
+        spaces = (level * indent_per_level) * " "
+        bullet = self.bullet + " " if len(self.bullet) and with_bullet else ""
+        return "{}{}{}{}".format(self.prefix(), spaces, bullet, self.message)
+
+    def __str__(self):  # type: () -> str
+        return str(self.pretty_str())
+
+    def pretty_str(self, level=0):  # type: (int) -> Text
+        if len(self.message):
+            my_summary = [self.summary(level, True)]
+            next_level = level + 1
+        else:
+            my_summary = []
+            next_level = 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."""
+
+    pass
+
+
+class ValidationException(SchemaSaladException):
+    """Indicates error with document against the provided schema."""
+
+    pass
+
+
+class ClassValidationException(ValidationException):
+    pass