Skip to content

Commit e2c69d4

Browse files
authored
Add case-insensitive validation for CodeTF enum values (#898)
1 parent de8f2ca commit e2c69d4

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

src/codemodder/codetf.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,27 @@
2121
from codemodder.context import CodemodExecutionContext
2222

2323

24-
class Action(Enum):
24+
class CaseInsensitiveEnum(str, Enum):
25+
@classmethod
26+
def _missing_(cls, value: object):
27+
if not isinstance(value, str):
28+
return super()._missing_(value)
29+
30+
return cls.__members__.get(value.upper())
31+
32+
33+
class Action(CaseInsensitiveEnum):
2534
ADD = "add"
2635
REMOVE = "remove"
2736

2837

29-
class PackageResult(Enum):
38+
class PackageResult(CaseInsensitiveEnum):
3039
COMPLETED = "completed"
3140
FAILED = "failed"
3241
SKIPPED = "skipped"
3342

3443

35-
class DiffSide(Enum):
44+
class DiffSide(CaseInsensitiveEnum):
3645
LEFT = "left"
3746
RIGHT = "right"
3847

tests/test_codetf.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import jsonschema
55
import pytest
66
import requests
7+
from pydantic import ValidationError
78

89
from codemodder.codetf import Change, ChangeSet, CodeTF, DiffSide, Reference, Result
910

@@ -130,3 +131,39 @@ def test_write_codetf_with_results(tmpdir, mocker, codetf_schema):
130131
def test_reference_use_url_for_description():
131132
ref = Reference(url="https://example.com")
132133
assert ref.description == "https://example.com"
134+
135+
136+
def test_case_insensitive_change_validation():
137+
json = {
138+
"lineNumber": 1,
139+
"description": "Change 1 to 2",
140+
"diffSide": "RIGHT",
141+
"packageActions": [
142+
{
143+
"action": "ADD",
144+
"package": "foo",
145+
"result": "COMPLETED",
146+
}
147+
],
148+
}
149+
150+
Change.model_validate(json)
151+
152+
153+
@pytest.mark.parametrize("bad_value", ["MIDDLE", "middle"])
154+
def test_still_invalidates_bad_value(bad_value):
155+
json = {
156+
"lineNumber": 1,
157+
"description": "Change 1 to 2",
158+
"diffSide": bad_value,
159+
"packageActions": [
160+
{
161+
"action": "ADD",
162+
"package": "foo",
163+
"result": "COMPLETED",
164+
}
165+
],
166+
}
167+
168+
with pytest.raises(ValidationError):
169+
Change.model_validate(json)

0 commit comments

Comments
 (0)