diff options
author | 2011-11-05 20:47:46 +0100 | |
---|---|---|
committer | 2011-11-05 20:47:46 +0100 | |
commit | 7616bc80ac3c680fb266417238de688bfaee60c1 (patch) | |
tree | 41dcdc442ef19ff63b08ec83e1f5693edf8eb476 /github3/handlers/base.py | |
parent | Fix litle bugs and args to request (diff) | |
download | python-github3-7616bc80ac3c680fb266417238de688bfaee60c1.tar.xz python-github3-7616bc80ac3c680fb266417238de688bfaee60c1.zip |
Handlers and paginate resources
Diffstat (limited to 'github3/handlers/base.py')
-rw-r--r-- | github3/handlers/base.py | 77 |
1 files changed, 50 insertions, 27 deletions
diff --git a/github3/handlers/base.py b/github3/handlers/base.py index 8f79cdd..5da7752 100644 --- a/github3/handlers/base.py +++ b/github3/handlers/base.py @@ -3,39 +3,62 @@ # # author: David Medina -class Handler(object): - """ Abstract handler, that inject github.api """ +class Paginate: + """ Paginate resources """ - def __init__(self, gh): - self._gh = gh - super(Handler, self).__init__() + def __init__(self, resource, requester): + self.resource = resource + self.requester = requester + self.page = 1 - def _extend_url(self, *args): - return self._url + args + def _last_page(self, link): + 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()) - def _get_raw(self, *args, **kwargs): - url = self._extend_url(*args) - return self._gh._get_raw(url, **kwargs) + return self.last - def _get_bool(self, *args): - url = self._extend_url(*args) - return self._gh._get_bool(url) + def __iter__(self): + return self - def _get_resource(self, *args, **kwargs): - url = self._extend_url(*args) - map_model = kwargs.get('model', self._model) - return self._gh._get_resource(url, map_model, **kwargs) + def initial(self): + link, content = self.requester(self.resource, paginate=True, page=1) + self.last = self._last_page(link) if link else 1 + return content - def _get_resources(self, *args, **kwargs): - url = self._extend_url(*args) - map_model = kwargs.get('model', self._model) - return self._gh._get_resources(url, map_model, **kwargs) + 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 - def _post_raw(self, *args, **kwargs): - url = self._extend_url(*args) - return self._gh._post_raw(url, **kwargs) +class Handler(object): + """ Handler base. Requests to API and modelize responses """ - def _delete_raw(self, *args, **kwargs): - url = self._extend_url(*args) - return self._gh._delete_raw(url, **kwargs) + def __init__(self, gh): + self._gh = gh + super(Handler, self).__init__() + #TODO: if limit is multiple of per_page... it do another request for nothing + def _get_resources(self, resource, model=None, limit=None): + 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 + else: + continue + break |