ecstasy-sdk
Python SDK для работы с Ecstasy API v1.
Библиотека предоставляет синхронный и асинхронный клиенты, Pydantic-схемы запросов и ответов, типизированные resource-клиенты по группам API и единый транспорт на базе httpx.
Возможности
- Sync клиент:
EcstasyClient. - Async клиент:
AsyncEcstasyClient. - Авторизация через заголовок
Authorization. - Поддержка базового пути API
/api/v1. - Pydantic v2 модели для swagger definitions.
- Resource-клиенты для
Accounts,Devices,GPON,Gather,Maps,Ring Manager,Tools. - DRF pagination через
Page[T]. - Единая иерархия SDK-исключений.
- Типизированный пакет с
py.typed.
Установка
После публикации в PyPI:
pip install ecstasy-sdk
Для локальной разработки:
uv sync
Для запуска тестов и инструментов разработки:
uv sync --extra dev
Быстрый старт
Синхронный клиент
from ecstasy_sdk import EcstasyClient
client = EcstasyClient(
base_url="https://ecstasy.example.com",
token="<api-token>",
)
try:
users = client.accounts.get_myself()
device = client.devices.get("switch-01")
interfaces = client.devices.list_interfaces("switch-01")
finally:
client.close()
Можно использовать context manager:
from ecstasy_sdk import EcstasyClient
with EcstasyClient("https://ecstasy.example.com", "<api-token>") as client:
page = client.devices.list(page=1)
for device in page.results:
print(device.name, device.ip)
Асинхронный клиент
from ecstasy_sdk import AsyncEcstasyClient
async def main() -> None:
async with AsyncEcstasyClient(
base_url="https://ecstasy.example.com",
token="<api-token>",
) as client:
users = await client.accounts.get_myself()
device = await client.devices.get("switch-01")
interfaces = await client.devices.list_interfaces("switch-01")
Авторизация
SDK всегда отправляет токен в заголовке Authorization с префиксом Token.
Передавайте только значение API-токена без префикса:
client = EcstasyClient(
base_url="https://ecstasy.example.com",
token="abc123",
)
Итоговый HTTP-заголовок будет таким:
Authorization: Token abc123
Resource-клиенты
У клиента доступны группы API:
client.accounts
client.devices
client.gpon
client.gather
client.maps
client.ring_manager
client.tools
Асинхронный клиент имеет те же группы и те же имена методов, но методы нужно вызывать через await.
Примеры
Accounts
users = client.accounts.get_myself()
permissions = client.accounts.get_permissions()
oidc_config = client.accounts.get_oidc_config()
Devices
devices_page = client.devices.list(page=1, group="access")
all_devices = client.devices.list_all(vendor="Huawei")
device = client.devices.get("switch-01")
interfaces = client.devices.list_interfaces(
"switch-01",
add_links=True,
add_comments=True,
)
macs = client.devices.list_macs("switch-01", port="GigabitEthernet0/1")
configs = client.devices.list_configs("switch-01")
Создание или обновление выполняется через Pydantic-модели:
from ecstasy_sdk.models import DevicesDetailUpdate
payload = DevicesDetailUpdate(
ip="192.0.2.10",
name="switch-01",
auth_group=1,
group="access",
)
updated = client.devices.update("switch-01", payload)
GPON
customers = client.gpon.list_customers()
customer = client.gpon.get_customers("123")
subscriber_data = client.gpon.list_subscriber_data()
tech_data = client.gpon.get_tech_data("olt-01")
Tools
vendor = client.tools.get_mac_vendor("00:11:22:33:44:55")
vlan_desc = client.tools.get_vlan_desc(vlan=100)
trace = client.tools.get_vlan_traceroute(vlan=100, graph_min_length=3)
found = client.tools.find_by_desc(pattern="client", is_regex=False)
Пагинация
Endpoint'ы с DRF pagination возвращают Page[T]:
page = client.devices.list(page=1)
print(page.count)
print(page.next)
for device in page.results:
print(device.name)
Обработка ошибок
SDK преобразует HTTP-ошибки в исключения ecstasy_sdk.exceptions.
from ecstasy_sdk import EcstasyClient
from ecstasy_sdk.exceptions import EcstasyAPIError, EcstasyForbiddenError
client = EcstasyClient("https://ecstasy.example.com", "<api-token>")
try:
device = client.devices.get("switch-01")
except EcstasyForbiddenError:
print("Недостаточно прав")
except EcstasyAPIError as exc:
print(exc.status_code)
print(exc.response_json)
finally:
client.close()
Основные исключения:
EcstasyBadRequestErrorдля HTTP 400.EcstasyUnauthorizedErrorдля HTTP 401.EcstasyForbiddenErrorдля HTTP 403.EcstasyNotFoundErrorдля HTTP 404.EcstasyConflictErrorдля HTTP 409.EcstasyValidationErrorдля HTTP 422.EcstasyServerErrorдля HTTP 5xx.EcstasyTransportErrorдля сетевых ошибок.EcstasyTimeoutErrorдля timeout.EcstasyResponseValidationErrorдля ошибок Pydantic-валидации ответа.
Сырые ответы
Если в swagger для endpoint'а нет response schema, SDK возвращает raw payload:
dict[str, Any]илиlist[Any]для JSON;strдля текстовых ответов;bytesдля бинарных ответов;Noneдля HTTP 204.
Генерация кода из swagger
Основной код моделей и resource-клиентов можно регенерировать из docs/swagger.json:
uv run python scripts/generate_sdk.py
После регенерации нужно выполнить проверки:
./checks.sh
Проверки разработки
Текущий набор проверок:
uv run ruff check --fix ecstasy_sdk
uv run black -l 110 ecstasy_sdk
uv run mypy ecstasy_sdk
uv run --extra dev pytest
Требования
- Python
>=3.12. httpx.pydantic.typing-extensionsдля Python ниже 3.13.
Статус
Пакет находится в начальной стадии разработки 0.x. Публичный API может уточняться по мере проверки SDK на реальном Ecstasy API.
Metadata
Release files for ecstasy-sdk 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 | |
|---|---|---|---|
| ecstasy_sdk-0.1.1.tar.gz | 86.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ecstasy_sdk-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 128.9 kB
Release files / ecstasy_sdk-0.1.1.tar.gz
| Download URL | ecstasy_sdk-0.1.1.tar.gz |
|---|---|
| Size | 86.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6c8f59caef29cc282b9554b550ff2e5693bceb526f225897cd6d915ece083d0a
|
|
BLAKE2b-256 checksum How to use checksums |
105759f1fee393935229b7d75efc6ee5e3ab9e5ba9180ec57d319e8f4325278d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 7, 2026.
Transparency logRelease files / ecstasy_sdk-0.1.1-py3-none-any.whl
| Download URL | ecstasy_sdk-0.1.1-py3-none-any.whl |
|---|---|
| Size | 42.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7b39dd5b45da4e7d125541bbac251e2c98fe8fab799a7390ebb3f8281408c869
|
|
BLAKE2b-256 checksum How to use checksums |
bd2ed8c99df8c31ed911d9572558bc730c99ab8049158a178d280e910e7d7fc9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 7, 2026.
Transparency log