Skip to content

Commit 02c0e14

Browse files
Return response objects from all client methods (#122)
* Return response objects from all client methods send_request() now returns the requests.Response object instead of response.text. Track API methods (identify, track, etc.) return the response instead of None, letting callers inspect status codes, headers, and body. APIClient methods continue to return parsed JSON dicts. Closes #85
1 parent 4e3d201 commit 02c0e14

4 files changed

Lines changed: 25 additions & 23 deletions

File tree

customerio/api.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
"""
44

55
import base64
6-
import json
76

87
from .client_base import ClientBase, CustomerIOException
98
from .regions import Region, Regions
@@ -95,31 +94,31 @@ def send_email(self, request):
9594
if isinstance(request, SendEmailRequest):
9695
request = request._to_dict()
9796
resp = self.send_request("POST", self.url + "/v1/send/email", request)
98-
return json.loads(resp)
97+
return resp.json()
9998

10099
def send_push(self, request):
101100
if isinstance(request, SendPushRequest):
102101
request = request._to_dict()
103102
resp = self.send_request("POST", self.url + "/v1/send/push", request)
104-
return json.loads(resp)
103+
return resp.json()
105104

106105
def send_sms(self, request):
107106
if isinstance(request, SendSMSRequest):
108107
request = request._to_dict()
109108
resp = self.send_request("POST", self.url + "/v1/send/sms", request)
110-
return json.loads(resp)
109+
return resp.json()
111110

112111
def send_inbox_message(self, request):
113112
if isinstance(request, SendInboxMessageRequest):
114113
request = request._to_dict()
115114
resp = self.send_request("POST", self.url + "/v1/send/inbox_message", request)
116-
return json.loads(resp)
115+
return resp.json()
117116

118117
def send_in_app(self, request):
119118
if isinstance(request, SendInAppRequest):
120119
request = request._to_dict()
121120
resp = self.send_request("POST", self.url + "/v1/send/in_app", request)
122-
return json.loads(resp)
121+
return resp.json()
123122

124123
def _build_session(self):
125124
session = super()._build_session()

customerio/client_base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def send_request(self, method, url, data):
5454
result_status = response.status_code
5555
if result_status < 200 or result_status >= 300:
5656
raise CustomerIOException(f"{result_status}: {url} {data} {response.text}")
57-
return response.text
57+
return response
5858

5959
except CustomerIOException:
6060
raise

customerio/track.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def identify(self, id, **kwargs):
8989
if not id:
9090
raise CustomerIOException("id cannot be blank in identify")
9191
url = self.get_customer_query_string(id)
92-
self.send_request("PUT", url, kwargs)
92+
return self.send_request("PUT", url, kwargs)
9393

9494
def track(self, customer_id, name, **data):
9595
"""Track an event for a given customer_id."""
@@ -100,7 +100,7 @@ def track(self, customer_id, name, **data):
100100
"name": name,
101101
"data": self._sanitize(data),
102102
}
103-
self.send_request("POST", url, post_data)
103+
return self.send_request("POST", url, post_data)
104104

105105
def track_anonymous(self, anonymous_id, name, **data):
106106
"""Track an event for a given anonymous_id."""
@@ -112,7 +112,7 @@ def track_anonymous(self, anonymous_id, name, **data):
112112
if anonymous_id:
113113
post_data["anonymous_id"] = anonymous_id
114114

115-
self.send_request("POST", url, post_data)
115+
return self.send_request("POST", url, post_data)
116116

117117
def pageview(self, customer_id, page, **data):
118118
"""Track a pageview for a given customer_id."""
@@ -124,7 +124,7 @@ def pageview(self, customer_id, page, **data):
124124
"name": page,
125125
"data": self._sanitize(data),
126126
}
127-
self.send_request("POST", url, post_data)
127+
return self.send_request("POST", url, post_data)
128128

129129
def backfill(self, customer_id, name, timestamp, **data):
130130
"""Backfill an event (track with timestamp) for a given customer_id."""
@@ -147,15 +147,15 @@ def backfill(self, customer_id, name, timestamp, **data):
147147
"timestamp": timestamp,
148148
}
149149

150-
self.send_request("POST", url, post_data)
150+
return self.send_request("POST", url, post_data)
151151

152152
def delete(self, customer_id):
153153
"""Delete a customer profile."""
154154
if not customer_id:
155155
raise CustomerIOException("customer_id cannot be blank in delete")
156156

157157
url = self.get_customer_query_string(customer_id)
158-
self.send_request("DELETE", url, {})
158+
return self.send_request("DELETE", url, {})
159159

160160
def add_device(self, customer_id, device_id, platform, **data):
161161
"""Add a device to a customer profile."""
@@ -176,7 +176,7 @@ def add_device(self, customer_id, device_id, platform, **data):
176176
)
177177
payload = {"device": data}
178178
url = self.get_device_query_string(customer_id)
179-
self.send_request("PUT", url, payload)
179+
return self.send_request("PUT", url, payload)
180180

181181
def delete_device(self, customer_id, device_id):
182182
"""Delete a device from a customer profile."""
@@ -188,13 +188,13 @@ def delete_device(self, customer_id, device_id):
188188

189189
url = self.get_device_query_string(customer_id)
190190
delete_url = f"{url}/{self._url_encode(device_id)}"
191-
self.send_request("DELETE", delete_url, {})
191+
return self.send_request("DELETE", delete_url, {})
192192

193193
def suppress(self, customer_id):
194194
if not customer_id:
195195
raise CustomerIOException("customer_id cannot be blank in suppress")
196196

197-
self.send_request(
197+
return self.send_request(
198198
"POST",
199199
f"{self.base_url}/customers/{self._url_encode(customer_id)}/suppress",
200200
{},
@@ -204,7 +204,7 @@ def unsuppress(self, customer_id):
204204
if not customer_id:
205205
raise CustomerIOException("customer_id cannot be blank in unsuppress")
206206

207-
self.send_request(
207+
return self.send_request(
208208
"POST",
209209
f"{self.base_url}/customers/{self._url_encode(customer_id)}/unsuppress",
210210
{},
@@ -232,7 +232,7 @@ def merge_customers(self, primary_id_type, primary_id, secondary_id_type, second
232232
"primary": {primary_id_type: primary_id},
233233
"secondary": {secondary_id_type: secondary_id},
234234
}
235-
self.send_request("POST", url, post_data)
235+
return self.send_request("POST", url, post_data)
236236

237237
def batch(self, operations):
238238
"""Send multiple operations in a single request.
@@ -247,7 +247,7 @@ def batch(self, operations):
247247
url = f"https://{self.host}/api/v2/batch"
248248
else:
249249
url = f"https://{self.host}:{self.port}/api/v2/batch"
250-
self.send_request("POST", url, {"batch": operations})
250+
return self.send_request("POST", url, {"batch": operations})
251251

252252
def _build_session(self):
253253
session = super()._build_session()

tests/test_client_base.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,10 @@ def build_session():
4343

4444
client._build_session = build_session
4545

46-
self.assertEqual(client.send_request("POST", "https://example.com", {}), "ok")
47-
self.assertEqual(client.send_request("POST", "https://example.com", {}), "ok")
46+
resp1 = client.send_request("POST", "https://example.com", {})
47+
resp2 = client.send_request("POST", "https://example.com", {})
48+
self.assertEqual(resp1.status_code, 200)
49+
self.assertEqual(resp2.status_code, 200)
4850

4951
self.assertEqual(len(sessions), 1)
5052
self.assertFalse(sessions[0].closed)
@@ -76,7 +78,8 @@ def send_request():
7678
thread.join()
7779

7880
self.assertEqual(errors, [])
79-
self.assertEqual(sorted(responses), ["ok", "ok"])
81+
self.assertEqual(len(responses), 2)
82+
self.assertTrue(all(r.status_code == 200 for r in responses))
8083
self.assertEqual(len(sessions), 2)
8184
self.assertTrue(all(session.closed for session in sessions))
8285
self.assertTrue(all(session.request_count == 1 for session in sessions))
@@ -129,7 +132,7 @@ def build_session(resp=response):
129132
client._build_session = build_session
130133
client._current_session = None
131134
result = client.send_request("POST", "https://example.com", {})
132-
self.assertEqual(result, "ok")
135+
self.assertEqual(result.status_code, status)
133136

134137

135138
if __name__ == "__main__":

0 commit comments

Comments
 (0)