"""Sport name normalisation.""" import re _MAPPING: dict[str, str] = { # cycling variants (FIT enums, GPX types, Strava API/CSV types) "cycling": "cycling", "biking": "cycling", "bike": "cycling", "ride": "cycling", "road_biking": "cycling", "road_cycling": "cycling", "mountain_biking": "cycling", "mountain_bike_ride": "cycling", "gravel_cycling": "cycling", "gravel_ride": "cycling", "cyclocross": "cycling", "indoor_cycling": "cycling", "indoor_ride": "cycling", "virtual_ride": "cycling", "e_biking": "cycling", "ebikeride": "cycling", "e_bike_ride": "cycling", "ebike_ride": "cycling", "handcycle": "cycling", "velomobile": "cycling", # running "running": "running", "run": "running", "trail_running": "running", "trail_run": "running", "treadmill_running": "running", "treadmill": "running", "virtual_run": "running", "outdoor_run": "running", "indoor_run": "running", "track_run": "running", # hiking "hiking": "hiking", "hike": "hiking", "outdoor_hike": "hiking", # walking "walking": "walking", "walk": "walking", "outdoor_walk": "walking", # skiing "skiing": "skiing", "cross_country_skiing": "skiing", "nordic_skiing": "skiing", "downhill_skiing": "skiing", "alpine_skiing": "skiing", "skate_skiing": "skiing", "backcountry_skiing": "skiing", # swimming "swimming": "swimming", "swim": "swimming", "open_water_swimming": "swimming", "lap_swimming": "swimming", } BAS_SPORTS = {"cycling", "running", "hiking", "walking", "swimming", "skiing", "other"} def normalise_sport(raw: object) -> str: if raw is None: return "other" key = str(raw).lower().strip().replace(" ", "_").replace("-", "_") # Strip leading date-like prefixes e.g. "20231117outdoor_run" → "outdoor_run" key = re.sub(r"^\d+", "", key) return _MAPPING.get(key, "other")