s-corekit — основание экосистемы китов
Значения и чистые правила, на которые опираются остальные пакеты семейства: контекст исполнения, базовые DTO, единая иерархия ошибок, маскировка секретов и классификация состояния доступа. Ноль зависимостей — только stdlib.
clikit adapterkit ветки-оболочки (CLI, адаптеры сервисов)
\ /
librarykit оркестратор (сеть, сессии, браузер)
|
corekit основание (значения и правила)
Установка
pip install s-corekit
Импортируется как corekit. Требуется Python 3.11+.
Быстрый старт
from corekit import ExecutionContext, classify_access, AccessState
from corekit import sanitize_headers, scrub_credentials, RETRYABLE
# 1. Контекст вызова: чей он и под каким профилем идёт.
ctx = ExecutionContext(tenant="acme", profile="main")
ctx.tenant_id, ctx.profile_name # ('acme', 'main')
# 2. Диагноз по УЛИКЕ, без единого сетевого запроса:
# 200 OK, но конечный URL — страница входа => сессия мертва.
verdict = classify_access(status=200, final_url="https://accounts.google.com/ServiceLogin")
verdict.state # AccessState.SESSION_DEAD
verdict.why # "сервер оценил куки и увёл на вход (улика: ...)"
verdict.evidence # исходная улика, на которой стоит вердикт
# 3. Секреты не утекают в логи.
sanitize_headers({"Authorization": "Bearer ...", "X-Trace": "1"})
# {'authorization': '***', 'x-trace': '1'}
scrub_credentials("socks5://user:pass@127.0.0.1:1080 недоступен")
# 'socks5://***@127.0.0.1:1080 недоступен'
# 4. Одна иерархия ошибок на весь стек + готовый набор «можно повторить».
RETRYABLE # (RateLimited, ServerError, TransportError)
Что внутри
| Модуль | Что даёт |
|---|---|
corekit.context |
ExecutionContext — чей вызов, где его состояние, куда он ходит в сеть. Один тип на экосистему: понимает имена обеих школ (tenant/tenant_id, profile/profile_name) и отказывается угадывать при конфликте значений |
corekit.dto |
SessionRef, Creds, RequestBody |
corekit.limits |
QuotaScope, QuotaInfo, LimitSpec |
corekit.enums |
PaginationMode, AuthMode, TransportKind / RequestExecutionMode |
corekit.errors |
Единая иерархия исключений: CliError → AuthRequired / RateLimited / Blocked / TransportError / … + кортеж RETRYABLE |
corekit.redaction |
Маскировка секретов в заголовках, теле и тексте (sanitize_headers, sanitize_body, scrub_credentials) |
corekit.diagnosis |
Таксономия причин (Reason) и состояние доступа (AccessState, AccessVerdict, classify_access) — диагноз по улике, без сети |
corekit.persona |
ClientPersona — «чем мы выглядим» одним значением (заголовки, часы, экран, рукопожатие, выход) плюс правила согласованности слоёв: inconsistencies(), is_consistent(), bump() |
Персона: противоречие вместо отпечатка
from corekit import ClientPersona
persona = ClientPersona(
persona_id="acc-42:gemini", version=1,
browser="chrome", browser_version="151.0.7922.76",
platform="Windows", platform_version="15.0.0",
architecture="x86", bitness="64", mobile=False, model="",
accept_language="ru-RU,ru;q=0.9", locale="ru-RU", timezone="Europe/Moscow",
screen=(1920, 1080), viewport=(1536, 864),
tls_target="chrome146", http_version="http/1.1",
egress_country="FI", egress_kind="datacenter",
)
for item in persona.inconsistencies():
print(item.severity, item.code, item.layers)
# error tls-behind-ua ('tls', 'user-agent')
# error http-version-mismatch ('http', 'user-agent')
# error timezone-vs-egress ('timezone', 'egress')
# warning language-vs-egress ('accept-language', 'egress')
# warning egress-datacenter ('egress',)
persona.is_consistent() # False — ошибки уровня error есть
Каждый слой здесь корректен ПОРОЗНЬ, и ловят нас не они, а стыки: рукопожатие 146-го Chrome под заголовками 151-го, HTTP/1.1 под современным Chrome, московские часы при финском выходе. Согласованная персона не возвращает НИЧЕГО — ни одного предупреждения «на всякий случай».
Правило отбора
В основание попадает сущность, которая не тянет реализацию: неизменяемое
значение или чистая функция над текстом/статусом. Всё, у чего есть жизненный
цикл (клиенты, сторы, браузеры, локи), живёт слоем выше — в s-librarykit.
Поэтому зависимостей нет и не будет: dependencies = [] закреплено тестом
tests/test_stdlib_only.py. Основание обязано ставиться и туда, где httpx,
pydantic или cryptography поставить нельзя.
Совместимость с librarykit
Начиная с s-librarykit 0.7.6 модули librarykit.contract, librarykit.errors,
librarykit.redaction и librarykit.diagnosis.* — тонкие реэкспорты этого
пакета. Они отдают те же объекты, а не копии, поэтому isinstance, except
и сравнение через is работают через любой путь импорта:
from librarykit.errors import CliError as ViaLibrarykit
from corekit.errors import CliError as ViaCorekit
assert ViaLibrarykit is ViaCorekit
Существующий код, импортирующий эти имена из librarykit, менять не нужно.
Цена импорта (замер, а не обещание)
Python 3.14, Windows, холодный интерпретатор, 3 прогона:
| что | мс |
|---|---|
пол stdlib (dataclasses+pathlib+enum+re+json+datetime) |
77-85 |
import corekit поверх пола |
24-30 |
import librarykit поверх того же пола |
151-162 |
полный import corekit / import librarykit |
~105 / ~246 |
Тест меряет цену над полом: абсолютное число описывает машину, а не код, и
абсолютный порог пришлось бы задрать так, что приехавший httpx (264 мс)
прошёл бы незамеченным.
Лицензия
MIT — см. LICENSE.
Metadata
Release files for s-corekit 0.1.1
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_corekit-0.1.1.tar.gz | 167.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| s_corekit-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 289.8 kB
Release files / s_corekit-0.1.1.tar.gz
| Download URL | s_corekit-0.1.1.tar.gz |
|---|---|
| Size | 167.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7a890b257a9eb3cf6d241d45f86afb47e7f78899f1db10e5ee8e4e6507d4193b
|
|
BLAKE2b-256 checksum How to use checksums |
a04d09afaf4364dbf088817e5d89e0550db29dfea1b9023d4f5f196a50b32789
|
| 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_corekit-0.1.1-py3-none-any.whl
| Download URL | s_corekit-0.1.1-py3-none-any.whl |
|---|---|
| Size | 122.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ac216715f2bfce681c59249a72c615cf0490b9ebd21d905f0e52ca8335ab61ef
|
|
BLAKE2b-256 checksum How to use checksums |
fa34cff5b43bfa5f6933f75cc2d583d689d49f23cf65d5c1cb7fd003281bff6d
|
| 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}
|