| Index: third_party/pycoverage/setup.py
|
| diff --git a/third_party/pycoverage/setup.py b/third_party/pycoverage/setup.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f0e83e677a39b59707c9221a61dafbbf03127ccf
|
| --- /dev/null
|
| +++ b/third_party/pycoverage/setup.py
|
| @@ -0,0 +1,202 @@
|
| +# setup.py for coverage.py
|
| +
|
| +"""Code coverage measurement for Python
|
| +
|
| +Coverage.py measures code coverage, typically during test execution. It uses
|
| +the code analysis tools and tracing hooks provided in the Python standard
|
| +library to determine which lines are executable, and which have been executed.
|
| +
|
| +Coverage.py runs on Pythons 2.3 through 3.3, and PyPy 1.9.
|
| +
|
| +Documentation is at `nedbatchelder.com <%s>`_. Code repository and issue
|
| +tracker are on `Bitbucket <http://bitbucket.org/ned/coveragepy>`_, with a
|
| +mirrored repo on `Github <https://github.com/nedbat/coveragepy>`_.
|
| +
|
| +New in 3.7: ``--debug``, and 12 bugs closed.
|
| +
|
| +New in 3.6: ``--fail-under``, and >20 bugs closed.
|
| +
|
| +New in 3.5: Branch coverage exclusions, keyboard shortcuts in HTML report.
|
| +
|
| +New in 3.4: Better control over source to measure, and unexecuted files
|
| +can be reported.
|
| +
|
| +New in 3.3: .coveragerc files.
|
| +
|
| +New in 3.2: Branch coverage!
|
| +"""
|
| +
|
| +# This file is used unchanged under all versions of Python, 2.x and 3.x.
|
| +
|
| +classifiers = """\
|
| +Environment :: Console
|
| +Intended Audience :: Developers
|
| +License :: OSI Approved :: BSD License
|
| +Operating System :: OS Independent
|
| +Programming Language :: Python :: 2
|
| +Programming Language :: Python :: 3
|
| +Topic :: Software Development :: Quality Assurance
|
| +Topic :: Software Development :: Testing
|
| +"""
|
| +
|
| +# Pull in the tools we need.
|
| +import os, sys
|
| +
|
| +from setuptools import setup
|
| +from distutils.core import Extension # pylint: disable=E0611,F0401
|
| +from distutils.command.build_ext import build_ext # pylint: disable=E0611,F0401,C0301
|
| +from distutils import errors # pylint: disable=E0611,F0401
|
| +
|
| +# Get or massage our metadata. We exec coverage/version.py so we can avoid
|
| +# importing the product code into setup.py.
|
| +
|
| +doc = __doc__ # __doc__ will be overwritten by version.py.
|
| +__version__ = __url__ = "" # Keep pylint happy.
|
| +
|
| +cov_ver_py = os.path.join(os.path.split(__file__)[0], "coverage/version.py")
|
| +version_file = open(cov_ver_py)
|
| +try:
|
| + exec(compile(version_file.read(), cov_ver_py, 'exec'))
|
| +finally:
|
| + version_file.close()
|
| +
|
| +doclines = (doc % __url__).splitlines()
|
| +classifier_list = classifiers.splitlines()
|
| +
|
| +if 'a' in __version__:
|
| + devstat = "3 - Alpha"
|
| +elif 'b' in __version__:
|
| + devstat = "4 - Beta"
|
| +else:
|
| + devstat = "5 - Production/Stable"
|
| +classifier_list.append("Development Status :: " + devstat)
|
| +
|
| +# Install a script as "coverage", and as "coverage[23]", and as
|
| +# "coverage-2.7" (or whatever).
|
| +scripts = [
|
| + 'coverage = coverage:main',
|
| + 'coverage%d = coverage:main' % sys.version_info[:1],
|
| + 'coverage-%d.%d = coverage:main' % sys.version_info[:2],
|
| + ]
|
| +
|
| +# Create the keyword arguments for setup()
|
| +
|
| +setup_args = dict(
|
| + name = 'coverage',
|
| + version = __version__,
|
| +
|
| + packages = [
|
| + 'coverage',
|
| + ],
|
| +
|
| + package_data = {
|
| + 'coverage': [
|
| + 'htmlfiles/*.*',
|
| + ]
|
| + },
|
| +
|
| + entry_points = {'console_scripts': scripts},
|
| +
|
| + # We need to get HTML assets from our htmlfiles dir.
|
| + zip_safe = False,
|
| +
|
| + author = 'Ned Batchelder and others',
|
| + author_email = 'ned@nedbatchelder.com',
|
| + description = doclines[0],
|
| + long_description = '\n'.join(doclines[2:]),
|
| + keywords = 'code coverage testing',
|
| + license = 'BSD',
|
| + classifiers = classifier_list,
|
| + url = __url__,
|
| + )
|
| +
|
| +# A replacement for the build_ext command which raises a single exception
|
| +# if the build fails, so we can fallback nicely.
|
| +
|
| +ext_errors = (
|
| + errors.CCompilerError,
|
| + errors.DistutilsExecError,
|
| + errors.DistutilsPlatformError,
|
| +)
|
| +if sys.platform == 'win32' and sys.version_info > (2, 6):
|
| + # 2.6's distutils.msvc9compiler can raise an IOError when failing to
|
| + # find the compiler
|
| + ext_errors += (IOError,)
|
| +
|
| +class BuildFailed(Exception):
|
| + """Raise this to indicate the C extension wouldn't build."""
|
| + def __init__(self):
|
| + Exception.__init__(self)
|
| + self.cause = sys.exc_info()[1] # work around py 2/3 different syntax
|
| +
|
| +class ve_build_ext(build_ext):
|
| + """Build C extensions, but fail with a straightforward exception."""
|
| +
|
| + def run(self):
|
| + """Wrap `run` with `BuildFailed`."""
|
| + try:
|
| + build_ext.run(self)
|
| + except errors.DistutilsPlatformError:
|
| + raise BuildFailed()
|
| +
|
| + def build_extension(self, ext):
|
| + """Wrap `build_extension` with `BuildFailed`."""
|
| + try:
|
| + # Uncomment to test compile failures:
|
| + # raise errors.CCompilerError("OOPS")
|
| + build_ext.build_extension(self, ext)
|
| + except ext_errors:
|
| + raise BuildFailed()
|
| + except ValueError:
|
| + # this can happen on Windows 64 bit, see Python issue 7511
|
| + if "'path'" in str(sys.exc_info()[1]): # works with both py 2/3
|
| + raise BuildFailed()
|
| + raise
|
| +
|
| +# There are a few reasons we might not be able to compile the C extension.
|
| +# Figure out if we should attempt the C extension or not.
|
| +
|
| +compile_extension = True
|
| +
|
| +if sys.platform.startswith('java'):
|
| + # Jython can't compile C extensions
|
| + compile_extension = False
|
| +
|
| +if '__pypy__' in sys.builtin_module_names:
|
| + # Pypy can't compile C extensions
|
| + compile_extension = False
|
| +
|
| +if compile_extension:
|
| + setup_args.update(dict(
|
| + ext_modules = [
|
| + Extension("coverage.tracer", sources=["coverage/tracer.c"])
|
| + ],
|
| + cmdclass = {
|
| + 'build_ext': ve_build_ext,
|
| + },
|
| + ))
|
| +
|
| +# Py3.x-specific details.
|
| +
|
| +if sys.version_info >= (3, 0):
|
| + setup_args.update(dict(
|
| + use_2to3 = False,
|
| + ))
|
| +
|
| +def main():
|
| + """Actually invoke setup() with the arguments we built above."""
|
| + # For a variety of reasons, it might not be possible to install the C
|
| + # extension. Try it with, and if it fails, try it without.
|
| + try:
|
| + setup(**setup_args)
|
| + except BuildFailed:
|
| + msg = "Couldn't install with extension module, trying without it..."
|
| + exc = sys.exc_info()[1]
|
| + exc_msg = "%s: %s" % (exc.__class__.__name__, exc.cause)
|
| + print("**\n** %s\n** %s\n**" % (msg, exc_msg))
|
| +
|
| + del setup_args['ext_modules']
|
| + setup(**setup_args)
|
| +
|
| +if __name__ == '__main__':
|
| + main()
|
|
|