Skip to content

Commit e528180

Browse files
committed
Use the aliased environment rather than copying it
Previous behaviour was to copy the aliased environment under the alias. Here, instead, the aliased environment itself gets activated.
1 parent 9ef2f82 commit e528180

File tree

1 file changed

+12
-25
lines changed

1 file changed

+12
-25
lines changed

src/zocalo/configuration/__init__.py

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class Configuration:
7878

7979
def __init__(self, yaml_dict: dict):
8080
self._activated: typing.List[str] = []
81-
self._environments: typing.Dict[str, typing.List[str]] = yaml_dict.get(
81+
self._environments: typing.Dict[str, str | typing.List[str]] = yaml_dict.get(
8282
"environments", {}
8383
)
8484
self._plugin_configurations: typing.Dict[
@@ -127,8 +127,6 @@ def _resolve(self, plugin_configuration: str):
127127

128128
def activate_environment(self, name: str):
129129
"""Load all plugins for a given environment."""
130-
if name not in self._environments:
131-
raise ValueError(f"Environment '{name}' is not defined")
132130
for config_name in self._environments[name]:
133131
logger.debug("Loading plugin configuration %s", config_name)
134132
if isinstance(self._plugin_configurations[config_name], pathlib.Path):
@@ -169,9 +167,19 @@ def activate(
169167
envs = zocalo.configuration.argparse.get_specified_environments(
170168
arguments=self.environment_cmd_args
171169
)
172-
if default and not envs and "default" in self._environments:
170+
if default and not envs:
173171
envs = ["default"]
174172
for environment in envs:
173+
if environment not in self._environments:
174+
raise ValueError(f"Environment '{environment}' is not defined")
175+
env_dict_or_alias = self._environments[environment]
176+
if isinstance(env_dict_or_alias, str) and env_dict_or_alias not in envs:
177+
# Environment is an alias to another environment)
178+
if isinstance(self._environments[env_dict_or_alias], str):
179+
raise ConfigurationError(
180+
f"Invalid YAML configuration: Aliased environment aliases another environment, which is not supported"
181+
)
182+
environment = env_dict_or_alias
175183
self.activate_environment(environment)
176184
return tuple(envs)
177185

@@ -288,27 +296,6 @@ def _read_configuration_yaml(configuration: str) -> dict:
288296
raise ConfigurationError(
289297
f"Invalid YAML configuration: Environment {environment} contains group {group} which is not a string or a list"
290298
)
291-
# Resolve environment aliases
292-
environment_aliases = {
293-
environment
294-
for environment in yaml_dict["environments"]
295-
if isinstance(yaml_dict["environments"][environment], str)
296-
}
297-
while environment_aliases:
298-
for environment in environment_aliases:
299-
aliased_env = yaml_dict["environments"][environment]
300-
if isinstance(yaml_dict["environments"][aliased_env], str):
301-
# This environment links to an alias. Skip for now.
302-
continue
303-
yaml_dict["environments"][environment] = yaml_dict["environments"][
304-
aliased_env
305-
]
306-
environment_aliases.remove(environment)
307-
break
308-
else:
309-
raise ConfigurationError(
310-
f"Invalid YAML configuration: circular environment definitions for {environment_aliases}"
311-
)
312299

313300
plugin_fields: dict[str, mm.fields.Field] = {}
314301
for key in yaml_dict:

0 commit comments

Comments
 (0)