mirror of
https://github.com/checktheroads/hyperglass
synced 2024-05-11 05:55:08 +00:00
Fix ValidationError handling in private exceptions
This commit is contained in:
@ -4,6 +4,9 @@
|
|||||||
import json as _json
|
import json as _json
|
||||||
from typing import Any, Dict, List, Union, Literal, Optional
|
from typing import Any, Dict, List, Union, Literal, Optional
|
||||||
|
|
||||||
|
# Third Party
|
||||||
|
from pydantic import ValidationError
|
||||||
|
|
||||||
# Project
|
# Project
|
||||||
from hyperglass.log import log
|
from hyperglass.log import log
|
||||||
from hyperglass.util import get_fmt_keys
|
from hyperglass.util import get_fmt_keys
|
||||||
@ -141,6 +144,14 @@ class PrivateHyperglassError(HyperglassError):
|
|||||||
|
|
||||||
_level = "warning"
|
_level = "warning"
|
||||||
|
|
||||||
|
def _parse_validation_error(self, err: ValidationError) -> str:
|
||||||
|
errors = err.errors()
|
||||||
|
parsed = {
|
||||||
|
k: ", ".join(str(loc) for t in errors for loc in t["loc"] if t["type"] == k)
|
||||||
|
for k in {e["type"] for e in errors}
|
||||||
|
}
|
||||||
|
return ", ".join([f"{k} ({v})" for k, v in parsed.items()])
|
||||||
|
|
||||||
def __init_subclass__(cls, *, level: Optional[ErrorLevel] = None) -> None:
|
def __init_subclass__(cls, *, level: Optional[ErrorLevel] = None) -> None:
|
||||||
"""Override error attributes from subclass."""
|
"""Override error attributes from subclass."""
|
||||||
if level is not None:
|
if level is not None:
|
||||||
@ -152,6 +163,10 @@ class PrivateHyperglassError(HyperglassError):
|
|||||||
error = kwargs.pop("error")
|
error = kwargs.pop("error")
|
||||||
error = self._safe_format(str(error), **kwargs)
|
error = self._safe_format(str(error), **kwargs)
|
||||||
kwargs["error"] = error
|
kwargs["error"] = error
|
||||||
|
|
||||||
|
if isinstance(message, ValidationError):
|
||||||
|
message = self._parse_validation_error(message)
|
||||||
|
|
||||||
self._message = self._safe_format(message, **kwargs)
|
self._message = self._safe_format(message, **kwargs)
|
||||||
self._keywords = list(kwargs.values())
|
self._keywords = list(kwargs.values())
|
||||||
super().__init__(message=self._message, level=self._level, keywords=self._keywords)
|
super().__init__(message=self._message, level=self._level, keywords=self._keywords)
|
||||||
|
Reference in New Issue
Block a user