Source code for ewoksjob.apps.arguments

from typing import Any
from typing import Dict
from typing import Mapping
from typing import Optional


[docs] def merge_execute_arguments( client_execute_arguments: Optional[Dict[str, Any]], worker_execute_arguments: Optional[Dict[str, Any]], ) -> Dict[str, Any]: """Client arguments have precedence over worker arguments in case merging does not apply.""" if client_execute_arguments is None: client_execute_arguments = dict() if worker_execute_arguments is None: worker_execute_arguments = dict() # Handler from the client execinfo = client_execute_arguments.get("execinfo", dict()) handlers = execinfo.pop("handlers", list()) # Handler from the worker execinfo = worker_execute_arguments.get("execinfo", dict()) extra_handlers = execinfo.pop("handlers", list()) for handler in extra_handlers: if handler not in handlers: handlers.append(handler) if handlers: execinfo = client_execute_arguments.setdefault("execinfo", dict()) execinfo["handlers"] = handlers return _merge_mappings(worker_execute_arguments, client_execute_arguments)
def _merge_mappings(d1: Optional[Mapping], d2: Optional[Mapping]) -> dict: """`d2` has precedence over `d1` in case merging does not apply. Merging is done like `{**d1, **d2}` but then recursive. """ if d1 is None: merged = dict() else: merged = dict(d1) if not d2: return merged for key, value2 in d2.items(): value1 = merged.get(key) if isinstance(value1, Mapping) and isinstance(value2, Mapping): value2 = _merge_mappings(value1, value2) merged[key] = value2 return merged