from typing import Type, Union from google.protobuf.pyext._message import Message from delphi_api.bigtable import BigTableAttribute, ProtoAttribute def apply_dynamic_fields(names: iter, column_family: str, field_class: Union[Type[BigTableAttribute], ProtoAttribute], deserialize_class: Union[Type[Message], Message]) -> callable: """Class decorator. Used for adding (many) protobuf type fields dynamically to a model. Args: names: Field names to add column_family: BigTable column family ID (name) field_class: Class reference for the model column type. Currently only types of :class:`BigTableAttribute` are supported deserialize_class: Class type for the protobuf deserialization Returns: decorated class """ def class_decorator(cls) -> object: for name in names: setattr(cls, name, field_class(column_family=column_family, attr_name=name, deserialize_class=deserialize_class)) return cls return class_decorator