Skip to content

Commit a7dd9fb

Browse files
committed
fix(typechecker): Type fixes
Signed-off-by: Helio Chissini de Castro <dev@heliocastro.info>
1 parent 446a4c9 commit a7dd9fb

6 files changed

Lines changed: 44 additions & 33 deletions

File tree

examples/repo_config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from pydantic import ValidationError
1111
from rich.pretty import pprint
1212

13-
from ort import OrtRepositoryConfiguration
13+
from ort import RepositoryConfiguration
1414

1515
logger = logging.getLogger()
1616

@@ -21,7 +21,7 @@ def main(datafile: str) -> None:
2121
try:
2222
with Path(datafile).open() as fd:
2323
data = yaml.safe_load(fd)
24-
parsed = OrtRepositoryConfiguration(**data)
24+
parsed = RepositoryConfiguration(**data)
2525
pprint(parsed)
2626
except ValidationError as e:
2727
logger.error(e)

src/ort/models/advisor_summary.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from datetime import datetime
55

6-
from pydantic import BaseModel, ConfigDict, Field
6+
from pydantic import BaseModel, ConfigDict, Field, field_validator
77

88
from .issue import Issue
99

@@ -29,3 +29,10 @@ class AdvisorSummary(BaseModel):
2929
description="The list of issues that occurred during the advisor run."
3030
"This property is not serialized if the list is empty to reduce the size of the result file.",
3131
)
32+
33+
@field_validator("start_time", "end_time", mode="before")
34+
@classmethod
35+
def transform_date(cls, v):
36+
if isinstance(v, str):
37+
return datetime.fromisoformat(v.replace("Z", "+00:00"))
38+
return v

src/ort/models/remote_artifact.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ class RemoteArtifact(BaseModel):
1717
description="The URL of the remote artifact.",
1818
)
1919
hash: Hash | None = Field(
20+
default=None,
2021
description="The hash of the remote artifact.",
2122
)

tests/test_advisor_details.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def test_details_from_string_capabilities():
1212
"""Test that AdvisorDetails converts string capabilities to enum values."""
1313
details = AdvisorDetails(
1414
name="VulnerableCode",
15-
capabilities=["VULNERABILITIES"],
15+
capabilities={AdvisorCapability.VULNERABILITIES},
1616
)
1717
if details.name != "VulnerableCode":
1818
pytest.fail(f"Expected name 'VulnerableCode', got '{details.name}'")
@@ -24,7 +24,7 @@ def test_details_from_multiple_string_capabilities():
2424
"""Test that AdvisorDetails converts multiple string capabilities."""
2525
details = AdvisorDetails(
2626
name="OSV",
27-
capabilities=["DEFECTS", "VULNERABILITIES"],
27+
capabilities={AdvisorCapability.DEFECTS, AdvisorCapability.VULNERABILITIES},
2828
)
2929
if details.capabilities != {AdvisorCapability.DEFECTS, AdvisorCapability.VULNERABILITIES}:
3030
pytest.fail(f"Expected {{DEFECTS, VULNERABILITIES}}, got {details.capabilities}")
@@ -34,7 +34,7 @@ def test_details_from_int_capabilities():
3434
"""Test that AdvisorDetails accepts integer capability values."""
3535
details = AdvisorDetails(
3636
name="TestAdvisor",
37-
capabilities=[1, 2],
37+
capabilities=[1, 2], # ty: ignore[invalid-argument-type]
3838
)
3939
if details.capabilities != {AdvisorCapability.DEFECTS, AdvisorCapability.VULNERABILITIES}:
4040
pytest.fail(f"Expected {{DEFECTS, VULNERABILITIES}}, got {details.capabilities}")
@@ -44,7 +44,7 @@ def test_details_from_mixed_capabilities():
4444
"""Test that AdvisorDetails handles a mix of string and int capabilities."""
4545
details = AdvisorDetails(
4646
name="TestAdvisor",
47-
capabilities=["DEFECTS", 2],
47+
capabilities=["DEFECTS", 2], # ty: ignore[invalid-argument-type]
4848
)
4949
if details.capabilities != {AdvisorCapability.DEFECTS, AdvisorCapability.VULNERABILITIES}:
5050
pytest.fail(f"Expected {{DEFECTS, VULNERABILITIES}}, got {details.capabilities}")
@@ -55,7 +55,7 @@ def test_details_invalid_capability_string():
5555
with pytest.raises(ValidationError):
5656
AdvisorDetails(
5757
name="TestAdvisor",
58-
capabilities=["INVALID"],
58+
capabilities=["INVALID"], # ty: ignore[invalid-argument-type]
5959
)
6060

6161

