Skip to main content

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)

Source distribution for s-persistkit 0.1.0
File Size Uploaded
s_persistkit-0.1.0.tar.gz 150.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for s-persistkit 0.1.0
File Interpreter ABI Platform
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}

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page