Skip to content

Commit 6e110c5

Browse files
authored
Merge pull request sigmavirus24#776 from justfortherec/fix_issue_775
Fix sigmavirus24#775: Wrong rate limit returned for `search`
2 parents 785562d + b4d7ef8 commit 6e110c5

File tree

4 files changed

+32
-1
lines changed

4 files changed

+32
-1
lines changed

github3/models.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class GitHubCore(object):
3131
basic attributes and methods to other sub-classes that are very useful to
3232
have.
3333
"""
34+
_ratelimit_resource = 'core'
3435

3536
def __init__(self, json, session=None):
3637
if hasattr(session, 'session'):
@@ -305,7 +306,7 @@ def ratelimit_remaining(self):
305306
:returns: int
306307
"""
307308
json = self._json(self._get(self._github_url + '/rate_limit'), 200)
308-
core = json.get('resources', {}).get('core', {})
309+
core = json.get('resources', {}).get(self._ratelimit_resource, {})
309310
self._remaining = core.get('remaining', 0)
310311
return self._remaining
311312

github3/structs.py

+1
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ class SearchIterator(GitHubIterator):
129129
class. For other members and methods, check its parent class.
130130
131131
"""
132+
_ratelimit_resource = 'search'
132133

133134
def __init__(self, count, url, cls, session, params=None, etag=None,
134135
headers=None):
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"recorded_with": "betamax/0.8.0", "http_interactions": [{"response": {"body": {"base64_string": "H4sIAAAAAAAAA6tWKkotzi8tSk4tVrKqVkrOL0oF0TmZuZklSlZmBjpA+dzEzLzMvHQYtzgVKGNoamhmaWlibGhcq6NUnJpYlJyBpM8QVR+Ei6TPwNwcpC+9KLEgozAHSSOqPjAP3TqgvqLEEpJdWQsAyulOc+oAAAA=", "encoding": "utf-8", "string": ""}, "url": "https://api.github.com/rate_limit", "headers": {"Cache-Control": "no-cache", "Access-Control-Expose-Headers": "ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "default-src 'none'", "X-GitHub-Media-Type": "github.v3; param=full; format=json", "Content-Encoding": "gzip", "X-Content-Type-Options": "nosniff", "X-RateLimit-Limit": "60", "X-RateLimit-Reset": "1516994313", "Content-Type": "application/json; charset=utf-8", "X-XSS-Protection": "1; mode=block", "Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload", "Date": "Fri, 26 Jan 2018 18:18:33 GMT", "X-Runtime-rack": "0.008218", "Transfer-Encoding": "chunked", "X-GitHub-Request-Id": "D196:12414:2B7A313:507FFAA:5A6B70F9", "Status": "200 OK", "Server": "GitHub.com", "X-Frame-Options": "deny", "X-RateLimit-Remaining": "60"}, "status": {"message": "OK", "code": 200}}, "recorded_at": "2018-01-26T18:18:33", "request": {"body": {"encoding": "utf-8", "string": ""}, "method": "GET", "uri": "https://api.github.com/rate_limit", "headers": {"Connection": "keep-alive", "Content-Type": "application/json", "User-Agent": "github3.py/1.0.0a4", "Accept-Charset": "utf-8", "Accept-Encoding": "gzip, deflate", "Accept": "application/vnd.github.v3.full+json"}}}, {"response": {"body": {"base64_string": "H4sIAAAAAAAAA6tWKkotzi8tSk4tVrKqVkrOL0oF0TmZuZklSlZmBjpA+dzEzLzMvHQYtzgVKGNoamhmaWlibGhcq6NUnJpYlJyBpM8QVR+Ei6TPwNwcpC+9KLEgozAHSSOqPjAP3TqgvqLEEpJdWQsAyulOc+oAAAA=", "encoding": "utf-8", "string": ""}, "url": "https://api.github.com/rate_limit", "headers": {"Cache-Control": "no-cache", "Access-Control-Expose-Headers": "ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "default-src 'none'", "X-GitHub-Media-Type": "github.v3; param=full; format=json", "Content-Encoding": "gzip", "X-Content-Type-Options": "nosniff", "X-RateLimit-Limit": "60", "X-RateLimit-Reset": "1516994313", "Content-Type": "application/json; charset=utf-8", "X-XSS-Protection": "1; mode=block", "Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload", "Date": "Fri, 26 Jan 2018 18:18:33 GMT", "X-Runtime-rack": "0.010151", "Transfer-Encoding": "chunked", "X-GitHub-Request-Id": "D196:12414:2B7A31F:507FFBB:5A6B70F9", "Status": "200 OK", "Server": "GitHub.com", "X-Frame-Options": "deny", "X-RateLimit-Remaining": "60"}, "status": {"message": "OK", "code": 200}}, "recorded_at": "2018-01-26T18:18:33", "request": {"body": {"encoding": "utf-8", "string": ""}, "method": "GET", "uri": "https://api.github.com/rate_limit", "headers": {"Connection": "keep-alive", "Content-Type": "application/json", "User-Agent": "github3.py/1.0.0a4", "Accept-Charset": "utf-8", "Accept-Encoding": "gzip, deflate", "Accept": "application/vnd.github.v3.full+json"}}}]}

tests/integration/test_github_core.py

+28
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,31 @@ def test_ratelimit_remaining(self):
66
cassette_name = self.cassette_name('ratelimit_remaining')
77
with self.recorder.use_cassette(cassette_name):
88
assert self.gh.ratelimit_remaining > 0
9+
10+
def test_ratelimit_remaining_search(self):
11+
"""Test if search iterators return search ratelimit"""
12+
13+
def _get_ratelimit(resource):
14+
resources = self.gh.rate_limit().get('resources', {})
15+
rate_limit = resources.get(resource, {})
16+
return rate_limit.get('remaining', -1)
17+
18+
cassette_name = self.cassette_name('ratelimit_remaining_search')
19+
20+
# Run cassette to get correct remaining rate limit from responses.
21+
with self.recorder.use_cassette(cassette_name):
22+
correct_ratelimit_search = _get_ratelimit('search')
23+
correct_ratelimit_core = _get_ratelimit('core')
24+
25+
# Re-run cassette to test functions under test.
26+
with self.recorder.use_cassette(cassette_name):
27+
result_iterator = self.gh.search_code(
28+
'HTTPAdapter in:file language:python'
29+
' repo:kennethreitz/requests'
30+
)
31+
ratelimit_remaining_search = result_iterator.ratelimit_remaining
32+
ratelimit_remaining_core = self.gh.ratelimit_remaining
33+
34+
assert ratelimit_remaining_search != ratelimit_remaining_core
35+
assert ratelimit_remaining_core == correct_ratelimit_core
36+
assert ratelimit_remaining_search == correct_ratelimit_search

0 commit comments

Comments
 (0)