Source code for openmdao.util.grab_distrib
#!/usr/bin/env python
import sys
import logging
from pkg_resources import Requirement
from setuptools.package_index import PackageIndex
_logger = logging.getLogger()
_pypi = 'http://pypi.python.org/simple'
def _enable_console(level):
""" Configure logging to receive log messages at the console. """
global _logger
# define a Handler which writes messages to sys.stderr
CONSOLE = logging.StreamHandler()
CONSOLE.setLevel(level)
CONSOLE.setFormatter(logging.Formatter('%(message)s'))
_logger.addHandler(CONSOLE)
[docs]def grab_distrib(req, index=None, dest='.', search_pypi=True):
"""\
Downloads a distribution from the given package index(s) based on the
given requirement string(s). Downloaded distributions are placed in the
specified destination or the current directory if no destination is
specified. If a distribution cannot be found in the given index(s), the
Python Package Index will be searched as a last resort unless
search_pypi is False. This does NOT install the distribution.
"""
# allow multiple package indexes to be specified
if index is None:
index = []
elif isinstance(index, basestring):
index = [index]
# else just assume it's some iterator of indexes
# add PyPI as last place to search if it wasn't already specified
if search_pypi and _pypi not in index and (_pypi+'/') not in index:
index.append(_pypi)
# allow specification of single or multiple requirements
if isinstance(req, basestring):
reqs = [Requirement.parse(req)]
elif isinstance(req, Requirement):
reqs = [req]
else:
reqs = []
for rr in req:
if isinstance(rr, basestring):
reqs.append(Requirement.parse(rr))
elif isinstance(rr, Requirement):
reqs.append(rr)
else:
raise TypeError("supplied requirement arg must be a string"+
" or a Requirement, but given type is %s" %
type(rr))
index_list = [PackageIndex(idx,search_path=[]) for idx in index]
for req in reqs:
fetched = None
for idx in index_list:
_logger.info('Looking for %s at package index %s' % (req, idx.index_url))
fetched = idx.download(req, dest)
if fetched:
_logger.info(' %s successfully downloaded' % fetched)
break
else:
_logger.error("couldn't find distrib for %s" % req)
return fetched
if __name__ == '__main__':
from optparse import OptionParser
usage = "%prog [options] req(s)"
parser = OptionParser(usage=usage, description=grab_distrib.__doc__)
parser.add_option("-i", "--index", action="append", type="string", dest="index",
help="package index url (separate -i for each one)", default=[])
parser.add_option("-d", "--dest", action="store", type="string", dest="dest",
help="destination directory", default='.')
parser.add_option("-q", "--quiet", action="store_true", dest="quiet",
help="no output")
parser.add_option("--nopypi", action="store_true", dest="nopypi",
help="do not search PyPI")
(options, args) = parser.parse_args(sys.argv[1:])
if len(args) < 1:
parser.print_help()
sys.exit(1)
if options.quiet:
loglevel = logging.CRITICAL
else:
loglevel = logging.INFO
_logger.setLevel(loglevel)
_enable_console(loglevel)
grab_distrib(req=args, index=options.index, dest=options.dest,
search_pypi=not options.nopypi)
grab_distrib.__doc__ += """
Requirements may be supplied as strings or as Requirement objects.
"""