persistkit
«Сохранение данных» экосистемы S-kits — один дом, три подпакета, три разных
абстракции. Родился волной 4 платформы китов из слияния ormkit (реляционная
БД) и storagekit (объектное хранилище), плюс переехавший из librarykit
pluggable state-слой.
Три подпакета
| Подпакет | Что было раньше | Extra | Зависимости |
|---|---|---|---|
persistkit.sql |
ormkit |
sql |
sqlalchemy>=2.0 (миграции — вложенный extra sql-migrations, alembic) |
persistkit.object |
storagekit |
object |
minio, anyio, Pillow |
persistkit.state |
librarykit.repositories |
— | только corekit (stdlib-only) |
persistkit.state идёт БЕЗ extra — устанавливается вместе с корнем пакета
(pip install s-persistkit) и не тянет ни sqlalchemy, ни minio. В этом его
ценность: сессии/лимиты/идемпотентность для приложения, которому не нужна ни
реляционная БД, ни объектное хранилище.
pip install s-persistkit # только persistkit.state
pip install s-persistkit[sql] # + persistkit.sql
pip install s-persistkit[sql-migrations] # + alembic
pip install s-persistkit[object] # + persistkit.object
pip install "s-persistkit[sql,object]" # всё
Контракт слоёв
persistkit.state не зависит ни от persistkit.sql, ни от
persistkit.object — все три подпакета взаимно независимы. Контракт
закреплён .importlinter (lint-imports в CI) и фитнес-тестом
tests/state/test_no_heavy_deps.py (импорт persistkit.state в подпроцессе
БЕЗ sqlalchemy и minio).
persistkit.sql — фабрика баз, не разделяемая база
Кит НЕ экспортирует общий Base. declarative_base(name) создаёт новый
declarative-класс со своей MetaData на каждый вызов:
from persistkit.sql import declarative_base, IntPkMixin, TimestampMixin
Base = declarative_base("my_app")
class Account(Base, IntPkMixin, TimestampMixin):
__tablename__ = "accounts"
Два вызова declarative_base(...) (даже с одинаковым name) никогда не
делят метаданные — так несколько потребителей кита живут в одном процессе, не
задевая таблиц друг друга при create_all/drop_all.
persistkit.object — без доменного имени Skillery
В отличие от storagekit-донора, здесь нет snapshot_key() — построение
ключа объекта (skills/{id}/versions/{semver}.tar.gz и т.п.) осталось делом
потребителя. PresignedUrlGenerator работает с ключом как с непрозрачной
строкой.
persistkit.state — pluggable-порты состояния
Пять портов (сессии, лимиты, идемпотентность, KV-форма Redis, SQL-форма
asyncpg) и тринадцать реализаций (память, локальный диск на stdlib-sqlite3,
SaaS-адаптеры поверх портов драйвера). Один и тот же сценарий проходит на
любом наборе без правки кода потребителя:
from persistkit.state import memory_repositories, local_repositories
repos = memory_repositories() # тесты
repos = local_repositories(root, sessions=my_store) # ноутбук: sessions — свои
local_repositories требует sessions= явным аргументом — без удобного
default'а на боевое хранилище сессий: persistkit — фундаментный кит, ссылку
на что-либо более высокоуровневое (например, librarykit.sessions) заводить
не должен даже лениво.
Версия
Читается из метаданных установленного дистрибутива (importlib.metadata),
не из литерала __version__ в коде — второй источник правды запрещён (см.
docs/kits/SAFETY-NET.md в devcontour).
Тесты
uv sync --all-extras --group dev
uv run pytest -q
Metadata
Release files for s-persistkit 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| s_persistkit-0.1.0.tar.gz | 150.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| s_persistkit-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 210.4 kB
Release files / s_persistkit-0.1.0.tar.gz
| Download URL | s_persistkit-0.1.0.tar.gz |
|---|---|
| Size | 150.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b089042a8f51224c40c4b500eb8863fcf0ee6422d303fafc36d31b604d6bbf12
|
|
BLAKE2b-256 checksum How to use checksums |
2df2d28c451c6678658a63c15666eb23b25e2243e15db6e2741ea2dbdf77fd05
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / s_persistkit-0.1.0-py3-none-any.whl
| Download URL | s_persistkit-0.1.0-py3-none-any.whl |
|---|---|
| Size | 59.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1e04a92c48177224a58788a1fd74412b2fc8befaf5d89976dc0512a17f3f5187
|
|
BLAKE2b-256 checksum How to use checksums |
07b2005b01cf0faaae1b6b47e84e7a78f130b260ed1fe7ecff96723e562a8275
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|