Replace platform.linux_distribution with distro.linux_distribution (#7337)
[letsencrypt.git] / setup.py
1 import codecs
2 import os
3 import re
4 import sys
5
6 from distutils.version import StrictVersion
7 from setuptools import find_packages, setup, __version__ as setuptools_version
8 from setuptools.command.test import test as TestCommand
9
10 # Workaround for http://bugs.python.org/issue8876, see
11 # http://bugs.python.org/issue8876#msg208792
12 # This can be removed when using Python 2.7.9 or later:
13 # https://hg.python.org/cpython/raw-file/v2.7.9/Misc/NEWS
14 if os.path.abspath(__file__).split(os.path.sep)[1] == 'vagrant':
15     del os.link
16
17
18 def read_file(filename, encoding='utf8'):
19     """Read unicode from given file."""
20     with codecs.open(filename, encoding=encoding) as fd:
21         return fd.read()
22
23
24 here = os.path.abspath(os.path.dirname(__file__))
25
26 # read version number (and other metadata) from package init
27 init_fn = os.path.join(here, 'certbot', '__init__.py')
28 meta = dict(re.findall(r"""__([a-z]+)__ = '([^']+)""", read_file(init_fn)))
29
30 readme = read_file(os.path.join(here, 'README.rst'))
31 version = meta['version']
32
33 # This package relies on PyOpenSSL, requests, and six, however, it isn't
34 # specified here to avoid masking the more specific request requirements in
35 # acme. See https://github.com/pypa/pip/issues/988 for more info.
36 install_requires = [
37     'acme>=0.29.0',
38     # We technically need ConfigArgParse 0.10.0 for Python 2.6 support, but
39     # saying so here causes a runtime error against our temporary fork of 0.9.3
40     # in which we added 2.6 support (see #2243), so we relax the requirement.
41     'ConfigArgParse>=0.9.3',
42     'configobj',
43     'cryptography>=1.2.3',  # load_pem_x509_certificate
44     'distro>=1.0.1',
45     # 1.1.0+ is required to avoid the warnings described at
46     # https://github.com/certbot/josepy/issues/13.
47     'josepy>=1.1.0',
48     'mock',
49     'parsedatetime>=1.3',  # Calendar.parseDT
50     'pyrfc3339',
51     'pytz',
52     'setuptools',
53     'zope.component',
54     'zope.interface',
55 ]
56
57 # Add pywin32 on Windows platforms to handle low-level system calls.
58 # This dependency needs to be added using environment markers to avoid its installation on Linux.
59 # However environment markers are supported only with setuptools >= 36.2.
60 # So this dependency is not added for old Linux distributions with old setuptools,
61 # in order to allow these systems to build certbot from sources.
62 if StrictVersion(setuptools_version) >= StrictVersion('36.2'):
63     install_requires.append("pywin32>=224 ; sys_platform == 'win32'")
64 elif 'bdist_wheel' in sys.argv[1:]:
65     raise RuntimeError('Error, you are trying to build certbot wheels using an old version '
66                        'of setuptools. Version 36.2+ of setuptools is required.')
67
68 dev_extras = [
69     'astroid==1.6.5',
70     'coverage',
71     'ipdb',
72     'pytest',
73     'pytest-cov',
74     'pytest-xdist',
75     'pylint==1.9.4',
76     'tox',
77     'twine',
78     'wheel',
79 ]
80
81 dev3_extras = [
82     'mypy',
83     'typing', # for python3.4
84 ]
85
86 docs_extras = [
87     # If you have Sphinx<1.5.1, you need docutils<0.13.1
88     # https://github.com/sphinx-doc/sphinx/issues/3212
89     'repoze.sphinx.autointerface',
90     'Sphinx>=1.2', # Annotation support
91     'sphinx_rtd_theme',
92 ]
93
94
95 class PyTest(TestCommand):
96     user_options = []
97
98     def initialize_options(self):
99         TestCommand.initialize_options(self)
100         self.pytest_args = ''
101
102     def run_tests(self):
103         import shlex
104         # import here, cause outside the eggs aren't loaded
105         import pytest
106         errno = pytest.main(shlex.split(self.pytest_args))
107         sys.exit(errno)
108
109
110 setup(
111     name='certbot',
112     version=version,
113     description="ACME client",
114     long_description=readme,
115     url='https://github.com/letsencrypt/letsencrypt',
116     author="Certbot Project",
117     author_email='client-dev@letsencrypt.org',
118     license='Apache License 2.0',
119     python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*',
120     classifiers=[
121         'Development Status :: 5 - Production/Stable',
122         'Environment :: Console',
123         'Environment :: Console :: Curses',
124         'Intended Audience :: System Administrators',
125         'License :: OSI Approved :: Apache Software License',
126         'Operating System :: POSIX :: Linux',
127         'Programming Language :: Python',
128         'Programming Language :: Python :: 2',
129         'Programming Language :: Python :: 2.7',
130         'Programming Language :: Python :: 3',
131         'Programming Language :: Python :: 3.4',
132         'Programming Language :: Python :: 3.5',
133         'Programming Language :: Python :: 3.6',
134         'Programming Language :: Python :: 3.7',
135         'Topic :: Internet :: WWW/HTTP',
136         'Topic :: Security',
137         'Topic :: System :: Installation/Setup',
138         'Topic :: System :: Networking',
139         'Topic :: System :: Systems Administration',
140         'Topic :: Utilities',
141     ],
142
143     packages=find_packages(exclude=['docs', 'examples', 'tests', 'venv']),
144     include_package_data=True,
145
146     install_requires=install_requires,
147     extras_require={
148         'dev': dev_extras,
149         'dev3': dev3_extras,
150         'docs': docs_extras,
151     },
152
153     # to test all packages run "python setup.py test -s
154     # {acme,certbot_apache,certbot_nginx}"
155     test_suite='certbot',
156     tests_require=["pytest"],
157     cmdclass={"test": PyTest},
158
159     entry_points={
160         'console_scripts': [
161             'certbot = certbot.main:main',
162         ],
163         'certbot.plugins': [
164             'manual = certbot.plugins.manual:Authenticator',
165             'null = certbot.plugins.null:Installer',
166             'standalone = certbot.plugins.standalone:Authenticator',
167             'webroot = certbot.plugins.webroot:Authenticator',
168         ],
169     },
170 )