Source code for dataio.validate.registry.types
from __future__ import annotations
import re
from collections.abc import Callable
from datetime import datetime
from typing import Any
from dataio.validate.contracts.models import ManifestField
[docs]
def _is_empty(value: Any) -> bool:
return value is None or value == ""
[docs]
def validate_string(value: Any, _: ManifestField) -> bool:
return isinstance(value, str)
[docs]
def validate_boolean(value: Any, _: ManifestField) -> bool:
return isinstance(value, bool) or str(value).lower() in {"true", "false"}
[docs]
def validate_int(value: Any, field: ManifestField) -> bool:
if _is_empty(value):
return False
try:
parsed = int(str(value))
except ValueError:
return False
return _validate_numeric_bounds(float(parsed), field)
[docs]
def validate_float(value: Any, field: ManifestField) -> bool:
if _is_empty(value):
return False
try:
parsed = float(str(value))
except ValueError:
return False
return _validate_numeric_bounds(parsed, field)
[docs]
def validate_enum(value: Any, field: ManifestField) -> bool:
if field.allowedValues is None:
return True
return value in field.allowedValues
[docs]
def validate_region_id(value: Any, _: ManifestField) -> bool:
return bool(re.match(r"^[a-z]+_[A-Za-z0-9]+$", str(value)))
[docs]
def validate_region_name(value: Any, _: ManifestField) -> bool:
return isinstance(value, str) and bool(value.strip())
[docs]
def validate_date(value: Any, field: ManifestField) -> bool:
text = str(value)
try:
datetime.strptime(text, field.format or "")
except ValueError:
return False
return True
[docs]
def validate_datetime(value: Any, field: ManifestField) -> bool:
try:
parsed = datetime.strptime(str(value), field.format or "")
except ValueError:
return False
return parsed.tzinfo is not None
[docs]
def _validate_numeric_bounds(value: float, field: ManifestField) -> bool:
if field.range is not None and len(field.range) == 2:
return field.range[0] <= value <= field.range[1]
if field.min is not None and value < field.min:
return False
return not (field.max is not None and value > field.max)
TYPE_VALIDATORS: dict[str, Callable[[Any, ManifestField], bool]] = {
"string": validate_string,
"boolean": validate_boolean,
"int": validate_int,
"float": validate_float,
"enum": validate_enum,
"regionID": validate_region_id,
"regionName": validate_region_name,
"date": validate_date,
"dateTime": validate_datetime,
}