diff options
| -rw-r--r-- | obsapi/core.py | 16 | ||||
| -rw-r--r-- | obsapi/jobhist.py | 37 | ||||
| -rw-r--r-- | test/test_jobhist.py | 34 |
3 files changed, 87 insertions, 0 deletions
diff --git a/obsapi/core.py b/obsapi/core.py index 26b7b7e..2baf072 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 obsapi.jobhist import JobHist from .null import Null @@ -411,3 +412,18 @@ class ObsApi(object): params['cmd'] = 'remove_flag' return self.source.post(prj, pkg, **params) + + def get_jobhistory_list(self, prj, repo, arch, package=None, code=None, limit=None): + '''Get build job history for packages in project + + :param prj: OBS Project + :param repo: OBS Repository + "param arch: Architecture + :param package: OBS Package (optional, limit result to this package) + :param limit: Number of jot histories to limit to (optional) + + :returns: List of JobHist objects + ''' + xml = self.build.get_jobhistory(prj, repo, arch, pkg=package, code=code, limit=limit) + root = xml2etree(xml) + return [JobHist(jh) for jh in root.findall('jobhist')] diff --git a/obsapi/jobhist.py b/obsapi/jobhist.py new file mode 100644 index 0000000..be4577f --- /dev/null +++ b/obsapi/jobhist.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- + +from lxml import etree +from datetime import datetime +from obsapi.helpers import xml2etree + + +class JobHist(): + + def __init__(self, element): + self.root = xml2etree(element) + + def __str__(self): + return self.xml + + def __getattr__(self, attr): + value = self.root.get(attr) + if value is None: + raise AttributeError + + return value + + @property + def starttime(self): + return datetime.fromtimestamp(int(self.root.get('starttime'))) + + @property + def endtime(self): + return datetime.fromtimestamp(int(self.root.get('endtime'))) + + @property + def readytime(self): + return datetime.fromtimestamp(int(self.root.get('readytime'))) + + @property + def xml(self): + return etree.tostring(self.root) diff --git a/test/test_jobhist.py b/test/test_jobhist.py new file mode 100644 index 0000000..79764fb --- /dev/null +++ b/test/test_jobhist.py @@ -0,0 +1,34 @@ +import pytest +from lxml import etree +from datetime import datetime +from obsapi.jobhist import JobHist + + +@pytest.fixture +def jhist_xml(): + return '''<jobhist package="chromium" rev="16" srcmd5="407c32b2d472dde5e18703b1bedba963" versrel="80.0.3987.149-1" bcnt="1" readytime="1585238949" starttime="1585238959" endtime="1585253844" code="succeeded" uri="http://192.168.131.81:34165" workerid="sheep81:4" hostarch="x86_64" reason="source change" verifymd5="407c32b2d472dde5e18703b1bedba963" />''' + + +def test_jobhist(jhist_xml): + jhist = JobHist(jhist_xml) + root = etree.fromstring(jhist_xml) + assert jhist.package == root.get('package') + assert jhist.rev == root.get('rev') + assert jhist.srcmd5 == root.get('srcmd5') + assert jhist.versrel == root.get('versrel') + assert jhist.bcnt == root.get('bcnt') + assert jhist.readytime == datetime.fromtimestamp(int(root.get('readytime'))) + assert jhist.starttime == datetime.fromtimestamp(int(root.get('starttime'))) + assert jhist.endtime == datetime.fromtimestamp(int(root.get('endtime'))) + assert jhist.code == root.get('code') + assert jhist.uri == root.get('uri') + assert jhist.workerid == root.get('workerid') + assert jhist.hostarch == root.get('hostarch') + assert jhist.reason == root.get('reason') + assert jhist.verifymd5 == root.get('verifymd5') + + +def test_jobhist_invalid_attribute(jhist_xml): + jhist = JobHist(jhist_xml) + with pytest.raises(AttributeError): + assert jhist.invalid_attribute == 'Error' |
