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.0b3.tar.gz (47.3 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.0b3-py3-none-any.whl (35.6 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for yupy-0.2.0b3.tar.gz
Algorithm Hash digest
SHA256 ad740b48a03ec0a2b8ec44f386b823c12f4bc7d0a0020758b8187fd39aebd2d9
MD5 93b2af7af9175c1fbff7cd58f64daba2
BLAKE2b-256 f9737139c34eebdf609af708f556d9ad6a455763a9e7df6a6e35793191b8393e

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for yupy-0.2.0b3-py3-none-any.whl
Algorithm Hash digest
SHA256 ecb65545bc5aaf9423da999d6bf4b946778681e29ac1e6a59f0cdec61c4d6d59
MD5 26d2b0276a34b5fd46241864c2672653
BLAKE2b-256 4e3919e5ee50708b3f3540702d72c7a0e7b2c849622eba3eb934b1b568606dbe

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