Mercurial > hg > config
comparison python/pypi.py @ 369:11cf7018ebff
new crappy package for helping me with http://k0s.org/portfolio/python/python-tools.txt
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Sun, 21 Jul 2013 05:27:28 -0700 |
parents | |
children | 016d27ca39e4 |
comparison
equal
deleted
inserted
replaced
368:6f1e4562c06a | 369:11cf7018ebff |
---|---|
1 #!/usr/bin/env python | |
2 | |
3 """ | |
4 pypi strawman that should really be in PaInt | |
5 | |
6 ref http://wiki.python.org/moin/PyPIJSON | |
7 """ | |
8 | |
9 import json | |
10 import optparse | |
11 import os | |
12 import sys | |
13 import textwrap | |
14 import urllib2 | |
15 | |
16 def package_data(package, index='http://pypi.python.org/pypi'): | |
17 """ | |
18 returns dict of {url:, description:, home_page: } | |
19 """ | |
20 | |
21 # if package name given, -> url | |
22 url = package | |
23 if '://' not in url: | |
24 url = '%s/%s' % (index, package) | |
25 url = url.rstrip('/') | |
26 | |
27 if not url.endswith('/json'): | |
28 url = '%s/json' % (url) | |
29 | |
30 # read the URL | |
31 try: | |
32 page = urllib2.urlopen(url).read() | |
33 except: | |
34 raise # TODO: better error handling | |
35 | |
36 data = json.loads(page) | |
37 info = data['info'] | |
38 | |
39 # massage the data | |
40 return {'summary': info.get('summary', ''), | |
41 'package_url': info['package_url'], | |
42 'name': info['name'], | |
43 'home_page': info.get('home_page') | |
44 # etc | |
45 } | |
46 | |
47 | |
48 def main(args=sys.argv[1:]): | |
49 | |
50 # command line parser | |
51 usage = '%prog [options] package <another_package> <...>' | |
52 parser = optparse.OptionParser(usage=usage, description=__doc__) | |
53 parser.add_option('-t', '--tag', dest='tags', | |
54 action='append', help="tags for packages") | |
55 options, args = parser.parse_args(args) | |
56 if not args: | |
57 parser.print_usage() | |
58 parser.exit() | |
59 | |
60 # one crappy ass template | |
61 template = """ * %(package_url)s | |
62 %(summary)s | |
63 %(tags)s | |
64 """ | |
65 | |
66 # get package data | |
67 packages = {} | |
68 for package in args: | |
69 data = package_data(package) | |
70 packages[data['name']] = data | |
71 | |
72 # render the damn thing | |
73 rendered = [] | |
74 for name in sorted(packages.keys(), key=lambda x: x.lower()): | |
75 values = packages[name].copy() | |
76 if options.tags: | |
77 values['tags'] = '{%s}' % ', '.join(options.tags) | |
78 else: | |
79 values['tags'] = '' | |
80 if values['home_page'] and values['home_page'] != values['package_url']: | |
81 values['summary'] = '%s %s' % (values['summary'], | |
82 values['home_page']) | |
83 values['summary'] = textwrap.fill(values['summary'], 69, | |
84 initial_indent=' ', | |
85 subsequent_indent=' ') | |
86 string = template % values | |
87 rendered.append(string.strip()) | |
88 | |
89 print '\n\n'.join([i.strip() for i in rendered]) | |
90 | |
91 if __name__ == '__main__': | |
92 main() |