summaryrefslogtreecommitdiff
path: root/setuptools/command
diff options
context:
space:
mode:
authorAnderson Bravalheri <andersonbravalheri@gmail.com>2023-01-23 22:38:39 +0000
committerAnderson Bravalheri <andersonbravalheri@gmail.com>2023-01-23 22:38:39 +0000
commitec238c4af3bdd91f161cf594fa1aa53f967a9d0a (patch)
treeaf2b4f02c3e83a438eaeedb49e5ebeaed4a65e69 /setuptools/command
parent6050634818943befefe3a85a12503b6d8a1e8106 (diff)
downloadpython-setuptools-git-ec238c4af3bdd91f161cf594fa1aa53f967a9d0a.tar.gz
Extract normalization functions from editable_wheel and dist_info into own module
Diffstat (limited to 'setuptools/command')
-rw-r--r--setuptools/command/dist_info.py40
-rw-r--r--setuptools/command/editable_wheel.py36
2 files changed, 14 insertions, 62 deletions
diff --git a/setuptools/command/dist_info.py b/setuptools/command/dist_info.py
index 0685c945..d5344471 100644
--- a/setuptools/command/dist_info.py
+++ b/setuptools/command/dist_info.py
@@ -4,18 +4,16 @@ As defined in the wheel specification
"""
import os
-import re
import shutil
import sys
import warnings
from contextlib import contextmanager
-from inspect import cleandoc
+from distutils import log
+from distutils.core import Command
from pathlib import Path
-from distutils.core import Command
-from distutils import log
-from setuptools.extern import packaging
-from setuptools._deprecation_warning import SetuptoolsDeprecationWarning
+from .. import _normalization
+from .._deprecation_warning import SetuptoolsDeprecationWarning
class dist_info(Command):
@@ -72,8 +70,8 @@ class dist_info(Command):
egg_info.finalize_options()
self.egg_info = egg_info
- name = _safe(dist.get_name())
- version = _version(dist.get_version())
+ name = _normalization.safe_name(dist.get_name()).replace(".", "_")
+ version = _normalization.best_effort_version(dist.get_version())
self.name = f"{name}-{version}"
self.dist_info_dir = os.path.join(self.output_dir, f"{self.name}.dist-info")
@@ -105,32 +103,6 @@ class dist_info(Command):
bdist_wheel.egg2dist(egg_info_dir, self.dist_info_dir)
-def _safe(component: str) -> str:
- """Escape a component used to form a wheel name according to PEP 491"""
- return re.sub(r"[^\w\d.]+", "_", component)
-
-
-def _version(version: str) -> str:
- """Convert an arbitrary string to a version string."""
- v = version.replace(' ', '.')
- try:
- return str(packaging.version.Version(v)).replace("-", "_")
- except packaging.version.InvalidVersion:
- msg = f"""Invalid version: {version!r}.
- !!\n\n
- ###################
- # Invalid version #
- ###################
- {version!r} is not valid according to PEP 440.\n
- Please make sure specify a valid version for your package.
- Also note that future releases of setuptools may halt the build process
- if an invalid version is given.
- \n\n!!
- """
- warnings.warn(cleandoc(msg))
- return _safe(v).strip("_")
-
-
def _rm(dir_name, **opts):
if os.path.isdir(dir_name):
shutil.rmtree(dir_name, **opts)
diff --git a/setuptools/command/editable_wheel.py b/setuptools/command/editable_wheel.py
index d60cfbeb..1875641f 100644
--- a/setuptools/command/editable_wheel.py
+++ b/setuptools/command/editable_wheel.py
@@ -12,7 +12,6 @@ Create a wheel that, when installed, will make the source package 'editable'
import logging
import os
-import re
import shutil
import sys
import traceback
@@ -36,10 +35,10 @@ from typing import (
Union,
)
-from setuptools import Command, SetuptoolsDeprecationWarning, errors, namespaces
-from setuptools.command.build_py import build_py as build_py_cls
-from setuptools.discovery import find_package_path
-from setuptools.dist import Distribution
+from .. import Command, SetuptoolsDeprecationWarning, errors, namespaces, _normalization
+from ..discovery import find_package_path
+from ..dist import Distribution
+from .build_py import build_py as build_py_cls
if TYPE_CHECKING:
from wheel.wheelfile import WheelFile # noqa
@@ -490,7 +489,7 @@ class _TopLevelFinder:
))
name = f"__editable__.{self.name}.finder"
- finder = _make_identifier(name)
+ finder = _normalization.safe_identifier(name)
content = bytes(_finder_template(name, roots, namespaces_), "utf-8")
wheel.writestr(f"{finder}.py", content)
@@ -569,7 +568,7 @@ def _simple_layout(
return set(package_dir) in ({}, {""})
parent = os.path.commonpath([_parent_path(k, v) for k, v in layout.items()])
return all(
- _normalize_path(Path(parent, *key.split('.'))) == _normalize_path(value)
+ _normalization.path(Path(parent, *key.split('.'))) == _normalization.path(value)
for key, value in layout.items()
)
@@ -698,21 +697,14 @@ def _is_nested(pkg: str, pkg_path: str, parent: str, parent_path: str) -> bool:
>>> _is_nested("b.a", "path/b/a", "a", "path/a")
False
"""
- norm_pkg_path = _normalize_path(pkg_path)
+ norm_pkg_path = _normalization.path(pkg_path)
rest = pkg.replace(parent, "", 1).strip(".").split(".")
return (
pkg.startswith(parent)
- and norm_pkg_path == _normalize_path(Path(parent_path, *rest))
+ and norm_pkg_path == _normalization.path(Path(parent_path, *rest))
)
-def _normalize_path(filename: _Path) -> str:
- """Normalize a file/dir name for comparison purposes"""
- # See pkg_resources.normalize_path
- file = os.path.abspath(filename) if sys.platform == 'cygwin' else filename
- return os.path.normcase(os.path.realpath(os.path.normpath(file)))
-
-
def _empty_dir(dir_: _P) -> _P:
"""Create a directory ensured to be empty. Existing files may be removed."""
shutil.rmtree(dir_, ignore_errors=True)
@@ -720,18 +712,6 @@ def _empty_dir(dir_: _P) -> _P:
return dir_
-def _make_identifier(name: str) -> str:
- """Make a string safe to be used as Python identifier.
- >>> _make_identifier("12abc")
- '_12abc'
- >>> _make_identifier("__editable__.myns.pkg-78.9.3_local")
- '__editable___myns_pkg_78_9_3_local'
- """
- safe = re.sub(r'\W|^(?=\d)', '_', name)
- assert safe.isidentifier()
- return safe
-
-
class _NamespaceInstaller(namespaces.Installer):
def __init__(self, distribution, installation_dir, editable_name, src_root):
self.distribution = distribution