Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 17 additions & 95 deletions oura_api_client/models/daily_sleep.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
from pydantic import BaseModel, Field
from typing import List, Optional

from datetime import date, datetime



class SleepContributors(BaseModel):
deep_sleep: Optional[int] = Field(
None, alias="deep_sleep"
)
deep_sleep: Optional[int] = Field(None, alias="deep_sleep")
efficiency: Optional[int] = Field(None, alias="efficiency")
latency: Optional[int] = Field(None, alias="latency")
rem_sleep: Optional[int] = Field(None, alias="rem_sleep") # REM sleep in minutes
Expand All @@ -17,112 +13,38 @@ class SleepContributors(BaseModel):
total_sleep: Optional[int] = Field(None, alias="total_sleep") # Total sleep in minutes






class DailySleepModel(BaseModel):
id: str
contributors: SleepContributors
day: date
timestamp: datetime
score: Optional[int] = Field(




None, alias="score"




)
score: Optional[int] = Field(None, alias="score")
bedtime_end: Optional[datetime] = Field(None, alias="bedtime_end")
bedtime_start: Optional[datetime] = Field(None, alias="bedtime_start")
breath_average: Optional[float] = Field(None, alias="breath_average")
deep_sleep_duration: Optional[int] = Field(

None, alias="deep_sleep_duration"

)
deep_sleep_duration: Optional[int] = Field(None, alias="deep_sleep_duration")
efficiency: Optional[int] = Field(None, alias="efficiency")
heart_rate_average: Optional[float] = Field(

None, alias="heart_rate_average"

)
heart_rate_lowest: Optional[float] = Field(

None, alias="heart_rate_lowest"

)
heart_rate_average: Optional[float] = Field(None, alias="heart_rate_average")
heart_rate_lowest: Optional[float] = Field(None, alias="heart_rate_lowest")
hypnogram_5_min: Optional[str] = Field(None, alias="hypnogram_5_min")
latency: Optional[int] = Field(None, alias="latency")
light_sleep_duration: Optional[int] = Field(

None, alias="light_sleep_duration"

)
light_sleep_duration: Optional[int] = Field(None, alias="light_sleep_duration")
low_battery_alert: Optional[bool] = Field(None, alias="low_battery_alert")
readiness_score_delta: Optional[int] = Field(

None, alias="readiness_score_delta"

)
rem_sleep_duration: Optional[int] = Field(

None, alias="rem_sleep_duration"

)
readiness_score_delta: Optional[int] = Field(None, alias="readiness_score_delta")
rem_sleep_duration: Optional[int] = Field(None, alias="rem_sleep_duration")
restless_periods: Optional[int] = Field(None, alias="restless_periods")
sleep_phase_5_min: Optional[str] = Field(

None, alias="sleep_phase_5_min"

) # Deprecated
sleep_phase_5_min: Optional[str] = Field(None, alias="sleep_phase_5_min") # Deprecated
time_in_bed: Optional[int] = Field(None, alias="time_in_bed")
total_sleep_duration: Optional[int] = Field(

None, alias="total_sleep_duration"

)
type: Optional[str] = Field(

None, alias="type"

) # Enum: "deleted", "long_sleep", "main_sleep", "nap", "rest"
total_sleep_duration: Optional[int] = Field(None, alias="total_sleep_duration")
type: Optional[str] = Field(None, alias="type") # Enum: "deleted", "long_sleep", "main_sleep", "nap", "rest"
average_hrv: Optional[float] = Field(None, alias="average_hrv")
awake_time: Optional[int] = Field(None, alias="awake_time")
hr_60_second_average: Optional[List[int]] = Field(

None, alias="hr_60_second_average"

) # New in v2.10
hrv_4_hour_average: Optional[List[float]] = Field(

None, alias="hrv_4_hour_average"

) # New in v2.10
readiness: Optional[str] = Field(

None, alias="readiness"

) # New in v2.10, but type not specified, assuming string for now
temperature_delta: Optional[float] = Field(

None, alias="temperature_delta"

)
temperature_deviation: Optional[float] = Field(

None, alias="temperature_deviation"

) # Deprecated
temperature_trend_deviation: Optional[float] = Field(

None, alias="temperature_trend_deviation"

)
hr_60_second_average: Optional[List[int]] = Field(None, alias="hr_60_second_average") # New in v2.10
hrv_4_hour_average: Optional[List[float]] = Field(None, alias="hrv_4_hour_average") # New in v2.10
readiness: Optional[str] = Field(None, alias="readiness") # New in v2.10, but type not specified, assuming string for now
temperature_delta: Optional[float] = Field(None, alias="temperature_delta")
temperature_deviation: Optional[float] = Field(None, alias="temperature_deviation") # Deprecated
temperature_trend_deviation: Optional[float] = Field(None, alias="temperature_trend_deviation")


class DailySleepResponse(BaseModel):
Expand Down
39 changes: 17 additions & 22 deletions oura_api_client/models/heartrate.py
Original file line number Diff line number Diff line change
@@ -1,55 +1,50 @@
"""Models for heart rate data."""

from dataclasses import dataclass
from pydantic import BaseModel
from typing import List, Optional
from datetime import datetime


@dataclass

class HeartRateSample:
class HeartRateSample(BaseModel):
"""Represents a single heart rate data point."""

timestamp: datetime
bpm: int
source: str

@classmethod
def from_dict(cls, data: dict) -> "HeartRateSample":
"""Create a HeartRateSample from API response dictionary.


Note: This method is kept for backward compatibility.
Pydantic can parse directly from dict using HeartRateSample(**data)

Args:
data: Dictionary containing heart rate data

Returns:
HeartRateSample: Instantiated object
"""
return cls(
timestamp=datetime.fromisoformat(data["timestamp"]),
bpm=data["bpm"],
source=data["source"],
)
return cls(**data)


@dataclass

class HeartRateResponse:
class HeartRateResponse(BaseModel):
"""Represents the full heart rate response."""

data: List[HeartRateSample]
next_token: Optional[str] = None

@classmethod
def from_dict(cls, response: dict) -> "HeartRateResponse":
"""Create a HeartRateResponse from API response dictionary.


Note: This method is kept for backward compatibility.
Pydantic can parse directly from dict using HeartRateResponse(**response)

Args:
response: Dictionary containing API response

Returns:
HeartRateResponse: Instantiated object
"""
return cls(
data=[HeartRateSample.from_dict(item) for item in response.get("data", [])],
next_token=response.get("next_token"),
)
return cls(**response)
29 changes: 9 additions & 20 deletions oura_api_client/models/personal.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
"""Models for personal information data."""

from dataclasses import dataclass
from pydantic import BaseModel
from typing import Optional
from datetime import date


@dataclass

class PersonalInfo:
class PersonalInfo(BaseModel):
"""Represents personal information for a user."""

id: str
email: str
age: int
Expand All @@ -21,23 +19,14 @@ class PersonalInfo:
@classmethod
def from_dict(cls, data: dict) -> "PersonalInfo":
"""Create a PersonalInfo object from API response dictionary.


Note: This method is kept for backward compatibility.
Pydantic can parse directly from dict using PersonalInfo(**data)

Args:
data: Dictionary containing personal info data

Returns:
PersonalInfo: Instantiated object
"""
birth_date = None
if data.get("birth_date"):
birth_date = date.fromisoformat(data["birth_date"])

return cls(
id=data["id"],
email=data["email"],
age=data["age"],
weight=data.get("weight"),
height=data.get("height"),
biological_sex=data.get("biological_sex"),
birth_date=birth_date,
)
return cls(**data)
Loading