refactor: simplify AgeGroup enum and enhance normalization

Remove redundant ELIT variants from AgeGroup enum and implement case/spelling tolerant normalization function. The new normalize_age_group function handles case-insensitive matching and spelling variations (Elite/ELIT/Elit) while mapping to canonical enum values.

This reduces the enum from 15 to 13 entries while maintaining full backward compatibility.
This commit is contained in:
2025-08-15 07:50:26 +02:00
parent 6b09a95a45
commit ea696ed361

View File

@@ -102,8 +102,6 @@ class AgeGroup(str, Enum):
u13p = "U13 (Prép)"
u14ev = "U14 (Elite Vernets)"
u14esmv = "U14 (Elite Sous-Moulin/Vergers)"
u14elsmv = "U14 (ELIT Sous-Moulin/Vergers)"
u14elv = "U14 (ELIT Vernets)"
u15t = "U15 (Top)"
u15a = "U15 (A)"
u16e = "U16 (Elite)"
@@ -113,6 +111,38 @@ class AgeGroup(str, Enum):
u21e = "U21 (ELIT)"
def normalize_age_group(value: str) -> AgeGroup | None:
"""Normalize age group string to handle case and spelling variations."""
import re
if not isinstance(value, str):
return None
def normalize_spelling(text: str) -> str:
"""Normalize spelling variations of 'elit' to 'elite'."""
# Replace accented versions first
text = text.replace("élit", "elite")
# Use regex to replace "elit" with "elite" only when it's a complete word
# This avoids replacing "elit" within "elite"
text = re.sub(r"\belit\b", "elite", text)
return text
# Convert to lowercase for case-insensitive comparison
input_lower = value.lower()
input_normalized = normalize_spelling(input_lower)
for member in AgeGroup:
# Convert enum value to lowercase and normalize
member_lower = member.value.lower()
member_normalized = normalize_spelling(member_lower)
# Check for match
if member_normalized == input_normalized:
return member
return None
class EventType(str, Enum):
game = "game"
practice = "practice"
@@ -396,9 +426,9 @@ def parse_schedule(
data = json.loads(sanitized_content)
# age_group filter
if age_group:
events = [x for x in data if x["agegroup"] == age_group]
events = [x for x in data if normalize_age_group(x["agegroup"]) == age_group]
else:
events = [x for x in data if x["agegroup"] in AgeGroup]
events = [x for x in data if normalize_age_group(x["agegroup"]) is not None]
# event_type filter
if event_type_filter:
if event_type_filter.value == EventType.game:
@@ -438,7 +468,9 @@ def check_with_ai(
sys.exit(1)
with schedule_file.open("r") as f:
schedule_data = json.load(f)
schedule_data = [x for x in schedule_data if x["agegroup"] in AgeGroup]
schedule_data = [
x for x in schedule_data if normalize_age_group(x["agegroup"]) is not None
]
for event in schedule_data:
event["team"] = event["agegroup"].replace("(", "").replace(")", "")
del event["agegroup"]