Quick Start

Basic validation

from valify import Schema, StringValidator, IntValidator, EmailValidator

schema = Schema({
    "name":  StringValidator(min_length=2, max_length=50),
    "age":   IntValidator(min_value=0, max_value=120),
    "email": EmailValidator(),
})

result = schema.validate({
    "name":  "Alice",
    "age":   30,
    "email": "alice@example.com",
})
print(result)
# {'name': 'Alice', 'age': 30, 'email': 'alice@example.com'}

Handling errors

valify reports ALL errors at once, not just the first one:

from valify.exceptions import ValidationError

try:
    schema.validate({
        "name":  "A",
        "age":   -5,
        "email": "not-an-email",
    })
except ValidationError as e:
    print(e)
# Validation failed:
#   name: Must be at least 2 characters long.
#   age: Must be at least 0.
#   email: 'not-an-email' is not a valid email address.

Optional fields

from valify import Schema, StringValidator, OptionalValidator

schema = Schema({
    "name": StringValidator(min_length=2),
    "bio":  OptionalValidator(StringValidator(), default=""),
})

# bio is missing — returns default value instead of erroring
result = schema.validate({"name": "Alice"})
print(result)
# {'name': 'Alice', 'bio': ''}

Nested schemas

from valify import Schema, StringValidator, IntValidator

address_schema = Schema({
    "street": StringValidator(min_length=2),
    "city":   StringValidator(min_length=2),
    "pin":    StringValidator(min_length=6, max_length=6),
})

user_schema = Schema({
    "name":    StringValidator(min_length=2),
    "age":     IntValidator(min_value=0),
    "address": address_schema,
})

user_schema.validate({
    "name": "Alice",
    "age":  30,
    "address": {
        "street": "MG Road",
        "city":   "Pune",
        "pin":    "411001",
    }
})