Source code for aries_cloudagent.indy.models.predicate

"""Utilities for dealing with predicates."""

from collections import namedtuple
from enum import Enum
from typing import Any


Relation = namedtuple("Relation", "fortran wql math yes no")


[docs]class Predicate(Enum): """Enum for predicate types that indy-sdk supports.""" LT = Relation( "LT", "$lt", "<", lambda x, y: Predicate.to_int(x) < Predicate.to_int(y), lambda x, y: Predicate.to_int(x) >= Predicate.to_int(y), ) LE = Relation( "LE", "$lte", "<=", lambda x, y: Predicate.to_int(x) <= Predicate.to_int(y), lambda x, y: Predicate.to_int(x) > Predicate.to_int(y), ) GE = Relation( "GE", "$gte", ">=", lambda x, y: Predicate.to_int(x) >= Predicate.to_int(y), lambda x, y: Predicate.to_int(x) < Predicate.to_int(y), ) GT = Relation( "GT", "$gt", ">", lambda x, y: Predicate.to_int(x) > Predicate.to_int(y), lambda x, y: Predicate.to_int(x) <= Predicate.to_int(y), ) @property def fortran(self) -> str: """Fortran nomenclature.""" return self.value.fortran @property def wql(self) -> str: """WQL nomenclature.""" return self.value.wql @property def math(self) -> str: """Mathematical nomenclature.""" return self.value.math
[docs] @staticmethod def get(relation: str) -> "Predicate": """Return enum instance corresponding to input relation string.""" for pred in Predicate: if relation.upper() in ( pred.value.fortran, pred.value.wql.upper(), pred.value.math, ): return pred return None
[docs] @staticmethod def to_int(value: Any) -> int: """Cast a value as its equivalent int for indy predicate argument. Raise ValueError for any input but int, stringified int, or boolean. Args: value: value to coerce """ if isinstance(value, (bool, int)): return int(value) return int(str(value)) # kick out floats