Skip to main content

Dead simple Object schema validation for python

Project description

YuPy - Python Schema Validation Library

Dead simple object schema validation for Python

license pypi pypi-pre py-versions Test Ruff Mypy coverage downloads downloads/month Made in Ukraine

Inspired by yup js library

YuPy is a schema builder for runtime value parsing and validation. Define a schema, transform a value to match, assert the shape of an existing value, or both. YuPy schemas are extremely expressive and allow modeling complex, interdependent validations or value transformations.


📋 Table of Contents


🔧 Features

  • ✅ Schema-based validation: strings, numbers, arrays, dictionaries
  • 🔍 Type checking
  • ❓ Nullability control (None)
  • 🔄 Value transformation
  • 🧪 Custom validators
  • 🧾 Detailed error reporting
  • 🌐 Locale support
  • 🔌 Built-in adapters: default, required, immutable
  • 📏 Comparison and size constraints
  • 🔁 Mixed types and Union schema support

📦 Installation

pip install yupy

🚀 Usage

Basic validation

from yupy import string, number

string().min(3).max(10).validate("hello")  # ✅
number().positive().integer().validate(42)  # ✅

Nullability

string().nullable().validate(None)  # ✅

Arrays

from yupy import array

array().of(string().min(2)).min(1).validate(["ok", "yes"])

Dictionaries (Mappings)

from yupy import mapping

user_schema = mapping().shape({
    "name": string().min(3),
    "age": number().ge(18)
})

Union

from yupy import union

union().one_of([string(), number()]).validate("hello")
union().one_of([string(), number()]).validate(10)

🧩 Adapters

required

from yupy import required

required(string().min(3)).validate("abc")

default

from yupy import default

default("N/A", string()).validate(None)  # → "N/A"

immutable

from yupy import immutable

immutable(string()).validate("data")  # -> creates deep copy

📘 API Reference

Base Schema

Inheritance: Schema (implements ISchema)

Base class for all schema types providing core validation functionality.

Method Description
nullable() -> Self Makes the schema accept None values
not_nullable(message: ErrorMessage = None) -> Self Explicitly disallows None values with custom message
test(func: ValidatorFunc) -> Self Adds a custom validation function
const(value: Any, message: ErrorMessage = None) -> Self Validates that the value equals a constant
transform(func: TransformFunc) -> Self Adds a transformation function
validate(value: Any, abort_early: bool = True, path: str = "~") -> Any Validates the value against the schema

Sized Schema

Inheritance: SchemaSizedSchema (implements ISizedSchema)

Provides size-based validation methods for sequences and collections.

Method Description
length(limit: int, message: ErrorMessage = None) -> Self Validates exact length
min(limit: int, message: ErrorMessage = None) -> Self Validates minimum length
max(limit: int, message: ErrorMessage = None) -> Self Validates maximum length

Comparable Schema

Inheritance: SchemaComparableSchema (implements IComparableSchema)

Provides comparison-based validation methods.

Method Description
le(limit: Any, message: ErrorMessage = None) -> Self Validates value ≤ limit
ge(limit: Any, message: ErrorMessage = None) -> Self Validates value ≥ limit
lt(limit: Any, message: ErrorMessage = None) -> Self Validates value < limit
gt(limit: Any, message: ErrorMessage = None) -> Self Validates value > limit
eq(value: Any, message: ErrorMessage = None) -> Self Validates value equals specified value
ne(value: Any, message: ErrorMessage = None) -> Self Validates value not equals specified value

String Schema

Inheritance: SchemaSizedSchema, ComparableSchema, EqualityComparableSchemaStringSchema

Validates string values with text-specific methods.

Method Description
email(message: ErrorMessage = None) -> Self Validates email format
url(message: ErrorMessage = None) -> Self Validates URL format
uuid(message: ErrorMessage = None) -> Self Validates UUID format
matches(regex: re.Pattern, message: ErrorMessage = None, exclude_empty: bool = False) -> Self Validates against regex pattern
lowercase(message: ErrorMessage = None) -> Self Validates string is lowercase
uppercase(message: ErrorMessage = None) -> Self Validates string is uppercase
ensure() -> Self Transforms empty/null values to empty string

