Coverage for health / models / body_metrics.py: 100%
25 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-02 17:44 +0800
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-02 17:44 +0800
1"""
2Pydantic models for body metrics (weight, body composition).
3"""
5from datetime import date as date_type, datetime
6from typing import Optional, Dict, Any
7from pydantic import BaseModel, Field
10class WeightData(BaseModel):
11 """Body weight measurement."""
13 date: date_type = Field(..., description="Date of measurement")
14 weight_kg: Optional[float] = Field(default=None, description="Weight in kilograms")
15 bmi: Optional[float] = Field(default=None, description="Body Mass Index")
16 body_fat_percentage: Optional[float] = Field(
17 default=None, description="Body fat percentage"
18 )
19 body_water_percentage: Optional[float] = Field(
20 default=None, description="Body water percentage"
21 )
22 bone_mass_kg: Optional[float] = Field(
23 default=None, description="Bone mass in kilograms"
24 )
25 muscle_mass_kg: Optional[float] = Field(
26 default=None, description="Muscle mass in kilograms"
27 )
28 timestamp: Optional[datetime] = Field(
29 default=None, description="Exact measurement time"
30 )
31 source: Optional[str] = Field(
32 default=None, description="Source of measurement (scale model, manual, etc.)"
33 )
34 raw_data: Optional[Dict[str, Any]] = Field(
35 default=None, description="Raw API response"
36 )
39class BodyComposition(BaseModel):
40 """Detailed body composition metrics."""
42 date: date_type = Field(..., description="Date of measurement")
43 weight_kg: Optional[float] = Field(default=None, description="Weight in kilograms")
44 bmi: Optional[float] = Field(default=None, description="Body Mass Index")
45 body_fat_percentage: Optional[float] = Field(
46 default=None, description="Body fat percentage"
47 )
48 skeletal_muscle_mass_kg: Optional[float] = Field(
49 default=None, description="Skeletal muscle mass in kilograms"
50 )
51 bone_mass_kg: Optional[float] = Field(
52 default=None, description="Bone mass in kilograms"
53 )
54 body_water_percentage: Optional[float] = Field(
55 default=None, description="Body water percentage"
56 )
57 visceral_fat_rating: Optional[int] = Field(
58 default=None, description="Visceral fat rating"
59 )
60 metabolic_age: Optional[int] = Field(
61 default=None, description="Metabolic age in years"
62 )
63 raw_data: Optional[Dict[str, Any]] = Field(
64 default=None, description="Raw API response"
65 )