Documents schema and data validation
Project description
Dictify
Lightweight validation for Python mappings and JSON-like documents.
dictify is a lightweight validation library for standalone fields and mapping-shaped models.
It is designed for small schema layers, partial validation, and annotation-first models with explicit dict-like behavior.
- Python
3.12+ - Use
Field(...)for defaults, required fields, and extra validators - Use Python annotations to declare
Modelfield types - Access model data with either attributes or mapping syntax
Why Dictify?
- Validate a single value with
Field(...)without defining a full model - Define annotation-first
Modelclasses for dict-shaped documents - Keep mapping access and attribute access together
- Handle unknown keys and public attributes explicitly with
strict - Convert back to plain Python data with
dict(model)andmodel.dict()
Install
pip install dictify
Quick Example
from datetime import UTC, datetime
from typing import Annotated
from dictify import Field, Model
class Note(Model):
title: str = Field(required=True).verify(
lambda value: len(value) <= 300,
"Title must be 300 characters or fewer",
)
content: str = Field()
timestamp: Annotated[datetime, "creation time"] = Field(
default=lambda: datetime.now(UTC)
)
note = Note({"title": "Dictify", "content": "dictify is easy"})
note.content = "Updated content"
note["content"] = "Updated again"
# These raise Model.Error.
note.title = 0
note["title"] = 0
Strict Mode
Model is strict by default.
strict=Truerejects undeclared keys and undeclared public attributesstrict=Falsestores undeclared keys and attributes as extra model data
note = Note({"title": "Dictify"}, strict=False)
note.category = "docs"
assert note["category"] == "docs"
assert dict(note)["category"] == "docs"
Native Conversion
Use explicit conversion when you need plain Python data.
import json
note_dict = dict(note) # shallow dict conversion
note_native = note.dict() # recursive dict/list conversion
note_json = json.dumps(note.dict())
Standalone Fields
Field.instance(...) still works well for standalone validation.
email = Field(required=True).instance(str).match(r".+@.+")
email.value = "user@example.com"
AI Skill
dictify ships with an installed CLI for the packaged AI skill.
dictify ai-skill-install
The installer prompts for the exact destination folder and defaults to:
./.agents/skills/dictify-usage
If the destination already exists, dictify asks before overwriting it.
Typing Status
The annotation-first model API is fully supported at runtime.
Static type checker support for declarations like email: str = Field(...) is still limited and may require cast(Any, Field(...)) depending on the checker and editor.
Documentation
- Docs: https://nitipit.github.io/dictify/
- Usage: https://nitipit.github.io/dictify/guide/usage/
- AI Skill: https://nitipit.github.io/dictify/guide/ai-skill/
- Field API: https://nitipit.github.io/dictify/guide/field-api/
- Validation Recipes: https://nitipit.github.io/dictify/guide/validation-recipes/
- Changelog: https://github.com/nitipit/dictify/blob/dev/CHANGELOG.md
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dictify-4.0.1.tar.gz.
File metadata
- Download URL: dictify-4.0.1.tar.gz
- Upload date:
- Size: 15.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"43","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
945f645ca9f2f85c8614ae22823f2d2f29ebeeb2bf4e740cd734bcee00de0558
|
|
| MD5 |
dc1afb854792f0761690c43239fe83ef
|
|
| BLAKE2b-256 |
5091302642558b9a6d5e7cd9f4056d4e0febae7010294bc12b50ad0f0c372b89
|
File details
Details for the file dictify-4.0.1-py3-none-any.whl.
File metadata
- Download URL: dictify-4.0.1-py3-none-any.whl
- Upload date:
- Size: 22.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"43","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf5a0500deb2046c01a8e736f0c5d0d1d29c3307edb08112b03ec06114674a2c
|
|
| MD5 |
c5f761395e51becb9e49132bfb0f15d4
|
|
| BLAKE2b-256 |
1c31ca3a3e15f2c8a6ddc72b022cb0e037113560fda0d0e3541017ea880cfa6b
|