replace requests by aiohttp

This commit is contained in:
2019-09-15 03:27:29 +03:00
parent 28dabcb44e
commit 2d84459c4d
7 changed files with 21 additions and 20 deletions

View File

@ -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.

View File

@ -1,4 +1,3 @@
[ariyala]
ariyala_url = https://ffxiv.ariyala.com
request_timeout = 1
xivapi_url = https://xivapi.com

View File

@ -33,7 +33,6 @@ setup(
'iniherit',
'Jinja2',
'passlib',
'requests',
'yoyo_migrations'
],
setup_requires=[

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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