11from __future__ import annotations
22
3- from contextlib import suppress
3+ from functools import cached_property
44from pathlib import Path
55from typing import TYPE_CHECKING
66
99 from poetry .core .packages .dependency import Dependency
1010
1111
12- # TODO: Convert to dataclass once python 2.7, 3.5 is dropped
1312class 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
0 commit comments