# Module `redvox.api1000.common.generic`

This module contains classes and function that make use of generics. As of April 2020, IntelliJ still does not parse generics correctly and cause errors to appear where there are none. However, generics can still be statically checked by mypy, and unless we decide to remove generics, we will place them here.

Expand source code

    """
    This module contains classes and function that make use of generics. As of April 2020, IntelliJ still does not parse
    generics correctly and cause errors to appear where there are none. However, generics can still be statically checked by
    mypy, and unless we decide to remove generics, we will place them here.
    """

    from typing import Generic, Callable, List, Dict, TypeVar

    from google.protobuf.json_format import MessageToJson, MessageToDict

    from redvox.api1000.common.metadata import Metadata
    from redvox.api1000.common.lz4 import compress

    # pylint: disable=C0103
    T = TypeVar("T")  # Type parameter for transformed wrapper type
    # pylint: disable=C0103
    P = TypeVar("P")  # Type parameter for protobuf type

    class ProtoRepeatedMessage(Generic[P, T]):
        """
        Encapsulates protobuf repeated fields while transforming values between protobuf and wrapper types.
        """

        def __init__(
            self,
            parent_proto,
            repeated_field_proto,
            repeated_field_name: str,
            from_proto: Callable[[P], T],
            to_proto: Callable[[T], P],
        ):
            """
            :param parent_proto: A reference to this message's parent protobuf
            :param repeated_field_proto: A reference to the repeated field protobuf
            :param repeated_field_name: The name of the repeated protobuf field
            :param from_proto: A function that converts a repeated protobuf value into its wrapper equivelent
            :param to_proto: A function that converts a repeated wrapper value into its protobuf equivelent
            """
            self._parent_proto = parent_proto
            self._repeated_field_proto = repeated_field_proto
            self._repeated_field_name = repeated_field_name
            self._from_proto: Callable[[P], T] = from_proto
            self._to_proto: Callable[[T], P] = to_proto

        def get_count(self) -> int:
            """
            Returns the number of items in this repeated collection.
            :return: The number of items in this repeated collection.
            """
            return len(self._repeated_field_proto)

        def get_values(self) -> List[T]:
            """
            Returns a list of wrapped items stored in this collection.
            :return: A list of wrapped items stored in this collection.
            """
            return list(map(self._from_proto, self._repeated_field_proto))

        def set_values(self, values: List[T]) -> "ProtoRepeatedMessage[P, T]":
            """
            Sets the contents of this collection to the passed in values. The wrapped values are automatically converted
            into protobuf messages.
            :param values: The wrapped values to set.
            :return: This instance of ProtoRepeatedMessage.
            """
            return self.clear_values().append_values(values)

        def append_values(self, values: List[T]) -> "ProtoRepeatedMessage[P, T]":
            """
            Appends the given values to the collection, automatically converting them into protobuf messages.
            :param values: The wrapped values to append.
            :return: This instance of ProtoRepeatedMessage.
            """
            self._repeated_field_proto.extend(list(map(self._to_proto, values)))
            return self

        def clear_values(self) -> "ProtoRepeatedMessage[P, T]":
            """
            Clears all values in this collection.
            :return: This instance of ProtoRepeatedMessage.
            """
            # self._parent_proto.ClearField(self._repeated_field_name)
            del self._repeated_field_proto[:]
            return self

        def __str__(self):
            return str(self._repeated_field_proto)

        def __repr__(self):
            return str(self)

    class ProtoBase(Generic[P]):
        """
        This class represents common routines between all sub-messages in API M.
        """

        def __init__(self, proto: P):
            self._proto: P = proto
            self._metadata: Metadata = Metadata(self._proto.metadata)

        def get_proto(self) -> P:
            """
            Return the backing protobuf for this class.
            :return: The backing protobuf for this class.
            """
            return self._proto

        def get_metadata(self) -> Metadata:
            """
            Returns the associated Metadata instance.
            :return: The associated Metadata instance.
            """
            return self._metadata

        def as_json(self) -> str:
            """
            Serializes and returns the backing protobuf as JSON.
            :return: The backing protobuf as JSON.
            """
            return MessageToJson(self._proto, True)

        def as_dict(self) -> Dict:
            """
            Serializes and returns the backing protobuf as a Python dictionary.
            :return: The backing protobuf as a Python dictionary.
            """
            return MessageToDict(self._proto, True)

        def as_bytes(self) -> bytes:
            """
            Serializes and returns the backing protobuf as bytes.
            :return: The backing protobuf as bytes.
            """
            return self._proto.SerializeToString()

        def as_compressed_bytes(self) -> bytes:
            """
            Serializes and returns the backing protobuf as compressed bytes.
            :return: The backing protobuf as compressed bytes.
            """
            data: bytes = self.as_bytes()
            return compress(data)

        def __str__(self):
            """
            Return the JSON representation of the backing protobuf,
            :return: The JSON representation of the backing protobuf.
            """
            return self.as_json()

