| Index: tools/telemetry/third_party/altgraph/setup.py
|
| diff --git a/tools/telemetry/third_party/altgraph/setup.py b/tools/telemetry/third_party/altgraph/setup.py
|
| deleted file mode 100644
|
| index a1a4cb6eb261134d55a76db3b4ff2b11be03e7a0..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/third_party/altgraph/setup.py
|
| +++ /dev/null
|
| @@ -1,867 +0,0 @@
|
| -"""
|
| -Shared setup file for simple python packages. Uses a setup.cfg that
|
| -is the same as the distutils2 project, unless noted otherwise.
|
| -
|
| -It exists for two reasons:
|
| -1) This makes it easier to reuse setup.py code between my own
|
| - projects
|
| -
|
| -2) Easier migration to distutils2 when that catches on.
|
| -
|
| -Additional functionality:
|
| -
|
| -* Section metadata:
|
| - requires-test: Same as 'tests_require' option for setuptools.
|
| -
|
| -"""
|
| -
|
| -import sys
|
| -import os
|
| -import re
|
| -import platform
|
| -from fnmatch import fnmatch
|
| -import os
|
| -import sys
|
| -import time
|
| -import tempfile
|
| -import tarfile
|
| -try:
|
| - import urllib.request as urllib
|
| -except ImportError:
|
| - import urllib
|
| -from distutils import log
|
| -try:
|
| - from hashlib import md5
|
| -
|
| -except ImportError:
|
| - from md5 import md5
|
| -
|
| -if sys.version_info[0] == 2:
|
| - from ConfigParser import RawConfigParser, NoOptionError, NoSectionError
|
| -else:
|
| - from configparser import RawConfigParser, NoOptionError, NoSectionError
|
| -
|
| -ROOTDIR = os.path.dirname(os.path.abspath(__file__))
|
| -
|
| -
|
| -#
|
| -#
|
| -#
|
| -# Parsing the setup.cfg and converting it to something that can be
|
| -# used by setuptools.setup()
|
| -#
|
| -#
|
| -#
|
| -
|
| -def eval_marker(value):
|
| - """
|
| - Evaluate an distutils2 environment marker.
|
| -
|
| - This code is unsafe when used with hostile setup.cfg files,
|
| - but that's not a problem for our own files.
|
| - """
|
| - value = value.strip()
|
| -
|
| - class M:
|
| - def __init__(self, **kwds):
|
| - for k, v in kwds.items():
|
| - setattr(self, k, v)
|
| -
|
| - variables = {
|
| - 'python_version': '%d.%d'%(sys.version_info[0], sys.version_info[1]),
|
| - 'python_full_version': sys.version.split()[0],
|
| - 'os': M(
|
| - name=os.name,
|
| - ),
|
| - 'sys': M(
|
| - platform=sys.platform,
|
| - ),
|
| - 'platform': M(
|
| - version=platform.version(),
|
| - machine=platform.machine(),
|
| - ),
|
| - }
|
| -
|
| - return bool(eval(value, variables, variables))
|
| -
|
| -
|
| - return True
|
| -
|
| -def _opt_value(cfg, into, section, key, transform = None):
|
| - try:
|
| - v = cfg.get(section, key)
|
| - if transform != _as_lines and ';' in v:
|
| - v, marker = v.rsplit(';', 1)
|
| - if not eval_marker(marker):
|
| - return
|
| -
|
| - v = v.strip()
|
| -
|
| - if v:
|
| - if transform:
|
| - into[key] = transform(v.strip())
|
| - else:
|
| - into[key] = v.strip()
|
| -
|
| - except (NoOptionError, NoSectionError):
|
| - pass
|
| -
|
| -def _as_bool(value):
|
| - if value.lower() in ('y', 'yes', 'on'):
|
| - return True
|
| - elif value.lower() in ('n', 'no', 'off'):
|
| - return False
|
| - elif value.isdigit():
|
| - return bool(int(value))
|
| - else:
|
| - raise ValueError(value)
|
| -
|
| -def _as_list(value):
|
| - return value.split()
|
| -
|
| -def _as_lines(value):
|
| - result = []
|
| - for v in value.splitlines():
|
| - if ';' in v:
|
| - v, marker = v.rsplit(';', 1)
|
| - if not eval_marker(marker):
|
| - continue
|
| -
|
| - v = v.strip()
|
| - if v:
|
| - result.append(v)
|
| - else:
|
| - result.append(v)
|
| - return result
|
| -
|
| -def _map_requirement(value):
|
| - m = re.search(r'(\S+)\s*(?:\((.*)\))?', value)
|
| - name = m.group(1)
|
| - version = m.group(2)
|
| -
|
| - if version is None:
|
| - return name
|
| -
|
| - else:
|
| - mapped = []
|
| - for v in version.split(','):
|
| - v = v.strip()
|
| - if v[0].isdigit():
|
| - # Checks for a specific version prefix
|
| - m = v.rsplit('.', 1)
|
| - mapped.append('>=%s,<%s.%s'%(
|
| - v, m[0], int(m[1])+1))
|
| -
|
| - else:
|
| - mapped.append(v)
|
| - return '%s %s'%(name, ','.join(mapped),)
|
| -
|
| -def _as_requires(value):
|
| - requires = []
|
| - for req in value.splitlines():
|
| - if ';' in req:
|
| - req, marker = v.rsplit(';', 1)
|
| - if not eval_marker(marker):
|
| - continue
|
| - req = req.strip()
|
| -
|
| - if not req:
|
| - continue
|
| - requires.append(_map_requirement(req))
|
| - return requires
|
| -
|
| -def parse_setup_cfg():
|
| - cfg = RawConfigParser()
|
| - r = cfg.read([os.path.join(ROOTDIR, 'setup.cfg')])
|
| - if len(r) != 1:
|
| - print("Cannot read 'setup.cfg'")
|
| - sys.exit(1)
|
| -
|
| - metadata = dict(
|
| - name = cfg.get('metadata', 'name'),
|
| - version = cfg.get('metadata', 'version'),
|
| - description = cfg.get('metadata', 'description'),
|
| - )
|
| -
|
| - _opt_value(cfg, metadata, 'metadata', 'license')
|
| - _opt_value(cfg, metadata, 'metadata', 'maintainer')
|
| - _opt_value(cfg, metadata, 'metadata', 'maintainer_email')
|
| - _opt_value(cfg, metadata, 'metadata', 'author')
|
| - _opt_value(cfg, metadata, 'metadata', 'author_email')
|
| - _opt_value(cfg, metadata, 'metadata', 'url')
|
| - _opt_value(cfg, metadata, 'metadata', 'download_url')
|
| - _opt_value(cfg, metadata, 'metadata', 'classifiers', _as_lines)
|
| - _opt_value(cfg, metadata, 'metadata', 'platforms', _as_list)
|
| - _opt_value(cfg, metadata, 'metadata', 'packages', _as_list)
|
| - _opt_value(cfg, metadata, 'metadata', 'keywords', _as_list)
|
| -
|
| - try:
|
| - v = cfg.get('metadata', 'requires-dist')
|
| -
|
| - except (NoOptionError, NoSectionError):
|
| - pass
|
| -
|
| - else:
|
| - requires = _as_requires(v)
|
| - if requires:
|
| - metadata['install_requires'] = requires
|
| -
|
| - try:
|
| - v = cfg.get('metadata', 'requires-test')
|
| -
|
| - except (NoOptionError, NoSectionError):
|
| - pass
|
| -
|
| - else:
|
| - requires = _as_requires(v)
|
| - if requires:
|
| - metadata['tests_require'] = requires
|
| -
|
| -
|
| - try:
|
| - v = cfg.get('metadata', 'long_description_file')
|
| - except (NoOptionError, NoSectionError):
|
| - pass
|
| -
|
| - else:
|
| - parts = []
|
| - for nm in v.split():
|
| - fp = open(nm, 'rU')
|
| - parts.append(fp.read())
|
| - fp.close()
|
| -
|
| - metadata['long_description'] = '\n\n'.join(parts)
|
| -
|
| -
|
| - try:
|
| - v = cfg.get('metadata', 'zip-safe')
|
| - except (NoOptionError, NoSectionError):
|
| - pass
|
| -
|
| - else:
|
| - metadata['zip_safe'] = _as_bool(v)
|
| -
|
| - try:
|
| - v = cfg.get('metadata', 'console_scripts')
|
| - except (NoOptionError, NoSectionError):
|
| - pass
|
| -
|
| - else:
|
| - if 'entry_points' not in metadata:
|
| - metadata['entry_points'] = {}
|
| -
|
| - metadata['entry_points']['console_scripts'] = v.splitlines()
|
| -
|
| - if sys.version_info[:2] <= (2,6):
|
| - try:
|
| - metadata['tests_require'] += ", unittest2"
|
| - except KeyError:
|
| - metadata['tests_require'] = "unittest2"
|
| -
|
| - return metadata
|
| -
|
| -
|
| -#
|
| -#
|
| -#
|
| -# Bootstrapping setuptools/distribute, based on
|
| -# a heavily modified version of distribute_setup.py
|
| -#
|
| -#
|
| -#
|
| -
|
| -
|
| -SETUPTOOLS_PACKAGE='setuptools'
|
| -
|
| -
|
| -try:
|
| - import subprocess
|
| -
|
| - def _python_cmd(*args):
|
| - args = (sys.executable,) + args
|
| - return subprocess.call(args) == 0
|
| -
|
| -except ImportError:
|
| - def _python_cmd(*args):
|
| - args = (sys.executable,) + args
|
| - new_args = []
|
| - for a in args:
|
| - new_args.append(a.replace("'", "'\"'\"'"))
|
| - os.system(' '.join(new_args)) == 0
|
| -
|
| -
|
| -try:
|
| - import json
|
| -
|
| - def get_pypi_src_download(package):
|
| - url = 'https://pypi.python.org/pypi/%s/json'%(package,)
|
| - fp = urllib.urlopen(url)
|
| - try:
|
| - try:
|
| - data = fp.read()
|
| -
|
| - finally:
|
| - fp.close()
|
| - except urllib.error:
|
| - raise RuntimeError("Cannot determine download link for %s"%(package,))
|
| -
|
| - pkgdata = json.loads(data.decode('utf-8'))
|
| - if 'urls' not in pkgdata:
|
| - raise RuntimeError("Cannot determine download link for %s"%(package,))
|
| -
|
| - for info in pkgdata['urls']:
|
| - if info['packagetype'] == 'sdist' and info['url'].endswith('tar.gz'):
|
| - return (info.get('md5_digest'), info['url'])
|
| -
|
| - raise RuntimeError("Cannot determine downlink link for %s"%(package,))
|
| -
|
| -except ImportError:
|
| - # Python 2.5 compatibility, no JSON in stdlib but luckily JSON syntax is
|
| - # simular enough to Python's syntax to be able to abuse the Python compiler
|
| -
|
| - import _ast as ast
|
| -
|
| - def get_pypi_src_download(package):
|
| - url = 'https://pypi.python.org/pypi/%s/json'%(package,)
|
| - fp = urllib.urlopen(url)
|
| - try:
|
| - try:
|
| - data = fp.read()
|
| -
|
| - finally:
|
| - fp.close()
|
| - except urllib.error:
|
| - raise RuntimeError("Cannot determine download link for %s"%(package,))
|
| -
|
| -
|
| - a = compile(data, '-', 'eval', ast.PyCF_ONLY_AST)
|
| - if not isinstance(a, ast.Expression):
|
| - raise RuntimeError("Cannot determine download link for %s"%(package,))
|
| -
|
| - a = a.body
|
| - if not isinstance(a, ast.Dict):
|
| - raise RuntimeError("Cannot determine download link for %s"%(package,))
|
| -
|
| - for k, v in zip(a.keys, a.values):
|
| - if not isinstance(k, ast.Str):
|
| - raise RuntimeError("Cannot determine download link for %s"%(package,))
|
| -
|
| - k = k.s
|
| - if k == 'urls':
|
| - a = v
|
| - break
|
| - else:
|
| - raise RuntimeError("PyPI JSON for %s doesn't contain URLs section"%(package,))
|
| -
|
| - if not isinstance(a, ast.List):
|
| - raise RuntimeError("Cannot determine download link for %s"%(package,))
|
| -
|
| - for info in v.elts:
|
| - if not isinstance(info, ast.Dict):
|
| - raise RuntimeError("Cannot determine download link for %s"%(package,))
|
| - url = None
|
| - packagetype = None
|
| - chksum = None
|
| -
|
| - for k, v in zip(info.keys, info.values):
|
| - if not isinstance(k, ast.Str):
|
| - raise RuntimeError("Cannot determine download link for %s"%(package,))
|
| -
|
| - if k.s == 'url':
|
| - if not isinstance(v, ast.Str):
|
| - raise RuntimeError("Cannot determine download link for %s"%(package,))
|
| - url = v.s
|
| -
|
| - elif k.s == 'packagetype':
|
| - if not isinstance(v, ast.Str):
|
| - raise RuntimeError("Cannot determine download link for %s"%(package,))
|
| - packagetype = v.s
|
| -
|
| - elif k.s == 'md5_digest':
|
| - if not isinstance(v, ast.Str):
|
| - raise RuntimeError("Cannot determine download link for %s"%(package,))
|
| - chksum = v.s
|
| -
|
| - if url is not None and packagetype == 'sdist' and url.endswith('.tar.gz'):
|
| - return (chksum, url)
|
| -
|
| - raise RuntimeError("Cannot determine download link for %s"%(package,))
|
| -
|
| -def _build_egg(egg, tarball, to_dir):
|
| - # extracting the tarball
|
| - tmpdir = tempfile.mkdtemp()
|
| - log.warn('Extracting in %s', tmpdir)
|
| - old_wd = os.getcwd()
|
| - try:
|
| - os.chdir(tmpdir)
|
| - tar = tarfile.open(tarball)
|
| - _extractall(tar)
|
| - tar.close()
|
| -
|
| - # going in the directory
|
| - subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
|
| - os.chdir(subdir)
|
| - log.warn('Now working in %s', subdir)
|
| -
|
| - # building an egg
|
| - log.warn('Building a %s egg in %s', egg, to_dir)
|
| - _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir)
|
| -
|
| - finally:
|
| - os.chdir(old_wd)
|
| - # returning the result
|
| - log.warn(egg)
|
| - if not os.path.exists(egg):
|
| - raise IOError('Could not build the egg.')
|
| -
|
| -
|
| -def _do_download(to_dir, packagename=SETUPTOOLS_PACKAGE):
|
| - tarball = download_setuptools(packagename, to_dir)
|
| - version = tarball.split('-')[-1][:-7]
|
| - egg = os.path.join(to_dir, '%s-%s-py%d.%d.egg'
|
| - % (packagename, version, sys.version_info[0], sys.version_info[1]))
|
| - if not os.path.exists(egg):
|
| - _build_egg(egg, tarball, to_dir)
|
| - sys.path.insert(0, egg)
|
| - import setuptools
|
| - setuptools.bootstrap_install_from = egg
|
| -
|
| -
|
| -def use_setuptools():
|
| - # making sure we use the absolute path
|
| - return _do_download(os.path.abspath(os.curdir))
|
| -
|
| -def download_setuptools(packagename, to_dir):
|
| - # making sure we use the absolute path
|
| - to_dir = os.path.abspath(to_dir)
|
| - try:
|
| - from urllib.request import urlopen
|
| - except ImportError:
|
| - from urllib2 import urlopen
|
| -
|
| - chksum, url = get_pypi_src_download(packagename)
|
| - tgz_name = os.path.basename(url)
|
| - saveto = os.path.join(to_dir, tgz_name)
|
| -
|
| - src = dst = None
|
| - if not os.path.exists(saveto): # Avoid repeated downloads
|
| - try:
|
| - log.warn("Downloading %s", url)
|
| - src = urlopen(url)
|
| - # Read/write all in one block, so we don't create a corrupt file
|
| - # if the download is interrupted.
|
| - data = src.read()
|
| -
|
| - if chksum is not None:
|
| - data_sum = md5(data).hexdigest()
|
| - if data_sum != chksum:
|
| - raise RuntimeError("Downloading %s failed: corrupt checksum"%(url,))
|
| -
|
| -
|
| - dst = open(saveto, "wb")
|
| - dst.write(data)
|
| - finally:
|
| - if src:
|
| - src.close()
|
| - if dst:
|
| - dst.close()
|
| - return os.path.realpath(saveto)
|
| -
|
| -
|
| -
|
| -def _extractall(self, path=".", members=None):
|
| - """Extract all members from the archive to the current working
|
| - directory and set owner, modification time and permissions on
|
| - directories afterwards. `path' specifies a different directory
|
| - to extract to. `members' is optional and must be a subset of the
|
| - list returned by getmembers().
|
| - """
|
| - import copy
|
| - import operator
|
| - from tarfile import ExtractError
|
| - directories = []
|
| -
|
| - if members is None:
|
| - members = self
|
| -
|
| - for tarinfo in members:
|
| - if tarinfo.isdir():
|
| - # Extract directories with a safe mode.
|
| - directories.append(tarinfo)
|
| - tarinfo = copy.copy(tarinfo)
|
| - tarinfo.mode = 448 # decimal for oct 0700
|
| - self.extract(tarinfo, path)
|
| -
|
| - # Reverse sort directories.
|
| - if sys.version_info < (2, 4):
|
| - def sorter(dir1, dir2):
|
| - return cmp(dir1.name, dir2.name)
|
| - directories.sort(sorter)
|
| - directories.reverse()
|
| - else:
|
| - directories.sort(key=operator.attrgetter('name'), reverse=True)
|
| -
|
| - # Set correct owner, mtime and filemode on directories.
|
| - for tarinfo in directories:
|
| - dirpath = os.path.join(path, tarinfo.name)
|
| - try:
|
| - self.chown(tarinfo, dirpath)
|
| - self.utime(tarinfo, dirpath)
|
| - self.chmod(tarinfo, dirpath)
|
| - except ExtractError:
|
| - e = sys.exc_info()[1]
|
| - if self.errorlevel > 1:
|
| - raise
|
| - else:
|
| - self._dbg(1, "tarfile: %s" % e)
|
| -
|
| -
|
| -#
|
| -#
|
| -#
|
| -# Definitions of custom commands
|
| -#
|
| -#
|
| -#
|
| -
|
| -try:
|
| - import setuptools
|
| -
|
| -except ImportError:
|
| - use_setuptools()
|
| -
|
| -from setuptools import setup
|
| -
|
| -try:
|
| - from distutils.core import PyPIRCCommand
|
| -except ImportError:
|
| - PyPIRCCommand = None # Ancient python version
|
| -
|
| -from distutils.core import Command
|
| -from distutils.errors import DistutilsError
|
| -from distutils import log
|
| -
|
| -if PyPIRCCommand is None:
|
| - class upload_docs (Command):
|
| - description = "upload sphinx documentation"
|
| - user_options = []
|
| -
|
| - def initialize_options(self):
|
| - pass
|
| -
|
| - def finalize_options(self):
|
| - pass
|
| -
|
| - def run(self):
|
| - raise DistutilsError("not supported on this version of python")
|
| -
|
| -else:
|
| - class upload_docs (PyPIRCCommand):
|
| - description = "upload sphinx documentation"
|
| - user_options = PyPIRCCommand.user_options
|
| -
|
| - def initialize_options(self):
|
| - PyPIRCCommand.initialize_options(self)
|
| - self.username = ''
|
| - self.password = ''
|
| -
|
| -
|
| - def finalize_options(self):
|
| - PyPIRCCommand.finalize_options(self)
|
| - config = self._read_pypirc()
|
| - if config != {}:
|
| - self.username = config['username']
|
| - self.password = config['password']
|
| -
|
| -
|
| - def run(self):
|
| - import subprocess
|
| - import shutil
|
| - import zipfile
|
| - import os
|
| - import urllib
|
| - import StringIO
|
| - from base64 import standard_b64encode
|
| - import httplib
|
| - import urlparse
|
| -
|
| - # Extract the package name from distutils metadata
|
| - meta = self.distribution.metadata
|
| - name = meta.get_name()
|
| -
|
| - # Run sphinx
|
| - if os.path.exists('doc/_build'):
|
| - shutil.rmtree('doc/_build')
|
| - os.mkdir('doc/_build')
|
| -
|
| - p = subprocess.Popen(['make', 'html'],
|
| - cwd='doc')
|
| - exit = p.wait()
|
| - if exit != 0:
|
| - raise DistutilsError("sphinx-build failed")
|
| -
|
| - # Collect sphinx output
|
| - if not os.path.exists('dist'):
|
| - os.mkdir('dist')
|
| - zf = zipfile.ZipFile('dist/%s-docs.zip'%(name,), 'w',
|
| - compression=zipfile.ZIP_DEFLATED)
|
| -
|
| - for toplevel, dirs, files in os.walk('doc/_build/html'):
|
| - for fn in files:
|
| - fullname = os.path.join(toplevel, fn)
|
| - relname = os.path.relpath(fullname, 'doc/_build/html')
|
| -
|
| - print ("%s -> %s"%(fullname, relname))
|
| -
|
| - zf.write(fullname, relname)
|
| -
|
| - zf.close()
|
| -
|
| - # Upload the results, this code is based on the distutils
|
| - # 'upload' command.
|
| - content = open('dist/%s-docs.zip'%(name,), 'rb').read()
|
| -
|
| - data = {
|
| - ':action': 'doc_upload',
|
| - 'name': name,
|
| - 'content': ('%s-docs.zip'%(name,), content),
|
| - }
|
| - auth = "Basic " + standard_b64encode(self.username + ":" +
|
| - self.password)
|
| -
|
| -
|
| - boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
|
| - sep_boundary = '\n--' + boundary
|
| - end_boundary = sep_boundary + '--'
|
| - body = StringIO.StringIO()
|
| - for key, value in data.items():
|
| - if not isinstance(value, list):
|
| - value = [value]
|
| -
|
| - for value in value:
|
| - if isinstance(value, tuple):
|
| - fn = ';filename="%s"'%(value[0])
|
| - value = value[1]
|
| - else:
|
| - fn = ''
|
| -
|
| - body.write(sep_boundary)
|
| - body.write('\nContent-Disposition: form-data; name="%s"'%key)
|
| - body.write(fn)
|
| - body.write("\n\n")
|
| - body.write(value)
|
| -
|
| - body.write(end_boundary)
|
| - body.write('\n')
|
| - body = body.getvalue()
|
| -
|
| - self.announce("Uploading documentation to %s"%(self.repository,), log.INFO)
|
| -
|
| - schema, netloc, url, params, query, fragments = \
|
| - urlparse.urlparse(self.repository)
|
| -
|
| -
|
| - if schema == 'http':
|
| - http = httplib.HTTPConnection(netloc)
|
| - elif schema == 'https':
|
| - http = httplib.HTTPSConnection(netloc)
|
| - else:
|
| - raise AssertionError("unsupported schema "+schema)
|
| -
|
| - data = ''
|
| - loglevel = log.INFO
|
| - try:
|
| - http.connect()
|
| - http.putrequest("POST", url)
|
| - http.putheader('Content-type',
|
| - 'multipart/form-data; boundary=%s'%boundary)
|
| - http.putheader('Content-length', str(len(body)))
|
| - http.putheader('Authorization', auth)
|
| - http.endheaders()
|
| - http.send(body)
|
| - except socket.error:
|
| - e = socket.exc_info()[1]
|
| - self.announce(str(e), log.ERROR)
|
| - return
|
| -
|
| - r = http.getresponse()
|
| - if r.status in (200, 301):
|
| - self.announce('Upload succeeded (%s): %s' % (r.status, r.reason),
|
| - log.INFO)
|
| - else:
|
| - self.announce('Upload failed (%s): %s' % (r.status, r.reason),
|
| - log.ERROR)
|
| -
|
| - print ('-'*75)
|
| - print (r.read())
|
| - print ('-'*75)
|
| -
|
| -
|
| -def recursiveGlob(root, pathPattern):
|
| - """
|
| - Recursively look for files matching 'pathPattern'. Return a list
|
| - of matching files/directories.
|
| - """
|
| - result = []
|
| -
|
| - for rootpath, dirnames, filenames in os.walk(root):
|
| - for fn in filenames:
|
| - if fnmatch(fn, pathPattern):
|
| - result.append(os.path.join(rootpath, fn))
|
| - return result
|
| -
|
| -
|
| -def importExternalTestCases(unittest,
|
| - pathPattern="test_*.py", root=".", package=None):
|
| - """
|
| - Import all unittests in the PyObjC tree starting at 'root'
|
| - """
|
| -
|
| - testFiles = recursiveGlob(root, pathPattern)
|
| - testModules = map(lambda x:x[len(root)+1:-3].replace('/', '.'), testFiles)
|
| - if package is not None:
|
| - testModules = [(package + '.' + m) for m in testModules]
|
| -
|
| - suites = []
|
| -
|
| - for modName in testModules:
|
| - try:
|
| - module = __import__(modName)
|
| - except ImportError:
|
| - print("SKIP %s: %s"%(modName, sys.exc_info()[1]))
|
| - continue
|
| -
|
| - if '.' in modName:
|
| - for elem in modName.split('.')[1:]:
|
| - module = getattr(module, elem)
|
| -
|
| - s = unittest.defaultTestLoader.loadTestsFromModule(module)
|
| - suites.append(s)
|
| -
|
| - return unittest.TestSuite(suites)
|
| -
|
| -
|
| -
|
| -class test (Command):
|
| - description = "run test suite"
|
| - user_options = [
|
| - ('verbosity=', None, "print what tests are run"),
|
| - ]
|
| -
|
| - def initialize_options(self):
|
| - self.verbosity='1'
|
| -
|
| - def finalize_options(self):
|
| - if isinstance(self.verbosity, str):
|
| - self.verbosity = int(self.verbosity)
|
| -
|
| -
|
| - def cleanup_environment(self):
|
| - ei_cmd = self.get_finalized_command('egg_info')
|
| - egg_name = ei_cmd.egg_name.replace('-', '_')
|
| -
|
| - to_remove = []
|
| - for dirname in sys.path:
|
| - bn = os.path.basename(dirname)
|
| - if bn.startswith(egg_name + "-"):
|
| - to_remove.append(dirname)
|
| -
|
| - for dirname in to_remove:
|
| - log.info("removing installed %r from sys.path before testing"%(
|
| - dirname,))
|
| - sys.path.remove(dirname)
|
| -
|
| - def add_project_to_sys_path(self):
|
| - from pkg_resources import normalize_path, add_activation_listener
|
| - from pkg_resources import working_set, require
|
| -
|
| - self.reinitialize_command('egg_info')
|
| - self.run_command('egg_info')
|
| - self.reinitialize_command('build_ext', inplace=1)
|
| - self.run_command('build_ext')
|
| -
|
| -
|
| - # Check if this distribution is already on sys.path
|
| - # and remove that version, this ensures that the right
|
| - # copy of the package gets tested.
|
| -
|
| - self.__old_path = sys.path[:]
|
| - self.__old_modules = sys.modules.copy()
|
| -
|
| -
|
| - ei_cmd = self.get_finalized_command('egg_info')
|
| - sys.path.insert(0, normalize_path(ei_cmd.egg_base))
|
| - sys.path.insert(1, os.path.dirname(__file__))
|
| -
|
| - # Strip the namespace packages defined in this distribution
|
| - # from sys.modules, needed to reset the search path for
|
| - # those modules.
|
| -
|
| - nspkgs = getattr(self.distribution, 'namespace_packages')
|
| - if nspkgs is not None:
|
| - for nm in nspkgs:
|
| - del sys.modules[nm]
|
| -
|
| - # Reset pkg_resources state:
|
| - add_activation_listener(lambda dist: dist.activate())
|
| - working_set.__init__()
|
| - require('%s==%s'%(ei_cmd.egg_name, ei_cmd.egg_version))
|
| -
|
| - def remove_from_sys_path(self):
|
| - from pkg_resources import working_set
|
| - sys.path[:] = self.__old_path
|
| - sys.modules.clear()
|
| - sys.modules.update(self.__old_modules)
|
| - working_set.__init__()
|
| -
|
| -
|
| - def run(self):
|
| - import unittest
|
| -
|
| - # Ensure that build directory is on sys.path (py3k)
|
| -
|
| - self.cleanup_environment()
|
| - self.add_project_to_sys_path()
|
| -
|
| - try:
|
| - meta = self.distribution.metadata
|
| - name = meta.get_name()
|
| - test_pkg = name + "_tests"
|
| - suite = importExternalTestCases(unittest,
|
| - "test_*.py", test_pkg, test_pkg)
|
| -
|
| - runner = unittest.TextTestRunner(verbosity=self.verbosity)
|
| - result = runner.run(suite)
|
| -
|
| - # Print out summary. This is a structured format that
|
| - # should make it easy to use this information in scripts.
|
| - summary = dict(
|
| - count=result.testsRun,
|
| - fails=len(result.failures),
|
| - errors=len(result.errors),
|
| - xfails=len(getattr(result, 'expectedFailures', [])),
|
| - xpass=len(getattr(result, 'expectedSuccesses', [])),
|
| - skip=len(getattr(result, 'skipped', [])),
|
| - )
|
| - print("SUMMARY: %s"%(summary,))
|
| -
|
| - finally:
|
| - self.remove_from_sys_path()
|
| -
|
| -#
|
| -#
|
| -#
|
| -# And finally run the setuptools main entry point.
|
| -#
|
| -#
|
| -#
|
| -
|
| -metadata = parse_setup_cfg()
|
| -
|
| -setup(
|
| - cmdclass=dict(
|
| - upload_docs=upload_docs,
|
| - test=test,
|
| - ),
|
| - **metadata
|
| -)
|
|
|