Переиспользуемый SDK сетевых адаптеров: Transport/Auth/RetryPolicy/HttpClient, ErrorMap, пагинация, браузер/антибот-транспорты, SessionStore, BaseAdapter + контракт плагинов. Тонкий коннектор поверх librarykit.
Project description
adapterkit
Тонкий коннектор сетевых адаптеров поверх librarykit. adapterkit отвечает на один вопрос: «как подключить сетевой адаптер к приложению». Он даёт декларативный контракт плагина, реестр с автодискавери через entry-points и базовый фасад адаптера — а весь сетевой движок (transport/auth/retry/errmap/ pagination/sessions/antibot/browser) реэкспортирует из librarykit, не дублируя его. Пишется один раз, переиспользуется любым доменным пакетом.
librarykit ← КОРЕНЬ: весь сетевой движок (transport/auth/retry/errmap/
pagination/sessions/antibot/browser)
▲
adapterkit ← ЭТОТ КИТ: контракт NetworkAdapter + registry (entry-points) +
BaseAdapter + orchestration_api.
Остальное — тонкий реэкспорт-шим из librarykit.
▲
домен ← конкретные адаптеры (endpoint-таблица + мапперы на сеть)
Зависимости направлены только внутрь: adapterkit зависит от librarykit
(и от clikit для CLI-примитивов), но НЕ от домена. Адаптеры кодируются против
стабильных typing.Protocol из adapterkit.contract (структурный контракт, а не
наследование от домена). Композиция конкретных реализаций — единственный
composition root на приложение.
Установка
uv add s-adapterkit
Имя дистрибутива — s-adapterkit, имя для импорта — adapterkit. Граф китов
(librarykit, clikit) подтянется автоматически как транзитивные зависимости.
Опциональные extra:
uv add "s-adapterkit[browser]" # Playwright — browser-login
uv add "s-adapterkit[antibot]" # curl-cffi — JA3-impersonate
uv add "s-adapterkit[oauth]" # authlib — OAuth2-flows
Быстрый старт
Описать адаптер декларативно и зарегистрировать его в реестре:
from adapterkit import BaseAdapter, Endpoint, register_adapter
class TwitterAdapter(BaseAdapter):
api_version = 1
endpoints = {
"search": Endpoint(name="search", method="GET", path="/2/tweets/search/recent"),
}
register_adapter("twitter", TwitterAdapter)
Либо отдать адаптер на автодискавери — объявить entry-point в своём pyproject.toml,
и любой потребитель adapterkit подхватит его без явного импорта:
[project.entry-points."adapterkit.adapters"]
twitter = "my_package.adapter:TwitterAdapter"
from adapterkit import discover_adapters, get_adapter_class
discover_adapters() # загрузить все плагины из entry-points
cls = get_adapter_class("twitter") # получить класс по имени сервиса
Карта модулей
| Модуль | Назначение | Реализация |
|---|---|---|
contract.py |
граничные Protocol (NetworkAdapter/Transport/Auth/ErrorMapper/Paginator/SessionStoreProtocol) + DTO (Endpoint/SessionRef/Creds) + ADAPTER_API_VERSION/MIN_SUPPORTED_API_VERSION |
контракт коннектора |
registry.py |
AdapterRegistry + автодискавери через entry-points adapterkit.adapters, ленивая загрузка, ручная регистрация |
код коннектора |
base.py |
BaseAdapter + ресурс-под-сервисы (ContentResource/CommentsResource/MetricsResource/SearchResource) — Stripe-стиль фасад |
код коннектора |
orchestration_api.py |
тонкий registry-driven API: onboard_all / health_check_all (без импортов домена) |
код коннектора |
onboarding_contract.py |
онбординг/health-контракты (LoginMode/OnboardingProtocol/HealthProtocol, api_version 2) |
реэкспорт librarykit.protocols |
errors.py |
единая иерархия ошибок | реэкспорт librarykit.errors |
retry.py |
header-driven RetryPolicy |
реэкспорт librarykit.retry |
transport.py / client.py |
HttpxTransport + choke-point HttpClient |
реэкспорт librarykit.transport |
auth.py |
TokenAuth/OAuth2Auth/CookieSessionAuth/BrowserLoginAuth |
реэкспорт librarykit.auth |
errmap.py |
декларативная карта ответ → доменная ошибка | реэкспорт librarykit.errmap |
pagination.py |
CursorPaginator (offset/cursor/page) |
реэкспорт librarykit.pagination |
sessions.py |
envelope-шифрованный SessionStore |
реэкспорт librarykit.sessions |
antibot.py |
выбор транспорта Tier 0-4 (curl-cffi JA3 / CDP) | реэкспорт librarykit.antibot |
browser.py |
warm/cold-login (требует extra browser) |
реэкспорт librarykit.browser |
Всё, что помечено «реэкспорт», — тонкий shim: единая реализация живёт в librarykit,
adapterkit лишь предоставляет её под привычным именем. Собственный код коннектора —
только contract/registry/base/orchestration_api.
Разработка
uv sync --extra dev
uv run --extra dev pytest -q
uv run --extra dev ruff check adapterkit
Граф китов (librarykit/clikit) тянется из публичной группы
gitlab.com/S-kits как git-зависимости. Для локальной
правки кита временно укажите path-источник в [tool.uv.sources] (см. комментарий
в pyproject.toml) и выполните uv lock --upgrade.
Лицензия
MIT © 2026 Dmitry.
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 s_adapterkit-0.1.2.tar.gz.
File metadata
- Download URL: s_adapterkit-0.1.2.tar.gz
- Upload date:
- Size: 69.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a166be8ec452e7efc7fe0f3dd7dc0dea625186f047841b8fbe755c4b9eff9801
|
|
| MD5 |
9356ae3d782c800acdb2c9717c90e74e
|
|
| BLAKE2b-256 |
103aee47674a86943029049121365c66fab69057537ffb26eb74882380a90bb9
|
File details
Details for the file s_adapterkit-0.1.2-py3-none-any.whl.
File metadata
- Download URL: s_adapterkit-0.1.2-py3-none-any.whl
- Upload date:
- Size: 44.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d85013e6c68cc2e3943f9e0b50f25dc8346c3ef19ecde4979d156f00c1c3bf11
|
|
| MD5 |
1497232c4c2a528ed7960749461ebf03
|
|
| BLAKE2b-256 |
3219956819ccf10b0d66203c688a9838e53746a83f71c0a60d43eb7412487850
|