Python SDK for Ecstasy API
Project description
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.
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 ecstasy_sdk-0.1.1.tar.gz.
File metadata
- Download URL: ecstasy_sdk-0.1.1.tar.gz
- Upload date:
- Size: 86.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6c8f59caef29cc282b9554b550ff2e5693bceb526f225897cd6d915ece083d0a
|
|
| MD5 |
aefbda1a83ed6294d519ad2722b27b97
|
|
| BLAKE2b-256 |
105759f1fee393935229b7d75efc6ee5e3ab9e5ba9180ec57d319e8f4325278d
|
Provenance
The following attestation bundles were made for ecstasy_sdk-0.1.1.tar.gz:
Publisher:
ci-publish.yml on ig-rudenko/ecstasy-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ecstasy_sdk-0.1.1.tar.gz -
Subject digest:
6c8f59caef29cc282b9554b550ff2e5693bceb526f225897cd6d915ece083d0a - Sigstore transparency entry: 1458955007
- Sigstore integration time:
-
Permalink:
ig-rudenko/ecstasy-sdk@168fbf990fbf57e81d141c3e827325aee9f2de08 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/ig-rudenko
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci-publish.yml@168fbf990fbf57e81d141c3e827325aee9f2de08 -
Trigger Event:
push
-
Statement type:
File details
Details for the file ecstasy_sdk-0.1.1-py3-none-any.whl.
File metadata
- Download URL: ecstasy_sdk-0.1.1-py3-none-any.whl
- Upload date:
- Size: 42.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7b39dd5b45da4e7d125541bbac251e2c98fe8fab799a7390ebb3f8281408c869
|
|
| MD5 |
9e26eefd474e5a0bdefd0d1b7d56822b
|
|
| BLAKE2b-256 |
bd2ed8c99df8c31ed911d9572558bc730c99ab8049158a178d280e910e7d7fc9
|
Provenance
The following attestation bundles were made for ecstasy_sdk-0.1.1-py3-none-any.whl:
Publisher:
ci-publish.yml on ig-rudenko/ecstasy-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ecstasy_sdk-0.1.1-py3-none-any.whl -
Subject digest:
7b39dd5b45da4e7d125541bbac251e2c98fe8fab799a7390ebb3f8281408c869 - Sigstore transparency entry: 1458955147
- Sigstore integration time:
-
Permalink:
ig-rudenko/ecstasy-sdk@168fbf990fbf57e81d141c3e827325aee9f2de08 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/ig-rudenko
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci-publish.yml@168fbf990fbf57e81d141c3e827325aee9f2de08 -
Trigger Event:
push
-
Statement type: