From 5d1583fe035c8e646ab6beba2fde0b3bb5f87c12 Mon Sep 17 00:00:00 2001 From: Scott Bahling Date: Sun, 19 Apr 2015 12:30:50 +0200 Subject: Add ObsApi.get_xml() method get_xml will attempt to retrieve the xml response from the obs api. If response failes, a dummy, blank xml file will be returned. This makes the helper functions more robust against api connection errors. If query failes, empty data will be simply be returned to the client. The client is responsible for any response error checking. The 'response' property is added to the ObsApi. This holds the full requests response from the last api query. The client can check this property to test for query success when required. --- obsapi/core.py | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) (limited to 'obsapi/core.py') diff --git a/obsapi/core.py b/obsapi/core.py index 31782d9..a489b8e 100644 --- a/obsapi/core.py +++ b/obsapi/core.py @@ -126,9 +126,12 @@ class FileInfo(object): class ObsApi(object): + default_xml = '' + def __init__(self, apiurl=None): self.apiurl = apiurl or DEFAULTAPIURL self.__get_auth() + self._response = None def __get_auth(self): if osc_conf: @@ -147,13 +150,24 @@ class ObsApi(object): def __api_get(self, api, payload=None): url = '{0}/{1}'.format(self.apiurl, api) r = requests.get(url, auth=self.auth, params=payload) + self._response = r return r + @property + def response(self): + return self._response + + def get_xml(self, api, payload=None): + r = self.__api_get(api, payload) + if not r.status_code == requests.codes.ok: + return self.default_xml + + return r.text + def get_package_meta(self, prj, pkg): api = '/source/{}/{}/_meta'.format(prj, pkg) - r = self.__api_get(api) - return r.text + return self.get_xml(api) def ls(self, prj=None, pkg=None): if prj and pkg: @@ -165,16 +179,16 @@ class ObsApi(object): def project_ls(self, prj): api = '/source/{}'.format(prj) - r = self.__api_get(api) - d = etree.fromstring(r.text) + xml = self.get_xml(api) + d = etree.fromstring(xml) lsitems = [e.get('name') for e in d.findall('entry')] return lsitems def package_ls(self, prj, pkg): api = '/source/{}/{}'.format(prj, pkg) - r = self.__api_get(api) - d = etree.fromstring(r.text) + xml = self.get_xml(api) + d = etree.fromstring(xml) directory = Directory(d.get('name'), d.get('rev'), d.get('vrev'), @@ -192,8 +206,8 @@ class ObsApi(object): def get_binaries(self, prj, pkg, repo, arch): api = '/build/{}/{}/{}/{}'.format(prj, repo, arch, pkg) - r = self.__api_get(api) - blist = etree.fromstring(r.text) + xml = self.get_xml(api) + blist = etree.fromstring(xml) binaries = [Binary(filename=i.get('filename'), size=i.get('size'), mtime=i.get('mtime')) @@ -204,13 +218,13 @@ class ObsApi(object): def get_binary_fileinfo(self, prj, pkg, repo, arch, binary): payload = dict(view='fileinfo') api = '/build/{}/{}/{}/{}/{}'.format(prj, repo, arch, pkg, binary) - r = self.__api_get(api, payload) - return FileInfo(r.text) + xml = self.get_xml(api, payload) + return FileInfo(xml) def get_project_repos(self, prj): api = '/build/{}'.format(prj) - r = self.__api_get(api) - directory = etree.fromstring(r.text) + xml = self.get_xml(api) + directory = etree.fromstring(xml) entries = [] for entry in directory.findall('entry'): @@ -244,8 +258,7 @@ class ObsApi(object): def get_build_config(self, prj, repo): api = '/build/{}/{}/_buildconfig'.format(prj, repo) - r = self.__api_get(api) - return r.text + return self.get_xml(api) def get_vendor(self, prj, repo=None): repo = repo or self.get_project_repos(prj)[0] -- cgit v1.2.3