From ce7c2dc48e04cd650c64b33da6930dd49fad4cd9 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Wed, 22 Jun 2022 12:05:38 +0200 Subject: [PATCH 1/4] minimize bootstrap - fixes #722 and #723 enable self-bootstrap without typing_extensions and importlib_metadata they are still install requirements however --- pyproject.toml | 3 --- src/setuptools_scm/__init__.py | 2 +- src/setuptools_scm/_entrypoints.py | 20 ++++++++++++++++---- src/setuptools_scm/_types.py | 7 ------- src/setuptools_scm/config.py | 2 +- src/setuptools_scm/discover.py | 4 +++- src/setuptools_scm/git.py | 8 +++++--- src/setuptools_scm/hacks.py | 4 +++- src/setuptools_scm/hg.py | 5 ++++- src/setuptools_scm/hg_git.py | 7 ++++--- src/setuptools_scm/scm_workdir.py | 8 ++++++-- src/setuptools_scm/utils.py | 16 +++++++++++++--- src/setuptools_scm/version.py | 3 ++- tox.ini | 10 +++++++++- 14 files changed, 67 insertions(+), 32 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 03f9636c..b2ee2867 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,9 +1,6 @@ [build-system] requires = [ "setuptools>=45", - "tomli>=1.0", "packaging>=20.0", - "typing_extensions", - "importlib_metadata", ] build-backend = "setuptools.build_meta" diff --git a/src/setuptools_scm/__init__.py b/src/setuptools_scm/__init__.py index 6edf3e4c..e6144668 100644 --- a/src/setuptools_scm/__init__.py +++ b/src/setuptools_scm/__init__.py @@ -10,7 +10,6 @@ from typing import Callable from typing import TYPE_CHECKING -from . import _types as _t from ._entrypoints import _call_entrypoint_fn from ._entrypoints import _version_from_entrypoints from ._overrides import _read_pretended_version_for @@ -33,6 +32,7 @@ if TYPE_CHECKING: from typing import NoReturn + from . import _types as _t TEMPLATES = { ".py": """\ diff --git a/src/setuptools_scm/_entrypoints.py b/src/setuptools_scm/_entrypoints.py index 0b86b90a..2efb9f8a 100644 --- a/src/setuptools_scm/_entrypoints.py +++ b/src/setuptools_scm/_entrypoints.py @@ -6,18 +6,20 @@ from typing import overload from typing import TYPE_CHECKING -from typing_extensions import Protocol - -from . import _types as _t from .utils import function_has_arg from .utils import trace from .version import ScmVersion if TYPE_CHECKING: from .config import Configuration + from typing_extensions import Protocol + from . import _types as _t else: Configuration = Any + class Protocol: + pass + class MaybeConfigFunction(Protocol): __name__: str @@ -71,7 +73,17 @@ def _version_from_entrypoints( try: from importlib.metadata import entry_points # type: ignore except ImportError: - from importlib_metadata import entry_points + try: + from importlib_metadata import entry_points + except ImportError: + from collections import defaultdict + + def entry_points() -> dict[str, list[_t.EntrypointProtocol]]: + warnings.warn( + "importlib metadata missing, " + "this may happen at build time for python3.7" + ) + return defaultdict(list) def iter_entry_points( diff --git a/src/setuptools_scm/_types.py b/src/setuptools_scm/_types.py index 555b1e75..6c6bdf85 100644 --- a/src/setuptools_scm/_types.py +++ b/src/setuptools_scm/_types.py @@ -3,7 +3,6 @@ from typing import Any from typing import Callable from typing import List -from typing import NamedTuple from typing import TYPE_CHECKING from typing import TypeVar from typing import Union @@ -22,12 +21,6 @@ VERSION_SCHEME = Union[str, Callable[["version.ScmVersion"], str]] -class CmdResult(NamedTuple): - out: str - err: str - returncode: int - - class EntrypointProtocol(Protocol): name: str diff --git a/src/setuptools_scm/config.py b/src/setuptools_scm/config.py index f5c0c1ab..f73b9058 100644 --- a/src/setuptools_scm/config.py +++ b/src/setuptools_scm/config.py @@ -12,13 +12,13 @@ from typing import TYPE_CHECKING from typing import Union -from . import _types as _t from ._version_cls import NonNormalizedVersion from ._version_cls import Version from .utils import trace if TYPE_CHECKING: + from . import _types as _t from setuptools_scm.version import ScmVersion DEFAULT_TAG_REGEX = r"^(?:[\w-]+-)?(?P[vV]?\d+(?:\.\d+){0,2}[^\+]*)(?:\+.*)?$" diff --git a/src/setuptools_scm/discover.py b/src/setuptools_scm/discover.py index 87533fd5..f7843ee8 100644 --- a/src/setuptools_scm/discover.py +++ b/src/setuptools_scm/discover.py @@ -3,8 +3,10 @@ import os from typing import Iterable from typing import Iterator +from typing import TYPE_CHECKING -from . import _types as _t +if TYPE_CHECKING: + from . import _types as _t from .config import Configuration from .utils import trace diff --git a/src/setuptools_scm/git.py b/src/setuptools_scm/git.py index 67603e9b..1f8984b8 100644 --- a/src/setuptools_scm/git.py +++ b/src/setuptools_scm/git.py @@ -11,9 +11,9 @@ from typing import Callable from typing import TYPE_CHECKING -from . import _types as _t from .config import Configuration from .scm_workdir import Workdir +from .utils import _CmdResult from .utils import data_from_mime from .utils import do_ex from .utils import require_command @@ -23,6 +23,8 @@ from .version import tags_to_versions if TYPE_CHECKING: + from . import _types as _t + from setuptools_scm.hg_git import GitWorkdirHgClient REF_TAG_RE = re.compile(r"(?<=\btag: )([^,]+)\b") @@ -72,7 +74,7 @@ def from_potential_worktree(cls, wd: _t.PathT) -> GitWorkdir | None: return cls(real_wd) - def do_ex_git(self, cmd: list[str]) -> _t.CmdResult: + def do_ex_git(self, cmd: list[str]) -> _CmdResult: return self.do_ex(["git", "--git-dir", join(self.path, ".git")] + cmd) def is_dirty(self) -> bool: @@ -120,7 +122,7 @@ def count_all_nodes(self) -> int: revs, _, _ = self.do_ex_git(["rev-list", "HEAD"]) return revs.count("\n") + 1 - def default_describe(self) -> _t.CmdResult: + def default_describe(self) -> _CmdResult: git_dir = join(self.path, ".git") return self.do_ex( DEFAULT_DESCRIBE[:1] + ["--git-dir", git_dir] + DEFAULT_DESCRIBE[1:] diff --git a/src/setuptools_scm/hacks.py b/src/setuptools_scm/hacks.py index 494691dd..9ca0df98 100644 --- a/src/setuptools_scm/hacks.py +++ b/src/setuptools_scm/hacks.py @@ -1,8 +1,10 @@ from __future__ import annotations import os +from typing import TYPE_CHECKING -from . import _types as _t +if TYPE_CHECKING: + from . import _types as _t from .config import Configuration from .utils import data_from_mime from .utils import trace diff --git a/src/setuptools_scm/hg.py b/src/setuptools_scm/hg.py index fb310661..d6d8458a 100644 --- a/src/setuptools_scm/hg.py +++ b/src/setuptools_scm/hg.py @@ -3,8 +3,8 @@ import datetime import os from pathlib import Path +from typing import TYPE_CHECKING -from . import _types as _t from ._version_cls import Version from .config import Configuration from .scm_workdir import Workdir @@ -16,6 +16,9 @@ from .version import ScmVersion from .version import tag_to_version +if TYPE_CHECKING: + from . import _types as _t + class HgWorkdir(Workdir): diff --git a/src/setuptools_scm/hg_git.py b/src/setuptools_scm/hg_git.py index 3f860e96..1b484622 100644 --- a/src/setuptools_scm/hg_git.py +++ b/src/setuptools_scm/hg_git.py @@ -8,12 +8,13 @@ from . import _types as _t from .git import GitWorkdir from .hg import HgWorkdir +from .utils import _CmdResult from .utils import do_ex from .utils import require_command from .utils import trace -_FAKE_GIT_DESCRIBE_ERROR = _t.CmdResult("<>hg git failed", "", 1) +_FAKE_GIT_DESCRIBE_ERROR = _CmdResult("<>hg git failed", "", 1) class GitWorkdirHgClient(GitWorkdir, HgWorkdir): @@ -94,7 +95,7 @@ def count_all_nodes(self) -> int: revs, _, _ = self.do_ex(["hg", "log", "-r", "ancestors(.)", "-T", "."]) return len(revs) - def default_describe(self) -> _t.CmdResult: + def default_describe(self) -> _CmdResult: """ Tentative to reproduce the output of @@ -142,4 +143,4 @@ def default_describe(self) -> _t.CmdResult: if self.is_dirty(): desc += "-dirty" trace("desc", desc) - return _t.CmdResult(desc, "", 0) + return _CmdResult(desc, "", 0) diff --git a/src/setuptools_scm/scm_workdir.py b/src/setuptools_scm/scm_workdir.py index 45ab7228..113f68ab 100644 --- a/src/setuptools_scm/scm_workdir.py +++ b/src/setuptools_scm/scm_workdir.py @@ -1,12 +1,16 @@ from __future__ import annotations from typing import ClassVar +from typing import TYPE_CHECKING -from . import _types as _t +from .utils import _CmdResult from .utils import do from .utils import do_ex from .utils import require_command +if TYPE_CHECKING: + from . import _types as _t + class Workdir: COMMAND: ClassVar[str] @@ -15,7 +19,7 @@ def __init__(self, path: _t.PathT): require_command(self.COMMAND) self.path = path - def do_ex(self, cmd: _t.CMD_TYPE) -> _t.CmdResult: + def do_ex(self, cmd: _t.CMD_TYPE) -> _CmdResult: return do_ex(cmd, cwd=self.path) def do(self, cmd: _t.CMD_TYPE) -> str: diff --git a/src/setuptools_scm/utils.py b/src/setuptools_scm/utils.py index 1f4df32e..5cd0d669 100644 --- a/src/setuptools_scm/utils.py +++ b/src/setuptools_scm/utils.py @@ -13,13 +13,23 @@ from types import FunctionType from typing import Iterator from typing import Mapping +from typing import NamedTuple +from typing import TYPE_CHECKING -from . import _types as _t +if TYPE_CHECKING: + + from . import _types as _t DEBUG = bool(os.environ.get("SETUPTOOLS_SCM_DEBUG")) IS_WINDOWS = platform.system() == "Windows" +class _CmdResult(NamedTuple): + out: str + err: str + returncode: int + + def no_git_env(env: Mapping[str, str]) -> dict[str, str]: # adapted from pre-commit # Too many bugs dealing with environment variables and GIT: @@ -69,7 +79,7 @@ def _run(cmd: _t.CMD_TYPE, cwd: _t.PathT) -> subprocess.CompletedProcess[bytes]: ) -def do_ex(cmd: _t.CMD_TYPE, cwd: _t.PathT = ".") -> _t.CmdResult: +def do_ex(cmd: _t.CMD_TYPE, cwd: _t.PathT = ".") -> _CmdResult: trace("cmd", repr(cmd)) trace(" in", cwd) if os.name == "posix" and not isinstance(cmd, (list, tuple)): @@ -82,7 +92,7 @@ def do_ex(cmd: _t.CMD_TYPE, cwd: _t.PathT = ".") -> _t.CmdResult: trace("err", repr(res.stderr)) if res.returncode: trace("ret", res.returncode) - return _t.CmdResult( + return _CmdResult( ensure_stripped_str(res.stdout), ensure_stripped_str(res.stderr), res.returncode ) diff --git a/src/setuptools_scm/version.py b/src/setuptools_scm/version.py index 528171f9..a53f50b2 100644 --- a/src/setuptools_scm/version.py +++ b/src/setuptools_scm/version.py @@ -19,7 +19,8 @@ if TYPE_CHECKING: from typing_extensions import Concatenate -from . import _types as _t + from . import _types as _t + from ._version_cls import Version as PkgVersion from .config import Configuration from .config import _VersionT diff --git a/tox.ini b/tox.ini index e26ee80a..1662bdfa 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist=py{37,38,39,310}-{test,selfcheck},check_readme,check-dist +envlist=py{37,38,39,310}-{test,selfcheck},check_readme,check-dist,check-bootstrap [pytest] testpaths=testing @@ -55,6 +55,14 @@ commands= python -m build twine check dist/* +[testenv:check-bootstrap] +deps = + setuptools > 45 + packaging>20 +skip_install = true +recreate = true +commands = + python setup.py bdist_wheel #XXX: envs for hg versions From 9cfd32d2e2c473591723b8ac5960be9a5f560b87 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Wed, 22 Jun 2022 12:12:19 +0200 Subject: [PATCH 2/4] fixup: add missed typing import guard --- src/setuptools_scm/integration.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/setuptools_scm/integration.py b/src/setuptools_scm/integration.py index 1fddc539..37588ed1 100644 --- a/src/setuptools_scm/integration.py +++ b/src/setuptools_scm/integration.py @@ -4,11 +4,11 @@ import warnings from typing import Any from typing import Callable +from typing import TYPE_CHECKING import setuptools from . import _get_version -from . import _types as _t from . import _version_missing from ._entrypoints import iter_entry_points from .config import _read_dist_name_from_setup_cfg @@ -16,6 +16,9 @@ from .utils import do from .utils import trace +if TYPE_CHECKING: + from . import _types as _t + def _warn_on_old_setuptools(_version: str = setuptools.__version__) -> None: if int(_version.split(".")[0]) < 45: From f9f3bec127800c1e748c94ac9747d1d217744c1a Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Wed, 22 Jun 2022 13:12:25 +0200 Subject: [PATCH 3/4] opt out of pyproject.toml for self-bootstrap --- src/setuptools_scm/file_finder.py | 2 +- src/setuptools_scm/file_finder_git.py | 6 +++++- src/setuptools_scm/integration.py | 6 ++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/setuptools_scm/file_finder.py b/src/setuptools_scm/file_finder.py index f4ef9bbf..99da792d 100644 --- a/src/setuptools_scm/file_finder.py +++ b/src/setuptools_scm/file_finder.py @@ -5,8 +5,8 @@ if TYPE_CHECKING: from typing_extensions import TypeGuard + from . import _types as _t -from . import _types as _t from .utils import trace diff --git a/src/setuptools_scm/file_finder_git.py b/src/setuptools_scm/file_finder_git.py index c7ac5daf..a83af21e 100644 --- a/src/setuptools_scm/file_finder_git.py +++ b/src/setuptools_scm/file_finder_git.py @@ -5,13 +5,17 @@ import subprocess import tarfile from typing import IO +from typing import TYPE_CHECKING -from . import _types as _t from .file_finder import is_toplevel_acceptable from .file_finder import scm_find_files from .utils import do_ex from .utils import trace +if TYPE_CHECKING: + from . import _types as _t + + log = logging.getLogger(__name__) diff --git a/src/setuptools_scm/integration.py b/src/setuptools_scm/integration.py index 37588ed1..731c19d7 100644 --- a/src/setuptools_scm/integration.py +++ b/src/setuptools_scm/integration.py @@ -19,6 +19,8 @@ if TYPE_CHECKING: from . import _types as _t +_SKIP_PYPROJECT_HACK = False + def _warn_on_old_setuptools(_version: str = setuptools.__version__) -> None: if int(_version.split(".")[0]) < 45: @@ -107,8 +109,12 @@ def infer_version(dist: setuptools.Distribution) -> None: vars(dist.metadata), ) dist_name = dist.metadata.name + if dist_name is None: + dist_name = _read_dist_name_from_setup_cfg() if not os.path.isfile("pyproject.toml"): return + if dist_name == "setuptools_scm": + return try: config = Configuration.from_file(dist_name=dist_name) except LookupError as e: From 64058add0ade7f92f55ae32964288d392f7ce199 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Wed, 22 Jun 2022 13:29:43 +0200 Subject: [PATCH 4/4] changelog --- CHANGELOG.rst | 8 ++++++++ src/setuptools_scm/integration.py | 2 -- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e7147610..dd76cc28 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,3 +1,11 @@ +v7.0.2 +====== + +* fix #723 and #722: remove bootstrap dependencies +* bugfix: ensure we read the distribution name from setup.cfg + if needed even for pyproject +* + v7.0.1 ======= diff --git a/src/setuptools_scm/integration.py b/src/setuptools_scm/integration.py index 731c19d7..db1296eb 100644 --- a/src/setuptools_scm/integration.py +++ b/src/setuptools_scm/integration.py @@ -19,8 +19,6 @@ if TYPE_CHECKING: from . import _types as _t -_SKIP_PYPROJECT_HACK = False - def _warn_on_old_setuptools(_version: str = setuptools.__version__) -> None: if int(_version.split(".")[0]) < 45: