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

1""" 

2Pydantic models for body metrics (weight, body composition). 

3""" 

4 

5from datetime import date as date_type, datetime 

6from typing import Optional, Dict, Any 

7from pydantic import BaseModel, Field 

8 

9 

10class WeightData(BaseModel): 

11 """Body weight measurement.""" 

12 

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 ) 

37 

38 

39class BodyComposition(BaseModel): 

40 """Detailed body composition metrics.""" 

41 

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 )