## Classes

`class ProtoBase (proto: ~P)`

  This class represents common routines between all sub-messages in API M.

  Expand source code

      class ProtoBase(Generic[P]):
          """
          This class represents common routines between all sub-messages in API M.
          """

          def __init__(self, proto: P):
              self._proto: P = proto
              self._metadata: Metadata = Metadata(self._proto.metadata)

          def get_proto(self) -> P:
              """
              Return the backing protobuf for this class.
              :return: The backing protobuf for this class.
              """
              return self._proto

          def get_metadata(self) -> Metadata:
              """
              Returns the associated Metadata instance.
              :return: The associated Metadata instance.
              """
              return self._metadata

          def as_json(self) -> str:
              """
              Serializes and returns the backing protobuf as JSON.
              :return: The backing protobuf as JSON.
              """
              return MessageToJson(self._proto, True)

          def as_dict(self) -> Dict:
              """
              Serializes and returns the backing protobuf as a Python dictionary.
              :return: The backing protobuf as a Python dictionary.
              """
              return MessageToDict(self._proto, True)

          def as_bytes(self) -> bytes:
              """
              Serializes and returns the backing protobuf as bytes.
              :return: The backing protobuf as bytes.
              """
              return self._proto.SerializeToString()

          def as_compressed_bytes(self) -> bytes:
              """
              Serializes and returns the backing protobuf as compressed bytes.
              :return: The backing protobuf as compressed bytes.
              """
              data: bytes = self.as_bytes()
              return compress(data)

          def __str__(self):
              """
              Return the JSON representation of the backing protobuf,
              :return: The JSON representation of the backing protobuf.
              """
              return self.as_json()

  ### Ancestors

  - typing.Generic

  ### Subclasses

  - SamplePayload
  - SummaryStatistics
  - TimingPayload
  - Event
  - EventStream
  - Audio
  - CompressedAudio
  - Image
  - BestLocation
  - BestTimestamp
  - Location
  - Sensors
  - Single
  - Xyz
  - AppSettings
  - ServiceUrls
  - StationInformation
  - StationMetrics
  - SynchExchange
  - TimingInformation
  - WrappedRedvoxPacketM

  ### Methods

  `def as_bytes(self) ‑> bytes`

    Serializes and returns the backing protobuf as bytes. :return: The backing protobuf as bytes.

    Expand source code

        def as_bytes(self) -> bytes:
            """
            Serializes and returns the backing protobuf as bytes.
            :return: The backing protobuf as bytes.
            """
            return self._proto.SerializeToString()

  `def as_compressed_bytes(self) ‑> bytes`

    Serializes and returns the backing protobuf as compressed bytes. :return: The backing protobuf as compressed bytes.

    Expand source code

        def as_compressed_bytes(self) -> bytes:
            """
            Serializes and returns the backing protobuf as compressed bytes.
            :return: The backing protobuf as compressed bytes.
            """
            data: bytes = self.as_bytes()
            return compress(data)

  `def as_dict(self) ‑> Dict`

    Serializes and returns the backing protobuf as a Python dictionary. :return: The backing protobuf as a Python dictionary.

    Expand source code

        def as_dict(self) -> Dict:
            """
            Serializes and returns the backing protobuf as a Python dictionary.
            :return: The backing protobuf as a Python dictionary.
            """
            return MessageToDict(self._proto, True)

  `def as_json(self) ‑> str`

    Serializes and returns the backing protobuf as JSON. :return: The backing protobuf as JSON.

    Expand source code

        def as_json(self) -> str:
            """
            Serializes and returns the backing protobuf as JSON.
            :return: The backing protobuf as JSON.
            """
            return MessageToJson(self._proto, True)

  `def get_metadata(self) ‑> Metadata`

    Returns the associated Metadata instance. :return: The associated Metadata instance.

    Expand source code

        def get_metadata(self) -> Metadata:
            """
            Returns the associated Metadata instance.
            :return: The associated Metadata instance.
            """
            return self._metadata

  `def get_proto(self) ‑> ~P`

    Return the backing protobuf for this class. :return: The backing protobuf for this class.

    Expand source code

        def get_proto(self) -> P:
            """
            Return the backing protobuf for this class.
            :return: The backing protobuf for this class.
            """
            return self._proto

