diff options
Diffstat (limited to 'obsapi')
| -rw-r--r-- | obsapi/__init__.py | 1 | ||||
| -rw-r--r-- | obsapi/core.py | 235 |
2 files changed, 236 insertions, 0 deletions
diff --git a/obsapi/__init__.py b/obsapi/__init__.py new file mode 100644 index 0000000..5af2406 --- /dev/null +++ b/obsapi/__init__.py @@ -0,0 +1 @@ +from core import * diff --git a/obsapi/core.py b/obsapi/core.py new file mode 100644 index 0000000..ba1ca0b --- /dev/null +++ b/obsapi/core.py @@ -0,0 +1,235 @@ +import requests +from lxml import etree +from collections import namedtuple + +LSItem = namedtuple('LSItem', 'name md5 size mtime') +Directory = namedtuple('Directory', 'name rev, vrev, srcmd5') +Binary = namedtuple('Binary', 'filename size mtime') + +DEFAULTAPIURL = 'https://api.opensuse.org' + + +class FileInfo(object): + attributes = ['name', + 'version', + 'release', + 'arch', + 'summary', + 'description', + 'source', + 'size', + 'mtime', + 'provides', + 'requires', + ] + + pkg_str_template = ("{filename}" + "Name : {name}" + "Version : {version}" + "Release : {release}" + "Architecture: {arch}" + "Size : {size}" + "Source RPM : {source}" + "Build Date : {mtime}" + "Summary : {summary}" + "Description :" + "{description}" + ) + + src_str_template = ("{filename}" + "Name : {name}" + "Version : {version}" + "Release : {release}" + "Architecture: {arch}" + "Size : {size}" + "Build Date : {mtime}" + "Summary : {summary}" + "Description :" + "{description}" + ) + + file_str_template = ("{filename}" + "size : {size}" + "mtime : {mtime}" + ) + + def __init__(self, xml): + finfo = etree.fromstring(xml) + self.filename = finfo.get('filename') + for attr in self.attributes: + if attr in ('provides', 'requires'): + try: + self.set_list_attr(attr, finfo.findall(attr)) + except: + self.set_attr(attr, []) + continue + try: + value = finfo.find(attr).text + self.set_attr(attr, value) + except: + self.set_attr(attr, '') + + def __str__(self): + opts = dict(filename=self.filename, + name=self.name, + version=self.version, + release=self.release, + arch=self.arch, + size=self.size, + source=self.source, + mtime=self.mtime, + summary=self.summary, + description=self.description, + ) + + if self.arch == 'src': + return self.src_str_template.format(**opts) + elif self.source: + return self.pkg_str_template.format(**opts) + else: + return self.file_str_template.format(**opts) + + def set_list_attr(self, attr, elements): + items = [element.text for element in elements] + setattr(attr, items) + + def set_attr(self, attr, value): + setattr(self, attr, value) + + @property + def is_pkg(self): + if self.arch: + return True + + @property + def is_src(self): + if self.source: + return False + else: + return True + + @property + def is_debug_info(self): + if '-' in self.name: + if self.name.split('-')[-1] in ('debuginfo', 'debugsource'): + return True + + return False + + +class ObsApi(object): + + def __init__(self, apiurl=None): + self.apiurl = apiurl or DEFAULTAPIURL + + def __api_get(self, api, payload=None): + url = '{0}/{1}'.format(self.apiurl, api) + r = requests.get(url, params=payload) + + return r + + def get_package_meta(self, prj, pkg): + api = '/source/{}/{}/_meta'.format(prj, pkg) + r = self.__api_get(api) + return r.text + + def ls(self, prj=None, pkg=None): + if prj and pkg: + return self.package_ls(prj, pkg) + if prj: + return self.project_ls(prj) + + return None + + def project_ls(self, prj): + api = '/source/{}'.format(prj) + r = self.__api_get(api) + d = etree.fromstring(r.text) + 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) + directory = Directory(d.get('name'), + d.get('rev'), + d.get('vrev'), + d.get('srcmd5') + ) + lsitems = [] + for item in d.findall('entry'): + lsitems.append(LSItem(item.get('name'), + item.get('md5'), + item.get('size'), + item.get('mtime') + ) + ) + return (directory, lsitems) + + 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) + binaries = [Binary(filename=i.get('filename'), + size=i.get('size'), + mtime=i.get('mtime')) + for i in blist.findall('binary')] + + return binaries + + 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) + + def get_project_repos(self, prj): + api = '/build/{}'.format(prj) + r = self.__api_get(api) + directory = etree.fromstring(r.text) + + entries = [] + for entry in directory.findall('entry'): + entries.append(entry.get('name')) + + return entries + + def get_package_version(self, prj, pkg, repo, arch, full=True): + binaries = self.get_binaries(prj, pkg, repo, arch) + r_finfo = '' + for item in binaries: + if item.filename.endswith('.src.rpm'): + r_finfo = self.get_binary_fileinfo(prj, + pkg, + repo, + arch, + item.filename + ) + break + + if r_finfo: + finfo = etree.fromstring(r_finfo) + version = finfo.find('version').text + release = finfo.find('release').text + if full: + version = '%s-%s' % (version, release) + else: + version = '' + + return version + + def get_build_config(self, prj, repo): + api = '/build/{}/{}/_buildconfig'.format(prj, repo) + r = self.__api_get(api) + return r.text + + def get_vendor(self, prj, repo=None): + repo = repo or self.get_project_repos(prj)[0] + vendor = None + for line in self.get_build_config(prj, repo).splitlines(): + if line.strip().startswith('%vendor '): + vendor = line.split(' ', 1)[1] + + return vendor |
