diff options
author | Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> | 2023-01-18 14:08:38 +0100 |
---|---|---|
committer | Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> | 2023-01-18 14:08:38 +0100 |
commit | 78e7d6bb470e3c0ae5fd744e572f6e6085401a33 (patch) | |
tree | 21a4358e036affaed2e6a0c59cf01dd2d92026c9 /src/setuptools_scm | |
parent | bf0e8134e6b2101031acc3b3bb7b9bb4d2e6dd1b (diff) | |
download | setuptools-scm-78e7d6bb470e3c0ae5fd744e572f6e6085401a33.tar.gz |
potential breaking: Configuration as dataclass
Diffstat (limited to 'src/setuptools_scm')
-rw-r--r-- | src/setuptools_scm/__init__.py | 8 | ||||
-rw-r--r-- | src/setuptools_scm/config.py | 114 | ||||
-rw-r--r-- | src/setuptools_scm/integration.py | 6 | ||||
-rw-r--r-- | src/setuptools_scm/version.py | 6 |
4 files changed, 42 insertions, 92 deletions
diff --git a/src/setuptools_scm/__init__.py b/src/setuptools_scm/__init__.py index 11756ba..98c7e61 100644 --- a/src/setuptools_scm/__init__.py +++ b/src/setuptools_scm/__init__.py @@ -5,6 +5,7 @@ from __future__ import annotations import os +import re from typing import Any from typing import Pattern from typing import TYPE_CHECKING @@ -13,6 +14,7 @@ from ._entrypoints import _version_from_entrypoints from ._overrides import _read_pretended_version_for from ._overrides import PRETEND_KEY from ._overrides import PRETEND_KEY_NAMED +from ._version_cls import _validate_version_cls from ._version_cls import _version_as_tuple from ._version_cls import NonNormalizedVersion from ._version_cls import Version @@ -126,9 +128,13 @@ def get_version( in the root of the repository to direct setuptools_scm to the root of the repository by supplying ``__file__``. """ - + version_cls = _validate_version_cls(version_cls, normalize) + del normalize + if isinstance((tag_regex), str): + tag_regex = re.compile(tag_regex) config = Configuration(**locals()) maybe_version = _get_version(config) + if maybe_version is None: _version_missing(config) return maybe_version diff --git a/src/setuptools_scm/config.py b/src/setuptools_scm/config.py index ebc11ca..0394eba 100644 --- a/src/setuptools_scm/config.py +++ b/src/setuptools_scm/config.py @@ -1,6 +1,7 @@ """ configuration """ from __future__ import annotations +import dataclasses import os import re import warnings @@ -13,23 +14,26 @@ from ._integration.pyproject_reading import ( get_args_for_pyproject as _get_args_for_pyproject, ) from ._integration.pyproject_reading import read_pyproject as _read_pyproject -from ._version_cls import _validate_version_cls from ._version_cls import _VersionT +from ._version_cls import Version as _Version from .utils import trace if TYPE_CHECKING: from . import _types as _t -DEFAULT_TAG_REGEX = r"^(?:[\w-]+-)?(?P<version>[vV]?\d+(?:\.\d+){0,2}[^\+]*)(?:\+.*)?$" +DEFAULT_TAG_REGEX = re.compile( + r"^(?:[\w-]+-)?(?P<version>[vV]?\d+(?:\.\d+){0,2}[^\+]*)(?:\+.*)?$" +) DEFAULT_VERSION_SCHEME = "guess-next-dev" DEFAULT_LOCAL_SCHEME = "node-and-date" def _check_tag_regex(value: str | Pattern[str] | None) -> Pattern[str]: if not value: - value = DEFAULT_TAG_REGEX - regex = re.compile(value) + regex = DEFAULT_TAG_REGEX + else: + regex = re.compile(value) group_names = regex.groupindex.keys() if regex.groups == 0 or (regex.groups > 1 and "version" not in group_names): @@ -67,95 +71,31 @@ def _check_absolute_root(root: _t.PathT, relative_to: _t.PathT | None) -> str: return os.path.abspath(root) +@dataclasses.dataclass class Configuration: """Global configuration model""" - parent: _t.PathT | None - _root: str - _relative_to: str | None - version_cls: type[_VersionT] - - def __init__( - self, - relative_to: _t.PathT | None = None, - root: _t.PathT = ".", - version_scheme: _t.VERSION_SCHEME = DEFAULT_VERSION_SCHEME, - local_scheme: _t.VERSION_SCHEME = DEFAULT_LOCAL_SCHEME, - write_to: _t.PathT | None = None, - write_to_template: str | None = None, - tag_regex: str | Pattern[str] = DEFAULT_TAG_REGEX, - parentdir_prefix_version: str | None = None, - fallback_version: str | None = None, - fallback_root: _t.PathT = ".", - parse: Any | None = None, - git_describe_command: _t.CMD_TYPE | None = None, - dist_name: str | None = None, - version_cls: type[_VersionT] | type | str | None = None, - normalize: bool = True, - search_parent_directories: bool = False, - ): - # TODO: - self._relative_to = None if relative_to is None else os.fspath(relative_to) - self._root = "." - - self.root = os.fspath(root) - self.version_scheme = version_scheme - self.local_scheme = local_scheme - self.write_to = write_to - self.write_to_template = write_to_template - self.parentdir_prefix_version = parentdir_prefix_version - self.fallback_version = fallback_version - self.fallback_root = fallback_root # type: ignore - self.parse = parse - self.tag_regex = tag_regex # type: ignore - self.git_describe_command = git_describe_command - self.dist_name = dist_name - self.search_parent_directories = search_parent_directories - self.parent = None - - self.version_cls = _validate_version_cls(version_cls, normalize) - - @property - def fallback_root(self) -> str: - return self._fallback_root - - @fallback_root.setter - def fallback_root(self, value: _t.PathT) -> None: - self._fallback_root = os.path.abspath(value) + relative_to: _t.PathT | None = None + root: _t.PathT = "." + version_scheme: _t.VERSION_SCHEME = DEFAULT_VERSION_SCHEME + local_scheme: _t.VERSION_SCHEME = DEFAULT_LOCAL_SCHEME + tag_regex: Pattern[str] = DEFAULT_TAG_REGEX + parentdir_prefix_version: str | None = None + fallback_version: str | None = None + fallback_root: _t.PathT = "." + write_to: _t.PathT | None = None + write_to_template: str | None = None + parse: Any | None = None + git_describe_command: _t.CMD_TYPE | None = None + dist_name: str | None = None + version_cls: type[_VersionT] = _Version + search_parent_directories: bool = False + + parent: _t.PathT | None = None @property def absolute_root(self) -> str: - return self._absolute_root - - @property - def relative_to(self) -> str | None: - return self._relative_to - - @relative_to.setter - def relative_to(self, value: _t.PathT) -> None: - self._absolute_root = _check_absolute_root(self._root, value) - self._relative_to = os.fspath(value) - trace("root", repr(self._absolute_root)) - trace("relative_to", repr(value)) - - @property - def root(self) -> str: - return self._root - - @root.setter - def root(self, value: _t.PathT) -> None: - self._absolute_root = _check_absolute_root(value, self._relative_to) - self._root = os.fspath(value) - trace("root", repr(self._absolute_root)) - trace("relative_to", repr(self._relative_to)) - - @property - def tag_regex(self) -> Pattern[str]: - return self._tag_regex - - @tag_regex.setter - def tag_regex(self, value: str | Pattern[str]) -> None: - self._tag_regex = _check_tag_regex(value) + return _check_absolute_root(self.root, self.relative_to) @classmethod def from_file( diff --git a/src/setuptools_scm/integration.py b/src/setuptools_scm/integration.py index 2134ff1..b866caa 100644 --- a/src/setuptools_scm/integration.py +++ b/src/setuptools_scm/integration.py @@ -15,6 +15,7 @@ from ._entrypoints import iter_entry_points from ._integration.setuptools import ( read_dist_name_from_setup_cfg as _read_dist_name_from_setup_cfg, ) +from ._version_cls import _validate_version_cls from .config import Configuration from .utils import do from .utils import trace @@ -87,7 +88,10 @@ def version_keyword( dist_name = dist.metadata.name # type: str | None if dist_name is None: dist_name = _read_dist_name_from_setup_cfg() - config = Configuration(dist_name=dist_name, **value) + version_cls = value.pop("version_cls", None) + normalize = value.pop("normalize", True) + final_version = _validate_version_cls(version_cls, normalize) + config = Configuration(dist_name=dist_name, version_cls=final_version, **value) _assign_version(dist, config) diff --git a/src/setuptools_scm/version.py b/src/setuptools_scm/version.py index 16992d3..bbd28a6 100644 --- a/src/setuptools_scm/version.py +++ b/src/setuptools_scm/version.py @@ -12,7 +12,7 @@ from typing import Callable from typing import Match from typing import TYPE_CHECKING -from ._entrypoints import _call_version_scheme +from . import _entrypoints from ._modify_version import _bump_dev from ._modify_version import _bump_regex from ._modify_version import _dont_guess_next_version @@ -414,12 +414,12 @@ def format_version(version: ScmVersion, **config: Any) -> str: if version.preformatted: assert isinstance(version.tag, str) return version.tag - main_version = _call_version_scheme( + main_version = _entrypoints._call_version_scheme( version, "setuptools_scm.version_scheme", config["version_scheme"], None ) trace("version", main_version) assert main_version is not None - local_version = _call_version_scheme( + local_version = _entrypoints._call_version_scheme( version, "setuptools_scm.local_scheme", config["local_scheme"], "+unknown" ) trace("local_version", local_version) |