Skip to content

Commit abb6185

Browse files
use the canonical parsers from packaging for getting the package name
1 parent c37f631 commit abb6185

File tree

4 files changed

+37
-27
lines changed

4 files changed

+37
-27
lines changed

src/setuptools_scm/_integration/pyproject_reading.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from typing import Sequence
88

99
from .. import _log
10+
from .._requirement_cls import extract_package_name
1011
from .toml import TOML_RESULT
1112
from .toml import read_toml_content
1213

@@ -75,12 +76,7 @@ def has_build_package(
7576
requires: Sequence[str], build_package_names: Sequence[str]
7677
) -> bool:
7778
for requirement in requires:
78-
import re
79-
80-
# Remove extras like [toml] first
81-
clean_req = re.sub(r"\[.*?\]", "", requirement)
82-
# Split on version operators and take first part
83-
package_name = re.split(r"[><=!~]", clean_req)[0].strip().lower()
79+
package_name = extract_package_name(requirement).lower()
8480
if package_name in build_package_names:
8581
return True
8682
return False

src/setuptools_scm/_integration/setuptools.py

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,25 +39,6 @@ def _warn_on_old_setuptools(_version: str = setuptools.__version__) -> None:
3939
)
4040

4141

42-
def _extract_package_name(requirement: str) -> str:
43-
"""Extract the package name from a requirement string.
44-
45-
Examples:
46-
'setuptools_scm' -> 'setuptools_scm'
47-
'setuptools-scm>=8' -> 'setuptools-scm'
48-
'setuptools_scm[toml]>=7.0' -> 'setuptools_scm'
49-
"""
50-
# Split on common requirement operators and take the first part
51-
# This handles: >=, <=, ==, !=, >, <, ~=
52-
import re
53-
54-
# Remove extras like [toml] first
55-
requirement = re.sub(r"\[.*?\]", "", requirement)
56-
# Split on version operators
57-
package_name = re.split(r"[><=!~]", requirement)[0].strip()
58-
return package_name
59-
60-
6142
def _assign_version(
6243
dist: setuptools.Distribution, config: _config.Configuration
6344
) -> None:
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from __future__ import annotations
2+
3+
try:
4+
from packaging.requirements import Requirement
5+
from packaging.utils import canonicalize_name
6+
except ImportError:
7+
from setuptools.extern.packaging.requirements import ( # type: ignore[import-not-found,no-redef]
8+
Requirement as Requirement,
9+
)
10+
from setuptools.extern.packaging.utils import ( # type: ignore[import-not-found,no-redef]
11+
canonicalize_name as canonicalize_name,
12+
)
13+
14+
from . import _log
15+
16+
log = _log.log.getChild("requirement_cls")
17+
18+
19+
def extract_package_name(requirement_string: str) -> str:
20+
"""Extract the canonical package name from a requirement string.
21+
22+
This function uses packaging.requirements.Requirement to properly parse
23+
the requirement and extract the package name, handling all edge cases
24+
that the custom regex-based approach might miss.
25+
26+
Args:
27+
requirement_string: The requirement string to parse
28+
29+
Returns:
30+
The package name as a string
31+
"""
32+
return canonicalize_name(Requirement(requirement_string).name)

testing/test_integration.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@
1818

1919
import setuptools_scm._integration.setuptools
2020

21+
from setuptools_scm._requirement_cls import extract_package_name
22+
2123
if TYPE_CHECKING:
2224
import setuptools
2325

2426
from setuptools_scm import Configuration
25-
from setuptools_scm._integration.setuptools import _extract_package_name
2627
from setuptools_scm._integration.setuptools import _warn_on_old_setuptools
2728
from setuptools_scm._overrides import PRETEND_KEY
2829
from setuptools_scm._overrides import PRETEND_KEY_NAMED
@@ -826,7 +827,7 @@ def test_pyproject_build_system_requires_priority_over_tool_section(
826827
)
827828
def test_extract_package_name(base_name: str, requirements: str) -> None:
828829
"""Test the _extract_package_name helper function"""
829-
assert _extract_package_name(f"{base_name}{requirements}") == base_name
830+
assert extract_package_name(f"{base_name}{requirements}") == "setuptools-scm"
830831

831832

832833
def test_build_requires_integration_with_config_reading(wd: WorkDir) -> None:

0 commit comments

Comments
 (0)