Skip to content
This repository was archived by the owner on Jun 28, 2024. It is now read-only.

Commit 000a164

Browse files
authored
feat: Merge pull request #53 from seamapi/feat-centralized-requests
BREAKING CHANGE: thrown exceptions will now be slightly different
2 parents c378211 + 3d62e19 commit 000a164

File tree

14 files changed

+285
-250
lines changed

14 files changed

+285
-250
lines changed

seamapi/access_codes.py

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,13 @@ def list(self, device: Union[DeviceId, Device]) -> List[AccessCode]:
6767
"""
6868

6969
device_id = to_device_id(device)
70-
res = requests.get(
71-
f"{self.seam.api_url}/access_codes/list?device_id={device_id}",
72-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
70+
res = self.seam.make_request(
71+
"GET",
72+
"/access_codes/list",
73+
params={"device_id": device_id},
7374
)
74-
if not res.ok:
75-
raise Exception(res.text)
76-
access_codes = res.json()["access_codes"]
75+
access_codes = res["access_codes"]
76+
7777
return [AccessCode.from_dict(ac) for ac in access_codes]
7878

7979
def get(
@@ -105,14 +105,14 @@ def get(
105105
params["access_code_id"] = to_access_code_id(access_code)
106106
if device:
107107
params["device_id"] = to_device_id(device)
108-
res = requests.get(
109-
f"{self.seam.api_url}/access_codes/get",
110-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
108+
109+
res = self.seam.make_request(
110+
"GET",
111+
"/access_codes/get",
111112
params=params,
112113
)
113-
if not res.ok:
114-
raise Exception(res.text)
115-
return AccessCode.from_dict(res.json()["access_code"])
114+
115+
return AccessCode.from_dict(res["access_code"])
116116

117117
def create(
118118
self,
@@ -157,17 +157,18 @@ def create(
157157
create_payload["starts_at"] = starts_at
158158
if ends_at is not None:
159159
create_payload["ends_at"] = ends_at
160-
res = requests.post(
161-
f"{self.seam.api_url}/access_codes/create",
162-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
160+
161+
res = self.seam.make_request(
162+
"POST",
163+
"/access_codes/create",
163164
json=create_payload,
164165
)
165-
if not res.ok:
166-
raise Exception(res.text)
166+
167167
action_attempt = self.seam.action_attempts.poll_until_ready(
168-
res.json()["action_attempt"]["action_attempt_id"]
168+
res["action_attempt"]["action_attempt_id"]
169169
)
170170
success_res: Any = action_attempt.result
171+
171172
return AccessCode.from_dict(success_res["access_code"])
172173

173174
def update(
@@ -218,17 +219,18 @@ def update(
218219
update_payload["starts_at"] = starts_at
219220
if ends_at is not None:
220221
update_payload["ends_at"] = ends_at
221-
res = requests.post(
222-
f"{self.seam.api_url}/access_codes/update",
223-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
222+
223+
res = self.seam.make_request(
224+
"POST",
225+
"/access_codes/update",
224226
json=update_payload,
225227
)
226-
if not res.ok:
227-
raise Exception(res.text)
228+
228229
action_attempt = self.seam.action_attempts.poll_until_ready(
229-
res.json()["action_attempt"]["action_attempt_id"]
230+
res["action_attempt"]["action_attempt_id"]
230231
)
231232
success_res: Any = action_attempt.result
233+
232234
return AccessCode.from_dict(success_res["access_code"])
233235

234236
def delete(
@@ -261,14 +263,15 @@ def delete(
261263
create_payload = {"access_code_id": access_code_id}
262264
if device is not None:
263265
create_payload["device_id"] = to_device_id(device)
264-
res = requests.delete(
265-
(f"{self.seam.api_url}/access_codes/delete"),
266-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
266+
267+
res = self.seam.make_request(
268+
"DELETE",
269+
"/access_codes/delete",
267270
json=create_payload,
268271
)
269-
if not res.ok:
270-
raise Exception(res.text)
272+
271273
action_attempt = self.seam.action_attempts.poll_until_ready(
272-
res.json()["action_attempt"]["action_attempt_id"]
274+
res["action_attempt"]["action_attempt_id"]
273275
)
276+
274277
return action_attempt

seamapi/action_attempts.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,20 +65,20 @@ def get(
6565
"""
6666

