66 lines
1.7 KiB
Python
66 lines
1.7 KiB
Python
|
from typing import Any
|
||
|
from dataclasses import dataclass, field
|
||
|
|
||
|
import requests
|
||
|
from requests import Request, Session
|
||
|
from requests.exceptions import HTTPError
|
||
|
|
||
|
from flask import abort
|
||
|
|
||
|
@dataclass
|
||
|
class WebgitClient:
|
||
|
"""
|
||
|
A quite thin wrapper around various code forges' REST APIs.
|
||
|
Designed to be subclassed.
|
||
|
"""
|
||
|
api_token: str
|
||
|
headers: Any = field(init=False)
|
||
|
|
||
|
def _post_request(self, request_obj):
|
||
|
try:
|
||
|
request_obj.raise_for_status()
|
||
|
except HTTPError as e:
|
||
|
print("An exception occured: {}({})".format(
|
||
|
type(e).__name__, e
|
||
|
))
|
||
|
abort(500)
|
||
|
|
||
|
def _request_wrapper(self, method, *args, **kwargs):
|
||
|
s = Session()
|
||
|
r = Request(method, *args, **kwargs, headers=self.headers)
|
||
|
prepped = s.prepare_request(r)
|
||
|
settings = s.merge_environment_settings(prepped.url, {}, None, None, None)
|
||
|
r = s.send(prepped, **settings)
|
||
|
|
||
|
self._post_request(r)
|
||
|
return r
|
||
|
|
||
|
|
||
|
def post(self, *args, **kwargs):
|
||
|
return self._request_wrapper("POST", *args, **kwargs)
|
||
|
|
||
|
def patch(self, *args, **kwargs):
|
||
|
return self._request_wrapper("PATCH", *args, **kwargs)
|
||
|
|
||
|
@dataclass
|
||
|
class Github(WebgitClient):
|
||
|
"""
|
||
|
A quite thin wrapper around Github's REST API.
|
||
|
"""
|
||
|
def __post_init__(self):
|
||
|
self.headers = {
|
||
|
"Accept": "application/vnd.github+json",
|
||
|
"Authorization": "token " + self.api_token,
|
||
|
"X-GitHub-Api-Version": "2022-11-28",
|
||
|
}
|
||
|
|
||
|
@dataclass
|
||
|
class Gitea(WebgitClient):
|
||
|
"""
|
||
|
A quite thin wrapper around Gitea's REST API.
|
||
|
"""
|
||
|
def __post_init__(self):
|
||
|
self.headers = {
|
||
|
"Authorization": "token " + self.api_token,
|
||
|
}
|