-
Notifications
You must be signed in to change notification settings - Fork 248
/
toml.py
80 lines (61 loc) · 2.25 KB
/
toml.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
from __future__ import annotations
from contextlib import suppress
from typing import TYPE_CHECKING
from typing import Any
from poetry.core.pyproject.tables import BuildSystem
from poetry.core.utils._compat import tomllib
if TYPE_CHECKING:
from pathlib import Path
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:
return self._path
@property
def data(self) -> dict[str, Any]:
if self._data is None:
if not self.path.exists():
self._data = {}
else:
with self.path.open("rb") as f:
self._data = tomllib.load(f)
return self._data
def is_build_system_defined(self) -> bool:
return "build-system" in self.data
@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
@property
def poetry_config(self) -> dict[str, Any]:
try:
tool = self.data["tool"]
assert isinstance(tool, dict)
config = tool["poetry"]
assert isinstance(config, dict)
return config
except KeyError as e:
from poetry.core.pyproject.exceptions import PyProjectException
raise PyProjectException(
f"[tool.poetry] section not found in {self._path.as_posix()}"
) from e
def is_poetry_project(self) -> bool:
from poetry.core.pyproject.exceptions import PyProjectException
if self.path.exists():
with suppress(PyProjectException):
_ = self.poetry_config
return True
return False