eric7/DebugClients/Python/coverage/jsonreport.py

branch
eric7
changeset 8312
800c432b34c8
parent 7702
f8b97639deb5
child 8775
0802ae193343
equal deleted inserted replaced
8311:4e8b98454baa 8312:800c432b34c8
1 # coding: utf-8
2 # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
3 # For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
4
5 """Json reporting for coverage.py"""
6 import datetime
7 import json
8 import sys
9
10 from coverage import __version__
11 from coverage.report import get_analysis_to_report
12 from coverage.results import Numbers
13
14
15 class JsonReporter(object):
16 """A reporter for writing JSON coverage results."""
17
18 def __init__(self, coverage):
19 self.coverage = coverage
20 self.config = self.coverage.config
21 self.total = Numbers()
22 self.report_data = {}
23
24 def report(self, morfs, outfile=None):
25 """Generate a json report for `morfs`.
26
27 `morfs` is a list of modules or file names.
28
29 `outfile` is a file object to write the json to
30
31 """
32 outfile = outfile or sys.stdout
33 coverage_data = self.coverage.get_data()
34 coverage_data.set_query_contexts(self.config.report_contexts)
35 self.report_data["meta"] = {
36 "version": __version__,
37 "timestamp": datetime.datetime.now().isoformat(),
38 "branch_coverage": coverage_data.has_arcs(),
39 "show_contexts": self.config.json_show_contexts,
40 }
41
42 measured_files = {}
43 for file_reporter, analysis in get_analysis_to_report(self.coverage, morfs):
44 measured_files[file_reporter.relative_filename()] = self.report_one_file(
45 coverage_data,
46 analysis
47 )
48
49 self.report_data["files"] = measured_files
50
51 self.report_data["totals"] = {
52 'covered_lines': self.total.n_executed,
53 'num_statements': self.total.n_statements,
54 'percent_covered': self.total.pc_covered,
55 'missing_lines': self.total.n_missing,
56 'excluded_lines': self.total.n_excluded,
57 }
58
59 if coverage_data.has_arcs():
60 self.report_data["totals"].update({
61 'num_branches': self.total.n_branches,
62 'num_partial_branches': self.total.n_partial_branches,
63 'covered_branches': self.total.n_executed_branches,
64 'missing_branches': self.total.n_missing_branches,
65 })
66
67 json.dump(
68 self.report_data,
69 outfile,
70 indent=4 if self.config.json_pretty_print else None
71 )
72
73 return self.total.n_statements and self.total.pc_covered
74
75 def report_one_file(self, coverage_data, analysis):
76 """Extract the relevant report data for a single file"""
77 nums = analysis.numbers
78 self.total += nums
79 summary = {
80 'covered_lines': nums.n_executed,
81 'num_statements': nums.n_statements,
82 'percent_covered': nums.pc_covered,
83 'missing_lines': nums.n_missing,
84 'excluded_lines': nums.n_excluded,
85 }
86 reported_file = {
87 'executed_lines': sorted(analysis.executed),
88 'summary': summary,
89 'missing_lines': sorted(analysis.missing),
90 'excluded_lines': sorted(analysis.excluded)
91 }
92 if self.config.json_show_contexts:
93 reported_file['contexts'] = analysis.data.contexts_by_lineno(
94 analysis.filename,
95 )
96 if coverage_data.has_arcs():
97 reported_file['summary'].update({
98 'num_branches': nums.n_branches,
99 'num_partial_branches': nums.n_partial_branches,
100 'covered_branches': nums.n_executed_branches,
101 'missing_branches': nums.n_missing_branches,
102 })
103 return reported_file

eric ide

mercurial