summaryrefslogtreecommitdiff
path: root/obsapi
diff options
context:
space:
mode:
Diffstat (limited to 'obsapi')
-rw-r--r--obsapi/__init__.py1
-rw-r--r--obsapi/core.py119
-rw-r--r--obsapi/fileinfo.py102
-rw-r--r--obsapi/helpers.py23
4 files changed, 134 insertions, 111 deletions
diff --git a/obsapi/__init__.py b/obsapi/__init__.py
index 6b3af61..547af96 100644
--- a/obsapi/__init__.py
+++ b/obsapi/__init__.py
@@ -3,4 +3,3 @@ from obsapi.core import *
from ._version import get_versions
__version__ = get_versions()['version']
del get_versions
-
diff --git a/obsapi/core.py b/obsapi/core.py
index d4980dc..80067d6 100644
--- a/obsapi/core.py
+++ b/obsapi/core.py
@@ -1,14 +1,13 @@
# -*- coding: utf-8 -*-
#
import re
-from io import BytesIO
from lxml import etree
from collections import namedtuple
-from datetime import datetime
+from obsapi import helpers
from obsapi.sourceapi import ObsSourceApi
from obsapi.buildapi import ObsBuildApi
-from obsapi.formatter import Formatter
from obsapi.repoflags import RepoFlags
+from obsapi.fileinfo import FileInfo
LSItem = namedtuple('LSItem', 'name md5 size mtime')
@@ -25,102 +24,7 @@ emptyxml = '<empty></empty>'
EMPTYTREE = etree.fromstring(emptyxml)
EMPTY = EMPTYTREE.xpath('.')[0]
-
-class FileInfo(object):
- file_str_template = ('{filename}'
- 'size : {size}'
- 'mtime : {mtime}'
- )
-
- pkg_str_template = ('{filename}'
- 'Name : {name}'
- 'Version : {version}'
- 'Release : {release}'
- 'Architecture: {arch}'
- 'Size : {size}'
- 'Source RPM : {source}'
- 'Build Date : {mtime}'
- 'Summary : {summary}'
- 'Description :'
- '{description}'
- 'Provides :'
- '{provides}'
- )
-
- src_str_template = ('{filename}'
- 'Name : {name}'
- 'Version : {version}'
- 'Release : {release}'
- 'Architecture: {arch}'
- 'Size : {size}'
- 'Build Date : {mtime}'
- 'Summary : {summary}'
- 'Description :'
- '{description}'
- )
-
- def __init__(self, xml):
- self.finfo = etree.fromstring(xml)
- self.filename = self.finfo.get('filename', None)
- self.formatter = Formatter(self)
-
- @property
- def info(self):
- info = {'filename': [self.filename]}
- for item in self.finfo:
- info.setdefault(item.tag, []).append(item.text)
-
- for item, value in info.items():
- if len(value) == 1:
- info[item] = value[0]
- # info[item] = '\n'.join(value)
-
- return info
-
- def __str__(self):
- return self.formatter.render()
-
- def __getattr__(self, attr):
- try:
- values = [value.text for value in self.finfo.findall(attr)]
- except Exception:
- values = [None]
-
- if len(values) == 1:
- return values[0]
- else:
- return values
-
- @property
- def datetime(self):
- if self.mtime:
- return datetime.fromtimestamp(int(self.mtime))
-
- @property
- def xml(self):
- return etree.tostring(self.finfo)
-
- @property
- def is_pkg(self):
- if self.arch:
- return True
- else:
- return False
-
- @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
+xml2etree = helpers.xml2etree
class ObsApi(object):
@@ -137,11 +41,6 @@ class ObsApi(object):
self.build.verify_ssl = True
self.lastapi = None
- def __xml2etree(self, xml):
- xml = xml.encode('utf-8')
- parser = etree.XMLParser(remove_blank_text=True)
- return etree.parse(BytesIO(xml), parser).xpath('.')[0]
-
def get_meta(self, prj, pkg=None):
return self.source.get_meta(prj, pkg=pkg)
@@ -162,7 +61,7 @@ class ObsApi(object):
if xml is None:
return []
- d = self.__xml2etree(xml)
+ d = xml2etree(xml)
lsitems = [e.get('name') for e in d.findall('entry')]
return lsitems
@@ -303,7 +202,7 @@ class ObsApi(object):
return RepoFlags(self.get_meta(prj, pkg))
def locked(self, prj, pkg=None):
- meta = self.__xml2etree(self.get_meta(prj, pkg))
+ meta = xml2etree(self.get_meta(prj, pkg))
if meta.find('lock') is not None:
return True
return False
@@ -328,7 +227,7 @@ class ObsApi(object):
if role is None:
role = '.*' # regex to match all
- meta = self.__xml2etree(xml)
+ meta = xml2etree(xml)
persons = meta.xpath('.//person[re:test(@role, role)]', namespaces={'re': REGEX_NS})
return [User(userid=p.get('userid'), role=p.get('role')) for p in persons]
@@ -340,7 +239,7 @@ class ObsApi(object):
if role is None:
role = '.*' # regex to match all
- meta = self.__xml2etree(xml)
+ meta = xml2etree(xml)
groups = meta.xpath('.//group[re:test(@role, role)]', namespaces={'re': REGEX_NS})
return [Group(groupid=g.get('groupid'), role=g.get('role')) for g in groups]
@@ -359,7 +258,7 @@ class ObsApi(object):
if xml is None:
raise Exception('unable to retrieve project meta')
- meta = self.__xml2etree(xml)
+ meta = xml2etree(xml)
etree.SubElement(meta, 'person', userid=userid, role=role)
return self.put_meta(prj, pkg, etree.tostring(meta))
@@ -378,7 +277,7 @@ class ObsApi(object):
if xml is None:
raise Exception('unable to retrieve project meta')
- meta = self.__xml2etree(xml)
+ meta = xml2etree(xml)
etree.SubElement(meta, 'group', groupid=groupid, role=role)
return self.put_meta(prj, pkg, etree.tostring(meta))
diff --git a/obsapi/fileinfo.py b/obsapi/fileinfo.py
new file mode 100644
index 0000000..7024bdd
--- /dev/null
+++ b/obsapi/fileinfo.py
@@ -0,0 +1,102 @@
+# -*- coding: utf-8 -*-
+
+from lxml import etree
+from datetime import datetime
+from obsapi.formatter import Formatter
+from obsapi.helpers import xml2etree
+
+class FileInfo(object):
+ file_str_template = ('{filename}'
+ 'size : {size}'
+ 'mtime : {mtime}'
+ )
+
+ pkg_str_template = ('{filename}'
+ 'Name : {name}'
+ 'Version : {version}'
+ 'Release : {release}'
+ 'Architecture: {arch}'
+ 'Size : {size}'
+ 'Source RPM : {source}'
+ 'Build Date : {mtime}'
+ 'Summary : {summary}'
+ 'Description :'
+ '{description}'
+ 'Provides :'
+ '{provides}'
+ )
+
+ src_str_template = ('{filename}'
+ 'Name : {name}'
+ 'Version : {version}'
+ 'Release : {release}'
+ 'Architecture: {arch}'
+ 'Size : {size}'
+ 'Build Date : {mtime}'
+ 'Summary : {summary}'
+ 'Description :'
+ '{description}'
+ )
+
+ def __init__(self, xml):
+ self.finfo = xml2etree(xml)
+ self.filename = self.finfo.get('filename', None)
+ self.formatter = Formatter(self)
+
+ @property
+ def info(self):
+ info = {'filename': [self.filename]}
+ for item in self.finfo:
+ info.setdefault(item.tag, []).append(item.text)
+
+ for item, value in info.items():
+ if len(value) == 1:
+ info[item] = value[0]
+ # info[item] = '\n'.join(value)
+
+ return info
+
+ def __str__(self):
+ return self.formatter.render()
+
+ def __getattr__(self, attr):
+ try:
+ values = [value.text for value in self.finfo.findall(attr)]
+ except Exception:
+ values = [None]
+
+ if len(values) == 1:
+ return values[0]
+ else:
+ return values
+
+ @property
+ def datetime(self):
+ if self.mtime:
+ return datetime.fromtimestamp(int(self.mtime))
+
+ @property
+ def xml(self):
+ return etree.tostring(self.finfo)
+
+ @property
+ def is_pkg(self):
+ if self.arch:
+ return True
+ else:
+ return False
+
+ @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
diff --git a/obsapi/helpers.py b/obsapi/helpers.py
new file mode 100644
index 0000000..6912035
--- /dev/null
+++ b/obsapi/helpers.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+"""
+ obsapi: helper module
+ ~~~~~~~~~~~~~~~~~~~~~
+
+ This module contains helper functions
+
+
+ :copyright: Copyright (c) 2020 Scott Bahling, SUSE Linux GmbH
+ :license: GPL-2.0, see COPYING for details
+"""
+from io import BytesIO
+from lxml import etree
+
+
+def xml2etree(xml):
+ try:
+ if not isinstance(xml, bytes):
+ xml = xml.encode('utf-8')
+ parser = etree.XMLParser(remove_blank_text=True)
+ return etree.parse(BytesIO(xml), parser).xpath('.')[0]
+ except Exception as e:
+ raise e