diff --git a/src/poetry/core/pyproject/tables.py b/src/poetry/core/pyproject/tables.py index 99a4c83d5..0de44b9a2 100644 --- a/src/poetry/core/pyproject/tables.py +++ b/src/poetry/core/pyproject/tables.py @@ -1,6 +1,6 @@ from __future__ import annotations -from contextlib import suppress +from functools import cached_property from pathlib import Path from typing import TYPE_CHECKING @@ -9,7 +9,6 @@ from poetry.core.packages.dependency import Dependency -# TODO: Convert to dataclass once python 2.7, 3.5 is dropped class BuildSystem: def __init__( self, build_backend: str | None = None, requires: list[str] | None = None @@ -20,36 +19,31 @@ def __init__( else "setuptools.build_meta:__legacy__" ) self.requires = requires if requires is not None else ["setuptools", "wheel"] - self._dependencies: list[Dependency] | None = None - @property + @cached_property def dependencies(self) -> list[Dependency]: - if self._dependencies is None: - # avoid circular dependency when loading DirectoryDependency - from poetry.core.packages.dependency import Dependency - from poetry.core.packages.directory_dependency import DirectoryDependency - from poetry.core.packages.file_dependency import FileDependency - - self._dependencies = [] - for requirement in self.requires: - dependency = None - try: - dependency = Dependency.create_from_pep_508(requirement) - except ValueError: - # PEP 517 requires can be path if not PEP 508 - path = Path(requirement) - # compatibility Python < 3.8 - # https://docs.python.org/3/library/pathlib.html#methods - with suppress(OSError): - if path.is_file(): - dependency = FileDependency(name=path.name, path=path) - elif path.is_dir(): - dependency = DirectoryDependency(name=path.name, path=path) - - if dependency is None: - # skip since we could not determine requirement - continue - - self._dependencies.append(dependency) - - return self._dependencies + # avoid circular dependency when loading DirectoryDependency + from poetry.core.packages.dependency import Dependency + from poetry.core.packages.directory_dependency import DirectoryDependency + from poetry.core.packages.file_dependency import FileDependency + + dependencies = [] + for requirement in self.requires: + dependency = None + try: + dependency = Dependency.create_from_pep_508(requirement) + except ValueError: + # PEP 517 requires can be path if not PEP 508 + path = Path(requirement) + if path.is_file(): + dependency = FileDependency(name=path.name, path=path) + elif path.is_dir(): + dependency = DirectoryDependency(name=path.name, path=path) + + if dependency is None: + # skip since we could not determine requirement + continue + + dependencies.append(dependency) + + return dependencies diff --git a/src/poetry/core/pyproject/toml.py b/src/poetry/core/pyproject/toml.py index 910186f6b..971e9aa57 100644 --- a/src/poetry/core/pyproject/toml.py +++ b/src/poetry/core/pyproject/toml.py @@ -1,6 +1,7 @@ from __future__ import annotations from contextlib import suppress +from functools import cached_property from typing import TYPE_CHECKING from typing import Any @@ -16,7 +17,6 @@ class PyProjectTOML: def __init__(self, path: Path) -> None: self._path = path self._data: dict[str, Any] | None = None - self._build_system: BuildSystem | None = None @property def path(self) -> Path: @@ -46,23 +46,20 @@ def data(self) -> dict[str, Any]: return self._data - @property + @cached_property def build_system(self) -> BuildSystem: - if self._build_system is None: - build_backend = None - requires = None - - if not self.path.exists(): - build_backend = "poetry.core.masonry.api" - requires = ["poetry-core"] - - container = self.data.get("build-system", {}) - self._build_system = BuildSystem( - build_backend=container.get("build-backend", build_backend), - requires=container.get("requires", requires), - ) - - return self._build_system + build_backend = None + requires = None + + if not self.path.exists(): + build_backend = "poetry.core.masonry.api" + requires = ["poetry-core"] + + container = self.data.get("build-system", {}) + return BuildSystem( + build_backend=container.get("build-backend", build_backend), + requires=container.get("requires", requires), + ) @property def poetry_config(self) -> dict[str, Any]: