From 55526e4dce4baa4b9f69230b90b62ddc8a8c1245 Mon Sep 17 00:00:00 2001 From: Peter Odding <peter@peterodding.com> Date: Sun, 16 Dec 2018 01:12:42 +0100 Subject: [PATCH 1/2] Backwards compatibility w/ old version number conversion --- py2deb/converter.py | 16 ++++++++++++++-- py2deb/package.py | 6 ++++-- py2deb/tests.py | 7 +++++-- py2deb/utils.py | 16 ++++++++++------ 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/py2deb/converter.py b/py2deb/converter.py index 26a42a7..bbc6ce6 100644 --- a/py2deb/converter.py +++ b/py2deb/converter.py @@ -3,7 +3,7 @@ # Authors: # - Arjan Verwer # - Peter Odding <peter.odding@paylogic.com> -# Last Change: November 18, 2018 +# Last Change: December 16, 2018 # URL: https://py2deb.readthedocs.io """ @@ -212,6 +212,18 @@ def name_prefix(self): """ return default_name_prefix() + @mutable_property + def prerelease_workaround(self): + """ + Whether to enable the pre-release workaround in :func:`normalize_package_version()` (a boolean). + + By setting this to :data:`False` converted version numbers will match + those generated by py2deb 0.25 and earlier. Release 1.0 introduced the + pre-release workaround and release 2.1 added the option to control + backwards compatibility in this respect. + """ + return True + @mutable_property def python_callback(self): """ @@ -908,4 +920,4 @@ def transform_version(self, package_to_convert, python_requirement_name, python_ python_requirement_name, package_to_convert.python_name, python_requirement_version, modified_version) python_requirement_version = modified_version - return normalize_package_version(python_requirement_version) + return normalize_package_version(python_requirement_version, prerelease_workaround=self.prerelease_workaround) diff --git a/py2deb/package.py b/py2deb/package.py index c0ef8da..39a5144 100644 --- a/py2deb/package.py +++ b/py2deb/package.py @@ -3,7 +3,7 @@ # Authors: # - Arjan Verwer # - Peter Odding <peter.odding@paylogic.com> -# Last Change: November 18, 2018 +# Last Change: December 16, 2018 # URL: https://py2deb.readthedocs.io """ @@ -126,7 +126,9 @@ def debian_version(self): Reformats :attr:`python_version` using :func:`.normalize_package_version()`. """ - return normalize_package_version(self.python_version) + return normalize_package_version( + self.python_version, prerelease_workaround=self.converter.prerelease_workaround + ) @cached_property def debian_maintainer(self): diff --git a/py2deb/tests.py b/py2deb/tests.py index 5cae93f..690c6ba 100644 --- a/py2deb/tests.py +++ b/py2deb/tests.py @@ -1,7 +1,7 @@ # Automated tests for the `py2deb' package. # # Author: Peter Odding <peter.odding@paylogic.com> -# Last Change: November 18, 2018 +# Last Change: December 16, 2018 # URL: https://py2deb.readthedocs.io """ @@ -156,11 +156,14 @@ def test_version_reformatting(self): """Test reformatting of Python version strings.""" assert normalize_package_version('1.5_42') == '1.5-42' assert normalize_package_version('1.5-whatever') == '1.5-whatever-1' - # PEP 440 pre-release versions. + # PEP 440 pre-release versions (specific handling added in release 1.0). assert normalize_package_version('1.0a2') == '1.0~a2' assert normalize_package_version('1.0b2') == '1.0~b2' assert normalize_package_version('1.0c2') == '1.0~rc2' assert normalize_package_version('1.0rc2') == '1.0~rc2' + # New versus old behavior (the option to control backwards compatibility was added in release 2.1). + assert normalize_package_version('1.0a2', prerelease_workaround=True) == '1.0~a2' + assert normalize_package_version('1.0a2', prerelease_workaround=False) == '1.0a2' def test_conversion_of_simple_package(self): """ diff --git a/py2deb/utils.py b/py2deb/utils.py index 1a7b533..dc5a24e 100644 --- a/py2deb/utils.py +++ b/py2deb/utils.py @@ -3,7 +3,7 @@ # Authors: # - Arjan Verwer # - Peter Odding <peter.odding@paylogic.com> -# Last Change: November 18, 2018 +# Last Change: December 16, 2018 # URL: https://py2deb.readthedocs.io """The :mod:`py2deb.utils` module contains miscellaneous code.""" @@ -346,11 +346,14 @@ def normalize_package_name(python_package_name): return re.sub('[^a-z0-9]+', '-', python_package_name.lower()).strip('-') -def normalize_package_version(python_package_version): +def normalize_package_version(python_package_version, prerelease_workaround=True): """ Normalize Python package version to be used as Debian package version. :param python_package_version: The version of a Python package (a string). + :param prerelease_workaround: :data:`True` to enable the pre-release + handling documented below, :data:`False` to + restore the old behavior. Reformats Python package versions to comply with the Debian policy manual. All characters except alphanumerics, dot (``.``) and plus (``+``) are @@ -363,10 +366,11 @@ def normalize_package_version(python_package_version): """ # Lowercase and remove invalid characters from the version string. version = re.sub('[^a-z0-9.+]+', '-', python_package_version.lower()).strip('-') - # Translate the PEP 440 pre-release identifier 'c' to 'rc'. - version = re.sub(r'(\d)c(\d)', r'\1rc\2', version) - # Replicate the intended ordering of PEP 440 pre-release versions (a, b, rc). - version = re.sub(r'(\d)(a|b|rc)(\d)', r'\1~\2\3', version) + if prerelease_workaround: + # Translate the PEP 440 pre-release identifier 'c' to 'rc'. + version = re.sub(r'(\d)c(\d)', r'\1rc\2', version) + # Replicate the intended ordering of PEP 440 pre-release versions (a, b, rc). + version = re.sub(r'(\d)(a|b|rc)(\d)', r'\1~\2\3', version) # Make sure the "Debian revision" contains a digit. components = version.split('-') if len(components) > 1 and not re.search('[0-9]', components[-1]): From 5e144e4e257c2527170b0ad0ec8ed30a83319b7c Mon Sep 17 00:00:00 2001 From: Peter Odding <peter@peterodding.com> Date: Sun, 16 Dec 2018 01:23:17 +0100 Subject: [PATCH 2/2] Release 2.1: Compatibility with old version number format --- CHANGELOG.rst | 14 ++++++++++++++ py2deb/__init__.py | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 6ee09a5..068b51c 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -11,6 +11,20 @@ to `semantic versioning`_. .. _Keep a Changelog: http://keepachangelog.com/ .. _semantic versioning: http://semver.org/ +`Release 2.1`_ (2018-12-16) +--------------------------- + +Enable optional backwards compatibility with the old version number conversion +up to :ref:`release 0.25` in which pre-release identifiers didn't receive any +special treatment. + +My reason for adding this backwards compatibility now is that it will allow me +to upgrade py2deb on the build server of my employer to the latest version +without being forced to switch to the new version number format at the same +time. This simplifies the transition significantly. + +.. _Release 2.1: https://github.com/paylogic/py2deb/compare/2.0...2.1 + `Release 2.0`_ (2018-11-18) --------------------------- diff --git a/py2deb/__init__.py b/py2deb/__init__.py index e15d996..1223ef0 100644 --- a/py2deb/__init__.py +++ b/py2deb/__init__.py @@ -3,7 +3,7 @@ # Authors: # - Arjan Verwer # - Peter Odding <peter.odding@paylogic.com> -# Last Change: November 18, 2018 +# Last Change: December 16, 2018 # URL: https://py2deb.readthedocs.io """ @@ -15,4 +15,4 @@ """ # Semi-standard module versioning. -__version__ = '2.0' +__version__ = '2.1'