From 0059a7b8812189ab583a79278d244db487e549d8 Mon Sep 17 00:00:00 2001 From: osovskiyalexandr Date: Mon, 8 Jun 2026 18:04:14 +0300 Subject: [PATCH 01/19] 0.76.4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Added - Добавлен VoEx API: - `Bot.get_call(bot_id, call_id)` для получения данных звонка. - `Bot.get_conference(bot_id, call_id)` для получения данных конференции. - Новые доменные модели `Call` и `Conference`. - Новые исключения `CallNotFoundError` и `ConferenceNotFoundError` для ответов `404`. - В `search_user_by_email` и `search_user_by_emails` добавлены параметры: - `trusts_search` - `partial_response` По умолчанию параметры отключены и не отправляются в запросе, что сохраняет обратную совместимость. ## Fixed - Исправлено определение MIME type для вложений с расширениями в любом регистре. Например, `.PNG`, `.JPG`, `.PDF` теперь корректно мапятся на ожидаемый MIME type. - Исправлена сериализация markup link button без `command`. Поле `command` теперь может отсутствовать, что нужно для ссылочных кнопок. - Актуализирован Users API: - `update_user_profile` теперь мапит `503 Service Unavailable` в отдельное исключение `UserProfileUpdateUnavailableError`. - `UserProfileUpdateUnavailableError` экспортируется из публичного API `pybotx`. - Числовые значения `ip_phone`, `other_ip_phone`, `other_phone` в ответах поиска пользователей приводятся к строке. - CSV-парсинг пользователей стал устойчивее к отсутствию части необязательных колонок: avatar, office, phones, description, personnel number и др. --- pybotx/__init__.py | 6 +- pybotx/bot/bot.py | 80 +++++++++++- pybotx/client/exceptions/users.py | 4 + .../client/users_api/search_user_by_email.py | 25 +++- .../client/users_api/search_user_by_emails.py | 11 +- .../client/users_api/update_user_profile.py | 7 +- pybotx/client/users_api/user_from_csv.py | 18 +-- pybotx/client/users_api/user_from_search.py | 10 +- pybotx/client/voex_api/__init__.py | 0 pybotx/client/voex_api/exceptions.py | 9 ++ pybotx/client/voex_api/get_call.py | 59 +++++++++ pybotx/client/voex_api/get_conference.py | 63 +++++++++ pybotx/models/attachments.py | 11 +- pybotx/models/call.py | 8 ++ pybotx/models/conference.py | 10 ++ pybotx/models/message/markup.py | 2 +- pyproject.toml | 2 +- .../users_api/test_search_user_by_emails.py | 42 ++++++ .../users_api/test_search_user_by_huid.py | 37 ++++++ .../users_api/test_update_user_profile.py | 48 ++++++- tests/client/users_api/test_users_as_csv.py | 53 ++++++++ tests/client/voex_api/__init__.py | 0 tests/client/voex_api/test_call.py | 113 +++++++++++++++++ tests/client/voex_api/test_conference.py | 120 ++++++++++++++++++ tests/models/test_botx_api_markup.py | 35 +++++ tests/test_attachments.py | 17 +++ 26 files changed, 765 insertions(+), 25 deletions(-) create mode 100644 pybotx/client/voex_api/__init__.py create mode 100644 pybotx/client/voex_api/exceptions.py create mode 100644 pybotx/client/voex_api/get_call.py create mode 100644 pybotx/client/voex_api/get_conference.py create mode 100644 pybotx/models/call.py create mode 100644 pybotx/models/conference.py create mode 100644 tests/client/voex_api/__init__.py create mode 100644 tests/client/voex_api/test_call.py create mode 100644 tests/client/voex_api/test_conference.py diff --git a/pybotx/__init__.py b/pybotx/__init__.py index fa50a5c4..23074581 100644 --- a/pybotx/__init__.py +++ b/pybotx/__init__.py @@ -64,7 +64,10 @@ FinalRecipientsListEmptyError, StealthModeDisabledError, ) -from pybotx.client.exceptions.users import UserNotFoundError +from pybotx.client.exceptions.users import ( + UserNotFoundError, + UserProfileUpdateUnavailableError, +) from pybotx.client.smartapps_api.exceptions import SyncSmartAppEventHandlerNotFoundError from pybotx.client.smartapps_api.smartapp_manifest import ( SmartappManifest, @@ -301,6 +304,7 @@ "UserFromSearch", "UserKinds", "UserNotFoundError", + "UserProfileUpdateUnavailableError", "UserSender", "Video", "Voice", diff --git a/pybotx/bot/bot.py b/pybotx/bot/bot.py index aef8eb17..0e1746fc 100644 --- a/pybotx/bot/bot.py +++ b/pybotx/bot/bot.py @@ -224,6 +224,14 @@ BotXAPIUsersAsCSVRequestPayload, UsersAsCSVMethod, ) +from pybotx.client.voex_api.get_call import ( + BotXAPIGetCallRequestPayload, + GetCallMethod, +) +from pybotx.client.voex_api.get_conference import ( + BotXAPIGetConferenceRequestPayload, + GetConferenceMethod, +) from pybotx.constants import BOTX_DEFAULT_TIMEOUT, STICKER_PACKS_PER_PAGE from pybotx.converters import optional_sequence_to_list from pybotx.image_validators import ( @@ -236,12 +244,14 @@ from pybotx.models.attachments import IncomingFileAttachment, OutgoingAttachment from pybotx.models.bot_account import BotAccountWithSecret from pybotx.models.bot_catalog import BotsListItem +from pybotx.models.call import Call from pybotx.models.chats import ChatInfo, ChatLink, ChatListItem from pybotx.models.commands import ( BotAPISystemEvent, BotAPIIncomingMessage, BotCommand, ) +from pybotx.models.conference import Conference from pybotx.models.enums import BotAPICommandTypes, ChatLinkTypes, ChatTypes from pybotx.models.message.edit_message import EditMessage from pybotx.models.message.markup import BubbleMarkup, KeyboardMarkup @@ -1395,6 +1405,56 @@ async def pin_message( await method.execute(payload) + async def get_call( + self, + *, + bot_id: UUID, + call_id: UUID, + ) -> Call: + """Get call. + + :param bot_id: Bot which should perform the request. + :param call_id: Call id. + + :return: Call. + """ + method = GetCallMethod( + bot_id, + self._httpx_client, + self._bot_accounts_storage, + ) + payload = BotXAPIGetCallRequestPayload.from_domain( + call_id=call_id, + ) + botx_call = await method.execute(payload) + + return botx_call.to_domain() + + async def get_conference( + self, + *, + bot_id: UUID, + call_id: UUID, + ) -> Conference: + """Get Conference. + + :param bot_id: Bot which should perform the request. + :param call_id: Call id. + + :return: Conference. + """ + method = GetConferenceMethod( + bot_id, + self._httpx_client, + self._bot_accounts_storage, + ) + payload = BotXAPIGetConferenceRequestPayload.from_domain( + call_id=call_id, + ) + botx_conference = await method.execute(payload) + + return botx_conference.to_domain() + async def unpin_message( self, *, @@ -1421,11 +1481,15 @@ async def search_user_by_emails( *, bot_id: UUID, emails: list[str], + trusts_search: bool = False, + partial_response: bool = False, ) -> list[UserFromSearch]: """Search user by emails for search. :param bot_id: Bot which should perform the request. :param emails: User emails. + :param trusts_search: Search users on trusted servers. + :param partial_response: Return local results if trusted server lookup fails. :return: Search result with user information. """ @@ -1435,7 +1499,11 @@ async def search_user_by_emails( self._httpx_client, self._bot_accounts_storage, ) - payload = BotXAPISearchUserByEmailsRequestPayload.from_domain(emails=emails) + payload = BotXAPISearchUserByEmailsRequestPayload.from_domain( + emails=emails, + trusts_search=trusts_search, + partial_response=partial_response, + ) botx_api_users_from_search = await method.execute(payload) @@ -1447,6 +1515,8 @@ async def search_user_by_email_post( *, bot_id: UUID, email: str, + trusts_search: bool = False, + partial_response: bool = False, ) -> UserFromSearch: """Search user by email for search. @@ -1455,6 +1525,8 @@ async def search_user_by_email_post( :param bot_id: Bot which should perform the request. :param email: User email. + :param trusts_search: Search users on trusted servers. + :param partial_response: Return local results if trusted server lookup fails. :return: User information. """ @@ -1464,7 +1536,11 @@ async def search_user_by_email_post( self._httpx_client, self._bot_accounts_storage, ) - payload = BotXAPISearchUserByEmailRequestPayload.from_domain(email=email) + payload = BotXAPISearchUserByEmailRequestPayload.from_domain( + email=email, + trusts_search=trusts_search, + partial_response=partial_response, + ) botx_api_user_from_search = await method.execute(payload) diff --git a/pybotx/client/exceptions/users.py b/pybotx/client/exceptions/users.py index c6fc913f..a92a4310 100644 --- a/pybotx/client/exceptions/users.py +++ b/pybotx/client/exceptions/users.py @@ -11,3 +11,7 @@ class InvalidProfileDataError(BaseClientError): class NoUserKindSelectedError(BaseClientError): """No user kind selected.""" + + +class UserProfileUpdateUnavailableError(BaseClientError): + """User profile update service is unavailable.""" diff --git a/pybotx/client/users_api/search_user_by_email.py b/pybotx/client/users_api/search_user_by_email.py index ad11a589..1aacf10c 100644 --- a/pybotx/client/users_api/search_user_by_email.py +++ b/pybotx/client/users_api/search_user_by_email.py @@ -9,15 +9,27 @@ BotXAPISearchUserResponsePayload, ) from pybotx.logger import logger +from pybotx.missing import Missing, Undefined from pybotx.models.api_base import UnverifiedPayloadBaseModel class BotXAPISearchUserByEmailRequestPayload(UnverifiedPayloadBaseModel): email: str + trusts_search: Missing[bool] = Undefined + partial_response: Missing[bool] = Undefined @classmethod - def from_domain(cls, email: str) -> "BotXAPISearchUserByEmailRequestPayload": - return cls(email=email) + def from_domain( + cls, + email: str, + trusts_search: bool = False, + partial_response: bool = False, + ) -> "BotXAPISearchUserByEmailRequestPayload": + return cls( + email=email, + trusts_search=trusts_search or Undefined, + partial_response=partial_response or Undefined, + ) class SearchUserByEmailMethod(AuthorizedBotXMethod): @@ -67,7 +79,14 @@ async def execute( path = "/api/v3/botx/users/by_email" email = payload.email - request_json = {"emails": [email]} + request_json = { + "emails": [email], + "trusts_search": payload.trusts_search, + "partial_response": payload.partial_response, + } + request_json = { + key: value for key, value in request_json.items() if value is not Undefined + } response = await self._botx_method_call( "POST", diff --git a/pybotx/client/users_api/search_user_by_emails.py b/pybotx/client/users_api/search_user_by_emails.py index 8981c355..8f024c4f 100644 --- a/pybotx/client/users_api/search_user_by_emails.py +++ b/pybotx/client/users_api/search_user_by_emails.py @@ -3,18 +3,27 @@ from pybotx.client.users_api.user_from_search import ( BotXAPISearchUserByEmailsResponsePayload, ) +from pybotx.missing import Missing, Undefined from pybotx.models.api_base import UnverifiedPayloadBaseModel class BotXAPISearchUserByEmailsRequestPayload(UnverifiedPayloadBaseModel): emails: list[str] + trusts_search: Missing[bool] = Undefined + partial_response: Missing[bool] = Undefined @classmethod def from_domain( cls, emails: list[str], + trusts_search: bool = False, + partial_response: bool = False, ) -> "BotXAPISearchUserByEmailsRequestPayload": - return cls(emails=emails) + return cls( + emails=emails, + trusts_search=trusts_search or Undefined, + partial_response=partial_response or Undefined, + ) class SearchUserByEmailsMethod(AuthorizedBotXMethod): diff --git a/pybotx/client/users_api/update_user_profile.py b/pybotx/client/users_api/update_user_profile.py index 5f638f57..a257d42f 100644 --- a/pybotx/client/users_api/update_user_profile.py +++ b/pybotx/client/users_api/update_user_profile.py @@ -3,7 +3,11 @@ from pybotx.client.authorized_botx_method import AuthorizedBotXMethod from pybotx.client.botx_method import response_exception_thrower -from pybotx.client.exceptions.users import InvalidProfileDataError, UserNotFoundError +from pybotx.client.exceptions.users import ( + InvalidProfileDataError, + UserNotFoundError, + UserProfileUpdateUnavailableError, +) from pybotx.missing import Missing, Undefined from pybotx.models.api_base import UnverifiedPayloadBaseModel, VerifiedPayloadBaseModel from pybotx.models.attachments import ( @@ -67,6 +71,7 @@ class UpdateUsersProfileMethod(AuthorizedBotXMethod): **AuthorizedBotXMethod.status_handlers, 400: response_exception_thrower(InvalidProfileDataError), 404: response_exception_thrower(UserNotFoundError), + 503: response_exception_thrower(UserProfileUpdateUnavailableError), } async def execute( diff --git a/pybotx/client/users_api/user_from_csv.py b/pybotx/client/users_api/user_from_csv.py index 275b9645..88b9bb38 100644 --- a/pybotx/client/users_api/user_from_csv.py +++ b/pybotx/client/users_api/user_from_csv.py @@ -23,17 +23,17 @@ class BotXAPIUserFromCSVResult(VerifiedPayloadBaseModel): company: str | None = Field(alias="Company") department: str | None = Field(alias="Department") position: str | None = Field(alias="Position") - avatar: str | None = Field(alias="Avatar") - avatar_preview: str | None = Field(alias="Avatar preview") - office: str | None = Field(alias="Office") + avatar: str | None = Field(default=None, alias="Avatar") + avatar_preview: str | None = Field(default=None, alias="Avatar preview") + office: str | None = Field(default=None, alias="Office") manager: str | None = Field(alias="Manager") manager_huid: UUID | None = Field(alias="Manager HUID") - description: str | None = Field(alias="Description") - phone: str | None = Field(alias="Phone") - other_phone: str | None = Field(alias="Other phone") - ip_phone: str | None = Field(alias="IP phone") - other_ip_phone: str | None = Field(alias="Other IP phone") - personnel_number: str | None = Field(alias="Personnel number") + description: str | None = Field(default=None, alias="Description") + phone: str | None = Field(default=None, alias="Phone") + other_phone: str | None = Field(default=None, alias="Other phone") + ip_phone: str | None = Field(default=None, alias="IP phone") + other_ip_phone: str | None = Field(default=None, alias="Other IP phone") + personnel_number: str | None = Field(default=None, alias="Personnel number") @field_validator( "email", diff --git a/pybotx/client/users_api/user_from_search.py b/pybotx/client/users_api/user_from_search.py index 92d257c5..17d6ba34 100644 --- a/pybotx/client/users_api/user_from_search.py +++ b/pybotx/client/users_api/user_from_search.py @@ -5,7 +5,7 @@ from pybotx.models.api_base import VerifiedPayloadBaseModel from pybotx.models.enums import APIUserKinds, convert_user_kind_to_domain from pybotx.models.users import UserFromSearch -from pydantic import Field +from pydantic import Field, field_validator class BotXAPISearchUserResult(VerifiedPayloadBaseModel): @@ -32,6 +32,14 @@ class BotXAPISearchUserResult(VerifiedPayloadBaseModel): created_at: datetime | None = None updated_at: datetime | None = None + @field_validator("ip_phone", "other_ip_phone", "other_phone", mode="before") + @classmethod + def convert_phone_to_string(cls, value: str | int | None) -> str | None: + if value is None: + return None + + return str(value) + class BotXAPISearchUserResponsePayload(VerifiedPayloadBaseModel): status: Literal["ok"] diff --git a/pybotx/client/voex_api/__init__.py b/pybotx/client/voex_api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pybotx/client/voex_api/exceptions.py b/pybotx/client/voex_api/exceptions.py new file mode 100644 index 00000000..08363e08 --- /dev/null +++ b/pybotx/client/voex_api/exceptions.py @@ -0,0 +1,9 @@ +from pybotx.client.exceptions.base import BaseClientError + + +class ConferenceNotFoundError(BaseClientError): + """Conference with specified call_id not found.""" + + +class CallNotFoundError(BaseClientError): + """Call with specified call_id not found.""" diff --git a/pybotx/client/voex_api/get_call.py b/pybotx/client/voex_api/get_call.py new file mode 100644 index 00000000..e5dee2cb --- /dev/null +++ b/pybotx/client/voex_api/get_call.py @@ -0,0 +1,59 @@ +from typing import Literal +from uuid import UUID + +from pybotx.client.authorized_botx_method import AuthorizedBotXMethod +from pybotx.client.botx_method import response_exception_thrower +from pybotx.client.voex_api.exceptions import CallNotFoundError +from pybotx.models.api_base import UnverifiedPayloadBaseModel, VerifiedPayloadBaseModel +from pybotx.models.call import Call + + +class BotXAPIGetCallRequestPayload(UnverifiedPayloadBaseModel): + call_id: UUID + + @classmethod + def from_domain( + cls, + call_id: UUID, + ) -> "BotXAPIGetCallRequestPayload": + return cls(call_id=call_id) + + +class BotXAPIGetCallResult(VerifiedPayloadBaseModel): + id: UUID + members: list[UUID] + + +class BotXAPIGetCallResponsePayload(VerifiedPayloadBaseModel): + status: Literal["ok"] + result: BotXAPIGetCallResult + + def to_domain(self) -> Call: + return Call( + id=self.result.id, + members=self.result.members, + ) + + +class GetCallMethod(AuthorizedBotXMethod): + status_handlers = { + **AuthorizedBotXMethod.status_handlers, + 404: response_exception_thrower(CallNotFoundError), + } + + async def execute( + self, + payload: BotXAPIGetCallRequestPayload, + ) -> BotXAPIGetCallResponsePayload: + jsonable_dict = payload.jsonable_dict() + path = f"/api/v3/botx/voex/calls/{jsonable_dict['call_id']}" + + response = await self._botx_method_call( + "GET", + self._build_url(path), + ) + + return self._verify_and_extract_api_model( + BotXAPIGetCallResponsePayload, + response, + ) diff --git a/pybotx/client/voex_api/get_conference.py b/pybotx/client/voex_api/get_conference.py new file mode 100644 index 00000000..0fc8c680 --- /dev/null +++ b/pybotx/client/voex_api/get_conference.py @@ -0,0 +1,63 @@ +from typing import Literal +from uuid import UUID + +from pybotx.client.authorized_botx_method import AuthorizedBotXMethod +from pybotx.client.botx_method import response_exception_thrower +from pybotx.client.voex_api.exceptions import ConferenceNotFoundError +from pybotx.models.api_base import UnverifiedPayloadBaseModel, VerifiedPayloadBaseModel +from pybotx.models.conference import Conference + + +class BotXAPIGetConferenceRequestPayload(UnverifiedPayloadBaseModel): + call_id: UUID + + @classmethod + def from_domain( + cls, + call_id: UUID, + ) -> "BotXAPIGetConferenceRequestPayload": + return cls(call_id=call_id) + + +class BotXAPIGetConferenceResult(VerifiedPayloadBaseModel): + id: UUID + name: str + link: str + members: list[UUID] + + +class BotXAPIGetConferenceResponsePayload(VerifiedPayloadBaseModel): + status: Literal["ok"] + result: BotXAPIGetConferenceResult + + def to_domain(self) -> Conference: + return Conference( + id=self.result.id, + name=self.result.name, + link=self.result.link, + members=self.result.members, + ) + + +class GetConferenceMethod(AuthorizedBotXMethod): + status_handlers = { + **AuthorizedBotXMethod.status_handlers, + 404: response_exception_thrower(ConferenceNotFoundError), + } + + async def execute( + self, + payload: BotXAPIGetConferenceRequestPayload, + ) -> BotXAPIGetConferenceResponsePayload: + jsonable_dict = payload.jsonable_dict() + path = f"/api/v3/botx/voex/conferences/{jsonable_dict['call_id']}" + + response = await self._botx_method_call( + "GET", + self._build_url(path), + ) + + return self._verify_and_extract_api_model( + BotXAPIGetConferenceResponsePayload, + response, + ) diff --git a/pybotx/models/attachments.py b/pybotx/models/attachments.py index 9882eca3..14cccce4 100644 --- a/pybotx/models/attachments.py +++ b/pybotx/models/attachments.py @@ -501,6 +501,12 @@ def encode_rfc2397(content: bytes, mimetype: str) -> str: return f"data:{mimetype};base64,{b64_content}" +def get_mimetype_by_filename(filename: str) -> str: + extension = filename.rsplit(".", 1)[-1].lower() + + return EXTENSIONS_TO_MIMETYPES.get(extension, DEFAULT_MIMETYPE) + + class BotXAPIAttachment(UnverifiedPayloadBaseModel): file_name: str data: str @@ -512,10 +518,7 @@ def from_file_attachment( ) -> "BotXAPIAttachment": assert attachment.content is not None - mimetype = EXTENSIONS_TO_MIMETYPES.get( - attachment.filename.split(".")[-1], - DEFAULT_MIMETYPE, - ) + mimetype = get_mimetype_by_filename(attachment.filename) return cls( file_name=attachment.filename, diff --git a/pybotx/models/call.py b/pybotx/models/call.py new file mode 100644 index 00000000..3dd45e11 --- /dev/null +++ b/pybotx/models/call.py @@ -0,0 +1,8 @@ +from dataclasses import dataclass +from uuid import UUID + + +@dataclass(slots=True) +class Call: + id: UUID + members: list[UUID] diff --git a/pybotx/models/conference.py b/pybotx/models/conference.py new file mode 100644 index 00000000..fce0f4b6 --- /dev/null +++ b/pybotx/models/conference.py @@ -0,0 +1,10 @@ +from dataclasses import dataclass +from uuid import UUID + + +@dataclass(slots=True) +class Conference: + id: UUID + name: str + link: str + members: list[UUID] diff --git a/pybotx/models/message/markup.py b/pybotx/models/message/markup.py index 587049dd..cb06c0b2 100644 --- a/pybotx/models/message/markup.py +++ b/pybotx/models/message/markup.py @@ -178,7 +178,7 @@ class BotXAPIButtonOptions(UnverifiedPayloadBaseModel): class BotXAPIButton(UnverifiedPayloadBaseModel): - command: str + command: Missing[str] label: str data: dict[str, Any] opts: BotXAPIButtonOptions diff --git a/pyproject.toml b/pyproject.toml index 4fcae241..0a190876 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pybotx" -version = "0.76.3" +version = "0.76.4" description = "A python library for interacting with eXpress BotX API" authors = [ "Sidnev Nikolay ", diff --git a/tests/client/users_api/test_search_user_by_emails.py b/tests/client/users_api/test_search_user_by_emails.py index 72d61425..3fefc536 100644 --- a/tests/client/users_api/test_search_user_by_emails.py +++ b/tests/client/users_api/test_search_user_by_emails.py @@ -85,3 +85,45 @@ async def test__search_user_by_email_without_data__succeed( # - Assert - assert_deep_equal(users, [user_from_search_without_data]) assert endpoint.called + + +async def test__search_user_by_email_with_trusts_search__succeed( + respx_mock: MockRouter, + host: str, + bot_id: UUID, + user_from_search_with_data: UserFromSearch, + user_from_search_with_data_json: dict[str, Any], + bot_factory: Any, +) -> None: + # - Arrange - + user_emails = ["ad_user@cts.com"] + + request = BotXRequest( + method="POST", + path="/api/v3/botx/users/by_email", + json={ + "emails": user_emails, + "trusts_search": True, + "partial_response": True, + }, + ) + endpoint = mock_botx( + respx_mock, + host, + request, + ok_payload([user_from_search_with_data_json]), + HTTPStatus.OK, + ) + + # - Act - + async with bot_factory() as bot: + users = await bot.search_user_by_emails( + bot_id=bot_id, + emails=user_emails, + trusts_search=True, + partial_response=True, + ) + + # - Assert - + assert_deep_equal(users, [user_from_search_with_data]) + assert endpoint.called diff --git a/tests/client/users_api/test_search_user_by_huid.py b/tests/client/users_api/test_search_user_by_huid.py index 51a47cc2..7ada442b 100644 --- a/tests/client/users_api/test_search_user_by_huid.py +++ b/tests/client/users_api/test_search_user_by_huid.py @@ -82,6 +82,43 @@ async def test__search_user_by_huid__succeed( assert endpoint.called +async def test__search_user_by_huid_with_numeric_ip_phone__succeed( + respx_mock: MockRouter, + host: str, + bot_id: UUID, + user_from_search_with_data: UserFromSearch, + user_from_search_with_data_json: dict[str, Any], + bot_factory: Any, +) -> None: + # - Arrange - + user_from_search_with_data_json["ip_phone"] = 1271020 + + request = BotXRequest( + method="GET", + path="/api/v3/botx/users/by_huid", + params={"user_huid": "f837dff4-d3ad-4b8d-a0a3-5c6ca9c747d1"}, + ) + endpoint = mock_botx( + respx_mock, + host, + request, + ok_payload(user_from_search_with_data_json), + HTTPStatus.OK, + ) + + # - Act - + async with bot_factory() as bot: + user = await bot.search_user_by_huid( + bot_id=bot_id, + huid=UUID("f837dff4-d3ad-4b8d-a0a3-5c6ca9c747d1"), + ) + + # - Assert - + assert user.ip_phone == "1271020" + assert_deep_equal(user, user_from_search_with_data) + assert endpoint.called + + async def test__search_user_by_huid_without_data__succeed( respx_mock: MockRouter, host: str, diff --git a/tests/client/users_api/test_update_user_profile.py b/tests/client/users_api/test_update_user_profile.py index da713334..06359d93 100644 --- a/tests/client/users_api/test_update_user_profile.py +++ b/tests/client/users_api/test_update_user_profile.py @@ -5,7 +5,10 @@ import pytest from respx.router import MockRouter -from pybotx.client.exceptions.users import InvalidProfileDataError +from pybotx.client.exceptions.users import ( + InvalidProfileDataError, + UserProfileUpdateUnavailableError, +) from pybotx.models.attachments import AttachmentImage from pybotx.models.enums import AttachmentTypes from tests.testkit import BotXRequest, error_payload, mock_botx, ok_payload @@ -168,3 +171,46 @@ async def test__update_user_profile__invalid_profile_data_error( # - Assert - assert endpoint.called + + +@pytest.mark.parametrize( + "reason", + [ + "error_from_ad_phonebook_service", + "unexpected_error", + ], +) +async def test__update_user_profile__service_unavailable_error( + respx_mock: MockRouter, + host: str, + bot_id: UUID, + bot_factory: Any, + reason: str, +) -> None: + # - Arrange - + request = BotXRequest( + method="PUT", + path="/api/v3/botx/users/update_profile", + json={ + "user_huid": "6fafda2c-6505-57a5-a088-25ea5d1d0364", + }, + ) + endpoint = mock_botx( + respx_mock, + host, + request, + error_payload(reason), + HTTPStatus.SERVICE_UNAVAILABLE, + ) + + # - Act - + async with bot_factory() as bot: + with pytest.raises(UserProfileUpdateUnavailableError) as exc: + await bot.update_user_profile( + bot_id=bot_id, + user_huid=UUID("6fafda2c-6505-57a5-a088-25ea5d1d0364"), + ) + + # - Assert - + assert reason in str(exc.value) + assert endpoint.called diff --git a/tests/client/users_api/test_users_as_csv.py b/tests/client/users_api/test_users_as_csv.py index 95315b2c..95b98fdc 100644 --- a/tests/client/users_api/test_users_as_csv.py +++ b/tests/client/users_api/test_users_as_csv.py @@ -138,3 +138,56 @@ async def test__users_as_csv__succeed( ), ], ) + + +async def test__users_as_csv_with_documented_columns_only__succeed( + respx_mock: MockRouter, + host: str, + bot_id: UUID, + bot_factory: Any, +) -> None: + request = BotXRequest( + method="GET", + path="/api/v3/botx/users/users_as_csv", + params={"cts_user": True, "unregistered": True, "botx": False}, + ) + endpoint = mock_botx( + respx_mock, + host, + request, + response_json=None, + status=HTTPStatus.OK, + response_content=( + b"HUID,AD Login,Domain,AD E-mail,Name,Sync source,Active,Kind,Company,Department,Position,Manager,Manager HUID\n" + b"dbc8934f-d0d7-4a9e-89df-d45c137a851c,test_user_17,cts.example.com,,test_user_17,ad,true,cts_user,Company,Department,Position,Manager John,13a6909c-bce1-4dbf-8359-efb7ef8e5b34\n" + ), + ) + + users_from_csv = [] + + async with bot_factory() as bot: + async with bot.users_as_csv(bot_id=bot_id) as users: + async for user in users: + users_from_csv.append(user) + + assert endpoint.called + assert_deep_equal( + users_from_csv, + [ + UserFromCSV( + huid=UUID("dbc8934f-d0d7-4a9e-89df-d45c137a851c"), + ad_login="test_user_17", + ad_domain="cts.example.com", + username="test_user_17", + sync_source=SyncSourceTypes.AD, + active=True, + user_kind=UserKinds.CTS_USER, + email=None, + company="Company", + department="Department", + position="Position", + manager="Manager John", + manager_huid=UUID("13a6909c-bce1-4dbf-8359-efb7ef8e5b34"), + ), + ], + ) diff --git a/tests/client/voex_api/__init__.py b/tests/client/voex_api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/client/voex_api/test_call.py b/tests/client/voex_api/test_call.py new file mode 100644 index 00000000..fd249532 --- /dev/null +++ b/tests/client/voex_api/test_call.py @@ -0,0 +1,113 @@ +from http import HTTPStatus +from uuid import UUID + +import httpx +import pytest +from respx.router import MockRouter + +from pybotx import ( + Bot, + BotAccountWithSecret, + HandlerCollector, + lifespan_wrapper, +) +from pybotx.client.voex_api.exceptions import CallNotFoundError +from pybotx.models.call import Call + +pytestmark = [ + pytest.mark.asyncio, + pytest.mark.mock_authorization, + pytest.mark.usefixtures("respx_mock"), +] + + +async def test__get_call__succeed( + respx_mock: MockRouter, + host: str, + bot_id: UUID, + bot_account: BotAccountWithSecret, +) -> None: + # - Arrange - + call_id = "a465f0f3-1354-491c-8f11-f400164295cb" + member1 = "dcfa5a7c-7cc4-4c89-b6c0-80325604f9f4" + member2 = "6fa5f1e9-1453-0ad7-2d6d-b791467e382a" + + endpoint = respx_mock.get( + f"https://{host}/api/v3/botx/voex/calls/{call_id}", + headers={"Authorization": "Bearer token"}, + ).mock( + return_value=httpx.Response( + HTTPStatus.OK, + json={ + "status": "ok", + "result": { + "id": call_id, + "members": [ + member1, + member2, + ], + }, + }, + ), + ) + + built_bot = Bot(collectors=[HandlerCollector()], bot_accounts=[bot_account]) + + # - Act - + async with lifespan_wrapper(built_bot) as bot: + call = await bot.get_call( + bot_id=bot_id, + call_id=UUID(call_id), + ) + + # - Assert - + assert call == Call( + id=UUID(call_id), + members=[ + UUID(member1), + UUID(member2), + ], + ) + + assert endpoint.called + + +async def test__get_call__call_not_found( + respx_mock: MockRouter, + host: str, + bot_id: UUID, + bot_account: BotAccountWithSecret, +) -> None: + # - Arrange - + call_id = "a465f0f3-1354-491c-8f11-f400164295cb" + + endpoint = respx_mock.get( + f"https://{host}/api/v3/botx/voex/calls/{call_id}", + headers={"Authorization": "Bearer token"}, + ).mock( + return_value=httpx.Response( + HTTPStatus.NOT_FOUND, + json={ + "error_data": { + "call_id": call_id, + }, + "errors": ["Call with specified call_id not found."], + "reason": "not_found", + "status": "error", + }, + ), + ) + + built_bot = Bot(collectors=[HandlerCollector()], bot_accounts=[bot_account]) + + # - Act - + async with lifespan_wrapper(built_bot) as bot: + with pytest.raises(CallNotFoundError) as exc: + await bot.get_call( + bot_id=bot_id, + call_id=UUID(call_id), + ) + + # - Assert - + assert "not_found" in str(exc.value) + assert endpoint.called diff --git a/tests/client/voex_api/test_conference.py b/tests/client/voex_api/test_conference.py new file mode 100644 index 00000000..572a94f8 --- /dev/null +++ b/tests/client/voex_api/test_conference.py @@ -0,0 +1,120 @@ +from http import HTTPStatus +from uuid import UUID + +import httpx +import pytest +from respx.router import MockRouter + +from pybotx import ( + Bot, + BotAccountWithSecret, + HandlerCollector, + lifespan_wrapper, +) +from pybotx.client.voex_api.exceptions import ConferenceNotFoundError +from pybotx.models.conference import Conference + +pytestmark = [ + pytest.mark.asyncio, + pytest.mark.mock_authorization, + pytest.mark.usefixtures("respx_mock"), +] + + +async def test__get_conference__succeed( + respx_mock: MockRouter, + host: str, + bot_id: UUID, + bot_account: BotAccountWithSecret, +) -> None: + # - Arrange - + call_id = "a465f0f3-1354-491c-8f11-f400164295cb" + member1 = "dcfa5a7c-7cc4-4c89-b6c0-80325604f9f4" + member2 = "6fa5f1e9-1453-0ad7-2d6d-b791467e382a" + + name = "Test Conference" + link = "https://example.com/join" + + endpoint = respx_mock.get( + f"https://{host}/api/v3/botx/voex/conferences/{call_id}", + headers={"Authorization": "Bearer token"}, + ).mock( + return_value=httpx.Response( + HTTPStatus.OK, + json={ + "status": "ok", + "result": { + "id": call_id, + "name": name, + "link": link, + "members": [ + member1, + member2, + ], + }, + }, + ), + ) + + built_bot = Bot(collectors=[HandlerCollector()], bot_accounts=[bot_account]) + + # - Act - + async with lifespan_wrapper(built_bot) as bot: + call = await bot.get_conference( + bot_id=bot_id, + call_id=UUID(call_id), + ) + + # - Assert - + assert call == Conference( + id=UUID(call_id), + name=name, + link=link, + members=[ + UUID(member1), + UUID(member2), + ], + ) + + assert endpoint.called + + +async def test__get_conference__call_not_found( + respx_mock: MockRouter, + host: str, + bot_id: UUID, + bot_account: BotAccountWithSecret, +) -> None: + # - Arrange - + call_id = "4f60d594-21cb-52b4-8b04-8eb73c05085e" + + endpoint = respx_mock.get( + f"https://{host}/api/v3/botx/voex/conferences/{call_id}", + headers={"Authorization": "Bearer token"}, + ).mock( + return_value=httpx.Response( + HTTPStatus.NOT_FOUND, + json={ + "error_data": { + "call_id": call_id, + }, + "errors": ["Conference with specified call_id not found."], + "reason": "not_found", + "status": "error", + }, + ), + ) + + built_bot = Bot(collectors=[HandlerCollector()], bot_accounts=[bot_account]) + + # - Act - + async with lifespan_wrapper(built_bot) as bot: + with pytest.raises(ConferenceNotFoundError) as exc: + await bot.get_conference( + bot_id=bot_id, + call_id=UUID(call_id), + ) + + # - Assert - + assert "not_found" in str(exc.value) + assert endpoint.called diff --git a/tests/models/test_botx_api_markup.py b/tests/models/test_botx_api_markup.py index 850d4639..0d79c67b 100644 --- a/tests/models/test_botx_api_markup.py +++ b/tests/models/test_botx_api_markup.py @@ -1,11 +1,14 @@ import json +import warnings from typing import Any +from pybotx import BubbleMarkup from pybotx.models.message.markup import ( BotXAPIMarkup, BotXAPIButton, BotXAPIButtonOptions, + api_markup_from_domain, ) @@ -114,3 +117,35 @@ def test_botx_api_markup_jsonable_dict() -> None: ] ] assert jsonable_dict == expected_dict + + +def test_botx_api_markup_link_button_without_command() -> None: + # - Arrange - + markup = BubbleMarkup() + markup.add_button( + label="Open me", + link="https://example.com", + ) + + # - Act - + with warnings.catch_warnings(record=True) as captured_warnings: + warnings.simplefilter("always") + jsonable_dict = api_markup_from_domain(markup).jsonable_dict() + + # - Assert - + expected_dict: list[list[dict[str, Any]]] = [ + [ + { + "label": "Open me", + "data": {}, + "opts": { + "silent": True, + "align": "center", + "handler": "client", + "link": "https://example.com", + }, + } + ] + ] + assert jsonable_dict == expected_dict + assert not captured_warnings diff --git a/tests/test_attachments.py b/tests/test_attachments.py index a3a87b6d..f4066c80 100644 --- a/tests/test_attachments.py +++ b/tests/test_attachments.py @@ -21,10 +21,12 @@ AttachmentVideo, AttachmentVoice, BotAPIAttachment, + BotXAPIAttachment, Contact, IncomingAttachment, Link, Location, + OutgoingAttachment, convert_api_attachment_to_domain, ) @@ -81,6 +83,21 @@ async def default_handler(message: IncomingMessage, bot: Bot) -> None: assert read_content == b"Hello, world!\n" +async def test__botx_api_attachment__uppercase_file_extension_mimetype() -> None: + # - Arrange - + attachment = OutgoingAttachment( + content=b"Hello, world!", + filename="image.PNG", + ) + + # - Act - + api_attachment = BotXAPIAttachment.from_file_attachment(attachment) + + # - Assert - + assert api_attachment.file_name == "image.PNG" + assert api_attachment.data == "data:image/png;base64,SGVsbG8sIHdvcmxkIQ==" + + API_AND_DOMAIN_NON_FILE_ATTACHMENTS = ( ( { From c307cb8f4a6549fe8e81da8872cec312fe6048ea Mon Sep 17 00:00:00 2001 From: dmitrymihalev Date: Mon, 15 Jun 2026 13:30:57 +0500 Subject: [PATCH 02/19] Add fields for user avatar in search methods (#547) * Add fields for user avatar in search methods --- .gitignore | 3 +++ pybotx/client/users_api/user_from_search.py | 9 ++++++++- pybotx/models/users.py | 4 ++++ pyproject.toml | 2 +- tests/fixtures/users_api.py | 22 +++++++++++++++++++++ 5 files changed, 38 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index eca21968..97b1bc8b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,6 @@ htmlcov site .snippets*/ .idea/ +.hypothesis/ +.vscode/ +.python-version \ No newline at end of file diff --git a/pybotx/client/users_api/user_from_search.py b/pybotx/client/users_api/user_from_search.py index 17d6ba34..2c1c8ffb 100644 --- a/pybotx/client/users_api/user_from_search.py +++ b/pybotx/client/users_api/user_from_search.py @@ -2,16 +2,19 @@ from typing import Literal from uuid import UUID +from pydantic import Field, field_validator + from pybotx.models.api_base import VerifiedPayloadBaseModel from pybotx.models.enums import APIUserKinds, convert_user_kind_to_domain from pybotx.models.users import UserFromSearch -from pydantic import Field, field_validator class BotXAPISearchUserResult(VerifiedPayloadBaseModel): user_huid: UUID ad_login: str | None = None ad_domain: str | None = None + avatar: str | None = None + avatar_preview: str | None = None name: str company: str | None = None company_position: str | None = None @@ -50,6 +53,8 @@ def to_domain(self) -> UserFromSearch: huid=self.result.user_huid, ad_login=self.result.ad_login, ad_domain=self.result.ad_domain, + avatar=self.result.avatar, + avatar_preview=self.result.avatar_preview, username=self.result.name, company=self.result.company, company_position=self.result.company_position, @@ -82,6 +87,8 @@ def to_domain(self) -> list[UserFromSearch]: huid=user.user_huid, ad_login=user.ad_login, ad_domain=user.ad_domain, + avatar=user.avatar, + avatar_preview=user.avatar_preview, username=user.name, company=user.company, company_position=user.company_position, diff --git a/pybotx/models/users.py b/pybotx/models/users.py index 79bb736e..b0ca61ca 100644 --- a/pybotx/models/users.py +++ b/pybotx/models/users.py @@ -13,6 +13,8 @@ class UserFromSearch: huid: User huid. ad_login: User AD login. ad_domain: User AD domain. + avatar: User avatar (link). + avatar_preview: User avatar preview (link). username: User name. company: User company. company_position: User company position. @@ -44,6 +46,8 @@ class UserFromSearch: emails: list[str] other_id: str | None user_kind: UserKinds + avatar: str | None = None + avatar_preview: str | None = None active: bool | None = None description: str | None = None ip_phone: str | None = None diff --git a/pyproject.toml b/pyproject.toml index 0a190876..b635e579 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pybotx" -version = "0.76.4" +version = "0.76.5" description = "A python library for interacting with eXpress BotX API" authors = [ "Sidnev Nikolay ", diff --git a/tests/fixtures/users_api.py b/tests/fixtures/users_api.py index 5196615f..d26b3368 100644 --- a/tests/fixtures/users_api.py +++ b/tests/fixtures/users_api.py @@ -13,6 +13,16 @@ def user_from_search_with_data_json() -> dict[str, Any]: "user_huid": "6fafda2c-6505-57a5-a088-25ea5d1d0364", "ad_login": "ad_user_login", "ad_domain": "cts.com", + "avatar": ( + "https://test-cts.ru/uploads/profile_avatar/fa13e946-121b-52ce-aa92-677b51d19d83/" + "3ebb64d5e2f54e1ab9a3f2ff8096f55a.jpg" + "?v=1780399650402&sid=a619fcfa-a19b-5256-a592-9b0e75ca0896" + ), + "avatar_preview": ( + "https://test-cts.ru/uploads/profile_avatar/fa13e946-121b-52ce-aa92-677b51d19d83/" + "0a1294c14df84a1ea13c62483ec6cd0f.jpg?" + "v=1780399650402&sid=a619fcfa-a19b-5256-a592-9b0e75ca0896" + ), "name": "Bob", "company": "Bobs Co", "company_position": "Director", @@ -40,6 +50,16 @@ def user_from_search_with_data() -> UserFromSearch: huid=UUID("6fafda2c-6505-57a5-a088-25ea5d1d0364"), ad_login="ad_user_login", ad_domain="cts.com", + avatar=( + "https://test-cts.ru/uploads/profile_avatar/fa13e946-121b-52ce-aa92-677b51d19d83/" + "3ebb64d5e2f54e1ab9a3f2ff8096f55a.jpg" + "?v=1780399650402&sid=a619fcfa-a19b-5256-a592-9b0e75ca0896" + ), + avatar_preview=( + "https://test-cts.ru/uploads/profile_avatar/fa13e946-121b-52ce-aa92-677b51d19d83/" + "0a1294c14df84a1ea13c62483ec6cd0f.jpg?" + "v=1780399650402&sid=a619fcfa-a19b-5256-a592-9b0e75ca0896" + ), username="Bob", company="Bobs Co", company_position="Director", @@ -95,6 +115,8 @@ def user_from_search_without_data() -> UserFromSearch: huid=UUID("6fafda2c-6505-57a5-a088-25ea5d1d0364"), ad_login="ad_user_login", ad_domain="cts.com", + avatar=None, + avatar_preview=None, username="Bob", company="Bobs Co", company_position="Director", From 11bf96c0721be29302b64a62349190e8471dcfce Mon Sep 17 00:00:00 2001 From: Roman Bobrovskiy Date: Tue, 23 Jun 2026 14:58:51 +0300 Subject: [PATCH 03/19] fix: voex result models --- pybotx/client/voex_api/get_call.py | 4 ++-- pybotx/client/voex_api/get_conference.py | 4 ++-- pybotx/models/conference.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pybotx/client/voex_api/get_call.py b/pybotx/client/voex_api/get_call.py index e5dee2cb..bd5be924 100644 --- a/pybotx/client/voex_api/get_call.py +++ b/pybotx/client/voex_api/get_call.py @@ -20,7 +20,7 @@ def from_domain( class BotXAPIGetCallResult(VerifiedPayloadBaseModel): - id: UUID + call_id: UUID members: list[UUID] @@ -30,7 +30,7 @@ class BotXAPIGetCallResponsePayload(VerifiedPayloadBaseModel): def to_domain(self) -> Call: return Call( - id=self.result.id, + id=self.result.call_id, members=self.result.members, ) diff --git a/pybotx/client/voex_api/get_conference.py b/pybotx/client/voex_api/get_conference.py index 0fc8c680..9bb986a2 100644 --- a/pybotx/client/voex_api/get_conference.py +++ b/pybotx/client/voex_api/get_conference.py @@ -20,7 +20,7 @@ def from_domain( class BotXAPIGetConferenceResult(VerifiedPayloadBaseModel): - id: UUID + call_id: UUID name: str link: str members: list[UUID] @@ -32,7 +32,7 @@ class BotXAPIGetConferenceResponsePayload(VerifiedPayloadBaseModel): def to_domain(self) -> Conference: return Conference( - id=self.result.id, + id=self.result.call_id, name=self.result.name, link=self.result.link, members=self.result.members, diff --git a/pybotx/models/conference.py b/pybotx/models/conference.py index fce0f4b6..3a373fc4 100644 --- a/pybotx/models/conference.py +++ b/pybotx/models/conference.py @@ -6,5 +6,5 @@ class Conference: id: UUID name: str - link: str + link: str | None members: list[UUID] From be9fc02e6d768186b2a67367cc4d5def7bc984a2 Mon Sep 17 00:00:00 2001 From: Roman Bobrovskiy Date: Tue, 23 Jun 2026 14:59:01 +0300 Subject: [PATCH 04/19] feature: add VOEX chat type --- pybotx/models/enums.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pybotx/models/enums.py b/pybotx/models/enums.py index b458b56d..7f3ead50 100644 --- a/pybotx/models/enums.py +++ b/pybotx/models/enums.py @@ -66,6 +66,7 @@ class ChatTypes(AutoName): GROUP_CHAT = auto() CHANNEL = auto() THREAD = auto() + VOEX_CALL = auto() class SyncSourceTypes(AutoName): @@ -366,7 +367,7 @@ def convert_chat_type_to_domain( APIChatTypes.GROUP_CHAT: ChatTypes.GROUP_CHAT, APIChatTypes.CHANNEL: ChatTypes.CHANNEL, APIChatTypes.THREAD: ChatTypes.THREAD, - APIChatTypes.VOEX_CALL: ChatTypes.GROUP_CHAT, + APIChatTypes.VOEX_CALL: ChatTypes.VOEX_CALL, } converted_type: IncomingChatTypes | None From 0962db5bc030dbfab707b28c925d9515a823d643 Mon Sep 17 00:00:00 2001 From: "Davletyarov, Ildar" Date: Tue, 11 Aug 2026 13:28:59 +0300 Subject: [PATCH 05/19] feat: add trusted search to user lookup methods Expose trusts_search and partial_response for HUID, AD login, and other ID lookups while preserving the existing request shape by default. --- README.md | 5 ++- pybotx/bot/bot.py | 22 +++++++++- .../client/users_api/search_user_by_huid.py | 16 ++++++- .../client/users_api/search_user_by_login.py | 12 +++++- .../users_api/search_user_by_other_id.py | 16 ++++++- pyproject.toml | 2 +- .../users_api/test_search_user_by_huid.py | 40 ++++++++++++++++++ .../users_api/test_search_user_by_login.py | 42 +++++++++++++++++++ .../users_api/test_search_user_by_other_id.py | 40 ++++++++++++++++++ 9 files changed, 186 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index e5e1ea28..3aaab0e3 100644 --- a/README.md +++ b/README.md @@ -643,9 +643,10 @@ async def search_user_handler(message: IncomingMessage, bot: Bot) -> None: user_info = await bot.search_user_by_huid( bot_id=message.bot.id, huid=message.sender.huid, + trusts_search=True, ) - except UserNotFoundError: # Если пользователь и бот находятся на разных CTS - await bot.answer_message("User not found. Maybe you are on a different cts.") + except UserNotFoundError: + await bot.answer_message("User not found.") return await bot.answer_message(f"Your info:\n{dataclasses.asdict(user_info)}\n") diff --git a/pybotx/bot/bot.py b/pybotx/bot/bot.py index 0e1746fc..eb8400ce 100644 --- a/pybotx/bot/bot.py +++ b/pybotx/bot/bot.py @@ -1578,11 +1578,15 @@ async def search_user_by_huid( *, bot_id: UUID, huid: UUID, + trusts_search: bool = False, + partial_response: bool = False, ) -> UserFromSearch: """Search user by huid for search. :param bot_id: Bot which should perform the request. :param huid: User huid. + :param trusts_search: Search users on trusted servers. + :param partial_response: Return local results if trusted server lookup fails. :return: User information. """ @@ -1592,7 +1596,11 @@ async def search_user_by_huid( self._httpx_client, self._bot_accounts_storage, ) - payload = BotXAPISearchUserByHUIDRequestPayload.from_domain(huid=huid) + payload = BotXAPISearchUserByHUIDRequestPayload.from_domain( + huid=huid, + trusts_search=trusts_search, + partial_response=partial_response, + ) botx_api_user_from_search = await method.execute(payload) @@ -1604,12 +1612,16 @@ async def search_user_by_ad( bot_id: UUID, ad_login: str, ad_domain: str, + trusts_search: bool = False, + partial_response: bool = False, ) -> UserFromSearch: """Search user by AD login and AD domain for search. :param bot_id: Bot which should perform the request. :param ad_login: User AD login. :param ad_domain: User AD domain. + :param trusts_search: Search users on trusted servers. + :param partial_response: Return local results if trusted server lookup fails. :return: User information. """ @@ -1622,6 +1634,8 @@ async def search_user_by_ad( payload = BotXAPISearchUserByLoginRequestPayload.from_domain( ad_login=ad_login, ad_domain=ad_domain, + trusts_search=trusts_search, + partial_response=partial_response, ) botx_api_user_from_search = await method.execute(payload) @@ -1633,11 +1647,15 @@ async def search_user_by_other_id( *, bot_id: UUID, other_id: str, + trusts_search: bool = False, + partial_response: bool = False, ) -> UserFromSearch: """Search user by other identificator for search. :param bot_id: Bot which should perform the request. :param other_id: User other identificator. + :param trusts_search: Search users on trusted servers. + :param partial_response: Return local results if trusted server lookup fails. :return: User information. """ @@ -1649,6 +1667,8 @@ async def search_user_by_other_id( ) payload = BotXAPISearchUserByOtherIdRequestPayload.from_domain( other_id=other_id, + trusts_search=trusts_search, + partial_response=partial_response, ) botx_api_user_from_search = await method.execute(payload) diff --git a/pybotx/client/users_api/search_user_by_huid.py b/pybotx/client/users_api/search_user_by_huid.py index 9fbf8b34..d9a24246 100644 --- a/pybotx/client/users_api/search_user_by_huid.py +++ b/pybotx/client/users_api/search_user_by_huid.py @@ -4,15 +4,27 @@ from pybotx.client.botx_method import response_exception_thrower from pybotx.client.exceptions.users import UserNotFoundError from pybotx.client.users_api.user_from_search import BotXAPISearchUserResponsePayload +from pybotx.missing import Missing, Undefined from pybotx.models.api_base import UnverifiedPayloadBaseModel class BotXAPISearchUserByHUIDRequestPayload(UnverifiedPayloadBaseModel): user_huid: UUID + trusts_search: Missing[bool] = Undefined + partial_response: Missing[bool] = Undefined @classmethod - def from_domain(cls, huid: UUID) -> "BotXAPISearchUserByHUIDRequestPayload": - return cls(user_huid=huid) + def from_domain( + cls, + huid: UUID, + trusts_search: bool = False, + partial_response: bool = False, + ) -> "BotXAPISearchUserByHUIDRequestPayload": + return cls( + user_huid=huid, + trusts_search=trusts_search or Undefined, + partial_response=partial_response or Undefined, + ) class SearchUserByHUIDMethod(AuthorizedBotXMethod): diff --git a/pybotx/client/users_api/search_user_by_login.py b/pybotx/client/users_api/search_user_by_login.py index 0b74ba1e..a5eb3669 100644 --- a/pybotx/client/users_api/search_user_by_login.py +++ b/pybotx/client/users_api/search_user_by_login.py @@ -2,20 +2,30 @@ from pybotx.client.botx_method import response_exception_thrower from pybotx.client.exceptions.users import UserNotFoundError from pybotx.client.users_api.user_from_search import BotXAPISearchUserResponsePayload +from pybotx.missing import Missing, Undefined from pybotx.models.api_base import UnverifiedPayloadBaseModel class BotXAPISearchUserByLoginRequestPayload(UnverifiedPayloadBaseModel): ad_login: str ad_domain: str + trusts_search: Missing[bool] = Undefined + partial_response: Missing[bool] = Undefined @classmethod def from_domain( cls, ad_login: str, ad_domain: str, + trusts_search: bool = False, + partial_response: bool = False, ) -> "BotXAPISearchUserByLoginRequestPayload": - return cls(ad_login=ad_login, ad_domain=ad_domain) + return cls( + ad_login=ad_login, + ad_domain=ad_domain, + trusts_search=trusts_search or Undefined, + partial_response=partial_response or Undefined, + ) class SearchUserByLoginMethod(AuthorizedBotXMethod): diff --git a/pybotx/client/users_api/search_user_by_other_id.py b/pybotx/client/users_api/search_user_by_other_id.py index 0e511c53..74af996d 100644 --- a/pybotx/client/users_api/search_user_by_other_id.py +++ b/pybotx/client/users_api/search_user_by_other_id.py @@ -2,15 +2,27 @@ from pybotx.client.botx_method import response_exception_thrower from pybotx.client.exceptions.users import UserNotFoundError from pybotx.client.users_api.user_from_search import BotXAPISearchUserResponsePayload +from pybotx.missing import Missing, Undefined from pybotx.models.api_base import UnverifiedPayloadBaseModel class BotXAPISearchUserByOtherIdRequestPayload(UnverifiedPayloadBaseModel): other_id: str + trusts_search: Missing[bool] = Undefined + partial_response: Missing[bool] = Undefined @classmethod - def from_domain(cls, other_id: str) -> "BotXAPISearchUserByOtherIdRequestPayload": - return cls(other_id=other_id) + def from_domain( + cls, + other_id: str, + trusts_search: bool = False, + partial_response: bool = False, + ) -> "BotXAPISearchUserByOtherIdRequestPayload": + return cls( + other_id=other_id, + trusts_search=trusts_search or Undefined, + partial_response=partial_response or Undefined, + ) class SearchUserByOtherIdMethod(AuthorizedBotXMethod): diff --git a/pyproject.toml b/pyproject.toml index b635e579..a4e789fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pybotx" -version = "0.76.5" +version = "0.76.6" description = "A python library for interacting with eXpress BotX API" authors = [ "Sidnev Nikolay ", diff --git a/tests/client/users_api/test_search_user_by_huid.py b/tests/client/users_api/test_search_user_by_huid.py index 7ada442b..a0917033 100644 --- a/tests/client/users_api/test_search_user_by_huid.py +++ b/tests/client/users_api/test_search_user_by_huid.py @@ -151,3 +151,43 @@ async def test__search_user_by_huid_without_data__succeed( # - Assert - assert_deep_equal(user, user_from_search_without_data) assert endpoint.called + + +async def test__search_user_by_huid_with_trusts_search__succeed( + respx_mock: MockRouter, + host: str, + bot_id: UUID, + user_from_search_with_data: UserFromSearch, + user_from_search_with_data_json: dict[str, Any], + bot_factory: Any, +) -> None: + # - Arrange - + request = BotXRequest( + method="GET", + path="/api/v3/botx/users/by_huid", + params={ + "user_huid": "f837dff4-d3ad-4b8d-a0a3-5c6ca9c747d1", + "trusts_search": True, + "partial_response": True, + }, + ) + endpoint = mock_botx( + respx_mock, + host, + request, + ok_payload(user_from_search_with_data_json), + HTTPStatus.OK, + ) + + # - Act - + async with bot_factory() as bot: + user = await bot.search_user_by_huid( + bot_id=bot_id, + huid=UUID("f837dff4-d3ad-4b8d-a0a3-5c6ca9c747d1"), + trusts_search=True, + partial_response=True, + ) + + # - Assert - + assert_deep_equal(user, user_from_search_with_data) + assert endpoint.called diff --git a/tests/client/users_api/test_search_user_by_login.py b/tests/client/users_api/test_search_user_by_login.py index 75ea05cb..90f485fb 100644 --- a/tests/client/users_api/test_search_user_by_login.py +++ b/tests/client/users_api/test_search_user_by_login.py @@ -117,3 +117,45 @@ async def test__search_user_by_ad_without_data__succeed( # - Assert - assert_deep_equal(user, user_from_search_without_data) assert endpoint.called + + +async def test__search_user_by_ad_with_trusts_search__succeed( + respx_mock: MockRouter, + host: str, + bot_id: UUID, + user_from_search_with_data: UserFromSearch, + user_from_search_with_data_json: dict[str, Any], + bot_factory: Any, +) -> None: + # - Arrange - + request = BotXRequest( + method="GET", + path="/api/v3/botx/users/by_login", + params={ + "ad_login": "ad_user_login", + "ad_domain": "cts.com", + "trusts_search": True, + "partial_response": True, + }, + ) + endpoint = mock_botx( + respx_mock, + host, + request, + ok_payload(user_from_search_with_data_json), + HTTPStatus.OK, + ) + + # - Act - + async with bot_factory() as bot: + user = await bot.search_user_by_ad( + bot_id=bot_id, + ad_login="ad_user_login", + ad_domain="cts.com", + trusts_search=True, + partial_response=True, + ) + + # - Assert - + assert_deep_equal(user, user_from_search_with_data) + assert endpoint.called diff --git a/tests/client/users_api/test_search_user_by_other_id.py b/tests/client/users_api/test_search_user_by_other_id.py index df8d3465..b55b85c4 100644 --- a/tests/client/users_api/test_search_user_by_other_id.py +++ b/tests/client/users_api/test_search_user_by_other_id.py @@ -114,3 +114,43 @@ async def test__search_user_by_other_id_without_data__succeed( # - Assert - assert_deep_equal(user, user_from_search_without_data) assert endpoint.called + + +async def test__search_user_by_other_id_with_trusts_search__succeed( + respx_mock: MockRouter, + host: str, + bot_id: UUID, + user_from_search_with_data: UserFromSearch, + user_from_search_with_data_json: dict[str, Any], + bot_factory: Any, +) -> None: + # - Arrange - + request = BotXRequest( + method="GET", + path="/api/v3/botx/users/by_other_id", + params={ + "other_id": "some_id", + "trusts_search": True, + "partial_response": True, + }, + ) + endpoint = mock_botx( + respx_mock, + host, + request, + ok_payload(user_from_search_with_data_json), + HTTPStatus.OK, + ) + + # - Act - + async with bot_factory() as bot: + user = await bot.search_user_by_other_id( + bot_id=bot_id, + other_id="some_id", + trusts_search=True, + partial_response=True, + ) + + # - Assert - + assert_deep_equal(user, user_from_search_with_data) + assert endpoint.called From b28d5bb00fec8b066004a228f257a21c251b0d61 Mon Sep 17 00:00:00 2001 From: Aleksandr Osovskii Date: Tue, 15 Sep 2026 17:39:25 +0300 Subject: [PATCH 06/19] widgets --- docs/production_presets.md | 163 ++ pybotx/cli.py | 491 ++++ pybotx/integrations/__init__.py | 11 + pybotx/integrations/fastapi.py | 287 +++ pybotx/presets.py | 217 ++ pybotx/scaffold/__init__.py | 75 + pybotx/scaffold/_shared.py | 75 + pybotx/scaffold/command.py | 173 ++ pybotx/scaffold/fsm_flow.py | 289 +++ pybotx/scaffold/manifest.py | 223 ++ pybotx/scaffold/port.py | 76 + pybotx/scaffold/project.py | 323 +++ pybotx/scaffold/repository.py | 235 ++ pybotx/scaffold/service.py | 134 ++ pybotx/scaffold/templates.py | 3245 +++++++++++++++++++++++++++ pybotx/scaffold/widget.py | 395 ++++ pybotx/scaffold/widget_flow.py | 433 ++++ pybotx/widgets/factory.py | 464 ++++ pybotx/widgets/observability.py | 262 +++ pybotx/widgets/presets.py | 99 + tests/test_fastapi_adapter.py | 136 ++ tests/test_presets.py | 220 ++ tests/test_scaffold.py | 1426 ++++++++++++ tests/widgets/test_factory.py | 669 ++++++ tests/widgets/test_observability.py | 172 ++ tests/widgets/test_presets.py | 149 ++ 26 files changed, 10442 insertions(+) create mode 100644 docs/production_presets.md create mode 100644 pybotx/cli.py create mode 100644 pybotx/integrations/__init__.py create mode 100644 pybotx/integrations/fastapi.py create mode 100644 pybotx/presets.py create mode 100644 pybotx/scaffold/__init__.py create mode 100644 pybotx/scaffold/_shared.py create mode 100644 pybotx/scaffold/command.py create mode 100644 pybotx/scaffold/fsm_flow.py create mode 100644 pybotx/scaffold/manifest.py create mode 100644 pybotx/scaffold/port.py create mode 100644 pybotx/scaffold/project.py create mode 100644 pybotx/scaffold/repository.py create mode 100644 pybotx/scaffold/service.py create mode 100644 pybotx/scaffold/templates.py create mode 100644 pybotx/scaffold/widget.py create mode 100644 pybotx/scaffold/widget_flow.py create mode 100644 pybotx/widgets/factory.py create mode 100644 pybotx/widgets/observability.py create mode 100644 pybotx/widgets/presets.py create mode 100644 tests/test_fastapi_adapter.py create mode 100644 tests/test_presets.py create mode 100644 tests/test_scaffold.py create mode 100644 tests/widgets/test_factory.py create mode 100644 tests/widgets/test_observability.py create mode 100644 tests/widgets/test_presets.py diff --git a/docs/production_presets.md b/docs/production_presets.md new file mode 100644 index 00000000..979bce86 --- /dev/null +++ b/docs/production_presets.md @@ -0,0 +1,163 @@ +# Production presets in pybotx + +## Зачем это нужно + +После добавления retry, metrics и tracing в `pybotx` основной сценарий выглядел +правильно, но был слишком многословным: + +```python +bot = Bot( + collectors=[collector], + bot_accounts=[bot_account], + retry_policy=BotXRetryPolicy(...), + retry_request_policy=..., + metrics_collector=PrometheusMetricsCollector(...), + tracing_collector=OpenTelemetryTracingCollector(...), + ingress_metrics_collector=PrometheusIngressMetricsCollector(...), +) +``` + +Для production это нормальная мощность API, но плохой DX для типового проекта. +Поэтому в библиотеку добавлен отдельный factory/preset layer. + +## Что добавлено + +- `BotRetryPreset` +- `BotObservabilityPreset` +- `BotProductionPreset` +- `build_production_retry_preset()` +- `build_production_observability_preset()` +- `build_production_bot_preset()` + +Каждый preset - immutable value object, который можно превратить в kwargs для +`Bot` через `as_bot_kwargs()`. + +## Базовый сценарий + +```python +from pybotx import Bot, build_production_bot_preset + +production_preset = build_production_bot_preset() + +bot = Bot( + collectors=[collector], + bot_accounts=[bot_account], + **production_preset.as_bot_kwargs(), +) +``` + +По умолчанию такой preset собирает: + +- production retry preset; +- `PrometheusMetricsCollector` для outgoing BotX requests; +- `PrometheusIngressMetricsCollector` для ingress queue/latency/errors/rejected; +- `OpenTelemetryTracingCollector` для outgoing BotX requests. + +Для этого нужны optional dependencies: + +```bash +uv add prometheus-client opentelemetry-api +``` + +## Retry preset + +`build_production_retry_preset()` включает: + +- `BotXRetryPolicy` с production defaults из `pybotx`; +- composable `retry_request_policy`: + - `SafeBotXRetryRequestPolicy()` + - `KnownSafeBotXRetryRequestPolicy()` + +Это дает такой результат: + +- generic safe retry для `GET/HEAD/OPTIONS`; +- safe retry для read-only `POST`, которые уже известны библиотеке; +- safe-by-default поведение для стандартных built-in методов `pybotx`. + +Пример кастомизации: + +```python +from pybotx import BotXOperation, build_production_retry_preset + +retry_preset = build_production_retry_preset( + max_attempts=5, + extra_safe_operations={BotXOperation.DIRECT_NOTIFICATION}, +) +``` + +Если передан свой `retry_request_policy`, одновременно передавать +`extra_safe_requests` или `extra_safe_operations` нельзя: builder это запрещает, +чтобы не было неявного precedence. + +## Observability preset + +`build_production_observability_preset()` по умолчанию собирает: + +- outgoing Prometheus metrics; +- ingress Prometheus metrics; +- OpenTelemetry tracing. + +Пример отключить tracing, но оставить metrics: + +```python +from pybotx import build_production_observability_preset + +observability_preset = build_production_observability_preset( + enable_open_telemetry_tracing=False, +) +``` + +Пример наоборот, только tracing: + +```python +from pybotx import build_production_observability_preset + +observability_preset = build_production_observability_preset( + enable_prometheus_metrics=False, + tracer_name="mybot.pybotx", +) +``` + +Если выключить оба backend одновременно, builder поднимет `ValueError`. + +## Сборка полного production preset + +Если нужен полный preset с кастомизированными частями: + +```python +from pybotx import ( + build_production_bot_preset, + build_production_observability_preset, + build_production_retry_preset, +) + +production_preset = build_production_bot_preset( + retry_preset=build_production_retry_preset(max_attempts=5), + observability_preset=build_production_observability_preset( + enable_open_telemetry_tracing=False, + ), +) +``` + +## Почему это отдельный layer, а не новый аргумент в Bot + +Выбран паттерн `Factory + Value Object`. + +Причина: + +- не раздувает `Bot.__init__` еще сильнее; +- не вводит сложные precedence rules между `preset` и обычными kwargs; +- оставляет текущий `Bot` API обратно совместимым; +- упрощает документацию и тестирование. + +Альтернатива была такой: + +- добавить `production_preset=` в `Bot` + +Но тогда пришлось бы отдельно определять: + +- кто кого переопределяет; +- можно ли смешивать preset и raw kwargs; +- как валидировать конфликтующие параметры. + +Для текущей задачи отдельный preset layer проще и чище. diff --git a/pybotx/cli.py b/pybotx/cli.py new file mode 100644 index 00000000..02939d1f --- /dev/null +++ b/pybotx/cli.py @@ -0,0 +1,491 @@ +from __future__ import annotations + +import argparse +from pathlib import Path +import sys +from typing import Sequence + +from pybotx.scaffold import ( + CreateBotProjectOptions, + CreateCommandOptions, + CreateFSMFlowOptions, + CreatePortOptions, + CreateRepositoryOptions, + CreateServiceOptions, + CreateWidgetOptions, + CreateWidgetFlowOptions, + create_bot_project, + create_command_in_project, + create_fsm_flow_in_project, + create_port_in_project, + create_repository_in_project, + create_service_in_project, + create_widget_in_project, + create_widget_flow_in_project, +) + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="pybotx", + description="CLI utilities for pybotx projects.", + ) + subparsers = parser.add_subparsers(dest="command", required=True) + + create_parser = subparsers.add_parser( + "create", + help="Create new assets managed by pybotx.", + ) + create_subparsers = create_parser.add_subparsers( + dest="create_command", + required=True, + ) + + create_bot_parser = create_subparsers.add_parser( + "bot", + help="Generate a production-ready pybotx bot project.", + ) + create_bot_parser.add_argument( + "target_dir", + nargs="?", + default=".", + help="Directory to generate the bot into. Defaults to the current directory.", + ) + create_bot_parser.add_argument( + "--template", + default="production-fastapi", + choices=("production-fastapi", "production-fastapi-fsm"), + help="Scaffold template to use.", + ) + create_bot_parser.add_argument( + "--project-name", + help="Explicit project name. Defaults to the target directory name.", + ) + create_bot_parser.add_argument( + "--package-name", + help="Python package name. Defaults to a normalized project name.", + ) + create_bot_parser.add_argument( + "--display-name", + help="Human-readable bot name used in README and default settings.", + ) + create_bot_parser.add_argument( + "--description", + help="Project description written into pyproject.toml.", + ) + create_bot_parser.add_argument( + "--otel-tracing", + action="store_true", + help="Enable OpenTelemetry tracing by default in generated settings.", + ) + create_bot_parser.add_argument( + "--no-docker", + action="store_true", + help="Skip Dockerfile and docker-compose.yml generation.", + ) + + create_command_parser = create_subparsers.add_parser( + "command", + help="Generate a command module inside a pybotx scaffold project.", + ) + create_command_parser.add_argument( + "command_name", + help="Command name, for example `ping-users` or `/ping-users`.", + ) + create_command_parser.add_argument( + "--project-dir", + default=".", + help="Path inside the target pybotx scaffold project.", + ) + create_command_parser.add_argument( + "--description", + help="Command description for Bot status menu.", + ) + create_command_parser.add_argument( + "--response-text", + help="Default response text returned by the generated service.", + ) + + create_service_parser = create_subparsers.add_parser( + "service", + help="Generate an application service and register it in the DI container.", + ) + create_service_parser.add_argument( + "service_name", + help="Service name, for example `sync-users`.", + ) + create_service_parser.add_argument( + "--project-dir", + default=".", + help="Path inside the target pybotx scaffold project.", + ) + create_service_parser.add_argument( + "--response-text", + help="Default response text returned by the generated service.", + ) + + create_port_parser = create_subparsers.add_parser( + "port", + help="Generate a domain port contract inside a pybotx scaffold project.", + ) + create_port_parser.add_argument( + "port_name", + help="Port name, for example `billing-gateway`.", + ) + create_port_parser.add_argument( + "--project-dir", + default=".", + help="Path inside the target pybotx scaffold project.", + ) + + create_repository_parser = create_subparsers.add_parser( + "repository", + help="Generate a domain port + infrastructure repository stub and register it in DI.", + ) + create_repository_parser.add_argument( + "repository_name", + help="Repository name, for example `user-profile`.", + ) + create_repository_parser.add_argument( + "--port", + dest="port_name", + help="Existing domain port name to bind the generated repository to.", + ) + create_repository_parser.add_argument( + "--project-dir", + default=".", + help="Path inside the target pybotx scaffold project.", + ) + + create_use_case_parser = create_subparsers.add_parser( + "use-case", + help="Alias of `create service` for teams that prefer use-case terminology.", + ) + create_use_case_parser.add_argument( + "service_name", + help="Use-case name, for example `sync-users`.", + ) + create_use_case_parser.add_argument( + "--project-dir", + default=".", + help="Path inside the target pybotx scaffold project.", + ) + create_use_case_parser.add_argument( + "--response-text", + help="Default response text returned by the generated service.", + ) + + create_fsm_flow_parser = create_subparsers.add_parser( + "fsm-flow", + help="Generate an FSM flow module inside a pybotx FSM scaffold project.", + ) + create_fsm_flow_parser.add_argument( + "flow_name", + help="FSM flow name, for example `approval` or `order-approval`.", + ) + create_fsm_flow_parser.add_argument( + "--project-dir", + default=".", + help="Path inside the target pybotx scaffold project.", + ) + create_fsm_flow_parser.add_argument( + "--command-name", + help="Explicit command name used to start the generated flow.", + ) + create_fsm_flow_parser.add_argument( + "--description", + help="Command description for Bot status menu.", + ) + create_fsm_flow_parser.add_argument( + "--initial-prompt", + help="Initial prompt sent when the generated FSM flow starts.", + ) + create_fsm_flow_parser.add_argument( + "--completion-text", + help="Static message sent when the generated FSM flow completes.", + ) + + create_widget_parser = create_subparsers.add_parser( + "widget", + help="Generate a widget command inside a pybotx scaffold project.", + ) + create_widget_parser.add_argument( + "widget_name", + help="Widget name, for example `deployment-approval`.", + ) + create_widget_parser.add_argument( + "--project-dir", + default=".", + help="Path inside the target pybotx scaffold project.", + ) + create_widget_parser.add_argument( + "--kind", + default="confirm", + choices=( + "confirm", + "approval", + "select", + "search-select", + "multi-select", + "date-range", + ), + help="Generated widget kind.", + ) + create_widget_parser.add_argument( + "--command-name", + help="Explicit command name used to start the generated widget.", + ) + create_widget_parser.add_argument( + "--description", + help="Command description for Bot status menu.", + ) + + create_widget_flow_parser = create_subparsers.add_parser( + "widget-flow", + help="Generate a command + widget + follow-up service flow inside a pybotx scaffold project.", + ) + create_widget_flow_parser.add_argument( + "flow_name", + help="Widget flow name, for example `deployment-approval`.", + ) + create_widget_flow_parser.add_argument( + "--project-dir", + default=".", + help="Path inside the target pybotx scaffold project.", + ) + create_widget_flow_parser.add_argument( + "--kind", + default="confirm", + choices=( + "confirm", + "approval", + "select", + "search-select", + "multi-select", + "date-range", + ), + help="Generated widget flow kind.", + ) + create_widget_flow_parser.add_argument( + "--command-name", + help="Explicit command name used to start the generated widget flow.", + ) + create_widget_flow_parser.add_argument( + "--description", + help="Command description for Bot status menu.", + ) + + return parser + + +def main(argv: Sequence[str] | None = None) -> int: + parser = build_parser() + args = parser.parse_args(list(argv) if argv is not None else None) + + if args.command == "create" and args.create_command == "bot": + return _handle_create_bot(args) + if args.command == "create" and args.create_command == "command": + return _handle_create_command(args) + if args.command == "create" and args.create_command == "port": + return _handle_create_port(args) + if args.command == "create" and args.create_command == "repository": + return _handle_create_repository(args) + if args.command == "create" and args.create_command in {"service", "use-case"}: + return _handle_create_service(args) + if args.command == "create" and args.create_command == "fsm-flow": + return _handle_create_fsm_flow(args) + if args.command == "create" and args.create_command == "widget": + return _handle_create_widget(args) + if args.command == "create" and args.create_command == "widget-flow": + return _handle_create_widget_flow(args) + + parser.error("Unknown command") + return 2 + + +def _handle_create_bot(args: argparse.Namespace) -> int: + try: + result = create_bot_project( + CreateBotProjectOptions( + target_dir=Path(args.target_dir), + template=args.template, + project_name=args.project_name, + package_name=args.package_name, + display_name=args.display_name, + description=args.description, + enable_otel_tracing=args.otel_tracing, + include_docker=not args.no_docker, + ), + ) + except (FileExistsError, RuntimeError, ValueError) as exc: + print(f"Error: {exc}", file=sys.stderr) + return 1 + + print(f"Created pybotx bot project in {result.root_dir}") + print(f"Template: {result.template}") + print(f"Package: {result.package_name}") + print("Next steps:") + print(f" cd {result.root_dir}") + print(" cp .env.example .env") + print(" uv sync") + print(f" uv run uvicorn {result.package_name}.main:app --reload") + return 0 + + +def _handle_create_command(args: argparse.Namespace) -> int: + try: + result = create_command_in_project( + CreateCommandOptions( + command_name=args.command_name, + project_dir=Path(args.project_dir), + description=args.description, + response_text=args.response_text, + ), + ) + except (FileExistsError, FileNotFoundError, RuntimeError, ValueError) as exc: + print(f"Error: {exc}", file=sys.stderr) + return 1 + + print(f"Created command {result.command_path} in {result.project_root}") + print("Created files:") + for created_file in result.created_files: + print(f" {created_file}") + return 0 + + +def _handle_create_port(args: argparse.Namespace) -> int: + try: + result = create_port_in_project( + CreatePortOptions( + port_name=args.port_name, + project_dir=Path(args.project_dir), + ), + ) + except (FileExistsError, FileNotFoundError, RuntimeError, ValueError) as exc: + print(f"Error: {exc}", file=sys.stderr) + return 1 + + print(f"Created port {result.port_name} in {result.project_root}") + print("Created files:") + for created_file in result.created_files: + print(f" {created_file}") + return 0 + + +def _handle_create_repository(args: argparse.Namespace) -> int: + try: + result = create_repository_in_project( + CreateRepositoryOptions( + repository_name=args.repository_name, + project_dir=Path(args.project_dir), + port_name=args.port_name, + ), + ) + except (FileExistsError, FileNotFoundError, RuntimeError, ValueError) as exc: + print(f"Error: {exc}", file=sys.stderr) + return 1 + + print( + f"Created repository {result.repository_name} bound to port " + f"{result.port_name} in {result.project_root}", + ) + print("Created files:") + for created_file in result.created_files: + print(f" {created_file}") + return 0 + + +def _handle_create_service(args: argparse.Namespace) -> int: + try: + result = create_service_in_project( + CreateServiceOptions( + service_name=args.service_name, + project_dir=Path(args.project_dir), + response_text=args.response_text, + ), + ) + except (FileExistsError, FileNotFoundError, RuntimeError, ValueError) as exc: + print(f"Error: {exc}", file=sys.stderr) + return 1 + + print(f"Created application service {result.service_name} in {result.project_root}") + print("Created files:") + for created_file in result.created_files: + print(f" {created_file}") + return 0 + + +def _handle_create_fsm_flow(args: argparse.Namespace) -> int: + try: + result = create_fsm_flow_in_project( + CreateFSMFlowOptions( + flow_name=args.flow_name, + project_dir=Path(args.project_dir), + command_name=args.command_name, + description=args.description, + initial_prompt=args.initial_prompt, + completion_text=args.completion_text, + ), + ) + except (FileExistsError, FileNotFoundError, RuntimeError, ValueError) as exc: + print(f"Error: {exc}", file=sys.stderr) + return 1 + + print(f"Created FSM flow {result.flow_name} in {result.project_root}") + print(f"Start command: {result.command_path}") + print("Created files:") + for created_file in result.created_files: + print(f" {created_file}") + return 0 + + +def _handle_create_widget(args: argparse.Namespace) -> int: + try: + result = create_widget_in_project( + CreateWidgetOptions( + widget_name=args.widget_name, + project_dir=Path(args.project_dir), + kind=args.kind, + command_name=args.command_name, + description=args.description, + ), + ) + except (FileExistsError, FileNotFoundError, RuntimeError, ValueError) as exc: + print(f"Error: {exc}", file=sys.stderr) + return 1 + + print( + f"Created {result.kind} widget {result.widget_name} in {result.project_root}", + ) + print(f"Start command: {result.command_path}") + print("Created files:") + for created_file in result.created_files: + print(f" {created_file}") + return 0 + + +def _handle_create_widget_flow(args: argparse.Namespace) -> int: + try: + result = create_widget_flow_in_project( + CreateWidgetFlowOptions( + flow_name=args.flow_name, + project_dir=Path(args.project_dir), + kind=args.kind, + command_name=args.command_name, + description=args.description, + ), + ) + except (FileExistsError, FileNotFoundError, RuntimeError, ValueError) as exc: + print(f"Error: {exc}", file=sys.stderr) + return 1 + + print(f"Created {result.kind} widget flow {result.flow_name} in {result.project_root}") + print(f"Start command: {result.command_path}") + print("Created files:") + for created_file in result.created_files: + print(f" {created_file}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/pybotx/integrations/__init__.py b/pybotx/integrations/__init__.py new file mode 100644 index 00000000..e295063c --- /dev/null +++ b/pybotx/integrations/__init__.py @@ -0,0 +1,11 @@ +from pybotx.integrations.fastapi import ( + FastAPIBotAppConfig, + create_fastapi_bot_app, + setup_fastapi_bot, +) + +__all__ = [ + "FastAPIBotAppConfig", + "create_fastapi_bot_app", + "setup_fastapi_bot", +] diff --git a/pybotx/integrations/fastapi.py b/pybotx/integrations/fastapi.py new file mode 100644 index 00000000..51b296ab --- /dev/null +++ b/pybotx/integrations/fastapi.py @@ -0,0 +1,287 @@ +from __future__ import annotations + +from collections.abc import Mapping +from dataclasses import dataclass +from http import HTTPStatus +import importlib +from typing import TYPE_CHECKING, Any, cast + +from pybotx.bot.api.responses.bot_disabled import build_bot_disabled_response +from pybotx.bot.api.responses.command_accepted import build_command_accepted_response +from pybotx.bot.api.responses.unverified_request import ( + build_unverified_request_response, +) +from pybotx.bot.bot import Bot +from pybotx.bot.exceptions import UnknownBotAccountError, UnverifiedRequestError +from pybotx.bot.healthcheck import HealthcheckService, setup_healthcheck +from pybotx.logger import logger + +if TYPE_CHECKING: + from fastapi import FastAPI, Request + + +@dataclass(frozen=True, slots=True) +class FastAPIBotAppConfig: + command_path: str = "/command" + status_path: str = "/status" + callback_path: str = "/notification/callback" + smartapp_request_path: str | None = None + metrics_path: str | None = None + healthcheck_prefix: str | None = "/health" + verify_request: bool = True + verify_callback_request: bool = False + trusted_issuers: frozenset[str] | None = None + + def __post_init__(self) -> None: + route_paths = { + "command_path": self.command_path, + "status_path": self.status_path, + "callback_path": self.callback_path, + "smartapp_request_path": self.smartapp_request_path, + "metrics_path": self.metrics_path, + "healthcheck_prefix": self.healthcheck_prefix, + } + + seen_paths: set[str] = set() + for field_name, path in route_paths.items(): + if path is None: + continue + if not path.startswith("/"): + raise ValueError(f"`{field_name}` should start with '/'") + if path in seen_paths: + raise ValueError(f"Duplicate FastAPI route path `{path}`") + seen_paths.add(path) + + +def create_fastapi_bot_app( + *, + bot: Bot, + title: str = "pybotx", + openapi_url: str | None = "/openapi.json", + docs_url: str | None = "/docs", + redoc_url: str | None = "/redoc", + config: FastAPIBotAppConfig | None = None, + metrics_registry: Any | None = None, + healthcheck: HealthcheckService | None = None, + app_state: Mapping[str, Any] | None = None, +) -> "FastAPI": + fastapi_module, _, _, _ = _import_fastapi_runtime() + fastapi_cls = getattr(fastapi_module, "FastAPI") + + app = fastapi_cls( + title=title, + openapi_url=openapi_url, + docs_url=docs_url, + redoc_url=redoc_url, + ) + setup_fastapi_bot( + app, + bot=bot, + config=config, + metrics_registry=metrics_registry, + healthcheck=healthcheck, + app_state=app_state, + ) + return cast("FastAPI", app) + + +def setup_fastapi_bot( + app: "FastAPI", + *, + bot: Bot, + config: FastAPIBotAppConfig | None = None, + metrics_registry: Any | None = None, + healthcheck: HealthcheckService | None = None, + app_state: Mapping[str, Any] | None = None, +) -> HealthcheckService | None: + config = config or FastAPIBotAppConfig() + _, request_cls, response_cls, json_response_cls = _import_fastapi_runtime() + globals()["Request"] = request_cls + + if config.metrics_path is not None and metrics_registry is None: + raise ValueError( + "`metrics_registry` should be provided when `metrics_path` is configured", + ) + if config.healthcheck_prefix is None and healthcheck is not None: + raise ValueError( + "`healthcheck` can't be passed when `healthcheck_prefix` is disabled", + ) + reserved_state_keys = {"bot", "healthcheck"} + if app_state is not None and reserved_state_keys.intersection(app_state): + reserved_keys = ", ".join(sorted(reserved_state_keys.intersection(app_state))) + raise ValueError( + f"`app_state` can't override reserved state keys: {reserved_keys}", + ) + + app.state.bot = bot + for state_key, state_value in (app_state or {}).items(): + setattr(app.state, state_key, state_value) + + app.add_event_handler("startup", bot.startup) + app.add_event_handler("shutdown", bot.shutdown) + + if config.healthcheck_prefix is not None: + healthcheck = setup_healthcheck( + app, + healthcheck=healthcheck, + prefix=config.healthcheck_prefix, + ) + app.state.healthcheck = healthcheck + + @app.post(config.command_path) + async def command_handler(request: Request) -> Any: + try: + bot.async_execute_raw_bot_command( + await request.json(), + verify_request=config.verify_request, + request_headers=request.headers, + trusted_issuers=_trusted_issuers(config), + ) + except ValueError as exc: + return _build_disabled_response( + str(exc) or "Bot command validation error", + json_response_cls, + ) + except UnknownBotAccountError as exc: + error_label = f"No credentials for bot {exc.bot_id}" + logger.warning(error_label) + return _build_disabled_response(error_label, json_response_cls) + except UnverifiedRequestError as exc: + return _build_unverified_response(str(exc), json_response_cls) + + return json_response_cls( + build_command_accepted_response(), + status_code=HTTPStatus.ACCEPTED, + ) + + @app.get(config.status_path) + async def status_handler(request: Request) -> Any: + try: + status = await bot.raw_get_status( + dict(request.query_params), + verify_request=config.verify_request, + request_headers=request.headers, + trusted_issuers=_trusted_issuers(config), + ) + except ValueError as exc: + return _build_disabled_response( + str(exc) or "Status request validation error", + json_response_cls, + ) + except UnknownBotAccountError as exc: + error_label = f"No credentials for bot {exc.bot_id}" + logger.warning(error_label) + return _build_disabled_response(error_label, json_response_cls) + except UnverifiedRequestError as exc: + return _build_unverified_response(str(exc), json_response_cls) + + return json_response_cls(status, status_code=HTTPStatus.OK) + + @app.post(config.callback_path) + async def callback_handler(request: Request) -> Any: + try: + await bot.set_raw_botx_method_result( + await request.json(), + verify_request=config.verify_callback_request, + request_headers=request.headers, + trusted_issuers=_trusted_issuers(config), + ) + except UnverifiedRequestError as exc: + return _build_unverified_response(str(exc), json_response_cls) + + return json_response_cls( + build_command_accepted_response(), + status_code=HTTPStatus.ACCEPTED, + ) + + if config.smartapp_request_path is not None: + + @app.post(config.smartapp_request_path) + async def sync_smartapp_event_handler(request: Request) -> Any: + try: + response = await bot.sync_execute_raw_smartapp_event( + await request.json(), + verify_request=config.verify_request, + request_headers=request.headers, + trusted_issuers=_trusted_issuers(config), + ) + except ValueError as exc: + return _build_disabled_response( + str(exc) or "Sync smartapp event validation error", + json_response_cls, + ) + except UnknownBotAccountError as exc: + error_label = f"No credentials for bot {exc.bot_id}" + logger.warning(error_label) + return _build_disabled_response(error_label, json_response_cls) + except UnverifiedRequestError as exc: + return _build_unverified_response(str(exc), json_response_cls) + + return json_response_cls(response.jsonable_dict(), status_code=HTTPStatus.OK) + + if config.metrics_path is not None: + generate_latest, content_type = _build_metrics_runtime() + + @app.get(config.metrics_path) + async def metrics_handler() -> Any: + return response_cls( + content=generate_latest(metrics_registry), + media_type=content_type, + ) + + return healthcheck + + +def _build_disabled_response(error_label: str, json_response_cls: Any) -> Any: + logger.exception(error_label) + return json_response_cls( + build_bot_disabled_response(error_label), + status_code=HTTPStatus.SERVICE_UNAVAILABLE, + ) + + +def _build_unverified_response(error_label: str, json_response_cls: Any) -> Any: + logger.warning(error_label) + return json_response_cls( + build_unverified_request_response(status_message=error_label), + status_code=HTTPStatus.UNAUTHORIZED, + ) + + +def _trusted_issuers(config: FastAPIBotAppConfig) -> set[str] | None: + if config.trusted_issuers is None: + return None + return set(config.trusted_issuers) + + +def _build_metrics_runtime() -> tuple[Any, str]: + try: + prometheus_client = importlib.import_module("prometheus_client") + except ModuleNotFoundError as exc: + raise RuntimeError( + "FastAPI metrics endpoint requires `prometheus-client`. " + "Install with `uv add prometheus-client`.", + ) from exc + + return ( + getattr(prometheus_client, "generate_latest"), + getattr(prometheus_client, "CONTENT_TYPE_LATEST"), + ) + + +def _import_fastapi_runtime() -> tuple[Any, Any, Any, Any]: + try: + fastapi_module = importlib.import_module("fastapi") + fastapi_responses_module = importlib.import_module("fastapi.responses") + except ModuleNotFoundError as exc: + raise RuntimeError( + "FastAPI integration requires `fastapi`. " + "Install with `uv add fastapi`.", + ) from exc + + return ( + fastapi_module, + getattr(fastapi_module, "Request"), + getattr(fastapi_module, "Response"), + getattr(fastapi_responses_module, "JSONResponse"), + ) diff --git a/pybotx/presets.py b/pybotx/presets.py new file mode 100644 index 00000000..0fca1de6 --- /dev/null +++ b/pybotx/presets.py @@ -0,0 +1,217 @@ +from collections.abc import Collection, Sequence +from dataclasses import dataclass +from typing import Any + +from pybotx.bot.ingress_observability import ( + BotIngressMetricsCollector, + PrometheusIngressMetricsCollector, + ReasonNormalizer as IngressReasonNormalizer, +) +from pybotx.client.http_config import ( + AllowedRequestPattern, + AnyOfBotXRetryRequestPolicy, + BotXOperation, + BotXRetryPolicy, + BotXRetryRequestPolicy, + BotXRetryStrategy, + KnownSafeBotXRetryRequestPolicy, + OperationName, + SafeBotXRetryRequestPolicy, +) +from pybotx.client.observability import ( + BotXRequestObserver, + OpenTelemetryTracingCollector, + PathNormalizer, + PrometheusMetricsCollector, + ReasonNormalizer as OutgoingReasonNormalizer, + SpanEnricher, +) +from pybotx.constants import ( + BOTX_HTTP_RETRY_ATTEMPTS, + BOTX_HTTP_RETRY_INITIAL_DELAY_SECONDS, + BOTX_HTTP_RETRY_JITTER_SECONDS, + BOTX_HTTP_RETRY_MAX_DELAY_SECONDS, +) + + +def _normalize_operation_names( + operation_names: Collection[OperationName] | None, +) -> tuple[str, ...] | None: + if operation_names is None: + return None + + return tuple( + operation_name.value + if isinstance(operation_name, BotXOperation) + else operation_name + for operation_name in operation_names + ) + + +@dataclass(frozen=True, slots=True) +class BotRetryPreset: + retry_policy: BotXRetryPolicy + retry_request_policy: BotXRetryRequestPolicy + retry_strategy: BotXRetryStrategy | None = None + + def as_bot_kwargs(self) -> dict[str, object]: + kwargs: dict[str, object] = { + "retry_policy": self.retry_policy, + "retry_request_policy": self.retry_request_policy, + } + if self.retry_strategy is not None: + kwargs["retry_strategy"] = self.retry_strategy + return kwargs + + +@dataclass(frozen=True, slots=True) +class BotObservabilityPreset: + metrics_collector: BotXRequestObserver | None = None + tracing_collector: BotXRequestObserver | None = None + ingress_metrics_collector: BotIngressMetricsCollector | None = None + + def as_bot_kwargs(self) -> dict[str, object]: + kwargs: dict[str, object] = {} + if self.metrics_collector is not None: + kwargs["metrics_collector"] = self.metrics_collector + if self.tracing_collector is not None: + kwargs["tracing_collector"] = self.tracing_collector + if self.ingress_metrics_collector is not None: + kwargs["ingress_metrics_collector"] = self.ingress_metrics_collector + return kwargs + + +@dataclass(frozen=True, slots=True) +class BotProductionPreset: + retry: BotRetryPreset | None = None + observability: BotObservabilityPreset | None = None + + def as_bot_kwargs(self) -> dict[str, object]: + kwargs: dict[str, object] = {} + if self.retry is not None: + kwargs.update(self.retry.as_bot_kwargs()) + if self.observability is not None: + kwargs.update(self.observability.as_bot_kwargs()) + return kwargs + + +def build_production_retry_preset( + *, + max_attempts: int = BOTX_HTTP_RETRY_ATTEMPTS, + initial_delay_seconds: float = BOTX_HTTP_RETRY_INITIAL_DELAY_SECONDS, + max_delay_seconds: float = BOTX_HTTP_RETRY_MAX_DELAY_SECONDS, + jitter_seconds: float = BOTX_HTTP_RETRY_JITTER_SECONDS, + retryable_status_codes: Collection[int] | None = None, + retry_request_policy: BotXRetryRequestPolicy | None = None, + retry_strategy: BotXRetryStrategy | None = None, + extra_safe_requests: Collection[AllowedRequestPattern] | None = None, + extra_safe_operations: Collection[OperationName] | None = None, +) -> BotRetryPreset: + if retry_request_policy is not None and ( + extra_safe_requests is not None or extra_safe_operations is not None + ): + raise ValueError( + "`extra_safe_requests` and `extra_safe_operations` can't be passed " + "with custom `retry_request_policy`", + ) + + if retry_request_policy is None: + retry_request_policy = AnyOfBotXRetryRequestPolicy( + policies=( + SafeBotXRetryRequestPolicy( + extra_safe_requests=extra_safe_requests, + extra_safe_operation_names=_normalize_operation_names( + extra_safe_operations, + ), + ), + KnownSafeBotXRetryRequestPolicy(), + ), + ) + + if retryable_status_codes is None: + retry_policy = BotXRetryPolicy( + max_attempts=max_attempts, + initial_delay_seconds=initial_delay_seconds, + max_delay_seconds=max_delay_seconds, + jitter_seconds=jitter_seconds, + ) + else: + retry_policy = BotXRetryPolicy( + max_attempts=max_attempts, + initial_delay_seconds=initial_delay_seconds, + max_delay_seconds=max_delay_seconds, + jitter_seconds=jitter_seconds, + retryable_status_codes=frozenset(retryable_status_codes), + ) + + return BotRetryPreset( + retry_policy=retry_policy, + retry_request_policy=retry_request_policy, + retry_strategy=retry_strategy, + ) + + +def build_production_observability_preset( + *, + enable_prometheus_metrics: bool = True, + enable_open_telemetry_tracing: bool = True, + registry: Any | None = None, + botx_metric_prefix: str = "pybotx_botx", + ingress_metric_prefix: str = "pybotx_ingress", + botx_latency_buckets: Sequence[float] | None = None, + ingress_latency_buckets: Sequence[float] | None = None, + path_normalizer: PathNormalizer | None = None, + retry_reason_normalizer: OutgoingReasonNormalizer | None = None, + ingress_reason_normalizer: IngressReasonNormalizer | None = None, + tracer_name: str = "pybotx.botx", + tracer_provider: Any | None = None, + span_name_template: str = "{method} {path}", + span_enricher: SpanEnricher | None = None, +) -> BotObservabilityPreset: + if not enable_prometheus_metrics and not enable_open_telemetry_tracing: + raise ValueError( + "At least one observability backend should be enabled", + ) + + metrics_collector: BotXRequestObserver | None = None + ingress_metrics_collector: BotIngressMetricsCollector | None = None + if enable_prometheus_metrics: + metrics_collector = PrometheusMetricsCollector( + registry=registry, + metric_prefix=botx_metric_prefix, + latency_buckets=botx_latency_buckets, + path_normalizer=path_normalizer, + reason_normalizer=retry_reason_normalizer, + ) + ingress_metrics_collector = PrometheusIngressMetricsCollector( + registry=registry, + metric_prefix=ingress_metric_prefix, + latency_buckets=ingress_latency_buckets, + reason_normalizer=ingress_reason_normalizer, + ) + + tracing_collector: BotXRequestObserver | None = None + if enable_open_telemetry_tracing: + tracing_collector = OpenTelemetryTracingCollector( + tracer_name=tracer_name, + tracer_provider=tracer_provider, + span_name_template=span_name_template, + span_enricher=span_enricher, + ) + + return BotObservabilityPreset( + metrics_collector=metrics_collector, + tracing_collector=tracing_collector, + ingress_metrics_collector=ingress_metrics_collector, + ) + + +def build_production_bot_preset( + *, + retry_preset: BotRetryPreset | None = None, + observability_preset: BotObservabilityPreset | None = None, +) -> BotProductionPreset: + return BotProductionPreset( + retry=retry_preset or build_production_retry_preset(), + observability=observability_preset or build_production_observability_preset(), + ) diff --git a/pybotx/scaffold/__init__.py b/pybotx/scaffold/__init__.py new file mode 100644 index 00000000..13545bf0 --- /dev/null +++ b/pybotx/scaffold/__init__.py @@ -0,0 +1,75 @@ +from pybotx.scaffold.command import ( + CreateCommandOptions, + CreatedCommandArtifacts, + create_command_in_project, +) +from pybotx.scaffold.fsm_flow import ( + CreateFSMFlowOptions, + CreatedFSMFlowArtifacts, + create_fsm_flow_in_project, +) +from pybotx.scaffold.manifest import ( + PROJECT_MANIFEST_FILENAME, + ScaffoldProjectManifest, + find_scaffold_project_root, +) +from pybotx.scaffold.port import ( + CreatePortOptions, + CreatedPortArtifacts, + create_port_in_project, +) +from pybotx.scaffold.project import ( + CreateBotProjectOptions, + CreatedBotProject, + create_bot_project, +) +from pybotx.scaffold.repository import ( + CreateRepositoryOptions, + CreatedRepositoryArtifacts, + create_repository_in_project, +) +from pybotx.scaffold.service import ( + CreateServiceOptions, + CreatedServiceArtifacts, + create_service_in_project, +) +from pybotx.scaffold.widget import ( + CreateWidgetOptions, + CreatedWidgetArtifacts, + create_widget_in_project, +) +from pybotx.scaffold.widget_flow import ( + CreateWidgetFlowOptions, + CreatedWidgetFlowArtifacts, + create_widget_flow_in_project, +) + +__all__ = [ + "CreateCommandOptions", + "CreateFSMFlowOptions", + "CreatePortOptions", + "CreateWidgetOptions", + "CreateWidgetFlowOptions", + "CreateRepositoryOptions", + "CreateServiceOptions", + "CreateBotProjectOptions", + "CreatedCommandArtifacts", + "CreatedFSMFlowArtifacts", + "CreatedPortArtifacts", + "CreatedRepositoryArtifacts", + "CreatedServiceArtifacts", + "CreatedWidgetArtifacts", + "CreatedWidgetFlowArtifacts", + "CreatedBotProject", + "PROJECT_MANIFEST_FILENAME", + "ScaffoldProjectManifest", + "create_command_in_project", + "create_fsm_flow_in_project", + "create_bot_project", + "create_port_in_project", + "create_repository_in_project", + "create_service_in_project", + "create_widget_in_project", + "create_widget_flow_in_project", + "find_scaffold_project_root", +] diff --git a/pybotx/scaffold/_shared.py b/pybotx/scaffold/_shared.py new file mode 100644 index 00000000..dc477855 --- /dev/null +++ b/pybotx/scaffold/_shared.py @@ -0,0 +1,75 @@ +from __future__ import annotations + +import keyword +from pathlib import Path +import re +from string import Template +from typing import Sequence + + +_NON_ALNUM_RE = re.compile(r"[^0-9a-zA-Z]+") + + +def normalize_scaffold_name(raw_name: str, *, kind: str) -> str: + normalized_name = _NON_ALNUM_RE.sub("-", raw_name.strip().lstrip("/")) + normalized_name = normalized_name.strip("-").lower() + if not normalized_name: + raise ValueError(f"{kind} should not be empty") + + module_name = slug_to_module_name(normalized_name) + if module_name[0].isdigit(): + raise ValueError(f"{kind} should not start with a digit") + if not module_name.isidentifier(): + raise ValueError(f"Invalid {kind.lower()} `{raw_name}`") + if keyword.iskeyword(module_name): + raise ValueError(f"{kind} `{raw_name}` resolves to a Python keyword") + + return normalized_name + + +def slug_to_module_name(normalized_name: str) -> str: + return normalized_name.replace("-", "_") + + +def module_name_to_pascal_case(module_name: str) -> str: + return "".join(part.capitalize() for part in module_name.split("_")) + + +def write_template(path: Path, template: Template, context: dict[str, str]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(template.safe_substitute(context), encoding="utf-8") + + +def append_marked_lines( + path: Path, + *, + start_marker: str, + end_marker: str, + new_lines: Sequence[str], +) -> None: + original_content = path.read_text(encoding="utf-8") + trailing_newline = original_content.endswith("\n") + lines = original_content.splitlines() + + try: + start_index = lines.index(start_marker) + end_index = lines.index(end_marker) + except ValueError as exc: + raise RuntimeError( + f"Couldn't find scaffold markers in `{path}`", + ) from exc + + if start_index >= end_index: + raise RuntimeError(f"Invalid scaffold markers order in `{path}`") + + block_lines = lines[start_index + 1 : end_index] + for new_line in new_lines: + if new_line in block_lines: + raise FileExistsError(f"`{new_line}` already exists in `{path}`") + block_lines.append(new_line) + + updated_lines = lines[: start_index + 1] + block_lines + lines[end_index:] + path.write_text( + "\n".join(updated_lines) + ("\n" if trailing_newline else ""), + encoding="utf-8", + ) diff --git a/pybotx/scaffold/command.py b/pybotx/scaffold/command.py new file mode 100644 index 00000000..a055487b --- /dev/null +++ b/pybotx/scaffold/command.py @@ -0,0 +1,173 @@ +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path + +from pybotx.scaffold._shared import ( + append_marked_lines, + module_name_to_pascal_case, + normalize_scaffold_name, + slug_to_module_name, + write_template, +) +from pybotx.scaffold.manifest import ( + ScaffoldProjectManifest, + find_scaffold_project_root, +) +from pybotx.scaffold.templates import ( + COMMAND_MODULE_TEMPLATE, + COMMAND_TEST_TEMPLATE, + SERVICE_MODULE_TEMPLATE, +) + +_COMMAND_IMPORTS_START = "# pybotx-scaffold command imports start" +_COMMAND_IMPORTS_END = "# pybotx-scaffold command imports end" +_COMMAND_COLLECTORS_START = " # pybotx-scaffold command collectors start" +_COMMAND_COLLECTORS_END = " # pybotx-scaffold command collectors end" +_SERVICE_IMPORTS_START = "# pybotx-scaffold service imports start" +_SERVICE_IMPORTS_END = "# pybotx-scaffold service imports end" +_SERVICE_PROVIDERS_START = " # pybotx-scaffold service providers start" +_SERVICE_PROVIDERS_END = " # pybotx-scaffold service providers end" + + +@dataclass(frozen=True, slots=True) +class CreateCommandOptions: + command_name: str + project_dir: Path | str = "." + description: str | None = None + response_text: str | None = None + + +@dataclass(frozen=True, slots=True) +class CreatedCommandArtifacts: + project_root: Path + package_name: str + command_path: str + created_files: tuple[Path, ...] + + +@dataclass(frozen=True, slots=True) +class _CommandSpec: + module_name: str + command_path: str + description: str + response_text: str + service_class_name: str + service_provider_name: str + collector_alias: str + handler_name: str + + +def create_command_in_project( + options: CreateCommandOptions, +) -> CreatedCommandArtifacts: + project_root = find_scaffold_project_root(options.project_dir) + manifest = ScaffoldProjectManifest.load(project_root) + command_spec = _build_command_spec( + command_name=options.command_name, + description=options.description, + response_text=options.response_text, + ) + + command_module_path = project_root / manifest.commands_dir / ( + f"{command_spec.module_name}.py" + ) + service_module_path = project_root / manifest.services_dir / ( + f"{command_spec.module_name}.py" + ) + test_module_path = project_root / manifest.tests_dir / ( + f"test_{command_spec.module_name}.py" + ) + + for path in (command_module_path, service_module_path, test_module_path): + if path.exists(): + raise FileExistsError(f"`{path}` already exists") + + context = { + "command_literal": repr(command_spec.command_path), + "container_module": manifest.container_module, + "description_literal": repr(command_spec.description), + "handler_name": command_spec.handler_name, + "module_name": command_spec.module_name, + "package_name": manifest.package_name, + "response_text_literal": repr(command_spec.response_text), + "service_class_name": command_spec.service_class_name, + "service_provider_name": command_spec.service_provider_name, + } + + write_template(command_module_path, COMMAND_MODULE_TEMPLATE, context) + write_template(service_module_path, SERVICE_MODULE_TEMPLATE, context) + write_template(test_module_path, COMMAND_TEST_TEMPLATE, context) + + append_marked_lines( + project_root / manifest.commands_init_path, + start_marker=_COMMAND_IMPORTS_START, + end_marker=_COMMAND_IMPORTS_END, + new_lines=[ + ( + f"from {manifest.commands_module_prefix}.{command_spec.module_name} " + f"import collector as {command_spec.collector_alias}" + ), + ], + ) + append_marked_lines( + project_root / manifest.commands_init_path, + start_marker=_COMMAND_COLLECTORS_START, + end_marker=_COMMAND_COLLECTORS_END, + new_lines=[f" {command_spec.collector_alias},"], + ) + append_marked_lines( + project_root / manifest.container_path, + start_marker=_SERVICE_IMPORTS_START, + end_marker=_SERVICE_IMPORTS_END, + new_lines=[ + ( + f"from {manifest.services_module_prefix}.{command_spec.module_name} " + f"import {command_spec.service_class_name}" + ), + ], + ) + append_marked_lines( + project_root / manifest.container_path, + start_marker=_SERVICE_PROVIDERS_START, + end_marker=_SERVICE_PROVIDERS_END, + new_lines=[ + ( + f" {command_spec.service_provider_name} = providers.Factory(" + f"{command_spec.service_class_name})" + ), + ], + ) + + return CreatedCommandArtifacts( + project_root=project_root, + package_name=manifest.package_name, + command_path=command_spec.command_path, + created_files=( + command_module_path, + service_module_path, + test_module_path, + ), + ) + + +def _build_command_spec( + *, + command_name: str, + description: str | None, + response_text: str | None, +) -> _CommandSpec: + normalized_command = normalize_scaffold_name(command_name, kind="Command name") + module_name = slug_to_module_name(normalized_command) + service_class_name = f"{module_name_to_pascal_case(module_name)}Service" + + return _CommandSpec( + module_name=module_name, + command_path=f"/{normalized_command}", + description=description or f"Handle /{normalized_command} command", + response_text=response_text or f"Handled /{normalized_command} command.", + service_class_name=service_class_name, + service_provider_name=f"{module_name}_service", + collector_alias=f"{module_name}_collector", + handler_name=f"{module_name}_handler", + ) diff --git a/pybotx/scaffold/fsm_flow.py b/pybotx/scaffold/fsm_flow.py new file mode 100644 index 00000000..9b248f21 --- /dev/null +++ b/pybotx/scaffold/fsm_flow.py @@ -0,0 +1,289 @@ +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path + +from pybotx.scaffold._shared import ( + append_marked_lines, + module_name_to_pascal_case, + normalize_scaffold_name, + slug_to_module_name, + write_template, +) +from pybotx.scaffold.manifest import ( + ScaffoldProjectManifest, + find_scaffold_project_root, +) +from pybotx.scaffold.templates import ( + FSM_FLOW_COMMAND_TEMPLATE, + FSM_FLOW_MODULE_TEMPLATE, + FSM_FLOW_TEST_TEMPLATE, +) + + +_COMMAND_IMPORTS_START = "# pybotx-scaffold command imports start" +_COMMAND_IMPORTS_END = "# pybotx-scaffold command imports end" +_COMMAND_COLLECTORS_START = " # pybotx-scaffold command collectors start" +_COMMAND_COLLECTORS_END = " # pybotx-scaffold command collectors end" +_FSM_IMPORTS_START = "# pybotx-scaffold fsm imports start" +_FSM_IMPORTS_END = "# pybotx-scaffold fsm imports end" +_FSM_COLLECTORS_START = " # pybotx-scaffold fsm collectors start" +_FSM_COLLECTORS_END = " # pybotx-scaffold fsm collectors end" + + +@dataclass(frozen=True, slots=True) +class CreateFSMFlowOptions: + flow_name: str + project_dir: Path | str = "." + command_name: str | None = None + description: str | None = None + initial_prompt: str | None = None + completion_text: str | None = None + + +@dataclass(frozen=True, slots=True) +class CreatedFSMFlowArtifacts: + project_root: Path + package_name: str + flow_name: str + command_path: str + created_files: tuple[Path, ...] + + +@dataclass(frozen=True, slots=True) +class _FSMFlowSpec: + module_name: str + flow_name: str + command_path: str + description: str + initial_prompt: str + handler_name: str + start_function_name: str + states_enum_name: str + collector_alias: str + fsm_alias: str + display_name: str + display_name_lower: str + completion_statement: str + completion_assert_text: str + + +def create_fsm_flow_in_project( + options: CreateFSMFlowOptions, +) -> CreatedFSMFlowArtifacts: + project_root = find_scaffold_project_root(options.project_dir) + manifest = ScaffoldProjectManifest.load(project_root) + _ensure_fsm_template_support(project_root, manifest) + + flow_spec = _build_fsm_flow_spec( + flow_name=options.flow_name, + command_name=options.command_name, + description=options.description, + initial_prompt=options.initial_prompt, + completion_text=options.completion_text, + ) + + flow_module_path = project_root / manifest.fsm_dir / f"{flow_spec.module_name}.py" + command_module_path = project_root / manifest.commands_dir / ( + f"{flow_spec.module_name}.py" + ) + test_module_path = project_root / manifest.tests_dir / ( + f"test_{flow_spec.module_name}_fsm.py" + ) + + for path in (flow_module_path, command_module_path, test_module_path): + if path.exists(): + raise FileExistsError(f"`{path}` already exists") + + context = { + "command_literal": repr(flow_spec.command_path), + "completion_assert_literal": repr(flow_spec.completion_assert_text), + "completion_statement": flow_spec.completion_statement, + "description_literal": repr(flow_spec.description), + "display_name_lower": flow_spec.display_name_lower, + "fsm_module_prefix": manifest.fsm_module_prefix, + "handler_name": flow_spec.handler_name, + "initial_prompt_literal": repr(flow_spec.initial_prompt), + "module_name": flow_spec.module_name, + "package_name": manifest.package_name, + "start_function_name": flow_spec.start_function_name, + "states_enum_name": flow_spec.states_enum_name, + } + + write_template(flow_module_path, FSM_FLOW_MODULE_TEMPLATE, context) + write_template(command_module_path, FSM_FLOW_COMMAND_TEMPLATE, context) + write_template(test_module_path, FSM_FLOW_TEST_TEMPLATE, context) + + append_marked_lines( + project_root / manifest.commands_init_path, + start_marker=_COMMAND_IMPORTS_START, + end_marker=_COMMAND_IMPORTS_END, + new_lines=[ + ( + f"from {manifest.commands_module_prefix}.{flow_spec.module_name} " + f"import collector as {flow_spec.collector_alias}" + ), + ], + ) + append_marked_lines( + project_root / manifest.commands_init_path, + start_marker=_COMMAND_COLLECTORS_START, + end_marker=_COMMAND_COLLECTORS_END, + new_lines=[f" {flow_spec.collector_alias},"], + ) + + fsm_import_line = ( + f"from {manifest.fsm_module_prefix}.{flow_spec.module_name} " + f"import fsm as {flow_spec.fsm_alias}" + ) + fsm_collector_line = f" {flow_spec.fsm_alias}," + + for relative_path in (manifest.bot_path, manifest.tests_conftest_path): + target_path = project_root / relative_path + append_marked_lines( + target_path, + start_marker=_FSM_IMPORTS_START, + end_marker=_FSM_IMPORTS_END, + new_lines=[fsm_import_line], + ) + append_marked_lines( + target_path, + start_marker=_FSM_COLLECTORS_START, + end_marker=_FSM_COLLECTORS_END, + new_lines=[fsm_collector_line], + ) + + return CreatedFSMFlowArtifacts( + project_root=project_root, + package_name=manifest.package_name, + flow_name=flow_spec.flow_name, + command_path=flow_spec.command_path, + created_files=( + flow_module_path, + command_module_path, + test_module_path, + ), + ) + + +def _build_fsm_flow_spec( + *, + flow_name: str, + command_name: str | None, + description: str | None, + initial_prompt: str | None, + completion_text: str | None, +) -> _FSMFlowSpec: + normalized_flow_name = normalize_scaffold_name(flow_name, kind="Flow name") + normalized_command_name = normalize_scaffold_name( + command_name or flow_name, + kind="Command name", + ) + module_name = slug_to_module_name(normalized_flow_name) + display_name_lower = normalized_flow_name.replace("-", " ") + display_name = display_name_lower.title() + states_enum_name = f"{module_name_to_pascal_case(module_name)}States" + + if completion_text is None: + completion_statement = ( + f'await bot.answer_message(f"{display_name} flow completed with value: {{value}}.")' + ) + completion_assert_text = f"{display_name} flow completed with value: sample-value." + else: + completion_statement = f"await bot.answer_message({completion_text!r})" + completion_assert_text = completion_text + + return _FSMFlowSpec( + module_name=module_name, + flow_name=normalized_flow_name, + command_path=f"/{normalized_command_name}", + description=description or f"Start {display_name_lower} flow", + initial_prompt=initial_prompt or f"Enter {display_name_lower} value.", + handler_name=f"{module_name}_handler", + start_function_name=f"start_{module_name}_flow", + states_enum_name=states_enum_name, + collector_alias=f"{module_name}_collector", + fsm_alias=f"{module_name}_fsm", + display_name=display_name, + display_name_lower=display_name_lower, + completion_statement=completion_statement, + completion_assert_text=completion_assert_text, + ) + + +def _ensure_fsm_template_support( + project_root: Path, + manifest: ScaffoldProjectManifest, +) -> None: + if manifest.template != "production-fastapi-fsm": + raise ValueError( + "`pybotx create fsm-flow` is supported only for " + "`production-fastapi-fsm` projects", + ) + + for relative_path in (manifest.bot_path, manifest.tests_conftest_path): + _ensure_fsm_markers( + project_root / relative_path, + fsm_module_prefix=manifest.fsm_module_prefix, + package_name=manifest.package_name, + ) + + +def _ensure_fsm_markers( + path: Path, + *, + fsm_module_prefix: str, + package_name: str, +) -> None: + content = path.read_text(encoding="utf-8") + if _FSM_IMPORTS_START in content and _FSM_COLLECTORS_START in content: + return + + import_line = f"from {fsm_module_prefix}.login import fsm as login_fsm" + legacy_import_line = f"from {package_name}.fsm.login import fsm as login_fsm" + middlewares_line = ( + ' middlewares=[FSMMiddleware([login_fsm], state_repo_key="fsm_state_repo")],' + ) + + if import_line in content: + current_import_line = import_line + elif legacy_import_line in content: + current_import_line = legacy_import_line + else: + current_import_line = None + + if current_import_line is None or middlewares_line not in content: + raise RuntimeError( + "Couldn't enable FSM flow generation automatically for " + f"`{path}`. Regenerate the project or add scaffold markers manually.", + ) + + updated_content = content.replace( + current_import_line, + "\n".join( + [ + current_import_line, + _FSM_IMPORTS_START, + _FSM_IMPORTS_END, + ], + ), + 1, + ).replace( + middlewares_line, + "\n".join( + [ + " middlewares=[", + " FSMMiddleware(", + " [", + " login_fsm,", + _FSM_COLLECTORS_START, + _FSM_COLLECTORS_END, + " ],", + ' state_repo_key="fsm_state_repo",', + " ),", + " ],", + ], + ), + 1, + ) + path.write_text(updated_content, encoding="utf-8") diff --git a/pybotx/scaffold/manifest.py b/pybotx/scaffold/manifest.py new file mode 100644 index 00000000..103c3707 --- /dev/null +++ b/pybotx/scaffold/manifest.py @@ -0,0 +1,223 @@ +from __future__ import annotations + +from dataclasses import asdict, dataclass +import json +from pathlib import Path + + +PROJECT_MANIFEST_FILENAME = ".pybotx-project.json" +PROJECT_MANIFEST_SCHEMA_VERSION = 1 +PROJECT_LAYOUT_FLAT = "flat-v1" +PROJECT_LAYOUT_CLEAN_ARCHITECTURE = "clean-architecture-v1" + + +@dataclass(frozen=True, slots=True) +class ScaffoldProjectManifest: + template: str + package_name: str + layout: str = PROJECT_LAYOUT_FLAT + schema_version: int = PROJECT_MANIFEST_SCHEMA_VERSION + + def write(self, root_dir: Path) -> Path: + manifest_path = root_dir / PROJECT_MANIFEST_FILENAME + manifest_path.write_text( + json.dumps(asdict(self), indent=2, sort_keys=True) + "\n", + encoding="utf-8", + ) + return manifest_path + + @classmethod + def load(cls, root_dir: Path) -> "ScaffoldProjectManifest": + manifest_path = root_dir / PROJECT_MANIFEST_FILENAME + payload = json.loads(manifest_path.read_text(encoding="utf-8")) + if payload.get("schema_version") != PROJECT_MANIFEST_SCHEMA_VERSION: + raise RuntimeError( + "Unsupported scaffold manifest schema version " + f"`{payload.get('schema_version')}`", + ) + return cls(**payload) + + @property + def src_package_dir(self) -> Path: + return Path("src") / self.package_name + + @property + def commands_dir(self) -> Path: + if self.layout == PROJECT_LAYOUT_CLEAN_ARCHITECTURE: + return self.src_package_dir / "presentation" / "commands" + return self.src_package_dir / "commands" + + @property + def commands_init_path(self) -> Path: + return self.commands_dir / "__init__.py" + + @property + def fsm_dir(self) -> Path: + if self.layout == PROJECT_LAYOUT_CLEAN_ARCHITECTURE: + return self.src_package_dir / "presentation" / "fsm" + return self.src_package_dir / "fsm" + + @property + def widget_support_path(self) -> Path: + if self.layout == PROJECT_LAYOUT_CLEAN_ARCHITECTURE: + return self.src_package_dir / "presentation" / "widget_support.py" + return self.src_package_dir / "widget_support.py" + + @property + def services_dir(self) -> Path: + if self.layout == PROJECT_LAYOUT_CLEAN_ARCHITECTURE: + return self.src_package_dir / "application" / "services" + return self.src_package_dir / "services" + + @property + def bot_path(self) -> Path: + if self.layout == PROJECT_LAYOUT_CLEAN_ARCHITECTURE: + return self.src_package_dir / "presentation" / "bot.py" + return self.src_package_dir / "bot.py" + + @property + def container_path(self) -> Path: + return self.src_package_dir / "container.py" + + @property + def config_path(self) -> Path: + if self.layout == PROJECT_LAYOUT_CLEAN_ARCHITECTURE: + return self.src_package_dir / "infrastructure" / "config.py" + return self.src_package_dir / "config.py" + + @property + def api_path(self) -> Path: + if self.layout == PROJECT_LAYOUT_CLEAN_ARCHITECTURE: + return self.src_package_dir / "presentation" / "api.py" + return self.src_package_dir / "main.py" + + @property + def fsm_state_repo_path(self) -> Path: + if self.layout == PROJECT_LAYOUT_CLEAN_ARCHITECTURE: + return self.src_package_dir / "infrastructure" / "fsm_state_repo.py" + return self.src_package_dir / "fsm_state_repo.py" + + @property + def architecture_doc_path(self) -> Path: + return Path("ARCHITECTURE.md") + + @property + def root_main_path(self) -> Path: + return self.src_package_dir / "main.py" + + @property + def domain_dir(self) -> Path: + return self.src_package_dir / "domain" + + @property + def application_dir(self) -> Path: + return self.src_package_dir / "application" + + @property + def application_ports_dir(self) -> Path: + return self.application_dir / "ports" + + @property + def infrastructure_dir(self) -> Path: + return self.src_package_dir / "infrastructure" + + @property + def infrastructure_repositories_dir(self) -> Path: + return self.infrastructure_dir / "repositories" + + @property + def presentation_dir(self) -> Path: + return self.src_package_dir / "presentation" + + @property + def domain_ports_dir(self) -> Path: + return self.domain_dir / "ports" + + @property + def commands_module_prefix(self) -> str: + return self._module_for_dir(self.commands_dir) + + @property + def services_module_prefix(self) -> str: + return self._module_for_dir(self.services_dir) + + @property + def fsm_module_prefix(self) -> str: + return self._module_for_dir(self.fsm_dir) + + @property + def container_module(self) -> str: + return self._module_for_file(self.container_path) + + @property + def widget_support_module(self) -> str: + return self._module_for_file(self.widget_support_path) + + @property + def bot_module(self) -> str: + return self._module_for_file(self.bot_path) + + @property + def config_module(self) -> str: + return self._module_for_file(self.config_path) + + @property + def api_module(self) -> str: + return self._module_for_file(self.api_path) + + @property + def fsm_state_repo_module(self) -> str: + return self._module_for_file(self.fsm_state_repo_path) + + @property + def root_main_module(self) -> str: + return self._module_for_file(self.root_main_path) + + @property + def uses_clean_architecture(self) -> bool: + return self.layout == PROJECT_LAYOUT_CLEAN_ARCHITECTURE + + def _module_for_dir(self, path: Path) -> str: + return ".".join(path.parts[1:]) + + def _module_for_file(self, path: Path) -> str: + suffixless_path = path.with_suffix("") + if suffixless_path.name == "__init__": + return ".".join(suffixless_path.parts[1:-1]) + return ".".join(suffixless_path.parts[1:]) + + @property + def architecture_test_path(self) -> Path: + return self.tests_dir / "test_architecture.py" + + @property + def layer_paths(self) -> dict[str, Path]: + return { + "domain": self.domain_dir, + "application": self.application_dir, + "infrastructure": self.infrastructure_dir, + "presentation": self.presentation_dir, + } + + @property + def tests_conftest_path(self) -> Path: + return self.tests_dir / "conftest.py" + + @property + def tests_dir(self) -> Path: + return Path("tests") + + +def find_scaffold_project_root(start_dir: Path | str) -> Path: + current_path = Path(start_dir).expanduser().resolve() + if current_path.is_file(): + current_path = current_path.parent + + for candidate in (current_path, *current_path.parents): + if (candidate / PROJECT_MANIFEST_FILENAME).is_file(): + return candidate + + raise FileNotFoundError( + "Couldn't find `.pybotx-project.json`. " + "Run the command inside a project generated by `pybotx create bot`.", + ) diff --git a/pybotx/scaffold/port.py b/pybotx/scaffold/port.py new file mode 100644 index 00000000..f108da42 --- /dev/null +++ b/pybotx/scaffold/port.py @@ -0,0 +1,76 @@ +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path + +from pybotx.scaffold._shared import ( + module_name_to_pascal_case, + normalize_scaffold_name, + slug_to_module_name, + write_template, +) +from pybotx.scaffold.manifest import ( + ScaffoldProjectManifest, + find_scaffold_project_root, +) +from pybotx.scaffold.templates import PORT_TEMPLATE + + +@dataclass(frozen=True, slots=True) +class CreatePortOptions: + port_name: str + project_dir: Path | str = "." + + +@dataclass(frozen=True, slots=True) +class CreatedPortArtifacts: + project_root: Path + package_name: str + port_name: str + created_files: tuple[Path, ...] + + +@dataclass(frozen=True, slots=True) +class _PortSpec: + normalized_name: str + module_name: str + port_class_name: str + + +def create_port_in_project(options: CreatePortOptions) -> CreatedPortArtifacts: + project_root = find_scaffold_project_root(options.project_dir) + manifest = ScaffoldProjectManifest.load(project_root) + port_spec = _build_port_spec(options.port_name) + + port_module_path = project_root / manifest.domain_ports_dir / ( + f"{port_spec.module_name}.py" + ) + if port_module_path.exists(): + raise FileExistsError(f"`{port_module_path}` already exists") + + context = { + "port_class_name": port_spec.port_class_name, + "port_slug": port_spec.normalized_name, + } + write_template(port_module_path, PORT_TEMPLATE, context) + + return CreatedPortArtifacts( + project_root=project_root, + package_name=manifest.package_name, + port_name=port_spec.module_name, + created_files=(port_module_path,), + ) + + +def _build_port_spec(port_name: str) -> _PortSpec: + normalized_port_name = normalize_scaffold_name( + port_name, + kind="Port name", + ) + module_name = slug_to_module_name(normalized_port_name) + + return _PortSpec( + normalized_name=normalized_port_name, + module_name=module_name, + port_class_name=f"{module_name_to_pascal_case(module_name)}Port", + ) diff --git a/pybotx/scaffold/project.py b/pybotx/scaffold/project.py new file mode 100644 index 00000000..477c7b0f --- /dev/null +++ b/pybotx/scaffold/project.py @@ -0,0 +1,323 @@ +from __future__ import annotations + +from dataclasses import dataclass +import importlib.metadata +import keyword +from pathlib import Path +import re +from string import Template +from typing import Literal + +from pybotx.scaffold.manifest import ( + PROJECT_LAYOUT_CLEAN_ARCHITECTURE, + ScaffoldProjectManifest, +) +from pybotx.scaffold.templates import ( + APPLICATION_INIT_TEMPLATE, + APPLICATION_PORTS_INIT_TEMPLATE, + ARCHITECTURE_TEMPLATE, + ARCHITECTURE_TEST_TEMPLATE, + AUTH_SERVICE_TEMPLATE, + BOT_TEMPLATE, + BOT_FSM_TEMPLATE, + COMMANDS_INIT_TEMPLATE, + COMMANDS_INIT_FSM_TEMPLATE, + COMMON_COMMANDS_TEMPLATE, + COMMON_COMMANDS_FSM_TEMPLATE, + CONFIG_TEMPLATE, + CONFIG_FSM_TEMPLATE, + CONTAINER_TEMPLATE, + CONTAINER_FSM_TEMPLATE, + DOMAIN_PORTS_INIT_TEMPLATE, + DOCKER_COMPOSE_TEMPLATE, + DOCKERFILE_TEMPLATE, + ENV_EXAMPLE_TEMPLATE, + ENV_EXAMPLE_FSM_TEMPLATE, + FSM_INIT_TEMPLATE, + FSM_LOGIN_TEMPLATE, + FSM_STATE_REPO_TEMPLATE, + GREETING_PROFILE_REPOSITORY_TEMPLATE, + GREETING_PROFILE_TEMPLATE, + GITIGNORE_TEMPLATE, + GREETING_SERVICE_TEMPLATE, + INFRASTRUCTURE_REPOSITORIES_INIT_TEMPLATE, + MAIN_TEMPLATE, + MAIN_FSM_TEMPLATE, + PACKAGE_INIT_TEMPLATE, + PRESENTATION_API_TEMPLATE, + PRESENTATION_API_FSM_TEMPLATE, + PRESENTATION_INIT_TEMPLATE, + PYPROJECT_TEMPLATE, + PYPROJECT_FSM_TEMPLATE, + README_TEMPLATE, + README_FSM_TEMPLATE, + SERVICES_INIT_TEMPLATE, + STATIC_GREETING_PROFILE_REPOSITORY_TEMPLATE, + TESTS_CONFTEST_TEMPLATE, + TESTS_CONFTEST_FSM_TEMPLATE, + TEST_START_COMMAND_TEMPLATE, + TEST_START_COMMAND_FSM_TEMPLATE, + DOMAIN_INIT_TEMPLATE, + INFRASTRUCTURE_INIT_TEMPLATE, + WIDGET_SUPPORT_TEMPLATE, +) + +TemplateName = Literal["production-fastapi", "production-fastapi-fsm"] + +_SUPPORTED_TEMPLATES: tuple[TemplateName, ...] = ( + "production-fastapi", + "production-fastapi-fsm", +) +_NON_ALNUM_RE = re.compile(r"[^0-9a-zA-Z_]+") +_VERSION_RE = re.compile(r'^version = "(?P[^"]+)"$', re.MULTILINE) + + +@dataclass(frozen=True, slots=True) +class CreateBotProjectOptions: + target_dir: Path | str + template: TemplateName = "production-fastapi" + project_name: str | None = None + package_name: str | None = None + display_name: str | None = None + description: str | None = None + enable_otel_tracing: bool = False + include_docker: bool = True + + +@dataclass(frozen=True, slots=True) +class CreatedBotProject: + root_dir: Path + template: TemplateName + project_name: str + package_name: str + created_files: tuple[Path, ...] + + +def create_bot_project(options: CreateBotProjectOptions) -> CreatedBotProject: + target_dir = Path(options.target_dir).expanduser().resolve() + _validate_template(options.template) + _ensure_target_dir_is_safe(target_dir) + + project_name = options.project_name or target_dir.name + if not project_name: + raise ValueError("Project name couldn't be derived from target directory") + + package_name = _normalize_package_name(options.package_name or project_name) + display_name = options.display_name or _build_display_name(project_name) + description = options.description or f"{display_name} bot built with pybotx" + manifest = ScaffoldProjectManifest( + template=options.template, + package_name=package_name, + layout=PROJECT_LAYOUT_CLEAN_ARCHITECTURE, + ) + context = { + "api_module": manifest.api_module, + "bot_module": manifest.bot_module, + "commands_module_prefix": manifest.commands_module_prefix, + "config_module": manifest.config_module, + "container_module": manifest.container_module, + "description": description, + "display_name": display_name, + "enable_otel_tracing": str(options.enable_otel_tracing).lower(), + "enable_otel_tracing_python": "True" if options.enable_otel_tracing else "False", + "fsm_state_repo_module": manifest.fsm_state_repo_module, + "fsm_module_prefix": manifest.fsm_module_prefix, + "greeting_profile_module": f"{package_name}.domain.greeting_profile", + "greeting_profile_repository_module": ( + f"{package_name}.domain.ports.greeting_profile_repository" + ), + "package_name": package_name, + "project_name": project_name, + "services_module_prefix": manifest.services_module_prefix, + "static_greeting_profile_repository_module": ( + f"{package_name}.infrastructure.repositories.static_greeting_profile_repository" + ), + "widget_support_module": manifest.widget_support_module, + "pybotx_version": _resolve_pybotx_version(), + } + + target_dir.mkdir(parents=True, exist_ok=True) + created_files: list[Path] = [] + for relative_path, template in _build_project_templates( + manifest=manifest, + include_docker=options.include_docker, + ): + absolute_path = target_dir / relative_path + absolute_path.parent.mkdir(parents=True, exist_ok=True) + absolute_path.write_text(template.safe_substitute(context), encoding="utf-8") + created_files.append(absolute_path) + + manifest_path = manifest.write(target_dir) + created_files.append(manifest_path) + + return CreatedBotProject( + root_dir=target_dir, + template=options.template, + project_name=project_name, + package_name=package_name, + created_files=tuple(created_files), + ) + + +def _validate_template(template: str) -> None: + if template not in _SUPPORTED_TEMPLATES: + raise ValueError( + f"Unsupported template `{template}`. " + f"Supported templates: {', '.join(_SUPPORTED_TEMPLATES)}", + ) + + +def _ensure_target_dir_is_safe(target_dir: Path) -> None: + if target_dir.exists(): + if not target_dir.is_dir(): + raise FileExistsError(f"Target path `{target_dir}` already exists and isn't a directory") + if any(target_dir.iterdir()): + raise FileExistsError(f"Target directory `{target_dir}` isn't empty") + + +def _normalize_package_name(raw_name: str) -> str: + normalized = _NON_ALNUM_RE.sub("_", raw_name.strip().lower()).strip("_") + if not normalized: + raise ValueError("Package name can't be empty") + if normalized[0].isdigit(): + raise ValueError("Package name should not start with a digit") + if not normalized.isidentifier(): + raise ValueError(f"Invalid package name `{normalized}`") + if keyword.iskeyword(normalized): + raise ValueError(f"Package name `{normalized}` is a reserved Python keyword") + return normalized + + +def _build_display_name(project_name: str) -> str: + tokens = [token for token in _NON_ALNUM_RE.split(project_name) if token] + if not tokens: + raise ValueError("Display name couldn't be derived from project name") + return " ".join(token.capitalize() for token in tokens) + + +def _resolve_pybotx_version() -> str: + try: + return importlib.metadata.version("pybotx") + except importlib.metadata.PackageNotFoundError: + pyproject_path = Path(__file__).resolve().parents[2] / "pyproject.toml" + pyproject_content = pyproject_path.read_text(encoding="utf-8") + match = _VERSION_RE.search(pyproject_content) + if match is None: + raise RuntimeError("Couldn't resolve current pybotx version from pyproject.toml") + return match.group("version") + + +def _build_project_templates( + *, + manifest: ScaffoldProjectManifest, + include_docker: bool, +) -> tuple[tuple[Path, Template], ...]: + src_root = manifest.src_package_dir + if manifest.template == "production-fastapi": + template_items: list[tuple[Path, Template]] = [ + (Path(".env.example"), ENV_EXAMPLE_TEMPLATE), + (Path(".gitignore"), GITIGNORE_TEMPLATE), + (manifest.architecture_doc_path, ARCHITECTURE_TEMPLATE), + (Path("README.md"), README_TEMPLATE), + (Path("pyproject.toml"), PYPROJECT_TEMPLATE), + (src_root / "__init__.py", PACKAGE_INIT_TEMPLATE), + (manifest.root_main_path, MAIN_TEMPLATE), + (manifest.domain_dir / "__init__.py", DOMAIN_INIT_TEMPLATE), + (manifest.domain_ports_dir / "__init__.py", DOMAIN_PORTS_INIT_TEMPLATE), + ( + manifest.domain_dir / "greeting_profile.py", + GREETING_PROFILE_TEMPLATE, + ), + ( + manifest.domain_ports_dir / "greeting_profile_repository.py", + GREETING_PROFILE_REPOSITORY_TEMPLATE, + ), + (manifest.application_dir / "__init__.py", APPLICATION_INIT_TEMPLATE), + ( + manifest.application_ports_dir / "__init__.py", + APPLICATION_PORTS_INIT_TEMPLATE, + ), + (manifest.services_dir / "__init__.py", SERVICES_INIT_TEMPLATE), + (manifest.services_dir / "greeting.py", GREETING_SERVICE_TEMPLATE), + (manifest.infrastructure_dir / "__init__.py", INFRASTRUCTURE_INIT_TEMPLATE), + ( + manifest.infrastructure_repositories_dir / "__init__.py", + INFRASTRUCTURE_REPOSITORIES_INIT_TEMPLATE, + ), + ( + manifest.infrastructure_repositories_dir + / "static_greeting_profile_repository.py", + STATIC_GREETING_PROFILE_REPOSITORY_TEMPLATE, + ), + (manifest.config_path, CONFIG_TEMPLATE), + (manifest.container_path, CONTAINER_TEMPLATE), + (manifest.presentation_dir / "__init__.py", PRESENTATION_INIT_TEMPLATE), + (manifest.api_path, PRESENTATION_API_TEMPLATE), + (manifest.bot_path, BOT_TEMPLATE), + (manifest.widget_support_path, WIDGET_SUPPORT_TEMPLATE), + (manifest.commands_init_path, COMMANDS_INIT_TEMPLATE), + (manifest.commands_dir / "common.py", COMMON_COMMANDS_TEMPLATE), + (manifest.tests_conftest_path, TESTS_CONFTEST_TEMPLATE), + (manifest.architecture_test_path, ARCHITECTURE_TEST_TEMPLATE), + (manifest.tests_dir / "test_start_command.py", TEST_START_COMMAND_TEMPLATE), + ] + else: + template_items = [ + (Path(".env.example"), ENV_EXAMPLE_FSM_TEMPLATE), + (Path(".gitignore"), GITIGNORE_TEMPLATE), + (manifest.architecture_doc_path, ARCHITECTURE_TEMPLATE), + (Path("README.md"), README_FSM_TEMPLATE), + (Path("pyproject.toml"), PYPROJECT_FSM_TEMPLATE), + (src_root / "__init__.py", PACKAGE_INIT_TEMPLATE), + (manifest.root_main_path, MAIN_FSM_TEMPLATE), + (manifest.domain_dir / "__init__.py", DOMAIN_INIT_TEMPLATE), + (manifest.domain_ports_dir / "__init__.py", DOMAIN_PORTS_INIT_TEMPLATE), + ( + manifest.domain_dir / "greeting_profile.py", + GREETING_PROFILE_TEMPLATE, + ), + ( + manifest.domain_ports_dir / "greeting_profile_repository.py", + GREETING_PROFILE_REPOSITORY_TEMPLATE, + ), + (manifest.application_dir / "__init__.py", APPLICATION_INIT_TEMPLATE), + ( + manifest.application_ports_dir / "__init__.py", + APPLICATION_PORTS_INIT_TEMPLATE, + ), + (manifest.services_dir / "__init__.py", SERVICES_INIT_TEMPLATE), + (manifest.services_dir / "auth.py", AUTH_SERVICE_TEMPLATE), + (manifest.services_dir / "greeting.py", GREETING_SERVICE_TEMPLATE), + (manifest.infrastructure_dir / "__init__.py", INFRASTRUCTURE_INIT_TEMPLATE), + ( + manifest.infrastructure_repositories_dir / "__init__.py", + INFRASTRUCTURE_REPOSITORIES_INIT_TEMPLATE, + ), + ( + manifest.infrastructure_repositories_dir + / "static_greeting_profile_repository.py", + STATIC_GREETING_PROFILE_REPOSITORY_TEMPLATE, + ), + (manifest.config_path, CONFIG_FSM_TEMPLATE), + (manifest.container_path, CONTAINER_FSM_TEMPLATE), + (manifest.fsm_state_repo_path, FSM_STATE_REPO_TEMPLATE), + (manifest.presentation_dir / "__init__.py", PRESENTATION_INIT_TEMPLATE), + (manifest.api_path, PRESENTATION_API_FSM_TEMPLATE), + (manifest.bot_path, BOT_FSM_TEMPLATE), + (manifest.widget_support_path, WIDGET_SUPPORT_TEMPLATE), + (manifest.commands_init_path, COMMANDS_INIT_FSM_TEMPLATE), + (manifest.commands_dir / "common.py", COMMON_COMMANDS_FSM_TEMPLATE), + (manifest.fsm_dir / "__init__.py", FSM_INIT_TEMPLATE), + (manifest.fsm_dir / "login.py", FSM_LOGIN_TEMPLATE), + (manifest.tests_conftest_path, TESTS_CONFTEST_FSM_TEMPLATE), + (manifest.architecture_test_path, ARCHITECTURE_TEST_TEMPLATE), + (manifest.tests_dir / "test_start_command.py", TEST_START_COMMAND_FSM_TEMPLATE), + ] + if include_docker: + template_items.extend( + [ + (Path("Dockerfile"), DOCKERFILE_TEMPLATE), + (Path("docker-compose.yml"), DOCKER_COMPOSE_TEMPLATE), + ], + ) + return tuple(template_items) diff --git a/pybotx/scaffold/repository.py b/pybotx/scaffold/repository.py new file mode 100644 index 00000000..01b8f4e2 --- /dev/null +++ b/pybotx/scaffold/repository.py @@ -0,0 +1,235 @@ +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path + +from pybotx.scaffold._shared import ( + append_marked_lines, + module_name_to_pascal_case, + normalize_scaffold_name, + slug_to_module_name, + write_template, +) +from pybotx.scaffold.manifest import ( + ScaffoldProjectManifest, + find_scaffold_project_root, +) +from pybotx.scaffold.templates import ( + REPOSITORY_IMPLEMENTATION_TEMPLATE, + REPOSITORY_PORT_TEMPLATE, + REPOSITORY_TEST_TEMPLATE, +) + +_REPOSITORY_IMPORTS_START = "# pybotx-scaffold repository imports start" +_REPOSITORY_IMPORTS_END = "# pybotx-scaffold repository imports end" +_REPOSITORY_PROVIDERS_START = " # pybotx-scaffold repository providers start" +_REPOSITORY_PROVIDERS_END = " # pybotx-scaffold repository providers end" + +_FALLBACK_IMPORTS_START = "# pybotx-scaffold service imports start" +_FALLBACK_IMPORTS_END = "# pybotx-scaffold service imports end" +_FALLBACK_PROVIDERS_START = " # pybotx-scaffold service providers start" +_FALLBACK_PROVIDERS_END = " # pybotx-scaffold service providers end" + + +@dataclass(frozen=True, slots=True) +class CreateRepositoryOptions: + repository_name: str + project_dir: Path | str = "." + port_name: str | None = None + + +@dataclass(frozen=True, slots=True) +class CreatedRepositoryArtifacts: + project_root: Path + package_name: str + repository_name: str + port_name: str + created_files: tuple[Path, ...] + + +@dataclass(frozen=True, slots=True) +class _RepositorySpec: + repository_slug: str + repository_module_name: str + implementation_module_name: str + port_slug: str + port_module_name: str + port_class_name: str + implementation_class_name: str + repository_provider_name: str + test_module_name: str + should_create_port: bool + + +def create_repository_in_project( + options: CreateRepositoryOptions, +) -> CreatedRepositoryArtifacts: + project_root = find_scaffold_project_root(options.project_dir) + manifest = ScaffoldProjectManifest.load(project_root) + repository_spec = _build_repository_spec( + repository_name=options.repository_name, + port_name=options.port_name, + ) + + port_module_path = project_root / manifest.domain_ports_dir / ( + f"{repository_spec.port_module_name}.py" + ) + repository_module_path = project_root / manifest.infrastructure_repositories_dir / ( + f"{repository_spec.implementation_module_name}.py" + ) + test_module_path = project_root / manifest.tests_dir / ( + f"{repository_spec.test_module_name}.py" + ) + + paths_to_check = [repository_module_path, test_module_path] + if repository_spec.should_create_port: + paths_to_check.append(port_module_path) + else: + if not port_module_path.exists(): + raise FileNotFoundError( + f"Port `{repository_spec.port_module_name}` not found at `{port_module_path}`", + ) + + for path in paths_to_check: + if path.exists(): + raise FileExistsError(f"`{path}` already exists") + + context = { + "container_module": manifest.container_module, + "implementation_class_name": repository_spec.implementation_class_name, + "module_name": repository_spec.repository_module_name, + "port_class_name": repository_spec.port_class_name, + "repository_module": ( + f"{manifest.package_name}.infrastructure.repositories." + f"{repository_spec.implementation_module_name}" + ), + "repository_provider_name": repository_spec.repository_provider_name, + "repository_slug": repository_spec.repository_slug, + } + + if repository_spec.should_create_port: + write_template(port_module_path, REPOSITORY_PORT_TEMPLATE, context) + write_template( + repository_module_path, + REPOSITORY_IMPLEMENTATION_TEMPLATE, + context, + ) + write_template(test_module_path, REPOSITORY_TEST_TEMPLATE, context) + + imports_start, imports_end = _resolve_container_markers( + project_root / manifest.container_path, + preferred_start=_REPOSITORY_IMPORTS_START, + preferred_end=_REPOSITORY_IMPORTS_END, + fallback_start=_FALLBACK_IMPORTS_START, + fallback_end=_FALLBACK_IMPORTS_END, + ) + providers_start, providers_end = _resolve_container_markers( + project_root / manifest.container_path, + preferred_start=_REPOSITORY_PROVIDERS_START, + preferred_end=_REPOSITORY_PROVIDERS_END, + fallback_start=_FALLBACK_PROVIDERS_START, + fallback_end=_FALLBACK_PROVIDERS_END, + ) + + append_marked_lines( + project_root / manifest.container_path, + start_marker=imports_start, + end_marker=imports_end, + new_lines=[ + ( + "from " + f"{manifest.package_name}.infrastructure.repositories." + f"{repository_spec.implementation_module_name} " + f"import {repository_spec.implementation_class_name}" + ), + ], + ) + append_marked_lines( + project_root / manifest.container_path, + start_marker=providers_start, + end_marker=providers_end, + new_lines=[ + ( + f" {repository_spec.repository_provider_name} = providers.Singleton(" + f"{repository_spec.implementation_class_name})" + ), + ], + ) + + return CreatedRepositoryArtifacts( + project_root=project_root, + package_name=manifest.package_name, + repository_name=repository_spec.repository_module_name, + port_name=repository_spec.port_module_name, + created_files=tuple(paths_to_check), + ) + + +def _build_repository_spec( + *, + repository_name: str, + port_name: str | None, +) -> _RepositorySpec: + normalized_repository_name = normalize_scaffold_name( + repository_name, + kind="Repository name", + ) + repository_module_base = slug_to_module_name(normalized_repository_name) + + if port_name is None: + port_slug = normalized_repository_name + port_module_name = f"{repository_module_base}_repository" + port_class_name = f"{module_name_to_pascal_case(repository_module_base)}Repository" + repository_module_name = port_module_name + implementation_module_name = f"stub_{repository_module_name}" + implementation_class_name = f"Stub{port_class_name}" + repository_provider_name = port_module_name + test_module_name = f"test_{repository_module_name}" + should_create_port = True + else: + normalized_port_name = normalize_scaffold_name( + port_name, + kind="Port name", + ) + port_module_name = slug_to_module_name(normalized_port_name) + port_class_name = module_name_to_pascal_case(port_module_name) + if not port_module_name.endswith("_repository"): + port_class_name = f"{port_class_name}Port" + repository_module_name = f"{repository_module_base}_repository" + implementation_module_name = f"stub_{repository_module_name}" + implementation_class_name = ( + f"Stub{module_name_to_pascal_case(repository_module_base)}Repository" + ) + repository_provider_name = port_module_name + test_module_name = f"test_{repository_module_name}" + port_slug = normalized_port_name + should_create_port = False + + return _RepositorySpec( + repository_slug=normalized_repository_name, + repository_module_name=repository_module_name, + implementation_module_name=implementation_module_name, + port_slug=port_slug, + port_module_name=port_module_name, + port_class_name=port_class_name, + implementation_class_name=implementation_class_name, + repository_provider_name=repository_provider_name, + test_module_name=test_module_name, + should_create_port=should_create_port, + ) + + +def _resolve_container_markers( + path: Path, + *, + preferred_start: str, + preferred_end: str, + fallback_start: str, + fallback_end: str, +) -> tuple[str, str]: + content = path.read_text(encoding="utf-8") + if preferred_start in content and preferred_end in content: + return preferred_start, preferred_end + if fallback_start in content and fallback_end in content: + return fallback_start, fallback_end + raise RuntimeError(f"Couldn't find scaffold markers in `{path}`") diff --git a/pybotx/scaffold/service.py b/pybotx/scaffold/service.py new file mode 100644 index 00000000..062c6f20 --- /dev/null +++ b/pybotx/scaffold/service.py @@ -0,0 +1,134 @@ +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path + +from pybotx.scaffold._shared import ( + append_marked_lines, + module_name_to_pascal_case, + normalize_scaffold_name, + slug_to_module_name, + write_template, +) +from pybotx.scaffold.manifest import ( + ScaffoldProjectManifest, + find_scaffold_project_root, +) +from pybotx.scaffold.templates import ( + APPLICATION_SERVICE_TEST_TEMPLATE, + SERVICE_MODULE_TEMPLATE, +) + +_SERVICE_IMPORTS_START = "# pybotx-scaffold service imports start" +_SERVICE_IMPORTS_END = "# pybotx-scaffold service imports end" +_SERVICE_PROVIDERS_START = " # pybotx-scaffold service providers start" +_SERVICE_PROVIDERS_END = " # pybotx-scaffold service providers end" + + +@dataclass(frozen=True, slots=True) +class CreateServiceOptions: + service_name: str + project_dir: Path | str = "." + response_text: str | None = None + + +@dataclass(frozen=True, slots=True) +class CreatedServiceArtifacts: + project_root: Path + package_name: str + service_name: str + created_files: tuple[Path, ...] + + +@dataclass(frozen=True, slots=True) +class _ServiceSpec: + module_name: str + response_text: str + service_class_name: str + service_provider_name: str + test_module_name: str + + +def create_service_in_project( + options: CreateServiceOptions, +) -> CreatedServiceArtifacts: + project_root = find_scaffold_project_root(options.project_dir) + manifest = ScaffoldProjectManifest.load(project_root) + service_spec = _build_service_spec( + service_name=options.service_name, + response_text=options.response_text, + ) + + service_module_path = project_root / manifest.services_dir / ( + f"{service_spec.module_name}.py" + ) + test_module_path = project_root / manifest.tests_dir / ( + f"{service_spec.test_module_name}.py" + ) + + for path in (service_module_path, test_module_path): + if path.exists(): + raise FileExistsError(f"`{path}` already exists") + + context = { + "module_name": service_spec.module_name, + "response_text_literal": repr(service_spec.response_text), + "service_class_name": service_spec.service_class_name, + "services_module_prefix": manifest.services_module_prefix, + } + + write_template(service_module_path, SERVICE_MODULE_TEMPLATE, context) + write_template(test_module_path, APPLICATION_SERVICE_TEST_TEMPLATE, context) + + append_marked_lines( + project_root / manifest.container_path, + start_marker=_SERVICE_IMPORTS_START, + end_marker=_SERVICE_IMPORTS_END, + new_lines=[ + ( + f"from {manifest.services_module_prefix}.{service_spec.module_name} " + f"import {service_spec.service_class_name}" + ), + ], + ) + append_marked_lines( + project_root / manifest.container_path, + start_marker=_SERVICE_PROVIDERS_START, + end_marker=_SERVICE_PROVIDERS_END, + new_lines=[ + ( + f" {service_spec.service_provider_name} = providers.Factory(" + f"{service_spec.service_class_name})" + ), + ], + ) + + return CreatedServiceArtifacts( + project_root=project_root, + package_name=manifest.package_name, + service_name=service_spec.module_name, + created_files=( + service_module_path, + test_module_path, + ), + ) + + +def _build_service_spec( + *, + service_name: str, + response_text: str | None, +) -> _ServiceSpec: + normalized_service_name = normalize_scaffold_name( + service_name, + kind="Service name", + ) + module_name = slug_to_module_name(normalized_service_name) + + return _ServiceSpec( + module_name=module_name, + response_text=response_text or f"Implement {normalized_service_name} service.", + service_class_name=f"{module_name_to_pascal_case(module_name)}Service", + service_provider_name=f"{module_name}_service", + test_module_name=f"test_{module_name}_service", + ) diff --git a/pybotx/scaffold/templates.py b/pybotx/scaffold/templates.py new file mode 100644 index 00000000..83e530e9 --- /dev/null +++ b/pybotx/scaffold/templates.py @@ -0,0 +1,3245 @@ +from string import Template + + +GITIGNORE_TEMPLATE = Template( + """__pycache__/ +.mypy_cache/ +.pytest_cache/ +.ruff_cache/ +.venv/ +dist/ +build/ +*.pyc +.env +""" +) + + +ENV_EXAMPLE_TEMPLATE = Template( + """BOT_ID="123e4567-e89b-12d3-a456-426655440000" +BOT_CTS_URL="https://cts.example.com" +BOT_SECRET_KEY="replace-with-real-secret" + +BOT_DISPLAY_NAME="$display_name" + +BOT_COMMAND_MAX_CONCURRENCY="32" +BOT_COMMAND_MAX_QUEUE_SIZE="512" +BOT_COMMAND_OVERLOAD_ACTION="reject_new" + +BOT_ENABLE_OTEL_TRACING="${enable_otel_tracing}" +BOT_OTEL_TRACER_NAME="$package_name.bot" +""" +) + + +ENV_EXAMPLE_FSM_TEMPLATE = Template( + """BOT_ID="123e4567-e89b-12d3-a456-426655440000" +BOT_CTS_URL="https://cts.example.com" +BOT_SECRET_KEY="replace-with-real-secret" + +BOT_DISPLAY_NAME="$display_name" + +BOT_COMMAND_MAX_CONCURRENCY="32" +BOT_COMMAND_MAX_QUEUE_SIZE="512" +BOT_COMMAND_OVERLOAD_ACTION="reject_new" + +BOT_ENABLE_OTEL_TRACING="${enable_otel_tracing}" +BOT_OTEL_TRACER_NAME="$package_name.bot" + +BOT_FSM_REDIS_URL="redis://localhost:6379/0" +BOT_FSM_STATE_TTL_SECONDS="900" +""" +) + + +README_TEMPLATE = Template( + """# $project_name + +Production-ready `pybotx` bot scaffold generated by `pybotx create bot`. + +## What is included + +- FastAPI integration for `/command`, `/status`, `/notification/callback` +- library-owned FastAPI adapter from `pybotx` +- `/metrics` with shared Prometheus registry +- `pybotx` production bot preset +- structured JSON logs from `pybotx` +- healthcheck endpoints from `pybotx` +- command processing limits and backpressure config +- `dependency-injector` container +- 4-layer clean architecture: `domain / application / infrastructure / presentation` +- sample domain port and repository stub wired through DI +- sample `/start` and `/help` commands +- pytest/ruff/mypy configuration + +## Setup + +```bash +uv sync +cp .env.example .env +``` + +Fill real values in `.env`: + +- `BOT_ID` +- `BOT_CTS_URL` +- `BOT_SECRET_KEY` + +Optional: + +- `BOT_ENABLE_OTEL_TRACING=true` if you want OpenTelemetry tracing + +## Run + +```bash +uv run uvicorn $package_name.main:app --host 0.0.0.0 --port 8000 --reload +``` + +## Docker + +```bash +docker compose up --build +``` + +## Add a command + +```bash +uv run pybotx create command ping-users --project-dir . +``` + +## Add an application service + +```bash +uv run pybotx create service sync-users --project-dir . +``` + +## Add a port + +```bash +uv run pybotx create port billing-gateway --project-dir . +``` + +## Add a repository + +```bash +uv run pybotx create repository user-profile --project-dir . +``` + +To bind a repository stub to an existing port: + +```bash +uv run pybotx create repository stripe-billing-gateway --project-dir . --port billing-gateway +``` + +## Add a widget + +```bash +uv run pybotx create widget deployment-approval --project-dir . --kind confirm +``` + +## Add a widget flow + +```bash +uv run pybotx create widget-flow deployment-approval --project-dir . --kind confirm +``` + +## Endpoints + +- `POST /command` +- `GET /status` +- `POST /notification/callback` +- `GET /metrics` +- `GET /health/` +- `GET /health/ready` + +## Architecture + +- Layering rules and examples live in `ARCHITECTURE.md` +- Composition root lives in `src/$package_name/container.py` +- `pybotx` handlers stay in `src/$package_name/presentation/` +- application services live in `src/$package_name/application/services/` +- domain ports live in `src/$package_name/domain/ports/` +- repository implementations live in `src/$package_name/infrastructure/repositories/` + +## Tests + +```bash +uv run pytest +uv run ruff check . +uv run mypy src tests +``` +""" +) + + +README_FSM_TEMPLATE = Template( + """# $project_name + +Production-ready `pybotx` + `pybotx-fsm` bot scaffold generated by `pybotx create bot`. + +## What is included + +- FastAPI integration for `/command`, `/status`, `/notification/callback` +- library-owned FastAPI adapter from `pybotx` +- `/metrics` with shared Prometheus registry +- `pybotx` production bot preset +- `pybotx-fsm` middleware and sample login flow +- `RedisFSMStateRepo` for FSM state persistence +- readiness check for Redis-backed FSM storage +- structured JSON logs from `pybotx` +- healthcheck endpoints from `pybotx` +- command processing limits and backpressure config +- `dependency-injector` container +- 4-layer clean architecture: `domain / application / infrastructure / presentation` +- sample domain port and repository stub wired through DI +- sample `/start`, `/help`, `/login`, `/cancel` commands +- pytest/ruff/mypy configuration + +## Setup + +```bash +uv sync +cp .env.example .env +``` + +Fill real values in `.env`: + +- `BOT_ID` +- `BOT_CTS_URL` +- `BOT_SECRET_KEY` +- `BOT_FSM_REDIS_URL` + +Optional: + +- `BOT_ENABLE_OTEL_TRACING=true` if you want OpenTelemetry tracing + +## Run + +```bash +uv run uvicorn $package_name.main:app --host 0.0.0.0 --port 8000 --reload +``` + +## Docker + +```bash +docker compose up --build +``` + +## Add a command + +```bash +uv run pybotx create command ping-users --project-dir . +``` + +## Add an application service + +```bash +uv run pybotx create service sync-users --project-dir . +``` + +## Add a port + +```bash +uv run pybotx create port billing-gateway --project-dir . +``` + +## Add a repository + +```bash +uv run pybotx create repository user-profile --project-dir . +``` + +To bind a repository stub to an existing port: + +```bash +uv run pybotx create repository stripe-billing-gateway --project-dir . --port billing-gateway +``` + +## Add an FSM flow + +```bash +uv run pybotx create fsm-flow approval --project-dir . +``` + +## Add a widget + +```bash +uv run pybotx create widget deployment-approval --project-dir . --kind confirm +``` + +## Add a widget flow + +```bash +uv run pybotx create widget-flow deployment-approval --project-dir . --kind confirm +``` + +## Endpoints + +- `POST /command` +- `GET /status` +- `POST /notification/callback` +- `GET /metrics` +- `GET /health/` +- `GET /health/ready` + +## Architecture + +- Layering rules and examples live in `ARCHITECTURE.md` +- Composition root lives in `src/$package_name/container.py` +- `pybotx` handlers and FSM flows live in `src/$package_name/presentation/` +- Redis-backed FSM storage lives in `src/$package_name/infrastructure/` +- domain ports live in `src/$package_name/domain/ports/` +- repository implementations live in `src/$package_name/infrastructure/repositories/` + +## FSM demo + +Send `/login`, then use: + +- `demo@example.com` +- `password123` + +## Tests + +```bash +uv run pytest +uv run ruff check . +uv run mypy src tests +``` +""" +) + + +PYPROJECT_TEMPLATE = Template( + """[project] +name = "$project_name" +version = "0.1.0" +description = "$description" +readme = "README.md" +requires-python = ">=3.10,<4.0" +dependencies = [ + "pybotx==$pybotx_version", + "dependency-injector>=4.48.1,<5", + "fastapi>=0.128.0,<0.129", + "opentelemetry-api>=1.38.0,<2", + "prometheus-client>=0.22.1,<0.23", + "pydantic-settings>=2.10.1,<3", + "uvicorn>=0.40.0,<0.41", +] + +[dependency-groups] +dev = [ + "mypy>=1.19.1,<2", + "pytest>=9.0.2,<10", + "pytest-asyncio>=1.3.0,<2", + "ruff>=0.15.0,<0.16", +] + +[build-system] +requires = ["hatchling>=1.27.0"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["src/$package_name"] + +[tool.pytest.ini_options] +asyncio_mode = "auto" +asyncio_default_fixture_loop_scope = "function" +testpaths = ["tests"] + +[tool.ruff] +target-version = "py310" +line-length = 88 + +[tool.mypy] +python_version = "3.10" +strict = true +mypy_path = ["src"] +""" +) + + +PYPROJECT_FSM_TEMPLATE = Template( + """[project] +name = "$project_name" +version = "0.1.0" +description = "$description" +readme = "README.md" +requires-python = ">=3.10,<4.0" +dependencies = [ + "pybotx==$pybotx_version", + "pybotx-fsm>=0.6.1,<0.7", + "dependency-injector>=4.48.1,<5", + "fastapi>=0.128.0,<0.129", + "opentelemetry-api>=1.38.0,<2", + "prometheus-client>=0.22.1,<0.23", + "pydantic-settings>=2.10.1,<3", + "redis>=5.0.0,<6", + "uvicorn>=0.40.0,<0.41", +] + +[dependency-groups] +dev = [ + "mypy>=1.19.1,<2", + "pytest>=9.0.2,<10", + "pytest-asyncio>=1.3.0,<2", + "ruff>=0.15.0,<0.16", +] + +[build-system] +requires = ["hatchling>=1.27.0"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["src/$package_name"] + +[tool.pytest.ini_options] +asyncio_mode = "auto" +asyncio_default_fixture_loop_scope = "function" +testpaths = ["tests"] + +[tool.ruff] +target-version = "py310" +line-length = 88 + +[tool.mypy] +python_version = "3.10" +strict = true +mypy_path = ["src"] +""" +) + + +PACKAGE_INIT_TEMPLATE = Template( + '''"""$display_name bot package."""\n''' +) + + +DOMAIN_INIT_TEMPLATE = Template( + '"""Domain layer: pure business models, rules, and contracts."""\n', +) + + +DOMAIN_PORTS_INIT_TEMPLATE = Template( + '"""Domain ports: contracts that infrastructure implements."""\n', +) + + +APPLICATION_INIT_TEMPLATE = Template( + '"""Application layer: use cases and orchestration."""\n', +) + + +APPLICATION_PORTS_INIT_TEMPLATE = Template( + '"""Application ports: use-case level contracts for outbound dependencies."""\n', +) + + +INFRASTRUCTURE_INIT_TEMPLATE = Template( + '"""Infrastructure layer: config, DI, repositories, and adapters."""\n', +) + + +INFRASTRUCTURE_REPOSITORIES_INIT_TEMPLATE = Template( + '"""Infrastructure repositories and adapters."""\n', +) + + +PRESENTATION_INIT_TEMPLATE = Template( + '"""Presentation layer: FastAPI, pybotx handlers, widgets, and FSM flows."""\n', +) + + +ARCHITECTURE_TEMPLATE = Template( + """# Architecture + +This scaffold uses a 4-layer clean architecture with `dependency-injector`. + +## Layers + +### `domain` + +- pure business concepts +- entities, value objects, domain services, protocols +- repository and gateway contracts can live in `domain/ports/` +- no imports from `application`, `infrastructure`, `presentation` +- no framework imports such as `pybotx`, `fastapi`, `redis`, `dependency_injector` + +### `application` + +- use cases and orchestration +- coordinates domain logic and calls ports/repositories +- may import `domain` +- must not import `presentation` or concrete `infrastructure` implementations + +### `infrastructure` + +- DI container +- configuration +- repositories and external adapters +- concrete repository implementations live in `infrastructure/repositories/` +- may depend on `application` and `domain` +- must not import `presentation` + +### `presentation` + +- FastAPI app +- `pybotx` bot wiring +- commands, widgets, FSM flows +- handlers stay thin: parse -> call application service -> return response/widget + +## Dependency Rule + +Allowed direction: + +`presentation -> application -> domain` + +`infrastructure -> application -> domain` + +`presentation` may depend on `infrastructure` only for composition roots like the DI container. + +Forbidden direction: + +- `domain -> application|infrastructure|presentation` +- `application -> infrastructure|presentation` +- `infrastructure -> presentation` + +## DI + +`dependency-injector` is the composition root. Concrete objects are assembled in: + +- `$container_module` + +Business code should not create its dependencies manually inside handlers. + +## Where To Put New Code + +### New command + +1. `presentation/commands/.py` +2. `application/services/.py` +3. add or reuse domain contracts in `domain/` or `domain/ports/` +4. add infrastructure adapters/repositories in `infrastructure/` +5. register the service in `src/$package_name/container.py` + +Or use: + +```bash +uv run pybotx create command --project-dir . +``` + +### New application service / use case + +1. `application/services/.py` +2. optional contract in `domain/ports/` +3. optional adapter in `infrastructure/` +4. register the provider in `src/$package_name/container.py` + +Or use: + +```bash +uv run pybotx create service --project-dir . +``` + +### New port + +1. `domain/ports/.py` +2. define the business-facing contract as `typing.Protocol` +3. implement the adapter later in `infrastructure/` + +Or use: + +```bash +uv run pybotx create port --project-dir . +``` + +### New repository / port pair + +1. `domain/ports/.py` +2. `infrastructure/repositories/.py` +3. register the provider in `src/$package_name/container.py` +4. inject the repository into application services through the generated provider + +Or use: + +```bash +uv run pybotx create repository --project-dir . +``` + +If the port already exists: + +```bash +uv run pybotx create repository --project-dir . --port +``` + +### New widget + +1. `presentation/commands/.py` +2. `application/services/.py` +3. shared widget runtime helpers live in `presentation/widget_support.py` + +Or use: + +```bash +uv run pybotx create widget --project-dir . --kind confirm +``` + +### New widget flow + +1. `presentation/commands/.py` +2. `application/services/_widget.py` +3. `application/services/_result.py` +4. widget callback/result wiring stays in the generated command module + +Or use: + +```bash +uv run pybotx create widget-flow --project-dir . --kind confirm +``` + +### New FSM flow + +1. `presentation/fsm/.py` +2. starter command in `presentation/commands/.py` +3. flow state storage implementation belongs to `infrastructure/` + +Or use: + +```bash +uv run pybotx create fsm-flow --project-dir . +``` + +## Practical Rules + +- keep `pybotx` imports inside `presentation` +- keep `fastapi` imports inside `presentation` +- keep `pydantic-settings`, `redis`, `dependency_injector` inside `infrastructure` +- application services return plain values; they should not send messages directly +- widgets and FSM flows are presentation concerns + +## Guardrails + +The scaffold includes: + +- `tests/test_architecture.py` to check layer import rules +- DI container in `src/$package_name/container.py` +- layered package layout from day one +- sample `GreetingProfileRepository` port with a DI-wired repository stub +""" +) + + +ARCHITECTURE_TEST_TEMPLATE = Template( + """from __future__ import annotations + +import ast +from pathlib import Path + + +PACKAGE_ROOT = Path(__file__).resolve().parents[1] / "src" / "$package_name" +PACKAGE_PREFIX = "$package_name" + +FORBIDDEN_LAYER_IMPORTS = { + "domain": ( + f"{PACKAGE_PREFIX}.application", + f"{PACKAGE_PREFIX}.infrastructure", + f"{PACKAGE_PREFIX}.presentation", + ), + "application": ( + f"{PACKAGE_PREFIX}.infrastructure", + f"{PACKAGE_PREFIX}.presentation", + ), + "infrastructure": ( + f"{PACKAGE_PREFIX}.presentation", + ), +} + +FORBIDDEN_EXTERNAL_IMPORTS = { + "domain": ( + "pybotx", + "fastapi", + "redis", + "dependency_injector", + "pydantic_settings", + ), + "application": ( + "pybotx", + "fastapi", + "redis", + "dependency_injector", + "pydantic_settings", + ), +} + + +def _iter_imported_modules(path: Path) -> list[str]: + tree = ast.parse(path.read_text(encoding="utf-8")) + imported_modules: list[str] = [] + for node in ast.walk(tree): + if isinstance(node, ast.Import): + imported_modules.extend(alias.name for alias in node.names) + elif isinstance(node, ast.ImportFrom): + if node.level != 0 or node.module is None: + continue + imported_modules.append(node.module) + return imported_modules + + +def _iter_layer_files(layer: str) -> list[Path]: + return sorted((PACKAGE_ROOT / layer).rglob("*.py")) + + +def test_layer_boundaries() -> None: + for layer, forbidden_prefixes in FORBIDDEN_LAYER_IMPORTS.items(): + for path in _iter_layer_files(layer): + imported_modules = _iter_imported_modules(path) + for module_name in imported_modules: + assert not module_name.startswith(forbidden_prefixes), ( + f"{path} imports outer layer module {module_name}" + ) + + +def test_framework_imports_are_kept_out_of_inner_layers() -> None: + for layer, forbidden_prefixes in FORBIDDEN_EXTERNAL_IMPORTS.items(): + for path in _iter_layer_files(layer): + imported_modules = _iter_imported_modules(path) + for module_name in imported_modules: + assert not module_name.startswith(forbidden_prefixes), ( + f"{path} imports framework module {module_name}" + ) +""" +) + + +CONFIG_TEMPLATE = Template( + """from functools import lru_cache +from typing import Literal +from uuid import UUID + +from pydantic import AnyHttpUrl +from pydantic_settings import BaseSettings, SettingsConfigDict +from pybotx import ( + BotAccountWithSecret, + BotCommandProcessingConfig, + DropOldestBotCommandOverloadStrategy, + RejectNewBotCommandOverloadStrategy, +) + + +class AppSettings(BaseSettings): + model_config = SettingsConfigDict( + env_file=".env", + env_file_encoding="utf-8", + extra="ignore", + ) + + bot_id: UUID + bot_cts_url: AnyHttpUrl + bot_secret_key: str + + bot_display_name: str = "$display_name" + + bot_command_max_concurrency: int = 32 + bot_command_max_queue_size: int = 512 + bot_command_overload_action: Literal["reject_new", "drop_oldest"] = "reject_new" + + bot_enable_otel_tracing: bool = $enable_otel_tracing_python + bot_otel_tracer_name: str = "$package_name.bot" + + def build_bot_account(self) -> BotAccountWithSecret: + return BotAccountWithSecret( + id=self.bot_id, + cts_url=str(self.bot_cts_url), + secret_key=self.bot_secret_key, + ) + + def build_command_processing_config(self) -> BotCommandProcessingConfig: + overload_strategy = RejectNewBotCommandOverloadStrategy() + if self.bot_command_overload_action == "drop_oldest": + overload_strategy = DropOldestBotCommandOverloadStrategy() + + return BotCommandProcessingConfig( + max_concurrency=self.bot_command_max_concurrency, + max_queue_size=self.bot_command_max_queue_size, + overload_strategy=overload_strategy, + ) + + +@lru_cache +def get_settings() -> AppSettings: + return AppSettings() +""" +) + + +CONFIG_FSM_TEMPLATE = Template( + """from functools import lru_cache +from typing import Literal +from uuid import UUID + +from pydantic import AnyHttpUrl +from pydantic_settings import BaseSettings, SettingsConfigDict +from pybotx import ( + BotAccountWithSecret, + BotCommandProcessingConfig, + DropOldestBotCommandOverloadStrategy, + RejectNewBotCommandOverloadStrategy, +) + + +class AppSettings(BaseSettings): + model_config = SettingsConfigDict( + env_file=".env", + env_file_encoding="utf-8", + extra="ignore", + ) + + bot_id: UUID + bot_cts_url: AnyHttpUrl + bot_secret_key: str + + bot_display_name: str = "$display_name" + + bot_command_max_concurrency: int = 32 + bot_command_max_queue_size: int = 512 + bot_command_overload_action: Literal["reject_new", "drop_oldest"] = "reject_new" + + bot_enable_otel_tracing: bool = $enable_otel_tracing_python + bot_otel_tracer_name: str = "$package_name.bot" + + bot_fsm_redis_url: str = "redis://localhost:6379/0" + bot_fsm_state_ttl_seconds: int = 900 + + def build_bot_account(self) -> BotAccountWithSecret: + return BotAccountWithSecret( + id=self.bot_id, + cts_url=str(self.bot_cts_url), + secret_key=self.bot_secret_key, + ) + + def build_command_processing_config(self) -> BotCommandProcessingConfig: + overload_strategy = RejectNewBotCommandOverloadStrategy() + if self.bot_command_overload_action == "drop_oldest": + overload_strategy = DropOldestBotCommandOverloadStrategy() + + return BotCommandProcessingConfig( + max_concurrency=self.bot_command_max_concurrency, + max_queue_size=self.bot_command_max_queue_size, + overload_strategy=overload_strategy, + ) + + +@lru_cache +def get_settings() -> AppSettings: + return AppSettings() +""" +) + + +CONTAINER_TEMPLATE = Template( + """from dependency_injector import containers, providers +from prometheus_client import CollectorRegistry + +from $bot_module import build_bot +from $config_module import get_settings +from $static_greeting_profile_repository_module import ( + StaticGreetingProfileRepository, +) +# pybotx-scaffold repository imports start +# pybotx-scaffold repository imports end +from $services_module_prefix.greeting import GreetingService +# pybotx-scaffold service imports start +# pybotx-scaffold service imports end + + +class ApplicationContainer(containers.DeclarativeContainer): + settings = providers.Singleton(get_settings) + prometheus_registry = providers.Singleton(CollectorRegistry) + + greeting_profile_repository = providers.Singleton( + StaticGreetingProfileRepository, + display_name=settings.provided.bot_display_name, + ) + # pybotx-scaffold repository providers start + # pybotx-scaffold repository providers end + greeting_service = providers.Factory( + GreetingService, + greeting_profile_repository=greeting_profile_repository, + ) + # pybotx-scaffold service providers start + # pybotx-scaffold service providers end + + bot = providers.Singleton( + build_bot, + settings=settings, + registry=prometheus_registry, + ) +""" +) + + +CONTAINER_FSM_TEMPLATE = Template( + """from dependency_injector import containers, providers +from prometheus_client import CollectorRegistry +from redis.asyncio import from_url + +from $bot_module import build_bot +from $config_module import get_settings +from $fsm_state_repo_module import RedisFSMStateRepo +from $static_greeting_profile_repository_module import ( + StaticGreetingProfileRepository, +) +# pybotx-scaffold repository imports start +# pybotx-scaffold repository imports end +from $services_module_prefix.auth import AuthService +from $services_module_prefix.greeting import GreetingService +# pybotx-scaffold service imports start +# pybotx-scaffold service imports end + + +class ApplicationContainer(containers.DeclarativeContainer): + settings = providers.Singleton(get_settings) + prometheus_registry = providers.Singleton(CollectorRegistry) + + greeting_profile_repository = providers.Singleton( + StaticGreetingProfileRepository, + display_name=settings.provided.bot_display_name, + ) + # pybotx-scaffold repository providers start + # pybotx-scaffold repository providers end + greeting_service = providers.Factory( + GreetingService, + greeting_profile_repository=greeting_profile_repository, + ) + auth_service = providers.Factory( + AuthService, + users={ + "demo@example.com": "password123", + "admin@example.com": "admin123", + }, + ) + + fsm_redis_client = providers.Singleton( + from_url, + settings.provided.bot_fsm_redis_url, + encoding="utf-8", + decode_responses=True, + ) + fsm_state_repo = providers.Singleton( + RedisFSMStateRepo, + redis=fsm_redis_client, + default_expire_seconds=settings.provided.bot_fsm_state_ttl_seconds, + ) + # pybotx-scaffold service providers start + # pybotx-scaffold service providers end + + bot = providers.Singleton( + build_bot, + settings=settings, + registry=prometheus_registry, + ) +""" +) + + +SERVICES_INIT_TEMPLATE = Template('"""Application services."""\n') + + +WIDGET_SUPPORT_TEMPLATE = Template( + """from __future__ import annotations + +from typing import TYPE_CHECKING, TypeVar, cast + +from pybotx import Bot, IncomingMessage +from pybotx.widgets import ( + WidgetContext, + WidgetFactory, + WidgetRunnerConfig, + build_production_widget_runner_preset, +) +from pybotx.widgets.base import Widget +from pybotx.widgets.runner import RunnerAfterHook, RunnerBeforeHook + +if TYPE_CHECKING: + from $container_module import ApplicationContainer + +W = TypeVar("W", bound=Widget) + + +def get_container(bot: Bot) -> "ApplicationContainer": + return cast("ApplicationContainer", bot.state.container) + + +def build_widget_factory( + message: IncomingMessage, + bot: Bot, + *, + command: str, +) -> WidgetFactory: + return WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command=command, + ), + ) + + +def build_widget_runner_config( + *, + before: RunnerBeforeHook[W] | None = None, + after: RunnerAfterHook[W] | None = None, +) -> WidgetRunnerConfig: + return build_production_widget_runner_preset( + before=before, + after=after, + ).as_config() +""" +) + + +GREETING_PROFILE_TEMPLATE = Template( + """from dataclasses import dataclass + + +@dataclass(frozen=True, slots=True) +class GreetingProfile: + display_name: str + help_commands: tuple[str, ...] = ( + "/start - Show greeting", + "/help - List available commands", + ) +""" +) + + +GREETING_PROFILE_REPOSITORY_TEMPLATE = Template( + """from typing import Protocol + +from $greeting_profile_module import GreetingProfile + + +class GreetingProfileRepository(Protocol): + def get_profile(self) -> GreetingProfile: + ... +""" +) + + +STATIC_GREETING_PROFILE_REPOSITORY_TEMPLATE = Template( + """from dataclasses import dataclass + +from $greeting_profile_module import GreetingProfile + + +@dataclass(frozen=True, slots=True) +class StaticGreetingProfileRepository: + display_name: str + help_commands: tuple[str, ...] = ( + "/start - Show greeting", + "/help - List available commands", + ) + + def get_profile(self) -> GreetingProfile: + return GreetingProfile( + display_name=self.display_name, + help_commands=self.help_commands, + ) +""" +) + + +REPOSITORY_PORT_TEMPLATE = Template( + """from typing import Protocol + + +class $port_class_name(Protocol): + \"\"\"Domain repository port for `$repository_slug`. + + Add domain-specific methods here, then implement them in the infrastructure + adapter generated alongside this port. + \"\"\" + + ... +""" +) + + +PORT_TEMPLATE = Template( + """from typing import Protocol + + +class $port_class_name(Protocol): + \"\"\"Domain port for `$port_slug`. + + Add business-facing methods here. Implement this contract in the + infrastructure layer and inject it into application services through DI. + \"\"\" + + ... +""" +) + + +REPOSITORY_IMPLEMENTATION_TEMPLATE = Template( + """from dataclasses import dataclass + + +@dataclass(slots=True) +class $implementation_class_name: + \"\"\"Infrastructure repository stub for `$repository_slug`. + + Replace this class with a concrete Redis/Postgres/HTTP implementation after + defining the domain-specific contract in `domain/ports/` and wiring it into + the `$port_class_name` port. + \"\"\" + + ... +""" +) + + +GREETING_SERVICE_TEMPLATE = Template( + """from dataclasses import dataclass + +from $greeting_profile_repository_module import GreetingProfileRepository + + +@dataclass(frozen=True, slots=True) +class GreetingService: + greeting_profile_repository: GreetingProfileRepository + + def get_help_commands(self) -> tuple[str, ...]: + return self.greeting_profile_repository.get_profile().help_commands + + def build_start_message(self) -> str: + profile = self.greeting_profile_repository.get_profile() + return ( + f"Hello from {profile.display_name}.\\n\\n" + "Use /help to see available commands." + ) + + def build_help_message(self) -> str: + return "\\n".join(self.get_help_commands()) +""" +) + + +AUTH_SERVICE_TEMPLATE = Template( + """from dataclasses import dataclass, field + + +@dataclass(frozen=True, slots=True) +class AuthService: + users: dict[str, str] = field(default_factory=dict) + + def is_known_email(self, email: str) -> bool: + return email in self.users + + def is_valid_password(self, email: str, password: str) -> bool: + return self.users.get(email) == password +""" +) + + +COMMANDS_INIT_TEMPLATE = Template( + """from $commands_module_prefix.common import collector as common_collector +# pybotx-scaffold command imports start +# pybotx-scaffold command imports end + +collectors = [ + common_collector, + # pybotx-scaffold command collectors start + # pybotx-scaffold command collectors end +] +""" +) + + +COMMANDS_INIT_FSM_TEMPLATE = Template( + """from $commands_module_prefix.common import collector as common_collector +from $fsm_module_prefix.login import fsm as login_fsm +# pybotx-scaffold command imports start +# pybotx-scaffold command imports end + +collectors = [ + common_collector, + login_fsm, + # pybotx-scaffold command collectors start + # pybotx-scaffold command collectors end +] +""" +) + + +COMMON_COMMANDS_TEMPLATE = Template( + """from typing import TYPE_CHECKING, cast + +from pybotx import Bot, HandlerCollector, IncomingMessage + +if TYPE_CHECKING: + from $container_module import ApplicationContainer + + +collector = HandlerCollector() + + +def _get_container(bot: Bot) -> "ApplicationContainer": + return cast("ApplicationContainer", bot.state.container) + + +@collector.command("/start", description="Show greeting") +async def start_handler(_: IncomingMessage, bot: Bot) -> None: + greeting_service = _get_container(bot).greeting_service() + await bot.answer_message(greeting_service.build_start_message()) + + +@collector.command("/help", description="List available commands") +async def help_handler(_: IncomingMessage, bot: Bot) -> None: + greeting_service = _get_container(bot).greeting_service() + await bot.answer_message(greeting_service.build_help_message()) +""" +) + + +COMMON_COMMANDS_FSM_TEMPLATE = Template( + """from typing import TYPE_CHECKING, cast + +from pybotx import Bot, HandlerCollector, IncomingMessage + +from $fsm_module_prefix.login import LoginStates + +if TYPE_CHECKING: + from $container_module import ApplicationContainer + + +collector = HandlerCollector() + + +def _get_container(bot: Bot) -> "ApplicationContainer": + return cast("ApplicationContainer", bot.state.container) + + +@collector.command("/start", description="Show greeting") +async def start_handler(_: IncomingMessage, bot: Bot) -> None: + greeting_service = _get_container(bot).greeting_service() + await bot.answer_message(greeting_service.build_start_message()) + + +@collector.command("/help", description="List available commands") +async def help_handler(_: IncomingMessage, bot: Bot) -> None: + greeting_service = _get_container(bot).greeting_service() + await bot.answer_message( + "\\n".join( + [ + *greeting_service.get_help_commands(), + "/login - Start demo FSM login flow", + "/cancel - Drop the current FSM state", + ], + ), + ) + + +@collector.command("/login", description="Start demo FSM login flow") +async def login_handler(message: IncomingMessage, bot: Bot) -> None: + await message.state.fsm.change_state(LoginStates.ENTER_EMAIL) + await bot.answer_message("Enter your email.") + + +@collector.command("/cancel", description="Drop active FSM state") +async def cancel_handler(message: IncomingMessage, bot: Bot) -> None: + state = await message.state.fsm.get_state() + if state is None: + await bot.answer_message("No active login flow.") + return + + await message.state.fsm.drop_state() + await bot.answer_message("Login flow cancelled.") +""" +) + + +BOT_TEMPLATE = Template( + """from prometheus_client import CollectorRegistry +from pybotx import ( + Bot, + build_production_bot_preset, + build_production_observability_preset, +) + +from $commands_module_prefix import collectors +from $config_module import AppSettings + + +def build_bot(*, settings: AppSettings, registry: CollectorRegistry) -> Bot: + production_preset = build_production_bot_preset( + observability_preset=build_production_observability_preset( + registry=registry, + enable_open_telemetry_tracing=settings.bot_enable_otel_tracing, + tracer_name=settings.bot_otel_tracer_name, + ), + ) + bot_kwargs = production_preset.as_bot_kwargs() + return Bot( + collectors=collectors, + bot_accounts=[settings.build_bot_account()], + command_processing_config=settings.build_command_processing_config(), + **bot_kwargs, + ) +""" +) + + +BOT_FSM_TEMPLATE = Template( + """from prometheus_client import CollectorRegistry +from pybotx import ( + Bot, + build_production_bot_preset, + build_production_observability_preset, +) +from pybotx_fsm import FSMMiddleware + +from $commands_module_prefix import collectors +from $config_module import AppSettings +from $fsm_module_prefix.login import fsm as login_fsm +# pybotx-scaffold fsm imports start +# pybotx-scaffold fsm imports end + + +def build_bot(*, settings: AppSettings, registry: CollectorRegistry) -> Bot: + production_preset = build_production_bot_preset( + observability_preset=build_production_observability_preset( + registry=registry, + enable_open_telemetry_tracing=settings.bot_enable_otel_tracing, + tracer_name=settings.bot_otel_tracer_name, + ), + ) + bot_kwargs = production_preset.as_bot_kwargs() + return Bot( + collectors=collectors, + bot_accounts=[settings.build_bot_account()], + command_processing_config=settings.build_command_processing_config(), + middlewares=[ + FSMMiddleware( + [ + login_fsm, + # pybotx-scaffold fsm collectors start + # pybotx-scaffold fsm collectors end + ], + state_repo_key="fsm_state_repo", + ), + ], + **bot_kwargs, + ) +""" +) + + +PRESENTATION_API_TEMPLATE = Template( + """from fastapi import FastAPI +from pybotx import FastAPIBotAppConfig, create_fastapi_bot_app + +from $container_module import ApplicationContainer + + +def create_app() -> FastAPI: + container = ApplicationContainer() + settings = container.settings() + bot = container.bot() + bot.state.container = container + return create_fastapi_bot_app( + bot=bot, + title=settings.bot_display_name, + openapi_url=None, + docs_url=None, + redoc_url=None, + config=FastAPIBotAppConfig( + metrics_path="/metrics", + ), + metrics_registry=container.prometheus_registry(), + app_state={"container": container}, + ) + + +app = create_app() +""" +) + + +MAIN_TEMPLATE = Template( + """from fastapi import FastAPI + +from $api_module import create_app + + +app: FastAPI = create_app() +""" +) + + +MAIN_FSM_TEMPLATE = Template( + """from fastapi import FastAPI + +from $api_module import create_app + + +app: FastAPI = create_app() +""" +) + + +PRESENTATION_API_FSM_TEMPLATE = Template( + """from fastapi import FastAPI +from pybotx import ( + FastAPIBotAppConfig, + ReadinessCheck, + ReadinessCheckResult, + create_fastapi_bot_app, +) + +from $container_module import ApplicationContainer + + +async def _check_fsm_redis(container: ApplicationContainer) -> ReadinessCheckResult: + redis = container.fsm_redis_client() + await redis.ping() + return ReadinessCheckResult(status="ok") + + +def create_app() -> FastAPI: + container = ApplicationContainer() + settings = container.settings() + bot = container.bot() + bot.state.container = container + bot.state.fsm_state_repo = container.fsm_state_repo() + + app = create_fastapi_bot_app( + bot=bot, + title=settings.bot_display_name, + openapi_url=None, + docs_url=None, + redoc_url=None, + config=FastAPIBotAppConfig( + metrics_path="/metrics", + ), + metrics_registry=container.prometheus_registry(), + app_state={"container": container}, + ) + app.state.healthcheck.add_readiness_check( + ReadinessCheck( + name="fsm_redis", + check=lambda: _check_fsm_redis(container), + critical=True, + timeout_seconds=0.5, + ), + ) + + async def shutdown_redis() -> None: + await container.fsm_redis_client().aclose() + + app.add_event_handler("shutdown", shutdown_redis) + return app +""" +) + + +FSM_INIT_TEMPLATE = Template('"""FSM flows."""\n') + + +FSM_LOGIN_TEMPLATE = Template( + """from enum import Enum, auto +from typing import TYPE_CHECKING, cast + +from pybotx import Bot, IncomingMessage +from pybotx_fsm import FSMCollector + +if TYPE_CHECKING: + from $container_module import ApplicationContainer + + +class LoginStates(Enum): + ENTER_EMAIL = auto() + ENTER_PASSWORD = auto() + + +fsm = FSMCollector(LoginStates) + + +def _get_container(bot: Bot) -> "ApplicationContainer": + return cast("ApplicationContainer", bot.state.container) + + +@fsm.on(LoginStates.ENTER_EMAIL) +async def enter_email(message: IncomingMessage, bot: Bot) -> None: + auth_service = _get_container(bot).auth_service() + email = message.body.strip() + + if not auth_service.is_known_email(email): + await bot.answer_message("Unknown email, try again.") + return + + await message.state.fsm.change_state(LoginStates.ENTER_PASSWORD, email=email) + await bot.answer_message("Enter your password.") + + +@fsm.on(LoginStates.ENTER_PASSWORD) +async def enter_password(message: IncomingMessage, bot: Bot) -> None: + auth_service = _get_container(bot).auth_service() + email = message.state.fsm_storage.email + password = message.body + + if not auth_service.is_valid_password(email, password): + await bot.answer_message("Wrong password, try again.") + return + + await message.state.fsm.drop_state() + await bot.answer_message(f"Logged in as {email}.") +""" +) + + +FSM_STATE_REPO_TEMPLATE = Template( + """from __future__ import annotations + +from dataclasses import dataclass +from enum import Enum +import importlib +import json +from types import SimpleNamespace +from typing import Any + +from pybotx_fsm.fsm import FSMStateData +from redis.asyncio import Redis + + +@dataclass(frozen=True, slots=True) +class RedisFSMStateRepo: + redis: Redis + default_expire_seconds: int = 900 + key_prefix: str = "pybotx:fsm" + + def __post_init__(self) -> None: + if self.default_expire_seconds <= 0: + raise ValueError("FSM state TTL should be greater than 0") + if not self.key_prefix: + raise ValueError("FSM state key prefix should not be empty") + + async def get(self, key: Any, default: Any = None) -> Any: + payload = await self.redis.get(self._build_redis_key(key)) + if payload is None: + return default + + parsed_payload = json.loads(payload) + enum_cls = self._load_enum_class( + module_name=parsed_payload["state_module"], + qualname=parsed_payload["state_qualname"], + ) + state = enum_cls[parsed_payload["state_name"]] + storage = SimpleNamespace(**parsed_payload["storage"]) + return FSMStateData(state=state, storage=storage) + + async def set( + self, + key: Any, + value: Any, + expire: int | None = None, + ) -> None: + if not isinstance(value, FSMStateData): + raise TypeError("RedisFSMStateRepo expects FSMStateData values") + if not isinstance(value.state, Enum): + raise TypeError("FSM state should be an Enum member") + + storage = vars(value.storage) + payload = json.dumps( + { + "state_module": value.state.__class__.__module__, + "state_qualname": value.state.__class__.__qualname__, + "state_name": value.state.name, + "storage": storage, + }, + ensure_ascii=True, + sort_keys=True, + ) + await self.redis.set( + self._build_redis_key(key), + payload, + ex=expire or self.default_expire_seconds, + ) + + async def delete(self, key: Any) -> None: + await self.redis.delete(self._build_redis_key(key)) + + def _build_redis_key(self, key: Any) -> str: + return f"{self.key_prefix}:{key}" + + def _load_enum_class(self, *, module_name: str, qualname: str) -> type[Enum]: + module = importlib.import_module(module_name) + target: Any = module + for part in qualname.split("."): + target = getattr(target, part) + + if not isinstance(target, type) or not issubclass(target, Enum): + raise TypeError( + f"Stored FSM state class `{module_name}:{qualname}` is not an Enum", + ) + + return target +""" +) + + +TESTS_CONFTEST_TEMPLATE = Template( + """from collections.abc import Callable +from types import SimpleNamespace +from unittest.mock import AsyncMock +from uuid import UUID, uuid4 + +from dependency_injector import providers +import pytest +from pybotx import ( + Bot, + BotAccount, + BotAccountWithSecret, + Chat, + ChatTypes, + IncomingMessage, + UserDevice, + UserSender, +) + +from $commands_module_prefix import collectors +from $container_module import ApplicationContainer + + +@pytest.fixture +def bot_account() -> BotAccountWithSecret: + return BotAccountWithSecret( + id=UUID("123e4567-e89b-12d3-a456-426655440000"), + cts_url="https://cts.example.com", + secret_key="test-secret", + ) + + +@pytest.fixture +def container() -> ApplicationContainer: + built_container = ApplicationContainer() + built_container.settings.override( + providers.Object(SimpleNamespace(bot_display_name="Test Bot")), + ) + return built_container + + +@pytest.fixture +def bot( + bot_account: BotAccountWithSecret, + container: ApplicationContainer, +) -> Bot: + built_bot = Bot( + collectors=collectors, + bot_accounts=[bot_account], + ) + built_bot.answer_message = AsyncMock(return_value=uuid4()) # type: ignore[method-assign] + built_bot.send = AsyncMock(return_value=uuid4()) # type: ignore[method-assign] + built_bot.edit_message = AsyncMock() # type: ignore[method-assign] + built_bot.state.container = container + return built_bot + + +@pytest.fixture +def incoming_message_factory( + bot_account: BotAccountWithSecret, +) -> Callable[..., IncomingMessage]: + def factory(*, body: str = "/start") -> IncomingMessage: + return IncomingMessage( + bot=BotAccount(id=bot_account.id, host=bot_account.host), + sync_id=uuid4(), + source_sync_id=None, + body=body, + data={}, + metadata={}, + sender=UserSender( + huid=UUID("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"), + udid=None, + ad_login=None, + ad_domain=None, + username="Test User", + is_chat_admin=True, + is_chat_creator=True, + device=UserDevice( + manufacturer=None, + device_name=None, + os=None, + pushes=None, + timezone=None, + permissions=None, + platform=None, + platform_package_id=None, + app_version=None, + locale=None, + ), + ), + chat=Chat( + id=uuid4(), + type=ChatTypes.PERSONAL_CHAT, + ), + raw_command=None, + ) + + return factory +""" +) + + +TESTS_CONFTEST_FSM_TEMPLATE = Template( + """from collections.abc import Callable +from types import SimpleNamespace +from unittest.mock import AsyncMock +from uuid import UUID, uuid4 + +from dependency_injector import providers +import pytest +from pybotx import ( + Bot, + BotAccount, + BotAccountWithSecret, + Chat, + ChatTypes, + IncomingMessage, + UserDevice, + UserSender, +) + +from pybotx_fsm import FSMMiddleware + +from $commands_module_prefix import collectors +from $container_module import ApplicationContainer +from $fsm_module_prefix.login import fsm as login_fsm +# pybotx-scaffold fsm imports start +# pybotx-scaffold fsm imports end + + +class InMemoryFSMStateRepo: + def __init__(self) -> None: + self._storage: dict[object, object] = {} + + async def get(self, key: object, default: object = None) -> object: + return self._storage.get(key, default) + + async def set(self, key: object, value: object, expire: int | None = None) -> None: + self._storage[key] = value + + async def delete(self, key: object) -> None: + self._storage.pop(key, None) + + +@pytest.fixture +def bot_account() -> BotAccountWithSecret: + return BotAccountWithSecret( + id=UUID("123e4567-e89b-12d3-a456-426655440000"), + cts_url="https://cts.example.com", + secret_key="test-secret", + ) + + +@pytest.fixture +def container() -> ApplicationContainer: + built_container = ApplicationContainer() + built_container.settings.override( + providers.Object( + SimpleNamespace( + bot_display_name="Test Bot", + bot_fsm_redis_url="redis://localhost:6379/0", + bot_fsm_state_ttl_seconds=900, + ), + ), + ) + return built_container + + +@pytest.fixture +def bot( + bot_account: BotAccountWithSecret, + container: ApplicationContainer, +) -> Bot: + built_bot = Bot( + collectors=collectors, + bot_accounts=[bot_account], + middlewares=[ + FSMMiddleware( + [ + login_fsm, + # pybotx-scaffold fsm collectors start + # pybotx-scaffold fsm collectors end + ], + state_repo_key="fsm_state_repo", + ), + ], + ) + built_bot.answer_message = AsyncMock(return_value=uuid4()) # type: ignore[method-assign] + built_bot.send = AsyncMock(return_value=uuid4()) # type: ignore[method-assign] + built_bot.edit_message = AsyncMock() # type: ignore[method-assign] + built_bot.state.container = container + built_bot.state.fsm_state_repo = InMemoryFSMStateRepo() + return built_bot + + +@pytest.fixture +def incoming_message_factory( + bot_account: BotAccountWithSecret, +) -> Callable[..., IncomingMessage]: + stable_chat_id = UUID("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb") + stable_user_huid = UUID("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa") + + def factory(*, body: str = "/start") -> IncomingMessage: + return IncomingMessage( + bot=BotAccount(id=bot_account.id, host=bot_account.host), + sync_id=uuid4(), + source_sync_id=None, + body=body, + data={}, + metadata={}, + sender=UserSender( + huid=stable_user_huid, + udid=None, + ad_login=None, + ad_domain=None, + username="Test User", + is_chat_admin=True, + is_chat_creator=True, + device=UserDevice( + manufacturer=None, + device_name=None, + os=None, + pushes=None, + timezone=None, + permissions=None, + platform=None, + platform_package_id=None, + app_version=None, + locale=None, + ), + ), + chat=Chat( + id=stable_chat_id, + type=ChatTypes.PERSONAL_CHAT, + ), + raw_command=None, + ) + + return factory +""" +) + + +TEST_START_COMMAND_TEMPLATE = Template( + """from collections.abc import Callable + +from pybotx import Bot, IncomingMessage + + +async def test_start_handler( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + message = incoming_message_factory(body="/start") + + await bot.async_execute_bot_command(message) + + bot.answer_message.assert_awaited_once_with( # type: ignore[attr-defined] + "Hello from Test Bot.\\n\\nUse /help to see available commands.", + ) + + +async def test_help_handler( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + message = incoming_message_factory(body="/help") + + await bot.async_execute_bot_command(message) + + bot.answer_message.assert_awaited_once_with( # type: ignore[attr-defined] + "/start - Show greeting\\n/help - List available commands", + ) +""" +) + + +TEST_START_COMMAND_FSM_TEMPLATE = Template( + """from collections.abc import Callable + +from pybotx import Bot, IncomingMessage + + +async def test_start_handler( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + await bot.async_execute_bot_command(incoming_message_factory(body="/start")) + + bot.answer_message.assert_awaited_once_with( # type: ignore[attr-defined] + "Hello from Test Bot.\\n\\nUse /help to see available commands.", + ) + + +async def test_login_fsm_flow( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + await bot.async_execute_bot_command(incoming_message_factory(body="/login")) + bot.answer_message.assert_awaited_once_with("Enter your email.") # type: ignore[attr-defined] + + bot.answer_message.reset_mock() # type: ignore[attr-defined] + await bot.async_execute_bot_command( + incoming_message_factory(body="demo@example.com"), + ) + bot.answer_message.assert_awaited_once_with("Enter your password.") # type: ignore[attr-defined] + + bot.answer_message.reset_mock() # type: ignore[attr-defined] + await bot.async_execute_bot_command(incoming_message_factory(body="password123")) + bot.answer_message.assert_awaited_once_with("Logged in as demo@example.com.") # type: ignore[attr-defined] +""" +) + + +COMMAND_MODULE_TEMPLATE = Template( + """from typing import TYPE_CHECKING, cast + +from pybotx import Bot, HandlerCollector, IncomingMessage + +if TYPE_CHECKING: + from $container_module import ApplicationContainer + + +collector = HandlerCollector() + + +def _get_container(bot: Bot) -> "ApplicationContainer": + return cast("ApplicationContainer", bot.state.container) + + +@collector.command($command_literal, description=$description_literal) +async def $handler_name(_: IncomingMessage, bot: Bot) -> None: + command_service = _get_container(bot).$service_provider_name() + await bot.answer_message(command_service.handle()) +""" +) + + +SERVICE_MODULE_TEMPLATE = Template( + """from dataclasses import dataclass + + +@dataclass(frozen=True, slots=True) +class $service_class_name: + def handle(self) -> str: + return $response_text_literal +""" +) + + +COMMAND_TEST_TEMPLATE = Template( + """from collections.abc import Callable + +from pybotx import Bot, IncomingMessage + + +async def test_${module_name}_handler( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + message = incoming_message_factory(body=$command_literal) + + await bot.async_execute_bot_command(message) + + bot.answer_message.assert_awaited_once_with( # type: ignore[attr-defined] + $response_text_literal, + ) +""" +) + + +APPLICATION_SERVICE_TEST_TEMPLATE = Template( + """from $services_module_prefix.$module_name import $service_class_name + + +def test_${module_name}_service() -> None: + service = $service_class_name() + + assert service.handle() == $response_text_literal +""" +) + + +REPOSITORY_TEST_TEMPLATE = Template( + """from $container_module import ApplicationContainer +from $repository_module import $implementation_class_name + + +def test_${module_name}_repository_provider() -> None: + container = ApplicationContainer() + + repository = container.$repository_provider_name() + + assert isinstance(repository, $implementation_class_name) +""" +) + + +WIDGET_CONFIRM_COMMAND_TEMPLATE = Template( + """from pybotx import Bot, HandlerCollector, IncomingMessage +from pybotx.widgets import ConfirmWidget, on_action, widget_command +from pybotx.widgets.confirm import CANCEL_ACTION, CONFIRM_ACTION + +from $widget_support_module import ( + build_widget_factory, + build_widget_runner_config, + get_container, +) + + +collector = HandlerCollector() +COMMAND_NAME = $command_literal + + +@collector.command(COMMAND_NAME, description=$description_literal) +@widget_command( + config=build_widget_runner_config( + before=on_action( + lambda widget: ConfirmWidget.get_action(widget.message), + { + CONFIRM_ACTION: lambda widget: ( + get_container(widget.bot) + .$service_provider_name() + .build_action_result(CONFIRM_ACTION) + ), + CANCEL_ACTION: lambda widget: ( + get_container(widget.bot) + .$service_provider_name() + .build_action_result(CANCEL_ACTION) + ), + }, + ), + ), +) +async def $handler_name(message: IncomingMessage, bot: Bot) -> ConfirmWidget: + widget_service = get_container(bot).$service_provider_name() + widgets = build_widget_factory(message, bot, command=COMMAND_NAME) + return widgets.confirm(label=widget_service.build_label()) +""" +) + + +WIDGET_CONFIRM_SERVICE_TEMPLATE = Template( + """from dataclasses import dataclass + + +@dataclass(frozen=True, slots=True) +class $service_class_name: + def build_label(self) -> str: + return $label_literal + + def build_action_result(self, action: str) -> str: + if action == "confirm": + return $primary_result_literal + if action == "cancel": + return $secondary_result_literal + + return f"Unhandled widget action: {action}" +""" +) + + +WIDGET_CONFIRM_TEST_TEMPLATE = Template( + """from collections.abc import Callable + +from pybotx import Bot, IncomingMessage +from pybotx.widgets.confirm import CONFIRM_ACTION, CONFIRM_ACTION_KEY + + +async def test_${module_name}_widget_displays( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + await bot.async_execute_bot_command(incoming_message_factory(body=$command_literal)) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $label_literal # type: ignore[attr-defined] + + +async def test_${module_name}_widget_handles_action( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + message = incoming_message_factory(body=$command_literal) + message.data = {CONFIRM_ACTION_KEY: CONFIRM_ACTION} + + await bot.async_execute_bot_command(message) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $primary_result_literal # type: ignore[attr-defined] +""" +) + + +WIDGET_APPROVAL_COMMAND_TEMPLATE = Template( + """from pybotx import Bot, HandlerCollector, IncomingMessage +from pybotx.widgets import ApprovalWidget, on_action, widget_command +from pybotx.widgets.approval import APPROVE_ACTION, COMMENT_ACTION, REJECT_ACTION + +from $widget_support_module import ( + build_widget_factory, + build_widget_runner_config, + get_container, +) + + +collector = HandlerCollector() +COMMAND_NAME = $command_literal + + +@collector.command(COMMAND_NAME, description=$description_literal) +@widget_command( + config=build_widget_runner_config( + before=on_action( + lambda widget: ApprovalWidget.get_action(widget.message), + { + APPROVE_ACTION: lambda widget: ( + get_container(widget.bot) + .$service_provider_name() + .build_action_result(APPROVE_ACTION) + ), + REJECT_ACTION: lambda widget: ( + get_container(widget.bot) + .$service_provider_name() + .build_action_result(REJECT_ACTION) + ), + COMMENT_ACTION: lambda widget: ( + get_container(widget.bot) + .$service_provider_name() + .build_action_result(COMMENT_ACTION) + ), + }, + ), + ), +) +async def $handler_name(message: IncomingMessage, bot: Bot) -> ApprovalWidget: + widget_service = get_container(bot).$service_provider_name() + widgets = build_widget_factory(message, bot, command=COMMAND_NAME) + return widgets.approval(label=widget_service.build_label()) +""" +) + + +WIDGET_APPROVAL_SERVICE_TEMPLATE = Template( + """from dataclasses import dataclass + + +@dataclass(frozen=True, slots=True) +class $service_class_name: + def build_label(self) -> str: + return $label_literal + + def build_action_result(self, action: str) -> str: + if action == "approve": + return $primary_result_literal + if action == "reject": + return $secondary_result_literal + if action == "comment": + return $tertiary_result_literal + + return f"Unhandled widget action: {action}" +""" +) + + +WIDGET_APPROVAL_TEST_TEMPLATE = Template( + """from collections.abc import Callable + +from pybotx import Bot, IncomingMessage +from pybotx.widgets.approval import APPROVAL_ACTION_KEY, APPROVE_ACTION + + +async def test_${module_name}_widget_displays( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + await bot.async_execute_bot_command(incoming_message_factory(body=$command_literal)) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $label_literal # type: ignore[attr-defined] + + +async def test_${module_name}_widget_handles_action( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + message = incoming_message_factory(body=$command_literal) + message.data = {APPROVAL_ACTION_KEY: APPROVE_ACTION} + + await bot.async_execute_bot_command(message) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $primary_result_literal # type: ignore[attr-defined] +""" +) + + +WIDGET_SELECT_COMMAND_TEMPLATE = Template( + """from pybotx import Bot, HandlerCollector, IncomingMessage +from pybotx.widgets import SelectWidget, widget_command, on_data_key +from pybotx.widgets.select import SELECT_VALUE_KEY + +from $widget_support_module import ( + build_widget_factory, + build_widget_runner_config, + get_container, +) + + +collector = HandlerCollector() +COMMAND_NAME = $command_literal + + +@collector.command(COMMAND_NAME, description=$description_literal) +@widget_command( + config=build_widget_runner_config( + before=on_data_key( + SELECT_VALUE_KEY, + lambda widget: ( + get_container(widget.bot) + .$service_provider_name() + .build_selection_result(SelectWidget.get_value(widget.message)) + ), + ), + ), +) +async def $handler_name(message: IncomingMessage, bot: Bot) -> SelectWidget: + widget_service = get_container(bot).$service_provider_name() + widgets = build_widget_factory(message, bot, command=COMMAND_NAME) + return widgets.select( + label=widget_service.build_label(), + options=widget_service.build_options(), + ) +""" +) + + +WIDGET_SELECT_SERVICE_TEMPLATE = Template( + """from dataclasses import dataclass + + +@dataclass(frozen=True, slots=True) +class $service_class_name: + def build_label(self) -> str: + return $label_literal + + def build_options(self) -> list[str]: + return [ + "dev", + "staging", + "prod", + ] + + def build_selection_result(self, value: str) -> str: + return f"Selected value: {value}" +""" +) + + +WIDGET_SELECT_TEST_TEMPLATE = Template( + """from collections.abc import Callable + +from pybotx import Bot, IncomingMessage +from pybotx.widgets.select import SELECT_VALUE_KEY + + +async def test_${module_name}_widget_displays( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + await bot.async_execute_bot_command(incoming_message_factory(body=$command_literal)) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $label_literal # type: ignore[attr-defined] + + +async def test_${module_name}_widget_handles_selection( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + message = incoming_message_factory(body=$command_literal) + message.data = {SELECT_VALUE_KEY: "prod"} + + await bot.async_execute_bot_command(message) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == "Selected value: prod" # type: ignore[attr-defined] +""" +) + + +WIDGET_SEARCH_SELECT_COMMAND_TEMPLATE = Template( + """from pybotx import Bot, HandlerCollector, IncomingMessage +from pybotx.widgets import SearchSelectWidget, on_data_key, widget_command +from pybotx.widgets.select import SELECT_VALUE_KEY + +from $widget_support_module import ( + build_widget_factory, + build_widget_runner_config, + get_container, +) + + +collector = HandlerCollector() +COMMAND_NAME = $command_literal + + +@collector.command(COMMAND_NAME, description=$description_literal) +@widget_command( + config=build_widget_runner_config( + before=on_data_key( + SELECT_VALUE_KEY, + lambda widget: ( + get_container(widget.bot) + .$service_provider_name() + .build_selection_result(SearchSelectWidget.get_value(widget.message)) + ), + ), + ), +) +async def $handler_name(message: IncomingMessage, bot: Bot) -> SearchSelectWidget: + widget_service = get_container(bot).$service_provider_name() + widgets = build_widget_factory(message, bot, command=COMMAND_NAME) + return widgets.search_select( + label=widget_service.build_label(), + options=widget_service.build_options(), + ) +""" +) + + +WIDGET_SEARCH_SELECT_TEST_TEMPLATE = Template( + """from collections.abc import Callable + +from pybotx import Bot, IncomingMessage +from pybotx.widgets.select import SELECT_VALUE_KEY + + +async def test_${module_name}_widget_displays( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + await bot.async_execute_bot_command(incoming_message_factory(body=$command_literal)) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $label_literal # type: ignore[attr-defined] + + +async def test_${module_name}_widget_handles_selection( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + message = incoming_message_factory(body=$command_literal) + message.data = {SELECT_VALUE_KEY: "prod"} + + await bot.async_execute_bot_command(message) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == "Selected value: prod" # type: ignore[attr-defined] +""" +) + + +WIDGET_MULTI_SELECT_COMMAND_TEMPLATE = Template( + """from pybotx import Bot, HandlerCollector, IncomingMessage +from pybotx.widgets import MultiSelectWidget, RunnerHookResult, on_data_key, widget_command +from pybotx.widgets.multi_select import MULTI_SELECT_VALUE_KEY + +from $widget_support_module import ( + build_widget_factory, + build_widget_runner_config, + get_container, +) + + +collector = HandlerCollector() +COMMAND_NAME = $command_literal + + +def _resolve_multi_select_result(widget: MultiSelectWidget) -> RunnerHookResult | None: + widget_service = get_container(widget.bot).$service_provider_name() + selected_values = widget.selected_values + if not widget_service.is_selection_complete(selected_values): + return None + + return RunnerHookResult( + result=widget_service.build_selection_result(selected_values), + should_display=False, + ) + + +@collector.command(COMMAND_NAME, description=$description_literal) +@widget_command( + config=build_widget_runner_config( + before=on_data_key(MULTI_SELECT_VALUE_KEY, _resolve_multi_select_result), + ), +) +async def $handler_name(message: IncomingMessage, bot: Bot) -> MultiSelectWidget: + widget_service = get_container(bot).$service_provider_name() + widgets = build_widget_factory(message, bot, command=COMMAND_NAME) + return widgets.multi_select( + label=widget_service.build_label(), + options=widget_service.build_options(), + max_selected=widget_service.max_selected(), + ) +""" +) + + +WIDGET_MULTI_SELECT_SERVICE_TEMPLATE = Template( + """from dataclasses import dataclass + + +@dataclass(frozen=True, slots=True) +class $service_class_name: + def build_label(self) -> str: + return $label_literal + + def build_options(self) -> list[str]: + return [ + "dev", + "staging", + "prod", + ] + + def max_selected(self) -> int: + return 2 + + def is_selection_complete(self, values: list[str]) -> bool: + return len(values) >= self.max_selected() + + def build_selection_result(self, values: list[str]) -> str: + return f"Selected values: {', '.join(values)}" +""" +) + + +WIDGET_MULTI_SELECT_TEST_TEMPLATE = Template( + """from collections.abc import Callable + +from pybotx import Bot, IncomingMessage +from pybotx.widgets.multi_select import MULTI_SELECTED_VALUES_KEY, MULTI_SELECT_VALUE_KEY + + +async def test_${module_name}_widget_displays( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + await bot.async_execute_bot_command(incoming_message_factory(body=$command_literal)) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $label_literal # type: ignore[attr-defined] + + +async def test_${module_name}_widget_handles_completed_selection( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + message = incoming_message_factory(body=$command_literal) + message.metadata = { + MULTI_SELECTED_VALUES_KEY: ["dev"], + } + message.data = {MULTI_SELECT_VALUE_KEY: "prod"} + + await bot.async_execute_bot_command(message) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $primary_result_literal # type: ignore[attr-defined] +""" +) + + +WIDGET_DATE_RANGE_COMMAND_TEMPLATE = Template( + """from pybotx import Bot, HandlerCollector, IncomingMessage +from pybotx.widgets import DateRangeWidget, RunnerHookResult, on_data_key, widget_command +from pybotx.widgets.date_range import DATE_RANGE_SELECTED_DATE_KEY + +from $widget_support_module import ( + build_widget_factory, + build_widget_runner_config, + get_container, +) + + +collector = HandlerCollector() +COMMAND_NAME = $command_literal + + +def _resolve_date_range_result(widget: DateRangeWidget) -> RunnerHookResult | None: + if widget.start is None or widget.end is None: + return None + + widget_service = get_container(widget.bot).$service_provider_name() + return RunnerHookResult( + result=widget_service.build_selection_result(widget.start, widget.end), + should_display=False, + ) + + +@collector.command(COMMAND_NAME, description=$description_literal) +@widget_command( + config=build_widget_runner_config( + before=on_data_key(DATE_RANGE_SELECTED_DATE_KEY, _resolve_date_range_result), + ), +) +async def $handler_name(message: IncomingMessage, bot: Bot) -> DateRangeWidget: + widget_service = get_container(bot).$service_provider_name() + widgets = build_widget_factory(message, bot, command=COMMAND_NAME) + return widgets.date_range(label=widget_service.build_label()) +""" +) + + +WIDGET_DATE_RANGE_SERVICE_TEMPLATE = Template( + """from dataclasses import dataclass +from datetime import date + + +@dataclass(frozen=True, slots=True) +class $service_class_name: + def build_label(self) -> str: + return $label_literal + + def build_selection_result(self, start_date: date, end_date: date) -> str: + return f"Selected period: {start_date.isoformat()} - {end_date.isoformat()}" +""" +) + + +WIDGET_DATE_RANGE_TEST_TEMPLATE = Template( + """from collections.abc import Callable + +from pybotx import Bot, IncomingMessage +from pybotx.widgets.date_range import ( + DATE_RANGE_CURSOR_KEY, + DATE_RANGE_SELECTED_DATE_KEY, + DATE_RANGE_START_KEY, +) + + +async def test_${module_name}_widget_displays( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + await bot.async_execute_bot_command(incoming_message_factory(body=$command_literal)) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $display_body_literal # type: ignore[attr-defined] + + +async def test_${module_name}_widget_handles_completed_range( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + message = incoming_message_factory(body=$command_literal) + message.metadata = { + DATE_RANGE_START_KEY: "2026-03-01", + DATE_RANGE_CURSOR_KEY: "end", + } + message.data = {DATE_RANGE_SELECTED_DATE_KEY: "2026-03-08"} + + await bot.async_execute_bot_command(message) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $primary_result_literal # type: ignore[attr-defined] +""" +) + + +WIDGET_FLOW_LABEL_WIDGET_SERVICE_TEMPLATE = Template( + """from dataclasses import dataclass + + +@dataclass(frozen=True, slots=True) +class $widget_service_class_name: + def build_label(self) -> str: + return $label_literal +""" +) + + +WIDGET_FLOW_OPTIONS_WIDGET_SERVICE_TEMPLATE = Template( + """from dataclasses import dataclass + + +@dataclass(frozen=True, slots=True) +class $widget_service_class_name: + def build_label(self) -> str: + return $label_literal + + def build_options(self) -> list[str]: + return [ + "dev", + "staging", + "prod", + ] +""" +) + + +WIDGET_FLOW_MULTI_SELECT_WIDGET_SERVICE_TEMPLATE = Template( + """from dataclasses import dataclass + + +@dataclass(frozen=True, slots=True) +class $widget_service_class_name: + def build_label(self) -> str: + return $label_literal + + def build_options(self) -> list[str]: + return [ + "dev", + "staging", + "prod", + ] + + def max_selected(self) -> int: + return 2 +""" +) + + +WIDGET_FLOW_CONFIRM_RESULT_SERVICE_TEMPLATE = Template( + """from dataclasses import dataclass + + +@dataclass(frozen=True, slots=True) +class $result_service_class_name: + def handle_action(self, action: str) -> str: + if action == "confirm": + return $primary_result_literal + if action == "cancel": + return $secondary_result_literal + + return f"Unhandled widget action: {action}" +""" +) + + +WIDGET_FLOW_APPROVAL_RESULT_SERVICE_TEMPLATE = Template( + """from dataclasses import dataclass + + +@dataclass(frozen=True, slots=True) +class $result_service_class_name: + def handle_action(self, action: str) -> str: + if action == "approve": + return $primary_result_literal + if action == "reject": + return $secondary_result_literal + if action == "comment": + return $tertiary_result_literal + + return f"Unhandled widget action: {action}" +""" +) + + +WIDGET_FLOW_SELECTION_RESULT_SERVICE_TEMPLATE = Template( + """from dataclasses import dataclass + + +@dataclass(frozen=True, slots=True) +class $result_service_class_name: + def handle_selection(self, value: str) -> str: + return f"Selected value: {value}" +""" +) + + +WIDGET_FLOW_MULTI_SELECTION_RESULT_SERVICE_TEMPLATE = Template( + """from dataclasses import dataclass + + +@dataclass(frozen=True, slots=True) +class $result_service_class_name: + def handle_selection(self, values: list[str]) -> str: + return f"Selected values: {', '.join(values)}" +""" +) + + +WIDGET_FLOW_DATE_RANGE_RESULT_SERVICE_TEMPLATE = Template( + """from dataclasses import dataclass +from datetime import date + + +@dataclass(frozen=True, slots=True) +class $result_service_class_name: + def handle_selection(self, start_date: date, end_date: date) -> str: + return f"Selected period: {start_date.isoformat()} - {end_date.isoformat()}" +""" +) + + +WIDGET_FLOW_CONFIRM_COMMAND_TEMPLATE = Template( + """from pybotx import Bot, HandlerCollector, IncomingMessage +from pybotx.widgets import ConfirmWidget, on_action, widget_command +from pybotx.widgets.confirm import CANCEL_ACTION, CONFIRM_ACTION + +from $widget_support_module import ( + build_widget_factory, + build_widget_runner_config, + get_container, +) + + +collector = HandlerCollector() +COMMAND_NAME = $command_literal + + +@collector.command(COMMAND_NAME, description=$description_literal) +@widget_command( + config=build_widget_runner_config( + before=on_action( + lambda widget: ConfirmWidget.get_action(widget.message), + { + CONFIRM_ACTION: lambda widget: ( + get_container(widget.bot) + .$result_service_provider_name() + .handle_action(CONFIRM_ACTION) + ), + CANCEL_ACTION: lambda widget: ( + get_container(widget.bot) + .$result_service_provider_name() + .handle_action(CANCEL_ACTION) + ), + }, + ), + ), +) +async def $handler_name(message: IncomingMessage, bot: Bot) -> ConfirmWidget: + widget_service = get_container(bot).$widget_service_provider_name() + widgets = build_widget_factory(message, bot, command=COMMAND_NAME) + return widgets.confirm(label=widget_service.build_label()) +""" +) + + +WIDGET_FLOW_APPROVAL_COMMAND_TEMPLATE = Template( + """from pybotx import Bot, HandlerCollector, IncomingMessage +from pybotx.widgets import ApprovalWidget, on_action, widget_command +from pybotx.widgets.approval import APPROVE_ACTION, COMMENT_ACTION, REJECT_ACTION + +from $widget_support_module import ( + build_widget_factory, + build_widget_runner_config, + get_container, +) + + +collector = HandlerCollector() +COMMAND_NAME = $command_literal + + +@collector.command(COMMAND_NAME, description=$description_literal) +@widget_command( + config=build_widget_runner_config( + before=on_action( + lambda widget: ApprovalWidget.get_action(widget.message), + { + APPROVE_ACTION: lambda widget: ( + get_container(widget.bot) + .$result_service_provider_name() + .handle_action(APPROVE_ACTION) + ), + REJECT_ACTION: lambda widget: ( + get_container(widget.bot) + .$result_service_provider_name() + .handle_action(REJECT_ACTION) + ), + COMMENT_ACTION: lambda widget: ( + get_container(widget.bot) + .$result_service_provider_name() + .handle_action(COMMENT_ACTION) + ), + }, + ), + ), +) +async def $handler_name(message: IncomingMessage, bot: Bot) -> ApprovalWidget: + widget_service = get_container(bot).$widget_service_provider_name() + widgets = build_widget_factory(message, bot, command=COMMAND_NAME) + return widgets.approval(label=widget_service.build_label()) +""" +) + + +WIDGET_FLOW_SELECT_COMMAND_TEMPLATE = Template( + """from pybotx import Bot, HandlerCollector, IncomingMessage +from pybotx.widgets import SelectWidget, on_data_key, widget_command +from pybotx.widgets.select import SELECT_VALUE_KEY + +from $widget_support_module import ( + build_widget_factory, + build_widget_runner_config, + get_container, +) + + +collector = HandlerCollector() +COMMAND_NAME = $command_literal + + +@collector.command(COMMAND_NAME, description=$description_literal) +@widget_command( + config=build_widget_runner_config( + before=on_data_key( + SELECT_VALUE_KEY, + lambda widget: ( + get_container(widget.bot) + .$result_service_provider_name() + .handle_selection(SelectWidget.get_value(widget.message)) + ), + ), + ), +) +async def $handler_name(message: IncomingMessage, bot: Bot) -> SelectWidget: + widget_service = get_container(bot).$widget_service_provider_name() + widgets = build_widget_factory(message, bot, command=COMMAND_NAME) + return widgets.select( + label=widget_service.build_label(), + options=widget_service.build_options(), + ) +""" +) + + +WIDGET_FLOW_SEARCH_SELECT_COMMAND_TEMPLATE = Template( + """from pybotx import Bot, HandlerCollector, IncomingMessage +from pybotx.widgets import SearchSelectWidget, on_data_key, widget_command +from pybotx.widgets.select import SELECT_VALUE_KEY + +from $widget_support_module import ( + build_widget_factory, + build_widget_runner_config, + get_container, +) + + +collector = HandlerCollector() +COMMAND_NAME = $command_literal + + +@collector.command(COMMAND_NAME, description=$description_literal) +@widget_command( + config=build_widget_runner_config( + before=on_data_key( + SELECT_VALUE_KEY, + lambda widget: ( + get_container(widget.bot) + .$result_service_provider_name() + .handle_selection(SearchSelectWidget.get_value(widget.message)) + ), + ), + ), +) +async def $handler_name(message: IncomingMessage, bot: Bot) -> SearchSelectWidget: + widget_service = get_container(bot).$widget_service_provider_name() + widgets = build_widget_factory(message, bot, command=COMMAND_NAME) + return widgets.search_select( + label=widget_service.build_label(), + options=widget_service.build_options(), + ) +""" +) + + +WIDGET_FLOW_MULTI_SELECT_COMMAND_TEMPLATE = Template( + """from pybotx import Bot, HandlerCollector, IncomingMessage +from pybotx.widgets import MultiSelectWidget, RunnerHookResult, on_data_key, widget_command +from pybotx.widgets.multi_select import MULTI_SELECT_VALUE_KEY + +from $widget_support_module import ( + build_widget_factory, + build_widget_runner_config, + get_container, +) + + +collector = HandlerCollector() +COMMAND_NAME = $command_literal + + +def _resolve_multi_select_result(widget: MultiSelectWidget) -> RunnerHookResult | None: + container = get_container(widget.bot) + widget_service = container.$widget_service_provider_name() + selected_values = widget.selected_values + if len(selected_values) < widget_service.max_selected(): + return None + + return RunnerHookResult( + result=container.$result_service_provider_name().handle_selection(selected_values), + should_display=False, + ) + + +@collector.command(COMMAND_NAME, description=$description_literal) +@widget_command( + config=build_widget_runner_config( + before=on_data_key(MULTI_SELECT_VALUE_KEY, _resolve_multi_select_result), + ), +) +async def $handler_name(message: IncomingMessage, bot: Bot) -> MultiSelectWidget: + widget_service = get_container(bot).$widget_service_provider_name() + widgets = build_widget_factory(message, bot, command=COMMAND_NAME) + return widgets.multi_select( + label=widget_service.build_label(), + options=widget_service.build_options(), + max_selected=widget_service.max_selected(), + ) +""" +) + + +WIDGET_FLOW_DATE_RANGE_COMMAND_TEMPLATE = Template( + """from pybotx import Bot, HandlerCollector, IncomingMessage +from pybotx.widgets import DateRangeWidget, RunnerHookResult, on_data_key, widget_command +from pybotx.widgets.date_range import DATE_RANGE_SELECTED_DATE_KEY + +from $widget_support_module import ( + build_widget_factory, + build_widget_runner_config, + get_container, +) + + +collector = HandlerCollector() +COMMAND_NAME = $command_literal + + +def _resolve_date_range_result(widget: DateRangeWidget) -> RunnerHookResult | None: + if widget.start is None or widget.end is None: + return None + + return RunnerHookResult( + result=( + get_container(widget.bot) + .$result_service_provider_name() + .handle_selection(widget.start, widget.end) + ), + should_display=False, + ) + + +@collector.command(COMMAND_NAME, description=$description_literal) +@widget_command( + config=build_widget_runner_config( + before=on_data_key(DATE_RANGE_SELECTED_DATE_KEY, _resolve_date_range_result), + ), +) +async def $handler_name(message: IncomingMessage, bot: Bot) -> DateRangeWidget: + widget_service = get_container(bot).$widget_service_provider_name() + widgets = build_widget_factory(message, bot, command=COMMAND_NAME) + return widgets.date_range(label=widget_service.build_label()) +""" +) + + +WIDGET_FLOW_CONFIRM_TEST_TEMPLATE = Template( + """from collections.abc import Callable + +from pybotx import Bot, IncomingMessage +from pybotx.widgets.confirm import CONFIRM_ACTION, CONFIRM_ACTION_KEY + + +async def test_${module_name}_widget_flow_displays( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + await bot.async_execute_bot_command(incoming_message_factory(body=$command_literal)) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $label_literal # type: ignore[attr-defined] + + +async def test_${module_name}_widget_flow_handles_action( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + message = incoming_message_factory(body=$command_literal) + message.data = {CONFIRM_ACTION_KEY: CONFIRM_ACTION} + + await bot.async_execute_bot_command(message) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $primary_result_literal # type: ignore[attr-defined] +""" +) + + +WIDGET_FLOW_APPROVAL_TEST_TEMPLATE = Template( + """from collections.abc import Callable + +from pybotx import Bot, IncomingMessage +from pybotx.widgets.approval import APPROVAL_ACTION_KEY, APPROVE_ACTION + + +async def test_${module_name}_widget_flow_displays( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + await bot.async_execute_bot_command(incoming_message_factory(body=$command_literal)) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $label_literal # type: ignore[attr-defined] + + +async def test_${module_name}_widget_flow_handles_action( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + message = incoming_message_factory(body=$command_literal) + message.data = {APPROVAL_ACTION_KEY: APPROVE_ACTION} + + await bot.async_execute_bot_command(message) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $primary_result_literal # type: ignore[attr-defined] +""" +) + + +WIDGET_FLOW_SELECT_TEST_TEMPLATE = Template( + """from collections.abc import Callable + +from pybotx import Bot, IncomingMessage +from pybotx.widgets.select import SELECT_VALUE_KEY + + +async def test_${module_name}_widget_flow_displays( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + await bot.async_execute_bot_command(incoming_message_factory(body=$command_literal)) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $label_literal # type: ignore[attr-defined] + + +async def test_${module_name}_widget_flow_handles_selection( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + message = incoming_message_factory(body=$command_literal) + message.data = {SELECT_VALUE_KEY: "prod"} + + await bot.async_execute_bot_command(message) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == "Selected value: prod" # type: ignore[attr-defined] +""" +) + + +WIDGET_FLOW_MULTI_SELECT_TEST_TEMPLATE = Template( + """from collections.abc import Callable + +from pybotx import Bot, IncomingMessage +from pybotx.widgets.multi_select import MULTI_SELECTED_VALUES_KEY, MULTI_SELECT_VALUE_KEY + + +async def test_${module_name}_widget_flow_displays( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + await bot.async_execute_bot_command(incoming_message_factory(body=$command_literal)) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $label_literal # type: ignore[attr-defined] + + +async def test_${module_name}_widget_flow_handles_completed_selection( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + message = incoming_message_factory(body=$command_literal) + message.metadata = { + MULTI_SELECTED_VALUES_KEY: ["dev"], + } + message.data = {MULTI_SELECT_VALUE_KEY: "prod"} + + await bot.async_execute_bot_command(message) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == "Selected values: dev, prod" # type: ignore[attr-defined] +""" +) + + +WIDGET_FLOW_DATE_RANGE_TEST_TEMPLATE = Template( + """from collections.abc import Callable + +from pybotx import Bot, IncomingMessage +from pybotx.widgets.date_range import ( + DATE_RANGE_CURSOR_KEY, + DATE_RANGE_SELECTED_DATE_KEY, + DATE_RANGE_START_KEY, +) + + +async def test_${module_name}_widget_flow_displays( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + await bot.async_execute_bot_command(incoming_message_factory(body=$command_literal)) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == $display_body_literal # type: ignore[attr-defined] + + +async def test_${module_name}_widget_flow_handles_completed_range( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + message = incoming_message_factory(body=$command_literal) + message.metadata = { + DATE_RANGE_START_KEY: "2026-03-01", + DATE_RANGE_CURSOR_KEY: "end", + } + message.data = {DATE_RANGE_SELECTED_DATE_KEY: "2026-03-08"} + + await bot.async_execute_bot_command(message) + + bot.send.assert_awaited_once() # type: ignore[attr-defined] + assert bot.send.await_args.kwargs["message"].body == "Selected period: 2026-03-01 - 2026-03-08" # type: ignore[attr-defined] +""" +) + + +FSM_FLOW_COMMAND_TEMPLATE = Template( + """from pybotx import Bot, HandlerCollector, IncomingMessage + +from $fsm_module_prefix.$module_name import $start_function_name + + +collector = HandlerCollector() + + +@collector.command($command_literal, description=$description_literal) +async def $handler_name(message: IncomingMessage, bot: Bot) -> None: + await $start_function_name(message, bot) +""" +) + + +FSM_FLOW_MODULE_TEMPLATE = Template( + """from enum import Enum, auto + +from pybotx import Bot, IncomingMessage +from pybotx_fsm import FSMCollector + + +class $states_enum_name(Enum): + ENTER_VALUE = auto() + CONFIRM_VALUE = auto() + + +fsm = FSMCollector($states_enum_name) + + +async def $start_function_name(message: IncomingMessage, bot: Bot) -> None: + await message.state.fsm.change_state($states_enum_name.ENTER_VALUE) + await bot.answer_message($initial_prompt_literal) + + +@fsm.on($states_enum_name.ENTER_VALUE) +async def enter_value(message: IncomingMessage, bot: Bot) -> None: + value = message.body.strip() + if not value: + await bot.answer_message("Value can't be empty. Try again.") + return + + await message.state.fsm.change_state($states_enum_name.CONFIRM_VALUE, value=value) + await bot.answer_message( + f"Confirm $display_name_lower value: {value}. Reply with yes or no.", + ) + + +@fsm.on($states_enum_name.CONFIRM_VALUE) +async def confirm_value(message: IncomingMessage, bot: Bot) -> None: + decision = message.body.strip().lower() + value = message.state.fsm_storage.value + + if decision in {"yes", "y"}: + await message.state.fsm.drop_state() + $completion_statement + return + + if decision in {"no", "n"}: + await message.state.fsm.change_state($states_enum_name.ENTER_VALUE) + await bot.answer_message($initial_prompt_literal) + return + + await bot.answer_message("Reply with yes or no.") +""" +) + + +FSM_FLOW_TEST_TEMPLATE = Template( + """from collections.abc import Callable + +from pybotx import Bot, IncomingMessage + + +async def test_${module_name}_fsm_flow( + bot: Bot, + incoming_message_factory: Callable[..., IncomingMessage], +) -> None: + await bot.async_execute_bot_command(incoming_message_factory(body=$command_literal)) + bot.answer_message.assert_awaited_once_with( # type: ignore[attr-defined] + $initial_prompt_literal, + ) + + bot.answer_message.reset_mock() # type: ignore[attr-defined] + await bot.async_execute_bot_command( + incoming_message_factory(body="sample-value"), + ) + bot.answer_message.assert_awaited_once_with( # type: ignore[attr-defined] + "Confirm $display_name_lower value: sample-value. Reply with yes or no.", + ) + + bot.answer_message.reset_mock() # type: ignore[attr-defined] + await bot.async_execute_bot_command(incoming_message_factory(body="yes")) + bot.answer_message.assert_awaited_once_with( # type: ignore[attr-defined] + $completion_assert_literal, + ) +""" +) + + +DOCKERFILE_TEMPLATE = Template( + """FROM python:3.12-slim + +RUN pip install --no-cache-dir uv + +WORKDIR /app +COPY . . + +RUN uv sync --no-dev + +CMD ["uv", "run", "uvicorn", "$package_name.main:app", "--host", "0.0.0.0", "--port", "8000"] +""" +) + + +DOCKER_COMPOSE_TEMPLATE = Template( + """services: + bot: + build: . + env_file: + - .env + ports: + - "8000:8000" +""" +) diff --git a/pybotx/scaffold/widget.py b/pybotx/scaffold/widget.py new file mode 100644 index 00000000..39aec4e9 --- /dev/null +++ b/pybotx/scaffold/widget.py @@ -0,0 +1,395 @@ +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path +from string import Template +from typing import Literal + +from pybotx.scaffold._shared import ( + append_marked_lines, + module_name_to_pascal_case, + normalize_scaffold_name, + slug_to_module_name, + write_template, +) +from pybotx.scaffold.manifest import ( + ScaffoldProjectManifest, + find_scaffold_project_root, +) +from pybotx.scaffold.templates import ( + WIDGET_APPROVAL_COMMAND_TEMPLATE, + WIDGET_APPROVAL_SERVICE_TEMPLATE, + WIDGET_APPROVAL_TEST_TEMPLATE, + WIDGET_CONFIRM_COMMAND_TEMPLATE, + WIDGET_CONFIRM_SERVICE_TEMPLATE, + WIDGET_CONFIRM_TEST_TEMPLATE, + WIDGET_DATE_RANGE_COMMAND_TEMPLATE, + WIDGET_DATE_RANGE_SERVICE_TEMPLATE, + WIDGET_DATE_RANGE_TEST_TEMPLATE, + WIDGET_MULTI_SELECT_COMMAND_TEMPLATE, + WIDGET_MULTI_SELECT_SERVICE_TEMPLATE, + WIDGET_MULTI_SELECT_TEST_TEMPLATE, + WIDGET_SEARCH_SELECT_COMMAND_TEMPLATE, + WIDGET_SEARCH_SELECT_TEST_TEMPLATE, + WIDGET_SELECT_COMMAND_TEMPLATE, + WIDGET_SELECT_SERVICE_TEMPLATE, + WIDGET_SELECT_TEST_TEMPLATE, + WIDGET_SUPPORT_TEMPLATE, +) + + +WidgetKind = Literal[ + "confirm", + "approval", + "select", + "search-select", + "multi-select", + "date-range", +] + +_COMMAND_IMPORTS_START = "# pybotx-scaffold command imports start" +_COMMAND_IMPORTS_END = "# pybotx-scaffold command imports end" +_COMMAND_COLLECTORS_START = " # pybotx-scaffold command collectors start" +_COMMAND_COLLECTORS_END = " # pybotx-scaffold command collectors end" +_SERVICE_IMPORTS_START = "# pybotx-scaffold service imports start" +_SERVICE_IMPORTS_END = "# pybotx-scaffold service imports end" +_SERVICE_PROVIDERS_START = " # pybotx-scaffold service providers start" +_SERVICE_PROVIDERS_END = " # pybotx-scaffold service providers end" +_ANSWER_MESSAGE_MOCK = ( + " built_bot.answer_message = AsyncMock(return_value=uuid4()) # type: ignore[method-assign]" +) +_SEND_MESSAGE_MOCK = ( + " built_bot.send = AsyncMock(return_value=uuid4()) # type: ignore[method-assign]" +) +_EDIT_MESSAGE_MOCK = " built_bot.edit_message = AsyncMock() # type: ignore[method-assign]" + + +@dataclass(frozen=True, slots=True) +class CreateWidgetOptions: + widget_name: str + project_dir: Path | str = "." + kind: WidgetKind = "confirm" + command_name: str | None = None + description: str | None = None + + +@dataclass(frozen=True, slots=True) +class CreatedWidgetArtifacts: + project_root: Path + package_name: str + widget_name: str + kind: WidgetKind + command_path: str + created_files: tuple[Path, ...] + + +@dataclass(frozen=True, slots=True) +class _WidgetSpec: + kind: WidgetKind + module_name: str + widget_name: str + command_path: str + description: str + service_class_name: str + service_provider_name: str + collector_alias: str + handler_name: str + label: str + primary_result: str + secondary_result: str + tertiary_result: str | None = None + + +def create_widget_in_project(options: CreateWidgetOptions) -> CreatedWidgetArtifacts: + project_root = find_scaffold_project_root(options.project_dir) + manifest = ScaffoldProjectManifest.load(project_root) + widget_spec = _build_widget_spec( + widget_name=options.widget_name, + kind=options.kind, + command_name=options.command_name, + description=options.description, + ) + + command_module_path = project_root / manifest.commands_dir / ( + f"{widget_spec.module_name}.py" + ) + service_module_path = project_root / manifest.services_dir / ( + f"{widget_spec.module_name}.py" + ) + test_module_path = project_root / manifest.tests_dir / ( + f"test_{widget_spec.module_name}_widget.py" + ) + widget_support_path = project_root / manifest.widget_support_path + + for path in (command_module_path, service_module_path, test_module_path): + if path.exists(): + raise FileExistsError(f"`{path}` already exists") + + created_files: list[Path] = [] + if not widget_support_path.exists(): + write_template( + widget_support_path, + WIDGET_SUPPORT_TEMPLATE, + {"container_module": manifest.container_module}, + ) + created_files.append(widget_support_path) + + _ensure_widget_test_mocks(project_root / manifest.tests_conftest_path) + + command_template, service_template, test_template = _select_widget_templates( + widget_spec.kind, + ) + context = { + "command_literal": repr(widget_spec.command_path), + "description_literal": repr(widget_spec.description), + "display_body_literal": repr( + f"{widget_spec.label}\nНачало: —\nКонец: —", + ), + "handler_name": widget_spec.handler_name, + "label_literal": repr(widget_spec.label), + "module_name": widget_spec.module_name, + "package_name": manifest.package_name, + "primary_result_literal": repr(widget_spec.primary_result), + "secondary_result_literal": repr(widget_spec.secondary_result), + "service_class_name": widget_spec.service_class_name, + "service_provider_name": widget_spec.service_provider_name, + "tertiary_result_literal": repr(widget_spec.tertiary_result or ""), + "widget_support_module": manifest.widget_support_module, + } + + write_template(command_module_path, command_template, context) + write_template(service_module_path, service_template, context) + write_template(test_module_path, test_template, context) + created_files.extend( + [ + command_module_path, + service_module_path, + test_module_path, + ], + ) + + append_marked_lines( + project_root / manifest.commands_init_path, + start_marker=_COMMAND_IMPORTS_START, + end_marker=_COMMAND_IMPORTS_END, + new_lines=[ + ( + f"from {manifest.commands_module_prefix}.{widget_spec.module_name} " + f"import collector as {widget_spec.collector_alias}" + ), + ], + ) + append_marked_lines( + project_root / manifest.commands_init_path, + start_marker=_COMMAND_COLLECTORS_START, + end_marker=_COMMAND_COLLECTORS_END, + new_lines=[f" {widget_spec.collector_alias},"], + ) + append_marked_lines( + project_root / manifest.container_path, + start_marker=_SERVICE_IMPORTS_START, + end_marker=_SERVICE_IMPORTS_END, + new_lines=[ + ( + f"from {manifest.services_module_prefix}.{widget_spec.module_name} " + f"import {widget_spec.service_class_name}" + ), + ], + ) + append_marked_lines( + project_root / manifest.container_path, + start_marker=_SERVICE_PROVIDERS_START, + end_marker=_SERVICE_PROVIDERS_END, + new_lines=[ + ( + f" {widget_spec.service_provider_name} = providers.Factory(" + f"{widget_spec.service_class_name})" + ), + ], + ) + + return CreatedWidgetArtifacts( + project_root=project_root, + package_name=manifest.package_name, + widget_name=widget_spec.widget_name, + kind=widget_spec.kind, + command_path=widget_spec.command_path, + created_files=tuple(created_files), + ) + + +def _build_widget_spec( + *, + widget_name: str, + kind: WidgetKind, + command_name: str | None, + description: str | None, +) -> _WidgetSpec: + normalized_widget_name = normalize_scaffold_name(widget_name, kind="Widget name") + normalized_command_name = normalize_scaffold_name( + command_name or widget_name, + kind="Command name", + ) + module_name = slug_to_module_name(normalized_widget_name) + display_name = normalized_widget_name.replace("-", " ") + pascal_name = module_name_to_pascal_case(module_name) + + if kind == "confirm": + return _WidgetSpec( + kind=kind, + module_name=module_name, + widget_name=normalized_widget_name, + command_path=f"/{normalized_command_name}", + description=description or f"Show {display_name} confirmation widget", + service_class_name=f"{pascal_name}WidgetService", + service_provider_name=f"{module_name}_widget_service", + collector_alias=f"{module_name}_collector", + handler_name=f"{module_name}_handler", + label=f"Confirm {display_name}?", + primary_result=f"{display_name.title()} confirmed.", + secondary_result=f"{display_name.title()} cancelled.", + ) + + if kind == "approval": + return _WidgetSpec( + kind=kind, + module_name=module_name, + widget_name=normalized_widget_name, + command_path=f"/{normalized_command_name}", + description=description or f"Show {display_name} approval widget", + service_class_name=f"{pascal_name}WidgetService", + service_provider_name=f"{module_name}_widget_service", + collector_alias=f"{module_name}_collector", + handler_name=f"{module_name}_handler", + label=f"Review {display_name}", + primary_result=f"{display_name.title()} approved.", + secondary_result=f"{display_name.title()} rejected.", + tertiary_result=f"Left a comment for {display_name}.", + ) + + if kind == "search-select": + return _WidgetSpec( + kind=kind, + module_name=module_name, + widget_name=normalized_widget_name, + command_path=f"/{normalized_command_name}", + description=description or f"Show {display_name} search select widget", + service_class_name=f"{pascal_name}WidgetService", + service_provider_name=f"{module_name}_widget_service", + collector_alias=f"{module_name}_collector", + handler_name=f"{module_name}_handler", + label=f"Choose {display_name}", + primary_result="Selected value: prod", + secondary_result="", + ) + + if kind == "multi-select": + return _WidgetSpec( + kind=kind, + module_name=module_name, + widget_name=normalized_widget_name, + command_path=f"/{normalized_command_name}", + description=description or f"Show {display_name} multi select widget", + service_class_name=f"{pascal_name}WidgetService", + service_provider_name=f"{module_name}_widget_service", + collector_alias=f"{module_name}_collector", + handler_name=f"{module_name}_handler", + label=f"Choose {display_name}", + primary_result="Selected values: dev, prod", + secondary_result="", + ) + + if kind == "date-range": + return _WidgetSpec( + kind=kind, + module_name=module_name, + widget_name=normalized_widget_name, + command_path=f"/{normalized_command_name}", + description=description or f"Show {display_name} date range widget", + service_class_name=f"{pascal_name}WidgetService", + service_provider_name=f"{module_name}_widget_service", + collector_alias=f"{module_name}_collector", + handler_name=f"{module_name}_handler", + label=f"Choose {display_name} period", + primary_result="Selected period: 2026-03-01 - 2026-03-08", + secondary_result="", + ) + + return _WidgetSpec( + kind=kind, + module_name=module_name, + widget_name=normalized_widget_name, + command_path=f"/{normalized_command_name}", + description=description or f"Show {display_name} select widget", + service_class_name=f"{pascal_name}WidgetService", + service_provider_name=f"{module_name}_widget_service", + collector_alias=f"{module_name}_collector", + handler_name=f"{module_name}_handler", + label=f"Choose {display_name}", + primary_result="Selected value: prod", + secondary_result="", + ) + + +def _select_widget_templates( + kind: WidgetKind, +) -> tuple[Template, Template, Template]: + if kind == "confirm": + return ( + WIDGET_CONFIRM_COMMAND_TEMPLATE, + WIDGET_CONFIRM_SERVICE_TEMPLATE, + WIDGET_CONFIRM_TEST_TEMPLATE, + ) + if kind == "approval": + return ( + WIDGET_APPROVAL_COMMAND_TEMPLATE, + WIDGET_APPROVAL_SERVICE_TEMPLATE, + WIDGET_APPROVAL_TEST_TEMPLATE, + ) + if kind == "search-select": + return ( + WIDGET_SEARCH_SELECT_COMMAND_TEMPLATE, + WIDGET_SELECT_SERVICE_TEMPLATE, + WIDGET_SEARCH_SELECT_TEST_TEMPLATE, + ) + if kind == "multi-select": + return ( + WIDGET_MULTI_SELECT_COMMAND_TEMPLATE, + WIDGET_MULTI_SELECT_SERVICE_TEMPLATE, + WIDGET_MULTI_SELECT_TEST_TEMPLATE, + ) + if kind == "date-range": + return ( + WIDGET_DATE_RANGE_COMMAND_TEMPLATE, + WIDGET_DATE_RANGE_SERVICE_TEMPLATE, + WIDGET_DATE_RANGE_TEST_TEMPLATE, + ) + return ( + WIDGET_SELECT_COMMAND_TEMPLATE, + WIDGET_SELECT_SERVICE_TEMPLATE, + WIDGET_SELECT_TEST_TEMPLATE, + ) + + +def _ensure_widget_test_mocks(path: Path) -> None: + content = path.read_text(encoding="utf-8") + if _SEND_MESSAGE_MOCK in content and _EDIT_MESSAGE_MOCK in content: + return + + if _ANSWER_MESSAGE_MOCK not in content: + raise RuntimeError( + "Couldn't enable widget test support automatically for " + f"`{path}`. Regenerate the project or add send/edit mocks manually.", + ) + + replacement_lines = [ + _ANSWER_MESSAGE_MOCK, + _SEND_MESSAGE_MOCK, + _EDIT_MESSAGE_MOCK, + ] + updated_content = content.replace( + _ANSWER_MESSAGE_MOCK, + "\n".join(replacement_lines), + 1, + ) + path.write_text(updated_content, encoding="utf-8") diff --git a/pybotx/scaffold/widget_flow.py b/pybotx/scaffold/widget_flow.py new file mode 100644 index 00000000..5c27ff3c --- /dev/null +++ b/pybotx/scaffold/widget_flow.py @@ -0,0 +1,433 @@ +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path +from string import Template + +from pybotx.scaffold._shared import ( + append_marked_lines, + module_name_to_pascal_case, + normalize_scaffold_name, + slug_to_module_name, + write_template, +) +from pybotx.scaffold.manifest import ( + ScaffoldProjectManifest, + find_scaffold_project_root, +) +from pybotx.scaffold.templates import ( + WIDGET_FLOW_APPROVAL_COMMAND_TEMPLATE, + WIDGET_FLOW_APPROVAL_RESULT_SERVICE_TEMPLATE, + WIDGET_FLOW_APPROVAL_TEST_TEMPLATE, + WIDGET_FLOW_CONFIRM_COMMAND_TEMPLATE, + WIDGET_FLOW_CONFIRM_RESULT_SERVICE_TEMPLATE, + WIDGET_FLOW_CONFIRM_TEST_TEMPLATE, + WIDGET_FLOW_DATE_RANGE_COMMAND_TEMPLATE, + WIDGET_FLOW_DATE_RANGE_RESULT_SERVICE_TEMPLATE, + WIDGET_FLOW_DATE_RANGE_TEST_TEMPLATE, + WIDGET_FLOW_LABEL_WIDGET_SERVICE_TEMPLATE, + WIDGET_FLOW_MULTI_SELECT_COMMAND_TEMPLATE, + WIDGET_FLOW_MULTI_SELECTION_RESULT_SERVICE_TEMPLATE, + WIDGET_FLOW_MULTI_SELECT_TEST_TEMPLATE, + WIDGET_FLOW_MULTI_SELECT_WIDGET_SERVICE_TEMPLATE, + WIDGET_FLOW_OPTIONS_WIDGET_SERVICE_TEMPLATE, + WIDGET_FLOW_SEARCH_SELECT_COMMAND_TEMPLATE, + WIDGET_FLOW_SELECT_COMMAND_TEMPLATE, + WIDGET_FLOW_SELECT_TEST_TEMPLATE, + WIDGET_FLOW_SELECTION_RESULT_SERVICE_TEMPLATE, + WIDGET_SUPPORT_TEMPLATE, +) +from pybotx.scaffold.widget import WidgetKind + + +_COMMAND_IMPORTS_START = "# pybotx-scaffold command imports start" +_COMMAND_IMPORTS_END = "# pybotx-scaffold command imports end" +_COMMAND_COLLECTORS_START = " # pybotx-scaffold command collectors start" +_COMMAND_COLLECTORS_END = " # pybotx-scaffold command collectors end" +_SERVICE_IMPORTS_START = "# pybotx-scaffold service imports start" +_SERVICE_IMPORTS_END = "# pybotx-scaffold service imports end" +_SERVICE_PROVIDERS_START = " # pybotx-scaffold service providers start" +_SERVICE_PROVIDERS_END = " # pybotx-scaffold service providers end" +_ANSWER_MESSAGE_MOCK = ( + " built_bot.answer_message = AsyncMock(return_value=uuid4()) # type: ignore[method-assign]" +) +_SEND_MESSAGE_MOCK = ( + " built_bot.send = AsyncMock(return_value=uuid4()) # type: ignore[method-assign]" +) +_EDIT_MESSAGE_MOCK = " built_bot.edit_message = AsyncMock() # type: ignore[method-assign]" + + +@dataclass(frozen=True, slots=True) +class CreateWidgetFlowOptions: + flow_name: str + project_dir: Path | str = "." + kind: WidgetKind = "confirm" + command_name: str | None = None + description: str | None = None + + +@dataclass(frozen=True, slots=True) +class CreatedWidgetFlowArtifacts: + project_root: Path + package_name: str + flow_name: str + kind: WidgetKind + command_path: str + created_files: tuple[Path, ...] + + +@dataclass(frozen=True, slots=True) +class _WidgetFlowSpec: + kind: WidgetKind + module_name: str + flow_name: str + command_path: str + description: str + widget_service_class_name: str + widget_service_provider_name: str + result_service_class_name: str + result_service_provider_name: str + collector_alias: str + handler_name: str + label: str + primary_result: str + secondary_result: str + tertiary_result: str | None = None + + +def create_widget_flow_in_project( + options: CreateWidgetFlowOptions, +) -> CreatedWidgetFlowArtifacts: + project_root = find_scaffold_project_root(options.project_dir) + manifest = ScaffoldProjectManifest.load(project_root) + flow_spec = _build_widget_flow_spec( + flow_name=options.flow_name, + kind=options.kind, + command_name=options.command_name, + description=options.description, + ) + + command_module_path = project_root / manifest.commands_dir / f"{flow_spec.module_name}.py" + widget_service_module_path = ( + project_root / manifest.services_dir / f"{flow_spec.module_name}_widget.py" + ) + result_service_module_path = ( + project_root / manifest.services_dir / f"{flow_spec.module_name}_result.py" + ) + test_module_path = ( + project_root / manifest.tests_dir / f"test_{flow_spec.module_name}_widget_flow.py" + ) + widget_support_path = project_root / manifest.widget_support_path + + for path in ( + command_module_path, + widget_service_module_path, + result_service_module_path, + test_module_path, + ): + if path.exists(): + raise FileExistsError(f"`{path}` already exists") + + created_files: list[Path] = [] + if not widget_support_path.exists(): + write_template( + widget_support_path, + WIDGET_SUPPORT_TEMPLATE, + {"container_module": manifest.container_module}, + ) + created_files.append(widget_support_path) + + _ensure_widget_test_mocks(project_root / manifest.tests_conftest_path) + + ( + command_template, + widget_service_template, + result_service_template, + test_template, + ) = _select_widget_flow_templates(flow_spec.kind) + + context = { + "command_literal": repr(flow_spec.command_path), + "description_literal": repr(flow_spec.description), + "display_body_literal": repr(f"{flow_spec.label}\nНачало: —\nКонец: —"), + "handler_name": flow_spec.handler_name, + "label_literal": repr(flow_spec.label), + "module_name": flow_spec.module_name, + "package_name": manifest.package_name, + "primary_result_literal": repr(flow_spec.primary_result), + "result_service_class_name": flow_spec.result_service_class_name, + "result_service_provider_name": flow_spec.result_service_provider_name, + "secondary_result_literal": repr(flow_spec.secondary_result), + "tertiary_result_literal": repr(flow_spec.tertiary_result or ""), + "widget_service_class_name": flow_spec.widget_service_class_name, + "widget_service_provider_name": flow_spec.widget_service_provider_name, + "widget_support_module": manifest.widget_support_module, + } + + write_template(command_module_path, command_template, context) + write_template(widget_service_module_path, widget_service_template, context) + write_template(result_service_module_path, result_service_template, context) + write_template(test_module_path, test_template, context) + created_files.extend( + [ + command_module_path, + widget_service_module_path, + result_service_module_path, + test_module_path, + ], + ) + + append_marked_lines( + project_root / manifest.commands_init_path, + start_marker=_COMMAND_IMPORTS_START, + end_marker=_COMMAND_IMPORTS_END, + new_lines=[ + ( + f"from {manifest.commands_module_prefix}.{flow_spec.module_name} " + f"import collector as {flow_spec.collector_alias}" + ), + ], + ) + append_marked_lines( + project_root / manifest.commands_init_path, + start_marker=_COMMAND_COLLECTORS_START, + end_marker=_COMMAND_COLLECTORS_END, + new_lines=[f" {flow_spec.collector_alias},"], + ) + append_marked_lines( + project_root / manifest.container_path, + start_marker=_SERVICE_IMPORTS_START, + end_marker=_SERVICE_IMPORTS_END, + new_lines=[ + ( + f"from {manifest.services_module_prefix}.{flow_spec.module_name}_widget " + f"import {flow_spec.widget_service_class_name}" + ), + ( + f"from {manifest.services_module_prefix}.{flow_spec.module_name}_result " + f"import {flow_spec.result_service_class_name}" + ), + ], + ) + append_marked_lines( + project_root / manifest.container_path, + start_marker=_SERVICE_PROVIDERS_START, + end_marker=_SERVICE_PROVIDERS_END, + new_lines=[ + ( + f" {flow_spec.widget_service_provider_name} = providers.Factory(" + f"{flow_spec.widget_service_class_name})" + ), + ( + f" {flow_spec.result_service_provider_name} = providers.Factory(" + f"{flow_spec.result_service_class_name})" + ), + ], + ) + + return CreatedWidgetFlowArtifacts( + project_root=project_root, + package_name=manifest.package_name, + flow_name=flow_spec.flow_name, + kind=flow_spec.kind, + command_path=flow_spec.command_path, + created_files=tuple(created_files), + ) + + +def _build_widget_flow_spec( + *, + flow_name: str, + kind: WidgetKind, + command_name: str | None, + description: str | None, +) -> _WidgetFlowSpec: + normalized_flow_name = normalize_scaffold_name(flow_name, kind="Widget flow name") + normalized_command_name = normalize_scaffold_name( + command_name or flow_name, + kind="Command name", + ) + module_name = slug_to_module_name(normalized_flow_name) + display_name = normalized_flow_name.replace("-", " ") + pascal_name = module_name_to_pascal_case(module_name) + + widget_service_class_name = f"{pascal_name}WidgetService" + result_service_class_name = f"{pascal_name}ResultService" + + if kind == "confirm": + return _WidgetFlowSpec( + kind=kind, + module_name=module_name, + flow_name=normalized_flow_name, + command_path=f"/{normalized_command_name}", + description=description or f"Show {display_name} confirmation widget flow", + widget_service_class_name=widget_service_class_name, + widget_service_provider_name=f"{module_name}_widget_service", + result_service_class_name=result_service_class_name, + result_service_provider_name=f"{module_name}_result_service", + collector_alias=f"{module_name}_collector", + handler_name=f"{module_name}_handler", + label=f"Confirm {display_name}?", + primary_result=f"{display_name.title()} confirmed.", + secondary_result=f"{display_name.title()} cancelled.", + ) + + if kind == "approval": + return _WidgetFlowSpec( + kind=kind, + module_name=module_name, + flow_name=normalized_flow_name, + command_path=f"/{normalized_command_name}", + description=description or f"Show {display_name} approval widget flow", + widget_service_class_name=widget_service_class_name, + widget_service_provider_name=f"{module_name}_widget_service", + result_service_class_name=result_service_class_name, + result_service_provider_name=f"{module_name}_result_service", + collector_alias=f"{module_name}_collector", + handler_name=f"{module_name}_handler", + label=f"Review {display_name}", + primary_result=f"{display_name.title()} approved.", + secondary_result=f"{display_name.title()} rejected.", + tertiary_result=f"Left a comment for {display_name}.", + ) + + if kind == "search-select": + return _WidgetFlowSpec( + kind=kind, + module_name=module_name, + flow_name=normalized_flow_name, + command_path=f"/{normalized_command_name}", + description=description or f"Show {display_name} search select widget flow", + widget_service_class_name=widget_service_class_name, + widget_service_provider_name=f"{module_name}_widget_service", + result_service_class_name=result_service_class_name, + result_service_provider_name=f"{module_name}_result_service", + collector_alias=f"{module_name}_collector", + handler_name=f"{module_name}_handler", + label=f"Choose {display_name}", + primary_result="Selected value: prod", + secondary_result="", + ) + + if kind == "multi-select": + return _WidgetFlowSpec( + kind=kind, + module_name=module_name, + flow_name=normalized_flow_name, + command_path=f"/{normalized_command_name}", + description=description or f"Show {display_name} multi select widget flow", + widget_service_class_name=widget_service_class_name, + widget_service_provider_name=f"{module_name}_widget_service", + result_service_class_name=result_service_class_name, + result_service_provider_name=f"{module_name}_result_service", + collector_alias=f"{module_name}_collector", + handler_name=f"{module_name}_handler", + label=f"Choose {display_name}", + primary_result="Selected values: dev, prod", + secondary_result="", + ) + + if kind == "date-range": + return _WidgetFlowSpec( + kind=kind, + module_name=module_name, + flow_name=normalized_flow_name, + command_path=f"/{normalized_command_name}", + description=description or f"Show {display_name} date range widget flow", + widget_service_class_name=widget_service_class_name, + widget_service_provider_name=f"{module_name}_widget_service", + result_service_class_name=result_service_class_name, + result_service_provider_name=f"{module_name}_result_service", + collector_alias=f"{module_name}_collector", + handler_name=f"{module_name}_handler", + label=f"Choose {display_name} period", + primary_result="Selected period: 2026-03-01 - 2026-03-08", + secondary_result="", + ) + + return _WidgetFlowSpec( + kind=kind, + module_name=module_name, + flow_name=normalized_flow_name, + command_path=f"/{normalized_command_name}", + description=description or f"Show {display_name} select widget flow", + widget_service_class_name=widget_service_class_name, + widget_service_provider_name=f"{module_name}_widget_service", + result_service_class_name=result_service_class_name, + result_service_provider_name=f"{module_name}_result_service", + collector_alias=f"{module_name}_collector", + handler_name=f"{module_name}_handler", + label=f"Choose {display_name}", + primary_result="Selected value: prod", + secondary_result="", + ) + + +def _select_widget_flow_templates( + kind: WidgetKind, +) -> tuple[Template, Template, Template, Template]: + if kind == "confirm": + return ( + WIDGET_FLOW_CONFIRM_COMMAND_TEMPLATE, + WIDGET_FLOW_LABEL_WIDGET_SERVICE_TEMPLATE, + WIDGET_FLOW_CONFIRM_RESULT_SERVICE_TEMPLATE, + WIDGET_FLOW_CONFIRM_TEST_TEMPLATE, + ) + if kind == "approval": + return ( + WIDGET_FLOW_APPROVAL_COMMAND_TEMPLATE, + WIDGET_FLOW_LABEL_WIDGET_SERVICE_TEMPLATE, + WIDGET_FLOW_APPROVAL_RESULT_SERVICE_TEMPLATE, + WIDGET_FLOW_APPROVAL_TEST_TEMPLATE, + ) + if kind == "search-select": + return ( + WIDGET_FLOW_SEARCH_SELECT_COMMAND_TEMPLATE, + WIDGET_FLOW_OPTIONS_WIDGET_SERVICE_TEMPLATE, + WIDGET_FLOW_SELECTION_RESULT_SERVICE_TEMPLATE, + WIDGET_FLOW_SELECT_TEST_TEMPLATE, + ) + if kind == "multi-select": + return ( + WIDGET_FLOW_MULTI_SELECT_COMMAND_TEMPLATE, + WIDGET_FLOW_MULTI_SELECT_WIDGET_SERVICE_TEMPLATE, + WIDGET_FLOW_MULTI_SELECTION_RESULT_SERVICE_TEMPLATE, + WIDGET_FLOW_MULTI_SELECT_TEST_TEMPLATE, + ) + if kind == "date-range": + return ( + WIDGET_FLOW_DATE_RANGE_COMMAND_TEMPLATE, + WIDGET_FLOW_LABEL_WIDGET_SERVICE_TEMPLATE, + WIDGET_FLOW_DATE_RANGE_RESULT_SERVICE_TEMPLATE, + WIDGET_FLOW_DATE_RANGE_TEST_TEMPLATE, + ) + return ( + WIDGET_FLOW_SELECT_COMMAND_TEMPLATE, + WIDGET_FLOW_OPTIONS_WIDGET_SERVICE_TEMPLATE, + WIDGET_FLOW_SELECTION_RESULT_SERVICE_TEMPLATE, + WIDGET_FLOW_SELECT_TEST_TEMPLATE, + ) + + +def _ensure_widget_test_mocks(path: Path) -> None: + content = path.read_text(encoding="utf-8") + if _SEND_MESSAGE_MOCK in content and _EDIT_MESSAGE_MOCK in content: + return + + if _ANSWER_MESSAGE_MOCK not in content: + raise RuntimeError( + "Couldn't enable widget test support automatically for " + f"`{path}`. Regenerate the project or add send/edit mocks manually.", + ) + + replacement_lines = [ + _ANSWER_MESSAGE_MOCK, + _SEND_MESSAGE_MOCK, + _EDIT_MESSAGE_MOCK, + ] + updated_content = content.replace( + _ANSWER_MESSAGE_MOCK, + "\n".join(replacement_lines), + 1, + ) + path.write_text(updated_content, encoding="utf-8") diff --git a/pybotx/widgets/factory.py b/pybotx/widgets/factory.py new file mode 100644 index 00000000..f03f463b --- /dev/null +++ b/pybotx/widgets/factory.py @@ -0,0 +1,464 @@ +from collections.abc import Sequence +from dataclasses import dataclass +from datetime import date +from typing import Any + +from pybotx.bot.bot import Bot +from pybotx.models.message.incoming_message import IncomingMessage +from pybotx.models.message.outgoing_message import OutgoingMessage + +from .approval import ApprovalWidget +from .async_job import AsyncJobWidget +from .base import WidgetResultMode +from .calendar import CalendarWidget +from .carousel import CarouselWidget +from .checklist import CheckListWidget +from .checktable import CheckboxContent, ChecktableWidget +from .confirm import ConfirmWidget +from .date_range import DateRangeWidget +from .file_batch import BatchFileItem, FileBatchWidget +from .form_wizard import FormWizardStep, FormWizardWidget +from .markup import MessageMarkup +from .messages_pager import MessagesPagerWidget +from .multi_select import MultiSelectWidget +from .pagination import PaginationWidget +from .range import RangeWidget +from .search_select import SearchSelectWidget +from .select import SelectOption, SelectWidget +from .table import TableWidget + + +@dataclass(frozen=True, slots=True) +class WidgetContext: + message: IncomingMessage + bot: Bot + command: str + additional_markup: MessageMarkup | None = None + result_mode: WidgetResultMode | None = None + + def as_widget_kwargs(self) -> dict[str, object]: + kwargs: dict[str, object] = { + "message": self.message, + "bot": self.bot, + "command": self.command, + } + if self.additional_markup is not None: + kwargs["additional_markup"] = self.additional_markup + if self.result_mode is not None: + kwargs["result_mode"] = self.result_mode + return kwargs + + +@dataclass(frozen=True, slots=True) +class WidgetDefaults: + confirm_label: str = "Подтвердить" + cancel_label: str = "Отмена" + approve_label: str = "Согласовать" + reject_label: str = "Отклонить" + comment_label: str = "Комментарий" + search_empty_label: str = "Ничего не найдено" + selected_prefix: str = "• " + + +class WidgetFactory: + def __init__( + self, + *, + context: WidgetContext, + defaults: WidgetDefaults | None = None, + ) -> None: + self._context = context + self._defaults = defaults or WidgetDefaults() + + def confirm( + self, + *, + label: str, + confirm_label: str | None = None, + cancel_label: str | None = None, + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> ConfirmWidget: + return ConfirmWidget( + label=label, + confirm_label=confirm_label or self._defaults.confirm_label, + cancel_label=cancel_label or self._defaults.cancel_label, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def approval( + self, + *, + label: str, + approve_label: str | None = None, + reject_label: str | None = None, + comment_label: str | None = None, + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> ApprovalWidget: + return ApprovalWidget( + label=label, + approve_label=approve_label or self._defaults.approve_label, + reject_label=reject_label or self._defaults.reject_label, + comment_label=comment_label or self._defaults.comment_label, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def select( + self, + *, + options: Sequence[str | SelectOption], + label: str, + selected_prefix: str | None = None, + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> SelectWidget: + return SelectWidget( + options=list(options), + label=label, + selected_prefix=selected_prefix or self._defaults.selected_prefix, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def search_select( + self, + *, + options: Sequence[str | SelectOption], + label: str, + page_size: int = 5, + empty_label: str | None = None, + selected_prefix: str | None = None, + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> SearchSelectWidget: + return SearchSelectWidget( + options=list(options), + label=label, + page_size=page_size, + empty_label=empty_label or self._defaults.search_empty_label, + selected_prefix=selected_prefix or self._defaults.selected_prefix, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def multi_select( + self, + *, + options: Sequence[str | SelectOption], + label: str, + max_selected: int | None = None, + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> MultiSelectWidget: + return MultiSelectWidget( + options=list(options), + label=label, + max_selected=max_selected, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def form_wizard( + self, + *, + steps: Sequence[FormWizardStep], + label: str, + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> FormWizardWidget: + return FormWizardWidget( + steps=list(steps), + label=label, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def table( + self, + *, + rows: Sequence[dict[str, Any]], + columns: Sequence[str], + label: str = "Таблица", + page_size: int = 5, + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> TableWidget: + return TableWidget( + rows=list(rows), + columns=list(columns), + label=label, + page_size=page_size, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def calendar( + self, + *, + start_date: date | None = None, + end_date: date = date.max, + include_past: bool = False, + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> CalendarWidget: + return CalendarWidget( + start_date=start_date, + end_date=end_date, + include_past=include_past, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def range( + self, + *, + elements: Sequence[str] | None = None, + label_template: str = "Current element: {element}", + forward_label: str = "Вперед", + backward_label: str = "Назад", + empty_body: str = "Список пуст", + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> RangeWidget: + return RangeWidget( + elements=elements, + label_template=label_template, + forward_label=forward_label, + backward_label=backward_label, + empty_body=empty_body, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def carousel( + self, + *, + widget_content: Sequence[Any], + label: str, + start_from: int = 0, + displayed_content_count: int = 3, + control_labels: tuple[str, str] | None = None, + inline: bool = True, + loop: bool = True, + show_numbers: bool = False, + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> CarouselWidget: + return CarouselWidget( + widget_content=widget_content, + label=label, + start_from=start_from, + displayed_content_count=displayed_content_count, + control_labels=control_labels, + inline=inline, + loop=loop, + show_numbers=show_numbers, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def pagination( + self, + *, + widget_content: Sequence[OutgoingMessage | str], + paginate_by: int, + delay_between_messages: float = 0.5, + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> PaginationWidget: + return PaginationWidget( + widget_content=list(widget_content), + paginate_by=paginate_by, + delay_between_messages=delay_between_messages, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def messages_pager( + self, + *, + elements: Sequence[str], + page_size: int, + item_template: str = "Element: {element}", + delay_between_messages: float = 0.5, + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> MessagesPagerWidget: + return MessagesPagerWidget( + elements=elements, + page_size=page_size, + item_template=item_template, + delay_between_messages=delay_between_messages, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def date_range( + self, + *, + label: str = "Выбор периода", + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> DateRangeWidget: + return DateRangeWidget( + label=label, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def async_job( + self, + *, + job_id: str, + status: str, + details: str = "", + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> AsyncJobWidget: + return AsyncJobWidget( + job_id=job_id, + status=status, + details=details, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def file_batch( + self, + *, + files: Sequence[BatchFileItem | dict[str, Any] | str] | None, + label: str = "Пакет файлов", + page_size: int = 5, + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> FileBatchWidget: + normalized_files = None if files is None else list(files) + return FileBatchWidget( + files=normalized_files, + label=label, + page_size=page_size, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def checklist( + self, + *, + widget_content: Sequence[Any], + label: str, + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> CheckListWidget: + return CheckListWidget( + widget_content=widget_content, + label=label, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def checktable( + self, + *, + checkboxes: Sequence[CheckboxContent[Any]], + label: str, + uncheck_command: str, + command: str | None = None, + additional_markup: MessageMarkup | None = None, + result_mode: WidgetResultMode | None = None, + ) -> ChecktableWidget: + return ChecktableWidget( + checkboxes=list(checkboxes), + label=label, + uncheck_command=uncheck_command, + message=self._context.message, + bot=self._context.bot, + command=self._resolve_command(command), + additional_markup=self._resolve_additional_markup(additional_markup), + result_mode=self._resolve_result_mode(result_mode), + ) + + def _resolve_command(self, command: str | None) -> str: + return command or self._context.command + + def _resolve_additional_markup( + self, + additional_markup: MessageMarkup | None, + ) -> MessageMarkup | None: + if additional_markup is not None: + return additional_markup + return self._context.additional_markup + + def _resolve_result_mode( + self, + result_mode: WidgetResultMode | None, + ) -> WidgetResultMode | None: + if result_mode is not None: + return result_mode + return self._context.result_mode diff --git a/pybotx/widgets/observability.py b/pybotx/widgets/observability.py new file mode 100644 index 00000000..a162db54 --- /dev/null +++ b/pybotx/widgets/observability.py @@ -0,0 +1,262 @@ +import importlib +from collections.abc import Sequence +from dataclasses import dataclass +from threading import Lock +from typing import Any, TypeAlias + +from pybotx.widgets.runner import ( + WidgetRunnerFinishedEvent, + WidgetRunnerObserver, + WidgetRunnerStartedEvent, +) + +RunOutcomeKey: TypeAlias = tuple[str, str, str, str] +ErrorKey: TypeAlias = tuple[str, str, str] +SkippedKey: TypeAlias = tuple[str, str, str] +ResultMessagesKey: TypeAlias = tuple[str, str, str] + + +class NoopWidgetRunnerMetricsCollector(WidgetRunnerObserver): + def on_started(self, event: WidgetRunnerStartedEvent) -> None: + return None + + def on_finished(self, event: WidgetRunnerFinishedEvent) -> None: + return None + + +@dataclass(frozen=True, slots=True) +class WidgetRunnerMetricsSnapshot: + in_flight: int + runs_total: int + errors_total: int + skipped_total: int + before_results_sent_total: int + after_results_sent_total: int + latency_sum_seconds: float + run_outcomes: dict[RunOutcomeKey, int] + errors: dict[ErrorKey, int] + skipped: dict[SkippedKey, int] + result_messages: dict[ResultMessagesKey, int] + + +class InMemoryWidgetRunnerMetricsCollector(WidgetRunnerObserver): + def __init__(self) -> None: + self._lock = Lock() + self._in_flight = 0 + self._runs_total = 0 + self._errors_total = 0 + self._skipped_total = 0 + self._before_results_sent_total = 0 + self._after_results_sent_total = 0 + self._latency_sum_seconds = 0.0 + self._run_outcomes: dict[RunOutcomeKey, int] = {} + self._errors: dict[ErrorKey, int] = {} + self._skipped: dict[SkippedKey, int] = {} + self._result_messages: dict[ResultMessagesKey, int] = {} + + def on_started(self, event: WidgetRunnerStartedEvent) -> None: + with self._lock: + self._in_flight += 1 + + def on_finished(self, event: WidgetRunnerFinishedEvent) -> None: + with self._lock: + self._in_flight = max(self._in_flight - 1, 0) + self._runs_total += 1 + self._latency_sum_seconds += max(event.duration_seconds, 0.0) + self._before_results_sent_total += max(event.before_results_sent, 0) + self._after_results_sent_total += max(event.after_results_sent, 0) + + outcome = "ok" if event.error is None else "error" + outcome_key = ( + event.widget_name, + event.command, + event.result_mode, + outcome, + ) + self._run_outcomes[outcome_key] = self._run_outcomes.get(outcome_key, 0) + 1 + + if event.before_results_sent > 0: + before_key = ( + event.widget_name, + event.command, + "before", + ) + self._result_messages[before_key] = ( + self._result_messages.get(before_key, 0) + event.before_results_sent + ) + + if event.after_results_sent > 0: + after_key = ( + event.widget_name, + event.command, + "after", + ) + self._result_messages[after_key] = ( + self._result_messages.get(after_key, 0) + event.after_results_sent + ) + + if event.skipped_by_before: + self._skipped_total += 1 + skipped_key = ( + event.widget_name, + event.command, + event.result_mode, + ) + self._skipped[skipped_key] = self._skipped.get(skipped_key, 0) + 1 + + if event.error is not None: + self._errors_total += 1 + error_key = ( + event.widget_name, + event.command, + type(event.error).__name__, + ) + self._errors[error_key] = self._errors.get(error_key, 0) + 1 + + def snapshot(self) -> WidgetRunnerMetricsSnapshot: + with self._lock: + return WidgetRunnerMetricsSnapshot( + in_flight=self._in_flight, + runs_total=self._runs_total, + errors_total=self._errors_total, + skipped_total=self._skipped_total, + before_results_sent_total=self._before_results_sent_total, + after_results_sent_total=self._after_results_sent_total, + latency_sum_seconds=self._latency_sum_seconds, + run_outcomes=dict(self._run_outcomes), + errors=dict(self._errors), + skipped=dict(self._skipped), + result_messages=dict(self._result_messages), + ) + + +class PrometheusWidgetRunnerMetricsCollector(WidgetRunnerObserver): + DEFAULT_LATENCY_BUCKETS = ( + 0.005, + 0.01, + 0.025, + 0.05, + 0.1, + 0.25, + 0.5, + 1.0, + 2.5, + 5.0, + 10.0, + ) + + def __init__( + self, + *, + registry: Any | None = None, + metric_prefix: str = "pybotx_widget", + latency_buckets: Sequence[float] | None = None, + ) -> None: + try: + prometheus_client = importlib.import_module("prometheus_client") + except ModuleNotFoundError as exc: + raise RuntimeError( + "PrometheusWidgetRunnerMetricsCollector requires `prometheus-client`. " + "Install with `uv add prometheus-client`.", + ) from exc + + counter_cls = getattr(prometheus_client, "Counter") + gauge_cls = getattr(prometheus_client, "Gauge") + histogram_cls = getattr(prometheus_client, "Histogram") + buckets = ( + tuple(latency_buckets) + if latency_buckets is not None + else self.DEFAULT_LATENCY_BUCKETS + ) + + self._runs_total = counter_cls( + f"{metric_prefix}_runs_total", + "Total number of widget runner executions.", + ("widget_name", "command", "result_mode", "outcome"), + registry=registry, + ) + self._errors_total = counter_cls( + f"{metric_prefix}_errors_total", + "Total number of failed widget runner executions.", + ("widget_name", "command", "error_type"), + registry=registry, + ) + self._skipped_total = counter_cls( + f"{metric_prefix}_skipped_total", + "Total number of widget runs skipped by before-hooks.", + ("widget_name", "command", "result_mode"), + registry=registry, + ) + self._result_messages_total = counter_cls( + f"{metric_prefix}_result_messages_total", + "Total number of result messages sent by widget runner hooks.", + ("widget_name", "command", "phase"), + registry=registry, + ) + self._latency_seconds = histogram_cls( + f"{metric_prefix}_latency_seconds", + "Widget runner latency in seconds.", + ("widget_name", "command", "result_mode", "outcome"), + buckets=buckets, + registry=registry, + ) + self._in_flight = gauge_cls( + f"{metric_prefix}_in_flight", + "Current number of widget runs in flight.", + ("widget_name", "command"), + registry=registry, + ) + + def on_started(self, event: WidgetRunnerStartedEvent) -> None: + self._in_flight.labels( + widget_name=event.widget_name, + command=event.command, + ).inc() + + def on_finished(self, event: WidgetRunnerFinishedEvent) -> None: + self._in_flight.labels( + widget_name=event.widget_name, + command=event.command, + ).dec() + + outcome = "ok" if event.error is None else "error" + self._runs_total.labels( + widget_name=event.widget_name, + command=event.command, + result_mode=event.result_mode, + outcome=outcome, + ).inc() + self._latency_seconds.labels( + widget_name=event.widget_name, + command=event.command, + result_mode=event.result_mode, + outcome=outcome, + ).observe(max(event.duration_seconds, 0.0)) + + if event.before_results_sent > 0: + self._result_messages_total.labels( + widget_name=event.widget_name, + command=event.command, + phase="before", + ).inc(event.before_results_sent) + + if event.after_results_sent > 0: + self._result_messages_total.labels( + widget_name=event.widget_name, + command=event.command, + phase="after", + ).inc(event.after_results_sent) + + if event.skipped_by_before: + self._skipped_total.labels( + widget_name=event.widget_name, + command=event.command, + result_mode=event.result_mode, + ).inc() + + if event.error is not None: + self._errors_total.labels( + widget_name=event.widget_name, + command=event.command, + error_type=type(event.error).__name__, + ).inc() diff --git a/pybotx/widgets/presets.py b/pybotx/widgets/presets.py new file mode 100644 index 00000000..7cb6ab4c --- /dev/null +++ b/pybotx/widgets/presets.py @@ -0,0 +1,99 @@ +from collections.abc import Iterable +from dataclasses import dataclass +from typing import Any, TypeVar + +from pybotx.widgets.base import Widget +from pybotx.widgets.observability import PrometheusWidgetRunnerMetricsCollector +from pybotx.widgets.runner import ( + LoggingWidgetRunnerObserver, + RunnerAfterHook, + RunnerBeforeHook, + WidgetRunnerConfig, + WidgetRunnerObserver, +) + +W = TypeVar("W", bound=Widget) + + +@dataclass(frozen=True, slots=True) +class WidgetRunnerObservabilityPreset: + observers: tuple[WidgetRunnerObserver, ...] + + def as_config(self) -> WidgetRunnerConfig: + return WidgetRunnerConfig(observers=self.observers) + + +@dataclass(frozen=True, slots=True) +class WidgetRunnerPreset: + config: WidgetRunnerConfig + + def as_config(self) -> WidgetRunnerConfig: + return self.config + + def as_runner_kwargs(self) -> dict[str, object]: + return {"config": self.config} + + def as_widget_command_kwargs(self) -> dict[str, object]: + return {"config": self.config} + + +def build_widget_runner_observability_preset( + *, + enable_logging_observer: bool = True, + enable_prometheus_metrics: bool = False, + log_start: bool = False, + registry: Any | None = None, + metric_prefix: str = "pybotx_widget", + latency_buckets: tuple[float, ...] | None = None, + observers: Iterable[WidgetRunnerObserver] = (), +) -> WidgetRunnerObservabilityPreset: + configured_observers = tuple(observers) + if enable_logging_observer: + configured_observers = ( + LoggingWidgetRunnerObserver(log_start=log_start), + *configured_observers, + ) + if enable_prometheus_metrics: + configured_observers = ( + *configured_observers, + PrometheusWidgetRunnerMetricsCollector( + registry=registry, + metric_prefix=metric_prefix, + latency_buckets=latency_buckets, + ), + ) + + if not configured_observers: + raise ValueError( + "At least one widget runner observer should be enabled", + ) + + return WidgetRunnerObservabilityPreset(observers=configured_observers) + + +def build_production_widget_runner_preset( + *, + before: RunnerBeforeHook[W] | None = None, + after: RunnerAfterHook[W] | None = None, + before_hooks: Iterable[RunnerBeforeHook[W]] = (), + after_hooks: Iterable[RunnerAfterHook[W]] = (), + observability_preset: WidgetRunnerObservabilityPreset | None = None, +) -> WidgetRunnerPreset: + config = WidgetRunnerConfig.from_hooks(before=before, after=after) + + for before_hook in before_hooks: + config = config.extend( + before=before_hook, + ) + + for after_hook in after_hooks: + config = config.extend( + after=after_hook, + ) + + if observability_preset is None: + observability_preset = build_widget_runner_observability_preset() + + config = config.extend(observers=observability_preset.observers) + + return WidgetRunnerPreset(config=config) diff --git a/tests/test_fastapi_adapter.py b/tests/test_fastapi_adapter.py new file mode 100644 index 00000000..b3761354 --- /dev/null +++ b/tests/test_fastapi_adapter.py @@ -0,0 +1,136 @@ +from types import SimpleNamespace + +import pytest +from fastapi import FastAPI +from fastapi.testclient import TestClient + +from pybotx import ( + Bot, + BotAccountWithSecret, + FastAPIBotAppConfig, + HandlerCollector, + create_fastapi_bot_app, + setup_fastapi_bot, +) + +prometheus_client = pytest.importorskip("prometheus_client") +CollectorRegistry = prometheus_client.CollectorRegistry + + +def test__create_fastapi_bot_app__wires_metrics_and_health_routes( + bot_account: BotAccountWithSecret, +) -> None: + bot = Bot( + collectors=[HandlerCollector()], + bot_accounts=[bot_account], + ) + registry = CollectorRegistry() + + app = create_fastapi_bot_app( + bot=bot, + config=FastAPIBotAppConfig( + verify_request=False, + metrics_path="/metrics", + ), + metrics_registry=registry, + ) + + with TestClient(app) as test_client: + health_response = test_client.get("/health/") + readiness_response = test_client.get("/health/ready") + metrics_response = test_client.get("/metrics") + + assert health_response.status_code == 200 + assert readiness_response.status_code == 200 + assert metrics_response.status_code == 200 + assert metrics_response.headers["content-type"].startswith("text/plain") + + +def test__create_fastapi_bot_app__stores_extra_app_state( + bot_account: BotAccountWithSecret, +) -> None: + container = SimpleNamespace(name="container") + bot = Bot( + collectors=[HandlerCollector()], + bot_accounts=[bot_account], + ) + + app = create_fastapi_bot_app( + bot=bot, + config=FastAPIBotAppConfig(verify_request=False), + app_state={"container": container}, + ) + + assert app.state.bot is bot + assert app.state.container is container + assert app.state.healthcheck is not None + + +def test__fastapi_bot_app_config__duplicate_path_rejected() -> None: + with pytest.raises(ValueError, match="Duplicate FastAPI route path"): + FastAPIBotAppConfig( + command_path="/command", + status_path="/command", + ) + + +def test__create_fastapi_bot_app__metrics_registry_required( + bot_account: BotAccountWithSecret, +) -> None: + bot = Bot( + collectors=[HandlerCollector()], + bot_accounts=[bot_account], + ) + + with pytest.raises(ValueError, match="metrics_registry"): + create_fastapi_bot_app( + bot=bot, + config=FastAPIBotAppConfig( + verify_request=False, + metrics_path="/metrics", + ), + ) + + +def test__create_fastapi_bot_app__reserved_app_state_keys_rejected( + bot_account: BotAccountWithSecret, +) -> None: + bot = Bot( + collectors=[HandlerCollector()], + bot_accounts=[bot_account], + ) + + with pytest.raises(ValueError, match="reserved state keys"): + create_fastapi_bot_app( + bot=bot, + config=FastAPIBotAppConfig(verify_request=False), + app_state={"bot": object()}, + ) + + +def test__setup_fastapi_bot__configures_existing_app( + bot_account: BotAccountWithSecret, +) -> None: + bot = Bot( + collectors=[HandlerCollector()], + bot_accounts=[bot_account], + ) + app = FastAPI() + + setup_fastapi_bot( + app, + bot=bot, + config=FastAPIBotAppConfig(verify_request=False, healthcheck_prefix=None), + ) + + with TestClient(app) as test_client: + response = test_client.get( + "/status", + params={ + "bot_id": str(bot_account.id), + "chat_type": "chat", + "user_huid": "f16cdc5f-6366-5552-9ecd-c36290ab3d11", + }, + ) + + assert response.status_code == 200 diff --git a/tests/test_presets.py b/tests/test_presets.py new file mode 100644 index 00000000..6015cc1c --- /dev/null +++ b/tests/test_presets.py @@ -0,0 +1,220 @@ +import importlib +from dataclasses import dataclass +from typing import Any + +import pytest + +from pybotx import ( + BotXOperation, + BotXRequestMetadata, + BotXRetryRequestPolicy, + build_production_bot_preset, + build_production_observability_preset, + build_production_retry_preset, +) + + +@dataclass +class _FakeStatus: + status_code: str + description: str | None = None + + +class _FakeStatusCode: + OK = "OK" + ERROR = "ERROR" + + +class _FakeSpanKind: + CLIENT = "CLIENT" + + +class _FakeSpan: + def __init__(self, name: str, kind: str | None = None) -> None: + self.name = name + self.kind = kind + + def set_attribute(self, _key: str, _value: object) -> None: + return None + + def add_event(self, _name: str, attributes: dict[str, object] | None = None) -> None: + return None + + def record_exception(self, _exc: Exception) -> None: + return None + + def set_status(self, _status: _FakeStatus) -> None: + return None + + def end(self) -> None: + return None + + +class _FakeTracer: + def start_span(self, name: str, kind: str | None = None) -> _FakeSpan: + return _FakeSpan(name, kind) + + +class _FakeTraceAPI: + Status = _FakeStatus + StatusCode = _FakeStatusCode + SpanKind = _FakeSpanKind + + def __init__(self) -> None: + self._tracer = _FakeTracer() + + def get_tracer(self, *_args: object, **_kwargs: object) -> _FakeTracer: + return self._tracer + + +def test__build_production_retry_preset__builds_retry_kwargs_and_safe_policy() -> None: + preset = build_production_retry_preset(max_attempts=5) + + kwargs = preset.as_bot_kwargs() + retry_request_policy = kwargs["retry_request_policy"] + assert hasattr(retry_request_policy, "should_retry") + assert kwargs["retry_policy"] == preset.retry_policy + assert preset.retry_policy.max_attempts == 5 + assert retry_request_policy.should_retry( + BotXRequestMetadata( + method="GET", + url="https://cts.example.com/api/v4/botx/chats/info", + ), + ) + assert retry_request_policy.should_retry( + BotXRequestMetadata( + method="POST", + url="https://cts.example.com/api/v4/botx/users/search", + operation_name=BotXOperation.SEARCH_USER_BY_EMAILS, + ), + ) + assert not retry_request_policy.should_retry( + BotXRequestMetadata( + method="POST", + url="https://cts.example.com/api/v4/botx/notifications/direct", + operation_name=BotXOperation.DIRECT_NOTIFICATION, + ), + ) + + +def test__build_production_retry_preset__supports_extra_safe_operations() -> None: + preset = build_production_retry_preset(extra_safe_operations={"CustomReadOnlyMethod"}) + + assert preset.retry_request_policy.should_retry( + BotXRequestMetadata( + method="POST", + url="https://cts.example.com/custom/read-only", + operation_name="CustomReadOnlyMethod", + ), + ) + + +def test__build_production_retry_preset__rejects_mixed_custom_request_policy_and_extras() -> None: + class _RetryAllPolicy(BotXRetryRequestPolicy): + def should_retry(self, metadata: Any) -> bool: + return True + + with pytest.raises(ValueError): + build_production_retry_preset( + retry_request_policy=_RetryAllPolicy(), + extra_safe_operations={"CustomReadOnlyMethod"}, + ) + + +def test__build_production_observability_preset__requires_at_least_one_backend() -> None: + with pytest.raises(ValueError): + build_production_observability_preset( + enable_prometheus_metrics=False, + enable_open_telemetry_tracing=False, + ) + + +def test__build_production_observability_preset__builds_prometheus_metrics_only() -> None: + prometheus_client = pytest.importorskip("prometheus_client") + registry = prometheus_client.CollectorRegistry() + + preset = build_production_observability_preset( + enable_open_telemetry_tracing=False, + registry=registry, + ) + + kwargs = preset.as_bot_kwargs() + assert "metrics_collector" in kwargs + assert "ingress_metrics_collector" in kwargs + assert "tracing_collector" not in kwargs + + +def test__build_production_observability_preset__builds_tracing_only( + monkeypatch: pytest.MonkeyPatch, +) -> None: + trace_api = _FakeTraceAPI() + original_import_module = importlib.import_module + + def import_module(name: str) -> object: + if name == "opentelemetry.trace": + return trace_api + return original_import_module(name) + + monkeypatch.setattr(importlib, "import_module", import_module) + + preset = build_production_observability_preset( + enable_prometheus_metrics=False, + tracer_name="tests.pybotx", + ) + + kwargs = preset.as_bot_kwargs() + assert "metrics_collector" not in kwargs + assert "ingress_metrics_collector" not in kwargs + assert "tracing_collector" in kwargs + + +def test__build_production_bot_preset__combines_retry_and_observability( + monkeypatch: pytest.MonkeyPatch, +) -> None: + prometheus_client = pytest.importorskip("prometheus_client") + trace_api = _FakeTraceAPI() + original_import_module = importlib.import_module + + def import_module(name: str) -> object: + if name == "opentelemetry.trace": + return trace_api + return original_import_module(name) + + monkeypatch.setattr(importlib, "import_module", import_module) + registry = prometheus_client.CollectorRegistry() + + preset = build_production_bot_preset( + retry_preset=build_production_retry_preset(), + observability_preset=build_production_observability_preset(registry=registry), + ) + + kwargs = preset.as_bot_kwargs() + assert "retry_policy" in kwargs + assert "retry_request_policy" in kwargs + assert "metrics_collector" in kwargs + assert "tracing_collector" in kwargs + assert "ingress_metrics_collector" in kwargs + + +def test__build_production_bot_preset__default_path( + monkeypatch: pytest.MonkeyPatch, +) -> None: + pytest.importorskip("prometheus_client") + trace_api = _FakeTraceAPI() + original_import_module = importlib.import_module + + def import_module(name: str) -> object: + if name == "opentelemetry.trace": + return trace_api + return original_import_module(name) + + monkeypatch.setattr(importlib, "import_module", import_module) + + preset = build_production_bot_preset() + + kwargs = preset.as_bot_kwargs() + assert "retry_policy" in kwargs + assert "retry_request_policy" in kwargs + assert "metrics_collector" in kwargs + assert "tracing_collector" in kwargs + assert "ingress_metrics_collector" in kwargs diff --git a/tests/test_scaffold.py b/tests/test_scaffold.py new file mode 100644 index 00000000..276732d2 --- /dev/null +++ b/tests/test_scaffold.py @@ -0,0 +1,1426 @@ +from pathlib import Path + +import pytest + +from pybotx.cli import main +from pybotx.scaffold import ( + CreateBotProjectOptions, + CreateCommandOptions, + CreateFSMFlowOptions, + CreatePortOptions, + CreateRepositoryOptions, + CreateServiceOptions, + CreateWidgetOptions, + CreateWidgetFlowOptions, + PROJECT_MANIFEST_FILENAME, + create_bot_project, + create_command_in_project, + create_fsm_flow_in_project, + create_port_in_project, + create_repository_in_project, + create_service_in_project, + create_widget_in_project, + create_widget_flow_in_project, +) + + +def _package_dir(root_dir: Path, package_name: str) -> Path: + return root_dir / "src" / package_name + + +def test__create_bot_project__creates_expected_file_tree(tmp_path: Path) -> None: + target_dir = tmp_path / "my-bot" + + result = create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + package_dir = _package_dir(target_dir, "my_bot") + + assert result.root_dir == target_dir + assert result.project_name == "my-bot" + assert result.package_name == "my_bot" + assert (target_dir / PROJECT_MANIFEST_FILENAME).is_file() + assert (target_dir / ".env.example").is_file() + assert (target_dir / ".gitignore").is_file() + assert (target_dir / "README.md").is_file() + assert (target_dir / "ARCHITECTURE.md").is_file() + assert (target_dir / "pyproject.toml").is_file() + assert (target_dir / "Dockerfile").is_file() + assert (target_dir / "docker-compose.yml").is_file() + assert (package_dir / "main.py").is_file() + assert (package_dir / "container.py").is_file() + assert (package_dir / "domain" / "__init__.py").is_file() + assert (package_dir / "domain" / "greeting_profile.py").is_file() + assert (package_dir / "domain" / "ports" / "__init__.py").is_file() + assert ( + package_dir / "domain" / "ports" / "greeting_profile_repository.py" + ).is_file() + assert (package_dir / "application" / "__init__.py").is_file() + assert (package_dir / "application" / "ports" / "__init__.py").is_file() + assert (package_dir / "application" / "services" / "__init__.py").is_file() + assert (package_dir / "application" / "services" / "greeting.py").is_file() + assert (package_dir / "infrastructure" / "__init__.py").is_file() + assert (package_dir / "infrastructure" / "config.py").is_file() + assert (package_dir / "infrastructure" / "repositories" / "__init__.py").is_file() + assert ( + package_dir + / "infrastructure" + / "repositories" + / "static_greeting_profile_repository.py" + ).is_file() + assert (package_dir / "presentation" / "__init__.py").is_file() + assert (package_dir / "presentation" / "api.py").is_file() + assert (package_dir / "presentation" / "bot.py").is_file() + assert (package_dir / "presentation" / "widget_support.py").is_file() + assert (package_dir / "presentation" / "commands" / "__init__.py").is_file() + assert (package_dir / "presentation" / "commands" / "common.py").is_file() + assert (target_dir / "tests" / "conftest.py").is_file() + assert (target_dir / "tests" / "test_architecture.py").is_file() + assert (target_dir / "tests" / "test_start_command.py").is_file() + + pyproject_content = (target_dir / "pyproject.toml").read_text(encoding="utf-8") + assert 'name = "my-bot"' in pyproject_content + assert '"pybotx==' in pyproject_content + assert '"dependency-injector>=4.48.1,<5"' in pyproject_content + assert '"opentelemetry-api>=1.38.0,<2"' in pyproject_content + + commands_init_content = ( + package_dir / "presentation" / "commands" / "__init__.py" + ).read_text(encoding="utf-8") + assert "# pybotx-scaffold command imports start" in commands_init_content + assert "# pybotx-scaffold command collectors start" in commands_init_content + + container_content = (package_dir / "container.py").read_text(encoding="utf-8") + assert "StaticGreetingProfileRepository" in container_content + assert "# pybotx-scaffold repository imports start" in container_content + assert "# pybotx-scaffold repository providers start" in container_content + assert "greeting_profile_repository = providers.Singleton(" in container_content + assert "greeting_profile_repository=greeting_profile_repository" in container_content + assert "# pybotx-scaffold service imports start" in container_content + assert "# pybotx-scaffold service providers start" in container_content + + greeting_service_content = ( + package_dir / "application" / "services" / "greeting.py" + ).read_text(encoding="utf-8") + assert "GreetingProfileRepository" in greeting_service_content + assert "self.greeting_profile_repository.get_profile()" in greeting_service_content + + greeting_repository_content = ( + package_dir / "domain" / "ports" / "greeting_profile_repository.py" + ).read_text(encoding="utf-8") + assert "class GreetingProfileRepository(Protocol):" in greeting_repository_content + + static_repository_content = ( + package_dir + / "infrastructure" + / "repositories" + / "static_greeting_profile_repository.py" + ).read_text(encoding="utf-8") + assert "class StaticGreetingProfileRepository:" in static_repository_content + assert "return GreetingProfile(" in static_repository_content + + main_content = (package_dir / "main.py").read_text(encoding="utf-8") + assert "from my_bot.presentation.api import create_app" in main_content + + api_content = (package_dir / "presentation" / "api.py").read_text( + encoding="utf-8", + ) + assert "create_fastapi_bot_app" in api_content + assert "FastAPIBotAppConfig(" in api_content + assert 'metrics_path="/metrics"' in api_content + + architecture_content = (target_dir / "ARCHITECTURE.md").read_text( + encoding="utf-8", + ) + assert "4-layer clean architecture" in architecture_content + assert "src/my_bot/container.py" in architecture_content + assert "presentation -> application -> domain" in architecture_content + assert "GreetingProfileRepository" in architecture_content + + conftest_content = (target_dir / "tests" / "conftest.py").read_text( + encoding="utf-8", + ) + assert "from my_bot.presentation.commands import collectors" in conftest_content + assert "from my_bot.container import ApplicationContainer" in conftest_content + assert "built_bot.send = AsyncMock" in conftest_content + assert "built_bot.edit_message = AsyncMock()" in conftest_content + + +def test__create_bot_project__supports_explicit_names_and_without_docker( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "generated" + + result = create_bot_project( + CreateBotProjectOptions( + target_dir=target_dir, + project_name="customer-bot", + package_name="customer_bot", + display_name="Customer Support Bot", + description="Customer support bot", + enable_otel_tracing=True, + include_docker=False, + ), + ) + + assert result.project_name == "customer-bot" + assert result.package_name == "customer_bot" + assert not (target_dir / "Dockerfile").exists() + assert not (target_dir / "docker-compose.yml").exists() + + env_content = (target_dir / ".env.example").read_text(encoding="utf-8") + assert 'BOT_DISPLAY_NAME="Customer Support Bot"' in env_content + assert 'BOT_ENABLE_OTEL_TRACING="true"' in env_content + + readme_content = (target_dir / "README.md").read_text(encoding="utf-8") + assert "# customer-bot" in readme_content + assert "ARCHITECTURE.md" in readme_content + assert "create port" in readme_content + assert "create repository" in readme_content + assert "create fsm-flow" not in readme_content + assert "create widget" in readme_content + + +def test__create_bot_project__creates_fsm_template(tmp_path: Path) -> None: + target_dir = tmp_path / "fsm-bot" + + result = create_bot_project( + CreateBotProjectOptions( + target_dir=target_dir, + template="production-fastapi-fsm", + ), + ) + package_dir = _package_dir(target_dir, "fsm_bot") + + assert result.template == "production-fastapi-fsm" + assert (target_dir / "ARCHITECTURE.md").is_file() + assert (package_dir / "presentation" / "fsm" / "__init__.py").is_file() + assert (package_dir / "presentation" / "fsm" / "login.py").is_file() + assert (package_dir / "infrastructure" / "fsm_state_repo.py").is_file() + assert ( + package_dir / "infrastructure" / "repositories" / "static_greeting_profile_repository.py" + ).is_file() + assert ( + package_dir / "domain" / "ports" / "greeting_profile_repository.py" + ).is_file() + assert (package_dir / "application" / "services" / "auth.py").is_file() + assert (package_dir / "presentation" / "widget_support.py").is_file() + + pyproject_content = (target_dir / "pyproject.toml").read_text(encoding="utf-8") + assert '"pybotx-fsm>=0.6.1,<0.7"' in pyproject_content + assert '"redis>=5.0.0,<6"' in pyproject_content + + env_content = (target_dir / ".env.example").read_text(encoding="utf-8") + assert 'BOT_FSM_REDIS_URL="redis://localhost:6379/0"' in env_content + + bot_content = (package_dir / "presentation" / "bot.py").read_text(encoding="utf-8") + assert "FSMMiddleware" in bot_content + assert 'state_repo_key="fsm_state_repo"' in bot_content + assert "# pybotx-scaffold fsm imports start" in bot_content + assert "# pybotx-scaffold fsm collectors start" in bot_content + + container_content = (package_dir / "container.py").read_text(encoding="utf-8") + assert "StaticGreetingProfileRepository" in container_content + assert "# pybotx-scaffold repository imports start" in container_content + assert "# pybotx-scaffold repository providers start" in container_content + assert "greeting_profile_repository = providers.Singleton(" in container_content + + api_content = (package_dir / "presentation" / "api.py").read_text( + encoding="utf-8", + ) + assert "fsm_redis" in api_content + assert "ReadinessCheck(" in api_content + + conftest_content = (target_dir / "tests" / "conftest.py").read_text( + encoding="utf-8", + ) + assert "from fsm_bot.presentation.commands import collectors" in conftest_content + assert "from fsm_bot.presentation.fsm.login import fsm as login_fsm" in ( + conftest_content + ) + assert "# pybotx-scaffold fsm imports start" in conftest_content + assert "# pybotx-scaffold fsm collectors start" in conftest_content + assert "built_bot.send = AsyncMock" in conftest_content + assert "built_bot.edit_message = AsyncMock()" in conftest_content + + readme_content = (target_dir / "README.md").read_text(encoding="utf-8") + assert "create port" in readme_content + assert "create repository" in readme_content + assert "create widget" in readme_content + assert "create fsm-flow" in readme_content + + +def test__create_command_in_project__creates_expected_artifacts( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + package_dir = _package_dir(target_dir, "my_bot") + + result = create_command_in_project( + CreateCommandOptions( + command_name="ping-users", + project_dir=target_dir, + ), + ) + + assert result.command_path == "/ping-users" + assert (package_dir / "presentation" / "commands" / "ping_users.py").is_file() + assert (package_dir / "application" / "services" / "ping_users.py").is_file() + assert (target_dir / "tests" / "test_ping_users.py").is_file() + + commands_init_content = ( + package_dir / "presentation" / "commands" / "__init__.py" + ).read_text(encoding="utf-8") + assert ( + "from my_bot.presentation.commands.ping_users import collector as ping_users_collector" + in commands_init_content + ) + assert "ping_users_collector," in commands_init_content + + container_content = (package_dir / "container.py").read_text(encoding="utf-8") + assert ( + "from my_bot.application.services.ping_users import PingUsersService" + in container_content + ) + assert "ping_users_service = providers.Factory(PingUsersService)" in container_content + + command_content = ( + package_dir / "presentation" / "commands" / "ping_users.py" + ).read_text(encoding="utf-8") + assert "@collector.command(" in command_content + assert "/ping-users" in command_content + assert "ping_users_service()" in command_content + assert "from my_bot.container import ApplicationContainer" in command_content + + +def test__create_command_in_project__works_for_fsm_template(tmp_path: Path) -> None: + target_dir = tmp_path / "fsm-bot" + create_bot_project( + CreateBotProjectOptions( + target_dir=target_dir, + template="production-fastapi-fsm", + ), + ) + package_dir = _package_dir(target_dir, "fsm_bot") + + result = create_command_in_project( + CreateCommandOptions(command_name="/ping-users", project_dir=target_dir), + ) + + assert result.command_path == "/ping-users" + + commands_init_content = ( + package_dir / "presentation" / "commands" / "__init__.py" + ).read_text(encoding="utf-8") + assert "login_fsm" in commands_init_content + assert "ping_users_collector" in commands_init_content + + +def test__create_command_in_project__rejects_duplicate_command( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + create_command_in_project( + CreateCommandOptions(command_name="ping-users", project_dir=target_dir), + ) + + with pytest.raises(FileExistsError): + create_command_in_project( + CreateCommandOptions(command_name="ping-users", project_dir=target_dir), + ) + + +def test__create_service_in_project__creates_expected_artifacts( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + package_dir = _package_dir(target_dir, "my_bot") + + result = create_service_in_project( + CreateServiceOptions( + service_name="sync-users", + project_dir=target_dir, + ), + ) + + assert result.service_name == "sync_users" + assert (package_dir / "application" / "services" / "sync_users.py").is_file() + assert (target_dir / "tests" / "test_sync_users_service.py").is_file() + + container_content = (package_dir / "container.py").read_text(encoding="utf-8") + assert ( + "from my_bot.application.services.sync_users import SyncUsersService" + in container_content + ) + assert "sync_users_service = providers.Factory(SyncUsersService)" in container_content + + service_content = ( + package_dir / "application" / "services" / "sync_users.py" + ).read_text(encoding="utf-8") + assert "class SyncUsersService:" in service_content + assert "return 'Implement sync-users service.'" in service_content + + test_content = (target_dir / "tests" / "test_sync_users_service.py").read_text( + encoding="utf-8", + ) + assert "from my_bot.application.services.sync_users import SyncUsersService" in test_content + assert "assert service.handle() == 'Implement sync-users service.'" in test_content + + +def test__create_service_in_project__rejects_duplicate_service( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + create_service_in_project( + CreateServiceOptions(service_name="sync-users", project_dir=target_dir), + ) + + with pytest.raises(FileExistsError): + create_service_in_project( + CreateServiceOptions(service_name="sync-users", project_dir=target_dir), + ) + + +def test__create_port_in_project__creates_expected_artifacts( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + package_dir = _package_dir(target_dir, "my_bot") + + result = create_port_in_project( + CreatePortOptions( + port_name="billing-gateway", + project_dir=target_dir, + ), + ) + + assert result.port_name == "billing_gateway" + assert (package_dir / "domain" / "ports" / "billing_gateway.py").is_file() + + port_content = ( + package_dir / "domain" / "ports" / "billing_gateway.py" + ).read_text(encoding="utf-8") + assert "class BillingGatewayPort(Protocol):" in port_content + assert "Domain port for `billing-gateway`." in port_content + + +def test__create_port_in_project__rejects_duplicate_port( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + create_port_in_project( + CreatePortOptions(port_name="billing-gateway", project_dir=target_dir), + ) + + with pytest.raises(FileExistsError): + create_port_in_project( + CreatePortOptions(port_name="billing-gateway", project_dir=target_dir), + ) + + +def test__create_repository_in_project__creates_expected_artifacts( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + package_dir = _package_dir(target_dir, "my_bot") + + result = create_repository_in_project( + CreateRepositoryOptions( + repository_name="user-profile", + project_dir=target_dir, + ), + ) + + assert result.repository_name == "user_profile_repository" + assert result.port_name == "user_profile_repository" + assert ( + package_dir / "domain" / "ports" / "user_profile_repository.py" + ).is_file() + assert ( + package_dir + / "infrastructure" + / "repositories" + / "stub_user_profile_repository.py" + ).is_file() + assert (target_dir / "tests" / "test_user_profile_repository.py").is_file() + + container_content = (package_dir / "container.py").read_text(encoding="utf-8") + assert ( + "from my_bot.infrastructure.repositories.stub_user_profile_repository " + "import StubUserProfileRepository" + ) in container_content + assert ( + "user_profile_repository = providers.Singleton(StubUserProfileRepository)" + in container_content + ) + + port_content = ( + package_dir / "domain" / "ports" / "user_profile_repository.py" + ).read_text(encoding="utf-8") + assert "class UserProfileRepository(Protocol):" in port_content + + repository_content = ( + package_dir + / "infrastructure" + / "repositories" + / "stub_user_profile_repository.py" + ).read_text(encoding="utf-8") + assert "class StubUserProfileRepository:" in repository_content + + test_content = (target_dir / "tests" / "test_user_profile_repository.py").read_text( + encoding="utf-8", + ) + assert "container.user_profile_repository()" in test_content + assert "isinstance(repository, StubUserProfileRepository)" in test_content + + +def test__create_repository_in_project__binds_to_existing_port( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + package_dir = _package_dir(target_dir, "my_bot") + create_port_in_project( + CreatePortOptions( + port_name="billing-gateway", + project_dir=target_dir, + ), + ) + + result = create_repository_in_project( + CreateRepositoryOptions( + repository_name="stripe-billing-gateway", + port_name="billing-gateway", + project_dir=target_dir, + ), + ) + + assert result.repository_name == "stripe_billing_gateway_repository" + assert result.port_name == "billing_gateway" + assert ( + package_dir + / "infrastructure" + / "repositories" + / "stub_stripe_billing_gateway_repository.py" + ).is_file() + assert not ( + package_dir / "domain" / "ports" / "stripe_billing_gateway_repository.py" + ).exists() + assert (target_dir / "tests" / "test_stripe_billing_gateway_repository.py").is_file() + + container_content = (package_dir / "container.py").read_text(encoding="utf-8") + assert ( + "from my_bot.infrastructure.repositories.stub_stripe_billing_gateway_repository " + "import StubStripeBillingGatewayRepository" + ) in container_content + assert ( + "billing_gateway = providers.Singleton(StubStripeBillingGatewayRepository)" + in container_content + ) + + repository_content = ( + package_dir + / "infrastructure" + / "repositories" + / "stub_stripe_billing_gateway_repository.py" + ).read_text(encoding="utf-8") + assert "the `BillingGatewayPort` port" in repository_content + + +def test__create_repository_in_project__rejects_missing_port( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + + with pytest.raises(FileNotFoundError): + create_repository_in_project( + CreateRepositoryOptions( + repository_name="stripe-billing-gateway", + port_name="billing-gateway", + project_dir=target_dir, + ), + ) + + +def test__create_repository_in_project__rejects_duplicate_repository( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + create_repository_in_project( + CreateRepositoryOptions(repository_name="user-profile", project_dir=target_dir), + ) + + with pytest.raises(FileExistsError): + create_repository_in_project( + CreateRepositoryOptions(repository_name="user-profile", project_dir=target_dir), + ) + + +def test__create_fsm_flow_in_project__creates_expected_artifacts( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "fsm-bot" + create_bot_project( + CreateBotProjectOptions( + target_dir=target_dir, + template="production-fastapi-fsm", + ), + ) + package_dir = _package_dir(target_dir, "fsm_bot") + + result = create_fsm_flow_in_project( + CreateFSMFlowOptions(flow_name="approval-step", project_dir=target_dir), + ) + + assert result.flow_name == "approval-step" + assert result.command_path == "/approval-step" + assert (package_dir / "presentation" / "fsm" / "approval_step.py").is_file() + assert (package_dir / "presentation" / "commands" / "approval_step.py").is_file() + assert (target_dir / "tests" / "test_approval_step_fsm.py").is_file() + + flow_content = ( + package_dir / "presentation" / "fsm" / "approval_step.py" + ).read_text(encoding="utf-8") + assert "class ApprovalStepStates(Enum):" in flow_content + assert "start_approval_step_flow" in flow_content + + command_content = ( + package_dir / "presentation" / "commands" / "approval_step.py" + ).read_text(encoding="utf-8") + assert ( + "from fsm_bot.presentation.fsm.approval_step import start_approval_step_flow" + in command_content + ) + assert "/approval-step" in command_content + + commands_init_content = ( + package_dir / "presentation" / "commands" / "__init__.py" + ).read_text(encoding="utf-8") + assert ( + "from fsm_bot.presentation.commands.approval_step import collector as approval_step_collector" + in commands_init_content + ) + assert "approval_step_collector," in commands_init_content + + bot_content = (package_dir / "presentation" / "bot.py").read_text(encoding="utf-8") + assert ( + "from fsm_bot.presentation.fsm.approval_step import fsm as approval_step_fsm" + in bot_content + ) + assert "approval_step_fsm," in bot_content + + conftest_content = (target_dir / "tests" / "conftest.py").read_text( + encoding="utf-8", + ) + assert ( + "from fsm_bot.presentation.fsm.approval_step import fsm as approval_step_fsm" + in conftest_content + ) + assert "approval_step_fsm," in conftest_content + + +def test__create_fsm_flow_in_project__upgrades_legacy_fsm_scaffold( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "fsm-bot" + create_bot_project( + CreateBotProjectOptions( + target_dir=target_dir, + template="production-fastapi-fsm", + ), + ) + + bot_path = target_dir / "src" / "fsm_bot" / "presentation" / "bot.py" + bot_path.write_text( + bot_path.read_text(encoding="utf-8") + .replace( + "\n# pybotx-scaffold fsm imports start\n# pybotx-scaffold fsm imports end", + "", + ) + .replace( + "\n".join( + [ + " middlewares=[", + " FSMMiddleware(", + " [", + " login_fsm,", + " # pybotx-scaffold fsm collectors start", + " # pybotx-scaffold fsm collectors end", + " ],", + ' state_repo_key="fsm_state_repo",', + " ),", + " ],", + ], + ), + ' middlewares=[FSMMiddleware([login_fsm], state_repo_key="fsm_state_repo")],', + ), + encoding="utf-8", + ) + + conftest_path = target_dir / "tests" / "conftest.py" + conftest_path.write_text( + conftest_path.read_text(encoding="utf-8") + .replace( + "\n# pybotx-scaffold fsm imports start\n# pybotx-scaffold fsm imports end", + "", + ) + .replace( + "\n".join( + [ + " middlewares=[", + " FSMMiddleware(", + " [", + " login_fsm,", + " # pybotx-scaffold fsm collectors start", + " # pybotx-scaffold fsm collectors end", + " ],", + ' state_repo_key="fsm_state_repo",', + " ),", + " ],", + ], + ), + ' middlewares=[FSMMiddleware([login_fsm], state_repo_key="fsm_state_repo")],', + ), + encoding="utf-8", + ) + + create_fsm_flow_in_project( + CreateFSMFlowOptions(flow_name="legacy-flow", project_dir=target_dir), + ) + + upgraded_bot_content = bot_path.read_text(encoding="utf-8") + assert "# pybotx-scaffold fsm imports start" in upgraded_bot_content + assert "legacy_flow_fsm," in upgraded_bot_content + + upgraded_conftest_content = conftest_path.read_text(encoding="utf-8") + assert "# pybotx-scaffold fsm collectors start" in upgraded_conftest_content + assert "legacy_flow_fsm," in upgraded_conftest_content + + +def test__create_fsm_flow_in_project__rejects_non_fsm_template( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + + with pytest.raises(ValueError, match="production-fastapi-fsm"): + create_fsm_flow_in_project( + CreateFSMFlowOptions(flow_name="approval", project_dir=target_dir), + ) + + +def test__create_widget_in_project__creates_confirm_widget_artifacts( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + package_dir = _package_dir(target_dir, "my_bot") + + result = create_widget_in_project( + CreateWidgetOptions( + widget_name="deployment-approval", + project_dir=target_dir, + kind="confirm", + ), + ) + + assert result.widget_name == "deployment-approval" + assert result.kind == "confirm" + assert result.command_path == "/deployment-approval" + assert (package_dir / "presentation" / "commands" / "deployment_approval.py").is_file() + assert (package_dir / "application" / "services" / "deployment_approval.py").is_file() + assert (target_dir / "tests" / "test_deployment_approval_widget.py").is_file() + + command_content = ( + package_dir / "presentation" / "commands" / "deployment_approval.py" + ).read_text(encoding="utf-8") + assert "build_widget_factory" in command_content + assert "build_widget_runner_config" in command_content + assert "return widgets.confirm(" in command_content + assert "from my_bot.presentation.widget_support import (" in command_content + + service_content = ( + package_dir / "application" / "services" / "deployment_approval.py" + ).read_text(encoding="utf-8") + assert "class DeploymentApprovalWidgetService:" in service_content + assert "Confirm deployment approval?" in service_content + + commands_init_content = ( + package_dir / "presentation" / "commands" / "__init__.py" + ).read_text(encoding="utf-8") + assert ( + "from my_bot.presentation.commands.deployment_approval import collector as deployment_approval_collector" + in commands_init_content + ) + assert "deployment_approval_collector," in commands_init_content + + container_content = (package_dir / "container.py").read_text(encoding="utf-8") + assert ( + "from my_bot.application.services.deployment_approval import DeploymentApprovalWidgetService" + in container_content + ) + assert ( + "deployment_approval_widget_service = providers.Factory(DeploymentApprovalWidgetService)" + in container_content + ) + + +def test__create_widget_in_project__supports_select_widget_for_fsm_template( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "fsm-bot" + create_bot_project( + CreateBotProjectOptions( + target_dir=target_dir, + template="production-fastapi-fsm", + ), + ) + package_dir = _package_dir(target_dir, "fsm_bot") + + result = create_widget_in_project( + CreateWidgetOptions( + widget_name="environment-picker", + project_dir=target_dir, + kind="select", + ), + ) + + assert result.kind == "select" + command_content = ( + package_dir / "presentation" / "commands" / "environment_picker.py" + ).read_text(encoding="utf-8") + assert "return widgets.select(" in command_content + assert "SELECT_VALUE_KEY" in command_content + + test_content = (target_dir / "tests" / "test_environment_picker_widget.py").read_text( + encoding="utf-8", + ) + assert 'message.data = {SELECT_VALUE_KEY: "prod"}' in test_content + + +def test__create_widget_in_project__supports_search_select_widget( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + package_dir = _package_dir(target_dir, "my_bot") + + result = create_widget_in_project( + CreateWidgetOptions( + widget_name="service-picker", + project_dir=target_dir, + kind="search-select", + ), + ) + + assert result.kind == "search-select" + command_content = ( + package_dir / "presentation" / "commands" / "service_picker.py" + ).read_text(encoding="utf-8") + assert "SearchSelectWidget" in command_content + assert "return widgets.search_select(" in command_content + + test_content = (target_dir / "tests" / "test_service_picker_widget.py").read_text( + encoding="utf-8", + ) + assert 'message.data = {SELECT_VALUE_KEY: "prod"}' in test_content + + +def test__create_widget_in_project__supports_multi_select_widget( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + package_dir = _package_dir(target_dir, "my_bot") + + result = create_widget_in_project( + CreateWidgetOptions( + widget_name="environment-batch", + project_dir=target_dir, + kind="multi-select", + ), + ) + + assert result.kind == "multi-select" + command_content = ( + package_dir / "presentation" / "commands" / "environment_batch.py" + ).read_text(encoding="utf-8") + assert "MultiSelectWidget" in command_content + assert "RunnerHookResult" in command_content + assert "return widgets.multi_select(" in command_content + + service_content = ( + package_dir / "application" / "services" / "environment_batch.py" + ).read_text(encoding="utf-8") + assert "def max_selected(self) -> int:" in service_content + assert "def is_selection_complete(self, values: list[str]) -> bool:" in ( + service_content + ) + + test_content = (target_dir / "tests" / "test_environment_batch_widget.py").read_text( + encoding="utf-8", + ) + assert "MULTI_SELECTED_VALUES_KEY" in test_content + assert 'message.data = {MULTI_SELECT_VALUE_KEY: "prod"}' in test_content + + +def test__create_widget_in_project__supports_date_range_widget( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + package_dir = _package_dir(target_dir, "my_bot") + + result = create_widget_in_project( + CreateWidgetOptions( + widget_name="deployment-window", + project_dir=target_dir, + kind="date-range", + ), + ) + + assert result.kind == "date-range" + command_content = ( + package_dir / "presentation" / "commands" / "deployment_window.py" + ).read_text(encoding="utf-8") + assert "DateRangeWidget" in command_content + assert "DATE_RANGE_SELECTED_DATE_KEY" in command_content + assert "return widgets.date_range(" in command_content + + service_content = ( + package_dir / "application" / "services" / "deployment_window.py" + ).read_text(encoding="utf-8") + assert "from datetime import date" in service_content + assert "def build_selection_result(self, start_date: date, end_date: date) -> str:" in ( + service_content + ) + + test_content = (target_dir / "tests" / "test_deployment_window_widget.py").read_text( + encoding="utf-8", + ) + assert "DATE_RANGE_START_KEY" in test_content + assert 'message.data = {DATE_RANGE_SELECTED_DATE_KEY: "2026-03-08"}' in test_content + + +def test__create_widget_in_project__creates_widget_support_for_legacy_scaffold( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + + widget_support_path = ( + target_dir / "src" / "my_bot" / "presentation" / "widget_support.py" + ) + widget_support_path.unlink() + + conftest_path = target_dir / "tests" / "conftest.py" + conftest_path.write_text( + conftest_path.read_text(encoding="utf-8") + .replace( + ' built_bot.send = AsyncMock(return_value=uuid4()) # type: ignore[method-assign]\n', + "", + ) + .replace( + " built_bot.edit_message = AsyncMock() # type: ignore[method-assign]\n", + "", + ), + encoding="utf-8", + ) + + result = create_widget_in_project( + CreateWidgetOptions( + widget_name="legacy-widget", + project_dir=target_dir, + kind="approval", + ), + ) + + assert widget_support_path in result.created_files + assert widget_support_path.is_file() + + upgraded_conftest_content = conftest_path.read_text(encoding="utf-8") + assert "built_bot.send = AsyncMock" in upgraded_conftest_content + assert "built_bot.edit_message = AsyncMock()" in upgraded_conftest_content + + +def test__create_widget_flow_in_project__creates_confirm_flow_artifacts( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + package_dir = _package_dir(target_dir, "my_bot") + + result = create_widget_flow_in_project( + CreateWidgetFlowOptions( + flow_name="deployment-approval", + project_dir=target_dir, + kind="confirm", + ), + ) + + assert result.flow_name == "deployment-approval" + assert result.kind == "confirm" + assert result.command_path == "/deployment-approval" + assert (package_dir / "presentation" / "commands" / "deployment_approval.py").is_file() + assert ( + package_dir / "application" / "services" / "deployment_approval_widget.py" + ).is_file() + assert ( + package_dir / "application" / "services" / "deployment_approval_result.py" + ).is_file() + assert (target_dir / "tests" / "test_deployment_approval_widget_flow.py").is_file() + + command_content = ( + package_dir / "presentation" / "commands" / "deployment_approval.py" + ).read_text(encoding="utf-8") + assert "deployment_approval_widget_service()" in command_content + assert "deployment_approval_result_service()" in command_content + assert "return widgets.confirm(" in command_content + + container_content = (package_dir / "container.py").read_text(encoding="utf-8") + assert ( + "from my_bot.application.services.deployment_approval_widget import DeploymentApprovalWidgetService" + in container_content + ) + assert ( + "from my_bot.application.services.deployment_approval_result import DeploymentApprovalResultService" + in container_content + ) + assert ( + "deployment_approval_widget_service = providers.Factory(DeploymentApprovalWidgetService)" + in container_content + ) + assert ( + "deployment_approval_result_service = providers.Factory(DeploymentApprovalResultService)" + in container_content + ) + + +def test__create_widget_flow_in_project__supports_multi_select_flow( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + package_dir = _package_dir(target_dir, "my_bot") + + result = create_widget_flow_in_project( + CreateWidgetFlowOptions( + flow_name="environment-batch", + project_dir=target_dir, + kind="multi-select", + ), + ) + + assert result.kind == "multi-select" + command_content = ( + package_dir / "presentation" / "commands" / "environment_batch.py" + ).read_text(encoding="utf-8") + assert "RunnerHookResult" in command_content + assert "container.environment_batch_result_service().handle_selection" in command_content + assert "return widgets.multi_select(" in command_content + + widget_service_content = ( + package_dir / "application" / "services" / "environment_batch_widget.py" + ).read_text(encoding="utf-8") + assert "def max_selected(self) -> int:" in widget_service_content + + result_service_content = ( + package_dir / "application" / "services" / "environment_batch_result.py" + ).read_text(encoding="utf-8") + assert "def handle_selection(self, values: list[str]) -> str:" in ( + result_service_content + ) + + +def test__create_widget_flow_in_project__supports_date_range_flow( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + package_dir = _package_dir(target_dir, "my_bot") + + result = create_widget_flow_in_project( + CreateWidgetFlowOptions( + flow_name="deployment-window", + project_dir=target_dir, + kind="date-range", + ), + ) + + assert result.kind == "date-range" + command_content = ( + package_dir / "presentation" / "commands" / "deployment_window.py" + ).read_text(encoding="utf-8") + assert "DateRangeWidget" in command_content + assert "DATE_RANGE_SELECTED_DATE_KEY" in command_content + assert ".handle_selection(widget.start, widget.end)" in command_content + + result_service_content = ( + package_dir / "application" / "services" / "deployment_window_result.py" + ).read_text(encoding="utf-8") + assert "from datetime import date" in result_service_content + assert "def handle_selection(self, start_date: date, end_date: date) -> str:" in ( + result_service_content + ) + + +def test__create_widget_in_project__rejects_duplicate_widget( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + create_widget_in_project( + CreateWidgetOptions( + widget_name="deployment-approval", + project_dir=target_dir, + ), + ) + + with pytest.raises(FileExistsError): + create_widget_in_project( + CreateWidgetOptions( + widget_name="deployment-approval", + project_dir=target_dir, + ), + ) + + +def test__create_widget_flow_in_project__rejects_duplicate_flow( + tmp_path: Path, +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + create_widget_flow_in_project( + CreateWidgetFlowOptions( + flow_name="deployment-approval", + project_dir=target_dir, + ), + ) + + with pytest.raises(FileExistsError): + create_widget_flow_in_project( + CreateWidgetFlowOptions( + flow_name="deployment-approval", + project_dir=target_dir, + ), + ) + + +def test__create_bot_project__rejects_non_empty_dir(tmp_path: Path) -> None: + target_dir = tmp_path / "busy" + target_dir.mkdir() + (target_dir / "already.txt").write_text("occupied", encoding="utf-8") + + with pytest.raises(FileExistsError): + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + + +def test__create_bot_project__rejects_invalid_package_name(tmp_path: Path) -> None: + with pytest.raises(ValueError, match="should not start with a digit"): + create_bot_project( + CreateBotProjectOptions( + target_dir=tmp_path / "bot", + package_name="123bot", + ), + ) + + +def test__cli_main__creates_project_in_current_directory_by_default( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], + monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.chdir(tmp_path) + + exit_code = main(["create", "bot"]) + + assert exit_code == 0 + assert (tmp_path / "pyproject.toml").is_file() + assert (tmp_path / "README.md").is_file() + generated_packages = [path for path in (tmp_path / "src").iterdir() if path.is_dir()] + assert len(generated_packages) == 1 + + stdout = capsys.readouterr().out + assert "Created pybotx bot project" in stdout + + +def test__cli_main__creates_command_in_generated_project( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + + exit_code = main( + [ + "create", + "command", + "ping-users", + "--project-dir", + str(target_dir), + ], + ) + + assert exit_code == 0 + assert ( + target_dir / "src" / "my_bot" / "presentation" / "commands" / "ping_users.py" + ).is_file() + stdout = capsys.readouterr().out + assert "Created command /ping-users" in stdout + + +def test__cli_main__creates_port_in_generated_project( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + + exit_code = main( + [ + "create", + "port", + "billing-gateway", + "--project-dir", + str(target_dir), + ], + ) + + assert exit_code == 0 + assert ( + target_dir / "src" / "my_bot" / "domain" / "ports" / "billing_gateway.py" + ).is_file() + stdout = capsys.readouterr().out + assert "Created port billing_gateway" in stdout + + +def test__cli_main__creates_repository_in_generated_project( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + + exit_code = main( + [ + "create", + "repository", + "user-profile", + "--project-dir", + str(target_dir), + ], + ) + + assert exit_code == 0 + assert ( + target_dir / "src" / "my_bot" / "domain" / "ports" / "user_profile_repository.py" + ).is_file() + stdout = capsys.readouterr().out + assert "Created repository user_profile_repository bound to port user_profile_repository" in stdout + + +def test__cli_main__creates_repository_bound_to_existing_port( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + create_port_in_project( + CreatePortOptions( + port_name="billing-gateway", + project_dir=target_dir, + ), + ) + + exit_code = main( + [ + "create", + "repository", + "stripe-billing-gateway", + "--port", + "billing-gateway", + "--project-dir", + str(target_dir), + ], + ) + + assert exit_code == 0 + assert ( + target_dir + / "src" + / "my_bot" + / "infrastructure" + / "repositories" + / "stub_stripe_billing_gateway_repository.py" + ).is_file() + stdout = capsys.readouterr().out + assert ( + "Created repository stripe_billing_gateway_repository bound to port billing_gateway" + in stdout + ) + + +def test__cli_main__creates_service_in_generated_project( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + + exit_code = main( + [ + "create", + "service", + "sync-users", + "--project-dir", + str(target_dir), + ], + ) + + assert exit_code == 0 + assert ( + target_dir / "src" / "my_bot" / "application" / "services" / "sync_users.py" + ).is_file() + stdout = capsys.readouterr().out + assert "Created application service sync_users" in stdout + + +def test__cli_main__creates_service_via_use_case_alias( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + + exit_code = main( + [ + "create", + "use-case", + "sync-users", + "--project-dir", + str(target_dir), + ], + ) + + assert exit_code == 0 + assert ( + target_dir / "src" / "my_bot" / "application" / "services" / "sync_users.py" + ).is_file() + stdout = capsys.readouterr().out + assert "Created application service sync_users" in stdout + + +def test__cli_main__creates_fsm_flow_in_generated_project( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], +) -> None: + target_dir = tmp_path / "fsm-bot" + create_bot_project( + CreateBotProjectOptions( + target_dir=target_dir, + template="production-fastapi-fsm", + ), + ) + + exit_code = main( + [ + "create", + "fsm-flow", + "approval", + "--project-dir", + str(target_dir), + ], + ) + + assert exit_code == 0 + assert ( + target_dir / "src" / "fsm_bot" / "presentation" / "fsm" / "approval.py" + ).is_file() + stdout = capsys.readouterr().out + assert "Created FSM flow approval" in stdout + + +def test__cli_main__creates_widget_in_generated_project( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + + exit_code = main( + [ + "create", + "widget", + "deployment-approval", + "--project-dir", + str(target_dir), + "--kind", + "confirm", + ], + ) + + assert exit_code == 0 + assert ( + target_dir + / "src" + / "my_bot" + / "presentation" + / "commands" + / "deployment_approval.py" + ).is_file() + stdout = capsys.readouterr().out + assert "Created confirm widget deployment-approval" in stdout + + +def test__cli_main__creates_widget_flow_in_generated_project( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], +) -> None: + target_dir = tmp_path / "my-bot" + create_bot_project(CreateBotProjectOptions(target_dir=target_dir)) + + exit_code = main( + [ + "create", + "widget-flow", + "deployment-approval", + "--project-dir", + str(target_dir), + "--kind", + "confirm", + ], + ) + + assert exit_code == 0 + assert ( + target_dir + / "src" + / "my_bot" + / "application" + / "services" + / "deployment_approval_result.py" + ).is_file() + stdout = capsys.readouterr().out + assert "Created confirm widget flow deployment-approval" in stdout + + +def test__cli_main__returns_error_for_non_empty_current_directory( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], + monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.chdir(tmp_path) + (tmp_path / "existing.txt").write_text("busy", encoding="utf-8") + + exit_code = main(["create", "bot"]) + + assert exit_code == 1 + stderr = capsys.readouterr().err + assert "isn't empty" in stderr diff --git a/tests/widgets/test_factory.py b/tests/widgets/test_factory.py new file mode 100644 index 00000000..42f2414f --- /dev/null +++ b/tests/widgets/test_factory.py @@ -0,0 +1,669 @@ +from types import SimpleNamespace +from typing import Any, cast +from unittest.mock import AsyncMock +from uuid import uuid4 +from datetime import date + +import pytest + +from pybotx.widgets import ( + WidgetContext, + WidgetDefaults, + WidgetFactory, +) +from pybotx.widgets.async_job import ASYNC_JOB_FAILED, ASYNC_JOB_QUEUED +from pybotx.widgets.base import WIDGET_RESULT_MODE_MESSAGE +from pybotx.widgets.checklist import CHECKED_ITEMS_KEY, SELECTED_ITEM_KEY +from pybotx.widgets.checktable import CheckboxContent +from pybotx.widgets.date_range import DATE_RANGE_CURSOR_KEY +from pybotx.widgets.file_batch import ( + FILE_BATCH_FILES_KEY, + FILE_BATCH_PAGE_KEY, + BatchFileItem, +) +from pybotx.widgets.pagination import MESSAGE_IDS_KEY +from pybotx.widgets.form_wizard import FORM_VALUES_KEY, FormWizardStep +from pybotx.widgets.markup import MessageMarkup +from pybotx.widgets.messages_pager import MessagesPagerWidget +from pybotx.widgets.multi_select import MULTI_SELECTED_VALUES_KEY, MULTI_SELECT_VALUE_KEY +from pybotx.widgets.range import ELEMENTS_KEY +from pybotx.widgets.search_select import SEARCH_PAGE_KEY, SEARCH_QUERY_KEY +from pybotx.widgets.select import SelectOption +from pybotx.widgets.table import TABLE_PAGE_KEY, TABLE_QUERY_KEY +from pybotx.widgets.undefined import undefined + + +def _build_bot_mock() -> Any: + return SimpleNamespace( + send=AsyncMock(return_value=uuid4()), + edit_message=AsyncMock(), + answer_message=AsyncMock(return_value=uuid4()), + ) + + +def test__widget_context__exports_base_widget_kwargs( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + bot = _build_bot_mock() + markup = MessageMarkup() + context = WidgetContext( + message=message, + bot=bot, + command="/confirm", + additional_markup=markup, + result_mode=WIDGET_RESULT_MODE_MESSAGE, + ) + + assert context.as_widget_kwargs() == { + "message": message, + "bot": bot, + "command": "/confirm", + "additional_markup": markup, + "result_mode": WIDGET_RESULT_MODE_MESSAGE, + } + + +@pytest.mark.asyncio +async def test__widget_factory__builds_confirm_widget_with_defaults( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + bot = _build_bot_mock() + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/confirm", + ), + ) + + widget = factory.confirm(label="Подтвердить действие") + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + rows = [[button.label for button in row] for row in sent_message.bubbles] + assert rows == [["Подтвердить", "Отмена"]] + + +@pytest.mark.asyncio +async def test__widget_factory__applies_custom_defaults_to_approval_widget( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + bot = _build_bot_mock() + defaults = WidgetDefaults( + approve_label="Approve", + reject_label="Reject", + comment_label="Comment", + ) + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/approval", + ), + defaults=defaults, + ) + + widget = factory.approval(label="Review request") + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + rows = [[button.label for button in row] for row in sent_message.bubbles] + assert rows == [["Approve", "Reject"], ["Comment"]] + + +@pytest.mark.asyncio +async def test__widget_factory__select_supports_context_and_per_call_overrides( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + message.data = {"select_value": "b"} + bot = _build_bot_mock() + context_markup = MessageMarkup() + context_markup.add_keyboard(command="/ctx", label="Context keyboard") + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/select", + additional_markup=context_markup, + ), + ) + + widget = factory.select( + options=[ + "a", + SelectOption(value="b", label="Bee"), + ], + label="Выберите", + selected_prefix="> ", + result_mode=WIDGET_RESULT_MODE_MESSAGE, + ) + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + bubble_rows = [[button.label for button in row] for row in sent_message.bubbles] + keyboard_rows = [[button.label for button in row] for row in sent_message.keyboard] + assert bubble_rows == [["a"], ["> Bee"]] + assert keyboard_rows == [["Context keyboard"]] + assert widget.result_mode == WIDGET_RESULT_MODE_MESSAGE + + +@pytest.mark.asyncio +async def test__widget_factory__search_select_uses_defaults_and_context( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + message.data = {SEARCH_QUERY_KEY: "ap", SEARCH_PAGE_KEY: 1} + bot = _build_bot_mock() + defaults = WidgetDefaults( + selected_prefix="> ", + search_empty_label="Empty", + ) + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/search", + ), + defaults=defaults, + ) + + widget = factory.search_select( + options=["apple", "banana", "apricot"], + label="Поиск", + page_size=1, + ) + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + labels = [button.label for row in sent_message.bubbles for button in row] + assert labels == ["apricot", "Назад"] + assert sent_message.body == "Поиск\nПоиск: ap" + + +@pytest.mark.asyncio +async def test__widget_factory__multi_select_supports_context_and_overrides( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + message.metadata = {MULTI_SELECTED_VALUES_KEY: ["a"]} + message.data = {MULTI_SELECT_VALUE_KEY: "b"} + bot = _build_bot_mock() + context_markup = MessageMarkup() + context_markup.add_keyboard(command="/ctx", label="Done") + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/multi", + additional_markup=context_markup, + result_mode=WIDGET_RESULT_MODE_MESSAGE, + ), + ) + + widget = factory.multi_select( + options=["a", "b", "c"], + label="Выберите", + max_selected=3, + ) + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + bubble_rows = [[button.label for button in row] for row in sent_message.bubbles] + keyboard_rows = [[button.label for button in row] for row in sent_message.keyboard] + assert sent_message.metadata[MULTI_SELECTED_VALUES_KEY] == ["a", "b"] + assert bubble_rows == [["☑ a"], ["☑ b"], ["☐ c"]] + assert keyboard_rows == [["Done"]] + assert widget.result_mode == WIDGET_RESULT_MODE_MESSAGE + + +@pytest.mark.asyncio +async def test__widget_factory__form_wizard_uses_context_and_result_mode( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)(body="/form Alice") + message.metadata = {FORM_VALUES_KEY: {"name": "Alice"}} + bot = _build_bot_mock() + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/form", + result_mode=WIDGET_RESULT_MODE_MESSAGE, + ), + ) + + widget = factory.form_wizard( + steps=[ + FormWizardStep(field="name", label="Введите имя"), + FormWizardStep(field="email", label="Введите email"), + ], + label="Форма", + ) + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + labels = [button.label for row in sent_message.bubbles for button in row] + assert "Шаг 1/2" in sent_message.body + assert labels == ["Далее", "Отмена", "Использовать текст сообщения"] + assert widget.result_mode == WIDGET_RESULT_MODE_MESSAGE + + +@pytest.mark.asyncio +async def test__widget_factory__table_supports_defaults_and_context( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + message.data = { + TABLE_QUERY_KEY: "a", + TABLE_PAGE_KEY: 0, + } + bot = _build_bot_mock() + context_markup = MessageMarkup() + context_markup.add_keyboard(command="/ctx", label="Refresh") + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/table", + additional_markup=context_markup, + ), + ) + + widget = factory.table( + rows=[ + {"name": "Alice", "role": "admin"}, + {"name": "Charlie", "role": "analyst"}, + ], + columns=["name", "role"], + label="Пользователи", + page_size=1, + ) + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + labels = [button.label for row in sent_message.bubbles for button in row] + keyboard_rows = [[button.label for button in row] for row in sent_message.keyboard] + assert "Пользователи" in sent_message.body + assert "Фильтр: a" in sent_message.body + assert labels == ["Вперед", "Сорт: name", "Сорт: role", "Сбросить фильтр"] + assert keyboard_rows == [["Refresh"]] + + +@pytest.mark.asyncio +async def test__widget_factory__calendar_supports_context_and_overrides( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + bot = _build_bot_mock() + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/calendar", + ), + ) + + widget = factory.calendar( + start_date=date(2026, 1, 1), + end_date=date(2026, 1, 31), + include_past=True, + result_mode=WIDGET_RESULT_MODE_MESSAGE, + ) + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + labels = [button.label for row in sent_message.bubbles for button in row] + assert sent_message.body == "Выберите дату" + assert "Пн" in labels + assert any(month in labels for month in widget.MONTHS.values()) + assert widget.result_mode == WIDGET_RESULT_MODE_MESSAGE + + +@pytest.mark.asyncio +async def test__widget_factory__range_supports_context_and_markup( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + bot = _build_bot_mock() + context_markup = MessageMarkup() + context_markup.add_keyboard(command="/ctx", label="Close") + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/range", + additional_markup=context_markup, + ), + ) + + widget = factory.range( + elements=["one", "two", "three"], + label_template="Item: {element}", + forward_label="Next", + backward_label="Prev", + ) + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + rows = [[button.label for button in row] for row in sent_message.bubbles] + keyboard_rows = [[button.label for button in row] for row in sent_message.keyboard] + assert sent_message.body == "Item: one" + assert sent_message.metadata[ELEMENTS_KEY] == ["one", "two", "three"] + assert rows == [["Next"]] + assert keyboard_rows == [["Close"]] + + +@pytest.mark.asyncio +async def test__widget_factory__carousel_supports_context_and_result_mode( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + bot = _build_bot_mock() + context_markup = MessageMarkup() + context_markup.add_keyboard(command="/ctx", label="Close") + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/carousel", + additional_markup=context_markup, + result_mode=WIDGET_RESULT_MODE_MESSAGE, + ), + ) + + widget = factory.carousel( + widget_content=["a", "b", "c", "d"], + label="Carousel", + displayed_content_count=2, + loop=False, + inline=True, + ) + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + labels = [button.label for row in sent_message.bubbles for button in row] + keyboard_rows = [[button.label for button in row] for row in sent_message.keyboard] + assert labels == ["a", "b", "➡️"] + assert keyboard_rows == [["Close"]] + assert widget.result_mode == WIDGET_RESULT_MODE_MESSAGE + + +@pytest.mark.asyncio +async def test__widget_factory__pagination_supports_context_and_markup( + incoming_message_factory: object, + monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.setattr("pybotx.widgets.pagination.asyncio.sleep", AsyncMock()) + + message = cast(Any, incoming_message_factory)() + bot = _build_bot_mock() + context_markup = MessageMarkup() + context_markup.add_keyboard(command="/ctx", label="Close") + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/pagination", + additional_markup=context_markup, + ), + ) + + widget = factory.pagination( + widget_content=["1", "2", "3"], + paginate_by=2, + delay_between_messages=0.0, + ) + await widget.display() + + assert bot.send.await_count == 2 + last_message = bot.send.await_args_list[-1].kwargs["message"] + bubble_rows = [[button.label for button in row] for row in last_message.bubbles] + keyboard_rows = [[button.label for button in row] for row in last_message.keyboard] + assert last_message.body == "2" + assert bubble_rows == [["➡️ Вперёд к [3]"]] + assert keyboard_rows == [["Close"]] + assert MESSAGE_IDS_KEY in last_message.metadata + + +@pytest.mark.asyncio +async def test__widget_factory__messages_pager_supports_context_and_template( + incoming_message_factory: object, + monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.setattr("pybotx.widgets.pagination.asyncio.sleep", AsyncMock()) + + message = cast(Any, incoming_message_factory)() + bot = _build_bot_mock() + context_markup = MessageMarkup() + context_markup.add_keyboard(command="/ctx", label="Close") + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/pager", + additional_markup=context_markup, + ), + ) + + widget = factory.messages_pager( + elements=["x", "y", "z"], + page_size=2, + item_template="Elem #{index}/{total}: {element}", + delay_between_messages=0.0, + ) + + assert isinstance(widget, MessagesPagerWidget) + await widget.display() + + last_message = bot.send.await_args_list[-1].kwargs["message"] + keyboard_rows = [[button.label for button in row] for row in last_message.keyboard] + assert last_message.body == "Elem #2/3: y" + assert keyboard_rows == [["Close"]] + assert MESSAGE_IDS_KEY in last_message.metadata + + +@pytest.mark.asyncio +async def test__widget_factory__date_range_supports_context_and_result_mode( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + bot = _build_bot_mock() + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/date-range", + result_mode=WIDGET_RESULT_MODE_MESSAGE, + ), + ) + + widget = factory.date_range(label="Период") + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + labels = [button.label for row in sent_message.bubbles for button in row] + assert "Период" in sent_message.body + assert labels == ["Сегодня", "Завтра"] + assert sent_message.metadata[DATE_RANGE_CURSOR_KEY] == "start" + assert widget.result_mode == WIDGET_RESULT_MODE_MESSAGE + + +@pytest.mark.asyncio +async def test__widget_factory__async_job_supports_context_and_markup( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + bot = _build_bot_mock() + context_markup = MessageMarkup() + context_markup.add_keyboard(command="/ctx", label="Close") + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/job", + additional_markup=context_markup, + ), + ) + + widget = factory.async_job( + job_id="job-1", + status=ASYNC_JOB_QUEUED, + details="Подготовка", + result_mode=WIDGET_RESULT_MODE_MESSAGE, + ) + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + labels = [button.label for row in sent_message.bubbles for button in row] + keyboard_rows = [[button.label for button in row] for row in sent_message.keyboard] + assert "Задача job-1" in sent_message.body + assert labels == ["Обновить", "Отменить"] + assert keyboard_rows == [["Close"]] + assert widget.result_mode == WIDGET_RESULT_MODE_MESSAGE + + +@pytest.mark.asyncio +async def test__widget_factory__async_job_failed_state_is_preserved( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + bot = _build_bot_mock() + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/job", + ), + ) + + widget = factory.async_job( + job_id="job-2", + status=ASYNC_JOB_FAILED, + details="Ошибка", + ) + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + labels = [button.label for row in sent_message.bubbles for button in row] + assert labels == ["Повторить", "Обновить"] + + +@pytest.mark.asyncio +async def test__widget_factory__file_batch_supports_context_and_markup( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + message.data = {FILE_BATCH_PAGE_KEY: 0} + bot = _build_bot_mock() + context_markup = MessageMarkup() + context_markup.add_keyboard(command="/ctx", label="Close") + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/batch", + additional_markup=context_markup, + result_mode=WIDGET_RESULT_MODE_MESSAGE, + ), + ) + + widget = factory.file_batch( + files=[ + BatchFileItem(name="a.txt", status="done"), + {"name": "b.txt", "status": "failed", "error": "oops"}, + "c.txt", + ], + page_size=2, + ) + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + labels = [button.label for row in sent_message.bubbles for button in row] + keyboard_rows = [[button.label for button in row] for row in sent_message.keyboard] + assert "Всего: 3" in sent_message.body + assert labels == ["a.txt", "b.txt", "Вперед", "Повторить ошибки"] + assert keyboard_rows == [["Close"]] + assert FILE_BATCH_FILES_KEY in sent_message.metadata + assert widget.result_mode == WIDGET_RESULT_MODE_MESSAGE + + +@pytest.mark.asyncio +async def test__widget_factory__checklist_supports_context_and_checked_items( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + message.metadata = {CHECKED_ITEMS_KEY: ["b"]} + message.data = {SELECTED_ITEM_KEY: "a"} + bot = _build_bot_mock() + context_markup = MessageMarkup() + context_markup.add_keyboard(command="/ctx", label="Close") + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/checklist", + additional_markup=context_markup, + ), + ) + + widget = factory.checklist( + widget_content=["a", ["b", "c"]], + label="Checklist", + ) + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + rows = [[button.label for button in row] for row in sent_message.bubbles] + keyboard_rows = [[button.label for button in row] for row in sent_message.keyboard] + assert sent_message.metadata[CHECKED_ITEMS_KEY] == ["b", "a"] + assert rows == [["☑ a"], ["☑ b", "☐ c"]] + assert keyboard_rows == [["Close"]] + + +@pytest.mark.asyncio +async def test__widget_factory__checktable_supports_context_and_markup( + incoming_message_factory: object, +) -> None: + message = cast(Any, incoming_message_factory)() + bot = _build_bot_mock() + context_markup = MessageMarkup() + context_markup.add_keyboard(command="/ctx", label="Close") + factory = WidgetFactory( + context=WidgetContext( + message=message, + bot=bot, + command="/checktable", + additional_markup=context_markup, + ), + ) + + widget = factory.checktable( + checkboxes=[ + CheckboxContent[str]( + label="Undefined", + command="/fill", + checkbox_value=undefined, + ), + CheckboxContent[str]( + label="Mapped", + command="/select", + checkbox_value="k1", + mapping={"k1": "Value 1"}, + ), + ], + label="Checktable", + uncheck_command="/uncheck", + result_mode=WIDGET_RESULT_MODE_MESSAGE, + ) + await widget.display() + + sent_message = bot.send.await_args.kwargs["message"] + rows = [[button.label for button in row] for row in sent_message.bubbles] + keyboard_rows = [[button.label for button in row] for row in sent_message.keyboard] + assert rows == [["☐ Undefined", "Ввести"], ["☑ Mapped", "Value 1"]] + assert keyboard_rows == [["Close"]] + assert widget.result_mode == WIDGET_RESULT_MODE_MESSAGE diff --git a/tests/widgets/test_observability.py b/tests/widgets/test_observability.py new file mode 100644 index 00000000..f30aa3ce --- /dev/null +++ b/tests/widgets/test_observability.py @@ -0,0 +1,172 @@ +import importlib +from typing import cast + +import pytest +from pybotx import Bot, IncomingMessage + +from pybotx.widgets import ( + InMemoryWidgetRunnerMetricsCollector, + NoopWidgetRunnerMetricsCollector, + PrometheusWidgetRunnerMetricsCollector, +) +from pybotx.widgets.base import Widget +from pybotx.widgets.runner import WidgetRunnerFinishedEvent, WidgetRunnerStartedEvent + + +class _FakeWidget: + command = "/confirm-demo" + result_mode = "edit" + + +def _build_started_event() -> WidgetRunnerStartedEvent: + return WidgetRunnerStartedEvent( + message=cast(IncomingMessage, object()), + bot=cast(Bot, object()), + widget=cast(Widget, _FakeWidget()), + ) + + +def _build_finished_event( + *, + duration_seconds: float = 0.125, + skipped_by_before: bool = False, + before_results_sent: int = 0, + after_results_sent: int = 0, + error: Exception | None = None, +) -> WidgetRunnerFinishedEvent: + widget = cast(Widget, _FakeWidget()) + return WidgetRunnerFinishedEvent( + message=cast(IncomingMessage, object()), + bot=cast(Bot, object()), + initial_widget=widget, + widget=widget, + duration_seconds=duration_seconds, + displayed=not skipped_by_before, + skipped_by_before=skipped_by_before, + before_results_sent=before_results_sent, + after_results_sent=after_results_sent, + error=error, + ) + + +def test__noop_widget_runner_metrics_collector__does_not_fail() -> None: + collector = NoopWidgetRunnerMetricsCollector() + + collector.on_started(_build_started_event()) + collector.on_finished(_build_finished_event()) + + +def test__in_memory_widget_runner_metrics_collector__collects_metrics() -> None: + collector = InMemoryWidgetRunnerMetricsCollector() + collector.on_started(_build_started_event()) + collector.on_finished( + _build_finished_event( + skipped_by_before=True, + before_results_sent=1, + ), + ) + collector.on_started(_build_started_event()) + collector.on_finished( + _build_finished_event( + duration_seconds=0.5, + after_results_sent=2, + error=RuntimeError("boom"), + ), + ) + snapshot = collector.snapshot() + + assert snapshot.in_flight == 0 + assert snapshot.runs_total == 2 + assert snapshot.errors_total == 1 + assert snapshot.skipped_total == 1 + assert snapshot.before_results_sent_total == 1 + assert snapshot.after_results_sent_total == 2 + assert snapshot.latency_sum_seconds == pytest.approx(0.625) + assert snapshot.run_outcomes[("_FakeWidget", "/confirm-demo", "edit", "ok")] == 1 + assert snapshot.run_outcomes[("_FakeWidget", "/confirm-demo", "edit", "error")] == 1 + assert snapshot.errors[("_FakeWidget", "/confirm-demo", "RuntimeError")] == 1 + assert snapshot.skipped[("_FakeWidget", "/confirm-demo", "edit")] == 1 + assert snapshot.result_messages[("_FakeWidget", "/confirm-demo", "before")] == 1 + assert snapshot.result_messages[("_FakeWidget", "/confirm-demo", "after")] == 2 + + +def test__prometheus_widget_runner_metrics_collector__collects_metrics() -> None: + prometheus_client = pytest.importorskip("prometheus_client") + registry = prometheus_client.CollectorRegistry() + collector = PrometheusWidgetRunnerMetricsCollector(registry=registry) + + collector.on_started(_build_started_event()) + collector.on_finished( + _build_finished_event( + duration_seconds=0.125, + skipped_by_before=True, + before_results_sent=1, + error=ValueError("boom"), + ), + ) + + assert registry.get_sample_value( + "pybotx_widget_in_flight", + { + "widget_name": "_FakeWidget", + "command": "/confirm-demo", + }, + ) == 0.0 + assert registry.get_sample_value( + "pybotx_widget_runs_total", + { + "widget_name": "_FakeWidget", + "command": "/confirm-demo", + "result_mode": "edit", + "outcome": "error", + }, + ) == 1.0 + assert registry.get_sample_value( + "pybotx_widget_errors_total", + { + "widget_name": "_FakeWidget", + "command": "/confirm-demo", + "error_type": "ValueError", + }, + ) == 1.0 + assert registry.get_sample_value( + "pybotx_widget_skipped_total", + { + "widget_name": "_FakeWidget", + "command": "/confirm-demo", + "result_mode": "edit", + }, + ) == 1.0 + assert registry.get_sample_value( + "pybotx_widget_result_messages_total", + { + "widget_name": "_FakeWidget", + "command": "/confirm-demo", + "phase": "before", + }, + ) == 1.0 + assert registry.get_sample_value( + "pybotx_widget_latency_seconds_sum", + { + "widget_name": "_FakeWidget", + "command": "/confirm-demo", + "result_mode": "edit", + "outcome": "error", + }, + ) == pytest.approx(0.125) + + +def test__prometheus_widget_runner_metrics_collector__requires_prometheus_client( + monkeypatch: pytest.MonkeyPatch, +) -> None: + original_import_module = importlib.import_module + + def import_module(name: str) -> object: + if name == "prometheus_client": + raise ModuleNotFoundError(name) + return original_import_module(name) + + monkeypatch.setattr(importlib, "import_module", import_module) + + with pytest.raises(RuntimeError, match="prometheus-client"): + PrometheusWidgetRunnerMetricsCollector() diff --git a/tests/widgets/test_presets.py b/tests/widgets/test_presets.py new file mode 100644 index 00000000..18113c4d --- /dev/null +++ b/tests/widgets/test_presets.py @@ -0,0 +1,149 @@ +from typing import cast + +import pytest + +from pybotx.widgets import ( + LoggingWidgetRunnerObserver, + PrometheusWidgetRunnerMetricsCollector, + RunnerHookResult, + WidgetRunnerConfig, + WidgetRunnerObservabilityPreset, + WidgetRunnerObserver, + WidgetRunnerPreset, + build_production_widget_runner_preset, + build_widget_runner_observability_preset, +) +from pybotx.widgets.base import Widget + + +def test__build_widget_runner_observability_preset__adds_logging_observer() -> None: + preset = build_widget_runner_observability_preset() + + assert isinstance(preset, WidgetRunnerObservabilityPreset) + assert len(preset.observers) == 1 + assert isinstance(preset.observers[0], LoggingWidgetRunnerObserver) + assert preset.as_config() == WidgetRunnerConfig(observers=preset.observers) + + +def test__build_widget_runner_observability_preset__supports_custom_observers() -> None: + class _CustomObserver(WidgetRunnerObserver): + def on_started(self, _event: object) -> None: + return None + + def on_finished(self, _event: object) -> None: + return None + + custom_observer = _CustomObserver() + + preset = build_widget_runner_observability_preset( + observers=(custom_observer,), + ) + + assert preset.observers[1] is custom_observer + + +def test__build_widget_runner_observability_preset__requires_at_least_one_observer() -> None: + with pytest.raises(ValueError): + build_widget_runner_observability_preset(enable_logging_observer=False) + + +def test__build_widget_runner_observability_preset__supports_prometheus_metrics() -> None: + prometheus_client = pytest.importorskip("prometheus_client") + registry = prometheus_client.CollectorRegistry() + + preset = build_widget_runner_observability_preset( + enable_logging_observer=False, + enable_prometheus_metrics=True, + registry=registry, + ) + + assert len(preset.observers) == 1 + assert isinstance(preset.observers[0], PrometheusWidgetRunnerMetricsCollector) + + +def test__build_production_widget_runner_preset__builds_runner_config() -> None: + calls: list[str] = [] + + def _before(_: Widget) -> RunnerHookResult: + calls.append("before") + return RunnerHookResult(result="before", should_display=True) + + def _after(_: Widget) -> str | None: + calls.append("after") + return "after" + + preset = build_production_widget_runner_preset( + before=_before, + after=_after, + ) + + assert isinstance(preset, WidgetRunnerPreset) + assert preset.as_runner_kwargs() == {"config": preset.config} + assert preset.as_widget_command_kwargs() == {"config": preset.config} + assert len(preset.config.before_hooks) == 1 + assert len(preset.config.after_hooks) == 1 + assert len(preset.config.observers) == 1 + assert isinstance(preset.config.observers[0], LoggingWidgetRunnerObserver) + + widget = cast(Widget, object()) + before_result = preset.config.before_hooks[0](widget) + after_result = preset.config.after_hooks[0](widget) + + assert isinstance(before_result, RunnerHookResult) + assert before_result.result == "before" + assert after_result == "after" + assert calls == ["before", "after"] + + +def test__build_production_widget_runner_preset__extends_with_extra_hooks() -> None: + order: list[str] = [] + + def _before_one(_: Widget) -> RunnerHookResult: + order.append("before_one") + return RunnerHookResult() + + def _before_two(_: Widget) -> RunnerHookResult: + order.append("before_two") + return RunnerHookResult() + + def _after_one(_: Widget) -> str | None: + order.append("after_one") + return None + + def _after_two(_: Widget) -> str | None: + order.append("after_two") + return None + + preset = build_production_widget_runner_preset( + before=_before_one, + before_hooks=(_before_two,), + after=_after_one, + after_hooks=(_after_two,), + observability_preset=WidgetRunnerObservabilityPreset(observers=()), + ) + + widget = cast(Widget, object()) + for before_hook in preset.config.before_hooks: + before_hook(widget) + for after_hook in preset.config.after_hooks: + after_hook(widget) + + assert order == ["before_one", "before_two", "after_one", "after_two"] + + +def test__build_production_widget_runner_preset__uses_custom_observability_preset() -> None: + class _CustomObserver(WidgetRunnerObserver): + def on_started(self, _event: object) -> None: + return None + + def on_finished(self, _event: object) -> None: + return None + + custom_observer = _CustomObserver() + observability_preset = WidgetRunnerObservabilityPreset(observers=(custom_observer,)) + + preset = build_production_widget_runner_preset( + observability_preset=observability_preset, + ) + + assert preset.config.observers == (custom_observer,) From c232671057bbebc0b248a6ec4aadf5542829c822 Mon Sep 17 00:00:00 2001 From: Aleksandr Osovskii Date: Thu, 26 Feb 2026 14:35:35 +0300 Subject: [PATCH 07/19] - --- .github/workflows/publish-pypi.yml | 26 +- .github/workflows/python-app.yml | 61 +- .gitignore | 1 + README.md | 51 +- WIDGETS.md | 1051 ++++++++++++ example/README.md | 73 + example/__init__.py | 0 example/main.py | 874 ++++++++++ img.png | Bin 0 -> 39731 bytes img_1.png | Bin 0 -> 66080 bytes img_10.png | Bin 0 -> 39740 bytes img_11.png | Bin 0 -> 60459 bytes img_12.png | Bin 0 -> 67415 bytes img_13.png | Bin 0 -> 37512 bytes img_14.png | Bin 0 -> 61989 bytes img_15.png | Bin 0 -> 50653 bytes img_2.png | Bin 0 -> 50515 bytes img_3.png | Bin 0 -> 76089 bytes img_4.png | Bin 0 -> 109420 bytes img_5.png | Bin 0 -> 61032 bytes img_6.png | Bin 0 -> 43656 bytes img_7.png | Bin 0 -> 60519 bytes img_8.png | Bin 0 -> 48847 bytes img_9.png | Bin 0 -> 137062 bytes poetry.lock | 1515 ----------------- pybotx/__init__.py | 14 + pybotx/bot/healthcheck.py | 291 ++++ pybotx/widgets/__init__.py | 60 + pybotx/widgets/approval.py | 58 + pybotx/widgets/async_job.py | 93 + pybotx/widgets/base.py | 241 +++ pybotx/widgets/calendar.py | 255 +++ pybotx/widgets/carousel.py | 267 +++ pybotx/widgets/checklist.py | 76 + pybotx/widgets/checktable.py | 82 + pybotx/widgets/confirm.py | 54 + pybotx/widgets/date_range.py | 137 ++ pybotx/widgets/file_batch.py | 198 +++ pybotx/widgets/form_wizard.py | 163 ++ pybotx/widgets/markup.py | 102 ++ pybotx/widgets/messages_pager.py | 44 + pybotx/widgets/multi_select.py | 71 + pybotx/widgets/pagination.py | 224 +++ pybotx/widgets/range.py | 98 ++ pybotx/widgets/runner.py | 212 +++ pybotx/widgets/search_select.py | 121 ++ pybotx/widgets/select.py | 60 + pybotx/widgets/service.py | 37 + pybotx/widgets/strings.py | 41 + pybotx/widgets/table.py | 176 ++ pybotx/widgets/undefined.py | 13 + pyproject.toml | 113 +- .../test_direct_notification.py | 586 +++---- .../test_internal_bot_notification.py | 4 +- tests/client/notifications_api/test_markup.py | 272 ++- tests/test_healthcheck.py | 244 +++ tests/widgets/test_approval.py | 56 + tests/widgets/test_async_job.py | 95 ++ tests/widgets/test_base.py | 208 +++ tests/widgets/test_calendar.py | 252 +++ tests/widgets/test_carousel.py | 354 ++++ tests/widgets/test_checklist.py | 93 + tests/widgets/test_checktable.py | 85 + tests/widgets/test_confirm.py | 55 + tests/widgets/test_date_range.py | 122 ++ tests/widgets/test_file_batch.py | 131 ++ tests/widgets/test_form_wizard.py | 187 ++ tests/widgets/test_markup.py | 50 + tests/widgets/test_messages_pager.py | 69 + tests/widgets/test_module.py | 69 + tests/widgets/test_multi_select.py | 107 ++ tests/widgets/test_pagination.py | 311 ++++ tests/widgets/test_range.py | 159 ++ tests/widgets/test_runner.py | 272 +++ tests/widgets/test_search_select.py | 126 ++ tests/widgets/test_select.py | 48 + tests/widgets/test_service.py | 46 + tests/widgets/test_table.py | 119 ++ uv.lock | 1280 ++++++++++++++ 79 files changed, 10332 insertions(+), 2021 deletions(-) create mode 100644 WIDGETS.md create mode 100644 example/README.md create mode 100644 example/__init__.py create mode 100644 example/main.py create mode 100644 img.png create mode 100644 img_1.png create mode 100644 img_10.png create mode 100644 img_11.png create mode 100644 img_12.png create mode 100644 img_13.png create mode 100644 img_14.png create mode 100644 img_15.png create mode 100644 img_2.png create mode 100644 img_3.png create mode 100644 img_4.png create mode 100644 img_5.png create mode 100644 img_6.png create mode 100644 img_7.png create mode 100644 img_8.png create mode 100644 img_9.png delete mode 100644 poetry.lock create mode 100644 pybotx/bot/healthcheck.py create mode 100644 pybotx/widgets/__init__.py create mode 100644 pybotx/widgets/approval.py create mode 100644 pybotx/widgets/async_job.py create mode 100644 pybotx/widgets/base.py create mode 100644 pybotx/widgets/calendar.py create mode 100644 pybotx/widgets/carousel.py create mode 100644 pybotx/widgets/checklist.py create mode 100644 pybotx/widgets/checktable.py create mode 100644 pybotx/widgets/confirm.py create mode 100644 pybotx/widgets/date_range.py create mode 100644 pybotx/widgets/file_batch.py create mode 100644 pybotx/widgets/form_wizard.py create mode 100644 pybotx/widgets/markup.py create mode 100644 pybotx/widgets/messages_pager.py create mode 100644 pybotx/widgets/multi_select.py create mode 100644 pybotx/widgets/pagination.py create mode 100644 pybotx/widgets/range.py create mode 100644 pybotx/widgets/runner.py create mode 100644 pybotx/widgets/search_select.py create mode 100644 pybotx/widgets/select.py create mode 100644 pybotx/widgets/service.py create mode 100644 pybotx/widgets/strings.py create mode 100644 pybotx/widgets/table.py create mode 100644 pybotx/widgets/undefined.py create mode 100644 tests/test_healthcheck.py create mode 100644 tests/widgets/test_approval.py create mode 100644 tests/widgets/test_async_job.py create mode 100644 tests/widgets/test_base.py create mode 100644 tests/widgets/test_calendar.py create mode 100644 tests/widgets/test_carousel.py create mode 100644 tests/widgets/test_checklist.py create mode 100644 tests/widgets/test_checktable.py create mode 100644 tests/widgets/test_confirm.py create mode 100644 tests/widgets/test_date_range.py create mode 100644 tests/widgets/test_file_batch.py create mode 100644 tests/widgets/test_form_wizard.py create mode 100644 tests/widgets/test_markup.py create mode 100644 tests/widgets/test_messages_pager.py create mode 100644 tests/widgets/test_module.py create mode 100644 tests/widgets/test_multi_select.py create mode 100644 tests/widgets/test_pagination.py create mode 100644 tests/widgets/test_range.py create mode 100644 tests/widgets/test_runner.py create mode 100644 tests/widgets/test_search_select.py create mode 100644 tests/widgets/test_select.py create mode 100644 tests/widgets/test_service.py create mode 100644 tests/widgets/test_table.py create mode 100644 uv.lock diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml index ed534eee..6579e732 100644 --- a/.github/workflows/publish-pypi.yml +++ b/.github/workflows/publish-pypi.yml @@ -5,12 +5,24 @@ on: - "*.*.*" jobs: build: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v1 - - name: Assert tag is from master - run: git branch -a --contains $(git describe --tags) | grep master - - name: Build and publish to pypi - uses: JRubics/poetry-publish@v1.8 + - uses: actions/checkout@v4 + - name: Assert tag is from master or release-candidate + run: git branch -a --contains $(git describe --tags) | grep -E "master|release-candidate" + + - name: Setup Python + uses: actions/setup-python@v5 with: - pypi_token: ${{ secrets.PYPI_TOKEN }} + python-version: "3.13" + + - name: Install uv + run: python -m pip install --upgrade pip uv + + - name: Build package + run: uv build + + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.PYPI_TOKEN }} diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index 8fb1a8a6..37995103 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -4,23 +4,31 @@ jobs: test: name: Test - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 strategy: matrix: - python-version: ["3.8", "3.9", "3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] steps: - - name: Setup dependencies - uses: ExpressApp/github-actions-poetry@v0.3 + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - poetry-version: "1.3.2" + + - name: Install uv + run: python -m pip install --upgrade pip uv + + - name: Install dependencies + run: uv sync --dev - name: Run tests env: BOT_CREDENTIALS: ${{ secrets.END_TO_END_TESTS_BOT_CREDENTIALS }} run: | - poetry run ./scripts/test --cov-report=xml + uv run ./scripts/test --cov=pybotx --cov-report=xml - name: Upload coverage to Codecov uses: codecov/codecov-action@v2 @@ -28,33 +36,50 @@ jobs: fail_ci_if_error: true files: ./coverage.xml flags: unittests + token: ${{ secrets.CODECOV_TOKEN }} lint: name: Lint - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - - name: Setup dependencies - uses: ExpressApp/github-actions-poetry@v0.3 + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 with: - python-version: ${{ matrix.python-version }} - poetry-version: "1.3.2" + python-version: "3.13" + + - name: Install uv + run: python -m pip install --upgrade pip uv + + - name: Install dependencies + run: uv sync --dev - name: Run linters run: | - poetry run ./scripts/lint + uv run ./scripts/lint docs-lint: name: Docs lint - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - - name: Setup dependencies - uses: ExpressApp/github-actions-poetry@v0.3 + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 with: - python-version: ${{ matrix.python-version }} - poetry-version: "1.3.2" + python-version: "3.13" + + - name: Install uv + run: python -m pip install --upgrade pip uv + + - name: Install dependencies + run: uv sync --dev - name: Run linters run: | - poetry run ./scripts/docs-lint + uv run bash ./scripts/docs-lint diff --git a/.gitignore b/.gitignore index eca21968..b07a5008 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ htmlcov site .snippets*/ .idea/ +.hypothesis diff --git a/README.md b/README.md index c838f31a..eb6178f7 100644 --- a/README.md +++ b/README.md @@ -19,15 +19,25 @@ ## Установка -Используя `poetry`: +Используя `uv`: ```bash -poetry add pybotx +uv add pybotx ``` **Предупреждение:** Данный проект находится в активной разработке (`0.y.z`) и его API может быть изменён при повышении минорной версии. +## Документация по виджетам + +Подробное и исчерпывающее руководство по всем виджетам и API раннера: + +- `/Users/aleksandrosovskii/PycharmProjects/pybotx_stable/WIDGETS.md` + +Демо-бот с примерами всех виджетов: + +- `/Users/aleksandrosovskii/PycharmProjects/pybotx_stable/example/README.md` + ## Информация о мессенджере eXpress и платформе BotX @@ -129,6 +139,43 @@ async def callback_handler(request: Request) -> JSONResponse: ) ``` +### Healthcheck (опционально, подключается явно) + +По умолчанию `pybotx` не регистрирует healthcheck-эндпоинты. +Подключение выполняется явно: + +```python +from pybotx import * + +app = FastAPI() + +healthcheck = setup_healthcheck(app) # Роуты: /health/ и /health/ready + + +async def db_readiness_check() -> ReadinessCheckResult: + # Пример: реальная проверка БД/кеша/внешнего API. + # Рекомендуется выставлять таймауты внутри проверки. + return ReadinessCheckResult(status="ok") + + +healthcheck.add_readiness_check( + ReadinessCheck( + name="db", + check=db_readiness_check, + critical=True, + timeout_seconds=0.5, + ), +) +``` + +`/health/`: +- `200` — процесс жив (`status=ok`) +- `500` — фатальное состояние (`status=fail`) + +`/health/ready`: +- `200` — готов (`status=ok`) или частично деградирован (`status=degraded`) +- `503` — не готов (`status=fail`, если упал хотя бы один `critical` check) + ## Примеры diff --git a/WIDGETS.md b/WIDGETS.md new file mode 100644 index 00000000..5aec6393 --- /dev/null +++ b/WIDGETS.md @@ -0,0 +1,1051 @@ +# Виджеты в `pybotx`: полное руководство + +Этот документ является полной справкой по подсистеме виджетов в `pybotx`. +В нем описано: + +- все готовые виджеты из `pybotx.widgets` +- модель выполнения: `WidgetRunner`, `RunnerHookResult`, `@widget_command` +- фабрики хуков: `on_data_key`, `on_completed`, `on_action` +- как писать собственные виджеты +- практические паттерны и рекомендации по тестированию + +## 1. Быстрый старт + +Минимальная команда с виджетом и автоматическим раннером: + +```python +from pybotx import Bot, HandlerCollector, IncomingMessage +from pybotx.widgets import ConfirmWidget, on_action, widget_command +from pybotx.widgets.confirm import CANCEL_ACTION, CONFIRM_ACTION + +collector = HandlerCollector() + + +@collector.command("/confirm-demo", description="Confirm widget demo") +@widget_command( + before=on_action( + lambda widget: ConfirmWidget.get_action(widget.message), + { + CONFIRM_ACTION: "Confirmed", + CANCEL_ACTION: "Cancelled", + }, + ), +) +async def confirm_demo_handler(message: IncomingMessage, bot: Bot) -> ConfirmWidget: + return ConfirmWidget( + label="Confirm deployment?", + message=message, + bot=bot, + command="/confirm-demo", + ) +``` + +Что происходит: + +1. хендлер создает и возвращает виджет +2. `@widget_command` оборачивает хендлер и запускает `WidgetRunner` +3. хук `before` обрабатывает нажатие кнопки и отправляет результат +4. если callback-данных нет, отображается сам виджет + +## 2. Архитектура и жизненный цикл + +### 2.1 Базовый класс `Widget` + +Каждый виджет: + +- получает `message`, `bot`, `command` +- создает `widget_message` (`OutgoingMessage`) +- заполняет `widget_message.body` +- добавляет bubbles/keyboard в `add_markup()` +- отображается через `display()` + +Обязательный метод: + +- `add_markup(self) -> None` (абстрактный) + +Полезные методы: + +- `display()`: `add_markup()` + `send_widget_message()` +- `send_result(body, markup=None)`: отправляет результат как edit или как новое сообщение +- `send_or_update_message(widget_message)`: внутренняя логика send/edit +- `add_additional_markup()`: объединяет внешний `MessageMarkup` + +### 2.2 Семантика отправки/редактирования + +Служебные метаданные: + +- сообщения виджетов содержат `pybotx_widget = 1` в metadata +- ключ режима результата: `pybotx_widget_result_mode` + +Поведение display/update: + +- если входящее сообщение имеет `pybotx_widget=1` и `source_sync_id`, виджет пытается редактировать предыдущее сообщение +- иначе виджет отправляет новое сообщение + +### 2.3 Режим результата (`edit` vs `message`) + +- `WIDGET_RESULT_MODE_EDIT = "edit"` +- `WIDGET_RESULT_MODE_MESSAGE = "message"` + +Приоритет выбора режима в `Widget._resolve_result_mode()`: + +1. явный `result_mode`, переданный в конструктор виджета +2. режим из входящей metadata (`pybotx_widget_result_mode`) +3. режим из аргумента команды: + `edit|inline|update` -> `edit`, + `message|reply|send` -> `message`, + также поддерживаются `mode=...`, `result=...`, `--mode=...`, `--result=...` +4. значение по умолчанию: `edit` + +## 3. API раннера + +### 3.1 `RunnerHookResult` + +`RunnerHookResult` управляет потоком выполнения в `before`-хуке: + +- `result: str | None` -> если задан, отправляется текст результата +- `should_display: bool` -> если `False`, после хука виджет не отображается +- `widget: Widget | None` -> замена текущего виджета (например, после пересборки состояния) + +### 3.2 `WidgetRunner` + +`WidgetRunner.run(widget, before=None, after=None)`: + +- запускает `before(widget)`, если он задан +- применяет результат `RunnerHookResult` +- вызывает `widget.display()` +- запускает `after(widget)`, если он задан +- если `after` вернул текст, отправляет его как результат + +Сигнатуры хуков: + +- `before(widget) -> RunnerHookResult | None | awaitable` +- `after(widget) -> str | None | awaitable` + +### 3.3 `@widget_command` + +Декоратор из `/Users/aleksandrosovskii/PycharmProjects/pybotx_stable/pybotx/widgets/runner.py`. + +Поддерживаемые формы: + +```python +@widget_command +async def handler(message: IncomingMessage, bot: Bot) -> Widget: ... + +@widget_command(before=..., after=...) +async def handler(message: IncomingMessage, bot: Bot) -> Widget: ... +``` + +Поведение: + +- хендлер должен вернуть виджет (или `None`) +- декоратор умеет резолвить awaitable-результат +- если получен `None`, выполнение завершается без действий +- иначе создается `WidgetRunner(message, bot)` и выполняются хуки + display + +Зачем использовать: + +- убирает boilerplate с ручным созданием runner в каждой команде +- сохраняет хендлер тонким: только сборка виджета + +## 4. Фабрики хуков + +### 4.1 `on_data_key` + +`on_data_key(key, resolver, should_display=False)`: + +- проверяет `key in widget.message.data` +- если ключа нет -> ничего не делает +- если ключ есть -> вызывает `resolver(widget)` +- `resolver` может вернуть: + - `str` (будет преобразован в `RunnerHookResult`) + - `RunnerHookResult` + - `None` + - awaitable-варианты + +Типичный случай: реагировать только на конкретный ключ callback payload. + +### 4.2 `on_completed` + +`on_completed(is_completed, resolver)`: + +- используется для `after`-хуков +- если `is_completed(widget)` вернул `False` -> результата нет +- если `True` -> отправляется текст из `resolver(widget)` + +Типичный случай: отправить summary после завершения многошагового виджета. + +### 4.3 `on_action` + +`on_action(get_action, actions, default=None, should_display=False)`: + +- вызывает `action = get_action(widget)` (sync/async) +- сопоставляет action с `actions[action]` +- значение в `actions` может быть: + - `str` + - `RunnerHookResult` + - callable `(widget) -> str | RunnerHookResult | None | awaitable` +- если `get_action` бросает `RuntimeError`, хук считается неприменимым +- необязательный `default` обрабатывает неизвестное действие + +Типичный случай: декларативное ветвление по action. + +## 5. Справочник готовых виджетов + + +### 5.1 `ConfirmWidget` + +![img.png](img.png) + +Назначение: + +- бинарное решение (подтвердить/отменить) + +Бизнес-логика (что ты получаешь): + +- Явный пользовательский verdict перед потенциально опасным действием (деплой, удаление, публикация). +- На выходе всегда дискретное решение: `confirm` или `cancel`. +- Решение можно сразу маппить на ветку бизнес-процесса: выполнить операцию или завершить без side effects. + +Конструктор: + +- `label: str` +- `confirm_label: str = "Подтвердить"` +- `cancel_label: str = "Отмена"` +- базовые аргументы виджета (`message`, `bot`, `command`, `additional_markup`, `result_mode`) + +Ключи/константы: + +- `CONFIRM_ACTION_KEY` +- `CONFIRM_ACTION` +- `CANCEL_ACTION` + +Хелперы: + +- `get_action(message) -> str` +- `is_confirmed(message) -> bool` +- `is_cancelled(message) -> bool` + +### 5.2 `ApprovalWidget` + +![img_2.png](img_2.png) + +Назначение: + +- согласование в трех состояниях: approve/reject/comment + +Бизнес-логика (что ты получаешь): + +- Унифицированную точку согласования для процессов, где недостаточно бинарного выбора. +- На выходе одно из действий: `approve`, `reject`, `comment`. +- Прямое ветвление бизнес-процесса: запуск следующего шага, отклонение, запрос дополнительной информации. + +Конструктор: + +- `label: str` +- `approve_label: str = "Согласовать"` +- `reject_label: str = "Отклонить"` +- `comment_label: str = "Комментарий"` +- базовые аргументы виджета + +Константы: + +- `APPROVAL_ACTION_KEY` +- `APPROVE_ACTION` +- `REJECT_ACTION` +- `COMMENT_ACTION` + +Хелперы: + +- `get_action(message) -> str` +- `is_approved(message) -> bool` + +### 5.3 `SelectWidget` + +![img_1.png](img_1.png) + +Назначение: + +- выбор одного значения из списка + +Бизнес-логика (что ты получаешь): + +- Одно нормализованное значение из набора альтернатив (окружение, тариф, тип операции). +- Предсказуемый выход для downstream-логики: строковый `value`. +- Удобный вход для Strategy/роутинга в application-слое. + +Типы: + +- `SelectOption(value: str, label: str)` + +Конструктор: + +- `options: list[str | SelectOption]` +- `label: str` +- `selected_prefix: str = "• "` +- базовые аргументы виджета + +Ключ: + +- `SELECT_VALUE_KEY` + +Хелпер: + +- `get_value(message) -> str` + +### 5.4 `MultiSelectWidget` + +![img_3.png](img_3.png) + +Назначение: + +- множественный выбор с опциональным ограничением + +Бизнес-логика (что ты получаешь): + +- Набор выбранных флагов/опций в одном шаге (каналы уведомлений, разрешения, категории). +- Контроль бизнес-ограничений через `max_selected` (например, не более 2 вариантов). +- Состояние выбора хранится в metadata и устойчиво к последовательным кликам. + +Конструктор: + +- `options: list[str | SelectOption]` +- `label: str` +- `max_selected: int | None = None` +- базовые аргументы виджета + +Ключи data/metadata: + +- `MULTI_SELECT_VALUE_KEY` (кликнутое значение) +- `MULTI_SELECTED_VALUES_KEY` (состояние выбора в metadata) + +Хелпер: + +- `get_selected_values(message) -> list[str]` + +### 5.5 `SearchSelectWidget` + +![img_4.png](img_4.png) + +Назначение: + +- поиск + пагинация + выбор + +Бизнес-логика (что ты получаешь): + +- Выбор одной сущности из большого справочника без перегрузки UI. +- Возможность искать по пользовательскому вводу (`message.argument`/`SEARCH_QUERY_KEY`) и выбрать точный `value`. +- Паттерн для каталога пользователей, сервисов, проектов, заявок. + +Конструктор: + +- `options: list[str | SelectOption]` +- `label: str` +- `page_size: int = 5` +- `empty_label: str = "Ничего не найдено"` +- `selected_prefix: str = "• "` +- базовые аргументы виджета + +Ключи: + +- `SEARCH_QUERY_KEY` +- `SEARCH_PAGE_KEY` +- для финального выбора используется `SELECT_VALUE_KEY` + +Поведение: + +- запрос берется из `message.data[SEARCH_QUERY_KEY]` или из `message.argument` +- фильтрация по `label` и `value` +- текущая страница хранится в callback data + +### 5.6 `FormWizardWidget` + +![img_5.png](img_5.png) + +Назначение: + +- пошаговая форма (next/back/cancel/reset) + +Бизнес-логика (что ты получаешь): + +- Сбор структурированных данных по шагам с явным состоянием процесса. +- На выходе словарь полей `values`, готовый для валидации и сохранения в доменную модель. +- Управляемый сценарий отмены/сброса без потери контроля над состоянием диалога. + +Типы: + +- `FormWizardStep(field: str, label: str)` + +Конструктор: + +- `steps: list[FormWizardStep]` +- `label: str` +- базовые аргументы виджета + +Ключи и действия: + +- `FORM_STEP_INDEX_KEY` +- `FORM_VALUES_KEY` +- `FORM_ACTION_KEY` +- `FORM_INPUT_KEY` +- действия: + `FORM_ACTION_NEXT`, + `FORM_ACTION_BACK`, + `FORM_ACTION_CANCEL`, + `FORM_ACTION_RESET` + +Поля состояния: + +- `values: dict[str, Any]` +- `step_index: int` +- `cancelled: bool` +- `is_completed: bool` +- `is_active: bool` + +Хелпер: + +- `get_values(message) -> dict[str, Any]` + +### 5.7 `DateRangeWidget` + +![img_6.png](img_6.png) + +Назначение: + +- выбор начала и конца периода + reset + +Бизнес-логика (что ты получаешь): + +- Валидный временной интервал (`start`, `end`) как вход для отчетов, аналитики, выборок из БД. +- Снижение ошибок пользователя: диапазон собирается поэтапно, с поддержкой reset. +- На выходе готовый `tuple[date, date]` для application-service. + +Конструктор: + +- `label: str = "Выбор периода"` +- базовые аргументы виджета + +Ключи: + +- `DATE_RANGE_START_KEY` +- `DATE_RANGE_END_KEY` +- `DATE_RANGE_CURSOR_KEY` +- `DATE_RANGE_SELECTED_DATE_KEY` +- `DATE_RANGE_ACTION_KEY` +- действие `DATE_RANGE_ACTION_RESET` + +Поля состояния: + +- `start: date | None` +- `end: date | None` +- `cursor: str` + +Хелпер: + +- `get_value(message) -> tuple[date, date]` + +### 5.8 `TableWidget` + +![img_7.png](img_7.png) + +Назначение: + +- табличный рендер с фильтрацией, сортировкой и пагинацией + +Бизнес-логика (что ты получаешь): + +- Управляемый просмотр набора данных (read-model) прямо в чате. +- Сохранение пользовательского контекста просмотра: фильтр, сортировка, страница. +- Базовый интерфейс для операционных списков (инциденты, заявки, пользователи) без отдельного фронтенда. + +Конструктор: + +- `rows: list[dict[str, Any]]` +- `columns: list[str]` +- `label: str = "Таблица"` +- `page_size: int = 5` +- базовые аргументы виджета + +Ключи: + +- `TABLE_PAGE_KEY` +- `TABLE_SORT_KEY` +- `TABLE_DESC_KEY` +- `TABLE_QUERY_KEY` + +Поведение: + +- query берется из callback data или из `message.argument` +- устойчивое состояние хранится в metadata + +### 5.9 `AsyncJobWidget` + +![img_8.png](img_8.png) + +Назначение: + +- отображение статуса async-задачи и управление действиями refresh/retry/cancel + +Бизнес-логика (что ты получаешь): + +- Единый UX для long-running процессов (импорт, расчет, синхронизация). +- Декларативные пользовательские команды управления жизненным циклом задачи. +- Наглядный статус и контролируемые переходы: queued -> running -> done/failed/cancelled. + +Конструктор: + +- `job_id: str` +- `status: str` +- `details: str = ""` +- базовые аргументы виджета + +Ключи/константы: + +- `ASYNC_JOB_ID_KEY` +- `ASYNC_JOB_STATUS_KEY` +- `ASYNC_JOB_ACTION_KEY` +- статусы: + `ASYNC_JOB_QUEUED`, + `ASYNC_JOB_RUNNING`, + `ASYNC_JOB_DONE`, + `ASYNC_JOB_FAILED`, + `ASYNC_JOB_CANCELLED` +- действия: + `ASYNC_JOB_ACTION_REFRESH`, + `ASYNC_JOB_ACTION_RETRY`, + `ASYNC_JOB_ACTION_CANCEL` + +Хелперы: + +- `get_action(message) -> str` +- `get_status(message) -> str` + +### 5.10 `FileBatchWidget` + +Файл: `/Users/aleksandrosovskii/PycharmProjects/pybotx_stable/pybotx/widgets/file_batch.py` + +Назначение: + +- отображение статусов пакетной обработки файлов, пагинация, retry failed + +Бизнес-логика (что ты получаешь): + +- Операционный контроль batch-обработки большого числа файлов. +- Быстрый доступ к конкретному файлу и retry только проблемных элементов. +- Прозрачную картину по пакету: сколько успешно, сколько в процессе, сколько с ошибкой. + +Типы: + +- `BatchFileItem(name: str, status: str, error: str = "")` + +Конструктор: + +- `files: list[BatchFileItem | dict | str] | None` +- `label: str = "Пакет файлов"` +- `page_size: int = 5` +- базовые аргументы виджета + +Ключи/константы: + +- `FILE_BATCH_FILES_KEY` +- `FILE_BATCH_PAGE_KEY` +- `FILE_BATCH_ACTION_KEY` +- `FILE_BATCH_FILE_NAME_KEY` +- действия: + `FILE_BATCH_ACTION_PREV`, + `FILE_BATCH_ACTION_NEXT`, + `FILE_BATCH_ACTION_RETRY_FAILED`, + `FILE_BATCH_ACTION_ITEM` + +Хелперы: + +- `get_action(message) -> str` +- `get_selected_file(message) -> str` + +### 5.11 `CalendarWidget` + +![img_9.png](img_9.png) + +Назначение: + +- календарный пикер месяца с ограничениями периода + +Бизнес-логика (что ты получаешь): + +- Выбор одной даты с ограничениями доменных правил (границы периода, запрет прошлого). +- Нормализованное значение даты для последующих сценариев (бронирование, планирование, запуск по дате). +- Контролируемую навигацию по календарю без ручного парсинга дат из текста. + +Конструктор: + +- `start_date: date | None = None` +- `end_date: date = date.max` +- `include_past: bool = False` +- базовые аргументы виджета + +Ключи: + +- `MONTH_TO_DISPLAY_KEY` +- `SELECTED_DATE_KEY` + +Хелпер: + +- `await get_value(message, bot, send_feedback=True) -> date` + +### 5.12 `CarouselWidget` + +![img_10.png](img_10.png) + +Назначение: + +- горизонтальная/вертикальная листалка с выбором значения + +Бизнес-логика (что ты получаешь): + +- Пошаговый выбор из длинного списка без перегруженного интерфейса. +- На выходе одно выбранное значение, пригодное для прямого использования в бизнес-операции. +- Гибкий UX: циклический/нециклический режим, inline или построчный формат. + +Конструктор: + +- `widget_content: Sequence[Any]` +- `label: str` +- `start_from: int = 0` +- `displayed_content_count: int = 3` +- `control_labels: tuple[str, str] | None = None` +- `inline: bool = True` +- `loop: bool = True` +- `show_numbers: bool = False` +- базовые аргументы виджета + +Ключи/константы: + +- `START_FROM_KEY` +- `SELECTED_VALUE_KEY` +- `SELECTED_VALUE_LABEL_KEY` +- `MESSAGE_LABEL_KEY` +- служебные маркеры управления: + `LEFT_PRESSED`, + `RIGHT_PRESSED` + +Хелпер: + +- `await get_value(message, bot, send_feedback=True) -> str | None` + +### 5.13 `CheckListWidget` + +![img_11.png](img_11.png) + +Назначение: + +- простой чеклист с поддержкой вложенных рядов + +Бизнес-логика (что ты получаешь): + +- Чеклист статусов выполнения этапов процесса (release checklist, onboarding checklist). +- На выходе текущий набор отмеченных пунктов, который можно хранить в metadata/репозитории. +- Простой механизм контроля прогресса без полноценной FSM-формы. + +Конструктор: + +- `widget_content: Sequence[Any]` +- `label: str` +- базовые аргументы виджета + +Ключи: + +- `SELECTED_ITEM_KEY` +- `CHECKED_ITEMS_KEY` + +Хелперы: + +- `get_value(message) -> Any` +- `get_checked_items(message) -> list[Any]` + +### 5.14 `ChecktableWidget` + +![img_12.png](img_12.png) + +Назначение: + +- структурированная таблица полей с чекбоксами и значениями + +Бизнес-логика (что ты получаешь): + +- Компактный интерфейс заполнения/очистки набора полей карточки сущности. +- Явное разделение: заполнено поле или нет (`undefined` vs value). +- Модель для сценариев «быстрой правки» тикета/задачи прямо в чате. + +Типы: + +- `CheckboxContent[T]` с полями: + `label`, `command`, `checkbox_value`, `mapping`, `data` +- поддерживается sentinel `undefined` + +Конструктор: + +- `checkboxes: list[CheckboxContent[Any]]` +- `label: str` +- `uncheck_command: str` +- базовые аргументы виджета + +Примечания: + +- если `checkbox_value` равен `undefined`, поле считается незаполненным +- `mapping` позволяет отображать пользовательские подписи вместо технических значений + +### 5.15 `RangeWidget` + +![img_13.png](img_13.png) + +Назначение: + +- последовательная навигация по набору элементов + +Бизнес-логика (что ты получаешь): + +- Управляемый выбор текущего шага/этапа процесса. +- Явный индекс и текущее значение для application-логики. +- Подходит для сценариев со стадиями: Draft -> Review -> Approved -> Done. + +Конструктор: + +- `elements: Sequence[str] | None = None` +- `label_template: str = "Current element: {element}"` +- `forward_label: str = "Вперед"` +- `backward_label: str = "Назад"` +- `empty_body: str = "Список пуст"` +- базовые аргументы виджета + +Ключи: + +- `CURRENT_INDEX_KEY` +- `ELEMENTS_KEY` + +Хелпер: + +- `get_value(message) -> str` + +### 5.16 `PaginationWidget` + +![img_14.png](img_14.png) + +Назначение: + +- пагинация списка сообщений (`str` или `OutgoingMessage`) в несколько сообщений бота + +Бизнес-логика (что ты получаешь): + +- Читаемую выдачу больших наборов данных без ограничения одним сообщением. +- Переиспользуемую механику «листания» для логов, отчетов, длинных списков результатов. +- Сохранение идентификаторов сообщений для последующего обновления уже выведенных страниц. + +Конструктор: + +- `widget_content: list[OutgoingMessage | str]` +- `paginate_by: int` (`> 0`) +- `delay_between_messages: float = 0.5` (`>= 0`) +- базовые аргументы виджета + +Ключи: + +- `START_FROM_KEY` +- `MESSAGE_IDS_KEY` + +Поведение: + +- первый рендер может отправить несколько сообщений +- переключение страницы обновляет уже отправленные сообщения по ID из metadata +- последнее сообщение содержит управляющие кнопки пагинации + +### 5.17 `MessagesPagerWidget` + +![img_15.png](img_15.png) + +Назначение: + +- упрощенный API над `PaginationWidget` для последовательности строк + +Бизнес-логика (что ты получаешь): + +- Быстрый путь показать пользователю большой список текстовых элементов с пагинацией. +- Минимум кода для cases «вывести N сообщений по шаблону». +- Подходящий слой presentation для логов, уведомлений, истории операций. + +Конструктор: + +- `elements: Sequence[str]` +- `page_size: int` +- `item_template: str = "Element: {element}"` +- `delay_between_messages: float = 0.5` +- базовые аргументы виджета + +## 6. `MessageMarkup` и композиция разметки + +Файл: `/Users/aleksandrosovskii/PycharmProjects/pybotx_stable/pybotx/widgets/markup.py` + +`MessageMarkup`: + +- обертка над `BubbleMarkup` + `KeyboardMarkup` +- вспомогательные методы: + `add_bubble(...)`, + `add_keyboard(...)` + +Сценарий использования: + +- основные кнопки виджета формируются внутри класса виджета +- дополнительные глобальные кнопки можно передавать через `additional_markup` +- итоговый markup объединяется в `Widget.add_additional_markup()` + +## 7. Паттерны для команд + +### 7.1 Предпочтительный (декларативный) паттерн + +```python +@collector.command("/select-demo", description="Select demo") +@widget_command( + before=on_data_key( + "select_value", + lambda widget: f"Selected: {widget.message.data['select_value']}", + ), +) +async def select_demo_handler(message: IncomingMessage, bot: Bot) -> SelectWidget: + return SelectWidget( + options=["dev", "prod"], + label="Choose env", + message=message, + bot=bot, + command="/select-demo", + ) +``` + +### 7.2 Замена виджета в хуке (пересборка состояния) + +```python +def retry_failed(widget: FileBatchWidget) -> RunnerHookResult: + updated_files = [...] + replacement = FileBatchWidget( + files=updated_files, + label="Batch status", + message=widget.message, + bot=widget.bot, + command=widget.command, + ) + return RunnerHookResult(widget=replacement, should_display=True) +``` + +### 7.3 Сводка по завершению (`after`) + +```python +@widget_command( + after=on_completed( + lambda widget: widget.is_completed, + lambda widget: f"Done: {widget.values}", + ), +) +async def form_handler(message: IncomingMessage, bot: Bot) -> FormWizardWidget: + ... +``` + +## 8. Как писать собственные виджеты + +### 8.1 Минимальный кастомный виджет + +```python +from typing import Any + +from pybotx.models.message.incoming_message import IncomingMessage +from pybotx.widgets.base import Widget + +COUNTER_VALUE_KEY = "counter_value" + + +def _safe_int(value: object, default: int = 0) -> int: + if isinstance(value, int): + return value + if isinstance(value, str) and value.isdigit(): + return int(value) + return default + + +class CounterWidget(Widget): + def __init__(self, label: str, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + value = _safe_int( + self.message.data.get( + COUNTER_VALUE_KEY, + self.message.metadata.get(COUNTER_VALUE_KEY, 0), + ), + ) + self.value = max(value, 0) + self.widget_metadata[COUNTER_VALUE_KEY] = self.value + self.widget_message.body = f"{label}: {self.value}" + + def add_markup(self) -> None: + self.widget_bubbles.add_button( + command=self.command, + label="+1", + data={COUNTER_VALUE_KEY: self.value + 1}, + ) + if self.value > 0: + self.widget_bubbles.add_button( + command=self.command, + label="-1", + data={COUNTER_VALUE_KEY: self.value - 1}, + new_row=False, + ) +``` + +### 8.2 Команда для кастомного виджета + +```python +from pybotx.widgets import on_data_key, widget_command + + +@collector.command("/counter", description="Counter widget") +@widget_command( + before=on_data_key( + COUNTER_VALUE_KEY, + lambda widget: f"Counter updated: {widget.message.data[COUNTER_VALUE_KEY]}", + should_display=True, + ), +) +async def counter_handler(message: IncomingMessage, bot: Bot) -> CounterWidget: + return CounterWidget( + label="Counter", + message=message, + bot=bot, + command="/counter", + ) +``` + +### 8.3 Правила проектирования собственных виджетов + +1. Держите класс виджета сфокусированным на UI и переходах состояния. +2. Сетевые вызовы/БД/бизнес-решения выносите в сервисный слой до сборки виджета. +3. Всегда валидируйте и нормализуйте `message.data` и `message.metadata`. +4. Не доверяйте типам callback payload. +5. Храните в metadata достаточно данных для восстановления состояния на следующем клике. +6. Для всех ключей callback/metadata используйте явные константы. +7. Для элементов списков предпочитайте неизменяемые структуры (`dataclass(frozen=True)`). +8. Геттеры действий делайте строгими и детерминированными (бросайте `RuntimeError` при невалидном action). + +### 8.4 Идемпотентность и повторная доставка + +Callback-события могут приходить повторно. +Для устойчивого поведения: + +- проектируйте переходы состояния, безопасные при повторе одного и того же события +- внешние side-effect операции защищайте idempotency key (например, `chat_id + source_sync_id + action`) +- отделяйте изменение состояния от внешних эффектов +- не полагайтесь на exactly-once доставку + +## 9. Стратегия тестирования + +### 9.1 Unit-тесты для класса виджета + +Что тестировать: + +- восстановление состояния из metadata в конструкторе +- изменение состояния по callback data +- итоговый `widget_message.body` +- сформированные bubbles/keyboard +- edge-cases: невалидный payload, пустые данные, выход за границы страницы/индекса + +Текущие примеры: + +- `/Users/aleksandrosovskii/PycharmProjects/pybotx_stable/tests/widgets/test_select.py` +- `/Users/aleksandrosovskii/PycharmProjects/pybotx_stable/tests/widgets/test_table.py` +- `/Users/aleksandrosovskii/PycharmProjects/pybotx_stable/tests/widgets/test_pagination.py` + +### 9.2 Тесты runner/декоратора + +Что тестировать: + +- ветки `before` и `after` +- сценарии `should_display=True/False` +- замену виджета через `RunnerHookResult.widget` +- поведение обертки `@widget_command` +- безопасный путь `on_action`, когда action отсутствует (`RuntimeError`) + +Референс: + +- `/Users/aleksandrosovskii/PycharmProjects/pybotx_stable/tests/widgets/test_runner.py` + +### 9.3 Интеграционные тесты (рекомендовано) + +Для production-бота: + +- e2e-поток: команда -> callback -> обновление сообщения +- проверка корректного сохранения metadata между кликами +- проверка обоих режимов результата: `edit` и `message` + +## 10. Диагностика проблем + +### Виджет отправляет новые сообщения вместо редактирования + +Проверьте: + +- у входящего сообщения есть `pybotx_widget = 1` в metadata +- у входящего сообщения есть `source_sync_id` +- путь выполнения идет через `Widget.send_or_update_message` (через `display()` / `send_result()`) + +### `on_action` не срабатывает + +Проверьте: + +- ваш `get_action` действительно бросает `RuntimeError` при отсутствии/невалидности action +- callback data содержит ожидаемый ключ +- строка action совпадает с ключом в `actions` + +### Результат пришел отдельным сообщением, хотя ожидался edit + +Проверьте, какой режим результата выбран: + +- явный `result_mode` в конструкторе виджета +- metadata `pybotx_widget_result_mode` +- значение в аргументе команды (может переопределять режим) + +## 11. Миграция: ручной Runner -> декоратор + +Было: + +```python +runner = WidgetRunner(message, bot) +widget = ConfirmWidget(...) +await runner.run(widget=widget, before=_before, after=_after) +``` + +Стало: + +```python +@widget_command(before=..., after=...) +async def handler(message: IncomingMessage, bot: Bot) -> ConfirmWidget: + return ConfirmWidget(...) +``` + +Преимущества: + +- меньше boilerplate +- более явный и единообразный контракт хендлера +- переиспользуемые хуки +- проще тестировать и поддерживать командой + +## 12. Публичные экспорты (`pybotx.widgets`) + +Ключевые экспорты: + +- все классы виджетов из раздела 5 +- вспомогательные типы: `BatchFileItem`, `CheckboxContent`, `FormWizardStep`, `SelectOption` +- вспомогательные объекты: `undefined`, `Undefined` +- runner API: + `RunnerHookResult`, + `WidgetRunner`, + `widget_command`, + `on_data_key`, + `on_completed`, + `on_action` + +Актуальный список смотрите в: + +- `/Users/aleksandrosovskii/PycharmProjects/pybotx_stable/pybotx/widgets/__init__.py` diff --git a/example/README.md b/example/README.md new file mode 100644 index 00000000..c72e19be --- /dev/null +++ b/example/README.md @@ -0,0 +1,73 @@ +# Widget Demo Bot + +This folder contains a simple `pybotx` + FastAPI demo bot for all widgets in this repository: +both newly added and transferred from `pybotx-widgets`. + +Full widgets documentation: + +- `/Users/aleksandrosovskii/PycharmProjects/pybotx_stable/WIDGETS.md` + +## What is included + +`/Users/aleksandrosovskii/PycharmProjects/pybotx_stable/example/main.py` implements demos for: + +- `ConfirmWidget` +- `SelectWidget` +- `MultiSelectWidget` +- `SearchSelectWidget` +- `FormWizardWidget` +- `DateRangeWidget` +- `TableWidget` +- `ApprovalWidget` +- `AsyncJobWidget` +- `FileBatchWidget` +- `CalendarWidget` +- `CarouselWidget` +- `CheckListWidget` +- `ChecktableWidget` +- `RangeWidget` +- `PaginationWidget` +- `MessagesPagerWidget` + +## Requirements + +Use the repository environment: + +```bash +uv sync --dev +``` + +## Configuration + +Set environment variables: + +```bash +export BOT_ID="123e4567-e89b-12d3-a456-426655440000" +export BOT_CTS_URL="https://cts.example.com" +export BOT_SECRET_KEY="replace-with-real-secret" +``` + +## Run + +```bash +uv run uvicorn example.main:app --host 0.0.0.0 --port 8000 --reload +``` + +## Endpoints + +- `POST /command` +- `GET /status` +- `POST /notification/callback` + +## Demo commands in chat + +Send `/widgets` to get the full list of demo commands. + +Result behavior (`edit` vs `message`) is configured in code, not by user command: + +- `DEFAULT_DEMO_RESULT_MODE` +- `DEMO_RESULT_MODE_BY_COMMAND` + +Both constants are in `/Users/aleksandrosovskii/PycharmProjects/pybotx_stable/example/main.py`. + +All widget handlers are unified via `WidgetRunner` from `pybotx.widgets` and used in `/Users/aleksandrosovskii/PycharmProjects/pybotx_stable/example/main.py`. diff --git a/example/__init__.py b/example/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/example/main.py b/example/main.py new file mode 100644 index 00000000..c59a8fe9 --- /dev/null +++ b/example/main.py @@ -0,0 +1,874 @@ +import os +from http import HTTPStatus +from typing import Final +from uuid import UUID + +from fastapi import FastAPI, Request +from fastapi.responses import JSONResponse + +from pybotx import ( + Bot, + BotAccountWithSecret, + BubbleMarkup, + HandlerCollector, + IncomingMessage, + OutgoingMessage, + build_command_accepted_response, +) +from pybotx.widgets import ( + ApprovalWidget, + AsyncJobWidget, + BatchFileItem, + CalendarWidget, + CarouselWidget, + CheckListWidget, + CheckboxContent, + ChecktableWidget, + ConfirmWidget, + DateRangeWidget, + FileBatchWidget, + FormWizardStep, + FormWizardWidget, + MessageMarkup, + MessagesPagerWidget, + MultiSelectWidget, + PaginationWidget, + RangeWidget, + RunnerHookResult, + SearchSelectWidget, + SelectOption, + SelectWidget, + TableWidget, + on_action, + on_completed, + on_data_key, + widget_command, + undefined, +) +from pybotx.widgets.async_job import ( + ASYNC_JOB_ACTION_CANCEL, + ASYNC_JOB_ACTION_KEY, + ASYNC_JOB_ACTION_REFRESH, + ASYNC_JOB_ACTION_RETRY, + ASYNC_JOB_CANCELLED, + ASYNC_JOB_DONE, + ASYNC_JOB_FAILED, + ASYNC_JOB_ID_KEY, + ASYNC_JOB_QUEUED, + ASYNC_JOB_RUNNING, + ASYNC_JOB_STATUS_KEY, +) +from pybotx.widgets.confirm import ( + CANCEL_ACTION, + CONFIRM_ACTION, +) +from pybotx.widgets.file_batch import ( + FILE_BATCH_ACTION_ITEM, + FILE_BATCH_ACTION_RETRY_FAILED, + FILE_BATCH_FILES_KEY, +) +from pybotx.widgets.calendar import SELECTED_DATE_KEY as CALENDAR_SELECTED_DATE_KEY +from pybotx.widgets.carousel import SELECTED_VALUE_KEY as CAROUSEL_SELECTED_VALUE_KEY +from pybotx.widgets.range import CURRENT_INDEX_KEY +from pybotx.widgets.select import SELECT_VALUE_KEY +from pybotx.widgets.base import ( + WIDGET_RESULT_MODE_EDIT, + WIDGET_RESULT_MODE_MESSAGE, + WidgetResultMode, +) + +MULTI_SELECT_DONE_KEY: Final[str] = "multi_select_done" +CHECKTABLE_STATE_KEY: Final[str] = "checktable_state" +CHECKTABLE_FIELD_KEY: Final[str] = "field" +CHECKTABLE_SET_COMMAND: Final[str] = "/_checktable-set" +CHECKTABLE_CLEAR_COMMAND: Final[str] = "/_checktable-clear" + +WIDGET_COMMANDS_TEXT: Final[str] = "\n".join( + [ + "Widget demos (new):", + "/confirm-demo", + "/select-demo", + "/multi-select-demo", + "/search-select-demo [query]", + "/form-demo [text]", + "/date-range-demo", + "/table-demo [query]", + "/approval-demo", + "/async-job-demo [queued|running|failed|done]", + "/file-batch-demo", + "", + "Widget demos (from pybotx-widgets):", + "/calendar-demo", + "/carousel-demo", + "/checklist-demo", + "/checktable-demo", + "/range-demo", + "/pagination-demo", + "/messages-pager-demo", + ], +) + +DEFAULT_DEMO_RESULT_MODE: Final[WidgetResultMode] = WIDGET_RESULT_MODE_EDIT +DEMO_RESULT_MODE_BY_COMMAND: Final[dict[str, WidgetResultMode]] = { + # Example: + # "/confirm-demo": WIDGET_RESULT_MODE_MESSAGE, +} + +SELECT_OPTIONS: Final[list[str | SelectOption]] = [ + SelectOption(value="dev", label="Development"), + SelectOption(value="stage", label="Staging"), + SelectOption(value="prod", label="Production"), +] + +SEARCH_OPTIONS: Final[list[str | SelectOption]] = [ + SelectOption(value="alice", label="Alice Smith"), + SelectOption(value="alex", label="Alex Johnson"), + SelectOption(value="bob", label="Bob Lee"), + SelectOption(value="chris", label="Chris Kim"), + SelectOption(value="diana", label="Diana Ford"), + SelectOption(value="elena", label="Elena Morgan"), +] + +FORM_STEPS: Final[list[FormWizardStep]] = [ + FormWizardStep(field="name", label="Enter your name"), + FormWizardStep(field="email", label="Enter your email"), + FormWizardStep(field="team", label="Enter your team"), +] + +TABLE_ROWS: Final[list[dict[str, str]]] = [ + {"name": "Alice", "team": "Platform", "role": "Engineer"}, + {"name": "Bob", "team": "Platform", "role": "Team Lead"}, + {"name": "Chris", "team": "QA", "role": "Engineer"}, + {"name": "Diana", "team": "Security", "role": "Engineer"}, + {"name": "Elena", "team": "Analytics", "role": "Analyst"}, +] + +DEFAULT_BATCH_FILES: Final[list[BatchFileItem]] = [ + BatchFileItem(name="sales_2026_01.csv", status="done"), + BatchFileItem(name="sales_2026_02.csv", status="failed", error="bad header"), + BatchFileItem(name="sales_2026_03.csv", status="running"), + BatchFileItem(name="sales_2026_04.csv", status="pending"), + BatchFileItem(name="sales_2026_05.csv", status="failed", error="timeout"), +] + +ALLOWED_ASYNC_STATUSES: Final[set[str]] = { + ASYNC_JOB_QUEUED, + ASYNC_JOB_RUNNING, + ASYNC_JOB_DONE, + ASYNC_JOB_FAILED, + ASYNC_JOB_CANCELLED, +} + +CHECKTABLE_OWNER_VALUES: Final[list[str]] = ["Alice", "Bob", "Diana"] +CHECKTABLE_PRIORITY_LABELS: Final[dict[str, str]] = { + "low": "Low", + "medium": "Medium", + "high": "High", +} +CHECKTABLE_NOTES_VALUES: Final[list[str]] = [ + "Needs product approval", + "No additional notes", +] + +PAGINATION_ITEMS: Final[list[str]] = [ + "Log line #1: accepted", + "Log line #2: validated", + "Log line #3: transformed", + "Log line #4: uploaded", + "Log line #5: indexed", + "Log line #6: completed", +] + +MESSAGES_PAGER_ITEMS: Final[list[str]] = [ + "alpha", + "beta", + "gamma", + "delta", + "epsilon", +] + + +def _multi_select_done_result(widget: MultiSelectWidget) -> str | None: + if not widget.message.data.get(MULTI_SELECT_DONE_KEY): + return None + + selected_items_list = MultiSelectWidget.get_selected_values(widget.message) + selected_items = ", ".join(selected_items_list) or "nothing" + return f"Selected values: {selected_items}" + + +def _form_after(widget: FormWizardWidget) -> str | None: + if widget.is_completed: + values_text = ", ".join(f"{key}={value}" for key, value in widget.values.items()) + return f"Form completed: {values_text}" + + if widget.cancelled: + return "Form cancelled. Click reset to start over." + + return None + + +def _is_date_range_completed(widget: DateRangeWidget) -> bool: + return widget.start is not None and widget.end is not None + + +def _date_range_result(widget: DateRangeWidget) -> str: + assert widget.start is not None + assert widget.end is not None + return f"Date range selected: {widget.start.isoformat()} .. {widget.end.isoformat()}" + + +def _build_file_batch_widget( + message: IncomingMessage, + bot: Bot, + files: list[BatchFileItem], +) -> FileBatchWidget: + widget_files: list[BatchFileItem | dict[str, object] | str] = [ + file_item for file_item in files + ] + return FileBatchWidget( + files=widget_files, + label="Batch import status", + page_size=3, + message=message, + bot=bot, + command="/file-batch-demo", + result_mode=_demo_result_mode("/file-batch-demo"), + ) + + +def _file_batch_retry_hook(widget: FileBatchWidget) -> RunnerHookResult: + retried_files = _retry_failed_files(widget.files) + return RunnerHookResult( + widget=_build_file_batch_widget(widget.message, widget.bot, retried_files), + should_display=True, + ) + + +async def _calendar_selected_result(widget: CalendarWidget) -> str: + selected_date = await CalendarWidget.get_value( + widget.message, + widget.bot, + send_feedback=False, + ) + return f"Selected date: {selected_date.isoformat()}" + + +async def _carousel_selected_result(widget: CarouselWidget) -> str | None: + selected_value = await CarouselWidget.get_value( + widget.message, + widget.bot, + send_feedback=False, + ) + if selected_value is None: + return None + + return f"Carousel selected: {selected_value}" + + +def _range_after(widget: RangeWidget) -> str | None: + if CURRENT_INDEX_KEY not in widget.message.data: + return None + + if widget.result_mode != WIDGET_RESULT_MODE_MESSAGE: + return None + + current_value = RangeWidget.get_value(widget.message) + return f"Current stage: {current_value}" + + +def _build_checktable_widget( + message: IncomingMessage, + bot: Bot, + state: dict[str, str], +) -> ChecktableWidget: + message.metadata[CHECKTABLE_STATE_KEY] = dict(state) + + checkboxes: list[CheckboxContent[str]] = [ + CheckboxContent[str]( + label="Owner", + command=CHECKTABLE_SET_COMMAND, + checkbox_value=state.get("owner", undefined), + data={CHECKTABLE_FIELD_KEY: "owner"}, + ), + CheckboxContent[str]( + label="Priority", + command=CHECKTABLE_SET_COMMAND, + checkbox_value=state.get("priority", undefined), + mapping=CHECKTABLE_PRIORITY_LABELS, + data={CHECKTABLE_FIELD_KEY: "priority"}, + ), + CheckboxContent[str]( + label="Notes", + command=CHECKTABLE_SET_COMMAND, + checkbox_value=state.get("notes", undefined), + data={CHECKTABLE_FIELD_KEY: "notes"}, + ), + ] + + return ChecktableWidget( + checkboxes=checkboxes, + label="Ticket fields", + uncheck_command=CHECKTABLE_CLEAR_COMMAND, + message=message, + bot=bot, + command="/checktable-demo", + result_mode=_demo_result_mode("/checktable-demo"), + ) + + +collector = HandlerCollector() + + +@collector.command("/widgets", description="List all widget demo commands") +async def widgets_handler(_: IncomingMessage, bot: Bot) -> None: + await bot.answer_message(WIDGET_COMMANDS_TEXT) + + +@collector.command("/confirm-demo", description="Confirm widget demo") +@widget_command( + before=on_action( + lambda widget: ConfirmWidget.get_action(widget.message), + { + CONFIRM_ACTION: "Confirm result: confirmed", + CANCEL_ACTION: "Confirm result: cancelled", + }, + ), +) +async def confirm_demo_handler(message: IncomingMessage, bot: Bot) -> ConfirmWidget: + return ConfirmWidget( + label="Confirm deployment to production?", + message=message, + bot=bot, + command="/confirm-demo", + result_mode=_demo_result_mode("/confirm-demo"), + ) + + +@collector.command("/select-demo", description="Single select widget demo") +@widget_command( + before=on_data_key( + SELECT_VALUE_KEY, + lambda widget: ( + f"Selected environment: {SelectWidget.get_value(widget.message)}" + ), + ), +) +async def select_demo_handler(message: IncomingMessage, bot: Bot) -> SelectWidget: + return SelectWidget( + options=SELECT_OPTIONS, + label="Choose an environment", + message=message, + bot=bot, + command="/select-demo", + result_mode=_demo_result_mode("/select-demo"), + ) + + +@collector.command("/multi-select-demo", description="Multi select widget demo") +@widget_command( + before=on_data_key( + MULTI_SELECT_DONE_KEY, + _multi_select_done_result, + ), +) +async def multi_select_demo_handler( + message: IncomingMessage, + bot: Bot, +) -> MultiSelectWidget: + summary_bubbles = BubbleMarkup() + summary_bubbles.add_button( + command="/multi-select-demo", + label="Finish selection", + data={MULTI_SELECT_DONE_KEY: True}, + ) + + return MultiSelectWidget( + options=[ + SelectOption(value="email", label="Email notifications"), + SelectOption(value="sms", label="SMS notifications"), + SelectOption(value="push", label="Push notifications"), + ], + label="Choose up to 2 notification channels", + max_selected=2, + message=message, + bot=bot, + command="/multi-select-demo", + additional_markup=MessageMarkup(bubbles=summary_bubbles), + result_mode=_demo_result_mode("/multi-select-demo"), + ) + + +@collector.command("/search-select-demo", description="Search + select widget demo") +@widget_command( + before=on_data_key( + SELECT_VALUE_KEY, + lambda widget: f"Selected user: {SelectWidget.get_value(widget.message)}", + ), +) +async def search_select_demo_handler( + message: IncomingMessage, + bot: Bot, +) -> SearchSelectWidget: + return SearchSelectWidget( + options=SEARCH_OPTIONS, + label="Search user by name", + page_size=3, + message=message, + bot=bot, + command="/search-select-demo", + result_mode=_demo_result_mode("/search-select-demo"), + ) + + +@collector.command("/form-demo", description="Form wizard widget demo") +@widget_command(after=_form_after) +async def form_demo_handler(message: IncomingMessage, bot: Bot) -> FormWizardWidget: + return FormWizardWidget( + steps=FORM_STEPS, + label="Profile form", + message=message, + bot=bot, + command="/form-demo", + result_mode=_demo_result_mode("/form-demo"), + ) + + +@collector.command("/date-range-demo", description="Date range widget demo") +@widget_command( + after=on_completed(_is_date_range_completed, _date_range_result), +) +async def date_range_demo_handler( + message: IncomingMessage, + bot: Bot, +) -> DateRangeWidget: + return DateRangeWidget( + label="Pick start and end dates", + message=message, + bot=bot, + command="/date-range-demo", + result_mode=_demo_result_mode("/date-range-demo"), + ) + + +@collector.command("/table-demo", description="Table widget demo") +@widget_command +async def table_demo_handler(message: IncomingMessage, bot: Bot) -> TableWidget: + return TableWidget( + rows=TABLE_ROWS, + columns=["name", "team", "role"], + label="Team directory", + page_size=2, + message=message, + bot=bot, + command="/table-demo", + result_mode=_demo_result_mode("/table-demo"), + ) + + +@collector.command("/approval-demo", description="Approval widget demo") +@widget_command( + before=on_action( + lambda widget: ApprovalWidget.get_action(widget.message), + { + "approve": "Approval action: approve", + "reject": "Approval action: reject", + "comment": "Approval action: comment", + }, + ), +) +async def approval_demo_handler( + message: IncomingMessage, + bot: Bot, +) -> ApprovalWidget: + return ApprovalWidget( + label="Approve release candidate #42?", + message=message, + bot=bot, + command="/approval-demo", + result_mode=_demo_result_mode("/approval-demo"), + ) + + +@collector.command("/async-job-demo", description="Async job widget demo") +@widget_command +async def async_job_demo_handler( + message: IncomingMessage, + bot: Bot, +) -> AsyncJobWidget: + status, details = _resolve_async_job_state(message) + + return AsyncJobWidget( + job_id=_resolve_job_id(message), + status=status, + details=details, + message=message, + bot=bot, + command="/async-job-demo", + result_mode=_demo_result_mode("/async-job-demo"), + ) + + +@collector.command("/file-batch-demo", description="File batch widget demo") +@widget_command( + before=on_action( + lambda widget: FileBatchWidget.get_action(widget.message), + { + FILE_BATCH_ACTION_ITEM: ( + lambda widget: ( + f"Selected file: {FileBatchWidget.get_selected_file(widget.message)}" + ) + ), + FILE_BATCH_ACTION_RETRY_FAILED: _file_batch_retry_hook, + }, + ), +) +async def file_batch_demo_handler( + message: IncomingMessage, + bot: Bot, +) -> FileBatchWidget: + initial_files = _load_batch_files(message) + return _build_file_batch_widget(message, bot, initial_files) + + +@collector.command("/calendar-demo", description="Calendar widget demo") +@widget_command( + before=on_data_key( + CALENDAR_SELECTED_DATE_KEY, + _calendar_selected_result, + ), +) +async def calendar_demo_handler( + message: IncomingMessage, + bot: Bot, +) -> CalendarWidget: + return CalendarWidget( + include_past=True, + message=message, + bot=bot, + command="/calendar-demo", + result_mode=_demo_result_mode("/calendar-demo"), + ) + + +@collector.command("/carousel-demo", description="Carousel widget demo") +@widget_command( + before=on_data_key( + CAROUSEL_SELECTED_VALUE_KEY, + _carousel_selected_result, + ), +) +async def carousel_demo_handler( + message: IncomingMessage, + bot: Bot, +) -> CarouselWidget: + return CarouselWidget( + widget_content=["Paris", "Berlin", "Prague", "Rome", "Madrid", "Lisbon"], + label="Choose a city", + displayed_content_count=3, + loop=False, + inline=True, + message=message, + bot=bot, + command="/carousel-demo", + result_mode=_demo_result_mode("/carousel-demo"), + ) + + +@collector.command("/checklist-demo", description="Checklist widget demo") +@widget_command +async def checklist_demo_handler( + message: IncomingMessage, + bot: Bot, +) -> CheckListWidget: + checked_before = CheckListWidget.get_checked_items(message) + widget = CheckListWidget( + widget_content=["Build", ["Deploy", "Verify"], "Notify"], + label=f"Release checklist (checked: {len(checked_before)})", + message=message, + bot=bot, + command="/checklist-demo", + result_mode=_demo_result_mode("/checklist-demo"), + ) + widget.widget_message.body = f"Release checklist (checked: {len(widget.checked_items)})" + return widget + + +@collector.command("/checktable-demo", description="Checktable widget demo") +@widget_command +async def checktable_demo_handler( + message: IncomingMessage, + bot: Bot, +) -> ChecktableWidget: + state = _read_checktable_state(message) + return _build_checktable_widget(message, bot, state) + + +@collector.command(CHECKTABLE_SET_COMMAND, visible=False) +@widget_command +async def checktable_set_handler( + message: IncomingMessage, + bot: Bot, +) -> ChecktableWidget: + state = _read_checktable_state(message) + field = str(message.data.get(CHECKTABLE_FIELD_KEY, "")) + + if field == "owner": + state[field] = _next_value(state.get(field), CHECKTABLE_OWNER_VALUES) + elif field == "priority": + priority_keys = list(CHECKTABLE_PRIORITY_LABELS) + state[field] = _next_value(state.get(field), priority_keys) + elif field == "notes": + state[field] = _next_value(state.get(field), CHECKTABLE_NOTES_VALUES) + + return _build_checktable_widget(message, bot, state) + + +@collector.command(CHECKTABLE_CLEAR_COMMAND, visible=False) +@widget_command +async def checktable_clear_handler( + message: IncomingMessage, + bot: Bot, +) -> ChecktableWidget: + state = _read_checktable_state(message) + field = str(message.data.get(CHECKTABLE_FIELD_KEY, "")) + state.pop(field, None) + return _build_checktable_widget(message, bot, state) + + +@collector.command("/range-demo", description="Range widget demo") +@widget_command(after=_range_after) +async def range_demo_handler(message: IncomingMessage, bot: Bot) -> RangeWidget: + return RangeWidget( + elements=["Draft", "Review", "Approved", "Done"], + label_template="Current stage {index}/{total}: {element}", + message=message, + bot=bot, + command="/range-demo", + result_mode=_demo_result_mode("/range-demo"), + ) + + +@collector.command("/pagination-demo", description="Pagination widget demo") +@widget_command +async def pagination_demo_handler( + message: IncomingMessage, + bot: Bot, +) -> PaginationWidget: + widget_content: list[OutgoingMessage | str] = [item for item in PAGINATION_ITEMS] + return PaginationWidget( + widget_content=widget_content, + paginate_by=3, + delay_between_messages=0, + message=message, + bot=bot, + command="/pagination-demo", + result_mode=_demo_result_mode("/pagination-demo"), + ) + + +@collector.command("/messages-pager-demo", description="Messages pager widget demo") +@widget_command +async def messages_pager_demo_handler( + message: IncomingMessage, + bot: Bot, +) -> MessagesPagerWidget: + return MessagesPagerWidget( + elements=MESSAGES_PAGER_ITEMS, + page_size=2, + item_template="Message {index}/{total}: {element}", + delay_between_messages=0, + message=message, + bot=bot, + command="/messages-pager-demo", + result_mode=_demo_result_mode("/messages-pager-demo"), + ) + + +@collector.default_message_handler +async def default_message_handler(_: IncomingMessage, bot: Bot) -> None: + await bot.answer_message("Unknown command. Use /widgets to open demos.") + + +def _demo_result_mode(command: str) -> WidgetResultMode: + return DEMO_RESULT_MODE_BY_COMMAND.get(command, DEFAULT_DEMO_RESULT_MODE) + + +def _read_checktable_state(message: IncomingMessage) -> dict[str, str]: + raw_state = message.metadata.get(CHECKTABLE_STATE_KEY) + if not isinstance(raw_state, dict): + return {} + + state: dict[str, str] = {} + for field in ("owner", "priority", "notes"): + value = raw_state.get(field) + if isinstance(value, str) and value: + state[field] = value + + return state + + +def _next_value(current: str | None, values: list[str]) -> str: + if current not in values: + return values[0] + + current_index = values.index(current) + next_index = (current_index + 1) % len(values) + return values[next_index] + +def _require_env(name: str) -> str: + value = os.getenv(name) + if value: + return value + + raise RuntimeError(f"Environment variable {name} is required") + + +def _resolve_job_id(message: IncomingMessage) -> str: + metadata_value = message.metadata.get(ASYNC_JOB_ID_KEY) + if isinstance(metadata_value, str) and metadata_value: + return metadata_value + + return "job-42" + + +def _resolve_async_job_state(message: IncomingMessage) -> tuple[str, str]: + status = _resolve_initial_async_status(message) + + if ASYNC_JOB_ACTION_KEY not in message.data: + return status, "Use widget buttons to move the async job state." + + action = AsyncJobWidget.get_action(message) + + if action == ASYNC_JOB_ACTION_CANCEL: + return ASYNC_JOB_CANCELLED, "Job cancelled by user." + + if action == ASYNC_JOB_ACTION_RETRY: + return ASYNC_JOB_QUEUED, "Retry requested." + + if action != ASYNC_JOB_ACTION_REFRESH: + return status, "Unknown action." + + if status == ASYNC_JOB_QUEUED: + return ASYNC_JOB_RUNNING, "Job picked by worker." + + if status == ASYNC_JOB_RUNNING: + return ASYNC_JOB_DONE, "Job finished successfully." + + if status == ASYNC_JOB_FAILED: + return ASYNC_JOB_FAILED, "Job still failed, click Retry." + + if status == ASYNC_JOB_CANCELLED: + return ASYNC_JOB_CANCELLED, "Job is already cancelled." + + return ASYNC_JOB_DONE, "Job already done." + + +def _resolve_initial_async_status(message: IncomingMessage) -> str: + raw_status = message.metadata.get(ASYNC_JOB_STATUS_KEY) + if isinstance(raw_status, str) and raw_status in ALLOWED_ASYNC_STATUSES: + return raw_status + + argument = message.argument.strip().lower() + if argument in ALLOWED_ASYNC_STATUSES: + return argument + + return ASYNC_JOB_QUEUED + + +def _load_batch_files(message: IncomingMessage) -> list[BatchFileItem]: + raw_files = message.metadata.get(FILE_BATCH_FILES_KEY) + if not isinstance(raw_files, list): + return list(DEFAULT_BATCH_FILES) + + files: list[BatchFileItem] = [] + for raw_item in raw_files: + if not isinstance(raw_item, dict): + continue + + name = raw_item.get("name") + status = raw_item.get("status") + if name is None or status is None: + continue + + files.append( + BatchFileItem( + name=str(name), + status=str(status), + error=str(raw_item.get("error", "")), + ), + ) + + if not files: + return list(DEFAULT_BATCH_FILES) + + return files + + +def _retry_failed_files(files: list[BatchFileItem]) -> list[BatchFileItem]: + retried_files: list[BatchFileItem] = [] + + for file_item in files: + if file_item.status in {"failed", "error"}: + retried_files.append( + BatchFileItem( + name=file_item.name, + status="running", + error="", + ), + ) + continue + + retried_files.append(file_item) + + return retried_files + + +def _build_bot_from_env() -> Bot: + account = BotAccountWithSecret( + + ) + return Bot( + collectors=[collector], + bot_accounts=[account], + ) + + +bot = _build_bot_from_env() + +app = FastAPI() +app.add_event_handler("startup", bot.startup) +app.add_event_handler("shutdown", bot.shutdown) + + +@app.post("/command") +async def command_handler(request: Request) -> JSONResponse: + bot.async_execute_raw_bot_command( + await request.json(), + request_headers=request.headers, + ) + return JSONResponse( + build_command_accepted_response(), + status_code=HTTPStatus.ACCEPTED, + ) + + +@app.get("/status") +async def status_handler(request: Request) -> JSONResponse: + status = await bot.raw_get_status( + dict(request.query_params), + request_headers=request.headers, + ) + return JSONResponse(status) + + +@app.post("/notification/callback") +async def callback_handler(request: Request) -> JSONResponse: + await bot.set_raw_botx_method_result( + await request.json(), + verify_request=False, + ) + return JSONResponse( + build_command_accepted_response(), + status_code=HTTPStatus.ACCEPTED, + ) diff --git a/img.png b/img.png new file mode 100644 index 0000000000000000000000000000000000000000..d28e5ba86f0ee57ac93f7c3a9c6b88b41df565b9 GIT binary patch literal 39731 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 Uc#Tma?R5S9ANufAax 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

S@)5avThOyvc%;yu#Z^Tgm0F zF-$x2p1dlqK>9n3_q?2(0BQP%GJn>f$;WETC>jBVt1w}r9h-Z~n5lZ7k8@W@L4&T5 z(8zACR|7f_7+iNU_u3Ar{<2_fZizZR^!m!}FqPy?SPd32%`4Ui=HoZ@@B!?=X$^l5_*kHB87fXdV4#PhOw zPbp^Z$*7i<=a+-x)8?U+%+*@7DS}ng81xhO+>-XRHl7LrVwUA&2Y$Xe&-ZWC9MSit zz>inm^qM1POi3;=zD;f=_eookRYNYPY%H0J@v+H4DWVeoIWJB%sXR^1Q3tCh@@lAB zzo{hZAmvc;43a^TBLYoRP)uG`l@akg&$(uK4@N>>PFfy$5+I2efZsoR&@>m`h&Pg4 zA1P?Us0afDMC!ujeYqQDibLLz)k9X5R#s15hp8g!Eo}(D`}IKwkyOhh`j1Y|-|aSu z3Hg4rRK^SIsj%9_WIUrzL_9K(si#>mv|Z7bn%~aBMC3x;qc`a*@+B=q{(LWhoxd;U zHO3!uAj|Vcu<+dY;*o=9o+c*=y0Y^4OMX1(Z~iU>Z>8@_yUo)*O+pYm-&fsFrg#>8 zgo_C!QT)a|h_;ujHqY~K)R>I_hg>nCEotW*G=0qfSasnRyuveiP$aMTYs%!Xk1>@a zS(ukUm4s{%I3ch2Yu}iF5wf8hbHnw>ykd;kaaR%{lON*~1Fy_zD(YnN^`Xl!%_EZ+ z{dBDf8Oziac`~MG`=32%N@LJz;xJokb(-Zf?7sn6X<#NCM%{8lz)G;eylCNQ7^Vpp zWj!rn=Roe@gSCbBB9{xUKmMxz)Ri<-S+9!HG4Adn0MVD6JTAb=>p}ZdcOq%2BLP9Y z?}Ea;0i-o+zRrM_a2CVU?pXdF#N}Gwm3!k8`bMNa$_0k{n&;^|9t1SG4k=-g)^p8s zpYH}_azH72SK4o_{GJwBy~hg+X3zzRS)PTkMxe{x&OQ6a*bl7t%=7viHAlwVjD=C3 zw$N0D?vVx=hOkyY2xNHI1oLn;M#K8gfb=IDBl2PhIP&tRf^7bfG0D=7LQ%dqR(LOp zBe}$Z5VhsY#Q2TVXo=l8rEcS_KbMAiZ6X{ zP5+j#If{F2fAt-`w>}TI=>1keIOLbO2DgOJmzB@z>^gqlpOw+-zAaf8>MSq z_M39#n!M^-?{64nq zyRvvHbvf$qf!)Cu9IaZV*j)7mUf(n#A_H{j)+`b*K5VMWhaSl&GrR`zbO zw5NUq@=3X@pluIT+ZyfVq3j-Yo4(TuC|l~B_=t!4pe}l|@M*t2qwa@$tF!cgxE)U= zC?E1mIneHCt6fNd0m_KDsjszpd**&DA1L34vU;cP)8{JR zdTpW+NJh~|sJ}INIq7+v9)U7MCXfgFoz*XSC<<48IswU(uB_hZKbx}u>+^oE=bMMA z(=B#Qx@fC=`nZa!|dk%*u{Fp|FY1 zWK}M&dg)_%I;j)MwlwZeUq7(+Ei%jja<2AxtZbEnZn72hu@7Dm~m& znkWz|o_jpAFbcwriK$aixTM1b3XN~f(?Mg2%Oq{^bPA;@ea1T?M}?Kfoq{~40*f$- zgF2$_D8IODcupE=%=qJ)awhH#**!W4_v9afq7kNXPZc0J2{``uG!QpsN9TVqBSr-1 z1KEG_m-lg?B3;-IODPW8@F%st{qGUY3^0jvEW| zl)}O(@W=bHyov{h_(RsK{UL{Fx7Gf$)qYc^?$^_q#@#8*Ku}PK{5Oqm)Egd|;5Vb+ z)mcMB2r&{!185Y4O9pAQWKM)bT>P)ZH-HA@#7xE^XBDDG-Ks=|O@SKu6vW#Oh=a7M z5fMLeo5mZFid9t7*nr59PMQi}{He36QP*p1dWR0mdxWd}S~&`d)}=6cXJtNWlQ2}- zSN`Yz;s!gFAYR&p2-?b^0j&`r40(4|-k$hBS^HETHP~A}=yk%oog5IjmL?)}lEeyO zb)Elb5W@3Lx7i}lr|2VbJ*)nCPFtd%8F>$S{ZG~wW5_RkI7aHP6)0?xwuq3vCZf`F z$e%WZMv0#^tY&~Uh(5b^z%6E`KqO^mgU){9^fpX;q^?Pq6a@)3&K6{L=n(zo-qy&nRo^kABHO zvLdTuRKlM^a^w$!fdZvrdBbzzt3=Q!8xh|106{>E6uPt*2}KFxag8r0!Y&#Te)CZS zVNht55#(4-U~Q(a9*A3w1yEiZMDUz@q=&{6r-1=SEkXyB!+3&NX5$)5EkX95$;ru#8S|>tuAx2(ugqimjZ1Q0oXUA}JLYg$i zeaPk2Rx{f}pekGZr-a!_h*+#IRb=USZQIk}ZE-07UC|`B__NIk`I!RJ=Q51CZFB%l zdQ^V25z3J8v0BkiAivl@@e;ntq@mnmnae8Luw)f-i*S&gX`G#ckt2{WRc1((jX3(8 zFq`c-MWAC!BP4_T)`(SRAMP3PjOC3l8YvKl6%Y+H9t910=bwtk2F#o};M%Ndu=#zi zHA3XKNXkqPL!Kwn&UH$D_z`)=qq;^Ahr|0Csk`>-gAE8ngNj%a;93pL8d=`xOkg*W zhIT=Eh@ZUE@fh?p+Quk<-sPIM*~ln1g=vc;E)<%HyA`BqQ(sH{wFBB2EUnI|9<=4Lt{aXCC8 zt~$`*pixxFF$Rf~#$#kv;HMpEgk__ve%H!0LK9Ki=z<2Acjn5-E6-#+3bINbo;q?A z5W>uV$lStzgtJDH_@U!)k2G1w8FTWBM_Sw?EcwBIr{;GkQv?K~(^_OF;ar5&?^J?v zF_TNK(Kgf0lwNNu6SeYspe|PRx>n;O)8@%_I)F6O=_$934BmRj!s<+lr&!Z7RtFRP z*8+Z5Y#I&sZWs;^Z5|B|X4m&+*Y~U+4i9V`8TWiuH_t~Z_tUUC1?6L9mYxT)_*QHp zzUJ~(gi5$sK9*;BAW!#X;F`D|%JO-C*NEkvG9aJaFA7889_51n)%owK0C8D7UBhAN z`XP&t^eWyeE6k{bkv6y@%g8efYmW3yb=s&X;xJcVfJg!Q-u#%c|}% zOWS=LMl4Ly6PHz5enm**s0I9P=yz*VqeNLqj&bLk3ZW4TV+nIc^3qm)p2jEFtAy!h zij*{MC1Or8X*`{V(kxAlYX%RPcC^wDNXTQdFmr3)MDvmelf0z%{dT|zOhnwNFsA~P z(aIh#H#3E`puLelU$8N;d~1PsG%%B?zf%K~?Fl+K1HxsQaK3(dPgrrT!{@qj%EyT0yP& zrvik3&AmNg$+Dhs_nN`5ad7hW4Ry(JDuIx~zAQ2{wSL&mt`J{k{*&iJ{wy{J@(y-u zH~sqZ(P$RkmvwqN{EFdl5upZgXx<6!K^h^QUuIVPXkuF?S2M-t8YCoxzh;GMCn0T8>Cs{Yx7}CG zz3$H^nYoWYTk>5H=3fGAg=t+~f`lxQ4~<@GB^OryMW^}vKaCUlG(5oWPKt0&wLP!NPPMTiprkRGP4>NT5` ztN!#pf{=GKCz^)8JyDcrh*FD+;%At_SiIm1k=kDY{76FFJ}4i`0Fq)5VROj&GX@xt z76YN!JY27wWPPaTN8zxTOWHhJTbh~Y+|hs-nbX7kbVJs;(@tNaM2W_6Q>IB`ZpF-+ zYLCc@mdP;|SP%h%pVd(aDS!r8OYmp`Mtph;0#kEGgeNle`A6T5kZ$UY(~t_r^!HT3 zR1$dG z(l9y3og5)W09w{8bC_>saLs7Lpf8@OB^VHZG1>7O@?c~S;h-@hxR}qYES;`ng0wj# zo40aujyJrfemezQNYa<*z2Emlk#}je+Rgz1kbeA=PTon0{?8R=zU-@>UP9Saw(5*k z&8ZL}b#DY1ttMm81v%0-AWHmFt|~u~X*{o63;1IZ5dY1jJ;ke3X#>oclU~dBSnKVP zj(f+d0h=$mdF{kbUZO;a=5b5bmli)T7_Pg&*W?o1Bc-h-ImTpYX0V(L8ReVSr`4so z;A1l<0c&xM%wx@HM>=)F1SLec#qYTwE8a*?_}WvYIY|jy{+q_pL>iibv|ZDj^R(M$ zR{@e9t_p37W_p%s6tCfT@yUz5pf%hs3VwcjD8LN)>^SzY7_$c!p8A%&W}^0{o`t zSmM*docO*IqnqV4M}?qt%~fVOCvX$EQ=m;!E~FvWcq$n4`B7~*koMTg_}hijLfO$E zNF!jdV<+hhR*&#&MW|C}vMNAmG(1kVA>1l4x+W*BTLUmaJJMi6Wom7N0SQ_q?J^@t zTP+;>O@=;N0wND)nBaQqQM@{b_Ywh8hAxsyK99s6q+q{CLH8azI(b&qnLuG*sJKOrp+ z^44)zq?xa?NF$~_RPvJ7ZyHt#{7~M&Hmm3L5fh&Xmvqox7{EBujn@)o1}!2#nX6;J zv{y{>gh~C7KL&iJL0X&b{CuP3BOhQ8wpLt|HrE=fRt)kd64kqDcmgMk+`DebO{xW* zyF`f+twW~On;z^ljzH!iuPWq-u+aH+nj1n;A&fNIwgoq)DS4;&IY$>p{7w&k<~;;z z+S%I$f&}xFYb5p0)|1eY84tqZJtzFuw4oFxphxo!__>g`^2-HbyWtC+42QuGb&kms zVXkB6C>!b*A~Dl=KG#Q{T=;vrH+rTabAu2TaoM0LCnT9z315Q;8YJ~Xny4oYvV4%^ zX7vhD4p)ga27X0GkSu#(6+ZDoq*J+tgM1Pfbx%6Er+On@Jcl$%JN|qc!q3{QW&Y@)<=;s$P6P#Iw{}Oi-inCr#VJO+BRoogy|%p z#W=AkEA7+(Ar+s<-Y$qoW-$bfOjDC0H+5=W)6IQVL7!@+?Vwg!v;&C3glfUFW)YjC zrRDHnWJKAR#UQVD8VqE`ph+4a^-BGxVHZIpVBZZK$oGCm_2H(`e2|5v6XWi413Ir)mTIt?3u<>hIn{isjLkF;DXzrpGNROVLdLFRvAT%jfM~q2>HG1LD1X3iDiInj;}c_0fu16)i%m{^HTAjezqGoGzhH1w;z`pl$MQ zBmNr!Vd2M z+GBeI4cAzlP}l@-WC-y>bbWqujQq+(7{4!Jk6D)YNEg~*8c!{dc4?Bfkfz`3(w^no zBw_n=pDU*RXh&vN%@^~yKhF>E10(o8?W2_T>-DU!-KY8K6np^V15D~PHJ$Pd0>p1x zf6^S?yjtyd{HD&^B}d*_aL=Z2?xK5a<8%5v_IK4?8^U>u?yc*ub&Q4c7T*`HymNg< zNaOQC+}!6mzpsC2IGi^B*0AJ(fl2esbI5Hne??H9&&~3jJ}dDTf&y{`6>@|`SWLjR zn;ge4#3}03jX+vYyQ6jDW=<4=YQizUXIkT6Rl|{g1PcVXAL4<8 zY%sM&pX6$sAmgy88xfl32CZ)MMoK!VGuI}g6{-1iOyevhiodKu9yFkMAbSRRH@b+Z zRS=)FJ=zv!N4j|?&6x70uE~?#kKVU>9`&gVrZ}i`g~fuLcF6JW?hwBJ%RR&UKlT}0 zd{8TlyEccg>;8v_*S+~2;rbOrHT|^$!n$$QNO;G-A=6o>wmpal+A*z~pw3Nh@qCd9^uc^zrD41#WY>^TexG->Ers{U zFLP=LFGlX|q_G(g2U-Ma&~N^uwYdi5=4+nY?<{SrZS`>LCP8U7A{H|}M_MTV(|f?* zscPx?S)a?Q=Y*O>Vy z-BVS!YKOA2@Sn7iRxB;1H4gbS1m&+bTSSspPyP8vvU7rOM{~sgZR;NnZ+p)N!?%94 zs}UvlF<(LqcW$hjIr;swJ!XfOzG9bfL#Daim5~y}RAdIdqs!mtfBK9#@7U%L)WPo9qT+srS&fB4(|>^WNN;`{r;+!HUzG~SJsJmZ)2#Azb^XJ5NC zJo|Ys4CgOdW+a=YCk5g09_hQM7gC-bUi|V`jU&g~*5~E335~Rxf8r(2%A-H`cgU;d zxxhrry-IimRS{OHKmsq>M0DgasqVVTevXk9o#)Mg^f%}lyaTDeEsx$pj} zsI;g_U`JQ$LLi{GJ_>WD;yhl2vF`NG(U-+cFwL^{w z^K0(i9G>(17l%Vnxx`2TAr6tuJoc<`)LB=CYnSy@1UuRr1jT^^JmVb*N&=tw3G+`E zUl$HI>hy5ZCD+?;rHgCG?YQ%X9Sc4@4Ac$L|E__-0xycs3a%Ffgm3LB$iMI%q&b$23$%=mlZK5OKzS zB!s7`42l3LVovPN=N^?8NKD$cG(FQKazB=S2y1wv3AQNx$}^-PKa^cM7~q=tiA!^5 z{AO!Kda{cKEO9){{dU4MO&m5Sn-2__XJilo2%k29AI;~XNdgw<#3onGJ96y=>H8;( z%BWQk7HLr3$n34D1UET*eFDCOu6c0MiXVP6u%N8fPi(M}TS?j>M+E)x=Pe9Rd*-uk zPVcTvb3EXv)524q{;W(}dS!V2i(ejge$AW0nG5a=_x6SG%f07j_g)r0{<*J)*S_T) z;khq-NqE(3-xw~s;ekxZvtZ`o@E_m%S$O(0pA%m8%3Z?Kp7HGP?H~Wv?n68`X2kQc z>|Nq}`Kw+Np81^Tg)jZr4>H0VHqsP1K9JSNIg6GWDgDo{_sTTdhb!br9xuM}!SLj# zK0Tar`AuPIrrpgw@%-?@m+TZ?m!)Z^SHIQ>{JbUigyS+|<@aCz^4NZ#XFoT*c&ArogNhf0 zx4i3pVZqXkR(5m#cz*WmdEwu`_U-W6H~({ZQkKRKfBK7-hn-*h=J2AIy)r!IY0n5p zoPK#m=<*zT6|P&wlO;Ee}`RzScDQG>wl)P~J7lye{mW7T#+Bw`GKP+d99#CByCO zw%Y&HpP?Q(y4k8ed9^E0Qca^#NMNH$*ql=?fPA#>*ZgPB5n(dfnWaU<2zaj@?Y0>> zIk~wMftfDdCvP@qmTMajXiSzSJV#s`7NG+9N#g^2`JVjoj%lR1u%_;%jq$FwR3NOC zHies(4P>Y}N?_*Bfr&@_wThI8l{Pdn%D{-8fx}pQ2!M{1^Ky*mP#GL(jya91Rk+#I zNsM?Ibl5hhyp3t!t4Nb;%R^55HsHuRWV|mnF7tNC5i{!dez8Y*^E=*W&6n&a)6@INjiUPx?CrqL}M2;u+zcvpLV>J>K|As&79RYst5 zGg3i=g8Y85=j?F#?GJ^Qykh6@-CyjU-QQ+$|8GQ&kn!Ul{{$n)+tzP2^7{IBe;V!| z3Z}_@?mzxJ?0v|IrtO}1$#vnexnIqxaz6%fQx-qneP(##lb;$+xL{G1zmahK`PVve zWke6TUv$IrEd9?7zu0R|_IoVT6xSP>efDeLF%vB0_^3xc%AVh{b~qe=!L{N4{@=e1 z@BF|=Gc9yOrj_=Gx4!%R;k_UJl*LE>AM@D9g}vsTkdg0jxcs(N;SFznS9n)e=INrO zM;^ACiTJt)`?Iz*G|pUH-*lY6_rUn~7(6j}5pG)D+EIzOW#xL=eIw!GdxpcUYx$1j zmT=Y`gWQ8>jm#?z*c|Om(|EDZuDi)z~Kb>DA zJ{w33`+TOYOwEbJG}XLZ5ZKa66~Co7C#N)Rl{reZp!((0z%@VUJD_PN+&>YeBuFr%P z&+qLI;S-<#dicP{Kbt+@mI?k3gm-=5W8sXeZZk9D8CTwxX-sblU--}OWoa7=FUT~} z@Bea-a9_XA3qnc|-IaH)3pcG93%k7jt>H6Y`Br#!_8$#Wb9N9(N{)}uNF2huz3bud z_V;`!yylH>4~L(6Nk&3lVcDS1mlFP|^KUV7JoD;1>>l~qWA5=rPE z^8DKa4iESA`5fl=vi!gLb#Jz7NPL&qzs1bL#K$1ukdrSC|CkZx1=lUhH12H^>+KPN ztwvtwUa=^gdhR9Rq%$uFm)~%o5gqk+)om-n2`8T(uFU?kz>2nLZ8yVB8S$NSxxaUE z_TCjYE(^D2^~n3DoPAL^^_+|C*@>r~6&5aCKMB!}$L-lb>Y}B?;WNjq4*z-bIwQlq zFYgZTn)^^V@umUOAk%m1k|Qu}q2EXSGV4g-xzKyqh=^+uP%|*WJABlwC&mXiZQsb2i8=B-gkz!Q%NOEa~4jnVqe?Qta{LSC|f3|9t{PBO6 zH@qdh<(==#%D*Sm9M20+d**X|-Y_dS{=evDuP_oOEEWWP|5tlkIbo*$mydipeCU&( zt1L|N`Num=n?(CATF~@J0EBnNP4|b>&%fMAa=~3|jm&ObIUMHSygZzK!R6t^)6UKa z@7{1*md7h@S{BZ}^je#1z5K@evgcR$dv~tM-aFegNZwttyf<8*X`H4nU52ZrhY_@X&kYp9fNX+36A%Q7VrSuV$tuKk=`u|b1I;;Xy7HH zgp6cf#*Z{=X`DJpAPuisV5Wu0C|~j|qGPZ?pOHpx<+i1&A;trk>YSsuZ_=gJs*0yo zazqd#fSF&s{I=C5tTAIg=LIjeMJc{eCfK5v3o`P7SRhB{3S)Box3Bz{kt1eQ$b#QD zuNgJs#l*>;#2Yffc3q}LF)#StU;M!|PTnUCm)^3{_7Y+?+d0#yFpsj><8ZKR(CF^8UVkWkknG7>qSwcyTi3x@>;&$jTEcfH@{K$*wn z9-1S+NjGso*pwFweikq9Gx8&UY!l)AS;wDaDk$^AY4-h;lM6+ocp&0i8OT6l}SJ27sbL&SU<|2ASgZcTXa!4HL53wpx7SGdOb zwTu|AST<6bgPeeR9;B1Q>H-Iw656{ic$`hF^dnPJxs<7d26M2^aDszKGdFYQ%r!Zfo% zp9`kVDC~3|a(hAXYmO9>jQ37z5f61RnFXN{@V*8%5Ho#7#Afr5{ds?h;;IbT=xf7% zkb?Z7MdFX}QnPrgp(hAA(Uq5NjcisOmo1;7Nq9sNq^Y2_2KK9wKhW(B>#R%~`KmEPUF`j+*xA)wPj4>rb1dt!|oeyUD{pJsUZS#NUT)WifD~rhSl*?~6(*5XXz8v;D{A42+ z()5n^eI(P!K5t}n_QIv%um9$6!v05`Y9vJ7V{%lP@$OG{KPZdyDYnX%^!@Ro#o;MW z_r)>{7S3CIug#%Ck_g{hGJ*QT-|Q2<^8bEl`E7?Y6UUQ3Sl$1AS(lai+vOi)s34<@pI8Nw?@w%4vUv{ zhm+1YFWj)Ac;718-zm2agfnj+G;NW3x@!4I_;N;qXpHkRjq!jhofy#=A;v;;Y9$|a z$Wa|V6~MZt)AL-T<5W)9S5zkQ^y2)dvR-s&DZCoY^GJKH@CECPFAExT}aEOJSl57{cj%jaAls3<7$;0 z(R3iSuYdO^74s$YWNg8B%F~`1Ui8ve*j(DnU;SF!a)D;%`y5|AjvPPrrT;Wx4jHh* z@~hweu@T5lJHIA8^SRHrJ(QQ-y3*!1SxCVg<&&TCbX(*CQKCJesouDHG`wP$*M%SM zx{t-hi8=57&?mwxcX@qS@<4a^(eDnh=OV{{%t*z|s++cjA7lgtDedxxx7y;Ioih?W z4FcYnX&;#;@{ad?I6USb9~-{#4dy-(yc5fbaJ5?XaZh++mcCcpfd~Kksn3U(z3QJT zt5s(me|C84GoBS*n3WG^Tvqh51p{q!=5c3R*~R4ef)~Fm{C?(96>?y!`;k@-gg~qz6hY72%;l>iH3yUWZ3WE;UW9uyL?^On=AA|$ zve7p#ZS|s+ZFN2uft}{d-*e&vsV1lNikvi;S(J7NSjVoVt9f~c=e#FyKMvQ(dB_h< zfNaQ*G^Lo><2ktL0@8+tMw*rG)K9DMIaW78Q?_cKn)jCZ+$=BsnhUS?2Mt;@=!>=U zIG$F>5uvr{{ysAo&OG)^+t9CPw$JgpWws}e{eJ9&)H$YC+_Bacw&?gcv>S-Zj&(yL zV8KNu6i>SJdfT^m{P_!w_}B;N{vpUwTLnt^5SVEawy0vvOrOjZ5-#L``4a6CvLSAs z6At8jYNj<}+Pr0*?>%JE5UXO@U$`(&v*LuL*jvewbM?vyznDo`MatqDR^xKC9(j(- zhkcHu9~0=6cdf5%{KqeGkVhxmQCk6wAMyk+VY9E%>S3*$3HgmF`S8;&b7K87*yqR~ z1)TSmMHYeuki zWXMgzGZhYckN;IN#cb93%GO#S9xZ05l@|H4(R_iBsRs)`ANe=)-eicw3n zqkwdZ%1c^f(P9{xY2*76)M+^W%*~0E3#Lz{$;^6#o*v+)LSM*Yi?jxOo>}v1@nA>V z62FztX3KqhL1|3ygS2d$L7ZngmKKJ^2Ubv?lsTlSy`~x*Q3v=@`BBbkI$I$}1QPR& zkALEmY@X7zvY2&_z_2j)6TmzBf|M+T3x(sv)3i$c)|RN<_Os>$;gK~X2FiXcUk2<<{t5P z_9fSZix%EiQ)?8^22Z%L-?YcK%~}zDec{G%_43j1u_IT7Pam^7TyXbLxT6tb1e1}Y zpam_pv=DV<{^PGoh!2~YX)^7y9Tb@dV{o4|@Xg8eSrHTt0-tcnL+YnpxFD>~2U0#F zAqEkcOCg|io=Njp2-CDKxb{Y4Eypax<+G4b=$KNzw#*UXHv& z+A%vz^8q4xTXj3=hXwTPfceIDV45CU9fN?uiF-~P0p(zt;;^@W!V>A(wwnQ83?xmG zy2Zp!{qbK~IDU!-H?5K5ws2&oVSV!lzckIR(f3M}Xb5XrSko7-xod4$aMzl!;Lg>y z!t};WE7x-fuc862t#0L*@Lu*Gvnys=G)GL|MP~67kl*2p`@-&*Yzo(|7`1(jyJgqs z-qi##f=0uIEoN!kya;RhZPhE5F^H6%vbdZu9^?cow-nKWG=N; zxB#x2rDH%k2+x@4lozEdCQc)z!TcnZs2m8#O|TO+4}pD>kYpSdAby>nD)2mA&8iic z^24Funu`YM{Nr>7d4TKz4qPaW0=YFb$XhJL^_Vk@jg7DEQAd{4YHLsic zhp;pU6>EcBb55uPvB+H~vD6ZSfE<^u8El#yOOzbd@25NE#q$;_YWU!T=gjZBmY*y?p8YP6KnaNGW{=NUP;5A52)?B<-qI zs2nssL7RsNi9-i9aG&_;jQFFkrQrzpd9Z6ZTytOV#ExB}M2WV5)_LvnfpF)l{>I1= zplQV>qV#zTo+I?=@Fu_qd=Y{#>hNRUd{Khm0|*Fy*BUVwfp{PkEu0Zy$eieDc5RAy z`M;wGu?Q+BNTQbDmQW=xsYXZMAu%^^=c^qDo$&ArIo1kS@k3;gn-=C+S@rwocndEl zZVwNCF5F#1bd861Y|gAd|N2EiTq$^;^l9&D`n(gMY)KnLrvU@$O#K0AjVV#4{@Q^P zuUlc<@=~?HXyBGEtV)5|wQGQtlHF7E5#kah{&E31UVTqbSg~oOadK4WPVW@~0VL9M zGOR9LmwAu{8%|W!dpxgY4y^^BAF8hU)Mjrjp|`zeXfC%D>-J>ii7tF`; z>RJBV;vUT1TdH}p_eWh@g3!`aQU_e;GPL2vPE2ox}XN&Pir zUZ-wYfFeSe3Jp?=VHj9wflNAg3K)>ZWN4=8CI)HELh-nk?`@xjW2B*I4!sCBEbk4A zA7Eqj#13AfM2XgL{X--6i8dA-#s{=aN{)>Hq32&rs4i}i&=hoPhzWN4?E=DA@;R|J zB4lGA;1RU^e`NZvKr=(rG5FBJjS=k>+WmjBKHk4Kk{h2Knci zOv|)Y@-`J@U4*z_G@5S)L#w(+!&OVW!;Pi(SfWHnU|Qq7ybLxvY;(;q+=r} zSE9KgZ0d}FB?N5INNxh;+BD9A;*Ic=p;-YlodB8H99NWQD#T5fE~xzzQ2AhEteQ`* ztsIT898Oph<7ott1o24ohQ!bg(elg+zTIq$V=&`rKVPnMfmHup2W(I5|L0k#7-_c=MH zVOm+4aCa>TZHTg>d}0EO-%G=27Q7F!Sl#4#b#rTH!nakfdHHD&K-h}Y=j42l6>F`H zz)insrLN^tZaUgcX5m;XlyyUSat(cAxYG@G3|*F14tZX1UvD}8SfWH5fEX7o>(2Vr z)^X-kO&_&Ij%XNKG!hFJ$WDtk&<-Sw7_n>Xf)*r*L=l$EW3?-UrveC8ea)e}LmCEQ zFd#svYe7;Ru9=B*;xs}T^|GVPn`MzlFS}L6!O+^LbBJ&(e0t7yfupCjh14r4TuC(vZlIvXu6%xm5YpQF)c$L%v#C=}E&U zt+u#l#J3)qnRcl2$0IfaBls*IOV{KVibHpy{$cR z)ZCba3PJ?ofq>I|82`B!6QcPY)rNeZ=d$^zf_Qc`NRyk7UG*m4ohC>p3D+d!a-&Rq zb*h6whPG04D(>w8KRCb#Q!!b^P#Hj89&RkyLmsPLIP)jfVg z)|96qpSLuNM?M9RLMPtr==N%Jw_~o6-@kDr+`eic-1tDBZDa;FWVn8LkIkptoN1Z2 zu9zNR#qBNGe?U6pXWS#rq+RzI-SeAgX;{qwO*;-(Y2cn6bC$%BUaLI0zUjeULmJ0) z0p+Unk>2Z;SKC0l<(R_i@ja&A1R&|e=4A*M^v|mXka6JQ$ z*4YX?)`QGDTEw9dyXM9!;pQ5Ty)&wlcJf6S2+Gmi>=p^F=>nCB1f{eKBS=iFQ$SLL z7tj3>2j%2u>Drsxrz`w`2A@~9?HiM%pXV&j((2nr%a`}0fy<1qcNvIb-Jl+IA81ij zmo3QIW*V+C3NRi@Rty42p)m z?{S}UWdKIn)3|mNlxE5YD;xtS-6Ib+WtEp*`fj^03*eZ`aoVBwaGT;ZP1>Fz=b~CN zh5Odla#=sa2yM_8LDYJw7EJx5AR?h1N3MkzG(r?D|iICca?P^8ti zsL8gVrp%P5jpYCBkHG$)S9KaI-n z5REi;1jrZpBR}g0{a}H0gT9y}^(&BX{84`Cv*`-uv#36&0+gl72VqD%N&Up24dUN5 zg^AAv%f}WCz!02T$m4Bp)3D#8O>P?UblB&j^7na;U)m+3Y{CKE`A3J-_)4^obpzfO zBy%WduQ#u=A{n8!K>Z;{td2(f9sW1ketB>GfXCtO#kFh6E8Aym+N6hDPZlXn>3v~B zAL}qgKsLY|_CKzOlGnl{r9N9I$YhhjYK-g4pe|v&7 zJk;fR*_5SUX;1wLJX_y05LRdYC(GY-0d=-&Q@>$tmhO$c6a91&#Id>0%aS%hyqoI8 zN!jba+E5W_E3`Gj_qON$yRv&+>puVSw}yD5_qo4`boF`L1o&H(wPngEjju#|psZE5 zls)B4d8>b|r|h#jq7LJ}WObAIp+E8-u-{pDt26)9ccXoeeu}I@W)Ti?k_O_ew1o!b z6=|W3rS}D7B(l=vW`~F}*2wgA96xx)rwX*PJ$)|?10^Uun|e9|;@3%9XuRyX=6cg` z0}5P=h)t^eo&j4*-PSx$`cm)EXz1G19X51zg-x3_h3?IpLwC2Mr@OlX-FqaX`Mlt_ z8UND(+cVAM}Hy+Kkr4+HOYWCfRk;z76 zB(ieDrp-o_sXT246A5vPks?BzMQ+WQG4Y4i`%ur8af{WaBeW+T6FA&t8o!y{ql)plFA zZVdwi1EDJ;$*#>kCQDOc+z1fVC@+3szt6w6GVhIl2!_4d$ous9bOK~Zen}@LaA}Hg z6i1I@>0Fr&5;{qc#G!*q{4C~eVFn`+9=g4?T4+=z+T!MHBt%7*u5_gZvQ@LP4@Oo-HfEz8%owGnSh~`cu5|6W-rim_ zvo@+hR`ol3-WhemV*{BLZKKw2$dV@|9_ zh!&2&Z~Npq`mNyIW}#K8Xs7yyu^j?nS|fYW#$0u^#SEv2-j+E&P0%et|%{z`U`q&oMcXfr4k>Rv{OINzmm9BIxy0Njbuztga z&^J3Jeng&|#wZQ4Ak3+Tos&H1=1*H;+TYo;v&p9h0lvSvzII&? zXx)&kTTos5HgaTiQJJL0-rC(4`uqFRIxSu4N>{qlwdn>22gAlqJre|UBS1q!R>${D z^I@JbCkjY|ts3~%yyNx;@s1}hziyShia=PHR>?cR(XLxH9iw&Y1L-=tl5l2lMrfrF z+0L{ql zwdvR^zJ5d31R)(m+7C*LR(e7L@nQNYq(O4F>Wo~UcXVDj=^p>ds*)T_SGv-bZpvIea@3ZEm=G(+!xi{X0V&9&2~jjd5}g8Z z>PsddK4^X_z+9`XejOw4e%*{Y*~oD~UzEa3>+_<7QIccnN>{qlZ6{ZY93e!exNJMd zfSX5KS%HZL#XpOix<=#FVkcXKGvsDq z{!<6jh8#ynN5gg3U1ytRA4%@+yYCLmmoHCmcf<`14TU93me~IycjujVh6f*f(5~04 zSrZm7Ufl6j#y8%0qb(ws%&l0lBHVGu9qH|kIQH9;4vymLgd@D0Z@xLKTemKKG^y+B z>zlCuclGMk;huZ$8F#OAr7LnpDXPBV}pZR~lRyTOrqcb*-N-?t_z#k>k-vA06KDj(3E2zVn^-|DzxMXxM%C z-5VBY2>0hb?|I?cYp+coO>6gW|MqX;fB*M?)7u?!_uY42c;+*oX#`y4KK8MXgJy9?UNGerI%hBKJ=jv*}1xtx!?c(_u+#d{9t;!BW@&X zk2~$OQ#kqLlha2nIR;{{eeG+*QAZt>KC0;$q|mNuqi=Y_8^ZbLpI>>#Acbe^*RPM> zC|&6$x*~GaUdB{#Hv%U`eaq3c&iH)n9RbMER(+ZVIdS_*rx6nz+9MikQy)qn^X(>( zBXvRgx$YP_{`ki~4$pu7^TV;n9&1Fo-+udrSHAL<;a%@~myNb3bBw;9_Oz#kg$oy^ zkEXTz_{TpUzW2TFrMElc?!EWk@WdxRG2C_6UFjopkkLxN)NqUaHj;xjA#@ zgtxuzZRzcCjt$HI{LlX!jy&?n^iiSv&2N4a-u>=(r?)%eAjcQJ@P*;T6HiPZwdBYf zZS(NM4^JNzx(6P3AUxw4&j{cB?srW){=*;s5FYoq$C;%=?#o~Pa-}XxSGroRh#YNI zXOrY8QsnqF*A#srNuz`?m4IL{Pns4sg{xI#nD*H3+9Ty+2LlxNs|U12=4u&WV4m$L zIi|vK*|KFOM9@Iw9(w2@BhX`xIi_L~#6gY-pqLyX)zeNpEgW{(Vd18mZmQgugER>1 zPk;K8g&R8r>O~h_Wba;c%{Akm;du9mBaX0lC(~{@c%3{D*5#L9Zo*aW6QB4*_|cDk zWM;+Vjyo<~aKQx=w!&~mEm{x4__o__8}|&icJ12m$3Onj-j9h8a(wcWpFHl~RaadV zZn)tFyGE<~=}&)Z*OcF)MT^Ff_{A2k9O<~?iYqE%kQT}iGA}Z5qTP}1bIv)(+SNb((?8koM%=G| z{p;|W*Su!j0sPeazyJHcSAJ6-Xt%XY;H4`au817%l$QocBqhc8Xtvbvj)E2i@zLn* zMULd(_B{@}_NawSslP@*`Ztes(5wnMVp5GApKN*7vz}!HhC`^o=tVCwv(y{k_(szP zFjwJHazwCVs$ztX27^|KMk+UV?p*W#-uJ%O;(f_WUQ!v!_w@9HPk!=~;Z1LPQ~1=U zK4pUSJKynt-@qCM@h%PwYOgWQT7r1Fh#e8Y$WEts%A{NWGVIf=N>eC9Kj zJ~T+~V|K&Ts(CtykG#J6)vpe3fBW0R)1UtIaLOsCRKiCSdFe}EYU$8(@`g*v5mLdg z$}A>F1pTXC^(rG02;=+T|GxbuEyRsqNCAH@d)dou(89ggJQ%yZ_S!4F`OR;(&Me1( z<|$8kij^B>Mp~HX#9>y29Egu{c*QGTVfog)9^w4=fB(0Y59P>z>O|pVx}~mO0I)z$ zzwm+=*dPn?{=yf&VC6`?#pDRF;!ov>`I&Y?n%?r3w^*Bt2V@Km(7<_4o1)GLPg*hU zhP+;X{q>c12%l+aPzc2v` z0YM@$Iez6UUoqjWk@%Tso@vB^Hj4Y*?|x^abvd-5FMa7tc8zubschJ=!G5DHF)xS) zhlvcqETTmlKv*Kwi`;<+9%%8RdEn4?U;p~oR|M;)KmFGk}d`Sk9o{vOpC)o z(u6I|?SvCfFyYN$03t(RfAys(l;Hq`?r5<0uZ3-A(S-Qhx8Dh2uVznVD{|U;n9zNv zXq0GnKmYm9%^zC8g%@6E!YH11f>6+0c*f!sG!h(|0Dc+mUw!q}6=K3cKL7ZS|7gM$ z6Cb8I(oWovXX=Wy286EsqA`B`>t7%D94+?vbAQxyO_ociwqt>wJ(Qb@18Ge%7?6bOkW;!IP0A+TRa;@Po>4 z2nEeB)+D*s0OYs7{jF(Vv7=5@b|3h_2TaSq^2#f%94L3vpt3^?-E+@9NTk5-#-;FUYC2IEgk!I~K{ykq6qC z@=sZie+Go5n;wq#jeMX@AR}(M<(A5`l`B`8$RXZingkQR-nsbVi>>cc z|EHdMYFM>uRptFgTuP1zZ!{e3OBA#@okcbfBYy0wNd-c@QRrR5<`_EdMPxCG@ALCd zH34lUX(c`*M{SAdAUQIpYD73t-3O}eFAN$OWN2?Fe&SCswt|k4BSIR}AdL|sgs9&C z{`Xg&Bc%W8ul~yJvy$~AANhz0_xHW;eP%vH$Usn-rO>L-nBMxqP^`fwGEH=^LqsTGm7?(eeGR2gNgE&YBQWegc(CWS~Lw|G$)@zEw4nRCQ1W@*YVcGNEe7Y#fR#F(2| zpKS96pRJO|{vDEh0x9X3%ch zA!!JFW$#wozlm9y^!ssdzRFbFH#FZ#+S^^V+c9!X7v!M5p%pUn!aBWP$` zYtE4o8x0xLBPPh$F9HZKl6&l9A3JXG3uaSDNdDx|NYN_LYL_luYNI^_FnWzvBUI-sS}5=Pc=)(5i=+q2$GkkqkPaoxTY-r;UE5C+&mTc$sZaEBFEU&gO)`6#KVFW9NG=!Sd?Em%%#k=%29@xLE{A{cp$~aM=*bUlL1yfAFLFc+^Wyio zulHg{y8_L+B68HX7!mND(h_5cTs;wNv*+{&Tp=0F8icOJ|9Lw8T z<%d9p@X$P1;fIEXHo)pnv_3}ln7tT@YtHe9Km4Hyd-nLzpcu(PzWl}<3289$L$E@` znA_g-p7+?hm`u?O5r_z21gW+}AQ;gm5yS|0MucobfC$tfVu$Gk;YtUgQ$bW{Kr$B> zZRLoy66WPtfW&+s`M@kgJ`n13P&7))jkJ;$NRY)WkQzjY`47#Se4r7bfk_LBw{mFC z5r3@gB@RfJ-z*k^q#+g@i%B2{1Vb&;DuW%gM>z%qlrg4m%8kJc+8J|`ILJ}uFUNfA zx4->uyC!bZfJRR_F!xB_H2^}h=ef+_)GdQ0G;H#K=BNcY%pWp%B27Fa9yCYtN!a)! z?bJ2Gjd@+#9lxqjM+PuB7Gq)hPFFn3(e^OivUrK|!c>b!kBMH61zNOU%y*@m zUXC`xT(!)ja`caS2UqYO?J-?pjx0lKY-MF~5jjFam^r2Cv@6sF!hu{Mip|5-^Hw1d zE$ERp2}$A)Qr0{k-(iF-@ym%fjehkaCdVSPYD|Kp527aj_~%+gY~l3#$C52=bk+1U4oRgs%<(py5HTm=l?A zLvz4nC5-@5U|tg~4Gjvd1YwPXd@;vjjzmL(tXNp1Q9fkKduT$0i}0*>_yA@|1RrT8 zOf*HAFIj8@k;e{FmsSGd;fJ(B%9wxm-+%uKDIu^C?BtWQP$pVI3V~8qIs^c}m`Tyb zc%MAV+(&%m17d*?ASFng{8N5$njvZyM-gW&QznA}$}OI+#H>phV5X!TAYd)>fz(z0 zau8BHaKJpRx+iVanO6NGh#+3diRZKh2$wn|Pw^oD{FYgk5j`V*Ox3(gUI7cHq!}Xs z$qR(aGl-x3t6ef+!PL(GT8=qa!e^kve@yAIhK}$hPm^s6D&6*X3}%Y&s4J`e-iTDsp3hhQcg2#C>K96#?uE;R6>W5N*nm{nxLoXnwJ z(3w*00%4e*N<&)HRcD~&yuocA zR&HjUY!xWaAX5kyf@A>=#0AgD)QZL^q9jhzfPc~`vh!7`eqs&Rax7idp^dV5rlp$VdqL3G+KB7gk1EfJAPQuplBQ(Ih% zBdmHWSb4`kc2s-{omJ0xSDj@sg+r3E=CM(H9Op2eTa z8b^-N@5$!$SQQJQ;gA2AbB!zu{Kj$VYaTJliEOzi@H1k>qU9(v_}sr7Ks6iO(dG{ECSCsSw~wyVhxaIx)VT#BivbtBNL$(;>4sR5`_e`bps^{4UhRj$ccNvOs|?7WD!kHTt)MjDSRP~ zldw*%DI!NBzA-n8;>Wbj{^IaO*tLGwg8UWv=Qr9YU-e*c0O67zGpklSqIUNWhs~R- zlh&mxUFk|!y3V+sp6;-@cfe$AD!|(X0-ZTUZH+(!gv{bOL?Jan+Ln$1H=nX_2BIPi zv_{C*pE+Ujc_>@R(|`$+I7kEJ=m!o|H9XR5dpvU!FJa1j+U}v@F>F8QP<1aQal|HD z;D@?<*~xS}ek(_Y{*i~xCO$Scn$~OSN>{qlm99m{irDq*H-w&{EfWNICxF1036)iz z2zZ2jdb$nTV3AoA(_(z`41mD!t9$ytAz#6orlAO?nT`0KOU$fjozgyaSO6q!t5fsE zJ82lLKpG)&X!{7iDI3U|_-rtc`{94}5QGA9WJI&6x8JnKbdOKzN>{qlm990{%UC8?I&N115rXikU;DQ!a##UlZwgFw@yqnWkRfIjcFLokfYv#AU#cfZYxB{ zZ{IOd-Q(B}v^9~m`C!3UvqFB{<1hr7k@<}_+%@RhD+2=!911l@&_9;Fym8Zn6C+Aj zy3&=dbj>@qMX?j0Zv@kw3*%Jowu_h?0R+q(qMJagdl`K@MfE-IF`t+crtWK{YJ9(0 za@2eLXM08!o=&ALeJ6dl2t0FAb8XPRFp?jx&b66QN1Qm#FM%=Wj zv~v$A9POjzSxs{E7qbH0xY5ZK@zDr-Mx=382~&_+va0d9CaFVXCd5AlAa1lj<}1^3 zi*~q6W19tO){(dtP zG>XCKzpfia{7$X+bw5VxryZnWrr}TayVd(sjmgTk*6$*}MSjv}&7#?`>iMge=0_rm z@}fM(Nd3hA()-g5&DMV>5XaS8yneC{=lgEx>Iz*w{YEed-Pn8>BbB$ULPQdumCA3K zKSd@G2qsNP!Ol+YbF$M)O|9y*MKk?=U)rv;t8{zFRD%4F7Un+{C;vt2T1l(>qzw(y zh;Y#Jp;LqK1Nn&@@go!SrpOOyh#Xm@!}8tUp)p&A+_kwkL(inxxS0v)?y#n-+pgDc z>^5+n`b~i!z`MM&VN*|7ybGip7DJ329K|6)5I`a#o8>qRaw~UHdfQb zea~M{<-YDIy>S?JzpMB@;idPd3dFZAOP{B^JFLv|MS3Yi%5FpCk96UWYwnYNo~`bx z)@d9rb!~af{Sba5b)7=xs!@#mQk>dnsG)dK{= z2Z3d_^_7>^(`{IsqOBbQ#ODiG{2&0H^PV3mI`R97Zc^=BnkNG$VbZ5l+_;9s_)Xfl zCzCSycQdRnw%I)5t7OTOZ{f)2Iq{PZ4hTzgk#W3@kz))_PiO)pnvI}?TZ1JO(*i4o zQhzDjUe2MlOs@JQHg;qiePz!T2I}Gk0EeGW!_moo77oS%j=O|gddIGXp5g6EwE z?amg<ti15g6>n*{m9XYG>@()VdJ_$5P(4z$v!vdML@`ms*i@EX0V ziRd)kc3>T4$Q!iG4O~;OA_5v86_GX`&ySB5<8)fM`O2v6+1O|_q~9A!{v9VeTm#k5!6>iR;HaCtA+|fO;+?R1*fC+Jiv?2uT7sQE8|P=(^SwPsy`2K- zr+n3ytc-?zbkBVW3H3dJzF?m%qRsY=KTDIa(zZIC0D&v*@#?}(LuJLa+Bogb1aZ`7 zYeDh`jmj5(I5El;>E=jpn_S2351A2bcWKzIfcR}5Zp6c7+l0;yRr|r8HvSjMAIdyk zh{FIiozt9ZSUb%^B)J{Jn>Q-*uKhH;moAguUSL${4Wzn?OLfO{1|N{6n=1U7pRqWR`1QY2 z`S1?mjn}?LK2(1X6lK~7=@BmZYsBw#f(vSIFZO$EB2lLAq`(hl$ovvQgD`1_2+nkq z_;i7hBLcm{i$7Fev>RlF4GxFgLPeSK{X)vdwWs?1)B2A3dK5lwm&GgkE+JvtVA{xW zykF{;XZ7M~2G-7V`J%pyTp}Lw7Lzvh59w9p)mUyx%I7U5uk<;o9no)yUx$uMwrT(} zUN%(^J%nLr@1cW>*E~1n7iY zZ9o(Vm8@rRM$J?(*ty0gkXI*sCqRupeB|OC%o?Hj$zh$%NA0>tMX%`bqm(+G#ztWS z6^JiyJeH4P@1*3-@;cz!t^{!>N4JxKI%FgcIr{ueaalwIkE= z{#~nV%&IYvn=o@(1#ECWSnXT9Zv>e4rMTUx{iZUk6EH2fKc7<@@IK-ShO|rnwj$4s zFe#IMKjsaKmPnMnlH9AOWlbe07jX=~ZEDBL%Cz$hAd|2&~mvp*@sg zWmbSX7Klth5bDGrl}7&fzkNW zc@aU@i1dCv_}tRNHV2+Qn~snPUu33b_c5%^jpgOm@BPre1V21JkN6=BeSJY%MH=38 zfGjnQOvOwF$_3ejkVjr2@csC*DsiZs@oyR=T6Ud&>gLoaZKFP?C_%2liI=(GC$5wn zVU+N0T>?|IZ!hLOiE|v7{+pNt>2roKO2S}J@|h(gpugE{C8zHvvh{6e!|+p5VG`F!YKk1 z@bW_#Sz8KOeOeq@`>ot3zTUC%_w@|_S$&R6b0?wv5$~q#Vq=!a&7+=I(#{9J`VeH8 zt0SA-xNPDA7lxtLa^c{k!6t&$*vhrSU^m9Cljw-uWkcuqBJwXdZ$*VOZCL5fHx zP$5T+Jh?VIdiH<$+Rb6Xb+?4e7Ay`|T(cxxweY%d^|jZ9%NHyO7hJh0Ty)jq?AemA z;99?5gp00PWbe+uhIbZEcpl>_^S{{s>)xeV+{AbBRZGH^dHjHTmvaB=#pCXSORo0x zrr}Qo$UE^<4i{%>zYt_)bMAaEAG??R=KuVK+b2z}f_z-L(CdopxE^){<}dX2z%}(; zRHxo%7G-r#nwLySGr!5p<=MNJWOYP%ms~Zm%}iI&o@iTKQwH>h)DQVOFKch~3Dq6< zDG&N-S|$n?|FmD)rsC){h`T8M$w0cOt4p&yUzFt`eJ*(YF0uM04}fdRLGhA5%I?A| z>4Ou)5L90FPF~jaWE<@fSrhvq&DR`?+{FN zrDp!As(daIf)vS^R#_0vj)u}C^Dv0D^wfW=Fmi+pZO=!pLbG&!;Z1jiJ@=m#e!Ius z;ddE+v-{rR*SlrdeXs2QUg7t9>|_6T+jF1rhdS8x4||8-X4nn?Ss3Z_7=-nkKaBUY z>+Za}xBZXr|Bi6;`@8QoJ{*g$Ap9vsmWDk@N1m45BiOy@*|f%VO6y);|Fkvgvu69r z{8@Y4-P)^2CctNJ}43xoEO`mYDVqAl$YW_w!$`_4LKT-Z|u@T^7f2&>}V%O?FY1s15we|6We$)sooO}T7gh+T!5HV;M zMm7~c)%>Ml3L-qh+dC_7%AIgr1|94&D36=6P#d6bERK1e|BAfI>&*vBk-W;=gvwag zX?ju+p7IQoHVxupzuenBQ#g(}@f2IjAwjHF_o>h>F*S(Ekh1q(5Y?R#woor$HCd<_iO-G5pq=_EYMbp$ip=iZ-5Uu`5T1mG^ zs9IhV`)jQ}3?yT?)&SkYh{__(m-(FqiF&(}+~HjjBk|Ejt8LZO>H{!Oe_GZloOnGf z%V!?01`DZQp6z|$?0|L}3+s{`rxqeZ%*95A`R)fh6vGt4crlM3rol>P_;3d2@M&o; zUO$6kD_kes>c~zSiH|J30mf;X zHA&+x(L9W7qVlJ18PNl;yXrt@0%^{iybYvC1r2pf+-eu8|4ze9g$06JWXzy1CSE|> zm+);Tjj7g0d~qAsbIK^b<{ADf+SAIS7nv7SRYKuYNEbC zS}-H;b-pvEb!Q_ydj#<;GMW;NdN{u+n=c>KV`wFn7xH;0KZinOqLApBbINcg4XB*>hv-RnckF+HVC+|CH8frm8->m{!y(ayf zbSPc2GR4nD#_51o?~IFUPHs}oNln^rJxHUoI11|A2pTz|ww#wwn$CKV+~L2IpNDCE z#jf-JIfk%FRmyX}csGqmk8`6^srPveVBZ9nUv z@1c+R&R4t!+rk2IYELKEraAURE2vU(q@g3^GpBNnod8)Pid`jnx5ZEz*7ngR*EQUZFycv+I+i%G8Nq z{4>RCL_Kp}K0xraY95#8Zbob@jT$Uj{miaCI4J_}+9I4N96hr-o8{??-yt6ICW0&) ztfXngIa*-(Ed2Efm6reGfqB&9JR=_XQa9kmuv0JAlEd|t&W0Qg=--`($wfIZHQ`&*75Rm(kUhz1-jLg+~Y(tRJiXrV+^TbCeE-4u}lVNFJMG4`KR zUGy@U04|!#Y6jkps)F7GY!hj%2g-wdw9>x3oU3gk*0g|?ef~Vv9Mw1U+XfP|oLr<) zHLEqo0~X#MP_VsB?=f6UuJ#2%WxV$R zvjeMJ5zc5hb_C@>@rg$%0U*3>n_a$O1Yy5DNs{=}O6vGOr9==D3gp^+-&lo8GSl$WiUCYEpN>S0soVsrMon zX&W)-rn1@jfTX~0Dc))5ONbN0@Wm zM5uVV@AG#0UtB*itWD)%iTs6>-a>ywb2H^>11Asl?<31Rnr z4l*G@qwAEQm@d%BF1;@SX{+s~sB_W5ZG=0!s_8R=@mW2Hgwp%9AdSH1ZK`ub(h!K-<~$L|grDC7ser`KfwSjT!=CK}4i97eV4%o< z3>%mg+>haHNmdsp_tZ}#@HyLD!%NyE_eGx8esWD)ZCGhkeTlg6Q`I0R##scFFV{wp zb0+#BEk;s#ofXx!21&%P{uZZ!-}Q)%deMLq_`TnbJrr> zIwP}hjJUjcCr*n7Jn1_rq>b7Cg6Go_BF9t+*8|#45eW%K069_V2(?ataBctJfFJ%J zlQ;zFN6*#P5Vbw9*7HumH0c39M4$M~tZN#g6QXO0{xSCS-N`WF;PG@p&Yv5!3_rb} zqLy~q4m4U$@6*XiQ_+Hi*pIzm@T}9&=v`(kmaW^p0wQPz8XPnu%pj^GjyXPbb!`ki zJ-uPw`t=z$g!`925YE5&vPwNUal1C5#T%NRLIXVa{ENcq=x8|Z#FH%CHEY*~1q&D1 z^7=H+17^()mtAqC#W^n{Q!~9H=oJ?lbN;`GAWh54%dm*hngR80+T%PC;lzOz?IJas z0@t!S(~f<=qFcg&S|aC2ZZgHJpFZC0RMmGa@)(Hve7Aq3-rRXl_<+b1QM9 z4RTFfBF8=UXOV=*vw!Ay|4e`}HzaZ-ZLSS@{l#s<38;9mMZNJXCX!ZRCRMX!6weXH z^K6#?oW$|lDWZurI?6-sRD_&DTNrAYlT{`uIi{NApA%Xk$JC@+1T;JRby9PL{EFfg zabjwXHCq3KpwBmw7PL0zB+cYm5Pqki`A|FE4MNPzpc8Ta#gU^%^_9gP1%5!SIg?f( z(^jpxhzIQeQ=J4m{t<9CPo!{i?Xi=j9RopUXLusm3!b+MnJI6%?e=i(;_D4duDhWE zi0-oaSDMC_zAJJZ8XgXRI^}dDFEqjZXU+`|Jh&pF_AIbL(^qOk8lb29C2UYK?0QQ@M?=4WYJlD&6oxa6`cLf6KP z8Id2JlYtBSG<|^flxlR$4~kIJXRSb5qqp6O;mM>aZLJfe97E(Nv#Ly|p1+BHg<3?X z_ni!@_e*kgAlzdO&K923(1e%{t7m#`7Q_R&rSSmM95WJRaSn?)At$Y*t$YhM_lx$( zI+pm5nNFiJk2p55T-wE73^}Hg{|H@~#p3&>4a_Un23kdGqD_UCn^WD7ZRN;`RN7-z z(Bz9LFtc@txMLVO&hD(n3?QmMopM@Oa{Y~VsPoK&j|c}Jew1O}VMm4&{&Y(A?1o9n z@uXAFFzt@;4m6etc5Fb#NQ!D92HisS{1r`dc%Fo?hmV0uL&zwtPJbdZwRw8VRk@1=T|g;28sw! zbw)etM0v)mmZg=Yex?#?hdzMH&8E58I&F*6EE`E9Wg3%Xs!9Gip%HSFfcLE)Zni}5 z`v;4C4vj4pT2unGZ?6;NKp4bP`QSWc7inYNeEX4k$Whl;AxP50v)+6UpX z&d5goGyPik`LEG5Faph&vZwKM0=DY0g98H~a$LA*Nk(pHYA!qx^gKK2*b~B{CD+v? z$D=cH92ptONNaUidhdNU-`LaJ8*aGqW($M&&NRUC}aR70q&)PE&1m^@tf76P3={KOPP}6eiTE4IBT~x;v`L8|L$+x`+0j$-{~|Ie|mo^ zQI8x&M3A6w)9{ZH+vz!cynPH(s_xCxRt~P&tKQ5(0=3`-=O$CF@FX6zQk!GUw=E$jU z+>=2XR!lBhR3SeI4VkIv^fGCtW}6BfqB+hD53YD9+;sD;_We>LGkbSQ*tBW0nPDjpnMgI4XlbA41DaZzp=plNItjM} z^+nr|1{qr$G>}p}8fe*EbxxvbSk1!no?jD3Q9pN5oJe{xD8JN_Q;DNS+v^le>&@pv zxA#`HdgN#%$GjOD*N7hw5U=>uHU-TE@(!ArOqpqTt-!R#EPRd>W&fr22WnHjnMr$n z%OCMV%50l(!u0b=jZg=i*sGiKStx_w&d)!hH4=Y(PjP6G4q9wa!AAed&@wq{^q6)M zelvGAl?}WW;y4+-YAJcq_5(U6oy6xJ{hkw1XFE$uVltOmbQHkn&W2WEFG6$d3D&hag(i9mG(v6X)kELwj#C; zF$$zb?XOeXz6O4A-HU(?1CeQz4nT)6ZLL6nlTI7iM;${%CSqt8 zHm{kNgON&JJ{5w=(<##&!otqtoU3gg#bs#aZyHIlNv|Eq)EsNE#HX|nuW95hk|V@J z*jfeK3^|^B+8IV*tU~?6elx?VXPg~IMn-M1%~|K17yA19!y$(sW%2Eo38EWsxz*+m zYm(!&i;QG3)!vhV#W}XZHG7xEL(&{gOS7`6YG!I>9a*ed0UVD@O&~-Z3WWqEe-R=o15u_BIL;i zIh}yW5h1P>mUi%XuKn@9aB<0Kb#Ec&R@>8;lMQB8%$)6NWV}!KkPTtG30G&3IuXiz zi6+J=H24>pLewJrI86RSkoKvlNlc*4f^d}1_5D>dGi9iSL6kEZuJ%2qVbnuYvhK}){eAa@d-ev5bD9~C15P*q#$a;J8BES>GB(E99*-y3V?bBGD!r?_mjUVyj0#g#W*ZnnKUaYxfh+FyO*)`Od`iO-+3?G z6G?63#I#$G5fI{@{RexJBXf?=zw}DjbKrq+@ctv=*pttM(`V0zUw=K}1bgtXZTEQX z^|!+IXh}Zu*c0LE+*~+u^0yW_Vr7aPPoFsx-g@_4Tg>ys)6a&brKRxn^Dl?(yZ49Z zUVOe-zD16CnWSL*flm2Rdzbe|Mea>7vP^`T&uNcSKJ+g6wI5R8*T{!?N3uLE zPI`ZLn|9WN_0^j2Q9ypV4rmSHljkERXzx$s&A$ZXI33B6xj0#TvUDInT$y#2m7PXo zB;X`Nm=QxpTy@V4g4rb}k`~z{3s!puDTC%ZwE*aRS|sH8ccuv_C(n|m{+4lug{8gd z$LZx^Ir&mnS=|gi$~3y6Z*r8in0E|~zDh;zBg`~n9b?CAf)r30F0!jrN|aB>w&md> zOr9(64FcZV&(y4lk#gkZEycw>7TNF{#b%@LE*({tCco|P2<5DUjihVplYFI&2T{74 zBRTCm^kDezho8c`$3F}oeE4xV{^3WC4?YT?eENBK@AwCe*!=hl~>7_U!V@iV#0H1o7Y zrXt62S&o3ToOr8x)L$Ju4$)&dmd`ff$~8~3D>Fw5*IJuE*cwa#B;KI`FQXIjZ)t zwzQ+{+;S@8->z`dZ_6apZixhAm%2kHcx}UEH1LoiOu;olv;A! zAIWj;#;q;Iju2HY3ActyVRr$nNXlG_lPhCAcFV)Q8ZqI7ZI;`#D_glTMV$FFJ~|$) z?6MSP;Wa^uop??}{#(y09_3J(ouDdLa+&5hAZuI%U)E6*R8F;j`#ZRWSBH*trmOe$ z!HT=R>Yht6J_u2rtN)4o^7tk*CR5%0L$^ zbp+v7kh?9l@WvIsyAI9mIqxKpKO>8iXUjDEfwpgO2C2iacS8}VB;a0Ax(aTi_$Z;Z) zBVdg-)s0h(M`*ppu{#xWn1(Wc_SmC?xI~+D_ z&fKbW_!@zc5<%ch=#tQzpruh6@vH-lp(8YbBhTs>LdA zi^{dOqw%nCxu+;+er6^_T`6RdVYSzB*fI@^I)bOn{(jX0qO$(`1xm`~CcX2Z@2C12 zhq5(UnW*;2mg(AH5LxSZt{SBAY%% z?yA4Uwd7V^w`r@5#_B8-CmoIc+B=95>12C+vvvklc!NTn#mUga)DbQJqD(n7lFUiK zte8Zqb;R2XsuTTfy5F)~%g&rSFyNlKsA}?AZfGll21k@jN~W7a>=(S7_U!fZeq|gT z#$C$jIAE4zO}e~yhw@G2$h$DlSU&T2hm(>}&9w`f3Mii&6kgArr0D&qGaQrzE>iS4 z(aLKiNUxQ7kBZh-j_Xc@+RrHWsmb>B18Bs;=rqb@9mG~%ywV*np*uZ+U*j^Leva-!TRS4lpC5xt0gqCSoj@8IS4 zI>}t4sZ;Wszj>!EpS_hJ#V^-oQ(X=NSzNuy%}4aU!dS{r#8^jQ%L&S&Z#3o>k=l6F z0mJPK-kr8|_;nd)SZGjQ%8CZCWw_~`NhiV99D4Eyn73oHUT%=@rhB6xKLh|>3&G?I zZ)}faBEM2m>lyYmo}c&m#d2|r$n5O=;Cmm**B16L-#O>$`y!u2;`6vkeQvVpJB>M^ zmiJZ?Shu`O_35h4IQ`%bRv_txXsip1A#C4!D6Lkl8djvE(U%l_wyOT%a+^|4^9|j|PlQ&6 z_Y3OFUCzGh(p^l$r}uY6iy#X*$=gOAh>cU;j%6Av4I3~_dl_#QN&h=R-WK=vwCf~6 z9-v&`-~rQMzKmaorh)XRfE=fyPA!#i2}sJeBP5FwQo>sElW6=PfVz1#AwPe07(gr# zEO}54ZHH*e@9&B`*so#}yNpzp+^xzdgw|}>+;SI z!oD;7e=%OrHgyLeXmG`S_JiIE#CS6xmnC&Ej``l(4fH`<1)oSVzbCIkzLjH8h;)~0 zAkR^SJ9qEvP{MT(5kX4K<7v?gB&pS7v?#WwQG4s1mPv8l4CFHCZtH5kjuqJc;c0ir z`+T)eVc5a#*1tLj661!oi^-8+m;GiXp~Yc9<#5l!@T4f&tLn2e&aj|t^i6Nmo#D=V z)`sU^dOckGb1*Wfi>C!L`63e*=ZyRO(s6@h?wAvl%hopQr{6l)wS4Ag!B(qMSo?^k zt#*o|l-b2__{hWIu2pO7>jqoWIhal0zT#|{*k*?}uaDR?QH75RPC{9;d0SYw#XY4RhvpnMOHJhi}&H}v^pt5>7`99({DY;I(IF+_{tkLfxKzUWY`=@Qowf(^6Pb*C&TKElTjch!^SP0 zaYx0PC}111bn~>yk1r~$i^515%4hpUo-QsB-bs0uac>qV%lcTZdt!a?S7F^i{jAv( z-)EDzW0~ekgR=11se2;Urq53iUbbrv-J?BLZJ3BM*%{|nLjEqa6LrtKuAz^_zk~_& z8N1iQgk2+l+~=L`eYbd95{|+pegAw{bG?m(E%YbP$I_>tZBFgC(LWvL?dS1xnd?Yv zOi(%Q-r(}zlwV!A!l*;ay}G6kmFWx%(pH+xGd}&?%i-M2T!?z#T%Qo5=JZOXJP6R; z=xi*=evV4J8G7#nH2?r>=1D|BR1kq{9@MPn8=V%htZ5Dt=PMgct72CQtwR82*#Mdr z=Ku=77|s7Hi}9sm2`@*Si#2~K{U!_$_S@yfa5_@|r8y7d{YqAN`;^at)3H~cjqz^QJ5};>tu3rudF=jz|K{0~ z@!fgPGTyC-GqJu;#=h};taHkKG4_v(bJxSUD95McJN!Q5ZFVNRpFiIugDp9a@z2KR z$ft}mDy*$yIVoeFc3vLxr|gvF1Uew=qqJFF*~bCWJQLp=c`nnJyr7FHzwYZV{e<#T z-+A~rK|7)obv?6i!we44(y!>;>nxrbjR2xRUB4W2kY*WnGeLP60AMBSn!i}K96Q(a zeMREg%Go(zh;*~wt3{3!;QYL=h-xcLBuP$A;AOBZalyv6wuU9_+m;2EsbS3HCMjmK(?o^24Z^-{t)}@P58; ziBWccGH@$^cci>_e&cn22OmMVf4#kYt{+f$ag5M9Ly}Jim2pM|c~Jg-+lq3?8uD!b zX(RZM@7N2}9Wr0mA=iFJsF#CsQGU~5Y3itaX57$5{yZ#Kx`OG@0XOX5E^t0+KS@V( zqqL8#$vl4k7ijQsv)sgOXRG4(WffF)?aCPD*YR?6M4O{zNpVS}V?drBzlCn6M&!`4 z=Q4a$PzD-{GU$xJald;vkSDHhCajgO`RA>}d#BevBvY6ST;_a*Ti#BzqeiPOq0N3T zC%j|yo@*f<9YUYVLH$nP%AoBPbgx_URUm6k*B41 z2d>n6liqTYqqW&}*Xiot<9zpSaCwOXS`Flv&^tcBZGBr2`CtIC3nUg+i4IGzz zrLNl8WGi7M-ldHk$*jibMO+Tcx^OTP5x>WP$oDEbkvWX%a~Nq2BM=)bSiyoFH|BR6ar;MSoN$1 z8s4tHk17|+4+XId_3Db%*9h3(G3S9?=Zc$rkU#I6 zemHhcl!70GUCA2HU0n1pN|bqw3hDqk;kP!%iwu1r?|TJ%4aSBA^&x%birr5e1AfF> z`+z71Var91q|5uGt0;%W#l#la{xu zzl&V8%ZZM!a!BC#YXzUjQuLE^a9J`Mk^h{@<#E6k0GaDHH6Ct=2)<5Dez-*FjAo86 z;68M4P1(2)h|6kQM!7r-S|g1c!I+bg!ymx@{B#-lo#)0 z1NC^#;VH;4?@s;~7CnF3NK+mtcX>{{PNKZeR(ltPQ3k0Rfa+U@^z&0upWAmA6Krs^ z-~)RNKF3Lxyo0Ppph1AVK@3``Ck?a|hkG`dqHZ%o05bKx_%aCouuoGpeSKqG=paWj zBU2g_0r=(oT=?nCm2l$xY&di2YB+cKYB+moydd2lVjlcGOZo-K)ACJu6Yq4ysf$;` z$qTdLWGve+=dKujKI?yf)pf)Vr>}$`WBR8rcIMp+=ORv=uijsO$&)-t_xsZ`;k(~w z;$Q#$y2l5 zC&GR?HyeIW_44D{nW5@v5Rmup7iX=Es?YDwc%4ySEg387>D=YHFnjG!TO?M>Y>9;w z=iJPENB%1X-h=w3ZIIFO{>X^+gN)Ih$oQ#o=5d*_&$Q%1VP&5roH(=_?aF)7p1d>t zM$dMnHD(~g!zY zZgmdpDo1~7u9dvZ+lFzG@`7X_mfx=UU-A-hqxZYH&HI7zhYbvJFPC3yAr9{^OJ5cs z1n6HF@sB-IRt8({a!sU|tY6Zxbru-`F9$lv5uku**rSguHO{aZP*;vE)(uq zw<+AUW>ZIaFHojlAnkvw-Wcv&v(fWd--WC6H z@9v0y#<=9i-@Dd$zIPHY-dnYfbOwLV)$6?sy5^n8i?ql`*ItiaR*S!$XE#~?tJZlN z5|8rUZSkshX0M%+ea>d{jtL zr{_R^?gey$5zOPZ;6x<1tGkA)zr?fYwVFJ-fqa#|%C0$Q5i|tHV8BRo-q*8`C-L1Q zQGKJ*r}4Zll)m!Pi9ux<#)S@YG}p-NeAvDJV7PnrTH7dFet~`5;MA^LYFJL5HhgNxU0^*Z2r(&DfI{&JKVo9hATD(%fveugSvmREevaOL;f_zd^U ze7b=$kcO_6pC5LezDkk6*CIBjd;Bfa@=q$ov^Y_uBcJVU`78&>U+q!e>juh(;#xviH-!~#j#XA5n*$iK*;bsutj_6wCk#k&tbXj5hp(G( zav0`J%=`-!Jg;N4bl*OsL_U+=d3BI?*@oqFIf&cs0CvT(W9m{mItaRqw;bRgd8mzf6=iqT>UH6%XJ52|T`y(LJ*_h+?=^vEv?veaGuLg)5=|B% zZc7Ms&fS~ZR)lp)xG$D*%TAVOnNKg29~>rKh#sp@aV(E{cOzRlk`-Cj3B+2rOF<-@ zuU4*uxn=FWeau=Zj`~!T?(2+6|4NAe)*;M7 zlh6Vw^D?{}L~Q&P31G=>ncCU^Hw%&Ng+B@kh1`(4E zP8FKizS}Gwq1)mctwt`x8JZrWMq(YR%0$=Ok<^Z0D*~^~B?^?GmUVXpy7lHp~0KSM0ir*jKt%bFNs_G9#awuQ~|52&N9QzC;8-3Xf5< z{he}Bpd54%zVXMiQV#B3@%zIn3$qfsJeymSl!-hEFY}|U)KML2`XSEsd5}KDFQO+* z%DHMExlNakD0wgDy;vC0Nsc$d=5$78`P|Kb4$8KADu`nkP@mMll&;nBw71*1$Wh*p zGQ1zCf2!Th!knz+Cb(P7a`QS_%C#Ef*gY?E%cUx1Fa>HI$D-vR2= zWw`W$>jvqoq^sx;nWtzi)bZDbIjB@$FD79beL%EzZ$qfCW>E7*(vW^7mg++Q*J0`bkYELZ3 z4U@ZCi)4J|Xl41JkWthq=RvnBkOuL6uVr=mjPB{TS(1>%LfVj@2ty$X-F8=XyprV(}iY-yP}A+#%$LC8_oBELl}WgLwb z-BQ$uu_DPTEx#@aY#2yM3bObZNaXHPDP4_Tv2NXx=`4d0WG>~%{PacN}C&@wUYY>qC8e2(R zc}Mbr7ZsDq4TZEhj`mIY+woRoo=$*r)~ zeadBVT>0}XqkAv!;AGGQwg=>O;q_2i(Ne737pW_(Ov{vDO?Y)*#O`%m-tPuek`rkQ ziM5ZHhq|Gx?iuKRj`DUSM_GV+@0LXf;``ura573>657M!yX7UaqJBuDpL!Y=8nlp~ zwM&xWI#`*e(>oRNV=mP(3ehQ@kAL4_TAsi?w-6kRvdcXi}270Qf7_5|Sna?=jvbx>mmOQPEYU1Uf4cQB9?Un|O`Czw~EZ>e$8%S4K zADgQBxGZmN_2Qn9W3(Kxd>}ZDZSd)vE#WZRDFeh17kGe(1 zLK(Lj?S6|Oois^L1UAfKoDw|GyE31bA6ySO^uUhSv%KBS$~((yE{})fp5{#J%B8%p zNJ&dpV;Qdww28KO*!9vaGUq5rQEF6;z(E3~<>;&R5*gucn(|ROb6px`>v<=#-ULuW z!flIO$eaA)^_ujt*LyZi*~fahX2Y};o<@qMSkm*dHcN8qhUuNV!?uVrT%bHn>1l7K z%2N_3U@MA~Xy?7Qv}l6~xAv&tUW!tnjqXYFFXcU18?qebcI2K&nDDxCkBc1peUEX% z-P}$#dH%9MxF^f4il6Fg(v_~_60dY+4g$8juq~zxCr>_NtV1(22sC+{Y_{%^f7)jI zu04T8C&Z_$PLwvB9Z z>%&LgkgMFN+{0xxj3VTDDd*NmKjPUJUkPu$dpx}J{s-ah_l}3>UVbg?Iru=duC|%0 zQx>F`s~Sb~ya=Edc<%Erz6@`^{Z8P7qVm2V>$D8-1=V4bqRSx*&n%Zdtwz#ay?HvU zidbz{XY+H!r7W@<6<03Yl3Yh6$I1)f3ZHf<^tm43 zv*G2}-wqq1B}v+kKlO}-{d(eL*naQczGUupg?mP}+lp@5ET8t_dhO;38#rK<_#zn2 z5%onNT4`EG3_X$N;7C_Tu^G`A5&GtT4g!ZbASpqFse=Q|a$WRmh^Ql<5ioPD`k+Ng zSow8%4}zwQ)K8ga30aGp&+Vr!$&a*uyu4(9Bz5n$AxF7gWf6(6=&+1XWhLslay}pj z$8MoOn~>)Vlo#Z8@zUjR?!v|J)wkb;@4o*roH=_gEG#aDcaMJ*<1wP2ZdpU7_$OF= z!Vz=rqjb5M_^YF~@_Q(gk3apaZ9{t*m$G@CbZ%dt$V!0<-cn%URGn zBggVyIH^|y2+CZ_ZVm>9Wq!h`-%p3nKL4_PkVZV zQ9sBxa?U9*knZ85kJ+GZDqf#Ee<6JN)i+`9fy1q5%CcDcHD$crAacxgM&<2tx9ZgP zdy|FZ=Z*3^N2!ndf%Z3AAGqcgmfWiO*FbRD0&R~FSwaYQ+*{hhp*g@|%Tou^l3SEL zj^+J49)ReqoXO={#w)=yl$rFksHxxb^Zq9ynPSQRI^(Aa@$79uj{HUNBxEQEjjZJ| zMUjpe?>-6sZtvW!-Qsy1I_r;O?-j;jEM*JwcnmTDh zYcP`Py1d^6KR?!&wad~em47#^pLCMsw{Ib7A2WUw$^6k0rVAKhRP1Yo%5aIUttnIPfzB|S_WZ_dgcSkw%`&gz|ug-;MpMTM(3F7m+ z_TJY~o}GJ;)jb{Iw;Nnnc>QRwE`3EGKxb@73vzV0cBy{{1xnn{OLYQ~YgX=3cagGX z14}Xf#??CKgo(9iF5Lw`qm<`Gs)M+72LbP_^4Y>9bLBc2@>_Moeacrp-vs6hAveuA zVm+2|O7MQf$I7&mcxIUct`1*V7IHK<=eBAtu)NEo_irY`uLOKu}G9HJo$7SO@9#;#(kCtaVv6hcPZrf${TN`xkev3vwsO!>*bj% zVe5`PVcnK(VRuwqKmGh`n2ibuCG_>bzB2+u0Udhqq44|ZGvU?O-VCSX-?^wjE?&A6 z9)9d`Q|u)<686+H&xeaK@7Wl4=E{|D{KJo8oou(coU`Z7g-4%!CivXvb~~a9%iyu6 zp0%XbU?_bB8j%h26{zDTLe3)sAHlBMz<5P6p2 z;{evI-nX^b1~N?Lam%gqIY{c*V^4;Uql`TK=;Lj2d@RcKtFONiUW;;Cca)wHYb2?; zx%u$K)6ceK4*9$iWeak(=c1MK=@(x|d7CvEK5_E5us4z*2fIV6zx{S9ym$PA@cWsw zCeJ+o)6c(zXI^+I>_2pWl*{ws&p-bRGcz;chaZ261G~fFTnsyU?D5v%Zr9!@zh}=` znd=5MD*@V9a#B~<{etJUm`r*@i>M$=EXOTzz|5zsq<~BPI}DgxM5*Im)dC#10ITy= zohbd-G~3^pNYECzM5WK-7|2P_T6#5kjSG+@pQduxZ}rs>EL>TN{gN~Bbj+MDbZS0z zsN=asx4N-vwKq~2D>>!_CQGI@uQP2Uv%hr^9%Y5soZOgI`98>4buT(eiNhCTZaS~*0H>o-q?haPz}EG{mZWy%Qs zu_vC6ift~I_1&;x%T)N+_dkSh|Mh*?oZg4~jM(|IN}U_4AMnn$i93%JRLgk1z%y8Vwu#?ds{Ol!8K3|x zSFIk_y|IvEH6PNx>QJsI-^Vzda>+^1({#8(@xK-?%exyyj&f_3_aPj}v2r!JaJw6K zyIF6qz43NfA1yKo|GH>du_))-wd>*VgAa!Xk3y93_mM|z={9qb&piL45!TMA1P({b z5psO$ndgk$P)@k4uEY^Kie%%~DJRE|BROuF3}1iqtt+Lp!jNxlGPi?L!9~lW2dqin z3B`zI{B5*UA>#7=`h{6+Q{HAJLG=qG*a4p`jg+UfQZ3dFU5|xRqA| zB1hb#B>~d!kg;Cm`1q60m`q|t67OG;EWi5t8~eR`|A9ClyJqBtjIoFZkH@tr*9RYX zC`|6yZN&FlD!mvV?8o@FW;|UnDv(G z)3yyvb=FlcP}V_-RbBx|vF_PkdAFojG@u`Jo?JjiTxYmDRr--U*vhdb4wmKS zEOqZNkV{qMsBIBgPi(wr{*Aw~9u0{cPuSuUKb#x4YVKw&^BENRxvspgtkW{ysNlWH zgGDu3kW{)y`vK`_>&r;wn3JO1k2xvkO2h;%#TnMU+5|cq`O2M9-mgP1a(wNrcWj}9 z?im55Q6|EE;Zj3%Q)(1 zwc)w*=S_Lly`q}4g{*deY4n1HptbL1+BSb0U zV_=4xwTT?bpYnVaW%+}TJ`PXDw3&0KPnPdDPUP-W5uSyme$BP52%gRt09I2v98n*9Ir=moZfSvk)Ad^n2Tlu57~knwp_e-{6l+| zI)(rV`zXp1X{_5kVT*Czd;bG-!!k!W3^}rmiiJch)?rmFgTYc(-6iRSQoeV;umMdX zK0-HpLkgl!xv;{ZSC#y6EY2Q$s z=W|Xs%$-VExX-n%A|1e`s(6sH9~ADcTBX?Huo&Kmo!sk* zgSEGXr=NS#T&IxSci;bD3mxA7;6s~t!DYo_23Gc+IC(OB|KpG5u7V7C9%BCWB>Nn{ zFl&)H%P+tAm#v2V>f7(b>9c3U*{Ha7>^&IP#Jt?P-EJ=2zyA8mtOmJj`-RWDRBk3e zAl$cNC=U0j4+t!GJC)lIa>(*7!|Nd8!KJDLoJ({gN8G9#?Jx$P5B61`sqMDaE5l)6 zgS^T9-f6i&`{Dv+wd#?FkG0A1(MKK&FGbRP<&C%FU}4f_a;vu~Wp5FE>YuD^=AUo< zsNDQV9)8s17MCj4<)zD)!#D9S157N(g*afNALZnTo0j=-k>kSRLW@92*N7JqJ$KFq zh7?@V~P z9YgnsuV&4xg;%0g=qKP<8#ACu(;yn`T05JZ9*c7LVuyQ^d&uZp@4RPLC3D)u zk!8suGptFu@43f5VV%6AICxSN$2}#JMz%~HY|ZqDx#72ZAEKSqR>)_QzG*8jB$&lD z!pkhjGCt6NHjiVnj7)6v!Cm>xuviXq6j1n0M9DSbZYBN|eoiOBXs;!GhkM<&aBv^1 zlohXXnLha@@St1V$q%xhR@OaqXm-2}BCBxyNmuUOqaz z89;gZ>bZK9@pIs^Tf2GE<{81N2sTTLB(z9~4rY5Hw|biS+#=+NRk{1V`{T%dBCO-Q zR-40glCn|$=53C2ZOUScr-j>feLByT5jHCak38~tn4O)oxub4J&gDQEaEgtTL2e1= zio)NGwoghhL1}2|(JoC(VK}22VaPt=0%=fY4?k#rk4{dYL{jH*HG0tXINBdU;rG3FdM5%OV^s z-ue0YHg_v9cYY!_4ZJk}+>bo*UK;3#@R|nVq^C9~j^x>&^8u=^o6;B*%SnzonurqO zz`ZHUjw9u`r|&E3lUH@H`zgLzp_ZP1L>S8qvV#PbKBQ>`6rY{B&Pg{_IYf?wxK?=| zo~PVA52@P;LpR)wsySSbJoi_nvkoM=Tk2BJFuA z8yrD&S6pQ&iYO(3{FOrC@2xOrGY;@x`G{7Em-@&D7H!X@(fBVXehWMH9DdBP5`s}v&XB2WIZOwh>7P7n|W=(FZTyfsM-o{#O&H1vqhu~I&w;gkj z{+lwJ^*>cv_Uf1Ub5<8M@;XjHlz3a1hkWO~;}vO6SC*nIM-jP^Wy3(Jgp;GUTa%7y z4HQz_6Gr-WdQ^HYUmsy8>S|c56glQ7i88kgAr!esA(OhZNO_iUtU>L8G}r8$TaY>N z+6MkaQcYGNWzYhlUM}3S93pqQW+7(E0&zpe#NnOndz4t18Tpx&2uUWQBu$$uUGTDC zRq~gCf?1w7x{+gYt7-&AXUjX32rwr_6M&>xr6f)8CaaD5=Eg9=9FM@=u2?tWmXa(^ zN3v7~RJ>Esa@@Lox4B@;k$g9_2qKY%S*%-pS*AvLviYsopMdqN!xS-aYlZJf5s9U29&hOmAGU z0mqbkIe=NUNgj|74OGhK@_|fwuY?8z9Q-X^lgqKUaeF?dtC9@pd3nBMv5w12a5Km; zM-vf=K+AC5gKX^V(L^9lPSs)`EVORvm+7_6e@%o|#;JpC(#PeQ$eeOOjyh;uqz6&j zN0hN9ula%{xppZtgq*umd5-kms`PYio-+QuqZKJ3Cr7Lhk)M&X#oag5S)F1S6nUHU1LBK_XkQeV!t^x`#ii{?8}hXCG`CfX zt0c;tAcZn6$Sq7+br#-55e`F+%HI@Vl3ycvQ;L=Q)WRp*UCg&5e6dt}+m(x=>SU!P z%yEIb)^vf|o;K%@2g3MrOZiL=x!TL{5_vou)J=HXwg!Re-FR>PwgJ4!M%53I3w>F` zfZPnwubObP$#Ga?<6^wMzav@E|8y%Eszgt_g=oZN;h)X!_Xm zHDA2bl_*m_+An$s6P!ATmNV|+Gi~JPL{|LTlG}o?y3YCU z1nP!5D8u^&&zFkK=hAvBksK&e6qHsKi`ZnrX;kmT>4csu8bCQp@)J>(`MJxoQ$_&g zw|$YtGi}cgNsd6IXvByWX|n6@Lm2O@_wf1k;oIkCLhqP|mBc3!$m6IU%JfEowdvMo zH?)yh58{(`DP1F&j1_TnyP-Rd;^hG%BE?d%oa|T(pic454U-bzq`aNVuTAZmWcP(Meg=(d$NYK;q?Iijl ziHKE;mV`SnLrKierCVUrXb3y^9kw|~H7bHpjzn#Q&AlY39q!c>rqx~+Cn;3~mA@j& ze^CEakBttqO3Jhz;(tJd=A=2Ld?hxs_}8v*#gBtV)P^Ru<)~FC^03 zD@1vR`H++EmpvoL0zjrL`T{pLbDEI*g~3nlpD2upJTFuV_pArX~_uI(qqNzQgynI zT*!A2D6gb`0dh~mDq`r>afX39 zRB6qQ8?ui5J-fRD>)<2x`VN;Xa4AtKTg{6RuTu$DZ7?jPNOM9XJSRQMrujk^>v-FH zU5HG%XCr65`&u7Kf2HvGE9I_D?hbF) zamuR5HxIKF=h<}=VV2Jgi;^7cNLMmN97C!r7Obgmj4ZQfT*fQ8G(vB?&wF_vXthQ5 zo`kjfRtlG{q73-}Uph@`*1bc&s3S*|wQVm*)>SX^85S&1u|+Tm`u=0TkQD>?%(rmpKE&Kwy}D4%KiWLy4YxSW za-8$UJRAhjTCM6w?l?Ifee(J6&(-VO$Ps~3N79H&)`JUDJ2{##q-SIy@>@cz(OoXI z<3ira1|_V1p-FmIsQ!DHcd?FL)8S;%v`8{33FV`_xGt6IsGV4#?nqyAk5U}DOH|6o ziLe?7ai21--rVUbb@}mmq+at)B{poH2-7?Fgv;~STf$%Audx5%17Yok%>!*|87DL- zP&-Nfs24x^#ow2B8XUT1Sy@lxXgl&N>z(TkS*at;iNWQ#4kAbL1bY8^XdX}l@QP3= zw}?t<=eon5EAp0pQ5t#wRGnLY%Ib)IvvEpZ5!YqBg9d|Mf1U5y50J;z>o?hf3k%tx z4xrGnW^BzzK>))d->>Jo-B)@-1^~CBj#ldzS^!fL8F@iESdHW%S1JUAD^>1I`m0-? zRlZjW!W;&A7Hg5T?67s-FIlWw$*P4m+Im9yw7-#fwoh~BMto0?e+LotAP+6ZhWq-L zGhywfiLiF#=2pXUV6Ky+|JI7d4HGo}uCQeqm#YgBR%2^1kA#YQ(=KGh=SVc4^!B*p z!bAjLBDZ;oZR1H>lk*}&@}S)6G`1f!y$|=w=et4al;NsJ>ffz!&m;fHGxfN2+SBMK z%~4>V9h>wKy_7!T{3Xnlk^ct#R@o@0(%BT#S(_9x*RB+CfpzAY!|EZ9yzjbaZFu|r zkInr*mpX=oo3PKn`99pUX1#smP_ny{;CG4GoKZJEo8^>ZVp&NK(b)OObye2Id;KBw$usGvcg%MNwm`e8@wd8S7u zlm1azr91SVW!}^u@kv9|LOetMdY-iOmoV}sP1AE+r~Hhd(>>m$%&Qk@d*pHTx{cx6 zAAfDhE|B}LX`kVs$i0BB{Hp~hz`n>a=l9D+GW`Gps z`Q6VZSgTgAGlg__#Q)sACj4X78vFg?D>;+1KR176;L~BtHb{nLERIFdibwc_W!su z)f3NBudDsN{&BaL-NGaO^G@Qg?#N59I*oG33hGzid^gIgk3w;u*kQ_x%-6V3qj=u` z=rbcyo*A?~MuD|ited=Ds0))3o&SjP@_zuok)`y`lvlceX9!nX)F0uiV*UNkT~)uV>py^S(jX4< zRn~{=372E_A?_0<{lRnO?v{z^@bMSlv=Jk^)?AefP9mkE?}dC| z2p|9~Hs9>;i!5ce>D*K&MkfKRwld9b@bdbcVxBL*Nm~{m`I5fvgqU~I&)uv!5fUHL z9@e$m1f`{UNprc*`)9md;NYMuf5#mbA-L}{^zx6jtf>_ zAA8%r`0i)n<@Z1HvVQiJBbJ%`sT1zK8X-C19(BiisQjzZF5$L1ec?*@4A+pr?KA%%2rO5vBz(ZY4Tdk`I5ej)-Sr zwqkRzd?D02*Qz{^3a4L^$0hn^DodRkSLM#19Ve8gxo^!<{3HAt$Ab)rm_Xsz{@c2JmCC;M9 zA-!29Kq=Ut?P=#A9?x5x`1>+>Ep^7rLEQM>VTKC%qw{_V@`$f(W#k#sXORcxBR|qp zT9>Z-@2lw@^bGOrFVAN2%e=Z_1}o@BXE=G0FX@qwmElJBdIQ`)J@3z#_r?ut-#@%P z&o0DvzV6r5EAn7*Qk$P!^f=TJ_uJC>%kNWWBNi+PWJ^lfJ2I%0&Ir z9~DNuQntK3_^rNMra1_BAKF{>!MmT1*XI{Ked-H&rcB5ye~CxA3FkLur5>#8*S+52 ze=9TfMxRBtRNrO(qEv-4X9&G`@f_HQ) zhqY6+Qf?)n_M+1vE0iN&3_w|Y4#r(PxPx1=ljQc?g3BNEMHtA2O=U1SUP{IS?J-v^?C1t}X?nV9Z?D7pvdIN1Qmcz2*g_Zj zbdoFA)0NI9FV%yu)~u{ZBSUn2s#{r)yl`7>S6 zr5(o!{-3Q0 z-9Z&HI0KV*);+ZwW#c{bK5oyMYpZ>LV}vsAvLv^d z51{MIsrSeStJY`dTn9*x@c#TZQl76Ckf`1Ih3mpfCXsQovWj%{-jq#bmfsU77x#Hr ztuE!a2$6dluxs#c-&i!cbJ-)@24CodBx^PZBj2Rs^1)L-Abz(mc+|B;6Q~;veM zazpu1Pt=W8x>7H8wkkq*a>l>X+>0EEFM(ZHazR!nM(BuRLc8FfHPI>Oc|it&8bY0! zzqu(aXauIlR$dZ}mO{PipG;A>D>4THD{GQ8_$|S<5!a#%qO51F{-P`z2xx#X2&}VM zc}5ow-bZES_o(TO0_Cj{zAVaI83JpMG)RLi%X9?VUIQ~DkD{(kmY1qgKY1dba+65u z<;%Cn3DUIszvk&vUX=w|LcVerljb^j7n7a&N_nZHmU2EQC`&E}>c1+Z;)!e&htCY* zx-Qcj1Wt19AvkTH2)g0tnS;-+bq-S1)h;hQP)23=yaQEkgv9pyhw-XlT5UgEJ5jAyKltl zy2@l4V!rD6O75ia`Rj&*=f|@$2FP#Fcl9=`T(-l)%3!+I%aRX}RvN7~SfcK{{~0-I zl*(Uk5EoP?kgwPH*RLg?`qec5Hk;<0m?vNkMe``Jy=vzI2E|;OOXN4{EvEbz(p(1l zFekwL1alIE^ViD6OQ+}Y`%^AJ9L;f%9={iZzYEYj1J4rQ=7+9(Jg#ki@=t$ObB@ek zP?oa%{Xp+fhW88JgL-0)NoA*OK!>b -pd>?tpI!92tt&HO+|yhX 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 IM6N<$f;6btS^xk5 literal 0 HcmV?d00001 diff --git a/img_12.png b/img_12.png new file mode 100644 index 0000000000000000000000000000000000000000..bc77b6e18899c7e1dab4c1145c010cf226cf5707 GIT binary patch literal 67415 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 literal 0 HcmV?d00001 diff --git a/img_15.png b/img_15.png new file mode 100644 index 0000000000000000000000000000000000000000..63e84c4dd54eb3d4623aa615ff2fdaea7b6623af GIT binary patch literal 50653 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 Z`v1zYv#vv*7a#xt002ovPDHLkV1jqt<9Gl7 literal 0 HcmV?d00001 diff --git a/img_2.png b/img_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b2a83c762f31c502353140b42c2e8a2a286db3a1 GIT binary patch literal 50515 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

@s9%XKv|{e%$*lO-E01ibZJAK07Tu$ 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 z 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 literal 0 HcmV?d00001 diff --git a/img_5.png b/img_5.png new file mode 100644 index 0000000000000000000000000000000000000000..e277a94f1a26286b5f5a63f977740a520bc7b7e1 GIT binary patch literal 61032 zcmXtfWn7fc`}Ho}A<`0pQqtX_0@B^x9n!svpdgKO_afcWt&+kqq004lm@adx_0010+{$Iz!c>em~ZFT?vV1U9$8Erq) zgB;9`H##X#cFRxI*rc9)wGaVJJQlX7HVk7vwn(6-J~1geoQ~tzvIRMaMhjIy~^WuwaNt z4)S4#a+zo*-VMiU9@GM|)Y9kSCkeQV=sy`(XDKWGp}3Ih;N|tEa-R;bDC6Ggx09S; z_&Tfgw%lEJfM3{<`Ve&M1Kh%fNlYPW1vlOrp%;H6Au1%?Iy6?|uxPVaFPOCZKtkO= z7c=Yqa3d#1S4urRY?75Sa_eod9N6I1Ki{g;&!;O@p?4((ZD($`qq&9pf$*%aA>Ka+ zE~1;Hj_Ho*vfU39;DY~F>S8U-Cy$G&K6oSBvpVc`u1*{Pgr;0T?bD^+@vV(O! zT`L1zyV%u%02*meZk5T(WB$IMBfQ0+p^AD9}yRsw{V2@{OU#JM92P0z;J((zP z7HIu?MJ90uCj*L=ACvn*?734s)r294wYF12!n zv`O~nUc48VmtXOz1&fbOo`*wwQdfmq$d&({(bGx#P@ndvD613d%)ZfGMR^JMYXmUt zMpRdF?9aAIC=FPg+@61AQ)}YYK7d8}0Ur#hxMaYuUzPq0Dd!ou)*T(!%AIMP_!3ae z4oyAN{S5Mg_6VaoHCkf4bPoWH>cZGLu0Mq_9rK$A`4i(?zA>l4Oc-m4ZF6%@5^&$D zH9MxJAb5D#KeT!GzZFJ?H9NJ|W4`0mcTE`Z(DTak zP%BtA=N)9zp@whkGag^$sd%UJLYSbqo`mR7G(esWTYUz++o(5O0}ChZL>1J`%FR_> z?f;?3R#sdUB{(`7{&>0nVHFw5Ejq35Nt}>Bq#(_>W>YAOtEnCh0DGlNV~@#H{1B9H z(;uYvdz-(2jbWY4<^BFIZVc9f3}j!Q{%7FET49tR)fNrvPjtGsE{gMKte?nH8G=ci z5_Dk-vvPNTSw^4;j24V8>I41Ec9izX`t~8$zMQK>;y8WLKRx`j;^+`6?@NN1Z!0TZ z-2B265C}vuw(-A>>4@e36@^<|+}Xo>74cq91h>AJn&-ZyUv1(Ldz}^CJBU6Y_ z`rimVbm11&wyES{E)OB}RMk3IwL6FQLajch=x_>5%R3U7>}1OndzONo_5?+`0Zq{L z3PkogxLJ;1H&nqcGvfu64KZxX?A4py89;tXbxbVw32|&Yh~_ps>|MK$pJ=72&`Tt8 zhO#JSEMm3>CL*ba2;y6EMEV$bYx$o(74pYU?grg2V&_(je*Nu0S2CNm?z7k`a0!3E zanV|`T3PKj*2PgC@tLV6AkpaIgN1$2)kREzGyM-BRunq@5UA%5qx*6U1uEdnD}UA` z21DW=AQxRWPeMv->Yb+g;T!53JjA0;Xt1RDc-^dpm3~^2lekoMx{ckvAqXX5dlecM zX>F@A!fBbcoOn%#iiaE@Z80#Yb{NBu9-d}TeEfVZ#wUhmyJms##P7DV_W9`5oPiL> zmA0Ds3C8T%iHuqteCwM{n8X=K)IYBzEG#%pMi`^|RR?v$!sf|uhb9+mU!M5`$fw%Q zzHh9CCL1ew-hUE57HYdy=W0D!y`S#1v??Sn^3J5x-$fVW(ll*0-gCd6cQ#&o3O-qCsGS0Vb+D^@Xb0X~$9u)#2aL9D|zH8K#bII5=YiNPYxOTFc zIlg!(53vgdaj&8u(;iFN{6ab#Zmk^TASnArX5(#+KQxUN;JuauBz%NBd;?O1i@c|; zngs9)y$#@Znnt5Ub(HZ>R4*_62knpxr1A_Ic&*yQN@@ zm?IqOyr(jcZNpBx`)8itDvV+29xl$3#9KVADFo>79Str-3A}8lIIjaYvM{t|Dc|j* z*pCL>Xs?J$sC?L1*m9sdyohTJHWG9d{j*)*F=nbcR#DUeZ|#;#$@?sjEAoD3clqBg zO9Fk35F|^dU$SiqwREh4XWx3(-#{4l*;pz>WrJDe{yoIzSMOBx8O0&~ptELzt5O5# z=WS#N4hZ@;^-da=o9NsC%k>h+ZN!b+eYetXd%S9z@wk3FCnUOk%&}T24{0-ty3W}b zCz)jM64G1Mq}#-S`OJvr4Of%tOK+_83gNpK61QG`TYBIA@x;?aI@-L(KATSj;qPI3 zuGs$P$12Vwkmz>iriS%x@p`*wMNt?BLcrv0Y^pc-lD=e)OPmhE^)fmP)__IiVy+nh zzi%6w@}6H)_5`pU>B?@Xu5E36?OWlfnth*DH*pT!HfKwUENtNpW#LsCJ8aBWZP+_t zWO<5T>p4)7I6%hWQcYUXu7|N9&3`tCjGhzLX+4Z8QN%~V_i?}O7LkUnxZS%o{!o&D z1ZT>pnpO-fS$!eopeOlN*+uGv`Ih{gJ1nlUhA6kg%J$djSN_#vC>`CEo8B>vAqE28 z(e`IKRqrvktq0M$-k$m`s&&GaYx9^a%u4r|$DGDj_G2ht*1MAuk!dyi zZQHX>4|%++j;gtap+ASf6YpSX$HlnS#R3RDf8J<(Pkrl^CP>4+RB8-xc%DMtq|HGp$t_4h=!s9lnjR zSGw$4BIX_kiIB&TD};kZ7L%~XVG*?Vvq1n;$8}2RRZN(DrO98|_~Pc_zX0ZaRnweN zH%?uHU9pu&6I-`>;L{hNdIN~?4%6WKk>#5-n#B*a*W_{hV3sjI>6y_k#v?FOC!j^A zcToZ243@qObx4YxDVj(r$?|F-N4yJ(_#)nnDOW@pgOm>@zc%1gmOP~|Ax3QkRA=}K2?;AbXc()|8g$e{Lzfl z#lI1q7WehsjRuE&iI>P#U&N72edX{XIKnEUh*gOOeVifGK2*B33?-#I*S+vPfW^Ep z<;`eoZrGbO#-5M)3sg}eEi)A#*u>!*u658mMYQ1IN!8PoVZtAxd(AdiA_J1lKGN%S4=JBBWzxyw+5HYD{LDM6z;O z(F|!iwd^@AsP^nw0AU;;H;1UpZ`@jLYv+9u?VbnVWjN-0UW|`%2CN^({P@+vsioOH zIo>y#hHS%mr3`8D$wLh@e`z_(p!*~Kb{Q^kaU`8jCbUEZc&JqX`HbELhF8IWNp6E+ z?nzPfO7Xklruz~IS8JLtD)(EChjL$e@H>|#;v@nojBZ;=7^a&;n<~#SSk~EAS&Sd> z3C^J{SG%+#L_5~$PtR^DnSq=CLuo~j;@vQM^HrAjpP(XmHIYTezjj&EA%QpdPE^uX zJuw2xvWq%}w#0E5h6F(|M+%Hu#_xJ*v~@EhLbqb_JPQm=SQ)zp`kH{J8Z{AWTxD@o z%AO7d1XbJ*mbh;aC`;Mr^L4VTy@1<~wA%b8mx&%`3vpk2PWjxn?~R?gtY<>{y8WL6 z3?y%dOU0L-V<5oQSdF6`Cs)2J8HC2FLPD?j5l3wmj7*ubnRv)J3g`7VM9R@^pW z&>(lAT(v;97Pr?t4^58dqNuP(_uHr;s&y@oAtNz9dbE$Hrv#gKKN<28@CVtr>9UAz8|vo))q!zNYUk{UckkdC9LxbFXxyiE_m$_I^v`u!FiP+s1wEt*3}> zrGIDZB2`Gzw7OmSoL@iSG0D+f_=%(u)_v5&%YFQJwlsR2LpTZegj59=NjCYup=&%@ zQn1q)|GW@>*f}bbX=kdG!l;AHOo%%?IgAYb3Q+q$ zny7^cE=mHSN~)%7T1p$ge){0SEmG&yhB6E)mM^9uq5z`937HZ3F+=YU@8d79FyU=- z6N2a1twlPq($a!vuQiTCFvrUM`Be!S*#&HV_jXg+uCT1?ra$HrY`TmD&o87unjv<= zzLtBBlZ!W#&U@PBCZ*CAjqU%v&wzJ#5T^Xvgb6|4*-YwhZvPb9$CqX*N2Shc1V&ARdv;hUC)3EJ0ID zElg*JR!k-%F)A$!%_^DL3*;yxP>+W5%`R=H12jfw78uyEkw!Se# zpkgHUlxrEfdt2wP_z^LpesCbc6D!$RUdRcI4M^%GEK{LTOu{$PZpL9b0G|C{{ zptM0cYlYX~9|PQt|*+#P?oMFj&dxpB`9twI|@HL%Ty9ud-M{u|fHq(-Meo z?ywKumM%xgNTz&h{(Md1VYU<>a5N>Gxyvr)n+u^eq7{+GofCx$ej2%hqwE&CDLVWt z1<;bTVw8nX84<1MPfw5ImEOXSj3%JC#!W$$$rt(h_`0} zFwPbeNAXA*8F}=^x+!bf3o;A6+uR8xuRf1|)%3`?AmSzkOY;%fdtXY|WE3V% z(ontU5^|cj4cTBJbZ8=tO?H}KQ8O&!w_H||;Ne;<|1cqv%Xi(9YLs(Sc=ub-esI`y z+S1&pq0-kRQX+^ z<%f$YN0ArzM#%n@3W!s<%FtUk&urjMiEmuQ$T3B^vctLb4`;etzsoRZq}3?;d%oQ)i!;sSWVE6n1r(*adwW1AcFL#0aZ|MF+ox|q0UwzK zwp!BztbXymCQmV%QhU)@kMpv`A=Tvk^SA*|GAh#=9tFW2j>NFp_TWtj@XL%y3abQ1 zDQ!|Szov43h1|WtLQ_z({7T4j@T|BL9|$GcAMnGWM$6E)axZ>%ZCHkaVq1zM@4tcR5QlZQDQj(?!G6Xf9hopQdG(Yq5fN z);Wvj;zgq0BlImewIhcc(B|Byo2-Zk@2iu0-j}!F%hNXhhCSvOfzXStR{aHdko-fk z3eh)NTL$TKPe^c_j=NbL9kjqs9qSs7>b1WSBCUpd^_g>nSd+e53RjwVpT zl0%WI&_UQ`CNapb%T_mAqg&_vUz?M}w4I3pUCBDR`y^HOrfd#na}cJY z&O!s!%zAH#&+||i=gn{pDiNBLgABo#L&Y29e%t|-?S?IC-h$0=(hN%j@8x!;!yFuq z^fuyC)bq7ksX>*P=zU>6OZ$|cDk0&vrz{hmEsrmVpbO^C<9Y}8qE z2~P9OPOIcx(nBjug^2?%GMlpcygPdzNy5GQ+lZ=0 zy$4KxD~G208QPphp|VZxL%Hd?GdASxvKoI@$jxS7dvU%Y(&T=Rs(u3a>3HX*@?I{} zvEAD_g%z_P&J3ovTb5H=Zq7k1ya}<5+Yp}&ica@}sK_0b9C-Ce`(NaY?MmX8?>Jo& zBmUW0Jbszj{t~svb35EYE&t@v(FhV{r_S~ndH*Omha;~cq3zbAy{*o7X*+P!3h$LE zO&5g=&43uY<}e>NyA*_$1D>`}A%n_?#4XeI?n+Wey@n2S(KeYW-k-qAl2;+K#3&7S zvv<`j&>+A?+ltCM%+8ot(xWHM1&DDIy^2)u+uC2H3OR4~?7!R>oL*{pn}G~E){~D2 z>pJb{{pT0Bb&J9RNQ?6l8wzT~nk^(gHfAsQf=#Hx?sHZs;P`S(1U^Tx%Y0qR?jF1N zPG-4ElEo5C;sUPM>1uR%)I)Qs{>p>3)-k<`X6t&Cb9O(~)%dEZwZ0A3cx@tTzSix) zq~-4~;>TMR-W89jM|;4#=p0R0{b{XvI9bM^UUco+Iv<$Sox1#jBArWMV|Xg{o+gnl z`H7%VQm5i){DRF{AwfV0Z{3JXuk=^RO{!5Q*hRbYMDeVBwp#I;7hmdazuWcwE7XVzd;Fvq_OM(33MSO~&0_`v?n zHtNXNk&`1z6$9Y-sv4?xRZ>#z}h!Ir7n*a>KDB`p9H6QTBc zTfCp4!E-wyc{{>ClxN3P6&ENVfEHTa#=6?*22j3Lw&1IZo8fGp<196=YWq`hGuZv< zVF~SkN&=Sj>yM-fzt(LBynew(XyPw5T??JjaXN-Pitb}O-DD}oA1X#zs#&PV0s=|K ze-bJXIqq*@>DNV@Xf&<75kO-9M#XfiJjMt368~tgiMkKh=PthXDeaNDa*3iZ>)OBD zA+I?eoiE9>6^CP5rES)>d-hV~9iep0zE4-PA_2{?P;j!b z?(h;1zYe)?SeNBmEz;D@t{IM6{28btAHtgDRc?j%H$Bpu16s3*-gAzw9-Qs~j*>K$ z=tHA73A0D%DvdTg9!dpMj-a)bHJo{i|Q>!hZ$U3{$Vjak@-P3 zH$}SOGYG?2-l_SK28vn@sQ}BX6X`9Q}Gb{*CMO3}KKIOP1Aw z+Q|!>zhNA3al4MLQ*hsE>lNVT_{~6U=X&DPRg3%0gk5-i$hOjYC}D`b-(Wu-r4ML& zzn{3&_?0US!8(_n390Ehq_dAC@2ax)uELBiK5nTo3FPWfDJ@ z<-#>Xj=}m$d}F?KuH4nR&(W#jxCO%G``~#G_b2l;ASq+7MdV2$EJ#G$1!2-h>lPv} zeAKbem*D8kfFVx!0Igg1=US2wcSx(V z@3`4|?(;qx)mOJ$D#ypbFHkovkLL2a^2n`rUrGvj;lB5;WF6maRj6X*yswMyPPye| zCWKlUP;F=0z}w-n8vl)1YGXe2(MalUqf+L>kWo4UH@`M4(TT8nUHfa{b_j~@s{zIt z+xZ}YR&&)F=%4CPZB*Cfh^)3(AC+$qD8`x6vJE3ZG~ndVd!NM_c3d=;0krar^Cfv* zZLZK{aH84P>)1Lj@<{Mk{ye|xpST|}Rb|=q_BE!-yiLusX5?i=PDQ4bB)zJW?8*x27r7cCXhP-8@@+OY|#g%{CUfv~QsW-;Z=t<YC0nvoU=rzvQN3<*pN>`3gPUc#N9~)( zn#WhUw@c&;r_Wj3+2M>}i(EF}B`O-oXR6FrGXxQFMY#GnPplh{DZcZ1-KNIBC={Vn zQQGHpy~HejS_Z?3xW5rv?6ab!m>S552h>cDMF+-AL*o_+~EDtZCouZoQ`2QRU+Kt)XAQ z0My$MJV4DJiN~Z8VD?reW5CVXR3&(@h&9flHV2I6cs=(2U4|rde z^j>QjN)%H|nsG+_5UKCoi_Y;kVSAR%>IFv6j@beSx3zSy z5F>O2=_1EuiW!3Mv15m65dQ{Z8r7#V64ol8KfvR!B?wl`t$_>}-6(M^ z;+qew7PeI=*8uF-ZLqj)uC0YzV>%H{(Ewt*1^!ROLN@NaSGxz6(q|&Nw%{FcSZnL)SkQ) zTVQe5xOS$UlcVjvs{UC%V~sl1Md+*Nrq=`mj~j;X$Xzab34{G0*q}dqe7P)$L+pKmnHL44H{Q1Tf-?y z>y6Phgv<{c_3jfK!K6ebIf|aQXQ%Gl|FZgb)0WJGu2Pzf+Rm%ZC{Uk@e+7_f-wZej(Ta;jGQ^{E$#=gxagwqzBcPVLL&TlWMp+SJ;!{?@}Gn{UmhTggy9Gk|3pV4*n_PoDiz? z9S~{kf_CRisuJG2EioU!!iP!t*uf;&UDo%ZWlxF77 z#h<=SuSZJJk*i8PmAjv{rcvwv*v_sv9*iT8&>Cy!&32#pvwkiAN(UYBrLEW)9Tr-< z7@zi4?XgMdIkEmYcXwUUuLPl23KefJ{_VdinpQej z&dY1r$;4J1i=WBm3LrNR4I?ZTFBHgW`+>8`(Ocfk?_2dg{A#}JE%igNMr~YJ3cnJ_ zwR(3*p51)YV6e$tqt?Ev$i6JMMtR-ApC^!RHYCDP=sL?ERJj*0G2@kaTzSnU(7G5n zfdT#}CH}PSy`D%Z{csN}r5v9|RR`z-aMpqz{2Ob02X}wh zi48$MxIIH3bW%~tNeOyNTc?(~4ZiuD3L|~T)ED0n1XMpmk)DvIyZ&AJt;R010dSFI zhSc@@>*)gpdeNbd?|XQ1ct0p%yHL%bgIP1KJ0a=E}!D$?6@Nm;?=GMHFV`fwIYlZGDh zpv0o;D#5l=Qde1FrYESG_%%WU)C?;2_A3KNkSd`FhfU!vU#(Ny9(~B*rYt%K+-V%79Xb1shCy zAzyfNfYeq*TGAsP@?$Y1XHbBK0#xvWZqt<1&Lhb=kdHMgmF-m!IwIwIz#|~yVpu;8b#GPZ=aqe`=t65KF-u532uDp%EX}xvu zA2jib`c+{$MV>v~3dV?RB?AML9@H%z z@??SHuSypb8GFkS?@h)(P3e*pTAAjRgD=;p&zg7H{ey?hWOz4Ot47eSyl71pEW4j2 zF&g-}`$BV-`;x7sBznWds<>De4H7@PK2!CV=t*%=CODKJi< zL6k@)sI~l56L!Uv1{SLYt!J&HbKS-(0tgYNm*1Kr^tyS3nyy@j`FoAn6@BA{j$I~x zer%Ln>m|eo3E#fQWk4PuKe8WO>TI1Bho>d0AyQp=erKecp*K&#g1}T z`}6%1huQj8sYrnm@Eb2C{*s1njw^@{&TiI@5bF=-izVsi=+aUi_=xp%rA4O5Q`s)S3-;YTM5QFkweC^Kd)ipASx-+Ia|hXBBqK~o=r&Lv1Pi&n9QwC*fXx&YrH^R^y$q#X1DDF4*<9jemc>X^ICc?&0M*=<3WD=a*~zfPrJx zWFW}|Zu)7+&TKQX*ID_Z^bAPI_0kv9cz++B&W zi0}Jzje?I$)*H<3Li9VFmvlKq&l*Sij8-mX&Py5AxY|8O83I852N^y&g0GPKR{eKU zr?<-Xcl@ah)kZEMGj@``v$aaPN6-2GrmkIEEG4~h5W*hflA9X3PJ@vPV3PR&D8IDw zIXZq`Dt=cbS5KpVn!`P7Ok82-KNc~Rt&~72vng6v8^}p7+2xv& zv}hcv$?1~p*pVOUL#XcYB?QT0qy|2Oc;CQv7}r0545&>#=FZ%ATEn)_ow0J=nSt7) zks<_SQN2tUD&b)1hMlkje!eKK7re=_Wyt}hvy)!;y21XO!o(~N3#xUvyM`n!KzI!9 z5(Qo-2Z5`tZd}ha*lDyWqlFG2EObqVE0^wH47SQ9SH3ko77U4VNUmm3N|9@Cgh#mV z5t{5MQ&SN204Q7|Y=gHQBr|n43~js}Br$n0)pNznlQ&x$j2b2u_la3;W}x_UEhxk!AF zi_@uMW9c`t)JhExByrf`zOEtx2`yAHP3hzs$o7*HJ}lht`zmyuF7=Y+SfDd&)GliK z`|8E$$a6e`^Y#Cs{NzC}ZW4ru1hUA;LV^V;&@6s+dfj^6Or3UGT<5V9a*f;^Qu@(? z`t|3ITXJg`Ek^o;#?ZhOOe^1(901c1gzw6e2u(bPEytCQRYb@Jq1kS~i%Wyh)C0JB zOgELLf^#7_nM^w#v9F;OaOFn;KbQnpWR8KEWUbC8u1(Nkjn+Z--p)i1d*2Try%Njs zb*aHFu41k_WBBTx<|i`If*LC(AOX+D@f;|`cV`K7$iU6npr=As?>so9?lPWvfGex- zKR#&#r%?lTgzz&jI^e!VkyZ_@V~J__VB42G$H!j@eU=vrE@ZDuUF=Dvfhq7BV_V34 z!#H3+eMQq1a~b&c$$D_{rPSRNI9aqceSbW`TV-Zr-#{tVM1}(L_muBrgOvb+~ zMek>MB-SsxjVa^W9QlnKo!Jg<7j@S6GkgMKB~};ia9ZI297ZgP-onF{glaiLK}&43 zM^ydE{7v#73QF(t8`)~b>pcY5?6oK+rg8% z*nVg961XEHT&$q9yLsacmSMH)q7o;Y?3+w9*Cpm;u5mp&l*}n0k;qvN%rtl#$E6`4xtpttXS^_hxfTmX7jsC)TpwETp2uwL)$I) zZ2^trFyTTeyGVUxaj*GhddDF1)ra%LN~+UqaaY1H&auSqquGm0{?*2qRNz#2LJhHz zXV>PB_CbJMhcL<$;=&(d49E|{93)9FtM+* z&bIl@If$?ZQr>QF`kOg0NG@=|DQP!FM(=rn{!P z+TO_5TYAf$Vva^JXpL5-$CBaNv1G67R6(v3ugzH`P#fV8jqxFfuE-s`HJX&1tL1{oc||b<4JS1KG(f;I{T$!l)sfuH1ddT!pnzpXWXe$RzpwL6>FoK zM5D1mVpoLAj4x^Kse8vEvj+wck-A~t#CtGVfdg#}`uM;syT%8Hf z*;~w%_5}J-3(?z2WYZPIT53+S#falfkER&iGd4?1a;TmUoOP7` zcToh1N=PHs=aF{DuJJEH?Y*bI6N>Gfu}y$s(B2pdjYsT`kvdfzyr)4f=+9(<`)&?< zkuLpzT0FJoXearS;44=XK2xB2*Xtx=ElKFOjcEihnJ_s(z4SfDC;c_f%XTC;owU!+#}Nh9PUxv zi|WFNiK<%hpc0^xk;vo}R>~uU&;9!RFrS!Q{id62d!*5r=C1_WD%SeXow@mOWB~x!aX$zc*fT}t`z4~L& z@95Omp1Roj6qG&1JV)vq-W;i;5Bmd-?y0xqL_N9IjqNG z$d0V8HrHB0vhu|c))&-1hYgOMYkHCq{CNxzH*wykHf5UbfNssTe9lQp3%HySi&D1f zqVXuWeA>6Cl1Am1#^|T}Q~|5?B_j-{aMfoS92d{ew9Aq$+t(AMFR{5$ic!`w7=-VX zHo;W!*8{(i1V!3bDl0G*R~EJb)4Nhd%dTl*JjrKiOcej1aCtr`PqJ2_m%)j@nzdYGU+6{D0aRIkN5= zCp9z8hEddYyGp@(wWL@axaZGoQb< zmyM62X#@jH@-r}qwO4gpZUD^nJVIU%=R{PY3V+VV{S7y%P0hTZ_%E$?TxLw zn?kAX7~dy85X8eMD}3bD8sK_Ws=`7F{`ZfSl1(+xp9lWqeKPR)@BGQxIIp)Kv?gl zUfad*p=*1_a-nEemwL~=s0Y*EVR9drBbJO=aSGQOddp>Q z3-BAF*;v0fis+M7!syG{XSNGvUj5M?$`7tdk%}Hg@N3YNQQyRF5zC{~sWS@dkON}S z0`byu$O_({ITa|dF7R@~beC9Jtdwd)=aTPUxde>u9AH^g!+mdL7k8U=TNiJAqsy9= zZ(hL!uHi`1{E^iG-A3^ePnE7VebAn!dVuV{2M30!^dO^&L?^%K*;Y;@2Pf`#0hUi9 zDzgMh@ip@uua}a6yEe^)hG62ZBHi1iFB_h23XJv#NoD`#tU-K#5 z@PEGqge80il_F$J)5UEJ|7CvpIEnL}*xX37U9*$_Oh1K-j2>UY20L)HH63Ta$?5fH z4VvgN@2DXot~Uc6T(P6DY(y~630luz>e4N8^@eM=pkJvh96x+DZS`E&jICD7@ez~M)5%LM14=D}T)1xc#bbKev-*t? zB8SV*s2ND;5&AE?nIXK@;D4{x5n}a?yG>t*ciYt+e6y4REXO>@?i1HEM(;^02U>+) z-bP|sSaeD7PcFT(`C?n_uT?%;muZ|AH>Z;-+$puq0n9HaSsTkoffwiwD~MG`w#Kc# z;AqOBkA*_7I_#~+enF1(JzZQPB1-MDwpk<6UNqQG+!dH}j0J}Kp00fjEScAZmP>Ls zdfxV^NDl{A$IJN7HKy&PpDDPV%h!E#-uC_MWMz<+aB4oHe$4Qc?N;f2xD{pMR^ z9nSOAAG0MKG~U*~uqILV9~A5Qe8y`auysn$melck_rY?(awhSM)AGL-)eF*Nu~qKX zG>qF_30ddk8~x98TyJL1A;B!XLEWG4<%N>X~9ng2~jL*cDv1Eq%|FUqymGx0Gtq3v=^P0{W$dPj*j7C*Dv(hlIxN=no0$#8KeN)f>~hlt)5UG=rxhSoDWEBLbsQ zx85Cl%&BG5m?912inSX%{-;heNw4OJYdzG8z2}xH1ta16MyP>Ly3l_!*L;sLyH-i~ zx6QE2fK`U4CY#sSPU9=i-9HKae|1>NUZ39E=u`+r@`3`RJ?c%WI~tN)H9yYuFmaXc z$;XrP?Cu$Or>S>Ti}rE zm#Mu?g01noDAo~5z3y6K+Gq=wCbhpD<6yc1y!L>AhmP&C2jrlHtE$Zy4sV3k#wOr| zKfJe6;p6Qk%4v>woP1~nD+idhD|ZFty?nhNSct^5fXjQVZ9Z&BOr3#GKP7aqKcsg{ zEm`Fci3vckj{hFxceU#;TDy7##b<$niFT!ptFE_yMg4Z}TS8)a`Uqr7s5FmfT&tjb zcT)}XMrPWTq4QsiqN|ISYBQZE^J6u3;0!zceheX%X9_gAr}9oDQVZpuf$a0v*T;1@ zfA!y0#klvqnFpIG~T*qd}+hJG$WO z-c+OE7dCtI#B4tdLiZVOwN9{QrybUYUWPFixS4=wD%M23{qt&qe z6aG#+e*7yOz9 zA@%evrC3WV#Gt6A^)|E3td1~VJBOETAqB7omvZJO;HdtF5T9h&58`9EtSthjksbc6<)*+gPnsY%orj5;8Gc>( z>?wOTzA-sCIu5h@p)zi8I2EF3_>h%jzQ6*Z%k|njWXnSWdsGf3mTmX&6S9U##fJo1 z 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 KMNUMnLSTZE7T{a} literal 0 HcmV?d00001 diff --git a/img_7.png b/img_7.png new file mode 100644 index 0000000000000000000000000000000000000000..494d9a9ebf98bdb9e51a4771071bc7c90c477526 GIT binary patch literal 60519 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 h{)WUW?3QE#BJEG)8u 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%0Ah;eaI(evbfT?SKZZtbdgu;1LQ?*fQ-;MFQ4ld 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