Skip to content

feat: добавлен менеджер контекстов#156

Open
love-apples wants to merge 3 commits into
mainfrom
feat/context-manager
Open

feat: добавлен менеджер контекстов#156
love-apples wants to merge 3 commits into
mainfrom
feat/context-manager

Conversation

@love-apples

@love-apples love-apples commented Jun 1, 2026

Copy link
Copy Markdown
Owner

Описание

Добавлен публичный API для работы с FSM-контекстом вне хендлеров через dp.fsm.

Теперь контекст пользователя можно получить или изменить по chat_id и user_id без обращения к внутренним методам диспетчера:

  • dp.fsm.get_context(...)
  • dp.fsm.get_state(...)
  • dp.fsm.set_state(...)
  • dp.fsm.get_data(...)
  • dp.fsm.set_data(...)
  • dp.fsm.update_data(...)
  • dp.fsm.clear(...)

Также update_data() теперь возвращает актуальный словарь данных после обновления.

@love-apples love-apples self-assigned this Jun 1, 2026
@codecov

codecov Bot commented Jun 1, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 97.91667% with 1 line in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
maxapi/context/context.py 85.71% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@love-apples love-apples added documentation Improvements or additions to documentation enhancement New feature or request labels Jun 1, 2026
@Olegt0rr Olegt0rr requested a review from Copilot June 1, 2026 14:25

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

PR добавляет публичный API для работы с FSM-контекстом вне хендлеров через dp.fsm, чтобы получать/менять состояние и данные по (chat_id, user_id) без обращения к приватным методам диспетчера.

Changes:

  • Добавлен ContextManager с высокоуровневыми методами get_context/get_state/set_state/get_data/set_data/update_data/clear.
  • В Dispatcher добавлен публичный property fsm; в Router доступ к fsm запрещён исключением.
  • Обновлены тесты и документация под новый API.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
tests/test_dispatcher.py Добавлены тесты на dp.fsm и запрет router.fsm.
maxapi/dispatcher.py Подключён ContextManager, добавлен Dispatcher.fsm, запрещён Router.fsm.
maxapi/context/manager.py Новый менеджер контекстов, проксирующий операции к BaseContext.
maxapi/context/__init__.py Экспортирован ContextManager в публичный пакет maxapi.context.
docs/guides/context.md Документация по получению/управлению контекстом через dp.fsm.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread maxapi/context/manager.py Outdated
Comment on lines +33 to +50
async def get_context(
self,
*,
chat_id: int | None,
user_id: int | None,
) -> BaseContext:
"""
Возвращает контекст пользователя по идентификаторам.

Args:
chat_id: Идентификатор чата.
user_id: Идентификатор пользователя.

Returns:
Контекст.
"""
return self._get_context(chat_id, user_id)

Comment thread tests/test_dispatcher.py Outdated
Comment on lines +274 to +283
async def test_fsm_get_context_by_ids(self, dispatcher):
"""dp.fsm.get_context возвращает контекст по идентификаторам."""
context = await dispatcher.fsm.get_context(
chat_id=12345,
user_id=67890,
)

assert isinstance(context, MemoryContext)
assert context is dispatcher._Dispatcher__get_context(12345, 67890)

Comment thread maxapi/context/manager.py
Comment on lines +119 to +133
async def update_data(
self, *, chat_id: int | None, user_id: int | None, **kwargs: Any
) -> dict[str, Any]:
"""
Обновляет данные пользователя.

Args:
chat_id: Идентификатор чата.
user_id: Идентификатор пользователя.
**kwargs: Пары ключ-значение для обновления.
"""
context = self._get_context(chat_id, user_id)
await context.update_data(**kwargs)
return await context.get_data()

Comment thread maxapi/context/manager.py Outdated
Comment on lines +33 to +50
async def get_context(
self,
*,
chat_id: int | None,
user_id: int | None,
) -> BaseContext:
"""
Возвращает контекст пользователя по идентификаторам.

Args:
chat_id: Идентификатор чата.
user_id: Идентификатор пользователя.

Returns:
Контекст.
"""
return self._get_context(chat_id, user_id)

Comment thread tests/test_dispatcher.py Outdated
Comment on lines +274 to +283
async def test_fsm_get_context_by_ids(self, dispatcher):
"""dp.fsm.get_context возвращает контекст по идентификаторам."""
context = await dispatcher.fsm.get_context(
chat_id=12345,
user_id=67890,
)

assert isinstance(context, MemoryContext)
assert context is dispatcher._Dispatcher__get_context(12345, 67890)

Comment thread docs/guides/context.md
Comment on lines +47 to +52
```python
context = await dp.fsm.get_context(
chat_id=chat_id,
user_id=user_id,
)
```
Comment thread maxapi/context/manager.py
Comment on lines +119 to +133
async def update_data(
self, *, chat_id: int | None, user_id: int | None, **kwargs: Any
) -> dict[str, Any]:
"""
Обновляет данные пользователя.

Args:
chat_id: Идентификатор чата.
user_id: Идентификатор пользователя.
**kwargs: Пары ключ-значение для обновления.
"""
context = self._get_context(chat_id, user_id)
await context.update_data(**kwargs)
return await context.get_data()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants