diff --git a/pkg_resources/__init__.py b/pkg_resources/__init__.py index 4e9b83d83d..7e6db9e5bc 100644 --- a/pkg_resources/__init__.py +++ b/pkg_resources/__init__.py @@ -133,7 +133,9 @@ class _ZipLoaderModule(Protocol): __loader__: zipimport.zipimporter -_PEP440_FALLBACK = re.compile(r"^v?(?P(?:[0-9]+!)?[0-9]+(?:\.[0-9]+)*)", re.I) +_PEP440_FALLBACK = re.compile( + r"^v?(?P(?:[0-9]+!)?[0-9]+(?:\.[0-9]+)*)", re.IGNORECASE +) class PEP440Warning(RuntimeWarning): diff --git a/setuptools/_normalization.py b/setuptools/_normalization.py index 467b643d46..0505849080 100644 --- a/setuptools/_normalization.py +++ b/setuptools/_normalization.py @@ -8,10 +8,12 @@ import packaging # https://packaging.python.org/en/latest/specifications/core-metadata/#name -_VALID_NAME = re.compile(r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.I) -_UNSAFE_NAME_CHARS = re.compile(r"[^A-Z0-9._-]+", re.I) -_NON_ALPHANUMERIC = re.compile(r"[^A-Z0-9]+", re.I) -_PEP440_FALLBACK = re.compile(r"^v?(?P(?:[0-9]+!)?[0-9]+(?:\.[0-9]+)*)", re.I) +_VALID_NAME = re.compile(r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE) +_UNSAFE_NAME_CHARS = re.compile(r"[^A-Z0-9._-]+", re.IGNORECASE) +_NON_ALPHANUMERIC = re.compile(r"[^A-Z0-9]+", re.IGNORECASE) +_PEP440_FALLBACK = re.compile( + r"^v?(?P(?:[0-9]+!)?[0-9]+(?:\.[0-9]+)*)", re.IGNORECASE +) def safe_identifier(name: str) -> str: diff --git a/setuptools/command/build_ext.py b/setuptools/command/build_ext.py index e2a88ce218..0ec3657105 100644 --- a/setuptools/command/build_ext.py +++ b/setuptools/command/build_ext.py @@ -1,6 +1,7 @@ from __future__ import annotations import itertools +import operator import os import sys from importlib.machinery import EXTENSION_SUFFIXES @@ -325,7 +326,7 @@ def get_outputs(self) -> list[str]: def get_output_mapping(self) -> dict[str, str]: """See :class:`setuptools.commands.build.SubCommand`""" mapping = self._get_output_mapping() - return dict(sorted(mapping, key=lambda x: x[0])) + return dict(sorted(mapping, key=operator.itemgetter(0))) def __get_stubs_outputs(self): # assemble the base name for each extension that needs a stub diff --git a/setuptools/command/build_py.py b/setuptools/command/build_py.py index 584d2c15ac..387b7d677d 100644 --- a/setuptools/command/build_py.py +++ b/setuptools/command/build_py.py @@ -2,6 +2,7 @@ import fnmatch import itertools +import operator import os import stat import textwrap @@ -153,7 +154,7 @@ def get_output_mapping(self) -> dict[str, str]: self._get_package_data_output_mapping(), self._get_module_mapping(), ) - return dict(sorted(mapping, key=lambda x: x[0])) + return dict(sorted(mapping, key=operator.itemgetter(0))) def _get_module_mapping(self) -> Iterator[tuple[str, str]]: """Iterate over all modules producing (dest, src) pairs.""" diff --git a/setuptools/command/editable_wheel.py b/setuptools/command/editable_wheel.py index 2b21eacbad..d8f028cb85 100644 --- a/setuptools/command/editable_wheel.py +++ b/setuptools/command/editable_wheel.py @@ -14,6 +14,7 @@ import io import logging +import operator import os import shutil import traceback @@ -893,7 +894,7 @@ def _finder_template( """Create a string containing the code for the``MetaPathFinder`` and ``PathEntryFinder``. """ - mapping = dict(sorted(mapping.items(), key=lambda p: p[0])) + mapping = dict(sorted(mapping.items(), key=operator.itemgetter(0))) return _FINDER_TEMPLATE.format(name=name, mapping=mapping, namespaces=namespaces) diff --git a/setuptools/dist.py b/setuptools/dist.py index 68f877decd..928828159e 100644 --- a/setuptools/dist.py +++ b/setuptools/dist.py @@ -364,7 +364,7 @@ def _normalize_requires(self): def _finalize_license_files(self) -> None: """Compute names of all license files which should be included.""" license_files: list[str] | None = self.metadata.license_files - patterns: list[str] = license_files if license_files else [] + patterns: list[str] = license_files or [] license_file: str | None = self.metadata.license_file if license_file and license_file not in patterns: diff --git a/setuptools/msvc.py b/setuptools/msvc.py index de4b05f928..70c64cf90c 100644 --- a/setuptools/msvc.py +++ b/setuptools/msvc.py @@ -390,7 +390,7 @@ def _find_latest_available_vs_ver(self): vc_vers = set(reg_vc_vers) vc_vers.update(self.known_vs_paths) - return sorted(vc_vers)[-1] + return max(vc_vers) def find_reg_vs_vers(self): """ diff --git a/setuptools/package_index.py b/setuptools/package_index.py index 9e01d5e082..e5ab1221ca 100644 --- a/setuptools/package_index.py +++ b/setuptools/package_index.py @@ -47,12 +47,12 @@ from distutils.errors import DistutilsError EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.+!]+)$') -HREF = re.compile(r"""href\s*=\s*['"]?([^'"> ]+)""", re.I) +HREF = re.compile(r"""href\s*=\s*['"]?([^'"> ]+)""", re.IGNORECASE) PYPI_MD5 = re.compile( r'([^<]+)\n\s+\(md5\)' ) -URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):', re.I).match +URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):', re.IGNORECASE).match EXTENSIONS = ".tar.gz .tar.bz2 .tar .zip .tgz".split() __all__ = [ @@ -215,7 +215,9 @@ def wrapper(*args, **kwargs): return wrapper -REL = re.compile(r"""<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>""", re.I) +REL = re.compile( + r"""<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>""", re.IGNORECASE +) """ Regex for an HTML tag with 'rel="val"' attributes. """ diff --git a/setuptools/tests/config/test_apply_pyprojecttoml.py b/setuptools/tests/config/test_apply_pyprojecttoml.py index deee6fa47c..bc0c16423e 100644 --- a/setuptools/tests/config/test_apply_pyprojecttoml.py +++ b/setuptools/tests/config/test_apply_pyprojecttoml.py @@ -387,7 +387,7 @@ def test_not_listed_in_dynamic(self, tmp_path, attr, field, value): """Setuptools cannot set a field if not listed in ``dynamic``""" pyproject = self.pyproject(tmp_path, []) dist = makedist(tmp_path, **{attr: value}) - msg = re.compile(f"defined outside of `pyproject.toml`:.*{field}", re.S) + msg = re.compile(f"defined outside of `pyproject.toml`:.*{field}", re.DOTALL) with pytest.warns(_MissingDynamic, match=msg): dist = pyprojecttoml.apply_configuration(dist, pyproject) diff --git a/setuptools/tests/config/test_pyprojecttoml.py b/setuptools/tests/config/test_pyprojecttoml.py index bb15ce10de..ae4a1a67f2 100644 --- a/setuptools/tests/config/test_pyprojecttoml.py +++ b/setuptools/tests/config/test_pyprojecttoml.py @@ -207,7 +207,7 @@ def test_scripts_not_listed_in_dynamic(self, tmp_path, missing_dynamic): dynamic = {"scripts", "gui-scripts", "entry-points"} - {missing_dynamic} msg = f"defined outside of `pyproject.toml`:.*{missing_dynamic}" - with pytest.raises(OptionError, match=re.compile(msg, re.S)): + with pytest.raises(OptionError, match=re.compile(msg, re.DOTALL)): expand_configuration(self.pyproject(dynamic), tmp_path) @@ -325,7 +325,9 @@ def test_invalid_example(tmp_path, example, error_msg): pyproject = tmp_path / "pyproject.toml" pyproject.write_text(cleandoc(example), encoding="utf-8") - pattern = re.compile(f"invalid pyproject.toml.*{error_msg}.*", re.M | re.S) + pattern = re.compile( + f"invalid pyproject.toml.*{error_msg}.*", re.MULTILINE | re.DOTALL + ) with pytest.raises(ValueError, match=pattern): read_configuration(pyproject) diff --git a/setuptools/tests/test_dist_info.py b/setuptools/tests/test_dist_info.py index 6e109c9db2..9161134e8a 100644 --- a/setuptools/tests/test_dist_info.py +++ b/setuptools/tests/test_dist_info.py @@ -86,7 +86,7 @@ def test_invalid_version(self, tmp_path): """ config = "[metadata]\nname=proj\nversion=42\n[egg_info]\ntag_build=invalid!!!\n" (tmp_path / "setup.cfg").write_text(config, encoding="utf-8") - msg = re.compile("invalid version", re.M | re.I) + msg = re.compile("invalid version", re.MULTILINE | re.IGNORECASE) proc = run_command_inner("dist_info", cwd=tmp_path, check=False) assert proc.returncode assert msg.search(proc.stdout) diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py index ac736e2947..b8fc2a0bf6 100644 --- a/setuptools/tests/test_wheel.py +++ b/setuptools/tests/test_wheel.py @@ -115,11 +115,11 @@ def build_wheel(extra_file_defs=None, **kwargs): def tree_set(root): - contents = set() - for dirpath, dirnames, filenames in os.walk(root): - for filename in filenames: - contents.add(os.path.join(os.path.relpath(dirpath, root), filename)) - return contents + return set( + os.path.join(os.path.relpath(dirpath, root), filename) + for dirpath, dirnames, filenames in os.walk(root) + for filename in filenames + ) def flatten_tree(tree): diff --git a/tools/finalize.py b/tools/finalize.py index d646e67cd0..27471c7e25 100644 --- a/tools/finalize.py +++ b/tools/finalize.py @@ -37,7 +37,7 @@ def _repair_changelog(): """ changelog_fn = pathlib.Path('NEWS.rst') changelog = changelog_fn.read_text(encoding='utf-8') - fixed = re.sub(r'^(v[0-9.]+)v[0-9.]+$', r'\1', changelog, flags=re.M) + fixed = re.sub(r'^(v[0-9.]+)v[0-9.]+$', r'\1', changelog, flags=re.MULTILINE) changelog_fn.write_text(fixed, encoding='utf-8') subprocess.check_output(['git', 'add', changelog_fn])