55
66from __future__ import annotations
77
8+ from collections import ChainMap
89from functools import cached_property
910from pathlib import Path
1011from 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