From a95cb2173c89194b6d3a5aa3f64f702b56a26ca0 Mon Sep 17 00:00:00 2001 From: Will Newton Date: Mon, 19 Oct 2026 17:51:11 +0100 Subject: [PATCH] fix: use the filter key in is_relevant instead of always matching type Filters were all compared against event["type"]["name"], so filtering on any other attribute (e.g. player) silently matched nothing. Closes #81 Co-Authored-By: Claude Sonnet 5.5 --- statsbombpy/helpers.py | 8 +++++- tests/statsbombpy_test/test_helpers.py | 35 ++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 tests/statsbombpy_test/test_helpers.py diff --git a/statsbombpy/helpers.py b/statsbombpy/helpers.py index 538ca8b..c777b93 100755 --- a/statsbombpy/helpers.py +++ b/statsbombpy/helpers.py @@ -86,8 +86,14 @@ def filter_and_group_events(events, filters, fmt, flatten_attrs): return events_ +def _attr_value(event, key): + # attributes like type/player/team are {"id", "name"} dicts; others are scalars + value = event.get(key) + return value.get("name") if isinstance(value, dict) else value + + def is_relevant(event, filters): - return all(event.get("type", {}).get("name") == v for k, v in filters.items()) + return all(_attr_value(event, k) == v for k, v in filters.items()) def reduce_events(all_events: dict, fmt: str) -> dict: diff --git a/tests/statsbombpy_test/test_helpers.py b/tests/statsbombpy_test/test_helpers.py new file mode 100644 index 0000000..c3fdaa5 --- /dev/null +++ b/tests/statsbombpy_test/test_helpers.py @@ -0,0 +1,35 @@ +from statsbombpy.helpers import is_relevant + +EV = { + "type": {"name": "Pass"}, + "player": {"name": "Lionel Messi"}, + "minute": 10, +} + + +def test_filter_on_type(): + assert is_relevant(EV, {"type": "Pass"}) + assert not is_relevant(EV, {"type": "Shot"}) + + +def test_filter_uses_the_given_key(): + assert is_relevant(EV, {"player": "Lionel Messi"}) + assert not is_relevant(EV, {"player": "Pass"}) + + +def test_filter_on_scalar_attribute(): + assert is_relevant(EV, {"minute": 10}) + assert not is_relevant(EV, {"minute": 11}) + + +def test_filter_on_missing_attribute_does_not_match(): + assert not is_relevant(EV, {"team": "Barcelona"}) + + +def test_multiple_filters_are_anded(): + assert is_relevant(EV, {"type": "Pass", "player": "Lionel Messi"}) + assert not is_relevant(EV, {"type": "Shot", "player": "Lionel Messi"}) + + +def test_no_filters_matches_everything(): + assert is_relevant(EV, {})