@@ -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-
105100class 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."""
0 commit comments