Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Nyctea logo

Nyctea

PyPI Python versions License CI

Polars-based data validation library with an extensible OOP validator architecture.

Features

Validator system

  • Extensible: create custom parsers and checks by inheriting from base classes
  • Type-safe: generic validator classes with runtime validation
  • Discoverable: tag-based validator discovery and registration

Customizable pipeline

  • Flexible: add, remove, or reorder validation phases
  • Validated: strict dependency enforcement prevents invalid configurations
  • Observable: built-in logging and metrics collection

Schema-centric API

  • Intuitive: schema.validate(df, registry), the schema owns validation
  • Pythonic: clean, object-oriented design
  • Out-of-core: built on Polars LazyFrame, designed for larger-than-RAM data

Installation

pip install nyctea
# or with uv
uv add nyctea

Quick start

import polars as pl
from nyctea import Registry, SchemaModel, register_builtins

# Define schema
schema = SchemaModel.from_dict({
    "columns": {
        "name": {
            "dtype": "Utf8",
            "parsers": [{"name": "strip"}, {"name": "lower"}],
            "nullable": False,
        },
        "age": {
            "dtype": "Int64",
            "parsers": [{"name": "to_int"}],
            "checks": [{"name": "min_value", "args": {"min": 0}}],
            "nullable": False,
        },
    }
})

# Register built-in validators
registry = Registry()
register_builtins(registry)

# Load and validate data
df = pl.scan_csv("data.csv")
result = schema.validate(df, registry)

# Inspect results
print(result.report.summary())
print(result.data.collect())

Creating custom validators

Custom parser (OOP)

import polars as pl
from nyctea.validators.base import ValidatorMetadata
from nyctea.validators.column import ColumnParser


class TrimParser(ColumnParser):
    def __init__(self):
        super().__init__(ValidatorMetadata(
            name="trim",
            description="Remove whitespace",
            tags=["string", "cleaning"],
        ))

    def execute(self, column: pl.Expr, **kwargs) -> pl.Expr:
        return column.str.strip_chars()

    def validate_args(self, **kwargs) -> None:
        pass  # No arguments


registry.register_column_parser(TrimParser())

Custom check (functional)

import polars as pl
from nyctea.validators.decorators import ValidatorDecorator

decorators = ValidatorDecorator(registry)


@decorators.column_check(name="positive", tags=["numeric"])
def is_positive(column: pl.Expr) -> pl.Expr:
    return column > 0

Architecture

Validator[TInput, TOutput]
├── ColumnValidator[pl.Expr, pl.Expr]
│   ├── ColumnParser (transformations)
│   └── ColumnCheck (validations)
└── FrameValidator[pl.LazyFrame, pl.LazyFrame]
    ├── FrameParser (transformations)
    └── FrameCheck (validations)

Registry
├── column_parsers: ValidatorRegistry[ColumnParser]
├── column_checks: ValidatorRegistry[ColumnCheck]
├── frame_parsers: ValidatorRegistry[FrameParser]
└── frame_checks: ValidatorRegistry[FrameCheck]

ValidationPipeline
├── ColumnResolutionPhase (synonyms)
├── ColumnParsingPhase (transformations)
├── CoercionPhase (dtype coercion)
└── ColumnCheckPhase (checks, nullable enforcement)

Testing

uv run pytest tests/ -v
uv run pytest tests/ --cov=src/nyctea --cov-report=term --cov-report=html
uv run ruff check src/ tests/
uv run ty check src/nyctea

CI runs linting, type checking, and the test suite on Python 3.11 through 3.14 for every pull request.

Documentation

Contributing

Contributions are welcome. Open an issue before starting anything beyond a trivial fix; see docs/development/contributing.md for the full workflow (issue-first, branch and PR conventions, CI overview) and DEVELOPMENT.md for local setup.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nyctea-0.2.0b2.tar.gz (46.3 kB view details)

Uploaded Source

Built Distribution

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

nyctea-0.2.0b2-py3-none-any.whl (60.6 kB view details)

Uploaded Python 3

File details

Details for the file nyctea-0.2.0b2.tar.gz.

File metadata

  • Download URL: nyctea-0.2.0b2.tar.gz
  • Upload date:
  • Size: 46.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for nyctea-0.2.0b2.tar.gz
Algorithm Hash digest
SHA256 16026572afea31c760f425f1e4eb74b09903933fa72d3c709a617f2abad2fc0d
MD5 0180e516395a08029a2d30b3cc3dd863
BLAKE2b-256 0db9de09ab5173f65c541e565e94cd2f7c802cca4278803703b35b641e4443a6

See more details on using hashes here.

Provenance

The following attestation bundles were made for nyctea-0.2.0b2.tar.gz:

Publisher: pypi-publish.yaml on yannick-vinkesteijn/nyctea

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

File details

Details for the file nyctea-0.2.0b2-py3-none-any.whl.

File metadata

  • Download URL: nyctea-0.2.0b2-py3-none-any.whl
  • Upload date:
  • Size: 60.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for nyctea-0.2.0b2-py3-none-any.whl
Algorithm Hash digest
SHA256 2cd9ef3a0ffab0dc3b57ed30110fb8746fa068572c7a1944a7bab981d2b1da93
MD5 40ac4b7b464eaa178458e3a40aca5779
BLAKE2b-256 a3d3d3c8e746a530d9c0f947fb195dbb4a38d516da463212b5d741e30cfac6a3

See more details on using hashes here.

Provenance

The following attestation bundles were made for nyctea-0.2.0b2-py3-none-any.whl:

Publisher: pypi-publish.yaml on yannick-vinkesteijn/nyctea

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

Release history Release notifications | RSS feed

This release

0.2.0b2 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page