summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRonny Pfannschmidt <opensource@ronnypfannschmidt.de>2023-04-27 07:35:21 +0200
committerGitHub <noreply@github.com>2023-04-27 07:35:21 +0200
commit20083e16e1b999cde99d8a19a53e1f9f4464f52f (patch)
treee68e0b5f4cbef9baa1b32e59361cb9e9be191b08
parent126a49c3f9e6b4f3f077f83595af08a74895b4a2 (diff)
parent8af496d3f58fc20bc5e005e2e99d6eb2bc3d8d43 (diff)
downloadsetuptools-scm-20083e16e1b999cde99d8a19a53e1f9f4464f52f.tar.gz
Merge pull request #841 from RonnyPfannschmidt/cleanups
fix #838 - handle empty tag regex
-rw-r--r--src/setuptools_scm/__init__.py44
-rw-r--r--src/setuptools_scm/_log.py6
-rw-r--r--src/setuptools_scm/version.py21
-rw-r--r--testing/test_basic_api.py7
4 files changed, 55 insertions, 23 deletions
diff --git a/src/setuptools_scm/__init__.py b/src/setuptools_scm/__init__.py
index b29273c..faea673 100644
--- a/src/setuptools_scm/__init__.py
+++ b/src/setuptools_scm/__init__.py
@@ -6,6 +6,7 @@ from __future__ import annotations
import os
import re
+import warnings
from typing import Any
from typing import Pattern
from typing import TYPE_CHECKING
@@ -133,7 +134,15 @@ def get_version(
version_cls = _validate_version_cls(version_cls, normalize)
del normalize
if isinstance(tag_regex, str):
- tag_regex = re.compile(tag_regex)
+ if tag_regex == "":
+ warnings.warn(
+ DeprecationWarning(
+ "empty regex for tag regex is invalid, using default"
+ )
+ )
+ tag_regex = DEFAULT_TAG_REGEX
+ else:
+ tag_regex = re.compile(tag_regex)
config = Configuration(**locals())
maybe_version = _get_version(config)
@@ -143,23 +152,26 @@ def get_version(
def _get_version(config: Configuration) -> str | None:
- parsed_version = _do_parse(config)
- if parsed_version is None:
- return None
- version_string = _format_version(
- parsed_version,
- version_scheme=config.version_scheme,
- local_scheme=config.local_scheme,
- )
- if config.write_to is not None:
- dump_version(
- root=config.root,
- version=version_string,
- write_to=config.write_to,
- template=config.write_to_template,
+ from ._log import magic_debug
+
+ with magic_debug():
+ parsed_version = _do_parse(config)
+ if parsed_version is None:
+ return None
+ version_string = _format_version(
+ parsed_version,
+ version_scheme=config.version_scheme,
+ local_scheme=config.local_scheme,
)
+ if config.write_to is not None:
+ dump_version(
+ root=config.root,
+ version=version_string,
+ write_to=config.write_to,
+ template=config.write_to_template,
+ )
- return version_string
+ return version_string
# Public API
diff --git a/src/setuptools_scm/_log.py b/src/setuptools_scm/_log.py
index 35c050d..abbdd0c 100644
--- a/src/setuptools_scm/_log.py
+++ b/src/setuptools_scm/_log.py
@@ -92,3 +92,9 @@ def enable_debug(handler: logging.Handler = _default_handler) -> Iterator[None]:
handler.setLevel(old_handler_level)
if handler is not _default_handler:
log.removeHandler(handler)
+
+
+@contextlib.contextmanager
+def magic_debug() -> Iterator[None]:
+ with enable_debug():
+ yield
diff --git a/src/setuptools_scm/version.py b/src/setuptools_scm/version.py
index 128533c..8cf48e8 100644
--- a/src/setuptools_scm/version.py
+++ b/src/setuptools_scm/version.py
@@ -38,10 +38,8 @@ SEMVER_LEN = 3
def _parse_version_tag(
tag: str | object, config: _config.Configuration
) -> dict[str, str] | None:
- tagstring = tag if isinstance(tag, str) else str(tag)
- match = config.tag_regex.match(tagstring)
+ match = config.tag_regex.match(str(tag))
- result = None
if match:
key: str | int
if len(match.groups()) == 1:
@@ -49,14 +47,23 @@ def _parse_version_tag(
else:
key = "version"
+ full = match.group(0)
+ log.debug("%r %r %s", tag, config.tag_regex, match)
+ log.debug(
+ "key %s data %s, %s, %r", key, match.groupdict(), match.groups(), full
+ )
result = {
"version": match.group(key),
- "prefix": match.group(0)[: match.start(key)],
- "suffix": match.group(0)[match.end(key) :],
+ "prefix": full[: match.start(key)],
+ "suffix": full[match.end(key) :],
}
- log.debug(f"tag '{tag}' parsed to {result}")
- return result
+ log.debug("tag %r parsed to %r", tag, result)
+ return result
+ else:
+ log.debug("tag %r did not parse", tag)
+
+ return None
def callable_or_entrypoint(group: str, callable_or_name: str | Any) -> Any:
diff --git a/testing/test_basic_api.py b/testing/test_basic_api.py
index f1b4c4f..6fd39bd 100644
--- a/testing/test_basic_api.py
+++ b/testing/test_basic_api.py
@@ -121,6 +121,13 @@ setup(name="myscm", use_scm_version={"fallback_version": "12.34"})
assert res.stdout == "12.34"
+def test_get_version_blank_tag_regex() -> None:
+ with pytest.warns(
+ DeprecationWarning, match="empty regex for tag regex is invalid, using default"
+ ):
+ setuptools_scm.get_version(tag_regex="")
+
+
@pytest.mark.parametrize(
"version", ["1.0", "1.2.3.dev1+ge871260", "1.2.3.dev15+ge871260.d20180625", "2345"]
)