Skip to main content

A minimalistic data validation library

Project description

Statica

Tests Coverage

Statica is a Python library for defining and validating structured data with type annotations and constraints. It provides an easy-to-use framework for creating type-safe models with comprehensive validation for both types and constraints.

Why Statica?

Statica was created to address the need for a lightweight, flexible, and dependency-free alternative to libraries like pydantic. While pydantic is a powerful tool for data validation and parsing, Statica offers some distinct advantages in specific situations:

  1. Lightweight: Statica does not rely on any third-party dependencies, making it ideal for projects where minimizing external dependencies is a priority.
  2. Performance: For use cases where performance is critical. Pydantic needs 3x more memory than Statica for the same models.
  3. Ease of Use: With its simple, Pythonic design, Statica is intuitive for developers already familiar with Python's dataclasses and type hinting. It avoids much of the magic that pydantic employs.
  4. Customizable Validation: Statica allows fine-grained control over type and constraint validation through customizable field descriptors (Field) and error classes.

Features

  • Type Validation: Automatically validates types for attributes based on type hints.
  • Constraint Validation: Define constraints like minimum/maximum length, value ranges, and more.
  • Customizable Error Handling: Use custom exception classes for type and constraint errors.
  • Flexible Field Descriptors: Add constraints, casting, and other behaviors to your fields.
  • Optional Fields: Support for optional fields with default values.
  • Automatic Initialization: Automatically generate constructors (__init__) for your models.
  • String Manipulation: Strip whitespace from string fields if needed.
  • Casting: Automatically cast values to the desired type.

Installation

You can install Statica via pip:

pip install statica

Getting Started

Basic Usage

Define a model with type annotations and constraints:

from statica.core import Statica, Field

class Payload(Statica):
    name: str = Field(min_length=3, max_length=50, strip_whitespace=True)
    description: str | None = Field(max_length=200)
    num: int | float
    float_num: float | None

Instantiate the model using a dictionary:

data = {
    "name": "Test Payload",
    "description": "A short description.",
    "num": 42,
    "float_num": 3.14,
}

payload = Payload.from_map(data)
print(payload.name)  # Output: "Test Payload"

Or instantiate directly:

payload = Payload(
    name="Test",
    description="This is a test description.",
    num=42,
    float_num=3.14,
)

Validation

Statica automatically validates attributes based on type annotations and constraints:

from statica.core import ConstraintValidationError, TypeValidationError

try:
    payload = Payload(name="Te", description="Valid", num=42)
except ConstraintValidationError as e:
    print(e)  # Output: "name: length must be at least 3"

try:
    payload = Payload(name="Test", description="Valid", num="Invalid")
except TypeValidationError as e:
    print(e)  # Output: "num: expected type 'int | float', got 'str'"

Optional Fields

Fields annotated with | None are optional and default to None:

class OptionalPayload(Statica):
    name: str | None

payload = OptionalPayload()
print(payload.name)  # Output: None

Field Constraints

You can specify constraints on fields:

  • String Constraints: min_length, max_length, strip_whitespace
  • Numeric Constraints: min_value, max_value
  • Casting: cast_to
class StringTest(Statica):
    name: str = Field(min_length=3, max_length=5, strip_whitespace=True)

class IntTest(Statica):
    num: int = Field(min_value=1, max_value=10, cast_to=int)

Custom Error Classes

You can define custom error classes for type and constraint validation:

class CustomError(Exception):
    pass

class CustomPayload(Statica):
    constraint_error_class = CustomError

    num: int = Field(min_value=1, max_value=10)

try:
    payload = CustomPayload(num=0)
except CustomError as e:
    print(e)  # Output: "num: must be at least 1"

Advanced Usage

Short Syntax for Fields

You can use simple type annotations without explicitly defining Field descriptors:

class ShortSyntax(Statica):
    name: str

short = ShortSyntax(name="Test")
print(short.name)  # Output: "Test"

Custom Initialization

Statica automatically generates an __init__ method based on type annotations, ensuring that all required fields are provided during initialization.

Casting

You can automatically cast input values to the desired type:

class CastingExample(Statica):
    num: int = Field(cast_to=int)

instance = CastingExample(num="42")
print(instance.num)  # Output: 42

Contributing

We welcome contributions to Statica! To contribute:

  1. Fork the repository.
  2. Create a new branch for your feature or bug fix.
  3. Write tests for your changes.
  4. Submit a pull request.

License

Statica is licensed under the MIT License. See the LICENSE file for more details.

Acknowledgments

Statica was built to simplify data validation and provide a robust and simple framework for type-safe models in Python, inspired by pydantic and dataclasses.

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

statica-1.2.0.tar.gz (12.3 kB view details)

Uploaded Source

Built Distribution

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

statica-1.2.0-py3-none-any.whl (7.8 kB view details)

Uploaded Python 3

File details

Details for the file statica-1.2.0.tar.gz.

File metadata

  • Download URL: statica-1.2.0.tar.gz
  • Upload date:
  • Size: 12.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.12

File hashes

Hashes for statica-1.2.0.tar.gz
Algorithm Hash digest
SHA256 d05fc5dbd977e29bec56c7172fe548452744813629e4682024b4fcf1f5ece291
MD5 2b4b26b2ae5c604559e191a8abcccfd6
BLAKE2b-256 37c0db2957279efb00c8a073cd7ac9b1da958550a5db72827776f961034bf77a

See more details on using hashes here.

File details

Details for the file statica-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: statica-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 7.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.12

File hashes

Hashes for statica-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 43f0e25ee928db298caafe175773d2809a99fd1154f1662e4e6cacac6e3b86df
MD5 968a2c5988b9f25e3d5a684ff16ed0d2
BLAKE2b-256 8b119bf9a32631ed514f5a34ff2f4e8363450a5f727f1dee54a7a6c0706eb52e

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