Source code for concrete_settings.exceptions
from typing import Union, List, Dict
class ConcreteSettingsError(Exception):
"""Base class for all concrete_settings exceptions."""
class StructureError(ConcreteSettingsError):
"""Raised when an inconsistency in settings inheritance hierarchy is detected."""
SettingName = str
# fmt: off
# type ignored due to cyclic definition, promised to be fixed in
# future mypy versions
#:
ValidationErrorDetails = Union[ # type: ignore
str,
List['ValidationErrorDetails'], # type: ignore
Dict[SettingName, 'ValidationErrorDetails'], # type: ignore
]
# fmt: on
[docs]class ValidationError(ConcreteSettingsError):
sources: List[str]
def __init__(self, details: ValidationErrorDetails = ''):
self.details = details
self.sources = []
def prepend_source(self, source):
self.sources.insert(0, source)
def __str__(self):
detail_str = _format_detail(self.details)
if self.sources:
source = '.'.join(self.sources)
return f'{source}: {detail_str}'
else:
return detail_str
def _format_detail(detail) -> str:
if isinstance(detail, list):
return '; '.join(_format_detail(d) for d in detail)
elif isinstance(detail, dict):
return '\n'.join(f'{k}: {_format_detail(v)}.' for k, v in detail.items())
else:
return str(detail)