Source code for octomachinery.github.api.utils

"""Utilitary helpers."""

from functools import wraps
from inspect import Parameter, Signature
from types import AsyncGeneratorType
from typing import Any, Dict, Tuple

from gidgethub.sansio import accept_format


[docs]def mark_uninitialized_in_repr(cls): """Patch __repr__ for uninitialized instances.""" orig_repr = cls.__repr__ @wraps(orig_repr) def new_repr(self): if not self.is_initialized: return f'{self.__class__.__name__}(<UNINITIALIZED>)' return orig_repr(self) cls.__repr__ = new_repr return cls
[docs]def accept_preview_version(wrapped_coroutine): """Extend keyword-args with `preview_api_version`.""" @wraps(wrapped_coroutine) def coroutine_wrapper( *args: Tuple[Any], **kwargs: Dict[str, Any], ) -> AsyncGeneratorType: # type: ignore[type-arg] accept_media = kwargs.pop('accept', None) preview_api_version = kwargs.pop('preview_api_version', None) if preview_api_version is not None: accept_media = accept_format( version=f'{preview_api_version}-preview', ) if accept_media is not None: kwargs['accept'] = accept_media coroutine_instance = wrapped_coroutine(*args, **kwargs) is_async_generator = isinstance(coroutine_instance, AsyncGeneratorType) if not is_async_generator: async def async_function_wrapper(): return await coroutine_instance return async_function_wrapper() async def async_generator_wrapper(): async for result_item in coroutine_instance: yield result_item return async_generator_wrapper() original_wrapped_signature = Signature.from_callable(wrapped_coroutine) original_callable_params = original_wrapped_signature.parameters wrapped_callable_params = list(original_callable_params.values()) accept_pos = list(original_callable_params.keys()).index('accept') preview_param = Parameter( name='preview_api_version', annotation='Optional[str]', default=None, kind=Parameter.KEYWORD_ONLY, ) wrapped_callable_params.insert(accept_pos, preview_param) coroutine_wrapper.__signature__ = ( # type: ignore[attr-defined] original_wrapped_signature.replace(parameters=wrapped_callable_params) ) return coroutine_wrapper