@@ -64,18 +64,18 @@ def test_details_extra_field_forbidden():
6464
with pytest.raises(ValidationError):
6565
AdvisorDetails(
6666
name="TestAdvisor",
67-
capabilities=["VULNERABILITIES"],
68-
unknown_field="value",
67+
capabilities={AdvisorCapability.VULNERABILITIES},
68+
unknown_field="value", # ty: ignore[unknown-argument]
6969
)
7070

7171

7272
def test_details_missing_name():
7373
"""Test that missing 'name' field raises a ValidationError."""
7474
with pytest.raises(ValidationError):
75-
AdvisorDetails(capabilities=["VULNERABILITIES"])
75+
AdvisorDetails(capabilities={AdvisorCapability.VULNERABILITIES}) # ty: ignore[missing-argument]
7676

7777

7878
def test_details_missing_capabilities():
7979
"""Test that missing 'capabilities' field raises a ValidationError."""
8080
with pytest.raises(ValidationError):
81-
AdvisorDetails(name="TestAdvisor")
81+
AdvisorDetails(name="TestAdvisor") # ty: ignore[missing-argument]

tests/test_advisor_result.py

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
# SPDX-FileCopyrightText: 2026 Helio Chissini de Castro <heliocastro@gmail.com>
22
# SPDX-License-Identifier: MIT
33

4+
from datetime import datetime, timezone
5+
46
import pytest
57
from pydantic import ValidationError
68

79
from ort.models.advisor_capability import AdvisorCapability
10+
from ort.models.advisor_details import AdvisorDetails
811
from ort.models.advisor_result import AdvisorResult
912
from ort.models.advisor_summary import AdvisorSummary
1013
from tests.utils.load_yaml_config import load_yaml_config
@@ -69,14 +72,14 @@ def test_advisor_result_with_defects_from_yaml():
6972
def test_advisor_result_minimal():
7073
"""Test creating a minimal AdvisorResult programmatically."""
7174
result = AdvisorResult(
72-
advisor={
73-
"name": "TestAdvisor",
74-
"capabilities": ["VULNERABILITIES"],
75-
},
76-
summary={
77-
"start_time": "2024-01-01T00:00:00Z",
78-
"end_time": "2024-01-01T00:01:00Z",
79-
},
75+
advisor=AdvisorDetails(
76+
name="TestAdvisor",
77+
capabilities={AdvisorCapability.VULNERABILITIES},
78+
),
79+
summary=AdvisorSummary(
80+
start_time=datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc),
81+
end_time=datetime(2024, 1, 1, 0, 1, 0, tzinfo=timezone.utc),
82+
),
8083
)
8184
if result.advisor.name != "TestAdvisor":
8285
pytest.fail(f"Expected advisor name 'TestAdvisor', got '{result.advisor.name}'")
@@ -90,29 +93,29 @@ def test_advisor_result_missing_advisor():
9093
"""Test that missing advisor field raises ValidationError."""
9194
with pytest.raises(ValidationError):
9295
AdvisorResult(
93-
summary={
94-
"start_time": "2024-01-01T00:00:00Z",
95-
"end_time": "2024-01-01T00:01:00Z",
96-
},
97-
)
96+
summary=AdvisorSummary(
97+
start_time=datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc),
98+
end_time=datetime(2024, 1, 1, 0, 1, 0, tzinfo=timezone.utc),
99+
),
100+
) # ty: ignore[missing-argument]
98101

99102

100103
def test_advisor_result_missing_summary():
101104
"""Test that missing summary field raises ValidationError."""
102105
with pytest.raises(ValidationError):
103106
AdvisorResult(
104-
advisor={
105-
"name": "TestAdvisor",
106-
"capabilities": ["VULNERABILITIES"],
107-
},
108-
)
107+
advisor=AdvisorDetails(
108+
name="TestAdvisor",
109+
capabilities={AdvisorCapability.VULNERABILITIES},
110+
),
111+
) # ty: ignore[missing-argument]
109112

110113

111114
def test_advisor_summary_timestamps():
112115
"""Test AdvisorSummary timestamp parsing."""
113116
summary = AdvisorSummary(
114-
start_time="2024-06-01T10:00:00Z",
115-
end_time="2024-06-01T10:05:00Z",
117+
start_time=datetime(2024, 6, 1, 10, 0, 0, tzinfo=timezone.utc),
118+
end_time=datetime(2024, 6, 1, 10, 5, 0, tzinfo=timezone.utc),
116119
)
117120
if summary.start_time.year != 2024:
118121
pytest.fail(f"Expected year 2024, got {summary.start_time.year}")

tests/test_vulnerability_reference.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def test_extra_field_forbidden(self):
5858
with pytest.raises(ValidationError):
5959
VulnerabilityReference(
6060
url="https://example.com",
61-
unknown="value",
61+
unknown="value", # ty: ignore[unknown-argument]
6262
)
6363

6464

0 commit comments

Comments
 (0)