Skip to content

Commit 715b394

Browse files
committed
Merge pull request #67 from jkeyes/rate_limit_details
Adding rate_limit_details property to Intercom.
2 parents c35633b + 0a73830 commit 715b394

File tree

4 files changed

+38
-2
lines changed

4 files changed

+38
-2
lines changed

README.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,17 +408,25 @@ HttpError
408408
UnexpectedError
409409
```
410410

411+
### Rate Limiting
412+
413+
Calling `Intercom.rate_limit_details` returns a dict that contains details about your app's current rate limit.
414+
415+
```python
416+
Intercom.rate_limit_details
417+
# {'limit': 500, 'reset_at': datetime.datetime(2015, 3, 28, 13, 22), 'remaining': 497}
418+
```
411419

412420
## Running the Tests
413421

414422
Unit tests:
415423

416424
```bash
417-
PYTHONPATH=. describe tests/unit
425+
nosetests tests/unit
418426
```
419427

420428
Integration tests:
421429

422430
```bash
423-
PYTHONPATH=. INTERCOM_APP_ID=xxx INTERCOM_APP_API_KEY=xxx nosetests tests/integration
431+
INTERCOM_APP_ID=xxx INTERCOM_APP_API_KEY=xxx nosetests tests/integration
424432
```

intercom/__init__.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class IntercomType(type): # noqa
5050
_current_endpoint = None
5151
_target_base_url = None
5252
_endpoint_randomized_at = 0
53+
_rate_limit_details = {}
5354

5455
@property
5556
def _auth(self):
@@ -95,6 +96,14 @@ def hostname(self, value):
9596
self.current_endpoint = None
9697
self.endpoints = None
9798

99+
@property
100+
def rate_limit_details(self):
101+
return self._rate_limit_details
102+
103+
@rate_limit_details.setter
104+
def rate_limit_details(self, value):
105+
self._rate_limit_details = value
106+
98107
@property
99108
def protocol(self):
100109
return self._protocol

intercom/request.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# -*- coding: utf-8 -*-
22

33
from . import errors
4+
from datetime import datetime
45

56
import certifi
67
import json
@@ -33,6 +34,7 @@ def send_request_to_path(cls, method, url, auth, params=None):
3334
auth=auth, verify=certifi.where(), **req_params)
3435

3536
cls.raise_errors_on_failure(resp)
37+
cls.set_rate_limit_details(resp)
3638

3739
if resp.content:
3840
return cls.parse_body(resp)
@@ -47,6 +49,22 @@ def parse_body(cls, resp):
4749
cls.raise_application_errors_on_failure(body, resp.status_code)
4850
return body
4951

52+
@classmethod
53+
def set_rate_limit_details(cls, resp):
54+
rate_limit_details = {}
55+
headers = resp.headers
56+
limit = headers.get('x-ratelimit-limit', None)
57+
remaining = headers.get('x-ratelimit-remaining', None)
58+
reset = headers.get('x-ratelimit-reset', None)
59+
if limit:
60+
rate_limit_details['limit'] = int(limit)
61+
if remaining:
62+
rate_limit_details['remaining'] = int(remaining)
63+
if reset:
64+
rate_limit_details['reset_at'] = datetime.fromtimestamp(int(reset))
65+
from intercom import Intercom
66+
Intercom.rate_limit_details = rate_limit_details
67+
5068
@classmethod
5169
def raise_errors_on_failure(cls, resp):
5270
if resp.status_code == 404:

tests/integration/test_count.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def setup_class(cls):
3131
def teardown_class(cls):
3232
delete(cls.company)
3333
delete(cls.user)
34+
print(Intercom.rate_limit_details)
3435

3536
def test_user_counts_for_each_tag(self):
3637
# Get User Tag Count Object

0 commit comments

Comments
 (0)