SantaSpeen 41d84948d2 v0.11
2022-03-17 21:35:46 +03:00

103 lines
2.9 KiB
Python

"""
Main Gitflic API wrapper.
"""
from .auth import GitflicAuth
from .exceptions import (
NotFound, AccessDenied, GitflicExceptions
)
API_URL = 'https://api.gitflic.ru'
def _fix_none(obj):
if isinstance(obj, tuple) or isinstance(obj, list):
obj = list(obj)
for index, item in enumerate(obj):
if item is None:
obj[index] = ''
elif isinstance(obj, dict):
for k, v in obj.items():
if v is None:
obj[k] = ''
return obj
class Gitflic:
"""
Gitflic API wrapper.
"""
def __init__(self, gf_session: GitflicAuth):
"""
:param gf_session: Authorized session from GitflicAuth.
"""
self.session = gf_session.session
@staticmethod
def _response_handler(response):
"""
Handles HTTP response from Gitflic API.
:param response: HTTP response.
:return: Exception or valid JSON.
"""
code = response.status_code
if code == 200:
return response.json()
url = response.url
if code == 403:
raise AccessDenied(f"Access denied for '{url}'")
elif code == 404:
raise NotFound(f"Location '{url}' not found")
raise GitflicExceptions(f"Gitflic sent unknown error with HTTP code: {code}. Url: {url}. Response: {response.text}")
def call(self, method: str, *args, **kwargs):
"""
Calls API method on server side.
:param method: API method of Gitflic to call.
:return: Exception or valid JSON.
"""
response = self.session.get(API_URL + method, *args, **kwargs)
return self._response_handler(response)
def __reg_call_handler(self, *args, end=None, **kwargs):
if end is None:
end = ""
args: list = _fix_none(args)
kwargs: dict = _fix_none(kwargs)
disable_formatting: bool = kwargs.pop("disable_formatting", False)
method: str = kwargs['__gitflic_method_name__']
# If not need formatting
if not disable_formatting:
if len(args) > 0:
try:
if "%" in method:
method %= tuple(args)
else:
method = method.format(*args)
except Exception as e:
raise GitflicExceptions(f"Formatting error: {e!r}; In call: '{method}; Args: {args}'")
elif len(kwargs) > 0:
if "%" in method:
method %= kwargs
else:
method = method.format_map(kwargs)
method += end
return self.call(method)
def reg_call(self, method_string: str):
func = lambda *args, **kwargs: self.__reg_call_handler(*args, **kwargs, __gitflic_method_name__=method_string)
func.__name__ = method_string
return func