Skip to content

Commit 3880ea4

Browse files
committed
Address TODO in pyproject/tables
1 parent a8f7ed9 commit 3880ea4

2 files changed

Lines changed: 41 additions & 50 deletions

File tree

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import annotations
22

3-
from contextlib import suppress
3+
from functools import cached_property
44
from pathlib import Path
55
from typing import TYPE_CHECKING
66

@@ -9,7 +9,6 @@
99
from poetry.core.packages.dependency import Dependency
1010

1111

12-
# TODO: Convert to dataclass once python 2.7, 3.5 is dropped
1312
class BuildSystem:
1413
def __init__(
1514
self, build_backend: str | None = None, requires: list[str] | None = None
@@ -20,36 +19,31 @@ def __init__(
2019
else "setuptools.build_meta:__legacy__"
2120
)
2221
self.requires = requires if requires is not None else ["setuptools", "wheel"]
23-
self._dependencies: list[Dependency] | None = None
2422

25-
@property
23+
@cached_property
2624
def dependencies(self) -> list[Dependency]:
27-
if self._dependencies is None:
28-
# avoid circular dependency when loading DirectoryDependency
29-
from poetry.core.packages.dependency import Dependency
30-
from poetry.core.packages.directory_dependency import DirectoryDependency
31-
from poetry.core.packages.file_dependency import FileDependency
32-
33-
self._dependencies = []
34-
for requirement in self.requires:
35-
dependency = None
36-
try:
37-
dependency = Dependency.create_from_pep_508(requirement)
38-
except ValueError:
39-
# PEP 517 requires can be path if not PEP 508
40-
path = Path(requirement)
41-
# compatibility Python < 3.8
42-
# https://docs.python.org/3/library/pathlib.html#methods
43-
with suppress(OSError):
44-
if path.is_file():
45-
dependency = FileDependency(name=path.name, path=path)
46-
elif path.is_dir():
47-
dependency = DirectoryDependency(name=path.name, path=path)
48-
49-
if dependency is None:
50-
# skip since we could not determine requirement
51-
continue
52-
53-
self._dependencies.append(dependency)
54-
55-
return self._dependencies
25+
# avoid circular dependency when loading DirectoryDependency
26+
from poetry.core.packages.dependency import Dependency
27+
from poetry.core.packages.directory_dependency import DirectoryDependency
28+
from poetry.core.packages.file_dependency import FileDependency
29+
30+
dependencies = []
31+
for requirement in self.requires:
32+
dependency = None
33+
try:
34+
dependency = Dependency.create_from_pep_508(requirement)
35+
except ValueError:
36+
# PEP 517 requires can be path if not PEP 508
37+
path = Path(requirement)
38+
if path.is_file():
39+
dependency = FileDependency(name=path.name, path=path)
40+
elif path.is_dir():
41+
dependency = DirectoryDependency(name=path.name, path=path)
42+
43+
if dependency is None:
44+
# skip since we could not determine requirement
45+
continue
46+
47+
dependencies.append(dependency)
48+
49+
return dependencies

src/poetry/core/pyproject/toml.py

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
from contextlib import suppress
4+
from functools import cached_property
45
from typing import TYPE_CHECKING
56
from typing import Any
67

@@ -16,7 +17,6 @@ class PyProjectTOML:
1617
def __init__(self, path: Path) -> None:
1718
self._path = path
1819
self._data: dict[str, Any] | None = None
19-
self._build_system: BuildSystem | None = None
2020

2121
@property
2222
def path(self) -> Path:
@@ -46,23 +46,20 @@ def data(self) -> dict[str, Any]:
4646

4747
return self._data
4848

49-
@property
49+
@cached_property
5050
def build_system(self) -> BuildSystem:
51-
if self._build_system is None:
52-
build_backend = None
53-
requires = None
54-
55-
if not self.path.exists():
56-
build_backend = "poetry.core.masonry.api"
57-
requires = ["poetry-core"]
58-
59-
container = self.data.get("build-system", {})
60-
self._build_system = BuildSystem(
61-
build_backend=container.get("build-backend", build_backend),
62-
requires=container.get("requires", requires),
63-
)
64-
65-
return self._build_system
51+
build_backend = None
52+
requires = None
53+
54+
if not self.path.exists():
55+
build_backend = "poetry.core.masonry.api"
56+
requires = ["poetry-core"]
57+
58+
container = self.data.get("build-system", {})
59+
return BuildSystem(
60+
build_backend=container.get("build-backend", build_backend),
61+
requires=container.get("requires", requires),
62+
)
6663

6764
@property
6865
def poetry_config(self) -> dict[str, Any]:

0 commit comments

Comments
 (0)