backend: initial commit
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
"""Core data models for the extract stage.
|
||||
|
||||
ParsedActivity is the internal representation produced by parsers.
|
||||
It gets fed into metrics computation and the BAS JSON writer.
|
||||
"""
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
|
||||
@dataclass
|
||||
class DataPoint:
|
||||
"""One measurement sample from a GPS/sensor recording."""
|
||||
|
||||
timestamp: datetime
|
||||
lat: Optional[float] = None
|
||||
lon: Optional[float] = None
|
||||
elevation_m: Optional[float] = None
|
||||
hr_bpm: Optional[int] = None
|
||||
cadence_rpm: Optional[int] = None
|
||||
# Speed from device (km/h). May be absent; we compute it from GPS if so.
|
||||
speed_kmh: Optional[float] = None
|
||||
power_w: Optional[int] = None
|
||||
temperature_c: Optional[float] = None
|
||||
# Cumulative distance from device (metres), if recorded.
|
||||
distance_m: Optional[float] = None
|
||||
|
||||
|
||||
@dataclass
|
||||
class LapData:
|
||||
index: int
|
||||
started_at: datetime
|
||||
duration_s: Optional[int] = None
|
||||
distance_m: Optional[float] = None
|
||||
elevation_gain_m: Optional[float] = None
|
||||
avg_speed_kmh: Optional[float] = None
|
||||
avg_hr_bpm: Optional[int] = None
|
||||
avg_power_w: Optional[int] = None
|
||||
|
||||
|
||||
@dataclass
|
||||
class ParsedActivity:
|
||||
"""Raw activity data as produced by a parser, before metric computation."""
|
||||
|
||||
points: list[DataPoint]
|
||||
sport: str # normalised to BAS sport enum
|
||||
started_at: datetime
|
||||
source_file: str # basename of original file
|
||||
source_hash: str # "sha256:{hex}"
|
||||
|
||||
sub_sport: Optional[str] = None
|
||||
device: Optional[str] = None
|
||||
title: Optional[str] = None
|
||||
description: Optional[str] = None
|
||||
gear: Optional[str] = None
|
||||
strava_id: Optional[str] = None
|
||||
laps: list[LapData] = field(default_factory=list)
|
||||
Reference in New Issue
Block a user