mirror of
https://github.com/lilydjwg/nvchecker.git
synced 2025-03-10 06:14:02 +00:00
pypi: Use xmlrpc instead of json api
It makes the transfer much smaller as the xmlrpc method returns only exactly what we need here.
This commit is contained in:
parent
07951bd745
commit
ffe2ed52cf
5 changed files with 27 additions and 6 deletions
|
@ -30,6 +30,7 @@ class AiohttpSession(BaseSession):
|
||||||
headers: Dict[str, str] = {},
|
headers: Dict[str, str] = {},
|
||||||
params = (),
|
params = (),
|
||||||
json = None,
|
json = None,
|
||||||
|
body = None,
|
||||||
) -> Response:
|
) -> Response:
|
||||||
kwargs = {
|
kwargs = {
|
||||||
'headers': headers,
|
'headers': headers,
|
||||||
|
@ -40,6 +41,8 @@ class AiohttpSession(BaseSession):
|
||||||
kwargs['proxy'] = proxy
|
kwargs['proxy'] = proxy
|
||||||
if json is not None:
|
if json is not None:
|
||||||
kwargs['json'] = json
|
kwargs['json'] = json
|
||||||
|
if body is not None:
|
||||||
|
kwargs['body'] = body
|
||||||
|
|
||||||
try:
|
try:
|
||||||
logger.debug('send request', method=method, url=url, kwargs=kwargs)
|
logger.debug('send request', method=method, url=url, kwargs=kwargs)
|
||||||
|
|
|
@ -40,6 +40,7 @@ class BaseSession:
|
||||||
headers: Dict[str, str] = {},
|
headers: Dict[str, str] = {},
|
||||||
params = (),
|
params = (),
|
||||||
json = None,
|
json = None,
|
||||||
|
body = None,
|
||||||
) -> Response:
|
) -> Response:
|
||||||
t = tries.get()
|
t = tries.get()
|
||||||
p = proxy.get()
|
p = proxy.get()
|
||||||
|
@ -56,6 +57,7 @@ class BaseSession:
|
||||||
headers = headers,
|
headers = headers,
|
||||||
params = params,
|
params = params,
|
||||||
json = json,
|
json = json,
|
||||||
|
body = body,
|
||||||
proxy = p or None,
|
proxy = p or None,
|
||||||
)
|
)
|
||||||
except TemporaryError as e:
|
except TemporaryError as e:
|
||||||
|
|
|
@ -21,6 +21,7 @@ class HttpxSession(BaseSession):
|
||||||
headers: Dict[str, str] = {},
|
headers: Dict[str, str] = {},
|
||||||
params = (),
|
params = (),
|
||||||
json = None,
|
json = None,
|
||||||
|
body = None,
|
||||||
) -> Response:
|
) -> Response:
|
||||||
client = self.clients.get(proxy)
|
client = self.clients.get(proxy)
|
||||||
if not client:
|
if not client:
|
||||||
|
@ -36,6 +37,7 @@ class HttpxSession(BaseSession):
|
||||||
method, url, json = json,
|
method, url, json = json,
|
||||||
headers = headers,
|
headers = headers,
|
||||||
params = params,
|
params = params,
|
||||||
|
content = body,
|
||||||
)
|
)
|
||||||
if r.status_code >= 500:
|
if r.status_code >= 500:
|
||||||
raise TemporaryError(
|
raise TemporaryError(
|
||||||
|
|
|
@ -38,6 +38,7 @@ class TornadoSession(BaseSession):
|
||||||
headers: Dict[str, str] = {},
|
headers: Dict[str, str] = {},
|
||||||
params = (),
|
params = (),
|
||||||
json = None,
|
json = None,
|
||||||
|
body = None,
|
||||||
) -> Response:
|
) -> Response:
|
||||||
kwargs: Dict[str, Any] = {
|
kwargs: Dict[str, Any] = {
|
||||||
'method': method,
|
'method': method,
|
||||||
|
@ -46,6 +47,8 @@ class TornadoSession(BaseSession):
|
||||||
|
|
||||||
if json:
|
if json:
|
||||||
kwargs['body'] = _json.dumps(json)
|
kwargs['body'] = _json.dumps(json)
|
||||||
|
if body:
|
||||||
|
kwargs['body'] = body
|
||||||
kwargs['prepare_curl_callback'] = try_use_http2
|
kwargs['prepare_curl_callback'] = try_use_http2
|
||||||
|
|
||||||
if proxy:
|
if proxy:
|
||||||
|
|
|
@ -1,21 +1,32 @@
|
||||||
# MIT licensed
|
# MIT licensed
|
||||||
# Copyright (c) 2013-2020 lilydjwg <lilydjwg@gmail.com>, et al.
|
# Copyright (c) 2013-2020 lilydjwg <lilydjwg@gmail.com>, et al.
|
||||||
|
|
||||||
|
import xmlrpc.client
|
||||||
|
from typing import List, Tuple, Union
|
||||||
from pkg_resources import parse_version
|
from pkg_resources import parse_version
|
||||||
|
|
||||||
|
from nvchecker.api import session
|
||||||
|
|
||||||
|
async def pypi_xmlrpc_request(key: Tuple[str, str, bool]) -> Union[str, List[str]]:
|
||||||
|
url, package, use_pre_release = key
|
||||||
|
payload = xmlrpc.client.dumps((package, use_pre_release), "package_releases")
|
||||||
|
|
||||||
|
res = await session.post(url, headers={"Content-Type": "text/xml"}, body=payload)
|
||||||
|
params, methodname = xmlrpc.client.loads(res.body)
|
||||||
|
return params[0] # type: ignore
|
||||||
|
|
||||||
async def get_version(name, conf, *, cache, **kwargs):
|
async def get_version(name, conf, *, cache, **kwargs):
|
||||||
package = conf.get('pypi') or name
|
package = conf.get('pypi') or name
|
||||||
use_pre_release = conf.get('use_pre_release', False)
|
use_pre_release = bool(conf.get('use_pre_release', False))
|
||||||
|
|
||||||
url = 'https://pypi.org/pypi/{}/json'.format(package)
|
url = 'https://pypi.org/pypi'
|
||||||
|
data = await cache.get((url, package, use_pre_release), pypi_xmlrpc_request)
|
||||||
data = await cache.get_json(url)
|
|
||||||
|
|
||||||
if use_pre_release:
|
if use_pre_release:
|
||||||
version = sorted(
|
version = sorted(
|
||||||
data['releases'].keys(),
|
data,
|
||||||
key = parse_version,
|
key = parse_version,
|
||||||
)[-1]
|
)[-1]
|
||||||
else:
|
else:
|
||||||
version = data['info']['version']
|
version = data
|
||||||
return version
|
return version
|
||||||
|
|
Loading…
Add table
Reference in a new issue