-
Notifications
You must be signed in to change notification settings - Fork 72
/
setup.py
94 lines (85 loc) · 3.18 KB
/
setup.py
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
# -*- coding: utf-8 -*-
from os.path import join
from os import listdir
from setuptools import setup
# Hmmmph.
# So we get all the meta-information in one place (yay!) but we call
# exec to get it (boo!). Note that we can't "from txtorcon._metadata
# import *" here because that won't work when setup is being run by
# pip (outside of Git checkout etc)
with open('txtorcon/_metadata.py') as f:
exec(
compile(f.read(), '_metadata.py', 'exec'),
globals(),
locals(),
)
description = '''
Twisted-based Tor controller client, with state-tracking and
configuration abstractions.
https://txtorcon.readthedocs.org
https://github.com/meejah/txtorcon
'''
# if there are any newlines in the short-description, there's no error
# .. but setuptools / pip / readme_renderere "or something" causes the
# 'descript' to be all the meta-data after 'summary', which fails to
# render.
# see: https://github.com/pypa/setuptools/issues/1390
description = description.replace('\n', ' ')
sphinx_rst_files = [x for x in listdir('docs') if x[-3:] == 'rst']
sphinx_docs = [join('docs', x) for x in sphinx_rst_files]
sphinx_docs += [join('docs/_static', x) for x in listdir('docs/_static')]
examples = [x for x in listdir('examples') if x[-3:] == '.py']
setup(
name='txtorcon',
version=__version__,
description=description,
python_requires=">=3.8",
## setup_requires="setuptools>=36.2",
long_description=open('README.rst', 'r').read(),
keywords=['python', 'twisted', 'tor', 'tor controller'],
install_requires=open('requirements.txt').readlines(),
# "pip install -e .[dev]" will install development requirements
extras_require=dict(
dev=open('dev-requirements.txt').readlines(),
),
classifiers=[
'Framework :: Twisted',
'Development Status :: 4 - Beta',
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Natural Language :: English',
'Operating System :: POSIX :: Linux',
'Operating System :: Unix',
'Programming Language :: Python',
'Programming Language :: Python :: 3',
'Topic :: Software Development :: Libraries :: Python Modules',
'Topic :: Internet :: Proxy Servers',
'Topic :: Internet',
'Topic :: Security',
],
author=__author__,
author_email=__contact__,
url=__url__,
license=__license__,
packages=[
"txtorcon",
"twisted.plugins",
],
# I'm a little unclear if I'm doing this "properly", especially
# the documentation etc. Do we really want "share/txtorcon" for
# the first member of the tuple? Why does it seem I need to
# duplicate this in MANIFEST.in?
data_files=[
('share/txtorcon', ['INSTALL', 'README.rst', 'TODO', 'meejah.asc']),
# this includes the Sphinx source for the
# docs. The "map+filter" construct grabs all .rst
# files and re-maps the path
('share/txtorcon', [
'docs/apilinks_sphinxext.py',
'docs/conf.py',
'docs/Makefile',
] + sphinx_docs),
# include all the examples
('share/txtorcon/examples', [join('examples', x) for x in examples])
],
)