Skip to content

Commit

Permalink
feat: allow creating LogFilter object from Nones (coercing to empty…
Browse files Browse the repository at this point in the history
… list / dict when possible) (#2506)
  • Loading branch information
antazoey authored Feb 13, 2025
1 parent cdcddf5 commit 70680ab
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
12 changes: 11 additions & 1 deletion src/ape/types/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class LogFilter(BaseModel):
@classmethod
def compute_selectors(cls, values):
values["selectors"] = {
encode_hex(keccak(text=event.selector)): event for event in values.get("events", [])
encode_hex(keccak(text=event.selector)): event for event in values.get("events") or []
}

return values
Expand All @@ -48,6 +48,16 @@ def compute_selectors(cls, values):
def validate_start_block(cls, value):
return value or 0

@field_validator("addresses", "events", "topic_filter", mode="before")
@classmethod
def _convert_none_to_empty_list(cls, value):
return value or []

@field_validator("selectors", mode="before")
@classmethod
def _convert_none_to_dict(cls, value):
return value or {}

def model_dump(self, *args, **kwargs):
_Hash32 = Union[Hash32, HexBytes, HexStr]
topics = cast(Sequence[Optional[Union[_Hash32, Sequence[_Hash32]]]], self.topic_filter)
Expand Down
10 changes: 10 additions & 0 deletions tests/functional/test_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,16 @@ def test_topic_filter_encoding():
]


def test_log_filter_model_validate_coerces_nones():
log_filter = LogFilter.model_validate(
{"addresses": None, "events": None, "topic_filter": None, "selectors": None}
)
assert log_filter.addresses == []
assert log_filter.events == []
assert log_filter.topic_filter == []
assert log_filter.selectors == {}


def test_address_type(owner):
class MyModel(BaseModel):
addr: AddressType
Expand Down

0 comments on commit 70680ab

Please sign in to comment.