Skip to content

Commit e2ca80a

Browse files
committed
Better fix for retired gear
1 parent 2374c83 commit e2ca80a

File tree

2 files changed

+52
-44
lines changed

2 files changed

+52
-44
lines changed

garminconnect/__init__.py

Lines changed: 51 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,6 @@ def _validate_json_exists(response: requests.Response) -> dict[str, Any] | None:
9797
return response.json()
9898

9999

100-
def _is_gear_removed(gearUUID: str) -> bool:
101-
"""Check if gear has been removed/retired (Garmin returns 'REMOVED' as UUID)."""
102-
return str(gearUUID) == "REMOVED"
103-
104-
105100
class Garmin:
106101
"""Class for fetching data from Garmin Connect."""
107102

@@ -1879,16 +1874,20 @@ def get_gear(self, userProfileNumber: str) -> dict[str, Any]:
18791874
return self.connectapi(url)
18801875

18811876
def get_gear_stats(self, gearUUID: str) -> dict[str, Any]:
1882-
# Check if gear has been removed/retired
1883-
if _is_gear_removed(gearUUID):
1884-
logger.warning(
1885-
"Cannot get stats for removed/retired gear (UUID: %s)", gearUUID
1886-
)
1887-
return {}
1888-
18891877
url = f"{self.garmin_connect_gear_baseurl}/stats/{gearUUID}"
18901878
logger.debug("Requesting gear stats for gearUUID %s", gearUUID)
1891-
return self.connectapi(url)
1879+
1880+
try:
1881+
return self.connectapi(url)
1882+
except GarthHTTPError as e:
1883+
status = getattr(getattr(e.error, "response", None), "status_code", None)
1884+
if status == 404:
1885+
logger.warning(
1886+
"Gear stats not found for UUID %s (likely retired/removed gear)",
1887+
gearUUID,
1888+
)
1889+
return {}
1890+
raise
18921891

18931892
def get_gear_defaults(self, userProfileNumber: str) -> dict[str, Any]:
18941893
url = (
@@ -1901,19 +1900,22 @@ def get_gear_defaults(self, userProfileNumber: str) -> dict[str, Any]:
19011900
def set_gear_default(
19021901
self, activityType: str, gearUUID: str, defaultGear: bool = True
19031902
) -> Any:
1904-
# Check if gear has been removed/retired
1905-
if _is_gear_removed(gearUUID):
1906-
raise GarminConnectConnectionError(
1907-
"Cannot set default for removed/retired gear"
1908-
)
1909-
19101903
defaultGearString = "/default/true" if defaultGear else ""
19111904
method_override = "PUT" if defaultGear else "DELETE"
19121905
url = (
19131906
f"{self.garmin_connect_gear_baseurl}/{gearUUID}/"
19141907
f"activityType/{activityType}{defaultGearString}"
19151908
)
1916-
return self.garth.request(method_override, "connectapi", url, api=True)
1909+
1910+
try:
1911+
return self.garth.request(method_override, "connectapi", url, api=True)
1912+
except GarthHTTPError as e:
1913+
status = getattr(getattr(e.error, "response", None), "status_code", None)
1914+
if status == 404:
1915+
raise GarminConnectConnectionError(
1916+
f"Cannot set gear default for UUID {gearUUID}: gear not found (likely retired/removed)"
1917+
) from e
1918+
raise
19171919

19181920
class ActivityDownloadFormat(Enum):
19191921
"""Activity variables."""
@@ -2054,21 +2056,23 @@ def get_gear_activities(
20542056
:return: List of activities where the specified gear was used
20552057
"""
20562058
gearUUID = str(gearUUID)
2057-
2058-
# Check if gear has been removed/retired
2059-
if _is_gear_removed(gearUUID):
2060-
logger.warning(
2061-
"Cannot get activities for removed/retired gear (UUID: %s)", gearUUID
2062-
)
2063-
return []
2064-
20652059
limit = _validate_positive_integer(limit, "limit")
20662060
# Optional: enforce a reasonable ceiling to avoid heavy responses
20672061
limit = min(limit, MAX_ACTIVITY_LIMIT)
20682062
url = f"{self.garmin_connect_activities_baseurl}{gearUUID}/gear?start=0&limit={limit}"
20692063
logger.debug("Requesting activities for gearUUID %s", gearUUID)
20702064

2071-
return self.connectapi(url)
2065+
try:
2066+
return self.connectapi(url)
2067+
except GarthHTTPError as e:
2068+
status = getattr(getattr(e.error, "response", None), "status_code", None)
2069+
if status == 404:
2070+
logger.warning(
2071+
"Gear activities not found for UUID %s (likely retired/removed gear)",
2072+
gearUUID,
2073+
)
2074+
return []
2075+
raise
20722076

20732077
def add_gear_to_activity(
20742078
self, gearUUID: str, activity_id: int | str
@@ -2087,18 +2091,20 @@ def add_gear_to_activity(
20872091
gearUUID = str(gearUUID)
20882092
activity_id = _validate_positive_integer(int(activity_id), "activity_id")
20892093

2090-
# Check if gear has been removed/retired
2091-
if _is_gear_removed(gearUUID):
2092-
raise GarminConnectConnectionError(
2093-
"Cannot add removed/retired gear to activity"
2094-
)
2095-
20962094
url = (
20972095
f"{self.garmin_connect_gear_baseurl}/link/{gearUUID}/activity/{activity_id}"
20982096
)
20992097
logger.debug("Linking gear %s to activity %s", gearUUID, activity_id)
21002098

2101-
return self.garth.put("connectapi", url).json()
2099+
try:
2100+
return self.garth.put("connectapi", url).json()
2101+
except GarthHTTPError as e:
2102+
status = getattr(getattr(e.error, "response", None), "status_code", None)
2103+
if status == 404:
2104+
raise GarminConnectConnectionError(
2105+
f"Cannot add gear {gearUUID} to activity {activity_id}: gear not found (likely retired/removed)"
2106+
) from e
2107+
raise
21022108

21032109
def remove_gear_from_activity(
21042110
self, gearUUID: str, activity_id: int | str
@@ -2117,16 +2123,18 @@ def remove_gear_from_activity(
21172123
gearUUID = str(gearUUID)
21182124
activity_id = _validate_positive_integer(int(activity_id), "activity_id")
21192125

2120-
# Check if gear has been removed/retired
2121-
if _is_gear_removed(gearUUID):
2122-
raise GarminConnectConnectionError(
2123-
"Cannot remove removed/retired gear from activity"
2124-
)
2125-
21262126
url = f"{self.garmin_connect_gear_baseurl}/unlink/{gearUUID}/activity/{activity_id}"
21272127
logger.debug("Unlinking gear %s from activity %s", gearUUID, activity_id)
21282128

2129-
return self.garth.put("connectapi", url).json()
2129+
try:
2130+
return self.garth.put("connectapi", url).json()
2131+
except GarthHTTPError as e:
2132+
status = getattr(getattr(e.error, "response", None), "status_code", None)
2133+
if status == 404:
2134+
raise GarminConnectConnectionError(
2135+
f"Cannot remove gear {gearUUID} from activity {activity_id}: gear not found (likely retired/removed)"
2136+
) from e
2137+
raise
21302138

21312139
def get_user_profile(self) -> dict[str, Any]:
21322140
"""Get all users settings."""

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "garminconnect"
3-
version = "0.2.32"
3+
version = "0.2.33"
44
description = "Python 3 API wrapper for Garmin Connect"
55
authors = [
66
{name = "Ron Klinkien", email = "[email protected]"},

0 commit comments

Comments
 (0)