diff options
author | Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> | 2021-03-12 11:12:07 +0100 |
---|---|---|
committer | Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> | 2021-03-12 11:12:07 +0100 |
commit | 6494b676f63b11d58fb68e1e8703714a684be549 (patch) | |
tree | 2116db97a9bfb6ece1e9272e2b3c71edf54a18a8 /src/setuptools_scm/version.py | |
parent | c984d7bc4c01e7fd1f4d116835d63ffc30e5e963 (diff) | |
download | setuptools-scm-6494b676f63b11d58fb68e1e8703714a684be549.tar.gz |
introduce internal support for walking multiple version schemes, needs refinement
Diffstat (limited to 'src/setuptools_scm/version.py')
-rw-r--r-- | src/setuptools_scm/version.py | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/src/setuptools_scm/version.py b/src/setuptools_scm/version.py index ce21b26..ad5a18f 100644 --- a/src/setuptools_scm/version.py +++ b/src/setuptools_scm/version.py @@ -344,19 +344,47 @@ def postrelease_version(version): return version.format_with("{tag}.post{distance}") +def _get_ep(group, name): + for ep in iter_entry_points(group, name): + trace("ep found:", ep.name) + return ep.load() + + +def _iter_version_schemes(entrypoint, scheme_value, _memo=None): + if _memo is None: + _memo = set() + if isinstance(scheme_value, str): + scheme_value = _get_ep(entrypoint, scheme_value) + + if isinstance(scheme_value, (list, tuple)): + for variant in scheme_value: + if variant not in _memo: + _memo.add(variant) + yield from _iter_version_schemes(entrypoint, variant, _memo=_memo) + elif callable(scheme_value): + yield scheme_value + + +def _call_version_scheme(version, entypoint, given_value, default): + for scheme in _iter_version_schemes(entypoint, given_value): + result = scheme(version) + if result is not None: + return result + return default + + def format_version(version, **config): trace("scm version", version) trace("config", config) if version.preformatted: return version.tag - version_scheme = callable_or_entrypoint( - "setuptools_scm.version_scheme", config["version_scheme"] + main_version = _call_version_scheme( + version, "setuptools_scm.version_scheme", config["version_scheme"], None ) - local_scheme = callable_or_entrypoint( - "setuptools_scm.local_scheme", config["local_scheme"] - ) - main_version = version_scheme(version) trace("version", main_version) - local_version = local_scheme(version) + assert main_version is not None + local_version = _call_version_scheme( + version, "setuptools_scm.local_scheme", config["local_scheme"], "+unknown" + ) trace("local_version", local_version) - return version_scheme(version) + local_scheme(version) + return main_version + local_version |