Coverage for pyquickhelper/loghelper/pypi_helper.py: 90%
20 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-03 02:21 +0200
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-03 02:21 +0200
1"""
2@file
3@brief Helpers to information for pypi version.
4"""
5import time
6from datetime import datetime
7import xmlrpc.client as xmlrpc_client
10class RateLimitedServerProxy(xmlrpc_client.ServerProxy):
11 """
12 See this `issue
13 <https://github.com/pypa/warehouse/issues/8753>`_.
14 """
16 def __getattr__(self, name):
17 time.sleep(1)
18 return super(RateLimitedServerProxy, self).__getattr__(name)
21def enumerate_pypi_versions_date(name, url='https://pypi.org/pypi'):
22 """
23 Retrieves version and releases dates for modules
24 hosted on :epkg:`pypi`.
26 @param name module name
27 @param url url
28 @return list tuple (date, version, size)
29 """
30 pypi = RateLimitedServerProxy(url)
31 available = pypi.package_releases(name, True)
32 for i, ver in enumerate(available):
33 try:
34 res = pypi.release_urls(name, ver)
35 except xmlrpc_client.Fault as e: # pragma: no cover
36 raise RuntimeError(
37 "Unable to retrieve url for package '{}-{}': tentative {}/{}."
38 "".format(name, ver, i + 1, len(available))) from e
39 for r in res:
40 if isinstance(r['upload_time'], str):
41 dt = datetime.strptime(
42 r['upload_time'].split('.')[0], "%Y-%m-%dT%H:%M:%S")
43 else:
44 try:
45 dt = datetime(* tuple(r['upload_time'].timetuple())[:6])
46 except AttributeError as e: # pragma: no cover
47 raise AttributeError(
48 f"Unable to parse '{r['upload_time']}'") from e
49 yield dt, ver, r['size']
50 break