From fe1a85efed7695d581a03bbc5ee285d5e4871f75 Mon Sep 17 00:00:00 2001 From: Asher Foa <1268088+asherf@users.noreply.github.com> Date: Sat, 15 Aug 2020 15:12:58 -0700 Subject: [PATCH 1/4] Add support for JSON coverage report https://coverage.readthedocs.io/en/coverage-5.2.1/config.html?highlight=json%20report#json --- src/python/pants/backend/python/rules/coverage.py | 2 ++ src/python/pants/core/goals/test.py | 1 + 2 files changed, 3 insertions(+) diff --git a/src/python/pants/backend/python/rules/coverage.py b/src/python/pants/backend/python/rules/coverage.py index 8a795d545de4..04cc63264371 100644 --- a/src/python/pants/backend/python/rules/coverage.py +++ b/src/python/pants/backend/python/rules/coverage.py @@ -312,6 +312,8 @@ def _get_coverage_reports( report_file = output_dir / "htmlcov" / "index.html" elif report_type == CoverageReportType.XML: report_file = output_dir / "coverage.xml" + elif report_type == CoverageReportType.JSON: + report_file = output_dir / "coverage.json" else: raise ValueError(f"Invalid coverage report type: {report_type}") coverage_reports.append( diff --git a/src/python/pants/core/goals/test.py b/src/python/pants/core/goals/test.py index 4f12211b52d9..72e0bcd42c6c 100644 --- a/src/python/pants/core/goals/test.py +++ b/src/python/pants/core/goals/test.py @@ -39,6 +39,7 @@ class CoverageReportType(Enum): XML = ("xml", None) HTML = ("html", None) RAW = ("raw", None) + JSON = ("json", None) _report_name: str From b69da7ea58a5be535fd70d1cdfa6b99899724d64 Mon Sep 17 00:00:00 2001 From: Asher Foa <1268088+asherf@users.noreply.github.com> Date: Tue, 18 Aug 2020 09:35:38 -0700 Subject: [PATCH 2/4] Update test. --- .../backend/python/rules/coverage_integration_test.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/python/pants/backend/python/rules/coverage_integration_test.py b/src/python/pants/backend/python/rules/coverage_integration_test.py index 8ad2de652c0f..d912fee65f9c 100644 --- a/src/python/pants/backend/python/rules/coverage_integration_test.py +++ b/src/python/pants/backend/python/rules/coverage_integration_test.py @@ -218,11 +218,11 @@ def test_coverage_raw(self) -> None: result = self._run_tests(tmpdir_relative, "--coverage-py-report=raw") self._assert_raw_coverage(result, build_root) - def test_coverage_html_and_xml(self) -> None: + def test_coverage_html_xml_json(self) -> None: build_root = get_buildroot() with temporary_dir(root_dir=build_root) as tmpdir: tmpdir_relative = self._prepare_sources(tmpdir, build_root) - result = self._run_tests(tmpdir_relative, "--coverage-py-report=['xml', 'html']") + result = self._run_tests(tmpdir_relative, "--coverage-py-report=['xml', 'html', 'json']") coverage_path = Path(build_root, "dist", "coverage", "python") assert coverage_path.exists() is True @@ -234,3 +234,7 @@ def test_coverage_html_and_xml(self) -> None: html_cov_dir = coverage_path / "htmlcov" assert html_cov_dir.exists() is True assert (html_cov_dir / "index.html").exists() is True + + assert "Wrote json coverage report to `dist/coverage/python`" in result.stderr_data + json_coverage = coverage_path / "coverage.json" + assert json_coverage.exists() is True From 28302104e7fd66285036a67afbc8c8fd6304d2f3 Mon Sep 17 00:00:00 2001 From: Asher Foa <1268088+asherf@users.noreply.github.com> Date: Sat, 22 Aug 2020 15:56:44 -0700 Subject: [PATCH 3/4] Fix logic --- src/python/pants/backend/python/rules/coverage.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/python/pants/backend/python/rules/coverage.py b/src/python/pants/backend/python/rules/coverage.py index 04cc63264371..4e4e431f884a 100644 --- a/src/python/pants/backend/python/rules/coverage.py +++ b/src/python/pants/backend/python/rules/coverage.py @@ -276,6 +276,7 @@ async def generate_coverage_reports( ) continue report_types.append(report_type) + output_file = f"coverage.{report_type.value}" if report_type in {CoverageReportType.XML, CoverageReportType.JSON} else None pex_processes.append( PexProcess( coverage_setup.pex, @@ -284,7 +285,7 @@ async def generate_coverage_reports( argv=(report_type.report_name, "--ignore-errors"), input_digest=input_digest, output_directories=("htmlcov",) if report_type == CoverageReportType.HTML else None, - output_files=("coverage.xml",) if report_type == CoverageReportType.XML else None, + output_files=(output_file,) if output_file else None, description=f"Generate Pytest {report_type.report_name} coverage report.", level=LogLevel.DEBUG, ) From f4bc8bf66713978ff2101bf8bab78b07ccf59078 Mon Sep 17 00:00:00 2001 From: Asher Foa <1268088+asherf@users.noreply.github.com> Date: Sat, 22 Aug 2020 16:02:01 -0700 Subject: [PATCH 4/4] fmt --- src/python/pants/backend/python/rules/coverage.py | 6 +++++- .../pants/backend/python/rules/coverage_integration_test.py | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/python/pants/backend/python/rules/coverage.py b/src/python/pants/backend/python/rules/coverage.py index 4e4e431f884a..fe90da327f32 100644 --- a/src/python/pants/backend/python/rules/coverage.py +++ b/src/python/pants/backend/python/rules/coverage.py @@ -276,7 +276,11 @@ async def generate_coverage_reports( ) continue report_types.append(report_type) - output_file = f"coverage.{report_type.value}" if report_type in {CoverageReportType.XML, CoverageReportType.JSON} else None + output_file = ( + f"coverage.{report_type.value}" + if report_type in {CoverageReportType.XML, CoverageReportType.JSON} + else None + ) pex_processes.append( PexProcess( coverage_setup.pex, diff --git a/src/python/pants/backend/python/rules/coverage_integration_test.py b/src/python/pants/backend/python/rules/coverage_integration_test.py index d912fee65f9c..580bd03549ae 100644 --- a/src/python/pants/backend/python/rules/coverage_integration_test.py +++ b/src/python/pants/backend/python/rules/coverage_integration_test.py @@ -222,7 +222,9 @@ def test_coverage_html_xml_json(self) -> None: build_root = get_buildroot() with temporary_dir(root_dir=build_root) as tmpdir: tmpdir_relative = self._prepare_sources(tmpdir, build_root) - result = self._run_tests(tmpdir_relative, "--coverage-py-report=['xml', 'html', 'json']") + result = self._run_tests( + tmpdir_relative, "--coverage-py-report=['xml', 'html', 'json']" + ) coverage_path = Path(build_root, "dist", "coverage", "python") assert coverage_path.exists() is True