Add default parse mode

This commit is contained in:
jrootjunior 2019-12-03 13:10:09 +02:00
parent 62bce34b49
commit aa7c5796dd
9 changed files with 54 additions and 6 deletions

View file

@ -1,6 +1,6 @@
from __future__ import annotations from __future__ import annotations
from typing import Any, TypeVar from typing import Any, Optional, TypeVar
from ...utils.mixins import ContextInstanceMixin from ...utils.mixins import ContextInstanceMixin
from ...utils.token import extract_bot_id, validate_token from ...utils.token import extract_bot_id, validate_token
@ -12,13 +12,14 @@ T = TypeVar("T")
class BaseBot(ContextInstanceMixin): class BaseBot(ContextInstanceMixin):
def __init__(self, token: str, session: BaseSession = None): def __init__(self, token: str, session: BaseSession = None, parse_mode: Optional[str] = None):
validate_token(token) validate_token(token)
if session is None: if session is None:
session = AiohttpSession() session = AiohttpSession()
self.session = session self.session = session
self.parse_mode = parse_mode
self.__token = token self.__token = token
@property @property

View file

@ -38,5 +38,6 @@ class AnswerInlineQuery(TelegramMethod[bool]):
def build_request(self) -> Request: def build_request(self) -> Request:
data: Dict[str, Any] = self.dict() data: Dict[str, Any] = self.dict()
self.prepare_parse_mode(data["results"])
return Request(method="answerInlineQuery", data=data) return Request(method="answerInlineQuery", data=data)

View file

@ -65,6 +65,23 @@ class TelegramMethod(abc.ABC, BaseModel, Generic[T]):
else: else:
data[name] = value data[name] = value
def prepare_parse_mode(self, root: Any) -> None:
if isinstance(root, list):
for item in root:
self.prepare_parse_mode(item)
return
if "parse_mode" not in root:
return
from ..client.bot import Bot
bot = Bot.get_current(no_error=True)
if bot and bot.parse_mode:
root["parse_mode"] = bot.parse_mode
return
return
async def emit(self, bot: Bot) -> T: async def emit(self, bot: Bot) -> T:
return await bot.emit(self) return await bot.emit(self)

View file

@ -31,5 +31,6 @@ class EditMessageCaption(TelegramMethod[Union[Message, bool]]):
def build_request(self) -> Request: def build_request(self) -> Request:
data: Dict[str, Any] = self.dict() data: Dict[str, Any] = self.dict()
self.prepare_parse_mode(data)
return Request(method="editMessageCaption", data=data) return Request(method="editMessageCaption", data=data)

View file

@ -33,6 +33,7 @@ class EditMessageMedia(TelegramMethod[Union[Message, bool]]):
def build_request(self) -> Request: def build_request(self) -> Request:
data: Dict[str, Any] = self.dict() data: Dict[str, Any] = self.dict()
self.prepare_parse_mode(data["media"])
files: Dict[str, InputFile] = {} files: Dict[str, InputFile] = {}
self.prepare_media_file(data=data, files=files) self.prepare_media_file(data=data, files=files)

View file

@ -27,8 +27,9 @@ class SendMediaGroup(TelegramMethod[List[Message]]):
def build_request(self) -> Request: def build_request(self) -> Request:
data: Dict[str, Any] = self.dict() data: Dict[str, Any] = self.dict()
files: Dict[str, InputFile] = {} self.prepare_parse_mode(data["media"])
files: Dict[str, InputFile] = {}
self.prepare_input_media(data, files) self.prepare_input_media(data, files)
return Request(method="sendMediaGroup", data=data, files=files) return Request(method="sendMediaGroup", data=data, files=files)

View file

@ -41,5 +41,6 @@ class SendMessage(TelegramMethod[Message]):
def build_request(self) -> Request: def build_request(self) -> Request:
data: Dict[str, Any] = self.dict() data: Dict[str, Any] = self.dict()
self.prepare_parse_mode(data)
return Request(method="sendMessage", data=data) return Request(method="sendMessage", data=data)

View file

@ -21,6 +21,15 @@ In this place makes some more differences with official documentations:
- timestamps has `datetime.datetime` type instead of `int` - timestamps has `datetime.datetime` type instead of `int`
- InputFile is used for sending files and is not use `pydantic.BaseModel` as base class - InputFile is used for sending files and is not use `pydantic.BaseModel` as base class
## Client ## Bot instance
... Bot instance can be created from `aiogram.Bot` (`#!python3 from aiogram import Bot`)
Constructor specification:
| Argument | Type | Description |
| --- | --- | --- |
| `token` | `#!python3 str` | Telegram Bot token (Obtained from [@BotFather](https://t.me/BotFather)). |
| `session` | `#!python3 Optional[BaseSession]` | HTTP Client session (For example AiohttpSession). If not specified it will be automatically created. |
| `parse_mode` | `#!python3 Optional[str]` | Default parse mode. If specified it will be propagated into the API methods at runtime. |

View file

@ -1,7 +1,8 @@
import pytest import pytest
from aiogram import Bot
from aiogram.api.methods import AnswerInlineQuery, Request from aiogram.api.methods import AnswerInlineQuery, Request
from aiogram.api.types import InlineQueryResult from aiogram.api.types import InlineQueryResult, InlineQueryResultPhoto
from tests.mocked_bot import MockedBot from tests.mocked_bot import MockedBot
@ -27,3 +28,18 @@ class TestAnswerInlineQuery:
request: Request = bot.get_request() request: Request = bot.get_request()
assert request.method == "answerInlineQuery" assert request.method == "answerInlineQuery"
assert response == prepare_result.result assert response == prepare_result.result
def test_parse_mode(self):
query = AnswerInlineQuery(
inline_query_id="query id",
results=[InlineQueryResultPhoto(id="result id", photo_url="photo", thumb_url="thumb")],
)
request = query.build_request()
assert request.data["results"][0]["parse_mode"] is None
token = Bot.set_current(Bot(token="42:TEST", parse_mode="HTML"))
try:
request = query.build_request()
assert request.data["results"][0]["parse_mode"] == "HTML"
finally:
Bot.reset_current(token)