aboutsummaryrefslogtreecommitdiffstats
path: root/github3/handlers/base.py
diff options
context:
space:
mode:
authorDavid Medina <davidmedina9@gmail.com>2011-11-05 20:47:46 +0100
committerDavid Medina <davidmedina9@gmail.com>2011-11-05 20:47:46 +0100
commit7616bc80ac3c680fb266417238de688bfaee60c1 (patch)
tree41dcdc442ef19ff63b08ec83e1f5693edf8eb476 /github3/handlers/base.py
parentFix litle bugs and args to request (diff)
downloadpython-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.py77
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