Skip to content

Commit

Permalink
Merge pull request #56 from robberwick/trends
Browse files Browse the repository at this point in the history
feat: update latest glucose measurement model to include trend
  • Loading branch information
robberwick authored Feb 1, 2025
2 parents 43f6f80 + 1e959e8 commit d7640b8
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 16 deletions.
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

0 comments on commit d7640b8

Please sign in to comment.