Skip to content

Commit cc6d6de

Browse files
committed
chore: use chainmap in config
1 parent a519671 commit cc6d6de

1 file changed

Lines changed: 13 additions & 18 deletions

File tree

src/pyproject2conda/config.py

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from __future__ import annotations
77

8+
from collections import ChainMap
89
from functools import cached_property
910
from pathlib import Path
1011
from typing import TYPE_CHECKING
@@ -55,7 +56,7 @@ def get_in(self, *keys: str, default: Any = None) -> Any:
5556
return get_in(keys=keys, nested_dict=self.data, default=default)
5657

5758
@cached_property
58-
def overrides(self) -> list[Any]:
59+
def overrides(self) -> list[dict[str, Any]]:
5960
"""All overrides sections from `[[tool.pyproject2conda.overrides]]`"""
6061
out: list[dict[str, Any]] = []
6162
for x in self.get_in("overrides", default=[]):
@@ -70,13 +71,10 @@ def envs(self) -> dict[str, Any]:
7071
"""All environments"""
7172
return self.get_in("envs", default={}) # type: ignore[no-any-return]
7273

73-
def _get_override(self, env: str) -> dict[str, Any]:
74-
out: dict[str, Any] = {}
75-
for override in self.overrides:
76-
if env in override["envs"]:
77-
out.update(**override)
78-
out.pop("envs", None)
79-
return out
74+
def _get_override(self, env: str) -> Iterator[dict[str, Any]]:
75+
return reversed([
76+
override for override in self.overrides if env in override["envs"]
77+
])
8078

8179
def _get_value(
8280
self,
@@ -90,23 +88,20 @@ def _get_value(
9088
value: Any
9189
if env_name is None:
9290
value = self.get_in(key, default=None)
93-
9491
else:
9592
# try to get from env definition
9693
if env_name not in self.data["envs"]:
9794
msg = f"env {env_name} not in config"
9895
raise ValueError(msg)
9996

100-
value = self.get_in("envs", env_name, key, default=None)
101-
10297
if inherit:
103-
# If have override, use it.
104-
if (value_ := self._get_override(env_name).get(key)) is not None:
105-
value = value_
106-
107-
# finally, try to get from top level
108-
if value is None:
109-
value = self.get_in(key, default=None)
98+
value = ChainMap(
99+
*self._get_override(env_name),
100+
self.data["envs"][env_name],
101+
self.data,
102+
).get(key)
103+
else:
104+
value = self.get_in("envs", env_name, key, default=None)
110105

111106
# For case that key contains a dash, also consider the case where
112107
# dashes are underscores

0 commit comments

Comments
 (0)