diff --git a/src/codemodder/codetf/v2/codetf.py b/src/codemodder/codetf/v2/codetf.py index 863fe527..c4920179 100644 --- a/src/codemodder/codetf/v2/codetf.py +++ b/src/codemodder/codetf/v2/codetf.py @@ -11,7 +11,7 @@ from enum import Enum from typing import TYPE_CHECKING, Optional -from pydantic import BaseModel, model_validator +from pydantic import BaseModel, ConfigDict, model_validator from codemodder import __version__ @@ -21,9 +21,6 @@ from ..common import Change as CommonChange from ..common import ( CodeTFWriter, -) -from ..common import Finding as CommonFinding -from ..common import ( Rule, ) @@ -153,7 +150,12 @@ def validate_description(self): return self -class Finding(CommonFinding): +class Finding(BaseModel): + id: Optional[str] = None + rule: Rule + + model_config = ConfigDict(frozen=True) + def to_unfixed_finding( self, *, @@ -172,7 +174,7 @@ def to_unfixed_finding( def with_rule(self, name: str, url: Optional[str]) -> Finding: return Finding( id=self.id, - rule=Rule(id=self.rule.id, name=name, url=url) if self.rule else None, + rule=Rule(id=self.rule.id, name=name, url=url), ) diff --git a/tests/test_codetf.py b/tests/test_codetf.py index 5c9bab57..de59783b 100644 --- a/tests/test_codetf.py +++ b/tests/test_codetf.py @@ -6,7 +6,17 @@ import requests from pydantic import ValidationError -from codemodder.codetf import Change, ChangeSet, CodeTF, DiffSide, Reference, Result +from codemodder.codetf import ( + Change, + ChangeSet, + CodeTF, + DiffSide, + Finding, + Reference, + Result, + Rule, +) +from codemodder.codetf.v3.codetf import Finding as FindingV3 @pytest.fixture(autouse=True) @@ -167,3 +177,12 @@ def test_still_invalidates_bad_value(bad_value): with pytest.raises(ValidationError): Change.model_validate(json) + + +def test_v2_finding_id_optional(): + Finding(id=None, rule=Rule(id="foo", name="whatever")) + + +def test_v3_finding_id_not_optional(): + with pytest.raises(ValidationError): + FindingV3(id=None, rule=Rule(id="foo", name="whatever")) # type: ignore[arg-type]