Skip to content

Commit bab71d4

Browse files
committed
Refactor access_token and a bit of cleanup
1 parent 45789f8 commit bab71d4

File tree

4 files changed

+36
-27
lines changed

4 files changed

+36
-27
lines changed

tesla_fleet_api/tesla/fleet.py

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

33
from json import dumps
4-
from typing import Any, Awaitable, Callable, Literal, TYPE_CHECKING
4+
from typing import TYPE_CHECKING, Any, Awaitable, Callable, Literal
55

66
import aiohttp
77

@@ -28,10 +28,9 @@
2828
class TeslaFleetApi(Tesla):
2929
"""Class describing the Tesla Fleet API."""
3030

31-
access_token: str | Callable[[], Awaitable[str | None]] | None
31+
_access_token: str | Callable[[], Awaitable[str | None]] | None
3232
server: str | None = None
3333
session: aiohttp.ClientSession
34-
headers: dict[str, str]
3534
charging: "Charging"
3635
energySites: "EnergySites"
3736
user: "User"
@@ -40,8 +39,8 @@ class TeslaFleetApi(Tesla):
4039

4140
def __init__(
4241
self,
43-
session: aiohttp.ClientSession,
44-
access_token: str | Callable[[], Awaitable[str | None]] | None,
42+
session: aiohttp.ClientSession | None,
43+
access_token: str | Callable[[], Awaitable[str | None]] | None = None,
4544
region: Literal["na", "eu", "cn"] | None = None,
4645
server: str | None = None,
4746
charging_scope: bool = True,
@@ -52,9 +51,8 @@ def __init__(
5251
):
5352
"""Initialize the Tesla Fleet API."""
5453

55-
self.session = session
56-
self.access_token = access_token
57-
self.headers = {}
54+
self.session = session or aiohttp.ClientSession()
55+
self._access_token = access_token
5856

5957
if server is not None:
6058
self.server = server
@@ -92,12 +90,12 @@ async def find_server(self) -> str:
9290
continue
9391
raise LibraryError("Could not find a valid Tesla API server.")
9492

95-
async def _access_token(self) -> str:
93+
async def access_token(self) -> str:
9694
"""Get the access token for the Tesla Fleet API."""
97-
if callable(self.access_token):
98-
token = await self.access_token()
95+
if callable(self._access_token):
96+
token = await self._access_token()
9997
else:
100-
token = self.access_token
98+
token = self._access_token
10199

102100
if token is None:
103101
raise MissingToken
@@ -118,7 +116,7 @@ async def _request(
118116
if method == Method.GET:
119117
json = None
120118

121-
access_token = await self._access_token()
119+
access_token = await self.access_token()
122120

123121
headers = {
124122
"Authorization": f"Bearer {access_token}",
@@ -213,7 +211,7 @@ async def partner_login(
213211
if resp.ok:
214212
token_data = await resp.json()
215213
# Set the access token for subsequent API calls
216-
self.access_token = token_data["access_token"]
214+
self._access_token = token_data["access_token"]
217215
return token_data
218216
else:
219217
error_data = await resp.json()

tesla_fleet_api/tesla/oauth.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
import time
12
from typing import Any, Literal
3+
24
import aiohttp
3-
import time
45

6+
from tesla_fleet_api.const import SERVERS, Method, Scope
57
from tesla_fleet_api.tesla import TeslaFleetApi
6-
from tesla_fleet_api.const import Scope, SERVERS, Method
78

89

910
class TeslaFleetOAuth(TeslaFleetApi):
@@ -13,6 +14,7 @@ class TeslaFleetOAuth(TeslaFleetApi):
1314
refresh_token: str | None
1415
redirect_uri: str | None
1516
_client_secret: str | None
17+
_access_token: str | None
1618

1719
def __init__(
1820
self,
@@ -28,7 +30,7 @@ def __init__(
2830
self.client_id = client_id
2931
self._client_secret = client_secret
3032
self.redirect_uri = redirect_uri
31-
self.access_token = access_token
33+
self._access_token = access_token
3234
self.refresh_token = refresh_token
3335
self.expires = expires
3436

@@ -75,14 +77,22 @@ async def get_refresh_token(self, code: str) -> None:
7577
if resp.ok:
7678
data = await resp.json()
7779
self.refresh_token = data.get("refresh_token")
78-
self.access_token = data["access_token"]
80+
self._access_token = data["access_token"]
7981
self.expires = int(time.time()) + data["expires_in"]
8082
region = code.split("_")[0].lower()
8183
self.server = SERVERS.get(region)
8284

85+
async def access_token(self) -> str:
86+
"""Get the access token."""
87+
if self.expires < time.time():
88+
await self.refresh_access_token()
89+
if self._access_token:
90+
return self._access_token
91+
raise ValueError("Access token is missing")
92+
8393
async def check_access_token(self) -> dict[str, Any] | None:
8494
"""Get the access token."""
85-
if self.access_token and self.expires > time.time():
95+
if self._access_token and self.expires > time.time():
8696
return None
8797
return await self.refresh_access_token()
8898

@@ -100,7 +110,7 @@ async def refresh_access_token(self) -> dict[str, Any]:
100110
) as resp:
101111
data = await resp.json()
102112
if resp.ok:
103-
self.access_token = data["access_token"]
113+
self._access_token = data["access_token"]
104114
self.refresh_token = data["refresh_token"]
105115
self.expires = int(time.time()) + data["expires_in"]
106116
return {"refresh_token": self.refresh_token, "expires": self.expires}

tesla_fleet_api/teslemetry/teslemetry.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def __init__(
2121
"""Initialize the Teslemetry API."""
2222

2323
self.session = session
24-
self.access_token = access_token
24+
self._access_token = access_token
2525
self.server = server
2626

2727
self.charging = self.Charging(self)
@@ -110,7 +110,7 @@ async def migrate_to_oauth(
110110
self, client_id: str = "homeassistant", name: str | None = None
111111
) -> dict[str, Any]:
112112
"""Migrate from access token to OAuth."""
113-
access_token = await self._access_token()
113+
access_token = await self.access_token()
114114
migrate_data = {
115115
"grant_type": "migrate",
116116
"client_id": client_id,

tesla_fleet_api/tessie/tessie.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
import aiohttp
21
from typing import Any
32

4-
from tesla_fleet_api.tesla import TeslaFleetApi
3+
import aiohttp
4+
55
from tesla_fleet_api.const import Method
6+
from tesla_fleet_api.tesla import TeslaFleetApi
67
from tesla_fleet_api.tessie.vehicles import TessieVehicles
78

8-
class Tessie(TeslaFleetApi):
99

10-
server="https://api.tessie.com"
10+
class Tessie(TeslaFleetApi):
11+
server = "https://api.tessie.com"
1112
Vehicles = TessieVehicles
1213

1314
def __init__(
@@ -18,7 +19,7 @@ def __init__(
1819
"""Initialize the Tessie API."""
1920

2021
self.session = session
21-
self.access_token = access_token
22+
self._access_token = access_token
2223

2324
self.charging = self.Charging(self)
2425
self.energySites = self.EnergySites(self)

0 commit comments

Comments
 (0)