0326f6781f
Use a custom tuple of separators for json.dumps that avoids having the comma+space, which looks bad if this is ever committed. Replace it by just having ": " and "," (no space after) instead. An example of this so that it can be more clear: http://paste.openstack.org/show/84238/ Note the above paste where the old version has spaces after commas where as the newer version does not have these spaces. Change-Id: Ifd04d5e1b26ebdf9db374761f31baaf1e33d87cd
106 lines
3.2 KiB
Python
106 lines
3.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
# Copyright (C) 2014 Yahoo! Inc. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
from __future__ import print_function
|
|
|
|
import contextlib
|
|
import json
|
|
import os
|
|
import pkg_resources
|
|
import sys
|
|
import traceback
|
|
import urllib
|
|
|
|
try:
|
|
PYPI_LOCATION = os.environ['PYPI_LOCATION']
|
|
except KeyError:
|
|
PYPI_LOCATION = 'http://pypi.python.org/pypi'
|
|
|
|
|
|
KEEP_KEYS = frozenset([
|
|
'author',
|
|
'author_email',
|
|
'maintainer',
|
|
'maintainer_email',
|
|
'license',
|
|
'summary',
|
|
'home_page',
|
|
])
|
|
|
|
|
|
def iter_names(req):
|
|
for k in (req.key, req.project_name):
|
|
yield k
|
|
yield k.title()
|
|
yield k.replace("-", "_")
|
|
yield k.replace("-", "_").title()
|
|
|
|
|
|
def release_data(req):
|
|
# Try to find it with various names...
|
|
attempted = []
|
|
for name in iter_names(req):
|
|
url = PYPI_LOCATION + "/%s/json" % (urllib.quote(name))
|
|
if url in attempted:
|
|
continue
|
|
with contextlib.closing(urllib.urlopen(url)) as uh:
|
|
if uh.getcode() != 200:
|
|
attempted.append(url)
|
|
continue
|
|
return json.loads(uh.read())
|
|
attempted = [" * %s" % url for url in attempted]
|
|
raise IOError("Could not find '%s' on pypi\nAttempted urls:\n%s"
|
|
% (req.key, "\n".join(attempted)))
|
|
|
|
|
|
def main():
|
|
if len(sys.argv) == 1:
|
|
print("%s requirement-file ..." % (sys.argv[0]), file=sys.stderr)
|
|
sys.exit(1)
|
|
for filename in sys.argv[1:]:
|
|
print("Analyzing file: %s" % (filename))
|
|
details = {}
|
|
with open(filename, "rb") as fh:
|
|
for line in fh.read().splitlines():
|
|
line = line.strip()
|
|
if line.startswith("#") or not line:
|
|
continue
|
|
req = pkg_resources.Requirement.parse(line)
|
|
print(" - processing: %s" % (req))
|
|
try:
|
|
raw_req_data = release_data(req)
|
|
except IOError:
|
|
traceback.print_exc()
|
|
details[req.key] = None
|
|
else:
|
|
req_info = {}
|
|
for (k, v) in raw_req_data.get('info', {}).items():
|
|
if k not in KEEP_KEYS:
|
|
continue
|
|
req_info[k] = v
|
|
details[req.key] = {
|
|
'requirement': str(req),
|
|
'info': req_info,
|
|
}
|
|
filename, _ext = os.path.splitext(filename)
|
|
with open("%s.json" % (filename), "wb") as fh:
|
|
fh.write(json.dumps(details, sort_keys=True, indent=4,
|
|
separators=(",", ": ")))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|