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

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 ./tests

🤝 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.0b1.tar.gz (29.5 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.0b1-py3-none-any.whl (18.6 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for yupy-0.2.0b1.tar.gz
Algorithm Hash digest
SHA256 816db91a68b63f30757bdedfc1496dee330e00b6a10a372e12b8cd0051e9019e
MD5 65746f5fe8129e58117023fa76c2b5ad
BLAKE2b-256 63ecc19b4c1ade3ddbf6b1f62a66876801c39747d59f0fd23d9f24244541f8a7

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for yupy-0.2.0b1-py3-none-any.whl
Algorithm Hash digest
SHA256 b95924ca019bba68744c5a4f17495e0763c2c629390e5f31f803ff0fdafdac17
MD5 1b609bcd801091b1f324f29cb154f118
BLAKE2b-256 015ba91e7a5588a5a32afcde35474b710f2ba546964a851f6b00e223363bf5db

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