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 (онион-граф
librarykit <- adapterkit <- clikit: clikit — слой ВЫШЕ, adapterkit его не
импортит). Адаптеры кодируются против
стабильных typing.Protocol из adapterkit.contract (структурный контракт, а не
наследование от домена). Композиция конкретных реализаций — единственный
composition root на приложение.
Установка
uv add s-adapterkit
Имя дистрибутива — s-adapterkit, имя для импорта — adapterkit. librarykit
подтянется автоматически как транзитивная зависимость.
Опциональные 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 тянется из публичной группы
gitlab.com/S-kits. Для локальной
правки кита временно укажите path-источник в [tool.uv.sources] (см. комментарий
в pyproject.toml) и выполните uv lock --upgrade.
Лицензия
MIT © 2026 Dmitry.
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.4.tar.gz.
File metadata
- Download URL: s_adapterkit-0.1.4.tar.gz
- Upload date:
- Size: 74.5 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 |
cf9dd46779e4d8b58e02664066162bf6fd4f7c4ed2c186b5314780cdc2af9304
|
|
| MD5 |
2d95dfb0bdc46cc18a350e4aff1bc6a6
|
|
| BLAKE2b-256 |
d8ebdb6d0ffbd83fd12f06054a9e560e380345c718c9ddba6943839a699a7859
|
File details
Details for the file s_adapterkit-0.1.4-py3-none-any.whl.
File metadata
- Download URL: s_adapterkit-0.1.4-py3-none-any.whl
- Upload date:
- Size: 45.7 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 |
fd565f7d8f017aa630ab5678959f1c6864d0b30a695300c863b6c87d133f4425
|
|
| MD5 |
ee50bead7b153504f638f71d9eec0fde
|
|
| BLAKE2b-256 |
90c658d031a65ca814f8ffd89e1102696e13c1ac6f6e94eef15457ac41af6d4a
|