summaryrefslogtreecommitdiff
path: root/src/setuptools_scm/version.py
diff options
context:
space:
mode:
authorRonny Pfannschmidt <opensource@ronnypfannschmidt.de>2021-03-12 11:12:07 +0100
committerRonny Pfannschmidt <opensource@ronnypfannschmidt.de>2021-03-12 11:12:07 +0100
commit6494b676f63b11d58fb68e1e8703714a684be549 (patch)
tree2116db97a9bfb6ece1e9272e2b3c71edf54a18a8 /src/setuptools_scm/version.py
parentc984d7bc4c01e7fd1f4d116835d63ffc30e5e963 (diff)
downloadsetuptools-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.py44
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