Skip to main content

Koda Validate

Koda Validate is a library and toolkit for building composable and typesafe validators. In many cases, validators can be derived from typehints (e.g. TypedDicts, dataclasses, and NamedTuples). For everything else, you can combine existing validation logic, or write your own. At its heart, Koda Validate is just a few kinds of callables that fit together, so the possibilities are endless. It is async-friendly and comparable in performance to Pydantic 2.

Koda Validate can be used in normal control flow or as a runtime type checker.

Docs: https://koda-validate.readthedocs.io/en/stable/

At a Glance

from koda_validate import StringValidator

my_string_validator = StringValidator()

my_string_validator("a string!")
#> Valid("a string!")

my_string_validator(5)
#> Invalid(...)

Additional Validation

from koda_validate import MaxLength, MinLength

str_len_validator = StringValidator(MinLength(1), MaxLength(20))

str_len_validator("abc")
#> Valid("abc")

str_len_validator("")
#> Invalid(...)

str_len_validator("abcdefghijklmnopqrstuvwxyz")
#> Invalid(...)

Combining Validators

from koda_validate import ListValidator, StringValidator

list_string_validator = ListValidator(StringValidator())

list_string_validator(["a", "b", "c"])
# > Valid(["a", "b", "c"])

list_string_validator([1, 2, 3])
# > Invalid(...)

Derived Validators

from typing import TypedDict
from koda_validate import (TypedDictValidator, Valid, Invalid)
from koda_validate.serialization import to_serializable_errs

class Person(TypedDict):
    name: str
    hobbies: list[str]


person_validator = TypedDictValidator(Person)

match person_validator({"name": "Guido"}):
    case Valid(string_list):
        print(f"woohoo, valid!")
    case Invalid() as invalid:
        # readable errors
        print(to_serializable_errs(invalid))

#> {'hobbies': ['key missing']}

Runtime Type Checking

from koda_validate.signature import validate_signature

@validate_signature
def add(a: int, b: int) -> int:
    return a + b


add(1, 2)  # returns 3

add(1, "2")  # raises `InvalidArgsError`
# koda_validate.signature.InvalidArgsError:
# Invalid Argument Values
# -----------------------
# b='2'
#     expected <class 'int'>

There's much, much more in the Docs.

Something's Missing or Wrong

Open an issue on GitHub please!

Metadata

Release files for koda-validate 5.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for koda-validate 5.1.0
File Size Uploaded Provenance Actions
koda_validate-5.1.0.tar.gz 41.2 kB Without provenance Details for koda_validate-5.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for koda-validate 5.1.0
File Interpreter ABI Platform Actions
koda_validate-5.1.0-py3-none-any.whl Python 3 none any Details for koda_validate-5.1.0-py3-none-any.whl

Total release size: 95.9 kB

Release files / koda_validate-5.1.0.tar.gz

Download URL koda_validate-5.1.0.tar.gz
Size 41.2 kB
Tags Source
SHA-256 checksum
How to use checksums
9e2d5f39b2a1f00ba07078e423d134a2f0cde7a209a79fa332174dd5b30a98f9
BLAKE2b-256 checksum
How to use checksums
bbc7cd0782a87324ad40cf2fc66d32c7ef5ffd5597ae6538b4fa21d5dbbbc4c8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.1.4 CPython/3.13.6 Darwin/24.6.0

Release files / koda_validate-5.1.0-py3-none-any.whl

Download URL koda_validate-5.1.0-py3-none-any.whl
Size 54.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a5832df7a5b82325c608b94889f5e8668de210075bb289b1e4892fc0e6c1d9e4
BLAKE2b-256 checksum
How to use checksums
2787fc7308f36e171a11f54a7e99e449f301711ddffdd056f1aa9b9e495f7aa2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.1.4 CPython/3.13.6 Darwin/24.6.0

Security for koda-validate 5.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page