From 7806de5f05bbc153b8405f1e693e1ae202e2a54c Mon Sep 17 00:00:00 2001 From: Scott Bahling Date: Wed, 12 Feb 2020 18:38:33 +0100 Subject: 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. --- obsapi/httpapi.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (limited to 'obsapi/httpapi.py') 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) -- cgit v1.2.3