lib/metric-config-parser/metric_config_parser/definition.py (32 lines of code) (raw):
from typing import Any, Mapping, Union
import attr
from metric_config_parser.analysis import AnalysisSpec
from metric_config_parser.monitoring import MonitoringSpec
from .alert import AlertsSpec
from .data_source import DataSourcesSpec
from .dimension import DimensionsSpec
from .metric import MetricsSpec
from .parameter import ParameterSpec
from .segment import SegmentsSpec
from .util import converter
@attr.s(auto_attribs=True)
class DefinitionSpec:
"""A representation of a collection of definitions."""
metrics: MetricsSpec = attr.Factory(MetricsSpec)
data_sources: DataSourcesSpec = attr.Factory(DataSourcesSpec)
segments: SegmentsSpec = attr.Factory(SegmentsSpec)
dimensions: DimensionsSpec = attr.Factory(DimensionsSpec)
alerts: AlertsSpec = attr.Factory(AlertsSpec)
parameters: ParameterSpec = attr.Factory(ParameterSpec)
@classmethod
def from_dict(cls, d: Mapping[str, Any]) -> "DefinitionSpec":
return converter.structure(d, cls)
def merge(self, other: "DefinitionSpecSub"):
self.metrics.merge(other.metrics)
self.data_sources.merge(other.data_sources)
if isinstance(other, DefinitionSpec) or isinstance(other, AnalysisSpec):
self.segments.merge(other.segments)
if isinstance(other, DefinitionSpec) or isinstance(other, MonitoringSpec):
self.dimensions.merge(other.dimensions)
if isinstance(other, DefinitionSpec) or isinstance(other, MonitoringSpec):
self.alerts.merge(other.alerts)
DefinitionSpecSub = Union[AnalysisSpec, MonitoringSpec, DefinitionSpec]