diff --git a/Lib/packaging/tests/test_pypi_dist.py b/Lib/packaging/tests/test_pypi_dist.py --- a/Lib/packaging/tests/test_pypi_dist.py +++ b/Lib/packaging/tests/test_pypi_dist.py @@ -6,6 +6,7 @@ from packaging.pypi.dist import (ReleaseInfo, ReleasesList, DistInfo, split_archive_name, get_infos_from_url) from packaging.pypi.errors import HashDoesNotMatch, UnsupportedHashName +from packaging.errors import IrrationalVersionError from packaging.tests import unittest from packaging.tests.support import TempdirManager, requires_zlib, fake_dec @@ -87,6 +88,31 @@ for name, results in names.items(): self.assertEqual(results, split_archive_name(name)) + def test_irrational_version__normalization(self): + # Test irrational but normalizable (suggested) versions + normalizable = { + "0.4.5dev": "0.4.5.dev0", + "1.3.a4": "1.3a4", + "2.4-rc1": "2.4c1", + "1.2a": "1.2a0", + "1.2.3b": "1.2.3b0", + "1.02": "1.2", + "1.2a3.04": "1.2a3.4", + "1.2.dev.2": "1.2.dev2", + "1.2dev": "1.2.dev0", + } + for irrational, normalized in normalizable.items(): + release = ReleaseInfo("FooBar", irrational) + self.assertEqual(normalized, str(release.version)) + + def test_irrational_and_not_normalizable_versions(self): + # Test irrational/invalid versions that are NOT normalizable + irrational = ("abc", "aa bb", "1", "1.3pl1", "1.2a03", + "1.2.dev2.post2", "1.2.post2.dev3.post4") + for version in irrational: + self.assertRaises(IrrationalVersionError, ReleaseInfo, "FooBar", + version) + class TestDistInfo(TempdirManager, unittest.TestCase): srcpath = "/packages/source/f/foobar/foobar-0.1.tar.gz"