diff --git a/tests/test_package.py b/tests/test_package.py index c6de1976..06269d60 100644 --- a/tests/test_package.py +++ b/tests/test_package.py @@ -110,6 +110,18 @@ def test_package_signed_name_is_correct(): assert package.signed_filename == (filename + ".asc") +def test_package_safe_name_is_correct(): + package = package_file.PackageFile( + filename="tests/fixtures/deprecated-pypirc", + comment=None, + metadata=pretend.stub(name="mosaik.SimConfig"), + python_version=None, + filetype=None, + ) + + assert package.safe_name == "mosaik.SimConfig" + + @pytest.mark.parametrize("gpg_signature", [(None), (pretend.stub())]) def test_metadata_dictionary(gpg_signature): meta = pretend.stub( diff --git a/twine/package.py b/twine/package.py index 0b68bc9c..77621664 100644 --- a/twine/package.py +++ b/twine/package.py @@ -14,11 +14,11 @@ import hashlib import io import os +import re import subprocess from typing import Dict, NamedTuple, Optional, Sequence, Tuple, Union import importlib_metadata -import packaging.utils import pkginfo from twine import exceptions @@ -44,6 +44,14 @@ MetadataValue = Union[str, Sequence[str]] +def safe_name(name: str) -> str: + """Convert an arbitrary string to a standard distribution name. + + Any runs of non-alphanumeric/. characters are replaced with a single '-'. + """ + return re.sub("[^A-Za-z0-9.]+", "-", name) + + class PackageFile: def __init__( self, @@ -59,7 +67,7 @@ def __init__( self.metadata = metadata self.python_version = python_version self.filetype = filetype - self.safe_name = packaging.utils.canonicalize_name(metadata.name) + self.safe_name = safe_name(metadata.name) self.signed_filename = self.filename + ".asc" self.signed_basefilename = self.basefilename + ".asc" self.gpg_signature: Optional[Tuple[str, bytes]] = None