Source code for sm_bluesky.common.helper.add_meta
from collections.abc import Callable
from functools import wraps
from typing import Any, TypeVar, cast
from blueapi.core import MsgGenerator
TCallable = TypeVar("TCallable", bound=Callable[..., MsgGenerator])
[docs]
def add_default_metadata(
func: TCallable, extra_metadata: dict[str, Any] | None = None
) -> TCallable:
"""
Decorator to add or update default metadata in the 'md' keyword argument.
If 'md' is not provided, it will be set to extra_metadata.
If 'md' is provided and not None, it will be updated with extra_metadata.
If 'md' is provided and is None, it will be set to extra_metadata.
"""
@wraps(func)
def inner(
*args,
**kwargs,
) -> MsgGenerator:
md = kwargs.get("md")
if extra_metadata:
if md is None:
kwargs["md"] = extra_metadata
elif isinstance(md, dict):
kwargs["md"] = {**md, **extra_metadata}
else:
raise ValueError("md is reserved for meta data.")
elif md is None:
kwargs["md"] = {}
return func(*args, **kwargs)
return cast(TCallable, inner)
def add_extra_names_to_meta(md: dict, key: str, names: list[str]):
if key in md:
md[key] = md[key] + names
return md
md[key] = names
return md