diff options
Diffstat (limited to 'github3/handlers')
-rw-r--r-- | github3/handlers/base.py | 62 |
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) |