¿Cuál es una manera elegante de encontrar versiones de paquetes en un índice de paquete pypi?
Pregunta
Actualmente estoy usando un enfoque muy feo basado en una expresión regular para encontrar enlaces y desarmarlos.
No estoy satisfecho con el código, por lo que solicito soluciones más agradables, preferiblemente usando solo stdlib.
Editar
La tarea en cuestión tiene 2 partes:
- Encuentra todas las distribuciones que coinciden con un determinado criterio (como el prefijo del nombre).
- Encuentra todas las versiones disponibles en cada distribución encontrada.
El resultado esperado es un mapeo de distribución - > versiones - > archivos.
Solución 3
es desafortunado, pero debido a la falta de xmlrpc en otros índices, necesito mantener mi solución
Otros consejos
Hay una interfaz XML-RPC. Consulte la página wiki Python.org en Cheese Shop (antiguo nombre de PyPi) API .
Extracto de esa wiki:
>>> import xmlrpclib
>>> server = xmlrpclib.Server('http://pypi.python.org/pypi')
>>> server.package_releases('roundup')
['1.1.2']
>>> server.package_urls('roundup', '1.1.2')
[{'has_sig': True, 'comment_text': '', 'python_version': 'source', 'url': 'http://pypi.python.org/packages/source/r/roundup/roundup-1.1.2.tar.gz', 'md5_digest': '7c395da56412e263d7600fa7f0afa2e5', 'downloads': 2989, 'filename': 'roundup-1.1.2.tar.gz', 'packagetype': 'sdist', 'size': 876455}, {'has_sig': True, 'comment_text': '', 'python_version': 'any', 'url': 'http://pypi.python.org/packages/any/r/roundup/roundup-1.1.2.win32.exe', 'md5_digest': '983d565b0b87f83f1b6460e54554a845', 'downloads': 2020, 'filename': 'roundup-1.1.2.win32.exe', 'packagetype': 'bdist_wininst', 'size': 614270}]
list_packages
y package_releases
parecen ser exactamente lo que está buscando.
@ Comentario de Ronny
Solo tiene que escribir un código en Python para determinar cuál de los paquetes enumerados cumple el criterio; es decir, si el nombre del paquete debe comenzar con foo
:
>>> packages = server.list_packages()
>>> match_foo = [package for package in packages if package.startswith('foo')]
>>> print len(match_foo)
2
Vamos a lanzar distutils2 a PyPI en el futuro a corto plazo. Contiene un módulo distutils2.pypi que le permite buscar PyPI desde el código Python y un programa pysetup que es un script de línea de comandos para hacer lo mismo (entre otros). El documento sigue siendo un trabajo en progreso, pero hay algunos ejemplos y una referencia de API:
En un buildout que accede a versiones de pipi y pin como esta:
Products.PloneFormGen == 1.2.5
Aquí busca la versión 1.2.5 y usa esto ...
No sé si es esto lo que estás buscando ...