6767
action_attempt_id = to_action_attempt_id(action_attempt)
68-
res = requests.get(
69-
f"{self.seam.api_url}/action_attempts/get",
70-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
68+
res = self.seam.make_request(
69+
"GET",
70+
"/action_attempts/get",
7171
params={"action_attempt_id": action_attempt_id},
7272
)
73-
if not res.ok:
74-
raise Exception(res.text)
75-
json_aa = res.json()["action_attempt"]
73+
74+
json_aa = res["action_attempt"]
7675
error = None
7776
if "error" in json_aa and json_aa["error"] is not None:
7877
error = ActionAttemptError(
7978
type=json_aa["error"]["type"],
8079
message=json_aa["error"]["message"],
8180
)
81+
8282
return ActionAttempt(
8383
action_attempt_id=json_aa["action_attempt_id"],
8484
status=json_aa["status"],
@@ -107,7 +107,8 @@ def poll_until_ready(
107107

108108
updated_action_attempt = None
109109
while (
110-
updated_action_attempt is None or updated_action_attempt.status == "pending"
110+
updated_action_attempt is None
111+
or updated_action_attempt.status == "pending"
111112
):
112113
updated_action_attempt = self.get(action_attempt)
113114
time.sleep(0.25)

seamapi/connect_webviews.py

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,14 @@ def list(self) -> List[ConnectWebview]:
5959
A list of connect webviews
6060
"""
6161

62-
res = requests.get(
63-
f"{self.seam.api_url}/connect_webviews/list",
64-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
62+
res = self.seam.make_request(
63+
"GET",
64+
"/connect_webviews/list",
6565
)
66-
if not res.ok:
67-
raise Exception(res.text)
68-
json_webviews = res.json()["connect_webviews"]
66+
json_webviews = res["connect_webviews"]
67+
6968
return [
70-
ConnectWebview(**json_webview)
71-
for json_webview in json_webviews
69+
ConnectWebview(**json_webview) for json_webview in json_webviews
7270
]
7371

7472
def get(
@@ -92,14 +90,13 @@ def get(
9290
"""
9391

9492
connect_webview_id = to_connect_webview_id(connect_webview)
95-
res = requests.get(
96-
f"{self.seam.api_url}/connect_webviews/get",
97-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
93+
res = self.seam.make_request(
94+
"GET",
95+
"/connect_webviews/get",
9896
params={"connect_webview_id": connect_webview_id},
9997
)
100-
if not res.ok:
101-
raise Exception(res.text)
102-
json_webview = res.json()["connect_webview"]
98+
json_webview = res["connect_webview"]
99+
103100
return ConnectWebview(**json_webview)
104101

105102
def create(
@@ -134,12 +131,12 @@ def create(
134131
create_payload["custom_redirect_url"] = custom_redirect_url
135132
if device_selection_mode is not None:
136133
create_payload["device_selection_mode"] = device_selection_mode
137-
res = requests.post(
138-
f"{self.seam.api_url}/connect_webviews/create",
139-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
134+
135+
res = self.seam.make_request(
136+
"POST",
137+
"/connect_webviews/create",
140138
json=create_payload,
141139
)
142-
if not res.ok:
143-
raise Exception(res.text)
144-
json_webview = res.json()["connect_webview"]
140+
json_webview = res["connect_webview"]
141+
145142
return ConnectWebview(**json_webview)

seamapi/connected_accounts.py

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,12 @@ def list(self) -> List[ConnectedAccount]:
5656
A list of connected accounts.
5757
"""
5858

59-
res = requests.get(
60-
f"{self.seam.api_url}/connected_accounts/list",
61-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
59+
res = self.seam.make_request(
60+
"GET",
61+
"/connected_accounts/list",
6262
)
63-
if not res.ok:
64-
raise Exception(res.text)
65-
json_accounts: List[Dict[str, Any]] = res.json()["connected_accounts"]
63+
json_accounts: List[Dict[str, Any]] = res["connected_accounts"]
64+
6665
return [
6766
ConnectedAccount(
6867
connected_account_id=json_account["connected_account_id"],
@@ -76,7 +75,9 @@ def list(self) -> List[ConnectedAccount]:
7675

7776
def get(
7877
self,
79-
connected_account: Union[ConnectedAccountId, ConnectedAccount, None] = None,
78+
connected_account: Union[
79+
ConnectedAccountId, ConnectedAccount, None
80+
] = None,
8081
email: Email = None,
8182
) -> ConnectedAccount:
8283
"""Gets a connected account.
@@ -102,21 +103,24 @@ def get(
102103
params = {}
103104

104105
if connected_account:
105-
params["connected_account_id"] = to_connected_account_id(connected_account)
106+
params["connected_account_id"] = to_connected_account_id(
107+
connected_account
108+
)
106109
if email:
107110
params["email"] = email
108111

109112
if not connected_account and not email:
110-
raise Exception("Must provide either ConnectedAccount (ConnectedAccount or ConnectedAccountId) or Email")
111-
112-
res = requests.get(
113-
f"{self.seam.api_url}/connected_accounts/get",
114-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
113+
raise Exception(
114+
"Must provide either ConnectedAccount (ConnectedAccount or ConnectedAccountId) or Email"
115+
)
116+
117+
res = self.seam.make_request(
118+
"GET",
119+
"/connected_accounts/get",
115120
params=params,
116121
)
117-
if not res.ok:
118-
raise Exception(res.text)
119-
json_account: Dict[str, Any] = res.json()["connected_account"]
122+
json_account: Dict[str, Any] = res["connected_account"]
123+
120124
return ConnectedAccount(
121125
connected_account_id=json_account["connected_account_id"],
122126
created_at=json_account["created_at"],
@@ -147,12 +151,10 @@ def delete(
147151

148152
connected_account_id = to_connected_account_id(connected_account)
149153

150-
res = requests.delete(
151-
f"{self.seam.api_url}/connected_accounts/delete",
152-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
153-
data={"connected_account_id": connected_account_id},
154+
self.seam.make_request(
155+
"DELETE",
156+
"/connected_accounts/delete",
157+
json={"connected_account_id": connected_account_id},
154158
)
155-
if not res.ok:
156-
raise Exception(res.text)
157159

158160
return True

seamapi/devices.py

Lines changed: 30 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -85,19 +85,19 @@ def list(
8585
connected_account
8686
)
8787
if connect_webview:
88-
params[
89-
"connect_webview_id"
90-
] = to_connect_webview_id(connect_webview)
88+
params["connect_webview_id"] = to_connect_webview_id(
89+
connect_webview
90+
)
9191
if device_type:
9292
params["device_type"] = device_type
93-
res = requests.get(
94-
f"{self.seam.api_url}/devices/list",
93+
94+
res = self.seam.make_request(
95+
"GET",
96+
"/devices/list",
9597
params=params,
96-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
9798
)
98-
if not res.ok:
99-
raise Exception(res.text)
100-
devices = res.json()["devices"]
99+
devices = res["devices"]
100+
101101
return [Device.from_dict(d) for d in devices]
102102

103103
def get(
@@ -129,14 +129,8 @@ def get(
129129
params["device_id"] = to_device_id(device)
130130
if name:
131131
params["name"] = name
132-
res = requests.get(
133-
f"{self.seam.api_url}/devices/get",
134-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
135-
params=params,
136-
)
137-
if not res.ok:
138-
raise Exception(res.text)
139-
json_device = res.json()["device"]
132+
res = self.seam.make_request("GET", "/devices/get", params=params)
133+
json_device = res["device"]
140134
return Device.from_dict(json_device)
141135

142136
def update(
@@ -172,23 +166,24 @@ def update(
172166
if not device:
173167
raise Exception("device is required")
174168

175-
params = {
169+
update_payload = {
176170
"device_id": to_device_id(device),
177-
"name": name,
178-
"properties": properties,
179-
"location": location,
180171
}
181-
182-
res = requests.post(
183-
f"{self.seam.api_url}/devices/update",
184-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
185-
params=params,
172+
if name:
173+
update_payload["name"] = name
174+
if properties:
175+
update_payload["properties"] = properties
176+
if location:
177+
update_payload["location"] = location
178+
179+
self.seam.make_request(
180+
"POST",
181+
"/devices/update",
182+
json=update_payload,
186183
)
187-
if not res.ok:
188-
raise Exception(res.text)
189184

190185
return True
191-
186+
192187
def delete(self, device: Union[DeviceId, Device]) -> bool:
193188
"""Deletes a device.
194189
@@ -210,13 +205,11 @@ def delete(self, device: Union[DeviceId, Device]) -> bool:
210205
if not device:
211206
raise Exception("device is required")
212207

213-
params = {"device_id": to_device_id(device)}
214-
res = requests.post(
215-
f"{self.seam.api_url}/devices/delete",
216-
headers={"Authorization": f"Bearer {self.seam.api_key}"},
217-
params=params,
208+
delete_payload = {"device_id": to_device_id(device)}
209+
self.seam.make_request(
210+
"DELETE",
211+
"/devices/delete",
212+
json=delete_payload,
218213
)
219-
if not res.ok:
220-
raise Exception(res.text)
221214

222-
return None
215+
return None

0 commit comments

Comments
 (0)