From 2d84459c4d36999477bcf302df97116ee0cde775 Mon Sep 17 00:00:00 2001 From: Evgeniy Alekseev Date: Sun, 15 Sep 2019 03:27:29 +0300 Subject: [PATCH] replace requests by aiohttp --- README.md | 1 - package/ini/ffxivbis.ini.d/ariyala.ini | 1 - setup.py | 1 - src/ffxivbis/api/views/common/bis_base.py | 2 +- src/ffxivbis/api/views/common/player_base.py | 2 +- src/ffxivbis/core/ariyala_parser.py | 30 +++++++++++--------- test/test_ariyala.py | 4 +-- 7 files changed, 21 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 4626fff..c29c8d4 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,6 @@ and add new password to configuration. Settings related to ariyala parser. * `ariyala_url`: ariyala base url, string, required. - * `request_timeout`: xivapi request timeout, float, optional, default 30. * `xivapi_key`: xivapi developer key, string, optional. * `xivapi_url`: xivapi base url, string, required. diff --git a/package/ini/ffxivbis.ini.d/ariyala.ini b/package/ini/ffxivbis.ini.d/ariyala.ini index dc74c24..a11caae 100644 --- a/package/ini/ffxivbis.ini.d/ariyala.ini +++ b/package/ini/ffxivbis.ini.d/ariyala.ini @@ -1,4 +1,3 @@ [ariyala] ariyala_url = https://ffxiv.ariyala.com -request_timeout = 1 xivapi_url = https://xivapi.com diff --git a/setup.py b/setup.py index 19f8332..1bc576d 100644 --- a/setup.py +++ b/setup.py @@ -33,7 +33,6 @@ setup( 'iniherit', 'Jinja2', 'passlib', - 'requests', 'yoyo_migrations' ], setup_requires=[ diff --git a/src/ffxivbis/api/views/common/bis_base.py b/src/ffxivbis/api/views/common/bis_base.py index c336a04..d364ea5 100644 --- a/src/ffxivbis/api/views/common/bis_base.py +++ b/src/ffxivbis/api/views/common/bis_base.py @@ -38,7 +38,7 @@ class BiSBaseView(View): async def bis_put(self, player_id: PlayerId, link: str) -> BiS: parser = AriyalaParser(self.request.app['config']) - items = parser.get(link, player_id.job.name) + items = await parser.get(link, player_id.job.name) for piece in items: await self.request.app['party'].set_item_bis(player_id, piece) await self.request.app['party'].set_bis_link(player_id, link) diff --git a/src/ffxivbis/api/views/common/player_base.py b/src/ffxivbis/api/views/common/player_base.py index 50afa98..81b0b0b 100644 --- a/src/ffxivbis/api/views/common/player_base.py +++ b/src/ffxivbis/api/views/common/player_base.py @@ -24,7 +24,7 @@ class PlayerBaseView(View): if link: parser = AriyalaParser(self.request.app['config']) - items = parser.get(link, job.name) + items = await parser.get(link, job.name) for piece in items: await self.request.app['party'].set_item_bis(player_id, piece) diff --git a/src/ffxivbis/core/ariyala_parser.py b/src/ffxivbis/core/ariyala_parser.py index d372997..2f3909a 100644 --- a/src/ffxivbis/core/ariyala_parser.py +++ b/src/ffxivbis/core/ariyala_parser.py @@ -7,8 +7,9 @@ # License: 3-clause BSD, see https://opensource.org/licenses/BSD-3-Clause # import os -import requests +import socket +from aiohttp import ClientSession from typing import Dict, List, Optional from ffxivbis.models.piece import Piece @@ -22,7 +23,6 @@ class AriyalaParser: self.ariyala_url = config.get('ariyala', 'ariyala_url') self.xivapi_key = config.get('ariyala', 'xivapi_key', fallback=None) self.xivapi_url = config.get('ariyala', 'xivapi_url') - self.request_timeout = config.getfloat('ariyala', 'request_timeout', fallback=30) def __remap_key(self, key: str) -> Optional[str]: if key == 'mainhand': @@ -37,19 +37,20 @@ class AriyalaParser: return key return None - def get(self, url: str, job: str) -> List[Piece]: - items = self.get_ids(url, job) + async def get(self, url: str, job: str) -> List[Piece]: + items = await self.get_ids(url, job) return [ - Piece.get({'piece': slot, 'is_tome': self.get_is_tome(item_id)}) # type: ignore + Piece.get({'piece': slot, 'is_tome': await self.get_is_tome(item_id)}) # type: ignore for slot, item_id in items.items() ] - def get_ids(self, url: str, job: str) -> Dict[str, int]: + async def get_ids(self, url: str, job: str) -> Dict[str, int]: norm_path = os.path.normpath(url) set_id = os.path.basename(norm_path) - response = requests.get(f'{self.ariyala_url}/store.app', params={'identifier': set_id}) - response.raise_for_status() - data = response.json() + async with ClientSession() as session: + async with session.get(f'{self.ariyala_url}/store.app', params={'identifier': set_id}) as response: + response.raise_for_status() + data = await response.json(content_type='text/html') # it has job in response but for some reasons job name differs sometimes from one in dictionary, # e.g. http://ffxiv.ariyala.com/store.app?identifier=1AJB8 @@ -67,13 +68,16 @@ class AriyalaParser: result[key] = value return result - def get_is_tome(self, item_id: int) -> bool: + async def get_is_tome(self, item_id: int) -> bool: params = {'columns': 'IsEquippable'} if self.xivapi_key is not None: params['private_key'] = self.xivapi_key - response = requests.get(f'{self.xivapi_url}/item/{item_id}', params=params, timeout=self.request_timeout) - response.raise_for_status() - data = response.json() + async with ClientSession() as session: + # for some reasons ipv6 does not work for me + session.connector._family = socket.AF_INET # type: ignore + async with session.get(f'{self.xivapi_url}/item/{item_id}', params=params) as response: + response.raise_for_status() + data = await response.json() return data['IsEquippable'] == 0 # don't ask diff --git a/test/test_ariyala.py b/test/test_ariyala.py index edaf805..97722ac 100644 --- a/test/test_ariyala.py +++ b/test/test_ariyala.py @@ -5,7 +5,7 @@ from ffxivbis.models.piece import Piece from ffxivbis.models.player import Player -def test_get(parser: AriyalaParser, player: Player, bis_link: str, bis_set: List[Piece]) -> None: - items = parser.get(bis_link, player.job.name) +async def test_get(parser: AriyalaParser, player: Player, bis_link: str, bis_set: List[Piece]) -> None: + items = await parser.get(bis_link, player.job.name) assert items == bis_set