Skip to content

Commit 0e91a90

Browse files
committed
refactor(webhook): reorganize imports and update documentation for adapters
1 parent 528b51b commit 0e91a90

6 files changed

Lines changed: 22 additions & 27 deletions

File tree

AGENTS.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -897,11 +897,14 @@ uv run pytest tests/ --cov=src --cov-report=html # для детального
897897
- Для webhook показывай `SingleBotEngine`, `AiohttpAdapter` или
898898
`FastAPIAdapter`, `Route`, `Security`, `StaticSecret`, `collect_used_updates`
899899
`WebhookConfig(update_types=...)` для `engine.subscribe(...)`).
900-
- Импортируй из корня пакета: `maxo.transport.webhook` реэкспортирует
901-
`SingleBotEngine`, `TokenEngine`, `Route`, `WebhookConfig`, `BotConfig`,
902-
`AiohttpAdapter` и `FastAPIAdapter`. Последний - под `try/except
903-
ModuleNotFoundError`, чтобы корень не требовал установленного `fastapi`;
904-
добавляешь туда что-то с опциональной зависимостью - делай так же.
900+
- Из корня пакета `maxo.transport.webhook` реэкспортируются только
901+
`SingleBotEngine`, `TokenEngine`, `Route`, `WebhookConfig` и `BotConfig`.
902+
Адаптеры в корень не вынесены - каждый берётся из своего модуля:
903+
`maxo.transport.webhook.web.aiohttp` и `maxo.transport.webhook.web.fastapi`.
904+
Всё, что тянет опциональную зависимость, реэкспорту не подлежит: модуль
905+
импортирует её сверху и вешает
906+
`e.add_note("* Please run \`pip install maxo[...]\`")` (как
907+
`fsm/storages/redis.py` и `integrations/magic_filter.py`).
905908
- `Security` и `StaticSecret` живут в `maxo.transport.webhook.security` и в
906909
корень не вынесены. Промежуточные `engines/__init__.py`, `configs/__init__.py`
907910
и `web/__init__.py` публичной поверхностью не являются: `web/__init__` отдаёт

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,12 +216,12 @@ from maxo import Bot, Dispatcher, Router
216216
from maxo.enums import TextFormat
217217
from maxo.routing.utils import collect_used_updates
218218
from maxo.transport.webhook import (
219-
AiohttpAdapter,
220219
Route,
221220
SingleBotEngine,
222221
WebhookConfig,
223222
)
224223
from maxo.transport.webhook.security import Security, StaticSecret
224+
from maxo.transport.webhook.web.aiohttp import AiohttpAdapter
225225
from maxo.types import BotStarted, MessageCreated
226226

227227
bot = Bot("TOKEN")

docs/pages/event-handling/webhooks.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Webhooks
3131

3232
.. note::
3333

34-
Движки, ``Route``, конфиги и адаптеры импортируются из корня пакета: ``from maxo.transport.webhook import SingleBotEngine, Route, WebhookConfig, AiohttpAdapter``. ``FastAPIAdapter`` тоже лежит там, но появляется только если установлен ``fastapi`` (``maxo[fastapi]``) - без него корень импортируется как обычно. ``Security`` и ``StaticSecret`` берутся из ``maxo.transport.webhook.security``.
34+
Движки, ``Route`` и конфиги импортируются из корня пакета: ``from maxo.transport.webhook import SingleBotEngine, Route, WebhookConfig``. Адаптеры лежат каждый в своём модуле - ``maxo.transport.webhook.web.aiohttp`` и ``maxo.transport.webhook.web.fastapi`` (последний требует ``maxo[fastapi]``). ``Security`` и ``StaticSecret`` берутся из ``maxo.transport.webhook.security``.
3535

3636
Примеры использования
3737
---------------------
@@ -53,12 +53,12 @@ Webhooks
5353
from maxo.enums import TextFormat
5454
from maxo.routing.utils import collect_used_updates
5555
from maxo.transport.webhook import (
56-
AiohttpAdapter,
5756
Route,
5857
SingleBotEngine,
5958
WebhookConfig,
6059
)
6160
from maxo.transport.webhook.security import Security, StaticSecret
61+
from maxo.transport.webhook.web.aiohttp import AiohttpAdapter
6262
from maxo.types import MessageCreated
6363
6464
dp = Dispatcher()
@@ -116,12 +116,12 @@ Webhooks
116116
from maxo.enums import TextFormat
117117
from maxo.routing.utils import collect_used_updates
118118
from maxo.transport.webhook import (
119-
FastAPIAdapter,
120119
Route,
121120
SingleBotEngine,
122121
WebhookConfig,
123122
)
124123
from maxo.transport.webhook.security import Security, StaticSecret
124+
from maxo.transport.webhook.web.fastapi import FastAPIAdapter
125125
from maxo.types import MessageCreated
126126
127127
dp = Dispatcher()

src/maxo/transport/webhook/__init__.py

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,11 @@
2929
from maxo.transport.webhook.engines.single import SingleBotEngine
3030
from maxo.transport.webhook.engines.token import TokenEngine
3131
from maxo.transport.webhook.route.route import Route
32-
from maxo.transport.webhook.web.aiohttp import AiohttpAdapter
3332

34-
__all__ = [
35-
"AiohttpAdapter",
33+
__all__ = (
3634
"BotConfig",
3735
"Route",
3836
"SingleBotEngine",
3937
"TokenEngine",
4038
"WebhookConfig",
41-
]
42-
43-
44-
try:
45-
from maxo.transport.webhook.web.fastapi import FastAPIAdapter # noqa: F401
46-
47-
__all__.insert(2, "FastAPIAdapter")
48-
except ModuleNotFoundError as exc:
49-
if exc.name != "fastapi":
50-
raise
39+
)

src/maxo/transport/webhook/web/fastapi.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1+
try:
2+
from fastapi import APIRouter, FastAPI, Request, Response
3+
from fastapi.responses import JSONResponse
4+
except ImportError as e:
5+
e.add_note("* Please run `pip install maxo[fastapi]`")
6+
raise
7+
18
from collections.abc import AsyncGenerator, Mapping
29
from contextlib import asynccontextmanager
310
from typing import Any
411

5-
from fastapi import APIRouter, FastAPI, Request, Response
6-
from fastapi.responses import JSONResponse
712
from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy
813

914
from maxo.transport.webhook.web.base import (

tests/maxo_webhook/test_security.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@ async def test_security_pipeline_stops_at_first_failed_check() -> None:
3333

3434

3535
@pytest.mark.asyncio
36-
async def test_security_pipeline_allows_request_when_secret_and_checks_pass() -> (
37-
None
38-
):
36+
async def test_security_pipeline_allows_request_when_secret_and_checks_pass() -> None:
3937
calls: list[str] = []
4038
security = Security(
4139
RecordingCheck("check", result=True, calls=calls),

0 commit comments

Comments
 (0)