Skip to content

Commit 4f0a643

Browse files
authored
support GetRateLimits (#57)
1 parent cb95e06 commit 4f0a643

File tree

5 files changed

+131
-0
lines changed

5 files changed

+131
-0
lines changed

stream_chat/async_chat/client.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,33 @@ async def get_devices(self, user_id):
272272
"""
273273
return await self.get("devices", {"user_id": user_id})
274274

275+
async def get_rate_limits(
276+
self, server_side=False, android=False, ios=False, web=False, endpoints=None
277+
):
278+
"""
279+
Get rate limit quotas and usage.
280+
If no params are toggled, all limits for all endpoints are returned.
281+
282+
:param server_side: if true, show server_side limits.
283+
:param android: if true, show android limits.
284+
:param ios: if true, show ios limits.
285+
:param web: if true, show web limits.
286+
:param endpoints: restrict returned limits to the given list of endpoints.
287+
"""
288+
params = {}
289+
if server_side:
290+
params["server_side"] = "true"
291+
if android:
292+
params["android"] = "true"
293+
if ios:
294+
params["ios"] = "true"
295+
if web:
296+
params["web"] = "true"
297+
if endpoints is not None and len(endpoints) > 0:
298+
params["endpoints"] = ",".join(endpoints)
299+
300+
return await self.get("rate_limits", params)
301+
275302
async def search(self, filter_conditions, query, **options):
276303
params = {**options, "filter_conditions": filter_conditions, "query": query}
277304
return await self.get("search", params={"payload": json.dumps(params)})

stream_chat/base/client.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,20 @@ def get_devices(self, user_id):
260260
"""
261261
pass
262262

263+
@abc.abstractmethod
264+
def get_rate_limits(self, server_side, android, ios, web, endpoints):
265+
"""
266+
Get rate limit quotas and usage.
267+
If no params are toggled, all limits for all endpoints are returned.
268+
269+
:param server_side: if true, show server_side limits.
270+
:param android: if true, show android limits.
271+
:param ios: if true, show ios limits.
272+
:param web: if true, show web limits.
273+
:param endpoints: restrict returned limits to the given list of endpoints.
274+
"""
275+
pass
276+
263277
@abc.abstractmethod
264278
def search(self, filter_conditions, query, **options):
265279
pass

stream_chat/client.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,33 @@ def get_devices(self, user_id):
267267
"""
268268
return self.get("devices", {"user_id": user_id})
269269

270+
def get_rate_limits(
271+
self, server_side=False, android=False, ios=False, web=False, endpoints=None
272+
):
273+
"""
274+
Get rate limit quotas and usage.
275+
If no params are toggled, all limits for all endpoints are returned.
276+
277+
:param server_side: if true, show server_side limits.
278+
:param android: if true, show android limits.
279+
:param ios: if true, show ios limits.
280+
:param web: if true, show web limits.
281+
:param endpoints: restrict returned limits to the given list of endpoints.
282+
"""
283+
params = {}
284+
if server_side:
285+
params["server_side"] = "true"
286+
if android:
287+
params["android"] = "true"
288+
if ios:
289+
params["ios"] = "true"
290+
if web:
291+
params["web"] = "true"
292+
if endpoints is not None and len(endpoints) > 0:
293+
params["endpoints"] = ",".join(endpoints)
294+
295+
return self.get("rate_limits", params)
296+
270297
def search(self, filter_conditions, query, **options):
271298
params = {**options, "filter_conditions": filter_conditions, "query": query}
272299
return self.get("search", params={"payload": json.dumps(params)})

stream_chat/tests/async_chat/test_client.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,38 @@ async def test_devices(self, event_loop, client, random_user):
265265
response = await client.get_devices(random_user["id"])
266266
assert len(response["devices"]) == 1
267267

268+
@pytest.mark.asyncio
269+
async def test_get_rate_limits(self, event_loop, client):
270+
response = await client.get_rate_limits()
271+
assert "server_side" in response
272+
assert "android" in response
273+
assert "ios" in response
274+
assert "web" in response
275+
276+
response = await client.get_rate_limits(server_side=True, android=True)
277+
assert "server_side" in response
278+
assert "android" in response
279+
assert "ios" not in response
280+
assert "web" not in response
281+
282+
response = await client.get_rate_limits(
283+
server_side=True, android=True, endpoints=["GetRateLimits", "SendMessage"]
284+
)
285+
assert "server_side" in response
286+
assert "android" in response
287+
assert "ios" not in response
288+
assert "web" not in response
289+
assert len(response["android"]) == 2
290+
assert len(response["server_side"]) == 2
291+
assert (
292+
response["android"]["GetRateLimits"]["limit"]
293+
== response["android"]["GetRateLimits"]["remaining"]
294+
)
295+
assert (
296+
response["server_side"]["GetRateLimits"]["limit"]
297+
> response["server_side"]["GetRateLimits"]["remaining"]
298+
)
299+
268300
@pytest.mark.asyncio
269301
async def test_search(self, event_loop, client, channel, random_user):
270302
query = "supercalifragilisticexpialidocious"

stream_chat/tests/test_client.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,37 @@ def test_devices(self, client, random_user):
217217
response = client.get_devices(random_user["id"])
218218
assert len(response["devices"]) == 1
219219

220+
def test_get_rate_limits(self, client):
221+
response = client.get_rate_limits()
222+
assert "server_side" in response
223+
assert "android" in response
224+
assert "ios" in response
225+
assert "web" in response
226+
227+
response = client.get_rate_limits(server_side=True, android=True)
228+
assert "server_side" in response
229+
assert "android" in response
230+
assert "ios" not in response
231+
assert "web" not in response
232+
233+
response = client.get_rate_limits(
234+
server_side=True, android=True, endpoints=["GetRateLimits", "SendMessage"]
235+
)
236+
assert "server_side" in response
237+
assert "android" in response
238+
assert "ios" not in response
239+
assert "web" not in response
240+
assert len(response["android"]) == 2
241+
assert len(response["server_side"]) == 2
242+
assert (
243+
response["android"]["GetRateLimits"]["limit"]
244+
== response["android"]["GetRateLimits"]["remaining"]
245+
)
246+
assert (
247+
response["server_side"]["GetRateLimits"]["limit"]
248+
> response["server_side"]["GetRateLimits"]["remaining"]
249+
)
250+
220251
def test_search(self, client, channel, random_user):
221252
query = "supercalifragilisticexpialidocious"
222253
channel.send_message(

0 commit comments

Comments
 (0)