From 0ae3d9ec09d94c00ffc07bb42ca26db0471fcd68 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Tue, 18 Sep 2018 17:23:55 +0100 Subject: [PATCH] use setuptools-scm for versioning; remove bumpversion --- .gitignore | 3 + Lib/ufo2ft/__init__.py | 5 +- setup.cfg | 35 ++-------- setup.py | 144 +---------------------------------------- 4 files changed, 14 insertions(+), 173 deletions(-) diff --git a/.gitignore b/.gitignore index 5f1e775bb..448317353 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,6 @@ htmlcov/ # autosaved emacs files *~ + +# autogenerated by setuptools-scm +Lib/ufo2ft/_version.py diff --git a/Lib/ufo2ft/__init__.py b/Lib/ufo2ft/__init__.py index 8bc5c65eb..884e940a7 100644 --- a/Lib/ufo2ft/__init__.py +++ b/Lib/ufo2ft/__init__.py @@ -18,8 +18,11 @@ from ufo2ft.postProcessor import PostProcessor import logging +try: + from ._version import version as __version__ +except ImportError: + __version__ = "0.0.0+unknown" -__version__ = "2.3.0.dev0" logger = logging.getLogger(__name__) diff --git a/setup.cfg b/setup.cfg index 6b891468b..fe3d9a7f6 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,29 +1,3 @@ -[bumpversion] -current_version = 2.3.0.dev0 -commit = True -tag = False -tag_name = v{new_version} -parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\.(?P[a-z]+)(?P\d+))? -serialize = - {major}.{minor}.{patch}.{release}{dev} - {major}.{minor}.{patch} - -[bumpversion:part:release] -optional_value = final -values = - dev - final - -[bumpversion:part:dev] - -[bumpversion:file:Lib/ufo2ft/__init__.py] -search = __version__ = "{current_version}" -replace = __version__ = "{new_version}" - -[bumpversion:file:setup.py] -search = version="{current_version}" -replace = version="{new_version}" - [wheel] universal = 1 @@ -38,13 +12,12 @@ license_file = LICENSE [tool:pytest] minversion = 2.8 -testpaths = +testpaths = tests -python_files = +python_files = *_test.py -python_classes = +python_classes = *Test -addopts = +addopts = -v -r a - diff --git a/setup.py b/setup.py index d54e9d56f..e5c1775aa 100644 --- a/setup.py +++ b/setup.py @@ -2,154 +2,20 @@ from __future__ import print_function, division, absolute_import import sys -from setuptools import setup, find_packages, Command -from distutils import log - - -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, **kwargs): - """ Run bumpversion.main() with the specified arguments. - """ - import bumpversion - - args = ['--verbose'] if self.verbose > 1 else [] - for k, v in kwargs.items(): - k = "--{}".format(k.replace("_", "-")) - is_bool = isinstance(v, bool) and v is True - args.extend([k] if is_bool else [k, str(v)]) - args.append(part) - - log.debug( - "$ bumpversion %s" % " ".join(a.replace(" ", "\\ ") for a in args)) - - bumpversion.main(args) - - 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. - """ - - description = "tag a new release" - - user_options = [ - ("message=", 'm', "message containing the release notes"), - ("sign", "s", "make a GPG-signed tag, using the default key"), - ] - - def initialize_options(self): - self.message = None - self.sign = False - - def finalize_options(self): - 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' with 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 = "v{new_version}\n\n%s" % message - self.sign = bool(self.sign) - - @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): - log.info("stripping developmental release suffix") - # drop '.dev0' suffix, commit with given message and create git tag - self.bumpversion("release", - tag=True, - message="Release {new_version}", - tag_message=self.message, - sign_tags=self.sign) +from setuptools import setup, find_packages needs_pytest = {'pytest', 'test'}.intersection(sys.argv) pytest_runner = ['pytest_runner'] if needs_pytest else [] needs_wheel = {'bdist_wheel'}.intersection(sys.argv) wheel = ['wheel'] if needs_wheel else [] -needs_bump2version = {'release', 'bump_version'}.intersection(sys.argv) -bump2version = ['bump2version >= 0.5.7'] if needs_bump2version else [] with open('README.rst', 'r') as f: long_description = f.read() setup( name="ufo2ft", - version="2.3.0.dev0", + use_scm_version={"write_to": "Lib/ufo2ft/_version.py"}, author="Tal Leming, James Godfrey-Kittle", author_email="tal@typesupply.com", maintainer="Cosimo Lupo", @@ -161,7 +27,7 @@ def run(self): packages=find_packages("Lib"), include_package_data=True, license="MIT", - setup_requires=pytest_runner + wheel + bump2version, + setup_requires=pytest_runner + wheel + ["setuptools_scm"], tests_require=[ 'pytest>=2.8', ], @@ -179,10 +45,6 @@ def run(self): "skia-pathops>=0.2.0", ], }, - cmdclass={ - "release": release, - "bump_version": bump_version, - }, classifiers=[ 'Development Status :: 4 - Beta', "Environment :: Console",