Source code for helium_py.api.decorators

"""helium_py decorators module."""

import datetime as dt
from functools import wraps
from typing import Optional

from .constants import (
    VALID_BUCKETS,
    VALID_HOTSPOT_MODES,
    VALID_TRANSACTION_TYPES,
)


[docs]def time_filterable_api(f): """Decorate Client methods for API endpoints that support time-filtering.""" @wraps(f) def wrapper( obj, *args, params: Optional[dict] = None, min_time: Optional[dt.datetime] = None, max_time: Optional[dt.datetime] = None, **kwargs, ): """Parse params common to API endpoints that allow time querying. Args: params: Params dict pass through for decorators. min_time: The earliest time to return values for. max_time: The latest time to return values for. """ if params is None: params = {} if min_time: params['min_time'] = min_time.isoformat() if max_time: params['max_time'] = max_time.isoformat() return f(obj, *args, params=params if params else None, **kwargs) return wrapper
[docs]def limit_api(f): """Decorate Client methods for API endpoints that support limiting results.""" @wraps(f) def wrapper(obj, *args, params: Optional[dict] = None, limit: Optional[int] = None, **kwargs): """Parse params common to API endpoints that allow limiting results. Args: params: Params dict pass through for decorators. limit: Limit for number of results. """ if params is None: params = {} if limit: params['limit'] = str(limit) return f(obj, *args, params=params if params else None, **kwargs) return wrapper
[docs]def bucket_api(f): """Decorate Client methods for API endpoints that support bucketing results.""" @wraps(f) def wrapper(obj, *args, params: Optional[dict] = None, bucket: Optional[str] = None, **kwargs): """Parse params common to API endpoints that allow bucketing results. Args: params: Params dict pass through for decorators. bucket: Bucket to group results. """ if params is None: params = {} if bucket: if bucket not in VALID_BUCKETS: raise ValueError(f'{bucket} not a valid option in {VALID_BUCKETS}') params['bucket'] = bucket return f(obj, *args, params=params if params else None, **kwargs) return wrapper
[docs]def filter_modes_api(f): """Decorate Client methods for API endpoints that support filtering by hotspot type.""" @wraps(f) def wrapper(obj, *args, params: Optional[dict] = None, filter_modes: Optional[str] = None, **kwargs): """Parse params common to API endpoints that allow filtering by hotspot type. Args: params: Params dict pass through for decorators. filter_modes: The modes (hotspot types) to filter for. """ if params is None: params = {} if filter_modes: if not all([mode in VALID_HOTSPOT_MODES for mode in filter_modes.split(',')]): raise ValueError(f'One or more of {filter_modes} not in {VALID_HOTSPOT_MODES}') params['filter_modes'] = filter_modes return f(obj, *args, params=params if params else None, **kwargs) return wrapper
[docs]def filter_transaction_types_api(f): """Decorate Client methods for API endpoints that support filtering by transaction type.""" @wraps(f) def wrapper(obj, *args, params: Optional[dict] = None, filter_types: Optional[str] = None, **kwargs): """Parse params common to API endpoints that allow filtering by transaction type. Args: params: Params dict pass through for decorators. filter_types: The types of transactions to filter for. """ if params is None: params = {} if filter_types: if not all([mode in VALID_TRANSACTION_TYPES for mode in filter_types.split(',')]): raise ValueError(f'One or more of {filter_types} not in {VALID_TRANSACTION_TYPES}') params['filter_types'] = filter_types return f(obj, *args, params=params if params else None, **kwargs) return wrapper