Skip to main content

A simple, type-safe, and extensible Python validations framework

Project description

🔍 V6E

PyPI version License PyPI - Python Version PyPI - Downloads Contributors

A simple, type-safe, and extensible Python validations framework

Why the name?

v6e comes from the numeronym of "validate".

Examples

Check out the examples in ./examples! You can run them locally with:

uv run examples/validations.py

Usage

Basic validations

import v6e as v

my_validation = v.int().gte(18).lte(21)

# Use it only to check if the value conforms
my_validation.check(18)  # True
my_validation.check(21)  # True
my_validation.check(54)  # False

# Use `.parse()` to validate and get the parsed value
my_validation.parse(21)  # Ok -> Returns 21 (int)
my_validation.parse("21")  # Ok -> Returns 21 (int)
my_validation.parse(54)  # Err -> Raises a ValidationException

Chaining your validations and transformations

my_validation = v.str().trim().starts_with("foo").ends_with("foo").regex(r"^[a-z0-9]*$")
my_validation.parse("  foo12")  # Ok -> Returns 'foo12' (str)
my_validation.parse("12foo  ")  # Ok -> Returns '12foo' (str)
my_validation.parse("1foo2")  # Err -> Raises a ValidationException

Handling multiple possible types

union = v.str().starts_with("foo") | v.int().gte(5)

union.parse("foobar")  # Ok -> Returns 'foobar' (str)
union.parse("1foo2")  # Err -> Raises a ValidationException

union.parse(5)  # Ok -> Returns 5 (int)
union.parse(3)  # Err -> Raises a ValidationException

union.parse(None)  # Err -> Raises a ValidationException

Custom validations

def _validate_earth_age(x: int) -> None:
    if x != 4_543_000_000:
        raise ValueError("The Earth is 4.543 billion years old. Try 4543000000.")

earth_age = v.int().custom(_validate_earth_age)
earth_age.parse(4_543_000_000)  # Ok -> Returns 4_543_000_000 (int)
earth_age.parse("4543000000")  # Ok -> Returns 4_543_000_000 (int)
earth_age.parse(1)  # Err -> Raises ValidationException

Custom reusable types

class DivThree(v.IntType):
    @override
    def parse_raw(self, raw: t.Any):
        parsed: int = super().parse_raw(raw)
        if parsed % 3 != 0:
            raise ValueError(f"Woops! {parsed!r} is not divisible by three")


my_validation = DivThree().gt(5)
my_validation.parse(6)  # Ok -> Returns 6
my_validation.parse(3)  # Err (not >5) -> Raises a ValidationException
my_validation.parse(7)  # Err (not div by 3) -> Raises a ValidationException

🐍 Type-checking

This library is fully type-checked. This means that all types will be correctly inferred from the arguments you pass in.

In this example your editor will correctly infer the type:

my_validation = v.int().gte(8).lte(4)
t.reveal_type(my_validation)  # Type of "my_validation" is "V6eInt"
t.reveal_type(my_validation.check)  # Type of "my_validation.check" is "(raw: Any) -> bool"
t.reveal_type(my_validation.safe_parse)  # Type of "my_validation" is "(raw: Any) -> V6eResult[int]"
t.reveal_type(my_validation.parse)  # Type of "my_validation" is "(raw: Any) -> int"

Why do I care?

Type checking will help you catch issues way earlier in the development cycle. It will also provide nice autocomplete features in your editor that will make you faster ⚡.

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

v6e-0.1.8.tar.gz (17.6 kB view details)

Uploaded Source

Built Distribution

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

v6e-0.1.8-py3-none-any.whl (9.6 kB view details)

Uploaded Python 3

File details

Details for the file v6e-0.1.8.tar.gz.

File metadata

  • Download URL: v6e-0.1.8.tar.gz
  • Upload date:
  • Size: 17.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for v6e-0.1.8.tar.gz
Algorithm Hash digest
SHA256 0676bef43a8d9547adbb5f1cd8e85b5af2325c843592f4afb21c57405a13d141
MD5 d2f65f8caac476983c47086a483d755d
BLAKE2b-256 d51a9ac2ee98af4c7d69520d0ef3a9d3cd30ec660440c61435dcdfdae2cdb50c

See more details on using hashes here.

Provenance

The following attestation bundles were made for v6e-0.1.8.tar.gz:

Publisher: release.yml on danimelchor/v6e

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file v6e-0.1.8-py3-none-any.whl.

File metadata

  • Download URL: v6e-0.1.8-py3-none-any.whl
  • Upload date:
  • Size: 9.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for v6e-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 d036f16d3b530fe553486946001c46d2bb6f0a6b3c42406b95712a55553f7ce6
MD5 1e71acf5113e0f828cb1de9164e8d788
BLAKE2b-256 f3cd0a9a12769ff3d211bbdaf4067550be2d0c5b9c337f7e4e39c7100ffd2f5e

See more details on using hashes here.

Provenance

The following attestation bundles were made for v6e-0.1.8-py3-none-any.whl:

Publisher: release.yml on danimelchor/v6e

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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