Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

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: 

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: 

47 raise AttributeError( 

48 "Unable to parse '{0}'".format(r['upload_time'])) from e 

49 yield dt, ver, r['size'] 

50 break