run in executor

This commit is contained in:
2022-08-14 02:24:26 +03:00
parent faae3f7846
commit 22de340fdd
8 changed files with 109 additions and 12 deletions

View File

@@ -1,10 +1,12 @@
import asyncio
from concurrent.futures.thread import ThreadPoolExecutor
from aiogram import Bot, types
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.dispatcher import Dispatcher
from aiogram.dispatcher.webhook import SendMessage
from aiogram.utils.callback_data import CallbackData
from core.parse_web import configure_firefox_driver, download_gecko_driver, parse_site
from settings import API_TOKEN
@@ -15,6 +17,8 @@ dispatcher.middleware.setup(LoggingMiddleware())
download_gecko_driver()
driver = configure_firefox_driver()
executor = ThreadPoolExecutor(5)
stations_cb = CallbackData('station', 'direction')
@@ -40,12 +44,20 @@ async def home_office(
query: types.CallbackQuery, callback_data: dict[str, str]
) -> SendMessage:
text = parse_site(
driver=driver,
url='https://yandex.ru/maps/213/moscow/stops/stop__9640740/'
'?l=masstransit&ll=37.527754%2C55.823507&tab=overview&z=21',
message='Остановка Б. Академическая ул, д. 15',
)
url = ('https://yandex.ru/maps/213/moscow/stops/stop__9640740/'
'?l=masstransit&ll=37.527754%2C55.823507&tab=overview&z=21'
)
message = 'Остановка Б. Академическая ул, д. 15'
loop = asyncio.get_running_loop()
text = await loop.run_in_executor(executor, parse_site, driver, url, message)
# text = parse_site(
# driver=driver,
# url='https://yandex.ru/maps/213/moscow/stops/stop__9640740/'
# '?l=masstransit&ll=37.527754%2C55.823507&tab=overview&z=21',
# message='Остановка Б. Академическая ул, д. 15',
# )
return SendMessage(query.message.chat.id, text, reply_markup=get_keyboard())

View File

@@ -44,7 +44,7 @@ def configure_firefox_driver(private_window: bool = False) -> WebDriver:
return firefox_driver
async def parse_site(driver: WebDriver, url: str, message: str) -> str:
def parse_site(driver: WebDriver, url: str, message: str) -> str:
driver.get(url)
time.sleep(4)
elements = driver.find_elements(

18
app/tests/factories.py Normal file
View File

@@ -0,0 +1,18 @@
import factory
from faker import Faker
from tests.models import User
faker = Faker('ru_RU')
class UserFactory(factory.Factory):
id = factory.Sequence(lambda n: 1000 + n)
is_bot = False
first_name = factory.Faker('first_name')
last_name = factory.Faker('last_name')
username = faker.profile(fields=['username'])['username']
language_code = 'ru'
class Meta:
model = User

View File

@@ -1,6 +1,20 @@
""""
Dict data set for Telegram message types
"""
from typing import NamedTuple, Any
class User(NamedTuple):
id: int
is_bot: bool
first_name: str | None
last_name: str | None
username: str | None
language_code: str
def as_dict(self) -> dict[str, Any]:
return self._asdict()
USER = {
"id": 12345678,

View File

@@ -1,7 +1,7 @@
import pytest
from aiogram import Bot, types
from app.tests.conftest import FakeTelegram
from app.tests.dataset import USER
from tests.factories import UserFactory
pytestmark = [
pytest.mark.asyncio,
@@ -9,9 +9,10 @@ pytestmark = [
async def test_parse_site(bot: Bot) -> None:
user = types.User(**USER)
tg_user = UserFactory().as_dict()
user = types.User(**tg_user)
async with FakeTelegram(message_data=USER):
async with FakeTelegram(message_data=tg_user):
result = await bot.me
assert result == user