Human-readable file persistence for Python dataclasses.
Project description
snapclass
Human-readable file persistence for Python dataclasses, an adaptation of the cool datafiles project.
snapclass is a small persistence layer built around Python dataclasses.
Decorate a dataclass, give it a path pattern, and its instances can save and
load themselves as readable YAML, JSON, TOML, or text.
It is built for the stuff that belongs in a repo or project folder: prompts, configs, fixtures, lightweight app state, and little durable objects with names.
You can use a Stash to pick a different location for the
serialized file (with env overrides) and have special format rules when you
need. You can also include a sidecar when you have a doc or binary you want to save next to it.
ORM is a snap!
from snapclass import snapclass
@snapclass("{self.name}.yml")
class Note:
name: str
title: str
body: str = ""
mynote = Note(
"first_note",
"Today I used snapclass!",
"It was my first day of snapclass. My note was saved to YAML for me!",
)
mynote.snapshot.save()
# Load it back later with the same name.
same_note = Note.snapshots.get("first_note")
from snapclass import snapclass, Stash, Fresh
# Create a default location with an environment override.
runsloc = Stash("./runs", env="RUNS_DIR")
@snapclass("{self.name}.yml", stash=runsloc)
class RunData:
name: str
# shortcuts for common boilerplate factory code
metrics: dict[str, float] = Fresh.Dict
RunData("baseline", {"accuracy": 0.98, "loss": 0.04}).snapshot.save()
from snapclass import snapclass, Stash, sidecar
@snapclass
class Style:
voice: str
temperature: float
# Locations can be nested with stashes.
app = Stash("./myapp", env="MYAPP_DATA")
articles = app / "articles"
@snapclass("{self.slug}/article.yml", stash=articles)
class Article:
slug: str
title: str
style: Style
body: str = sidecar.text("{self.slug}.md")
article = Article(
"dusk-court",
"Dusk Court",
Style("warm", 0.4),
body="# Dusk Court\n\nBe brief, warm, and useful.\n",
)
loaded = Article.snapshots.get("dusk-court")
FAQ
Why use snapclass over datafiles?
datafiles is great and you should absolutely use it for your app or script! I love it so much and use it in project after project. After years of use, I've run into a few limitations-- like issues when multiple modules needed different datafiles behavior in one process (because much of the behavior control is global). I designed snapclass to isolate some of that via stashes and added some extra features I liked along the way.
License
snapclass is licensed under the MIT License. See LICENSE.
Much of snapclass's core behavior, along with portions of its implementation
and test suite, is adapted from the wonderful datafiles project by Jace Browning. See THIRD_PARTY_NOTICES.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 snapclass-0.1.0.tar.gz.
File metadata
- Download URL: snapclass-0.1.0.tar.gz
- Upload date:
- Size: 78.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d1484e07cb47ae83a561a0329a563c9be555368fc525c871c700c4118bdf8199
|
|
| MD5 |
d5c4ca8ba2cb00bf08703343b35c6658
|
|
| BLAKE2b-256 |
25626d4f2bd2fb59ef35b1d511ff884f14432bda67929b70eeb8e6421b3ee7b2
|
Provenance
The following attestation bundles were made for snapclass-0.1.0.tar.gz:
Publisher:
release.yml on Mattie/snapclass
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
snapclass-0.1.0.tar.gz -
Subject digest:
d1484e07cb47ae83a561a0329a563c9be555368fc525c871c700c4118bdf8199 - Sigstore transparency entry: 1931886962
- Sigstore integration time:
-
Permalink:
Mattie/snapclass@fd98e537e976e8605602e8d439da039a3075b378 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Mattie
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@fd98e537e976e8605602e8d439da039a3075b378 -
Trigger Event:
release
-
Statement type:
File details
Details for the file snapclass-0.1.0-py3-none-any.whl.
File metadata
- Download URL: snapclass-0.1.0-py3-none-any.whl
- Upload date:
- Size: 37.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1f7faf3d01efa1339a311f2a7b5540c851c6e0c561438c15118dafa580fadfac
|
|
| MD5 |
287d74afd52d154526c1b5346f16914e
|
|
| BLAKE2b-256 |
f90cd383ba7b2af03dc22b31f94a53a414fc75c6b4019bce393c2021f205f98f
|
Provenance
The following attestation bundles were made for snapclass-0.1.0-py3-none-any.whl:
Publisher:
release.yml on Mattie/snapclass
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
snapclass-0.1.0-py3-none-any.whl -
Subject digest:
1f7faf3d01efa1339a311f2a7b5540c851c6e0c561438c15118dafa580fadfac - Sigstore transparency entry: 1931887068
- Sigstore integration time:
-
Permalink:
Mattie/snapclass@fd98e537e976e8605602e8d439da039a3075b378 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Mattie
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@fd98e537e976e8605602e8d439da039a3075b378 -
Trigger Event:
release
-
Statement type: