records: exclude indoor/treadmill/virtual sub_sport; rebuild athlete.json on bake

- fit.py: map FIT sub_sport 'treadmill' and 'virtual' to 'indoor'
- writer.py: broaden _is_outdoor to catch all indoor sub_sport variants
- render/cli.py: rebuild athlete.json from index.json on every bake so
  records never go stale when the exclusion logic changes
This commit is contained in:
Davide Scaini
2026-05-14 23:37:54 +02:00
parent b509db4940
commit 1ce94b8536
3 changed files with 35 additions and 1 deletions
+30
View File
@@ -105,6 +105,35 @@ def _bake_tracks(data: Path, handle: str | None = None) -> None:
console.print(f" [yellow]{user_dir.name}[/yellow]: bake_tracks failed: {exc}")
def _rebuild_athlete_json(data: Path, handle: str | None = None) -> None:
"""Rebuild athlete.json for one user or all users from their current index.json."""
import json
from bincio.extract.writer import write_athlete_json
targets = [data / handle] if handle else _user_dirs(data)
_COMPUTED = {"bas_version", "generated_at", "power_curve", "records", "best_climbs"}
for user_dir in targets:
index_path = user_dir / "index.json"
if not index_path.exists():
continue
try:
index_data = json.loads(index_path.read_text(encoding="utf-8"))
summaries = index_data.get("activities", [])
if not summaries:
continue
athlete_config: dict = {}
athlete_path = user_dir / "athlete.json"
if athlete_path.exists():
try:
existing = json.loads(athlete_path.read_text(encoding="utf-8"))
athlete_config = {k: v for k, v in existing.items() if k not in _COMPUTED}
except Exception:
pass
write_athlete_json(summaries, user_dir, athlete_config)
except Exception as exc:
console.print(f" [yellow]{user_dir.name}[/yellow]: rebuild_athlete failed: {exc}")
def _write_root_manifest(data: Path) -> None:
"""Rewrite the root index.json shard manifest from current user dirs."""
import json
@@ -207,6 +236,7 @@ def render(
console.print(f"Data: [cyan]{data}[/cyan]")
_merge_edits(data, handle=handle)
_rebuild_athlete_json(data, handle=handle)
_bake_tracks(data, handle=handle)
_write_root_manifest(data)