diff options
-rw-r--r-- | README.rst | 19 | ||||
-rw-r--r-- | src/setuptools_scm/version.py | 22 |
2 files changed, 30 insertions, 11 deletions
@@ -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)): |