lib/metric-config-parser/metric_config_parser/function.py (32 lines of code) (raw):
from functools import partial
from typing import Any, Callable, Dict, Mapping, Optional
import attr
@attr.s(auto_attribs=True)
class Function:
slug: str
definition: Callable
friendly_name: Optional[str] = None
description: Optional[str] = None
@attr.s(auto_attribs=True)
class FunctionsSpec:
functions: Dict[str, Function]
@classmethod
def from_dict(cls, d: Mapping[str, Any]) -> "FunctionsSpec":
return cls(
{
slug: Function(
slug=slug,
definition=(
partial(
lambda select_expr, definition: definition.format(
select_expr=select_expr
),
definition=fun["definition"],
)
),
friendly_name=(fun["friendly_name"] if "friendly_name" in fun else None),
description=fun["description"] if "description" in fun else None,
)
for slug, fun in d["functions"].items()
}
)