mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 02:15:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			52 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """Utilities related to the mirror infrastructure defined in PEP 381."""
 | |
| 
 | |
| from string import ascii_lowercase
 | |
| import socket
 | |
| 
 | |
| DEFAULT_MIRROR_URL = "last.pypi.python.org"
 | |
| 
 | |
| 
 | |
| def get_mirrors(hostname=None):
 | |
|     """Return the list of mirrors from the last record found on the DNS
 | |
|     entry::
 | |
| 
 | |
|     >>> from packaging.pypi.mirrors import get_mirrors
 | |
|     >>> get_mirrors()
 | |
|     ['a.pypi.python.org', 'b.pypi.python.org', 'c.pypi.python.org',
 | |
|     'd.pypi.python.org']
 | |
| 
 | |
|     """
 | |
|     if hostname is None:
 | |
|         hostname = DEFAULT_MIRROR_URL
 | |
| 
 | |
|     # return the last mirror registered on PyPI.
 | |
|     try:
 | |
|         hostname = socket.gethostbyname_ex(hostname)[0]
 | |
|     except socket.gaierror:
 | |
|         return []
 | |
|     end_letter = hostname.split(".", 1)
 | |
| 
 | |
|     # determine the list from the last one.
 | |
|     return ["%s.%s" % (s, end_letter[1]) for s in string_range(end_letter[0])]
 | |
| 
 | |
| 
 | |
| def string_range(last):
 | |
|     """Compute the range of string between "a" and last.
 | |
| 
 | |
|     This works for simple "a to z" lists, but also for "a to zz" lists.
 | |
|     """
 | |
|     for k in range(len(last)):
 | |
|         for x in product(ascii_lowercase, repeat=(k + 1)):
 | |
|             result = ''.join(x)
 | |
|             yield result
 | |
|             if result == last:
 | |
|                 return
 | |
| 
 | |
| 
 | |
| def product(*args, **kwds):
 | |
|     pools = [tuple(arg) for arg in args] * kwds.get('repeat', 1)
 | |
|     result = [[]]
 | |
|     for pool in pools:
 | |
|         result = [x + [y] for x in result for y in pool]
 | |
|     for prod in result:
 | |
|         yield tuple(prod)
 | 
