def mock_coverage_report_generation( coverage_data_collection: MockCoverageDataCollection, ) -> CoverageReports: addresses = ", ".join(coverage_data.address.spec for coverage_data in coverage_data_collection) console_report = ConsoleCoverageReport(f"Ran coverage on {addresses}") return CoverageReports(reports=(console_report, ))
def _get_coverage_report( output_dir: PurePath, report_type: CoverageReportType, coverage_insufficient: bool, result_stdout: bytes, result_snapshot: Snapshot, ) -> CoverageReport: if report_type == CoverageReportType.CONSOLE: return ConsoleCoverageReport(coverage_insufficient, result_stdout.decode()) report_file: PurePath | None if report_type == CoverageReportType.HTML: 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}") return FilesystemCoverageReport( coverage_insufficient=coverage_insufficient, report_type=report_type.value, result_snapshot=result_snapshot, directory_to_materialize_to=output_dir, report_file=report_file, )
def _get_coverage_reports( output_dir: PurePath, report_types: Sequence[CoverageReportType], results: Tuple[ProcessResult, ...], ) -> List[CoverageReport]: coverage_reports: List[CoverageReport] = [] for result, report_type in zip(results, report_types): if report_type == CoverageReportType.CONSOLE: coverage_reports.append( ConsoleCoverageReport(result.stdout.decode())) continue report_file: Optional[PurePath] = None if report_type == CoverageReportType.HTML: 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( FilesystemCoverageReport( report_type=report_type, result_digest=result.output_digest, directory_to_materialize_to=output_dir, report_file=report_file, )) return coverage_reports
async def generate_coverage_report( merged_coverage_data: MergedCoverageData, coverage_setup: CoverageSetup, coverage_subsystem: PytestCoverage, transitive_targets: TransitiveTargets, python_setup: PythonSetup, subprocess_encoding_environment: SubprocessEncodingEnvironment, ) -> CoverageReport: """Takes all Python test results and generates a single coverage report.""" requirements_pex = coverage_setup.requirements_pex python_targets = [tgt for tgt in transitive_targets.closure if tgt.has_field(PythonSources)] coverage_config = await Get[CoverageConfig]( CoverageConfigRequest(Targets(python_targets), is_test_time=False) ) sources = await Get[SourceFiles]( AllSourceFilesRequest( (tgt.get(Sources) for tgt in transitive_targets.closure), strip_source_roots=False ) ) sources_with_inits_snapshot = await Get[InitInjectedSnapshot]( InjectInitRequest(sources.snapshot) ) merged_input_files: Digest = await Get( Digest, DirectoriesToMerge( directories=( merged_coverage_data.coverage_data, coverage_config.digest, requirements_pex.directory_digest, sources_with_inits_snapshot.snapshot.directory_digest, ) ), ) report_type = coverage_subsystem.options.report coverage_args = [report_type.report_name] process = requirements_pex.create_process( pex_path=f"./{coverage_setup.requirements_pex.output_filename}", pex_args=coverage_args, input_files=merged_input_files, output_directories=("htmlcov",), output_files=("coverage.xml",), description=f"Generate Pytest coverage report.", python_setup=python_setup, subprocess_encoding_environment=subprocess_encoding_environment, ) result = await Get[ProcessResult](Process, process) if report_type == ReportType.CONSOLE: return ConsoleCoverageReport(result.stdout.decode()) report_dir = PurePath(coverage_subsystem.options.report_output_path) report_file: Optional[PurePath] = None if coverage_subsystem.options.report == ReportType.HTML: report_file = report_dir / "htmlcov" / "index.html" elif coverage_subsystem.options.report == ReportType.XML: report_file = report_dir / "coverage.xml" return FilesystemCoverageReport( result_digest=result.output_directory_digest, directory_to_materialize_to=report_dir, report_file=report_file, )
async def generate_coverage_report( merged_coverage_data: MergedCoverageData, coverage_setup: CoverageSetup, coverage_subsystem: PytestCoverage, transitive_targets: TransitiveTargets, python_setup: PythonSetup, subprocess_encoding_environment: SubprocessEncodingEnvironment, ) -> CoverageReports: """Takes all Python test results and generates a single coverage report.""" requirements_pex = coverage_setup.requirements_pex coverage_config = await Get[CoverageConfig](CoverageConfigRequest( Targets(transitive_targets.closure), is_test_time=False)) sources = await Get[SourceFiles](AllSourceFilesRequest( (tgt.get(Sources) for tgt in transitive_targets.closure), strip_source_roots=False)) sources_with_inits_snapshot = await Get[InitInjectedSnapshot]( InjectInitRequest(sources.snapshot)) input_digest: Digest = await Get( Digest, MergeDigests(( merged_coverage_data.coverage_data, coverage_config.digest, requirements_pex.digest, sources_with_inits_snapshot.snapshot.digest, )), ) report_type = coverage_subsystem.options.report # The -i flag causes coverage to ignore files it doesn't have sources for. # Specifically, it will ignore the injected __init__.py files, which is what we want since # those are empty and don't correspond to a real source file the user is aware of. coverage_args = [report_type.report_name, "-i"] process = requirements_pex.create_process( pex_path=f"./{coverage_setup.requirements_pex.output_filename}", pex_args=coverage_args, input_digest=input_digest, output_directories=("htmlcov", ), output_files=("coverage.xml", ), description="Generate Pytest coverage report.", python_setup=python_setup, subprocess_encoding_environment=subprocess_encoding_environment, ) result = await Get[ProcessResult](Process, process) if report_type == CoverageReportType.CONSOLE: return CoverageReports( reports=(ConsoleCoverageReport(result.stdout.decode()), )) report_dir = PurePath(coverage_subsystem.options.report_output_path) report_file: Optional[PurePath] = None if report_type == CoverageReportType.HTML: report_file = report_dir / "htmlcov" / "index.html" elif report_type == CoverageReportType.XML: report_file = report_dir / "coverage.xml" fs_report = FilesystemCoverageReport( result_digest=result.output_digest, directory_to_materialize_to=report_dir, report_file=report_file, ) return CoverageReports(reports=(fs_report, ))