Skip to content

Commit fcf7c5e

Browse files
Merge pull request #334 from ionelmc/fix-333
Change fallbacks to use a static root
2 parents d1ac9d1 + 9d3b441 commit fcf7c5e

File tree

8 files changed

+56
-27
lines changed

8 files changed

+56
-27
lines changed

CHANGELOG.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
v3.3.1
2+
======
3+
4+
* fix #333 (regression from #198) - use a specific fallback root when calling fallbacks. Remove old
5+
hack that resets the root when fallback entrypoints are present.
6+
17
v3.3.0
28
======
39

src/setuptools_scm/__init__.py

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,31 @@ def version_from_scm(root):
3131
config = Configuration()
3232
config.root = root
3333
# TODO: Is it API?
34-
return _version_from_entrypoint(config, "setuptools_scm.parse_scm")
34+
return _version_from_entrypoints(config)
3535

3636

37-
def _call_entrypoint_fn(config, fn):
37+
def _call_entrypoint_fn(root, config, fn):
3838
if function_has_arg(fn, "config"):
39-
return fn(config.absolute_root, config=config)
39+
return fn(root, config=config)
4040
else:
4141
warnings.warn(
4242
"parse functions are required to provide a named argument"
4343
" 'config' in the future.",
4444
category=PendingDeprecationWarning,
4545
stacklevel=2,
4646
)
47-
return fn(config.absolute_root)
47+
return fn(root)
4848

4949

50-
def _version_from_entrypoint(config, entrypoint):
51-
for ep in iter_matching_entrypoints(config.absolute_root, entrypoint):
52-
version = _call_entrypoint_fn(config, ep.load())
50+
def _version_from_entrypoints(config, fallback=False):
51+
if fallback:
52+
entrypoint = "setuptools_scm.parse_scm_fallback"
53+
root = config.fallback_root
54+
else:
55+
entrypoint = "setuptools_scm.parse_scm"
56+
root = config.absolute_root
57+
for ep in iter_matching_entrypoints(root, entrypoint):
58+
version = _call_entrypoint_fn(root, config, ep.load())
5359

5460
if version:
5561
return version
@@ -81,20 +87,16 @@ def _do_parse(config):
8187
return meta(tag=pretended, preformatted=True, config=config)
8288

