Source code for api4jenkins.report
# encoding: utf-8
from .item import Item, camel, snake
[docs]
class GetMixIn:
[docs]
def get(self, name):
for item in self:
if item.name == name:
return item
return None
[docs]
class ResultBase:
def __init__(self, raw):
self.raw = raw
def __getattr__(self, name):
camel_name = camel(name)
if camel_name in self.raw:
return self.raw[camel_name]
return super().__getattribute__(name)
def __str__(self):
return f'<{type(self).__name__}: {self.name}>'
def __dir__(self):
return super().__dir__() + [snake(k) for k in self.raw]
[docs]
class TestReport(Item, GetMixIn):
def __iter__(self):
for suite in self.api_json()['suites']:
yield TestSuite(suite)
@property
def suites(self):
yield from self
[docs]
class TestSuite(ResultBase, GetMixIn):
def __iter__(self):
for case in self.raw['cases']:
yield TestCase(case)
@property
def cases(self):
yield from self
[docs]
class TestCase(ResultBase):
pass
[docs]
class CoverageReport(Item, GetMixIn):
'''Access coverage report generated by `JaCoCo <https://plugins.jenkins.io/jacoco/>`_'''
report_types = ['branchCoverage', 'classCoverage', 'complexityScore',
'instructionCoverage', 'lineCoverage', 'methodCoverage']
def __getattr__(self, name):
attr = camel(name)
if attr not in self.report_types:
raise AttributeError(
f"'CoverageReport' object has no attribute '{name}'")
return self.get(attr)
def __iter__(self):
for k, v in self.api_json().items():
if k != '_class' and k != 'previousResult':
v['name'] = k
yield Coverage(v)
[docs]
def trends(self, count=2):
def _resolve(data):
if data['previousResult']:
yield from _resolve(data['previousResult'])
for k, v in data.items():
if k != '_class' and k != 'previousResult':
v['name'] = k
yield Coverage(v)
yield from _resolve(self.api_json(depth=count))
[docs]
class Coverage(ResultBase):
pass
[docs]
class CoverageResult(Item, GetMixIn):
'''Access coverage result generated by `Code Coverage API <https://plugins.jenkins.io/code-coverage-api/>`_'''
def __iter__(self):
for element in self.api_json(depth=1)['results']['elements']:
yield CoverageElement(element)
[docs]
class CoverageElement(ResultBase):
pass
[docs]
class CoverageTrends(Item, GetMixIn):
def __iter__(self):
for trend in self.api_json(depth=1)['trends']:
trend['name'] = trend['buildName']
yield CoverageTrend(trend)
[docs]
class CoverageTrend(ResultBase):
def __iter__(self):
for element in self.raw['elements']:
yield CoverageElement(element)