from typing import Any
from typing import Dict
from typing import List
from typing import Tuple
from pint import DimensionalityError
[docs]
def build_validation_error_dict(
input_value: Any,
error: Exception,
pydantic_location: Tuple[str, ...],
err_type: str = "value_error",
) -> List[Dict[str, Any]]:
if err_type == "value_error":
msg = f"Value error, {error}"
ctx = {"error": error}
else:
msg = str(error)
ctx = None
entry = {
"input": input_value,
"loc": pydantic_location,
"msg": msg,
"type": err_type,
}
if ctx is not None:
entry["ctx"] = ctx
return [entry]
[docs]
def dimensionality_error(
input_value: Any,
from_unit: str,
to_unit: str,
from_dim: str,
to_dim: str,
pydantic_location: Tuple[str, ...] = ("length",),
) -> List[Dict[str, Any]]:
cause = DimensionalityError(from_unit, to_unit, from_dim, to_dim)
error = ValueError(str(cause))
error.__cause__ = cause
return build_validation_error_dict(input_value, error, pydantic_location)
[docs]
def dimensionless_error(
input_value: Any, pydantic_location: Tuple[str, ...] = ("length",)
) -> List[Dict[str, Any]]:
error = ValueError(f"{input_value} does not match dimensionality ''")
return build_validation_error_dict(input_value, error, pydantic_location)
[docs]
def magnitude_int_error(
input_value: Any, magnitude: float, pydantic_location: Tuple[str, ...] = ("length",)
) -> List[Dict[str, Any]]:
error = ValueError(f"Magnitude {magnitude} cannot be converted to type int")
return build_validation_error_dict(input_value, error, pydantic_location)
[docs]
def sequence_int_error(
input_value: Any, item: float, pydantic_location: Tuple[str, ...] = ("length",)
) -> List[Dict[str, Any]]:
error = ValueError(f"Sequence item {item} cannot be converted to type int")
return build_validation_error_dict(input_value, error, pydantic_location)
[docs]
def invalid_type_error(
input_value: Any, pydantic_location: Tuple[str, ...]
) -> List[Dict[str, Any]]:
cause = TypeError(f"Invalid type {type(input_value)} (value={input_value!r})")
error = ValueError(str(cause))
error.__cause__ = cause
return build_validation_error_dict(input_value, error, pydantic_location)
[docs]
def min_length_error(
input_value: Any, min_length: int, pydantic_location: Tuple[str, ...]
) -> List[Dict[str, Any]]:
return [
{
"ctx": {"min_length": min_length},
"input": input_value,
"loc": pydantic_location,
"msg": f"String should have at least {min_length} characters",
"type": "string_too_short",
}
]
[docs]
def pattern_mismatch_error(
input_value: Any, pattern: str, pydantic_location: Tuple[str, ...]
) -> List[Dict[str, Any]]:
return [
{
"ctx": {"pattern": pattern},
"input": input_value,
"loc": pydantic_location,
"msg": f"String should match pattern '{pattern}'",
"type": "string_pattern_mismatch",
}
]
[docs]
def missing_error(
input_value: Any, pydantic_location: Tuple[str, ...]
) -> List[Dict[str, Any]]:
return [
{
"input": input_value,
"loc": pydantic_location,
"msg": "Field required",
"type": "missing",
}
]