8389
if config.parse:
84-
parse_result = _call_entrypoint_fn(config, config.parse)
90+
parse_result = _call_entrypoint_fn(config.absolute_root, config, config.parse)
8591
if isinstance(parse_result, string_types):
8692
raise TypeError(
8793
"version parse result was a string\nplease return a parsed version"
8894
)
89-
version = parse_result or _version_from_entrypoint(
90-
config, "setuptools_scm.parse_scm_fallback"
91-
)
95+
version = parse_result or _version_from_entrypoints(config, fallback=True)
9296
else:
9397
# include fallbacks after dropping them from the main entrypoint
94-
version = _version_from_entrypoint(
95-
config, "setuptools_scm.parse_scm"
96-
) or _version_from_entrypoint(
97-
config, "setuptools_scm.parse_scm_fallback"
98+
version = _version_from_entrypoints(config) or _version_from_entrypoints(
99+
config, fallback=True
98100
)
99101

100102
if version:
@@ -121,6 +123,7 @@ def get_version(
121123
relative_to=None,
122124
tag_regex=None,
123125
fallback_version=None,
126+
fallback_root=".",
124127
parse=None,
125128
git_describe_command=None,
126129
):
@@ -133,6 +136,7 @@ def get_version(
133136

134137
config = Configuration()
135138
config.root = root
139+
config.fallback_root = fallback_root
136140
config.version_scheme = version_scheme
137141
config.local_scheme = local_scheme
138142
config.write_to = write_to

src/setuptools_scm/config.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,19 @@ def __init__(self, relative_to=None, root="."):
6161
self.write_to = ""
6262
self.write_to_template = None
6363
self.fallback_version = None
64+
self.fallback_root = "."
6465
self.parse = None
6566
self.tag_regex = DEFAULT_TAG_REGEX
6667
self.git_describe_command = None
6768

69+
@property
70+
def fallback_root(self):
71+
return self._fallback_root
72+
73+
@fallback_root.setter
74+
def fallback_root(self, value):
75+
self._fallback_root = os.path.abspath(value)
76+
6877
@property
6978
def absolute_root(self):
7079
return self._absolute_root

src/setuptools_scm/integration.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
from .version import _warn_if_setuptools_outdated
44
from .utils import do
5-
from .discover import iter_matching_entrypoints
65
from . import get_version
76

87

@@ -14,12 +13,7 @@ def version_keyword(dist, keyword, value):
1413
value = {}
1514
if getattr(value, "__call__", None):
1615
value = value()
17-
# this piece of code is a hack to counter the mistake in root finding
18-
matching_fallbacks = iter_matching_entrypoints(
19-
".", "setuptools_scm.parse_scm_fallback"
20-
)
21-
if any(matching_fallbacks):
22-
value.pop("root", None)
16+
2317
dist.metadata.version = get_version(**value)
2418

2519

testing/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def get_version(self, **kw):
6363
__tracebackhide__ = True
6464
from setuptools_scm import get_version
6565

66-
version = get_version(root=str(self.cwd), **kw)
66+
version = get_version(root=str(self.cwd), fallback_root=str(self.cwd), **kw)
6767
print(version)
6868
return version
6969

testing/test_basic_api.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ def test_data_from_mime(tmpdir):
2323
assert res == {"name": "test", "revision": "1"}
2424

2525

26-
def test_version_from_pkginfo(wd):
26+
def test_version_from_pkginfo(wd, monkeypatch):
2727
wd.write("PKG-INFO", "Version: 0.1")
28+
2829
assert wd.version == "0.1"
2930

3031
# replicate issue 167

testing/test_git.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import sys
2+
13
from setuptools_scm import integration
24
from setuptools_scm.utils import do
35
from setuptools_scm import git
@@ -29,6 +31,19 @@ def test_parse_describe_output(given, tag, number, node, dirty):
2931
assert parsed == (tag, number, node, dirty)
3032

3133

34+
def test_root_relative_to(tmpdir, wd, monkeypatch):
35+
monkeypatch.delenv("SETUPTOOLS_SCM_DEBUG")
36+
p = wd.cwd.ensure("sub/package", dir=1)
37+
p.join("setup.py").write(
38+
"""from setuptools import setup
39+
setup(use_scm_version={"root": "../..",
40+
"relative_to": __file__})
41+
"""
42+
)
43+
res = do((sys.executable, "setup.py", "--version"), p)
44+
assert res == "0.1.dev0"
45+
46+
3247
@pytest.mark.issue("https://github.com/pypa/setuptools_scm/issues/298")
3348
def test_file_finder_no_history(wd, caplog):
3449
file_list = git_find_files(str(wd.cwd))

testing/test_regressions.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def test_pkginfo_noscmroot(tmpdir, monkeypatch):
2929

3030
do("git init", p.dirpath())
3131
res = do((sys.executable, "setup.py", "--version"), p)
32-
assert res == "1.0"
32+
assert res == "0.1.dev0"
3333

3434

3535
def test_pip_egg_info(tmpdir, monkeypatch):
@@ -43,10 +43,10 @@ def test_pip_egg_info(tmpdir, monkeypatch):
4343
)
4444

4545
with pytest.raises(LookupError):
46-
get_version(root=p.strpath)
46+
get_version(root=p.strpath, fallback_root=p.strpath)
4747

4848
p.ensure("pip-egg-info/random.egg-info/PKG-INFO").write("Version: 1.0")
49-
assert get_version(root=p.strpath) == "1.0"
49+
assert get_version(root=p.strpath, fallback_root=p.strpath) == "1.0"
5050

5151

5252
@pytest.mark.issue(164)

0 commit comments

Comments
 (0)