Source code for api4jenkins.report
# encoding: utf-8
from .item import AsyncItem, Item, camel, snake
[docs]
class GetMixIn:
[docs]
def get(self, name):
return next((item for item in self if item.name == name), 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 not in ['_class', '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 not in ['_class', '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)
# async class
[docs]
class AsyncGetMixIn:
[docs]
async def get(self, name):
async for item in self:
if item.name == name:
return item
[docs]
class AsyncTestReport(AsyncItem, AsyncGetMixIn):
async def __aiter__(self):
data = await self.api_json()
for suite in data['suites']:
yield TestSuite(suite)
@property
async def suites(self):
async for suite in self:
yield suite
[docs]
class AsyncCoverageReport(AsyncItem, AsyncGetMixIn):
'''Access coverage report generated by `JaCoCo <https://plugins.jenkins.io/jacoco/>`_'''
report_types = ['branchCoverage', 'classCoverage', 'complexityScore',
'instructionCoverage', 'lineCoverage', 'methodCoverage']
async def __getattr__(self, name):
attr = camel(name)
if attr not in self.report_types:
raise AttributeError(
f"'CoverageReport' object has no attribute '{name}'")
return await self.get(attr)
async def __aiter__(self):
data = await self.api_json()
for k, v in data.items():
if k not in ['_class', 'previousResult']:
v['name'] = k
yield Coverage(v)
[docs]
async def trends(self, count=2):
def _resolve(data):
if data['previousResult']:
yield from _resolve(data['previousResult'])
for k, v in data.items():
if k not in ['_class', 'previousResult']:
v['name'] = k
yield Coverage(v)
data = await self.api_json(depth=count)
for c in _resolve(data):
yield c
[docs]
class AsyncCoverageResult(AsyncItem, AsyncGetMixIn):
'''Access coverage result generated by `Code Coverage API <https://plugins.jenkins.io/code-coverage-api/>`_'''
async def __aiter__(self):
data = await self.api_json(depth=1)
for element in data['results']['elements']:
yield CoverageElement(element)
[docs]
class AsyncCoverageTrends(AsyncItem, AsyncGetMixIn):
async def __aiter__(self):
data = await self.api_json(depth=1)
for trend in data['trends']:
trend['name'] = trend['buildName']
yield CoverageTrend(trend)