bot/code_review_bot/report/base.py (35 lines of code) (raw):
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import itertools
from code_review_bot import Level
class Reporter:
"""
Common interface to post reports on a website
Will configure & build reports
"""
def __init__(self, configuration):
"""
Configure reporter using Taskcluster credentials and configuration
"""
raise NotImplementedError
def publish(self, issues, revision):
"""
Publish a new report
"""
raise NotImplementedError
def requires(self, configuration, *keys):
"""
Check all configuration necessary keys are present
"""
assert isinstance(configuration, dict)
out = []
for key in keys:
assert key in configuration, f"Missing {self.__class__.__name__} {key}"
out.append(configuration[key])
return out
def calc_stats(self, issues):
"""
Calc stats about issues:
* group issues by analyzer
* count their total number
* count their publishable number
"""
groups = itertools.groupby(
sorted(issues, key=lambda i: i.analyzer.name), lambda i: i.analyzer
)
def stats(analyzer, items):
_items = list(items)
paths = list({i.path for i in _items if i.is_publishable()})
publishable = sum(i.is_publishable() for i in _items)
build_errors = sum(i.is_build_error() for i in _items)
return {
"analyzer": analyzer.display_name,
"help": analyzer.build_help_message(paths),
"total": len(_items),
"publishable": publishable,
"publishable_paths": paths,
# Split results for normal publishable issues and build errors
"nb_defects": publishable - build_errors,
"nb_build_errors": build_errors,
"nb_warnings": sum(i.level == Level.Warning for i in _items),
"nb_errors": sum(i.level == Level.Error for i in _items),
}
return [stats(analyzer, items) for analyzer, items in groups]