-
Notifications
You must be signed in to change notification settings - Fork 30
/
setup.py
executable file
·224 lines (189 loc) · 7.53 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
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
#!/usr/bin/env python
import sys
from setuptools import setup, Command, find_packages
from distutils import log
import contextlib
@contextlib.contextmanager
def capture_logger(name):
""" Context manager to capture a logger output with a StringIO stream.
"""
import logging
logger = logging.getLogger(name)
try:
import StringIO
stream = StringIO.StringIO()
except ImportError:
from io import StringIO
stream = StringIO()
handler = logging.StreamHandler(stream)
logger.addHandler(handler)
try:
yield stream
finally:
logger.removeHandler(handler)
class bump_version(Command):
description = "increment the package version and commit the changes"
user_options = [
("major", None, "bump the first digit, for incompatible API changes"),
("minor", None, "bump the second digit, for new backward-compatible features"),
("patch", None, "bump the third digit, for bug fixes (default)"),
]
def initialize_options(self):
self.minor = False
self.major = False
self.patch = False
def finalize_options(self):
part = None
for attr in ("major", "minor", "patch"):
if getattr(self, attr, False):
if part is None:
part = attr
else:
from distutils.errors import DistutilsOptionError
raise DistutilsOptionError(
"version part options are mutually exclusive")
self.part = part or "patch"
def bumpversion(self, part, commit=True, tag=False, message=None,
allow_dirty=False):
""" Run bumpversion.main() with the specified arguments, and return the
new computed version string.
"""
import bumpversion
args = (
(['--verbose'] if self.verbose > 1 else []) +
(['--allow-dirty'] if allow_dirty else []) +
(['--commit'] if commit else ['--no-commit']) +
(['--tag'] if tag else ['--no-tag']) +
(['--message', message] if message is not None else []) +
['--list', part]
)
log.debug(
"$ bumpversion %s" % " ".join(a.replace(" ", "\\ ") for a in args))
with capture_logger("bumpversion.list") as out:
bumpversion.main(args)
last_line = out.getvalue().splitlines()[-1]
new_version = last_line.replace("new_version=", "")
return new_version
def run(self):
log.info("bumping '%s' version" % self.part)
self.bumpversion(self.part)
class release(bump_version):
"""Drop the developmental release '.devN' suffix from the package version,
open the default text $EDITOR to write release notes, commit the changes
and generate a git tag.
Release notes can also be set with the -m/--message option, or by reading
from standard input.
If --major, --minor or --patch options are passed, the respective
'SemVer' digit is also incremented before tagging the release.
"""
description = "tag a new release"
user_options = bump_version.user_options + [
("message=", 'm', "message containing the release notes"),
]
def initialize_options(self):
bump_version.initialize_options(self)
self.message = None
def finalize_options(self):
bump_version.finalize_options(self)
self.bump_first = any(
getattr(self, a, False) for a in ("major", "minor", "patch"))
if not self.bump_first:
import re
current_version = self.distribution.metadata.get_version()
if not re.search(r"\.dev[0-9]+", current_version):
from distutils.errors import DistutilsSetupError
raise DistutilsSetupError(
"current version (%s) has no '.devN' suffix.\n "
"Run 'setup.py bump_version', or use any of "
"--major, --minor, --patch options" % current_version)
message = self.message
if message is None:
if sys.stdin.isatty():
# stdin is interactive, use editor to write release notes
message = self.edit_release_notes()
else:
# read release notes from stdin pipe
message = sys.stdin.read()
if not message.strip():
from distutils.errors import DistutilsSetupError
raise DistutilsSetupError("release notes message is empty")
self.message = "Release {new_version}\n\n%s" % (message)
@staticmethod
def edit_release_notes():
"""Use the default text $EDITOR to write release notes.
If $EDITOR is not set, use 'nano'."""
from tempfile import mkstemp
import os
import shlex
import subprocess
text_editor = shlex.split(os.environ.get('EDITOR', 'nano'))
fd, tmp = mkstemp(prefix='bumpversion-')
try:
os.close(fd)
with open(tmp, 'w') as f:
f.write("\n\n# Write release notes.\n"
"# Lines starting with '#' will be ignored.")
subprocess.check_call(text_editor + [tmp])
with open(tmp, 'r') as f:
changes = "".join(
l for l in f.readlines() if not l.startswith('#'))
finally:
os.remove(tmp)
return changes
def run(self):
if self.bump_first:
# bump the specified version part but don't commit immediately
log.info("bumping '%s' version" % self.part)
self.bumpversion(self.part, commit=False)
dirty=True
else:
dirty=False
log.info("stripping developmental release suffix")
# drop '.dev0' suffix, commit with given message and create git tag
self.bumpversion(
"release", tag=True, message=self.message, allow_dirty=dirty)
with open('README.rst', 'r') as f:
long_description = f.read()
setup(
name="MutatorMath",
version="3.0.2.dev0",
description=("Python for piecewise linear interpolation in multiple "
"dimensions with multiple, arbitrarily placed, masters."),
long_description=long_description,
author="Erik van Blokland",
author_email="[email protected]",
url="https://github.com/LettError/MutatorMath",
license="BSD 3 Clause",
packages=find_packages("Lib", exclude=['*.test', '*.test.*']),
package_dir={"": "Lib"},
setup_requires=[
'bumpversion',
] if {'release', 'bump_version'}.intersection(sys.argv) else [],
install_requires=[
"fonttools>=3.32.0",
"defcon>=0.3.5",
"fontMath>=0.4.8",
],
cmdclass={
"release": release,
"bump_version": bump_version,
},
classifiers=[
"Development Status :: 5 - Production/Stable",
"Environment :: Console",
"Environment :: Other Environment",
"Intended Audience :: Developers",
"Intended Audience :: End Users/Desktop",
"License :: OSI Approved :: BSD License",
"Natural Language :: English",
"Operating System :: OS Independent",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
"Topic :: Multimedia :: Graphics",
"Topic :: Multimedia :: Graphics :: Graphics Conversion",
"Topic :: Multimedia :: Graphics :: Editors :: Vector-Based",
"Topic :: Software Development :: Libraries :: Python Modules",
],
test_suite="mutatorMath.test.run",
)