diff options
| author | Scott Bahling <sbahling@suse.com> | 2020-02-12 18:38:33 +0100 |
|---|---|---|
| committer | Scott Bahling <sbahling@suse.com> | 2020-02-12 18:38:33 +0100 |
| commit | 7806de5f05bbc153b8405f1e693e1ae202e2a54c (patch) | |
| tree | 44097318002add0f5e076cb057d10e9edca06ba4 /obsapi | |
| parent | 9b0d40c28f86e58df131b7971e2c0640d77a01a1 (diff) | |
| download | obsapi-7806de5f05bbc153b8405f1e693e1ae202e2a54c.tar.gz obsapi-7806de5f05bbc153b8405f1e693e1ae202e2a54c.tar.xz obsapi-7806de5f05bbc153b8405f1e693e1ae202e2a54c.zip | |
Implement sub-api callbackso
When an api object makes an API request to the OBS server, in
addition to returning the results, it sends a reference to
itself to the registered callback function (if set).
We use this to track the last api object called so we can access
the last raw request response.
Diffstat (limited to 'obsapi')
| -rw-r--r-- | obsapi/core.py | 19 | ||||
| -rw-r--r-- | obsapi/httpapi.py | 30 |
2 files changed, 46 insertions, 3 deletions
diff --git a/obsapi/core.py b/obsapi/core.py index c81f699..209aab2 100644 --- a/obsapi/core.py +++ b/obsapi/core.py @@ -8,6 +8,7 @@ from obsapi.sourceapi import ObsSourceApi from obsapi.buildapi import ObsBuildApi from obsapi.repoflags import RepoFlags from obsapi.fileinfo import FileInfo +from .null import Null LSItem = namedtuple('LSItem', 'name md5 size mtime') @@ -34,13 +35,27 @@ class ObsApi(object): def __init__(self, apiurl=None): self.apiurl = apiurl or DEFAULTAPIURL + self.lastapi = Null + self._response = Null + + # init the source api self.source = ObsSourceApi(self.apiurl) - self.build = ObsBuildApi(self.apiurl) self.source.retries = 0 self.source.verify_ssl = True + self.source.set_callback(self._api_callback) + + # init the build api + self.build = ObsBuildApi(self.apiurl) self.build.retries = 0 self.build.verify_ssl = True - self.lastapi = None + self.build.set_callback(self._api_callback) + + def _api_callback(self, api_instance): + self.lastapi = api_instance + + @property + def response(self): + return self.lastapi.response def get_meta(self, prj, pkg=None): return self.source.get_meta(prj, pkg=pkg) diff --git a/obsapi/httpapi.py b/obsapi/httpapi.py index db52050..b73b547 100644 --- a/obsapi/httpapi.py +++ b/obsapi/httpapi.py @@ -2,9 +2,11 @@ # import requests import re +import types +from functools import wraps +from obsapi.null import Null from obsapi.logger import logger from requests.auth import HTTPBasicAuth -from .null import Null try: import osc.conf as osc_conf @@ -33,6 +35,29 @@ class ObsHttpApi(object): self._response = Null() self.retries = 0 self.verify_ssl = True + self._callback_function = None + + def _with_callback(func): + @wraps(func) + def wrapper(inst, *args, **kwargs): + r = func(inst, *args, **kwargs) + inst._do_callback() + return r + return wrapper + + def _do_callback(self): + if self._callback_function is not None: + try: + self._callback_function(self) + except Exception as e: + raise e + + def set_callback(self, func): + if isinstance(func, (types.FunctionType, types.MethodType)): + self._callback_function = func + else: + raise ValueError('Callback expects function or method type, ' + 'got {}'.format(type(func))) @property def __auth(self): @@ -57,6 +82,7 @@ class ObsHttpApi(object): return self._auth[self.apiurl] + @_with_callback def __api_get(self, api, params=None): url = '{0}{1}{2}'.format(self.apiurl, self.rootapi, api) @@ -79,6 +105,7 @@ class ObsHttpApi(object): return r + @_with_callback def __api_put(self, api, data, params=None): url = '{0}{1}{2}'.format(self.apiurl, self.rootapi, api) @@ -91,6 +118,7 @@ class ObsHttpApi(object): return r + @_with_callback def __api_post(self, api, data, params=None): url = '{0}{1}{2}'.format(self.apiurl, self.rootapi, api) |
