# Module `redvox.api1000.common.typing`

This module contains routines for type checking and inspection.

Expand source code

    """
    This module contains routines for type checking and inspection.
    """

    from typing import Any, List, Optional, Callable, Union

    import numpy as np

    from redvox.api1000 import errors

    def check_type(
        value: Any,
        valid_types: List[Any],
        exception: Optional[Callable[[str], errors.ApiMError]] = None,
        additional_info: Optional[str] = None,
    ) -> None:
        """
        This provides some rudimentary type checking when setting API M data.
        This allows type errors to be a bit more consumable to users compared to errors thrown by the protobuf library. If
        the type check passes, nothing happens. If the type check fails, a customizable runtime exception is raised.
        :param value: The value to check the type of.
        :param valid_types: A list of valid types that the value may be.
        :param exception: An (optional) exception class which works with any exception that accepts a string as a single
                          argument. An ApiMError is raised by default.
        :param additional_info: Additional (optional) information to include in the error message. No additional information
                                is provided by default.
        """

        if value is None and None in valid_types:
            return None

        # It turns out that isinstance(True, int) will return True.... handle edge case first
        # https://stackoverflow.com/questions/37888620/comparing-boolean-and-int-using-isinstance
        if bool not in valid_types and isinstance(value, bool):
            # This is a bool and it shouldn't be, continue to issue logic
            pass
        else:
            if isinstance(value, tuple(valid_types)):
                return None

        # There are type check issues
        type_names: List[str] = list(
            map(lambda _valid_type: f"'{_valid_type.__name__}'", valid_types)
        )
        message: str = (
            f"Expected type(s) {' or '.join(type_names)},"
            f" but found '{type(value).__name__}'."
        )

        if additional_info is not None:
            message += f" ({additional_info})"

        if exception is not None:
            raise exception(message)
        else:
            raise errors.ApiMTypeError(message)

    def none_or_empty(value: Optional[Union[List, str, np.ndarray]]) -> bool:
        """
        Checks if the given value is None or empty.
        :param value: The value to check.
        :return: True if the value is None or empty, False otherwise.
        """
        if value is None:
            return True

        return len(value) == 0

## Functions

`def check_type(value: Any, valid_types: List[Any], exception: Optional[Callable[[str], ApiMError]] = None, additional_info: Optional[str] = None) ‑> None`

  This provides some rudimentary type checking when setting API M data. This allows type errors to be a bit more consumable to users compared to errors thrown by the protobuf library. If the type check passes, nothing happens. If the type check fails, a customizable runtime exception is raised. :param value: The value to check the type of. :param valid_types: A list of valid types that the value may be. :param exception: An (optional) exception class which works with any exception that accepts a string as a single argument. An ApiMError is raised by default. :param additional_info: Additional (optional) information to include in the error message. No additional information is provided by default.

  Expand source code

      def check_type(
          value: Any,
          valid_types: List[Any],
          exception: Optional[Callable[[str], errors.ApiMError]] = None,
          additional_info: Optional[str] = None,
      ) -> None:
          """
          This provides some rudimentary type checking when setting API M data.
          This allows type errors to be a bit more consumable to users compared to errors thrown by the protobuf library. If
          the type check passes, nothing happens. If the type check fails, a customizable runtime exception is raised.
          :param value: The value to check the type of.
          :param valid_types: A list of valid types that the value may be.
          :param exception: An (optional) exception class which works with any exception that accepts a string as a single
                            argument. An ApiMError is raised by default.
          :param additional_info: Additional (optional) information to include in the error message. No additional information
                                  is provided by default.
          """

          if value is None and None in valid_types:
              return None

          # It turns out that isinstance(True, int) will return True.... handle edge case first
          # https://stackoverflow.com/questions/37888620/comparing-boolean-and-int-using-isinstance
          if bool not in valid_types and isinstance(value, bool):
              # This is a bool and it shouldn't be, continue to issue logic
              pass
          else:
              if isinstance(value, tuple(valid_types)):
                  return None

          # There are type check issues
          type_names: List[str] = list(
              map(lambda _valid_type: f"'{_valid_type.__name__}'", valid_types)
          )
          message: str = (
              f"Expected type(s) {' or '.join(type_names)},"
              f" but found '{type(value).__name__}'."
          )

          if additional_info is not None:
              message += f" ({additional_info})"

          if exception is not None:
              raise exception(message)
          else:
              raise errors.ApiMTypeError(message)

`def none_or_empty(value: Union[List, str, numpy.ndarray, ForwardRef(None)]) ‑> bool`

  Checks if the given value is None or empty. :param value: The value to check. :return: True if the value is None or empty, False otherwise.

  Expand source code

      def none_or_empty(value: Optional[Union[List, str, np.ndarray]]) -> bool:
          """
          Checks if the given value is None or empty.
          :param value: The value to check.
          :return: True if the value is None or empty, False otherwise.
          """
          if value is None:
              return True

          return len(value) == 0