Skip to content

Commit 812524e

Browse files
committed
info: enable PEP 517 fallback builds by default
This change ensures that PEP 517 fallback builds are enabled by default for when metadata inspection and setup.{py,cfg} parsing fails. This is required in order to ensure that package requirements are correctly identified for packages beyond first level dependencies. Resolves: #2807
1 parent e0b00a4 commit 812524e

File tree

4 files changed

+28
-20
lines changed

4 files changed

+28
-20
lines changed

poetry/inspection/info.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -488,15 +488,16 @@ def _pep517_metadata(cls, path): # type (Path) -> PackageInfo
488488

489489
@classmethod
490490
def from_directory(
491-
cls, path, allow_build=False
491+
cls, path, disable_build=False
492492
): # type: (Path, bool) -> PackageInfo
493493
"""
494-
Generate package information from a package source directory. When `allow_build` is enabled and
494+
Generate package information from a package source directory. If `disable_build` is not `True` and
495495
introspection of all available metadata fails, the package is attempted to be build in an isolated
496496
environment so as to generate required metadata.
497497
498498
:param path: Path to generate package information from.
499-
:param allow_build: If enabled, as a fallback, build the project to gather metadata.
499+
:param disable_build: If not `True` and setup reader fails, PEP 517 isolated build is attempted in
500+
order to gather metadata.
500501
"""
501502
project_package = cls._get_poetry_package(path)
502503
if project_package:
@@ -509,7 +510,7 @@ def from_directory(
509510
return info
510511

511512
try:
512-
if not allow_build:
513+
if disable_build:
513514
return cls.from_setup_files(path)
514515
return cls._pep517_metadata(path)
515516
except PackageInfoError as e:

poetry/puzzle/provider.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -308,9 +308,9 @@ def search_for_directory(
308308
def get_package_from_directory(
309309
cls, directory, name=None
310310
): # type: (Path, Optional[str]) -> Package
311-
package = PackageInfo.from_directory(
312-
path=directory, allow_build=True
313-
).to_package(root_dir=directory)
311+
package = PackageInfo.from_directory(path=directory).to_package(
312+
root_dir=directory
313+
)
314314

315315
if name and name != package.name:
316316
# For now, the dependency's name must match the actual package's name

tests/conftest.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from poetry.config.config import Config as BaseConfig
1212
from poetry.config.dict_config_source import DictConfigSource
1313
from poetry.inspection.info import PackageInfo
14+
from poetry.inspection.info import PackageInfoError
1415
from poetry.utils._compat import Path
1516
from poetry.utils.env import EnvManager
1617
from poetry.utils.env import VirtualEnv
@@ -81,9 +82,15 @@ def download_mock(mocker):
8182

8283
@pytest.fixture(autouse=True)
8384
def pep517_metadata_mock(mocker):
85+
def _pep517_metadata(path):
86+
try:
87+
return PackageInfo.from_setup_files(path)
88+
except PackageInfoError:
89+
pass
90+
return PackageInfo(name="demo", version="0.1.2")
91+
8492
mocker.patch(
85-
"poetry.inspection.info.PackageInfo._pep517_metadata",
86-
return_value=PackageInfo(name="demo", version="0.1.2"),
93+
"poetry.inspection.info.PackageInfo._pep517_metadata", _pep517_metadata,
8794
)
8895

8996

tests/inspection/test_info.py

+11-11
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,9 @@ def test_info_from_bdist(demo_wheel):
121121

122122

123123
def test_info_from_poetry_directory():
124-
info = PackageInfo.from_directory(FIXTURE_DIR_INSPECTIONS / "demo")
124+
info = PackageInfo.from_directory(
125+
FIXTURE_DIR_INSPECTIONS / "demo", disable_build=True
126+
)
125127
demo_check_info(info)
126128

127129

@@ -146,7 +148,7 @@ def test_info_from_setup_cfg(demo_setup_cfg):
146148

147149
def test_info_no_setup_pkg_info_no_deps():
148150
info = PackageInfo.from_directory(
149-
FIXTURE_DIR_INSPECTIONS / "demo_no_setup_pkg_info_no_deps"
151+
FIXTURE_DIR_INSPECTIONS / "demo_no_setup_pkg_info_no_deps", disable_build=True,
150152
)
151153
assert info.name == "demo"
152154
assert info.version == "0.1.0"
@@ -156,7 +158,7 @@ def test_info_no_setup_pkg_info_no_deps():
156158
@pytest.mark.skipif(not PY35, reason="Parsing of setup.py is skipped for Python < 3.5")
157159
def test_info_setup_simple(mocker, demo_setup):
158160
spy = mocker.spy(VirtualEnv, "run")
159-
info = PackageInfo.from_directory(demo_setup, allow_build=True)
161+
info = PackageInfo.from_directory(demo_setup)
160162
assert spy.call_count == 0
161163
demo_check_info(info, requires_dist={"package"})
162164

@@ -167,21 +169,21 @@ def test_info_setup_simple(mocker, demo_setup):
167169
)
168170
def test_info_setup_simple_py2(mocker, demo_setup):
169171
spy = mocker.spy(VirtualEnv, "run")
170-
info = PackageInfo.from_directory(demo_setup, allow_build=True)
172+
info = PackageInfo.from_directory(demo_setup)
171173
assert spy.call_count == 2
172174
demo_check_info(info, requires_dist={"package"})
173175

174176

175177
@pytest.mark.skipif(not PY35, reason="Parsing of setup.cfg is skipped for Python < 3.5")
176178
def test_info_setup_cfg(mocker, demo_setup_cfg):
177179
spy = mocker.spy(VirtualEnv, "run")
178-
info = PackageInfo.from_directory(demo_setup_cfg, allow_build=True)
180+
info = PackageInfo.from_directory(demo_setup_cfg)
179181
assert spy.call_count == 0
180182
demo_check_info(info, requires_dist={"package"})
181183

182184

183185
def test_info_setup_complex(demo_setup_complex):
184-
info = PackageInfo.from_directory(demo_setup_complex, allow_build=True)
186+
info = PackageInfo.from_directory(demo_setup_complex)
185187
demo_check_info(info, requires_dist={"package"})
186188

187189

@@ -193,20 +195,18 @@ def test_info_setup_complex_pep517_error(mocker, demo_setup_complex):
193195
)
194196

195197
with pytest.raises(PackageInfoError):
196-
PackageInfo.from_directory(demo_setup_complex, allow_build=True)
198+
PackageInfo.from_directory(demo_setup_complex)
197199

198200

199201
def test_info_setup_complex_pep517_legacy(demo_setup_complex_pep517_legacy):
200-
info = PackageInfo.from_directory(
201-
demo_setup_complex_pep517_legacy, allow_build=True
202-
)
202+
info = PackageInfo.from_directory(demo_setup_complex_pep517_legacy)
203203
demo_check_info(info, requires_dist={"package"})
204204

205205

206206
@pytest.mark.skipif(not PY35, reason="Parsing of setup.py is skipped for Python < 3.5")
207207
def test_info_setup_complex_disable_build(mocker, demo_setup_complex):
208208
spy = mocker.spy(VirtualEnv, "run")
209-
info = PackageInfo.from_directory(demo_setup_complex, allow_build=False)
209+
info = PackageInfo.from_directory(demo_setup_complex, disable_build=True)
210210
assert spy.call_count == 0
211211
assert info.name == "demo"
212212
assert info.version == "0.1.0"

0 commit comments

Comments
 (0)