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

1""" 

2@file 

3@brief Helpers to information for pypi version. 

4""" 

5import time 

6from datetime import datetime 

7import xmlrpc.client as xmlrpc_client 

8 

9 

10class RateLimitedServerProxy(xmlrpc_client.ServerProxy): 

11 """ 

12 See this `issue 

13 <https://github.com/pypa/warehouse/issues/8753>`_. 

14 """ 

15 

16 def __getattr__(self, name): 

17 time.sleep(1) 

18 return super(RateLimitedServerProxy, self).__getattr__(name) 

19 

20 

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

25 

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