From 90ba74e5419d9f0195ab3360ad5815962400ce58 Mon Sep 17 00:00:00 2001 From: Damian Zamolski Date: Wed, 5 Aug 2026 12:03:43 +0200 Subject: [PATCH 1/2] fix(filters): match multi-word character ids name_to_id underscored spaces, but official ids have no separator (snakecharmer, not snake_charmer), so include/exclude silently matched nothing for multi-word characters. Co-Authored-By: Claude Opus 4.8 --- scripts/filters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/filters.py b/scripts/filters.py index 99aff93..f6f29d7 100644 --- a/scripts/filters.py +++ b/scripts/filters.py @@ -46,7 +46,7 @@ def exclude_characters(queryset, value): def name_to_id(name: str): - return name.replace(" ", "_").replace("'", "").lower() + return name.replace(" ", "").replace("'", "").lower() class BaseScriptVersionFilter(filters.FilterSet): From 1efcb00f096c1d2386f22cb07ad9ef5e519ec673 Mon Sep 17 00:00:00 2001 From: Damian Zamolski Date: Wed, 5 Aug 2026 12:08:41 +0200 Subject: [PATCH 2/2] test(script_json): cover name_to_id Move name_to_id to script_json so it is importable without the Django app registry (tests.settings is empty by design), then add unit tests for the space/apostrophe/case normalisation. Co-Authored-By: Claude Opus 4.8 --- scripts/filters.py | 8 ++------ scripts/script_json.py | 4 ++++ tests/test_name_to_id.py | 21 +++++++++++++++++++++ 3 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 tests/test_name_to_id.py diff --git a/scripts/filters.py b/scripts/filters.py index f6f29d7..aca0e1b 100644 --- a/scripts/filters.py +++ b/scripts/filters.py @@ -32,7 +32,7 @@ def include_characters(queryset, value): character = script_json.strip_special_characters(character.strip()) if character in ",;:/": continue - queryset = queryset.filter(content__contains=[{"id": name_to_id(character)}]) + queryset = queryset.filter(content__contains=[{"id": script_json.name_to_id(character)}]) return queryset @@ -41,14 +41,10 @@ def exclude_characters(queryset, value): character = script_json.strip_special_characters(character.strip()) if character in ",;:/": continue - queryset = queryset.exclude(content__contains=[{"id": name_to_id(character)}]) + queryset = queryset.exclude(content__contains=[{"id": script_json.name_to_id(character)}]) return queryset -def name_to_id(name: str): - return name.replace(" ", "").replace("'", "").lower() - - class BaseScriptVersionFilter(filters.FilterSet): all_scripts = django_filters.filters.BooleanFilter( method="display_all_scripts", diff --git a/scripts/script_json.py b/scripts/script_json.py index bd9f740..7f2b7a4 100644 --- a/scripts/script_json.py +++ b/scripts/script_json.py @@ -50,6 +50,10 @@ def strip_special_characters(character_id): return character_id.replace("_", "").replace("-", "").lower() +def name_to_id(name): + return name.replace(" ", "").replace("'", "").lower() + + def strip_special_characters_from_json(json): new_json = [] for item in json: diff --git a/tests/test_name_to_id.py b/tests/test_name_to_id.py new file mode 100644 index 0000000..d564e51 --- /dev/null +++ b/tests/test_name_to_id.py @@ -0,0 +1,21 @@ +import pytest + +from scripts.script_json import name_to_id + + +@pytest.mark.parametrize( + "name, expected", + [ + ("Snake Charmer", "snakecharmer"), + ("Mutant", "mutant"), + ("Fortune Teller", "fortuneteller"), + ("Pit-Hag", "pit-hag"), + ("Lil' Monsta", "lilmonsta"), + ("snakecharmer", "snakecharmer"), + ("SNAKE CHARMER", "snakecharmer"), + (" Snake Charmer ", "snakecharmer"), + ("", ""), + ], +) +def test_name_to_id(name, expected): + assert name_to_id(name) == expected