This is an automated email from the ASF dual-hosted git repository.

sbp pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-releases.git


The following commit(s) were added to refs/heads/main by this push:
     new 142707f  Copy SBOM models to remove interdependencies
142707f is described below

commit 142707f1962d00c642134f98688998811c032fa2
Author: Sean B. Palmer <[email protected]>
AuthorDate: Tue Jan 20 15:06:34 2026 +0000

    Copy SBOM models to remove interdependencies
---
 atr/get/sbom.py       | 19 ++++++++-----------
 atr/models/results.py | 36 ++++++++++++++++++++++++++++++++----
 atr/tasks/sbom.py     |  9 ++++++++-
 3 files changed, 48 insertions(+), 16 deletions(-)

diff --git a/atr/get/sbom.py b/atr/get/sbom.py
index b65fc11..fc56c59 100644
--- a/atr/get/sbom.py
+++ b/atr/get/sbom.py
@@ -34,7 +34,6 @@ import atr.models.results as results
 import atr.models.sql as sql
 import atr.render as render
 import atr.sbom as sbom
-import atr.sbom.models.osv as osv
 import atr.shared as shared
 import atr.template as template
 import atr.util as util
@@ -338,7 +337,7 @@ def _cyclonedx_cli_errors(block: htm.Block, task_result: 
results.SBOMToolScore):
         block.p["No CycloneDX CLI validation errors found."]
 
 
-def _extract_vulnerability_severity(vuln: osv.VulnerabilityDetails) -> str:
+def _extract_vulnerability_severity(vuln: results.VulnerabilityDetails) -> str:
     """Extract severity information from vulnerability data."""
     data = vuln.database_specific or {}
     if "severity" in data:
@@ -588,10 +587,10 @@ def _vulnerability_scan_find_in_progress_task(osv_tasks: 
Sequence[sql.Task], rev
 
 def _vulnerability_scan_results(
     block: htm.Block,
-    vulns: list[osv.CdxVulnerabilityDetail],
+    vulns: list[results.CdxVulnerabilityDetail],
     scans: list[str],
     task: sql.Task | None,
-    prev: list[osv.CdxVulnerabilityDetail] | None,
+    prev: list[results.CdxVulnerabilityDetail] | None,
 ) -> None:
     previous_vulns = None
     if prev is not None:
@@ -606,7 +605,7 @@ def _vulnerability_scan_results(
 
 
 def _vulnerability_results_from_bom(
-    vulns: list[osv.CdxVulnerabilityDetail],
+    vulns: list[results.CdxVulnerabilityDetail],
     block: htm.Block,
     scans: list[str],
     previous_vulns: dict[str, tuple[str, list[str]]] | None,
@@ -677,12 +676,12 @@ def _vulnerability_results_from_scan(
     block.append(new_block)
 
 
-def _cdx_to_osv(cdx: osv.CdxVulnerabilityDetail) -> osv.VulnerabilityDetails:
+def _cdx_to_osv(cdx: results.CdxVulnerabilityDetail) -> 
results.VulnerabilityDetails:
     score = []
     severity = ""
     if cdx.ratings is not None:
         severity, score = sbom.utilities.cdx_severity_to_osv(cdx.ratings)
-    return osv.VulnerabilityDetails(
+    return results.VulnerabilityDetails(
         id=cdx.id,
         summary=cdx.description,
         details=cdx.detail,
@@ -714,14 +713,12 @@ def _vulnerability_scan_section(
 
     scans = []
     if task_result.vulnerabilities is not None:
-        vulnerabilities = [
-            sbom.models.osv.CdxVulnAdapter.validate_python(json.loads(e)) for 
e in task_result.vulnerabilities
-        ]
+        vulnerabilities = 
[results.CdxVulnAdapter.validate_python(json.loads(e)) for e in 
task_result.vulnerabilities]
     else:
         vulnerabilities = []
     if task_result.prev_vulnerabilities is not None:
         prev_vulnerabilities = [
-            sbom.models.osv.CdxVulnAdapter.validate_python(json.loads(e)) for 
e in task_result.prev_vulnerabilities
+            results.CdxVulnAdapter.validate_python(json.loads(e)) for e in 
task_result.prev_vulnerabilities
         ]
     else:
         prev_vulnerabilities = None
diff --git a/atr/models/results.py b/atr/models/results.py
index 6893f28..891f4be 100644
--- a/atr/models/results.py
+++ b/atr/models/results.py
@@ -15,12 +15,10 @@
 # specific language governing permissions and limitations
 # under the License.
 
-from typing import Annotated, Literal
+from typing import Annotated, Any, Literal
 
 import pydantic
 
-import atr.sbom.models.osv as osv
-
 from . import schema
 
 
@@ -63,9 +61,39 @@ class SBOMGenerateCycloneDX(schema.Strict):
     msg: str = schema.description("The message from the SBOM generation")
 
 
+class VulnerabilityDetails(schema.Lax):
+    # Copied from atr/sbom/models/osv.py
+    id: str
+    summary: str | None = None
+    details: str | None = None
+    references: list[dict[str, Any]] | None = None
+    severity: list[dict[str, Any]] | None = None
+    published: str | None = None
+    modified: str
+    database_specific: dict[str, Any] = schema.Field(default={})
+
+
+class CdxVulnerabilityDetail(schema.Lax):
+    # Copied from atr/sbom/models/osv.py
+    bom_ref: str | None = schema.Field(default=None, alias="bom-ref")
+    id: str
+    source: dict[str, str] | None = None
+    description: str | None = None
+    detail: str | None = None
+    advisories: list[dict[str, str]] | None = None
+    cwes: list[int] | None = None
+    published: str | None = None
+    updated: str | None = None
+    affects: list[dict[str, str]] | None = None
+    ratings: list[dict[str, str | float]] | None = None
+
+
+CdxVulnAdapter = pydantic.TypeAdapter(CdxVulnerabilityDetail)
+
+
 class OSVComponent(schema.Strict):
     purl: str = schema.description("Package URL")
-    vulnerabilities: list[osv.VulnerabilityDetails] = 
schema.description("Vulnerabilities found")
+    vulnerabilities: list[VulnerabilityDetails] = 
schema.description("Vulnerabilities found")
 
 
 class SBOMOSVScan(schema.Strict):
diff --git a/atr/tasks/sbom.py b/atr/tasks/sbom.py
index 0b2ea04..066fbec 100644
--- a/atr/tasks/sbom.py
+++ b/atr/tasks/sbom.py
@@ -145,7 +145,14 @@ async def osv_scan(args: FileArgs) -> results.Results | 
None:
     bundle = sbom.utilities.path_to_bundle(pathlib.Path(full_path))
     vulnerabilities, ignored = await sbom.osv.scan_bundle(bundle)
     patch_ops = await sbom.utilities.bundle_to_vuln_patch(bundle, 
vulnerabilities)
-    components = [results.OSVComponent(purl=v.ref, 
vulnerabilities=v.vulnerabilities) for v in vulnerabilities]
+    components = []
+    for v in vulnerabilities:
+        components.append(
+            results.OSVComponent(
+                purl=v.ref,
+                
vulnerabilities=[results.VulnerabilityDetails.model_validate(vuln) for vuln in 
v.vulnerabilities],
+            )
+        )
 
     new_full_path: str | None = None
     new_version, merged = sbom.utilities.apply_patch("osv-scan", 
args.revision_number, bundle, patch_ops)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to