aboutsummaryrefslogtreecommitdiffstats
path: root/github3/handlers
diff options
context:
space:
mode:
Diffstat (limited to 'github3/handlers')
-rw-r--r--github3/handlers/base.py62
1 files changed, 13 insertions, 49 deletions
diff --git a/github3/handlers/base.py b/github3/handlers/base.py
index 3f82817..0d8be0e 100644
--- a/github3/handlers/base.py
+++ b/github3/handlers/base.py
@@ -3,53 +3,7 @@
#
# author: David Medina
-import github3.exceptions as ghexceptions
-
-class Paginate:
- """ Paginate resource iterator
-
- :param resource: URL resource
- :param requester: Bound method to request. See `GithubCore.get`
- """
-
- def __init__(self, resource, requester):
- self.resource = resource
- self.requester = requester
- self.page = 1
-
- def _last_page(self, link):
- """ Get and cached last page from link header """
- if not getattr(self, 'last', False):
- from github3.packages.link_header import parse_link_value
- from urlparse import urlparse, parse_qs
- for link, rels in parse_link_value(link).items():
- if rels.get('rel') == 'last':
- query = urlparse(link).query
- self.last = int(parse_qs(query).get('page').pop())
-
- return self.last
-
- def __iter__(self):
- return self
-
- def initial(self):
- """ First request. Force requester to paginate returning link header """
- link, content = self.requester(self.resource, paginate=True, page=1)
- self.last = self._last_page(link) if link else 1
- return content
-
- def next(self):
- if self.page == 1:
- content = self.initial()
- self.page += 1
- return content
- else:
- if self.page > self.last:
- raise StopIteration
- else:
- content = self.requester(self.resource, page=self.page)
- self.page += 1
- return content
+from github3.core import Paginate, Modelizer
class Handler(object):
""" Handler base. Requests to API and modelize responses """
@@ -60,9 +14,11 @@ class Handler(object):
def _bool(self, resource, **kwargs):
""" Handler request to boolean response """
+
+ from github3.exceptions import NotFound
try:
response = self._gh.head(resource, **kwargs)
- except ghexceptions.NotFound:
+ except NotFound:
return False
assert response.status_code == 204
return True
@@ -70,13 +26,21 @@ class Handler(object):
#TODO: if limit is multiple of per_page... it do another request for nothing
def _get_resources(self, resource, model=None, limit=None):
""" Hander request to multiple resources """
+
page_resources = Paginate(resource, self._gh.get)
counter = 1
for page in page_resources:
for raw_resource in page:
if limit and counter > limit: break
counter += 1
- yield raw_resource
+ yield Modelizer(model or self.model).loads(raw_resource)
+ #yield raw_resource
else:
continue
break
+
+ def _get_resource(self, resource, model=None):
+ """ Handler request to single request """
+
+ raw_resource = self._gh.get(resource)
+ return Modelizer(model or self.model).loads(raw_resource)