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.
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 s_corekit-0.0.12.tar.gz.
File metadata
- Download URL: s_corekit-0.0.12.tar.gz
- Upload date:
- Size: 99.0 kB
- Tags: Source
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6a2888bbff489b327721412c02d7fad59ebb8ca270a967aa6f0d2eb9576e1579
|
|
| MD5 |
6d112b842f3a443ef77236faa0cd3d41
|
|
| BLAKE2b-256 |
53bb07c874ee33b8fd26ec02a29f261b251a059ec94e8f0d86afeba49dbaca3c
|
File details
Details for the file s_corekit-0.0.12-py3-none-any.whl.
File metadata
- Download URL: s_corekit-0.0.12-py3-none-any.whl
- Upload date:
- Size: 83.6 kB
- Tags: Python 3
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
551d9c116180f5ae9f6cd5c6d464aec436ffd8ea86f3ebd9687524561bc44f61
|
|
| MD5 |
3dc155d5a2a815119973287df07c38ea
|
|
| BLAKE2b-256 |
dfda7d67859f6a3f4597db131c93334072d25f960b6d548f2a2d57fcb7b2f875
|