Skip to content

Commit b5dbba7

Browse files
Merge pull request #904 from RonnyPfannschmidt/compat
prepare safer backward compatibility
2 parents d7bc20a + 889ed57 commit b5dbba7

11 files changed

+69
-107
lines changed

src/setuptools_scm/__init__.py

+6-56
Original file line numberDiff line numberDiff line change
@@ -4,70 +4,20 @@
44
"""
55
from __future__ import annotations
66

7-
from typing import Any
8-
from typing import Pattern
9-
10-
from . import _config
11-
from . import _types as _t
127
from ._config import Configuration
8+
from ._get_version_impl import _get_version # soft deprecated
9+
from ._get_version_impl import get_version # soft deprecated
10+
from ._integration.dump_version import dump_version # soft deprecated
1311
from ._version_cls import NonNormalizedVersion
1412
from ._version_cls import Version
1513
from .version import ScmVersion
1614

1715

18-
def dump_version(
19-
root: _t.PathT,
20-
version: str,
21-
write_to: _t.PathT,
22-
template: str | None = None,
23-
scm_version: ScmVersion | None = None,
24-
) -> None:
25-
"""soft deprecated helper to write the version file in the cwd
26-
27-
still used by hatch-vcs, will be removed after upstream uses the modern patterns
28-
"""
29-
from ._integration.dump_version import dump_version as real
30-
31-
return real(root, version, write_to, template, scm_version)
32-
33-
34-
def get_version(
35-
root: _t.PathT = ".",
36-
version_scheme: _t.VERSION_SCHEME = _config.DEFAULT_VERSION_SCHEME,
37-
local_scheme: _t.VERSION_SCHEME = _config.DEFAULT_LOCAL_SCHEME,
38-
write_to: _t.PathT | None = None,
39-
write_to_template: str | None = None,
40-
version_file: _t.PathT | None = None,
41-
version_file_template: str | None = None,
42-
relative_to: _t.PathT | None = None,
43-
tag_regex: str | Pattern[str] = _config.DEFAULT_TAG_REGEX,
44-
parentdir_prefix_version: str | None = None,
45-
fallback_version: str | None = None,
46-
fallback_root: _t.PathT = ".",
47-
parse: Any | None = None,
48-
git_describe_command: _t.CMD_TYPE | None = None,
49-
dist_name: str | None = None,
50-
version_cls: Any | None = None,
51-
normalize: bool = True,
52-
search_parent_directories: bool = False,
53-
) -> str:
54-
"""
55-
soft deprecated helper to obtain the vcs version
56-
its misused at runtime in numerous projects and has to stay for now
57-
58-
a replacement supporting editable installation in hatch/setuptools is planned
59-
"""
60-
61-
params = {**locals()}
62-
from ._get_version import get_version
63-
64-
return get_version(**params)
65-
66-
6716
# Public API
6817
__all__ = [
69-
"get_version",
70-
"dump_version",
18+
"get_version", # deprecated imported for backward compatibility
19+
"_get_version", # deprecated imported for backward compatibility
20+
"dump_version", # deprecated imported for backward compatibility
7121
"Configuration",
7222
"Version",
7323
"ScmVersion",

src/setuptools_scm/_cli.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from setuptools_scm import Configuration
88
from setuptools_scm._file_finders import find_files
9-
from setuptools_scm._get_version import _get_version
9+
from setuptools_scm._get_version_impl import _get_version
1010
from setuptools_scm.discover import walk_potential_roots
1111

1212

src/setuptools_scm/_entrypoints.py

+12-3
Original file line numberDiff line numberDiff line change
@@ -106,20 +106,29 @@ def _iter_version_schemes(
106106

107107
@overload
108108
def _call_version_scheme(
109-
version: version.ScmVersion, entrypoint: str, given_value: str, default: str
109+
version: version.ScmVersion,
110+
entrypoint: str,
111+
given_value: _t.VERSION_SCHEMES,
112+
default: str,
110113
) -> str:
111114
...
112115

113116

114117
@overload
115118
def _call_version_scheme(
116-
version: version.ScmVersion, entrypoint: str, given_value: str, default: None
119+
version: version.ScmVersion,
120+
entrypoint: str,
121+
given_value: _t.VERSION_SCHEMES,
122+
default: None,
117123
) -> str | None:
118124
...
119125

120126

121127
def _call_version_scheme(
122-
version: version.ScmVersion, entrypoint: str, given_value: str, default: str | None
128+
version: version.ScmVersion,
129+
entrypoint: str,
130+
given_value: _t.VERSION_SCHEMES,
131+
default: str | None,
123132
) -> str | None:
124133
for scheme in _iter_version_schemes(entrypoint, given_value):
125134
result = scheme(version)

src/setuptools_scm/_get_version.py src/setuptools_scm/_get_version_impl.py

+3-7
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def parse_fallback_version(config: Configuration) -> ScmVersion | None:
4646
return _entrypoints.version_from_entrypoint(config, entrypoint, root)
4747

4848

49-
def _do_parse(config: Configuration) -> ScmVersion | None:
49+
def parse_version(config: Configuration) -> ScmVersion | None:
5050
return (
5151
_read_pretended_version_for(config)
5252
or parse_scm_version(config)
@@ -86,14 +86,10 @@ def write_version_files(
8686
def _get_version(
8787
config: Configuration, force_write_version_files: bool = False
8888
) -> str | None:
89-
parsed_version = _do_parse(config)
89+
parsed_version = parse_version(config)
9090
if parsed_version is None:
9191
return None
92-
version_string = _format_version(
93-
parsed_version,
94-
version_scheme=config.version_scheme,
95-
local_scheme=config.local_scheme,
96-
)
92+
version_string = _format_version(parsed_version)
9793
if force_write_version_files:
9894
write_version_files(config, version=version_string, scm_version=parsed_version)
9995

src/setuptools_scm/_integration/setuptools.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def _warn_on_old_setuptools(_version: str = setuptools.__version__) -> None:
4848
def _assign_version(
4949
dist: setuptools.Distribution, config: _config.Configuration
5050
) -> None:
51-
from .._get_version import _get_version, _version_missing
51+
from .._get_version_impl import _get_version, _version_missing
5252

5353
# todo: build time plugin
5454
maybe_version = _get_version(config, force_write_version_files=True)

src/setuptools_scm/version.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -419,19 +419,19 @@ def postrelease_version(version: ScmVersion) -> str:
419419
return version.format_with("{tag}.post{distance}")
420420

421421

422-
def format_version(version: ScmVersion, **config: Any) -> str:
422+
def format_version(version: ScmVersion) -> str:
423423
log.debug("scm version %s", version)
424-
log.debug("config %s", config)
424+
log.debug("config %s", version.config)
425425
if version.preformatted:
426426
assert isinstance(version.tag, str)
427427
return version.tag
428428
main_version = _entrypoints._call_version_scheme(
429-
version, "setuptools_scm.version_scheme", config["version_scheme"], None
429+
version, "setuptools_scm.version_scheme", version.config.version_scheme, None
430430
)
431431
log.debug("version %s", main_version)
432432
assert main_version is not None
433433
local_version = _entrypoints._call_version_scheme(
434-
version, "setuptools_scm.local_scheme", config["local_scheme"], "+unknown"
434+
version, "setuptools_scm.local_scheme", version.config.local_scheme, "+unknown"
435435
)
436436
log.debug("local_version %s", local_version)
437437
return main_version + local_version

testing/test_basic_api.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def assertion(config: Configuration) -> ScmVersion:
5656
assert config.absolute_root == expected_root
5757
return ScmVersion("1.0", config=config)
5858

59-
monkeypatch.setattr(setuptools_scm._get_version, "_do_parse", assertion)
59+
monkeypatch.setattr(setuptools_scm._get_version_impl, "parse_version", assertion)
6060

6161

6262
def test_root_parameter_creation(monkeypatch: pytest.MonkeyPatch) -> None:

testing/test_functions.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,16 @@ def test_next_tag(tag: str, expected: str) -> None:
6262
def test_format_version(
6363
version: str, version_scheme: str, local_scheme: str, expected: str
6464
) -> None:
65+
from dataclasses import replace
66+
6567
scm_version = VERSIONS[version]
66-
assert (
67-
format_version(
68-
scm_version, version_scheme=version_scheme, local_scheme=local_scheme
69-
)
70-
== expected
68+
configured_version = replace(
69+
scm_version,
70+
config=replace(
71+
scm_version.config, version_scheme=version_scheme, local_scheme=local_scheme
72+
),
7173
)
74+
assert format_version(configured_version) == expected
7275

7376

7477
def test_dump_version_doesnt_bail_on_value_error(tmp_path: Path) -> None:

testing/test_git.py

+4-7
Original file line numberDiff line numberDiff line change
@@ -547,15 +547,12 @@ def test_git_getdate_signed_commit(signed_commit_wd: WorkDir) -> None:
547547
)
548548
@pytest.mark.filterwarnings("ignore:git archive did not support describe output")
549549
def test_git_archival_to_version(expected: str, from_data: dict[str, str]) -> None:
550-
config = Configuration()
550+
config = Configuration(
551+
version_scheme="guess-next-dev", local_scheme="node-and-date"
552+
)
551553
version = archival_to_version(from_data, config=config)
552554
assert version is not None
553-
assert (
554-
format_version(
555-
version, version_scheme="guess-next-dev", local_scheme="node-and-date"
556-
)
557-
== expected
558-
)
555+
assert format_version(version) == expected
559556

560557

561558
@pytest.mark.issue("https://github.com/pypa/setuptools_scm/issues/727")

testing/test_mercurial.py

+4-7
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,11 @@ def wd(wd: WorkDir) -> WorkDir:
4343

4444
@pytest.mark.parametrize("expected,data", sorted(archival_mapping.items()))
4545
def test_archival_to_version(expected: str, data: dict[str, str]) -> None:
46-
config = Configuration()
47-
version = archival_to_version(data, config=config)
48-
assert (
49-
format_version(
50-
version, version_scheme="guess-next-dev", local_scheme="node-and-date"
51-
)
52-
== expected
46+
config = Configuration(
47+
version_scheme="guess-next-dev", local_scheme="node-and-date"
5348
)
49+
version = archival_to_version(data, config=config)
50+
assert format_version(version) == expected
5451

5552

5653
def test_hg_gone(wd: WorkDir, monkeypatch: pytest.MonkeyPatch) -> None:

testing/test_version.py

+25-15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
from dataclasses import replace
34
from datetime import date
45
from datetime import timedelta
56
from typing import Any
@@ -209,21 +210,30 @@ def __str__(self) -> str:
209210

210211

211212
def test_format_version_schemes() -> None:
212-
version = meta("1.0", config=c)
213-
format_version(
214-
version,
215-
local_scheme="no-local-version",
216-
version_scheme=[lambda v: None, "guess-next-dev"],
213+
version = meta(
214+
"1.0",
215+
config=replace(
216+
c,
217+
local_scheme="no-local-version",
218+
version_scheme=[ # type: ignore[arg-type]
219+
lambda v: None,
220+
"guess-next-dev",
221+
],
222+
),
217223
)
224+
assert format_version(version) == "1.0"
218225

219226

220227
def test_custom_version_schemes() -> None:
221-
version = meta("1.0", config=c)
222-
custom_computed = format_version(
223-
version,
224-
local_scheme="no-local-version",
225-
version_scheme="setuptools_scm.version:no_guess_dev_version",
228+
version = meta(
229+
"1.0",
230+
config=replace(
231+
c,
232+
local_scheme="no-local-version",
233+
version_scheme="setuptools_scm.version:no_guess_dev_version",
234+
),
226235
)
236+
custom_computed = format_version(version)
227237
assert custom_computed == no_guess_dev_version(version)
228238

229239

@@ -338,12 +348,12 @@ def test_calver_by_date(version: ScmVersion, expected_next: str) -> None:
338348
@pytest.mark.parametrize(
339349
"version, expected_next",
340350
[
341-
pytest.param(meta("1.0.0", config=c), "1.0.0", id="SemVer exact"),
351+
pytest.param(meta("1.0.0", config=c), "1.0.0", id="SemVer exact stays"),
342352
pytest.param(
343-
meta("1.0.0", config=c, dirty=True),
344-
"1.0.0",
345-
id="SemVer dirty",
346-
marks=pytest.mark.xfail,
353+
meta("1.0.0", config=c_non_normalize, dirty=True),
354+
"09.02.13.1.dev0",
355+
id="SemVer dirty is replaced by date",
356+
marks=pytest.mark.filterwarnings("ignore:.*legacy version.*:UserWarning"),
347357
),
348358
],
349359
)

0 commit comments

Comments
 (0)