From 15dca67c876d457631673bcfcdaf0357c85ee8a7 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Wed, 23 Apr 2025 12:27:04 +0200 Subject: [PATCH] fix #1131: allow self-build without importlib_metadata --- CHANGELOG.md | 6 +++++ pyproject.toml | 1 - src/setuptools_scm/_entrypoints.py | 25 +++++++++++++++----- src/setuptools_scm/_file_finders/__init__.py | 3 +-- src/setuptools_scm/discover.py | 7 +++++- 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b63f03c..c8823c7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## v8.3.1 + +### Fixed + +- fixed #1131: allow self-build without importlib_metadata avaliable on python3.9 + ## v8.3.0 ### Fixed diff --git a/pyproject.toml b/pyproject.toml index 0d133f5c..b66940ee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,6 @@ build-backend = "_own_version_helper:build_meta" requires = [ "setuptools>=61", 'tomli<=2.0.2; python_version < "3.11"', - 'importlib-metadata>=4.6; python_version < "3.10"', ] backend-path = [ ".", diff --git a/src/setuptools_scm/_entrypoints.py b/src/setuptools_scm/_entrypoints.py index 08e74b77..3333eb5c 100644 --- a/src/setuptools_scm/_entrypoints.py +++ b/src/setuptools_scm/_entrypoints.py @@ -12,22 +12,33 @@ from . import _log from . import version +__all__ = [ + "entry_points", + "im", +] if TYPE_CHECKING: from . import _types as _t from ._config import Configuration from ._config import ParseFunction -if sys.version_info[:2] < (3, 10): - from importlib_metadata import EntryPoint as EntryPoint - from importlib_metadata import entry_points as entry_points -else: - from importlib.metadata import EntryPoint as EntryPoint - from importlib.metadata import entry_points as entry_points + if sys.version_info[:2] < (3, 10): + import importlib_metadata as im + else: + from importlib import metadata as im log = _log.log.getChild("entrypoints") +def entry_points(**kw: Any) -> im.EntryPoints: + if sys.version_info[:2] < (3, 10): + import importlib_metadata as im + else: + import importlib.metadata as im + + return im.entry_points(**kw) + + def version_from_entrypoint( config: Configuration, *, entrypoint: str, root: _t.PathT ) -> version.ScmVersion | None: @@ -52,6 +63,8 @@ def _get_ep(group: str, name: str) -> Any | None: def _get_from_object_reference_str(path: str, group: str) -> Any | None: # todo: remove for importlib native spelling + from importlib.metadata import EntryPoint # hack + ep = EntryPoint(path, path, group) try: return ep.load() diff --git a/src/setuptools_scm/_file_finders/__init__.py b/src/setuptools_scm/_file_finders/__init__.py index a3bf01c1..e19afc81 100644 --- a/src/setuptools_scm/_file_finders/__init__.py +++ b/src/setuptools_scm/_file_finders/__init__.py @@ -7,7 +7,6 @@ from .. import _log from .. import _types as _t -from .._entrypoints import EntryPoint from .._entrypoints import entry_points from .pathtools import norm_real @@ -102,7 +101,7 @@ def is_toplevel_acceptable(toplevel: str | None) -> TypeGuard[str]: def find_files(path: _t.PathT = "") -> list[str]: - eps: list[EntryPoint] = [ + eps = [ *entry_points(group="setuptools_scm.files_command"), *entry_points(group="setuptools_scm.files_command_fallback"), ] diff --git a/src/setuptools_scm/discover.py b/src/setuptools_scm/discover.py index e3dbda91..e8208ca4 100644 --- a/src/setuptools_scm/discover.py +++ b/src/setuptools_scm/discover.py @@ -3,6 +3,7 @@ import os from pathlib import Path +from typing import TYPE_CHECKING from typing import Iterable from typing import Iterator @@ -11,6 +12,10 @@ from . import _types as _t from ._config import Configuration +if TYPE_CHECKING: + from ._entrypoints import im + + log = _log.log.getChild("discover") @@ -48,7 +53,7 @@ def match_entrypoint(root: _t.PathT, name: str) -> bool: def iter_matching_entrypoints( root: _t.PathT, entrypoint: str, config: Configuration -) -> Iterable[_entrypoints.EntryPoint]: +) -> Iterable[im.EntryPoint]: """ Consider different entry-points in ``root`` and optionally its parents. :param root: File path.