From dd5caa4386cac10911e58864b542aeae092c2d87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Robert?= Date: Fri, 5 Apr 2024 11:17:17 +0200 Subject: [PATCH] RFC: refactor scm_version.py to survive pytest collection if setuptools_scm isn't installed --- erfa/_dev/scm_version.py | 72 +++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/erfa/_dev/scm_version.py b/erfa/_dev/scm_version.py index 3e1e8bd..37720f1 100644 --- a/erfa/_dev/scm_version.py +++ b/erfa/_dev/scm_version.py @@ -6,43 +6,55 @@ import os.path as pth from warnings import warn -try: - from setuptools_scm import git, Configuration, get_version as _get_version - from setuptools_scm.version import guess_next_version +def __getattr__(name): + if name not in ("_guess_next_dev", "get_version"): + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") - def _guess_next_dev(version, liberfadir=None): - if liberfadir is None: - liberfadir = pathlib.Path( - __file__).parent.parent.parent / 'liberfa' / 'erfa' + try: + from setuptools_scm import git, Configuration, get_version as _get_version + from setuptools_scm.version import guess_next_version - config = Configuration(root=liberfadir) - erfa_version = git.parse(liberfadir, config=config) - if not erfa_version.exact: - warn(f'liberfa/erfa not at a tagged release, but at {erfa_version}') + def _guess_next_dev(version, liberfadir=None): + if liberfadir is None: + liberfadir = pathlib.Path( + __file__).parent.parent.parent / 'liberfa' / 'erfa' - erfa_tag = erfa_version.format_with("{tag}") - version_string = str(version.tag) + config = Configuration(root=liberfadir) + erfa_version = git.parse(liberfadir, config=config) + if not erfa_version.exact: + warn(f'liberfa/erfa not at a tagged release, but at {erfa_version}') - if version.exact: - if not version_string.startswith(erfa_tag): - warn(f'tag {version_string} does not start with ' - f'liberfa/erfa tag {erfa_tag}') + erfa_tag = erfa_version.format_with("{tag}") + version_string = str(version.tag) - return version_string + if version.exact: + if not version_string.startswith(erfa_tag): + warn(f'tag {version_string} does not start with ' + f'liberfa/erfa tag {erfa_tag}') - else: - if erfa_tag > version_string: - guessed = erfa_tag - elif 'dev' in version_string or len(version_string.split('.')) > 3: - return version.format_next_version(guess_next_version) - else: - guessed = version_string.partition("+")[0] + '.1' - return version.format_with("{guessed}.dev{distance}", - guessed=guessed) + return version_string - get_version = functools.partial(_get_version, + else: + if erfa_tag > version_string: + guessed = erfa_tag + elif 'dev' in version_string or len(version_string.split('.')) > 3: + return version.format_next_version(guess_next_version) + else: + guessed = version_string.partition("+")[0] + '.1' + return version.format_with("{guessed}.dev{distance}", + guessed=guessed) + except Exception as exc: + raise ImportError('setuptools_scm broken or not installed') from exc + + else: + if name == "_guess_next_dev": + return _guess_next_dev + elif name == "get_version": + + return functools.partial(_get_version, root=pth.join('..', '..'), version_scheme=_guess_next_dev, relative_to=__file__) -except Exception as exc: - raise ImportError('setuptools_scm broken or not installed') from exc + else: + # supposedly unreachable + raise RuntimeError \ No newline at end of file