mirror of
https://gitflic.ru/project/santaspeen/gitflic.git
synced 2025-07-01 09:45:24 +00:00
103 lines
2.9 KiB
Python
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
|