summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSpencer Chang <schang412@gmail.com>2023-02-10 04:05:04 -0800
committerSpencer Chang <schang412@gmail.com>2023-02-10 04:05:04 -0800
commit4d45456c401d4ae575f9525c1a20b52e1479dfd7 (patch)
treeeb119e50d33b7ba5b199b2e3f529cc36c7f5640a
parent01bc64e54afb0381405bf049e3df4548d59d5ff1 (diff)
downloadsetuptools-scm-4d45456c401d4ae575f9525c1a20b52e1479dfd7.tar.gz
add example, split get into new function
-rw-r--r--README.rst19
-rw-r--r--src/setuptools_scm/version.py22
2 files changed, 30 insertions, 11 deletions
diff --git a/README.rst b/README.rst
index fd2f18c..8914fc8 100644
--- a/README.rst
+++ b/README.rst
@@ -628,6 +628,25 @@ The callable must return the configuration.
)
+Customizing Version Scheme with pyproject.toml
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To support custom version schemes in pyproject.toml, you may specify your own function as an entrypoint for getting the version.
+
+.. code:: toml
+
+ # pyproject.toml
+ [tool.setuptools_scm]
+ version_scheme = "myproject.my_file:myversion_func"
+
+.. code:: python
+
+ # myproject/my_file
+ def myversion_func(version: ScmVersion):
+ from setuptools_scm.version import guess_next_version
+ return version.format_next_version(guess_next_version, '{guessed}b{distance}')
+
+
Note on testing non-installed versions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/src/setuptools_scm/version.py b/src/setuptools_scm/version.py
index 45647de..2377aed 100644
--- a/src/setuptools_scm/version.py
+++ b/src/setuptools_scm/version.py
@@ -494,6 +494,16 @@ def _get_ep(group: str, name: str) -> Any | None:
else:
return None
+def _get_from_object_reference_str(path: str) -> Any | None:
+ try:
+ from importlib.metadata import EntryPoint
+ except ImportError:
+ from importlib_metadata import EntryPoint
+ try:
+ return EntryPoint(path, path, None).load()
+ except (AttributeError, ModuleNotFoundError):
+ return None
+
def _iter_version_schemes(
entrypoint: str,
@@ -507,19 +517,9 @@ def _iter_version_schemes(
if _memo is None:
_memo = set()
if isinstance(scheme_value, str):
- tscheme_val = _get_ep(entrypoint, scheme_value)
- if tscheme_val is None:
- try:
- from importlib.metadata import EntryPoint
- except ImportError:
- from importlib_metadata import EntryPoint
- try:
- tscheme_val = EntryPoint(scheme_value, scheme_value, entrypoint).load()
- except (AttributeError, ModuleNotFoundError):
- pass
scheme_value = cast(
'str|List[str]|Tuple[str, ...]|Callable[["ScmVersion"], str]|None',
- tscheme_val
+ _get_ep(entrypoint, scheme_value) or _get_from_object_reference_str(scheme_value),
)
if isinstance(scheme_value, (list, tuple)):