Source code for abstract_api.core.mixins.response_fields_mixin
from typing import Iterable, Optional
from ..exceptions import ClientRequestError
[docs]
class ResponseFieldsMixin:
"""Response fields mixin.
For services that support selecting response fields.
"""
_response_fields: frozenset[str]
def __init__(
self,
*,
response_fields: Optional[Iterable[str]] = None,
**kwargs
) -> None:
"""Initializes a new instance.
Args:
response_fields: Selected response fields.
"""
super().__init__(**kwargs)
if response_fields is not None:
self.response_fields = frozenset(response_fields)
def _validate_response_fields(
self,
response_fields: Iterable[str]
) -> None:
"""Validates whether all the given fields are acceptable.
Args:
response_fields: Selected response fields.
"""
for field in response_fields:
if field not in self.response_fields:
raise ClientRequestError(
f"Field '{field}' is not a valid response field"
)
@property
def response_fields(self) -> frozenset[str]:
"""Gets selected response fields."""
return self._response_fields
@response_fields.setter
def response_fields(self, fields: Iterable[str]) -> None:
"""Sets selected response fields."""
self._validate_response_fields(fields)
self._response_fields = frozenset(fields)
@staticmethod
def _response_fields_as_param(response_fields: Iterable[str]) -> str:
"""Builds 'fields' URL query parameter.
Builds a string that contains selected response fields to be used
as a URL query parameter.
Args:
response_fields: Selected response fields.
Returns:
Comma-separated string with all selected response fields.
"""
return ",".join(response_fields)
def _prepare_selected_fields(
self,
fields: Optional[Iterable[str]] = None
) -> frozenset[str]:
"""Prepares selected fields to be used in service call.
Args:
fields: Selected response fields (optional).
Returns:
Valid selected fields as a frozenset.
"""
if fields:
self._validate_response_fields(fields)
return frozenset(fields)
return self.response_fields