in lib/metric-config-parser/metric_config_parser/config.py [0:0]
def merge(self, other: "ConfigCollection"):
"""
Merge this config collection with another.
Configs in `other` will take precedence.
"""
# merge configs
other_configs = {config.slug: config for config in deepcopy(other.configs)}
configs = {config.slug: config for config in deepcopy(self.configs)}
for slug, config in other_configs.items():
if slug not in configs:
configs[slug] = config
else:
configs[slug].spec.merge(config.spec)
self.configs = list(configs.values())
# merge outcomes
outcomes = deepcopy(other.outcomes)
slugs = [outcome.slug for outcome in outcomes]
for outcome in self.outcomes:
if outcome.slug not in slugs:
outcomes.append(outcome)
self.outcomes = outcomes
# merge definitions
other_definitions = {
definition.slug: definition for definition in deepcopy(other.definitions)
}
definitions = {
definition.slug: deepcopy(definition) for definition in deepcopy(self.definitions)
}
for slug, definition in other_definitions.items():
if slug not in definitions:
definitions[slug] = deepcopy(definition)
else:
definitions[slug].spec.merge(definition.spec)
self.definitions = list(definitions.values())
# merge defaults
other_defaults = {default.slug: default for default in deepcopy(other.defaults)}
defaults = {default.slug: default for default in deepcopy(self.defaults)}
for slug, default in other_defaults.items():
if slug not in defaults:
defaults[slug] = deepcopy(default)
else:
defaults[slug].spec.merge(default.spec)
self.defaults = list(defaults.values())
# merge functions
functions = deepcopy(other.functions.functions) if other.functions else {}
slugs = [slug for slug, _ in functions.items()]
for slug, function in self.functions.functions.items() if self.functions else {}:
if slug not in slugs:
functions[slug] = function
if self.functions is None:
self.functions = FunctionsSpec(functions=functions)
else:
self.functions.functions = functions
self.repos += other.repos