Mercurial > bitten > bitten-test
diff bitten/trac_ext/web_ui.py @ 161:4677161d2ae9
Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
author | cmlenz |
---|---|
date | Sat, 27 Aug 2005 07:28:30 +0000 |
parents | 395b67aa072e |
children | 634be6cbb808 |
line wrap: on
line diff
--- a/bitten/trac_ext/web_ui.py +++ b/bitten/trac_ext/web_ui.py @@ -31,7 +31,8 @@ from trac.wiki import wiki_to_html from bitten.model import BuildConfig, TargetPlatform, Build, BuildStep, BuildLog from bitten.store import ReportStore -from bitten.trac_ext.api import ILogFormatter +from bitten.trac_ext.api import ILogFormatter, IReportSummarizer +from bitten.trac_ext.summarizers import * _status_label = {Build.IN_PROGRESS: 'in progress', Build.SUCCESS: 'completed', @@ -390,6 +391,7 @@ implements(INavigationContributor, IRequestHandler, ITimelineEventProvider) log_formatters = ExtensionPoint(ILogFormatter) + report_summarizers = ExtensionPoint(IReportSummarizer) # INavigationContributor methods @@ -437,30 +439,10 @@ steps.append({ 'name': step.name, 'description': step.description, 'duration': pretty_timedelta(step.started, step.stopped), - 'failed': step.status == BuildStep.FAILURE + 'failed': step.status == BuildStep.FAILURE, + 'log': self._render_log(req, build, step), + 'reports': self._render_reports(req, build, step) }) - for log in BuildLog.select(self.env, build=build.id, - step=step.name, db=db): - formatters = [] - items = [] - for formatter in self.log_formatters: - formatters.append(formatter.get_formatter(req, build, - step, - log.type)) - for level, message in log.messages: - for format in formatters: - message = format(level, message) - items.append({'level': level, 'message': message}) - steps[-1]['log'] = items - - store = ReportStore(self.env) - reports = [] - for report in store.retrieve_reports(build, step): - report_type = report.attr['type'] - report_href = self.env.href.buildreport(build.id, step.name, - report_type) - reports.append({'type': report_type, 'href': report_href}) - steps[-1]['reports'] = reports req.hdf['build.steps'] = steps add_stylesheet(req, 'bitten.css') @@ -496,6 +478,44 @@ href = self.env.href.build(config, id) yield event_kinds[status], href, title, stopped, None, '' + # Internal methods + + def _render_log(self, req, build, step): + items = [] + for log in BuildLog.select(self.env, build=build.id, step=step.name): + formatters = [] + for formatter in self.log_formatters: + formatters.append(formatter.get_formatter(req, build, step, + log.type)) + for level, message in log.messages: + for format in formatters: + message = format(level, message) + items.append({'level': level, 'message': message}) + return items + + def _render_reports(self, req, build, step): + summarizers = {} # keyed by report type + for summarizer in self.report_summarizers: + types = summarizer.get_supported_report_types() + summarizers.update(dict([(type, summarizer) for type in types])) + self.log.debug("Report summarizers: %s", summarizers) + + store = ReportStore(self.env) + reports = [] + for report in store.retrieve_reports(build, step): + report_type = report.attr['type'] + summarizer = summarizers.get(report_type) + if summarizer: + summary = summarizer.render_report_summary(req, build, step, + report) + else: + summary = None + report_href = self.env.href.buildreport(build.id, step.name, + report_type) + reports.append({'type': report_type, 'href': report_href, + 'summary': summary}) + return reports + class SourceFileLinkFormatter(Component): """Finds references to files and directories in the repository in the build