GitHub Viewer
"""Resource base classe for the GitCode SDK."""
from functools import cached_property, lru_cache
_UTILITY_METHODS = {"methods", "method_signature"}
_DATA_MODEL_PATH = "gitcode_api._models."
class BaseResource:
"""Resource group base class."""
def __del__(self) -> None:
"""Attempt to clear the lru cache."""
self.method_signature.cache_clear()
@cached_property
def methods(self) -> tuple[str, ...]:
"""Public callable names on this resource group in stable SDK order.
Ordering uses :func:`sorted` with a key derived from each name's
underscore-separated segments (for example two-part names are ordered
as if ``second_first``). This is not plain lexicographic order on the
full method string. Excludes ``methods``, names starting with ``_``,
and non-callables. The result is cached on first access.
:returns: Tuple of method names in that order.
"""
def _is_valid_func(name: str):
return not (name.startswith("_") or name in _UTILITY_METHODS) and callable(getattr(self, name))
def _sort_helper(method_name: str):
name_parts = method_name.split("_")
num_part = len(name_parts)
if num_part == 2:
return f"{name_parts[1]}_{name_parts[0]}"
if num_part == 3:
return f"{{{name_parts[0]}_"
return "_" + method_name
return tuple(
sorted(
(func for func in dir(self) if _is_valid_func(func)),
key=_sort_helper,
)
)
@lru_cache(maxsize=50)
def method_signature(self, method_name: str) -> str:
"""Return signature for a method in this resource group, result is cached.
For example ``client.pulls.method_signature("list_issues")`` would return:
list_issues(*, number: Union[int, str], owner: Optional[str] = None, repo: Optional[str] = None) -> List[Issue]
:param method_name: Attribute name of a callable on this resource.
:returns: Formatted signature.
"""
import inspect
return method_name + str(inspect.signature(getattr(self, method_name))).replace(_DATA_MODEL_PATH, "")