Skip to content

Commit 5c8244a

Browse files
committed
Fix mypy typing issues across library
1 parent d7326fa commit 5c8244a

9 files changed

Lines changed: 100 additions & 45 deletions

File tree

tesla_fleet_api/tesla/bluetooth.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class TeslaBluetooth(Tesla):
2222

2323
def __init__(
2424
self,
25-
):
25+
) -> None:
2626
"""Initialize the Tesla Fleet API."""
2727

2828
self.vehicles = self.Vehicles(self)

tesla_fleet_api/tesla/fleet.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from collections.abc import Awaitable, Callable
44
from json import dumps
5-
from typing import TYPE_CHECKING, Any
5+
from typing import TYPE_CHECKING, Any, cast
66

77
import aiohttp
88

@@ -22,7 +22,6 @@
2222
from tesla_fleet_api.tesla.energysite import EnergySites
2323
from tesla_fleet_api.tesla.partner import Partner
2424
from tesla_fleet_api.tesla.user import User
25-
from tesla_fleet_api.tesla.vehicle.vehicles import Vehicles
2625

2726

2827
def _normalize_query_value(value: Any) -> Any:
@@ -44,7 +43,7 @@ class TeslaFleetApi(Tesla):
4443
energySites: "EnergySites"
4544
user: "User"
4645
partner: "Partner"
47-
vehicles: "Vehicles[TeslaFleetApi]"
46+
vehicles: Any
4847

4948
def __init__(
5049
self,
@@ -91,10 +90,16 @@ async def find_server(self) -> str:
9190
try:
9291
region_response = await self.user.region()
9392
response = region_response.get("response")
94-
if response:
95-
self.server = response["fleet_api_base_url"]
93+
if isinstance(response, dict):
94+
fleet_api_base_url = response.get("fleet_api_base_url")
95+
region = response.get("region")
96+
if not isinstance(fleet_api_base_url, str) or not isinstance(
97+
region, str
98+
):
99+
continue
100+
self.server = fleet_api_base_url
96101
LOGGER.debug("Using server %s", self.server)
97-
return response["region"]
102+
return region
98103
except InvalidRegion:
99104
continue
100105
raise LibraryError("Could not find a valid Tesla API server.")
@@ -168,8 +173,10 @@ async def _request(
168173
raise ResponseError(status=resp.status, data=await resp.text())
169174

170175
data = await resp.json()
176+
if not isinstance(data, dict):
177+
raise ResponseError(status=resp.status, data=str(data))
171178
LOGGER.debug("Response JSON: %s", data)
172-
return data
179+
return cast(dict[str, Any], data)
173180

174181
async def status(self) -> str:
175182
"""This endpoint returns the string "ok" if the API is operating normally. No HTTP headers are required."""
@@ -221,9 +228,14 @@ async def partner_login(
221228
) as resp:
222229
if resp.ok:
223230
token_data = await resp.json()
231+
if not isinstance(token_data, dict):
232+
raise ResponseError(status=resp.status, data=str(token_data))
233+
access_token = token_data.get("access_token")
234+
if not isinstance(access_token, str):
235+
raise ValueError("Partner login response did not include access_token")
224236
# Set the access token for subsequent API calls
225-
self._access_token = token_data["access_token"]
226-
return token_data
237+
self._access_token = access_token
238+
return cast(dict[str, Any], token_data)
227239
else:
228240
error_data = await resp.json()
229241
raise ValueError(f"Partner login failed: {error_data}")

tesla_fleet_api/tesla/tesla.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Tesla Fleet API for Python."""
22

33
from os.path import exists
4+
from typing import Any
45
import aiofiles
56

67
from tesla_fleet_api.tesla.charging import Charging
@@ -21,7 +22,7 @@ class Tesla:
2122
EnergySites = EnergySites
2223
Partner = Partner
2324
User = User
24-
Vehicles = Vehicles
25+
Vehicles: type[Any] = Vehicles
2526

2627
private_key: ec.EllipticCurvePrivateKey | None = None
2728

tesla_fleet_api/tesla/vehicle/bluetooth.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def __init__(self, callback: Callable[[RoutableMessage], None]):
114114
self.packet_starts: list[int] = []
115115
self.callback = callback
116116

117-
def receive_data(self, data: bytearray):
117+
def receive_data(self, data: bytearray) -> None:
118118
"""
119119
Receives a chunk of bytearray data and attempts to assemble a complete message.
120120
@@ -159,7 +159,7 @@ def receive_data(self, data: bytearray):
159159
else:
160160
return
161161

162-
def discard_packet(self):
162+
def discard_packet(self) -> None:
163163
"""Drop the current packet and resynchronize on the next candidate start byte."""
164164
self.packet_starts.pop(0)
165165
if len(self.packet_starts) > 0:
@@ -188,7 +188,7 @@ def __init__(
188188
vin: str,
189189
key: ec.EllipticCurvePrivateKey | None = None,
190190
device: BLEDevice | None = None,
191-
):
191+
) -> None:
192192
super().__init__(parent, vin, key)
193193
self.ble_name = "S" + hashlib.sha1(vin.encode("utf-8")).hexdigest()[:16] + "C"
194194
self._queues = {
@@ -450,6 +450,7 @@ async def query_display_name(self, max_attempts: int = 5) -> str | None:
450450
)
451451
except Exception as e:
452452
LOGGER.error(f"Failed to read device name: {e}")
453+
return None
453454

454455
async def query_appearance(self) -> bytearray | None:
455456
"""Read the device appearance via GATT characteristic if available"""
@@ -488,7 +489,7 @@ async def pair(
488489
role: Role = Role.ROLE_OWNER,
489490
form: KeyFormFactor = KeyFormFactor.KEY_FORM_FACTOR_CLOUD_KEY,
490491
timeout: int = 60,
491-
):
492+
) -> None:
492493
"""Pair the key."""
493494

494495
request = UnsignedMessage(
@@ -523,7 +524,7 @@ async def pair(
523524
)
524525
return
525526

526-
async def wake_up(self):
527+
async def wake_up(self) -> dict[str, Any]:
527528
"""Wake up the vehicle."""
528529
return await self._sendVehicleSecurity(
529530
UnsignedMessage(RKEAction=RKEAction_E.RKE_ACTION_WAKE_VEHICLE)

0 commit comments

Comments
 (0)