-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpdm_build.py
104 lines (78 loc) · 3.13 KB
/
pdm_build.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# Local copy of mina_build.hooks
# https://github.com/GreyElaina/mina/blob/main/src/mina_backend/hooks.py
from __future__ import annotations
import os
import sys
from pathlib import Path
from typing import Any, Mapping, MutableMapping
from pdm.backend.config import Config
from pdm.backend.hooks import Context
if sys.version_info >= (3, 11):
import tomllib as tomli
else:
from pdm.backend._vendor import tomli
def pdm_build_hook_enabled(context: Context) -> bool:
tool_mina = context.config.data.get("tool", {}).get("mina", {})
return bool(tool_mina.get("enabled"))
def _get_build_target(context: Context) -> str | None:
tool_mina = context.config.data.get("tool", {}).get("mina", {})
return (
context.config_settings.get("mina-target")
or os.environ.get("MINA_BUILD_TARGET")
or tool_mina.get("default-build-target")
)
def _using_override(config: Config, package_conf: dict[str, Any]) -> bool:
if "override" in package_conf:
return package_conf["override"]
return config.data.get("tool", {}).get("mina", {}).get("override-global", False)
def _get_standalone_config(root: Path, pkg: str):
config_file = root / ".mina" / f"{pkg}.toml"
if not config_file.exists():
return
return tomli.loads(config_file.read_text())
def _update_config(config: Config, package: str) -> None:
package_conf = _get_standalone_config(config.root, package)
if package_conf is not None:
package_conf.setdefault("includes", []).append(f".mina/{package}.toml")
else:
package_conf = (
config.data.get("tool", {})
.get("mina", {})
.get("packages", {})
.get(package, None)
)
if package_conf is None:
raise ValueError(f"No package named '{package}'")
package_metadata = package_conf.pop("project", {})
using_override = _using_override(config, package_conf)
build_config = config.build_config
# Override build config
build_config.update(package_conf)
if using_override:
config.data["project"] = package_metadata
else:
deep_merge(config.metadata, package_metadata)
# dependencies are already merged, restore them
config.metadata["dependencies"] = package_metadata.get("dependencies", [])
config.metadata["optional-dependencies"] = package_metadata.get(
"optional-dependencies", {}
)
config.validate()
def deep_merge(source: MutableMapping, target: Mapping) -> Mapping:
for key, value in target.items():
if key in source and isinstance(value, list):
source[key].extend(value)
elif key in source and isinstance(value, dict):
deep_merge(source[key], value)
else:
source[key] = value
return source
def pdm_build_initialize(context: Context) -> None:
if not pdm_build_hook_enabled(context):
return
mina_target = _get_build_target(context)
if mina_target is None:
return
_update_config(context.config, mina_target)
# Disable mina after update
context.config.data.setdefault("tool", {}).setdefault("mina", {})["enabled"] = False