diff --git a/coverage/html.py b/coverage/html.py
index 4aa018e3f..596e11435 100644
--- a/coverage/html.py
+++ b/coverage/html.py
@@ -95,7 +95,7 @@ def data_for_file(self, fr, analysis):
arcs_executed = analysis.arcs_executed()
if self.config.show_contexts:
- contexts_by_lineno = analysis.data.contexts_by_lineno(fr.filename)
+ contexts_by_lineno = analysis.data.contexts_by_lineno(analysis.filename)
lines = []
diff --git a/coverage/jsonreport.py b/coverage/jsonreport.py
index e44cbf089..0c3f313d9 100644
--- a/coverage/jsonreport.py
+++ b/coverage/jsonreport.py
@@ -43,7 +43,6 @@ def report(self, morfs, outfile=None):
for file_reporter, analysis in get_analysis_to_report(self.coverage, morfs):
measured_files[file_reporter.relative_filename()] = self.report_one_file(
coverage_data,
- file_reporter,
analysis
)
@@ -71,7 +70,7 @@ def report(self, morfs, outfile=None):
return self.total.n_statements and self.total.pc_covered
- def report_one_file(self, coverage_data, file_reporter, analysis):
+ def report_one_file(self, coverage_data, analysis):
"""Extract the relevant report data for a single file"""
nums = analysis.numbers
self.total += nums
@@ -90,7 +89,7 @@ def report_one_file(self, coverage_data, file_reporter, analysis):
}
if self.config.json_show_contexts:
reported_file['contexts'] = analysis.data.contexts_by_lineno(
- file_reporter.filename
+ analysis.filename,
)
if coverage_data.has_arcs():
reported_file['summary'].update({
diff --git a/tests/test_html.py b/tests/test_html.py
index 6c4c706c0..b543fa08e 100644
--- a/tests/test_html.py
+++ b/tests/test_html.py
@@ -1127,3 +1127,20 @@ def test_no_contexts_warns_no_contexts(self):
self.start_import_stop(cov, "two_tests")
with self.assert_warnings(cov, ["No contexts were measured"]):
cov.html_report()
+
+ def test_dynamic_contexts_relative_files(self):
+ self.make_file("two_tests.py", self.SOURCE)
+ self.make_file("config", "[run]\nrelative_files = True")
+ cov = coverage.Coverage(source=["."], config_file="config")
+ cov.set_option("run:dynamic_context", "test_function")
+ cov.set_option("html:show_contexts", True)
+ mod = self.start_import_stop(cov, "two_tests")
+ d = self.html_data_from_cov(cov, mod)
+ context_labels = [self.EMPTY, 'two_tests.test_one', 'two_tests.test_two']
+ expected_lines = [self.OUTER_LINES, self.TEST_ONE_LINES, self.TEST_TWO_LINES]
+ for label, expected in zip(context_labels, expected_lines):
+ actual = [
+ ld.number for ld in d.lines
+ if label == ld.contexts_label or label in (ld.contexts or ())
+ ]
+ assert sorted(expected) == sorted(actual)
diff --git a/tests/test_json.py b/tests/test_json.py
index 1ae5764ee..64de92929 100644
--- a/tests/test_json.py
+++ b/tests/test_json.py
@@ -103,42 +103,51 @@ def test_simple_line_coverage(self):
self._assert_expected_json_report(cov, expected_result)
def test_context(self):
- cov = coverage.Coverage(context="cool_test")
- cov.config.json_show_contexts = True
- expected_result = {
- 'meta': {
- "version": coverage.__version__,
- "branch_coverage": False,
- "show_contexts": True,
- },
- 'files': {
- 'a.py': {
- 'executed_lines': [1, 2],
- 'missing_lines': [3],
- 'excluded_lines': [],
- "contexts": {
- "1": [
- "cool_test"
- ],
- "2": [
- "cool_test"
- ]
- },
- 'summary': {
- 'excluded_lines': 0,
- 'missing_lines': 1,
- 'covered_lines': 2,
- 'num_statements': 3,
- 'percent_covered': 66.66666666666667
+ for relative_files in [False, True]:
+ config_file = os.path.join(self.temp_dir, "config")
+ with open(config_file, 'w') as handle:
+ handle.write(
+ "[run]\nrelative_files = {}".format(relative_files)
+ )
+ cov = coverage.Coverage(
+ context="cool_test",
+ config_file=config_file
+ )
+ cov.config.json_show_contexts = True
+ expected_result = {
+ 'meta': {
+ "version": coverage.__version__,
+ "branch_coverage": False,
+ "show_contexts": True,
+ },
+ 'files': {
+ 'a.py': {
+ 'executed_lines': [1, 2],
+ 'missing_lines': [3],
+ 'excluded_lines': [],
+ "contexts": {
+ "1": [
+ "cool_test"
+ ],
+ "2": [
+ "cool_test"
+ ]
+ },
+ 'summary': {
+ 'excluded_lines': 0,
+ 'missing_lines': 1,
+ 'covered_lines': 2,
+ 'num_statements': 3,
+ 'percent_covered': 66.66666666666667
+ }
}
+ },
+ 'totals': {
+ 'excluded_lines': 0,
+ 'missing_lines': 1,
+ 'covered_lines': 2,
+ 'num_statements': 3,
+ 'percent_covered': 66.66666666666667
}
- },
- 'totals': {
- 'excluded_lines': 0,
- 'missing_lines': 1,
- 'covered_lines': 2,
- 'num_statements': 3,
- 'percent_covered': 66.66666666666667
}
- }
- self._assert_expected_json_report(cov, expected_result)
+ self._assert_expected_json_report(cov, expected_result)