Source code for pyquickhelper.loghelper.pypi_helper
"""
Helpers to information for pypi version.
:githublink:`%|py|5`
"""
import time
from datetime import datetime
import xmlrpc.client as xmlrpc_client
[docs]class RateLimitedServerProxy(xmlrpc_client.ServerProxy):
"""
See this `issue
<https://github.com/pypa/warehouse/issues/8753>`_.
:githublink:`%|py|14`
"""
[docs] def __getattr__(self, name):
time.sleep(1)
return super(RateLimitedServerProxy, self).__getattr__(name)
[docs]def enumerate_pypi_versions_date(name, url='https://pypi.org/pypi'):
"""
Retrieves version and releases dates for modules
hosted on :epkg:`pypi`.
:param name: module name
:param url: url
:return: list tuple (date, version, size)
:githublink:`%|py|29`
"""
pypi = RateLimitedServerProxy(url)
available = pypi.package_releases(name, True)
for i, ver in enumerate(available):
try:
res = pypi.release_urls(name, ver)
except xmlrpc_client.Fault as e:
raise RuntimeError(
"Unable to retrieve url for package '{}-{}': tentative {}/{}."
"".format(name, ver, i + 1, len(available))) from e
for r in res:
if isinstance(r['upload_time'], str):
dt = datetime.strptime(
r['upload_time'].split('.')[0], "%Y-%m-%dT%H:%M:%S")
else:
try:
dt = datetime(* tuple(r['upload_time'].timetuple())[:6])
except AttributeError as e:
raise AttributeError(
"Unable to parse '{0}'".format(r['upload_time'])) from e
yield dt, ver, r['size']
break