from typing import Optional, Any from dataclasses import dataclass, field # A nomie habit tracker. Tracks anything whose value can be encapsulated in a numerical value. @dataclass(frozen=True) class Tracker: color: str emoji: str hidden: bool id: str ignore_zeros: bool label: str math: str one_tap: bool tag: str type: str uom: str # TODO no idea what include does include: str min: Optional[int] = 0 max: Optional[int] = 0 goal: Optional[int] = 0 default: Optional[int] = 0 # TODO score can be string (if custom) or int (if simple good/bad) score: Optional[str] = "" score_calc: Optional[list[dict[str, Any]]] = field(default_factory=lambda: []) @dataclass(frozen=True) class Activity: tracker: Tracker value: Optional[int] = 1 # A nomie note. Records any circumstance of 'something happened' through prose. # These are undigested events, whose changed trackers are still encapsulated # in the 'note' field as continuous text. @dataclass(frozen=True) class Event: id: str start: int end: int text: str activities: Optional[list[Activity]] = field(default_factory=lambda: []) score: Optional[int] = 0 lat: Optional[float] = 0.0 lng: Optional[float] = 0.0 location: Optional[str] = "" modified: Optional[bool] = False offset: Optional[str] = "" # local timezone offset? source: Optional[str] = "n5" # nomie version @dataclass(frozen=True) class NomieImport: version: str trackers: list[Tracker] events: list[Event]