`class ProtoRepeatedMessage (parent_proto, repeated_field_proto, repeated_field_name: str, from_proto: Callable[[~P], ~T], to_proto: Callable[[~T], ~P])`

  Encapsulates protobuf repeated fields while transforming values between protobuf and wrapper types.

  :param parent_proto: A reference to this message's parent protobuf :param repeated_field_proto: A reference to the repeated field protobuf :param repeated_field_name: The name of the repeated protobuf field :param from_proto: A function that converts a repeated protobuf value into its wrapper equivelent :param to_proto: A function that converts a repeated wrapper value into its protobuf equivelent

  Expand source code

      class ProtoRepeatedMessage(Generic[P, T]):
          """
          Encapsulates protobuf repeated fields while transforming values between protobuf and wrapper types.
          """

          def __init__(
              self,
              parent_proto,
              repeated_field_proto,
              repeated_field_name: str,
              from_proto: Callable[[P], T],
              to_proto: Callable[[T], P],
          ):
              """
              :param parent_proto: A reference to this message's parent protobuf
              :param repeated_field_proto: A reference to the repeated field protobuf
              :param repeated_field_name: The name of the repeated protobuf field
              :param from_proto: A function that converts a repeated protobuf value into its wrapper equivelent
              :param to_proto: A function that converts a repeated wrapper value into its protobuf equivelent
              """
              self._parent_proto = parent_proto
              self._repeated_field_proto = repeated_field_proto
              self._repeated_field_name = repeated_field_name
              self._from_proto: Callable[[P], T] = from_proto
              self._to_proto: Callable[[T], P] = to_proto

          def get_count(self) -> int:
              """
              Returns the number of items in this repeated collection.
              :return: The number of items in this repeated collection.
              """
              return len(self._repeated_field_proto)

          def get_values(self) -> List[T]:
              """
              Returns a list of wrapped items stored in this collection.
              :return: A list of wrapped items stored in this collection.
              """
              return list(map(self._from_proto, self._repeated_field_proto))

          def set_values(self, values: List[T]) -> "ProtoRepeatedMessage[P, T]":
              """
              Sets the contents of this collection to the passed in values. The wrapped values are automatically converted
              into protobuf messages.
              :param values: The wrapped values to set.
              :return: This instance of ProtoRepeatedMessage.
              """
              return self.clear_values().append_values(values)

          def append_values(self, values: List[T]) -> "ProtoRepeatedMessage[P, T]":
              """
              Appends the given values to the collection, automatically converting them into protobuf messages.
              :param values: The wrapped values to append.
              :return: This instance of ProtoRepeatedMessage.
              """
              self._repeated_field_proto.extend(list(map(self._to_proto, values)))
              return self

          def clear_values(self) -> "ProtoRepeatedMessage[P, T]":
              """
              Clears all values in this collection.
              :return: This instance of ProtoRepeatedMessage.
              """
              # self._parent_proto.ClearField(self._repeated_field_name)
              del self._repeated_field_proto[:]
              return self

          def __str__(self):
              return str(self._repeated_field_proto)

          def __repr__(self):
              return str(self)

  ### Ancestors

  - typing.Generic

  ### Methods

  `def append_values(self, values: List[~T]) ‑> ProtoRepeatedMessage[~P, ~T]`

    Appends the given values to the collection, automatically converting them into protobuf messages. :param values: The wrapped values to append. :return: This instance of ProtoRepeatedMessage.

    Expand source code

        def append_values(self, values: List[T]) -> "ProtoRepeatedMessage[P, T]":
            """
            Appends the given values to the collection, automatically converting them into protobuf messages.
            :param values: The wrapped values to append.
            :return: This instance of ProtoRepeatedMessage.
            """
            self._repeated_field_proto.extend(list(map(self._to_proto, values)))
            return self

  `def clear_values(self) ‑> ProtoRepeatedMessage[~P, ~T]`

    Clears all values in this collection. :return: This instance of ProtoRepeatedMessage.

    Expand source code

        def clear_values(self) -> "ProtoRepeatedMessage[P, T]":
            """
            Clears all values in this collection.
            :return: This instance of ProtoRepeatedMessage.
            """
            # self._parent_proto.ClearField(self._repeated_field_name)
            del self._repeated_field_proto[:]
            return self

  `def get_count(self) ‑> int`

    Returns the number of items in this repeated collection. :return: The number of items in this repeated collection.

    Expand source code

        def get_count(self) -> int:
            """
            Returns the number of items in this repeated collection.
            :return: The number of items in this repeated collection.
            """
            return len(self._repeated_field_proto)

  `def get_values(self) ‑> List[~T]`

    Returns a list of wrapped items stored in this collection. :return: A list of wrapped items stored in this collection.

    Expand source code

        def get_values(self) -> List[T]:
            """
            Returns a list of wrapped items stored in this collection.
            :return: A list of wrapped items stored in this collection.
            """
            return list(map(self._from_proto, self._repeated_field_proto))

  `def set_values(self, values: List[~T]) ‑> ProtoRepeatedMessage[~P, ~T]`

    Sets the contents of this collection to the passed in values. The wrapped values are automatically converted into protobuf messages. :param values: The wrapped values to set. :return: This instance of ProtoRepeatedMessage.

    Expand source code

        def set_values(self, values: List[T]) -> "ProtoRepeatedMessage[P, T]":
            """
            Sets the contents of this collection to the passed in values. The wrapped values are automatically converted
            into protobuf messages.
            :param values: The wrapped values to set.
            :return: This instance of ProtoRepeatedMessage.
            """
            return self.clear_values().append_values(values)