Number Schema

Inheritance: SchemaComparableSchema, EqualityComparableSchemaNumberSchema

Validates numeric values (int, float) with number-specific methods.

Method Description
positive(message: ErrorMessage = None) -> Self Validates number > 0
negative(message: ErrorMessage = None) -> Self Validates number < 0
integer(message: ErrorMessage = None) -> Self Validates number is integer (no decimals)
multiple_of(multiplier: Union[int, float], message: ErrorMessage = None) -> Self Validates number is multiple of specified value

Array Schema

Inheritance: SchemaSizedSchema, ComparableSchema, EqualityComparableSchemaArraySchema

Validates list and tuple values.

Method Description
of(schema: Union[ISchema, ISchemaAdapter], message: ErrorMessage = None) -> Self Validates all array elements against schema

Mapping Schema

Inheritance: SchemaEqualityComparableSchemaMappingSchema

Validates dictionary/mapping values with object shape validation.

Method Description
shape(fields: Dict[str, Union[ISchema, ISchemaAdapter]]) -> Self Defines the expected shape/structure
strict(is_strict: bool = True, message: ErrorMessage = None) -> Self Disallows unknown keys when True

Mixed Schema

Inheritance: SchemaEqualityComparableSchemaMixedSchema

Validates values of any type with flexible type checking.

Method Description
of(type_or_types: _SchemaExpectedType, message: ErrorMessage = None) -> Self Validates value is of specified type(s)
one_of(items: Iterable, message: ErrorMessage = None) -> Self Validates value is one of the specified items

Union Schema

Inheritance: SchemaEqualityComparableSchemaUnionSchema

Validates values that can match one of multiple schemas.

Method Description
one_of(options: List[Union[ISchema, ISchemaAdapter]], message: ErrorMessage = None) -> Self Validates value matches at least one of the provided schemas

🛠 Extending

Custom Validator

from yupy import string, ValidationError


def is_palindrome(value):
    if value != value[::-1]:
        raise ValidationError("Not a palindrome")


string().test(is_palindrome).validate("madam")

Custom Adapter

from yupy import SchemaAdapter, string


class CustomAdapter(SchemaAdapter):
    def validate(self, value, abort_early=True, path="~"):
        # Custom logic before validation
        result = super().validate(value, abort_early, path)
        # Custom logic after validation
        return result


# Usage
custom = CustomAdapter(string().min(3))
custom.validate("hello")

✅ Running Tests

pytest

🤝 Contributing

Contributions are welcome! Please open issues or submit pull requests.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

📄 License

MIT License
Copyright (c) YuPy Contributors

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

yupy-0.2.0b2.tar.gz (43.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

yupy-0.2.0b2-py3-none-any.whl (33.2 kB view details)

Uploaded Python 3

File details

Details for the file yupy-0.2.0b2.tar.gz.

File metadata

  • Download URL: yupy-0.2.0b2.tar.gz
  • Upload date:
  • Size: 43.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.7.19

File hashes

Hashes for yupy-0.2.0b2.tar.gz
Algorithm Hash digest
SHA256 5cc3963069580ce37795aacadf7eecb9a19c1f1d0da13cf17d5a3c1bd05eea70
MD5 10721c78d4495aaaf4938c6c791d4040
BLAKE2b-256 74ae2458e625544af3358777f23c1dc177a765ed72fce134675632faff985b02

See more details on using hashes here.

File details

Details for the file yupy-0.2.0b2-py3-none-any.whl.

File metadata

  • Download URL: yupy-0.2.0b2-py3-none-any.whl
  • Upload date:
  • Size: 33.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.7.19

File hashes

Hashes for yupy-0.2.0b2-py3-none-any.whl
Algorithm Hash digest
SHA256 828ad89b977b275b030d07b2ee8cf2200b72a0cdc2d456e2ceb2b7f5b405a2f7
MD5 ddef44f2f29a5a9cb1b581f55c265d8b
BLAKE2b-256 ad1dbcfbb8c78ac50f6ab21bbdb2aaf090706c2ea41b731b4e93d4b71c7bca51

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page