(connection: sqlite3.Connection, scan: sqlite3.Row)
| 2513 | |
| 2514 | |
| 2515 | def write_csv_export(connection: sqlite3.Connection, scan: sqlite3.Row) -> Path: |
| 2516 | scan_dir = require_canonical_scan_directory(Path(scan["scan_dir"])) |
| 2517 | output = io.StringIO(newline="") |
| 2518 | writer = csv.writer(output) |
| 2519 | writer.writerow( |
| 2520 | ( |
| 2521 | "occurrence_id", |
| 2522 | "finding_id", |
| 2523 | "title", |
| 2524 | "summary", |
| 2525 | "severity", |
| 2526 | "confidence", |
| 2527 | "status", |
| 2528 | "close_reason", |
| 2529 | "note", |
| 2530 | "remediation", |
| 2531 | "path", |
| 2532 | "start_line", |
| 2533 | "end_line", |
| 2534 | ) |
| 2535 | ) |
| 2536 | for row in finding_export_rows(connection, scan["id"]): |
| 2537 | writer.writerow( |
| 2538 | ( |
| 2539 | csv_cell(row["occurrence_id"]), |
| 2540 | csv_cell(row["finding_id"]), |
| 2541 | csv_cell(row["title"]), |
| 2542 | csv_cell(row["summary"]), |
| 2543 | csv_cell(row["severity"]), |
| 2544 | csv_cell(row["confidence"]), |
| 2545 | csv_cell(row["status"]), |
| 2546 | csv_cell(row["close_reason"]), |
| 2547 | csv_cell(row["note"]), |
| 2548 | csv_cell(row["remediation"]), |
| 2549 | csv_cell(row["relative_path"]), |
| 2550 | row["start_line"], |
| 2551 | row["end_line"], |
| 2552 | ) |
| 2553 | ) |
| 2554 | try: |
| 2555 | write_scan_local_bytes( |
| 2556 | scan_dir, |
| 2557 | "exports/findings.csv", |
| 2558 | output.getvalue().encode("utf-8"), |
| 2559 | ) |
| 2560 | except ContractError as exc: |
| 2561 | raise SystemExit( |
| 2562 | "exports: expected a regular directory inside the scan directory." |
| 2563 | ) from exc |
| 2564 | destination = scan_dir / "exports" / "findings.csv" |
| 2565 | path = available_artifact_path(scan_dir, destination) |
| 2566 | if path is None: |
| 2567 | raise SystemExit("findings.csv: expected a regular file inside the scan directory.") |
| 2568 | return path |
| 2569 | |
| 2570 | |
| 2571 | def finding_export_rows(connection: sqlite3.Connection, scan_id: str) -> sqlite3.Cursor: |
no test coverage detected