From ef3a208dfa05e936b41c410bb14920b771ac0afd Mon Sep 17 00:00:00 2001 From: Vitor Borges Date: Oct 01 2017 20:41:48 +0000 Subject: Changed the Report format on database Signed-off-by: Adailson Santos Signed-off-by: Vitor Borges --- diff --git a/kiskadee/api/app.py b/kiskadee/api/app.py index ad1b580..9860ebb 100644 --- a/kiskadee/api/app.py +++ b/kiskadee/api/app.py @@ -56,8 +56,6 @@ def package_analysis(pkg_name, version): ) analysis_schema = AnalysisSchema(many=True) results = analysis_schema.dump(analysis) - for data in results.data: - data['raw'] = json.loads(data['raw']) return jsonify({'analysis': results.data}) diff --git a/kiskadee/api/serializers.py b/kiskadee/api/serializers.py index f39414a..98e7835 100644 --- a/kiskadee/api/serializers.py +++ b/kiskadee/api/serializers.py @@ -1,7 +1,7 @@ """Provide objects to serialize the kiskadee models.""" from marshmallow import Schema, fields -from kiskadee.model import Package, Fetcher, Analysis, Version, Reports +from kiskadee.model import Package, Fetcher, Analysis, Version, Report class ReportsSchema(Schema): @@ -9,14 +9,12 @@ class ReportsSchema(Schema): id = fields.Int() analysis_id = fields.Int() - warnings = fields.Int() - styles = fields.Int() - errors = fields.Int() + results = fields.Dict() def make_object(self, data): """Serialize a Reports object.""" print('MAKING OBJECT FROM', data) - return Reports(**data) + return Report(**data) class AnalysisSchema(Schema): diff --git a/kiskadee/model.py b/kiskadee/model.py index 8bb6ed2..81fe42c 100644 --- a/kiskadee/model.py +++ b/kiskadee/model.py @@ -73,20 +73,18 @@ class Analysis(Base): version_id = Column(Integer, ForeignKey('versions.id'), nullable=False) analyzer_id = Column(Integer, ForeignKey('analyzers.id'), nullable=False) raw = Column(JSON) - report = orm.relationship('Reports', + report = orm.relationship('Report', uselist=False, back_populates='analysis') -class Reports(Base): +class Report(Base): """Abstraction of a analysis report.""" __tablename__ = 'reports' id = Column(Integer, Sequence('reports_id_seq', optional=True), primary_key=True) analysis_id = Column(Integer, ForeignKey('analysis.id'), nullable=False) - warnings = Column(Integer) - styles = Column(Integer) - errors = Column(Integer) + results = Column(JSON) analysis = orm.relationship('Analysis', back_populates='report') diff --git a/kiskadee/monitor.py b/kiskadee/monitor.py index ba66e72..1039b74 100644 --- a/kiskadee/monitor.py +++ b/kiskadee/monitor.py @@ -10,13 +10,18 @@ import os import json import kiskadee.database +from kiskadee.report import CppCheckReport from kiskadee.runner import Runner import kiskadee.queue -from kiskadee.model import Package, Fetcher, Version +from kiskadee.model import Package, Fetcher, Version, Report import re RUNNING = True +REPORTERS = { + 'cppcheck': CppCheckReport +} + class Monitor: """Provide kiskadee monitoring objects.""" @@ -144,19 +149,13 @@ class Monitor: self.session.commit() return _package - def _save_reports(self, analysis, pkg): + def _save_reports(self, analysis, pkg, analyzer_name): try: - reports = analysis['raw'] - report_dictionary = { - 'warnings': re.subn('warning', '', reports)[1], - 'styles': re.subn('style', '', reports)[1], - 'errors': re.subn('error', '', reports)[1] - } - _reports = kiskadee.model.Reports() - _reports.warnings = report_dictionary['warnings'] - _reports.styles = report_dictionary['styles'] - _reports.errors = report_dictionary['errors'] - _reports.analysis_id = analysis['id'] + results = analysis.raw['results'] + analyzer_report = REPORTERS[analyzer_name](results) + _reports = Report() + _reports.results = json.dumps(analyzer_report.compute_reports()) + _reports.analysis_id = analysis.id self.session.add(_reports) self.session.commit() kiskadee.logger.debug( @@ -181,7 +180,7 @@ class Monitor: _analysis.raw = json.loads(result) self.session.add(_analysis) self.session.commit() - self._save_reports(_analysis, pkg) + self._save_reports(_analysis, pkg, _analyzer.name) kiskadee.logger.debug( "MONITOR: Saved analysis done by {} for package: {}_{}" .format(analyzer, pkg["name"], pkg["version"]) diff --git a/kiskadee/report.py b/kiskadee/report.py new file mode 100644 index 0000000..273f339 --- /dev/null +++ b/kiskadee/report.py @@ -0,0 +1,29 @@ +from abc import ABCMeta, abstractmethod + +class Report: + __metaclass__ = ABCMeta + + def __init__(self, results): + self.results = results + + @abstractmethod + def compute_reports(self, results): pass + + +class CppCheckReport(Report): + + def compute_reports(self): + result_dict = { + 'warning': 0, + 'error': 0, + 'style': 0 + } + for result in self.results: + if 'severity' in list(result.keys()): + result_dict[result['severity']] += 1 + else: + print('deu ruimmmm') + + print(result_dict) + return result_dict +