Skip to content

Commit 70680ab

Browse files
authored
feat: allow creating LogFilter object from Nones (coercing to empty list / dict when possible) (#2506)
1 parent cdcddf5 commit 70680ab

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

src/ape/types/events.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class LogFilter(BaseModel):
3838
@classmethod
3939
def compute_selectors(cls, values):
4040
values["selectors"] = {
41-
encode_hex(keccak(text=event.selector)): event for event in values.get("events", [])
41+
encode_hex(keccak(text=event.selector)): event for event in values.get("events") or []
4242
}
4343

4444
return values
@@ -48,6 +48,16 @@ def compute_selectors(cls, values):
4848
def validate_start_block(cls, value):
4949
return value or 0
5050

51+
@field_validator("addresses", "events", "topic_filter", mode="before")
52+
@classmethod
53+
def _convert_none_to_empty_list(cls, value):
54+
return value or []
55+
56+
@field_validator("selectors", mode="before")
57+
@classmethod
58+
def _convert_none_to_dict(cls, value):
59+
return value or {}
60+
5161
def model_dump(self, *args, **kwargs):
5262
_Hash32 = Union[Hash32, HexBytes, HexStr]
5363
topics = cast(Sequence[Optional[Union[_Hash32, Sequence[_Hash32]]]], self.topic_filter)

tests/functional/test_types.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,16 @@ def test_topic_filter_encoding():
117117
]
118118

119119

120+
def test_log_filter_model_validate_coerces_nones():
121+
log_filter = LogFilter.model_validate(
122+
{"addresses": None, "events": None, "topic_filter": None, "selectors": None}
123+
)
124+
assert log_filter.addresses == []
125+
assert log_filter.events == []
126+
assert log_filter.topic_filter == []
127+
assert log_filter.selectors == {}
128+
129+
120130
def test_address_type(owner):
121131
class MyModel(BaseModel):
122132
addr: AddressType

0 commit comments

Comments
 (0)