summaryrefslogtreecommitdiff
path: root/setup.py
blob: 6c07a122e83b495302ce34f10242cc39dd0452fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# 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.8.

Documentation is at `nedbatchelder.com <%s>`_.  Code repository and issue
tracker are at `bitbucket.org <http://bitbucket.org/ned/coveragepy>`_.

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

# 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__,
    )

# There are a few reasons we might not be able to compile the C extension.

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"])
            ],
        ))

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:     # pylint: disable=W0702
        # When setup() can't compile, it tries to exit.  We'll catch SystemExit
        # here :-(, and try again.
        if 'install' not in sys.argv or 'ext_modules' not in setup_args:
            # We weren't trying to install an extension, so forget it.
            raise
        msg = "Couldn't install with extension module, trying without it..."
        exc = sys.exc_info()[1]
        exc_msg = "%s: %s" % (exc.__class__.__name__, exc)
        print("**\n** %s\n** %s\n**" % (msg, exc_msg))

        del setup_args['ext_modules']
        setup(**setup_args)

if __name__ == '__main__':
    main()