Skip to content

Range Validator

range_validator

Validator for numeric value ranges.

RangeValidator

Bases: ValidationRule

Validates that a numeric value falls within a [minimum, maximum] range.

Example
validator = RangeValidator("age", minimum_value=0, maximum_value=150)

errors = validator.validate(42)
assert errors == []

errors = validator.validate(-5)
assert len(errors) == 1  # below minimum
Source code in src/forging_blocks/domain/validators/range_validator.py
class RangeValidator(ValidationRule):
    """Validates that a numeric value falls within a ``[minimum, maximum]`` range.

    Example:
        ```python
        validator = RangeValidator("age", minimum_value=0, maximum_value=150)

        errors = validator.validate(42)
        assert errors == []

        errors = validator.validate(-5)
        assert len(errors) == 1  # below minimum
        ```

    """

    def __init__(
        self,
        field: str,
        minimum_value: int | float | None = None,
        maximum_value: int | float | None = None,
    ) -> None:
        self._field = field
        self._minimum_value = minimum_value
        self._maximum_value = maximum_value

    def validate(self, value: Any) -> list[RuleViolationError]:
        if not isinstance(value, (int, float)):
            return [
                RuleViolatedError(
                    ErrorMessage(f"'{self._field}' must be a number."),
                    ErrorMetadata(context={"field": self._field, "code": "invalid_type"}),
                )
            ]

        errors: list[RuleViolationError] = []

        if self._minimum_value is not None and value < self._minimum_value:
            errors.append(
                RuleViolatedError(
                    ErrorMessage(f"'{self._field}' must be at least {self._minimum_value}."),
                    ErrorMetadata(context={"field": self._field, "code": "minimum_value"}),
                )
            )

        if self._maximum_value is not None and value > self._maximum_value:
            errors.append(
                RuleViolatedError(
                    ErrorMessage(f"'{self._field}' must be at most {self._maximum_value}."),
                    ErrorMetadata(context={"field": self._field, "code": "maximum_value"}),
                )
            )

        return errors