Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: update latest glucose measurement model to include trend #56

Merged
merged 2 commits into from
Feb 1, 2025
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
4 changes: 2 additions & 2 deletions src/pylibrelinkup/models/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

from .base import ConfigBaseModel
from .config import AlarmRules
from .data import GlucoseMeasurement
from .data import GlucoseMeasurement, GlucoseMeasurementWithTrend
from .hardware import ActiveSensor, PatientDevice, Sensor

__all__ = ["GraphResponse", "LogbookResponse"]
Expand All @@ -29,7 +29,7 @@ class Connection(ConfigBaseModel):
uom: int = Field(default=0)
sensor: Sensor
alarm_rules: AlarmRules
glucose_measurement: GlucoseMeasurement
glucose_measurement: GlucoseMeasurementWithTrend = Field(alias="glucoseMeasurement")
glucose_item: GlucoseMeasurement
glucose_alarm: None
patient_device: PatientDevice
Expand Down
24 changes: 16 additions & 8 deletions src/pylibrelinkup/models/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"Patient",
"Trend",
"GlucoseMeasurement",
"GlucoseMeasurementTrend",
"GlucoseMeasurementWithTrend",
"F",
"L",
"H",
Expand Down Expand Up @@ -43,6 +43,17 @@ class Trend(IntEnum):
UP_SLOW = 4
UP_FAST = 5

@property
def indicator(self) -> str:
arrow_map: dict[Trend, str] = {
Trend.DOWN_FAST: "↓",
Trend.DOWN_SLOW: "↘",
Trend.STABLE: "→",
Trend.UP_SLOW: "↗",
Trend.UP_FAST: "↑",
}
return arrow_map[self]


class GlucoseMeasurement(ConfigBaseModel):
"""GlucoseMeasurement class to store glucose measurement data."""
Expand Down Expand Up @@ -84,13 +95,6 @@ def parse_timestamp(cls, v: str, info: ValidationInfo):
return datetime_value


class GlucoseMeasurementTrend(GlucoseMeasurement):
trend_arrow: Trend

def __str__(self):
return f"{super().__str__()} {self.trend_arrow}"


class F(ConfigBaseModel):
"""F class to store F data."""

Expand Down Expand Up @@ -132,3 +136,7 @@ class Std(ConfigBaseModel):
"""Std class to store Std data."""

sd: bool | None = Field(default=None)


class GlucoseMeasurementWithTrend(GlucoseMeasurement):
trend: Trend = Field(default=Trend.STABLE)
17 changes: 11 additions & 6 deletions tests/test_client_latest.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import responses

from pylibrelinkup import AuthenticationError, PatientNotFoundError
from pylibrelinkup.models.data import GlucoseMeasurement
from pylibrelinkup.models.data import GlucoseMeasurementWithTrend, Trend
from tests.conftest import graph_response_json
from tests.factories import PatientFactory

Expand Down Expand Up @@ -34,14 +34,15 @@ def test_latest_returns_glucose_measurement_for_valid_uuid(

result = pylibrelinkup_client.client.latest(patient_id)

assert isinstance(result, GlucoseMeasurement)
assert isinstance(result, GlucoseMeasurementWithTrend)

assert (
result.value_in_mg_per_dl
== graph_response_json["data"]["connection"]["glucoseMeasurement"][
"ValueInMgPerDl"
]
)
assert result.trend == Trend.STABLE


def test_latest_returns_glucose_measurement_for_valid_patient(
Expand All @@ -61,14 +62,15 @@ def test_latest_returns_glucose_measurement_for_valid_patient(

result = pylibrelinkup_client.client.latest(patient)

assert isinstance(result, GlucoseMeasurement)
assert isinstance(result, GlucoseMeasurementWithTrend)

assert (
result.value_in_mg_per_dl
== graph_response_json["data"]["connection"]["glucoseMeasurement"][
"ValueInMgPerDl"
]
)
assert result.trend == Trend.STABLE


def test_latest_returns_glucose_measurement_for_valid_string(
Expand All @@ -88,14 +90,15 @@ def test_latest_returns_glucose_measurement_for_valid_string(

result = pylibrelinkup_client.client.latest(patient_id)

assert isinstance(result, GlucoseMeasurement)
assert isinstance(result, GlucoseMeasurementWithTrend)

assert (
result.value_in_mg_per_dl
== graph_response_json["data"]["connection"]["glucoseMeasurement"][
"ValueInMgPerDl"
]
)
assert result.trend == Trend.STABLE


def test_latest_raises_value_error_for_invalid_uuid_string(
Expand Down Expand Up @@ -133,14 +136,15 @@ def test_latest_response_no_sd_returns_glucose_measurement(

result = pylibrelinkup_client.client.latest(patient_id)

assert isinstance(result, GlucoseMeasurement)
assert isinstance(result, GlucoseMeasurementWithTrend)

assert (
result.value_in_mg_per_dl
== graph_response_no_sd_json["data"]["connection"]["glucoseMeasurement"][
"ValueInMgPerDl"
]
)
assert result.trend == Trend.STABLE


def test_latest_response_no_alarm_rules_c_returns_glucose_measurement(
Expand All @@ -160,13 +164,14 @@ def test_latest_response_no_alarm_rules_c_returns_glucose_measurement(

result = pylibrelinkup_client.client.latest(patient_id)

assert isinstance(result, GlucoseMeasurement)
assert isinstance(result, GlucoseMeasurementWithTrend)
assert (
result.value_in_mg_per_dl
== graph_response_no_alarm_rules_c_json["data"]["connection"][
"glucoseMeasurement"
]["ValueInMgPerDl"]
)
assert result.trend == Trend.STABLE


def test_latest_patient_not_found_raises_patient_not_found_error(
Expand Down