mirror of
https://github.com/kennethreitz/python-github3.git
synced 2026-06-05 23:10:17 +00:00
generators!
This commit is contained in:
+60
-11
@@ -19,6 +19,7 @@ import requests
|
|||||||
|
|
||||||
from decorator import decorator
|
from decorator import decorator
|
||||||
|
|
||||||
|
PAGING_SIZE = 100
|
||||||
|
|
||||||
class GithubCore(object):
|
class GithubCore(object):
|
||||||
|
|
||||||
@@ -27,7 +28,7 @@ class GithubCore(object):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.session = requests.session()
|
self.session = requests.session()
|
||||||
self.session.params = {'per_page': 100}
|
self.session.params = {'per_page': PAGING_SIZE}
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@@ -71,7 +72,6 @@ class GithubCore(object):
|
|||||||
def _http_resource(self, verb, endpoint, params=None, **etc):
|
def _http_resource(self, verb, endpoint, params=None, **etc):
|
||||||
|
|
||||||
url = self._generate_url(endpoint)
|
url = self._generate_url(endpoint)
|
||||||
|
|
||||||
args = (verb, url)
|
args = (verb, url)
|
||||||
|
|
||||||
if params:
|
if params:
|
||||||
@@ -83,8 +83,6 @@ class GithubCore(object):
|
|||||||
r = self.session.request(*args, **kwargs)
|
r = self.session.request(*args, **kwargs)
|
||||||
r = self._requests_post_hook(r)
|
r = self._requests_post_hook(r)
|
||||||
|
|
||||||
# print self._ratelimit_remaining
|
|
||||||
|
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
|
|
||||||
return r
|
return r
|
||||||
@@ -104,17 +102,68 @@ class GithubCore(object):
|
|||||||
return msg
|
return msg
|
||||||
|
|
||||||
|
|
||||||
def _get_resources(self, resource, obj, **kwargs):
|
@staticmethod
|
||||||
|
def _total_pages_from_header(link_header):
|
||||||
|
from urlparse import urlparse, parse_qs
|
||||||
|
page_info = {}
|
||||||
|
|
||||||
r = self._http_resource('GET', resource, params=kwargs)
|
for link in link_header.split(','):
|
||||||
d_items = self._resource_deserialize(r.content)
|
|
||||||
|
|
||||||
items = []
|
uri, meta = map(str.strip, link.split(';'))
|
||||||
|
|
||||||
for item in d_items:
|
# Strip <>'s
|
||||||
items.append(obj.new_from_dict(item, gh=self))
|
uri = uri[1:-1]
|
||||||
|
|
||||||
return items
|
# Get query params from header.
|
||||||
|
q = parse_qs(urlparse(uri).query)
|
||||||
|
meta = meta[5:-1]
|
||||||
|
|
||||||
|
page_info[meta] = q
|
||||||
|
|
||||||
|
try:
|
||||||
|
return int(page_info['last']['page'].pop())
|
||||||
|
except KeyError:
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _get_resources(self, resource, obj, limit=None, **kwargs):
|
||||||
|
|
||||||
|
if limit is not None:
|
||||||
|
assert limit > 0
|
||||||
|
|
||||||
|
moar = True
|
||||||
|
is_truncated = (limit > PAGING_SIZE) or (limit is None)
|
||||||
|
r_count = 0
|
||||||
|
page = 1
|
||||||
|
|
||||||
|
while moar:
|
||||||
|
|
||||||
|
if not is_truncated:
|
||||||
|
kwargs['per_page'] = limit
|
||||||
|
moar = False
|
||||||
|
else:
|
||||||
|
kwargs['page'] = page
|
||||||
|
if limit:
|
||||||
|
if (limit - r_count) < PAGING_SIZE:
|
||||||
|
kwargs['per_page'] = (limit - r_count)
|
||||||
|
moar = False
|
||||||
|
|
||||||
|
|
||||||
|
r = self._http_resource('GET', resource, params=kwargs)
|
||||||
|
max_page = self._total_pages_from_header(r.headers['link'])
|
||||||
|
|
||||||
|
if max_page is True:
|
||||||
|
moar = False
|
||||||
|
|
||||||
|
d_items = self._resource_deserialize(r.content)
|
||||||
|
|
||||||
|
for item in d_items:
|
||||||
|
if (r_count < limit) or (limit is None):
|
||||||
|
r_count += 1
|
||||||
|
yield obj.new_from_dict(item, gh=self)
|
||||||
|
else:
|
||||||
|
moar = False
|
||||||
|
|
||||||
|
page += 1
|
||||||
|
|
||||||
|
|
||||||
def _to_map(self, obj, iterable):
|
def _to_map(self, obj, iterable):
|
||||||
|
|||||||
Reference in New Issue
Block a user