summaryrefslogtreecommitdiff
path: root/src/setuptools_scm
diff options
context:
space:
mode:
authorRonny Pfannschmidt <opensource@ronnypfannschmidt.de>2023-01-18 14:08:38 +0100
committerRonny Pfannschmidt <opensource@ronnypfannschmidt.de>2023-01-18 14:08:38 +0100
commit78e7d6bb470e3c0ae5fd744e572f6e6085401a33 (patch)
tree21a4358e036affaed2e6a0c59cf01dd2d92026c9 /src/setuptools_scm
parentbf0e8134e6b2101031acc3b3bb7b9bb4d2e6dd1b (diff)
downloadsetuptools-scm-78e7d6bb470e3c0ae5fd744e572f6e6085401a33.tar.gz
potential breaking: Configuration as dataclass
Diffstat (limited to 'src/setuptools_scm')
-rw-r--r--src/setuptools_scm/__init__.py8
-rw-r--r--src/setuptools_scm/config.py114
-rw-r--r--src/setuptools_scm/integration.py6
-rw-r--r--src/setuptools_scm/version.py6
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)