summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Ipsum <richard.ipsum@codethink.co.uk>2014-10-16 19:10:36 +0100
committerRichard Ipsum <richard.ipsum@codethink.co.uk>2014-11-04 12:40:55 +0000
commit97ce636cf809249733486cdcd521e574c0711536 (patch)
treea78927e9c83cf4096ef7e197c3b8ac02d3f99dc8
parentb9d2d0dd332f288f4ef30261d1b8eebef23f5218 (diff)
downloadimport-97ce636cf809249733486cdcd521e574c0711536.tar.gz
Parse a requirement instead
We use requirements-parser for this, which is itself just a wrapper for pip's requirement parser
-rwxr-xr-ximport/pip_lorry.py37
1 files changed, 24 insertions, 13 deletions
diff --git a/import/pip_lorry.py b/import/pip_lorry.py
index f2cb533..1d9ccfe 100755
--- a/import/pip_lorry.py
+++ b/import/pip_lorry.py
@@ -27,6 +27,8 @@ import shutil
import tempfile
import xmlrpclib
+import parser.requirements # todo add this as a submodule
+
PYPI_URL = 'http://pypi.python.org/pypi'
def warn(*args, **kwargs):
@@ -116,18 +118,21 @@ def filter_urls(urls):
return filter(allowed_extension, urls)
-def generate_tarball_lorry(package_name):
+def generate_tarball_lorry(requirement):
try:
client = xmlrpclib.ServerProxy(PYPI_URL)
- releases = client.package_releases(package_name)
+ releases = client.package_releases(requirement.name)
except Exception as e:
error("Couldn't fetch release data:", e)
if len(releases) == 0:
- error("Couldn't find any releases for package %s" % package_name)
+ error("Couldn't find any releases for package %s" % requirement.name)
+
+ # filter releases if package_version is not None
+
def get_description(release):
- return client.release_data(package_name,
+ return client.release_data(requirement.name,
release)['name'] + ' ' + release
choice = (ask_user(client, releases,
@@ -136,10 +141,10 @@ def generate_tarball_lorry(package_name):
release_version = releases[choice]
print('Fetching urls for package %s with version %s'
- % (package_name, release_version))
+ % (requirement.name, release_version))
try:
- urls = client.release_urls(package_name, release_version)
+ urls = client.release_urls(requirement.name, release_version)
except Exception as e:
error("Couldn't fetch release urls:", e)
@@ -159,23 +164,29 @@ def generate_tarball_lorry(package_name):
prompt='Select url: ') if len(urls) > 1 else 0)
url = urls[choice]['url']
- return make_tarball_lorry(package_name, url)
+ return make_tarball_lorry(requirement.name, url)
def str_repo_lorry(package_name, repo_type, url):
return json.dumps({package_name.lower(): {'type': repo_type, 'url': url}},
indent=4, sort_keys=True)
if __name__ == '__main__':
- if len(sys.argv) != 2:
- print('usage: %s python_package' % sys.argv[0], file=sys.stderr)
+ max_args = 2
+
+ if len(sys.argv) != max_args:
+ # TODO explain the format of python requirements
+ print('usage: %s requirement'
+ % sys.argv[0], file=sys.stderr)
sys.exit(1)
- package_name = sys.argv[1]
- metadata = fetch_package_metadata(package_name)
+ # TODO: We could take multiple reqs easily enough
+ req = parser.requirements.parse(sys.argv[1]).next()
+
+ metadata = fetch_package_metadata(req.name)
info = metadata['info']
repo_type = (find_repo_type(info['home_page'])
if 'home_page' in info else None)
- print(str_repo_lorry(package_name, repo_type, info['home_page'])
- if repo_type else generate_tarball_lorry(package_name))
+ print(str_repo_lorry(req.name, repo_type, info['home_page'])
+ if repo_type else generate_tarball_lorry(req))