diff options
author | 2011-11-09 13:04:48 +0200 | |
---|---|---|
committer | 2011-11-09 13:04:48 +0200 | |
commit | f1a03e9fc8ce87ca1beeae5a92082bb32d342df3 (patch) | |
tree | 6bca689287379b249aff19fbae075182dc22f95a /github3/core.py | |
parent | Added create_gist() example to readme (diff) | |
parent | Fixing bugs. Crazy night :S (diff) | |
download | python-github3-f1a03e9fc8ce87ca1beeae5a92082bb32d342df3.tar.xz python-github3-f1a03e9fc8ce87ca1beeae5a92082bb32d342df3.zip |
Merged create_gist() into current HEAD of copitux/develop
Diffstat (limited to 'github3/core.py')
-rw-r--r-- | github3/core.py | 127 |
1 files changed, 70 insertions, 57 deletions
diff --git a/github3/core.py b/github3/core.py index 6221f9e..d7237af 100644 --- a/github3/core.py +++ b/github3/core.py @@ -1,57 +1,70 @@ -# -*- coding: utf-8 -*- - -""" -github3.core -~~~~~~~~~~~~ - -This module provides the entrance point for the GitHub3 module. -""" - -__version__ = '0.0.0' -__license__ = 'MIT' -__author__ = 'Kenneth Reitz' - - -import envoy - -from .api import Github, settings - - - -def no_auth(): - """Returns an un-authenticated Github object.""" - - gh = Github() - - return gh - - -def basic_auth(username, password): - """Returns an authenticated Github object, via HTTP Basic.""" - - gh = Github() - gh.is_authenticated = True - gh.session.auth = (username, password) - - return gh - - - -# def git_config(): -# """Returns an authenticated Github object, via HTTP Basic. - -# GitHub API token is taken from `git config`. -# """ - -# username = envoy.run('git config github.user').std_out.strip() -# token = envoy.run('git config github.token').std_out.strip() - -# def enable_auth(*args, **kwargs): -# kwargs['auth'] = (username, token) -# return args, kwargs - -# gh = Github() -# gh.is_authenticated = True -# gh._requests_pre_hook = enable_auth - -# return gh
\ No newline at end of file +#!/usr/bin/env python +# -*- encoding: utf-8 -*- +# +# author: David Medina + +class Paginate: + """ Paginate resource iterator + + :param resource: URL resource + :param requester: Bound method to request. See `GithubCore.get` + :param kwargs: Args to request (params) + """ + + def __init__(self, resource, requester, **kwargs): + self.resource = resource + self.requester = requester + self.kwargs = kwargs + 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 + + # TODO: reset iterators... multiple? + 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.kwargs) + 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.kwargs) + self.page += 1 + return content + +class Converter(object): + """ Abstract converter class """ + + def loads(self): + raise NotImplementedError("%s needs define '%s' method" % + (self.__class__.__name__, 'loads')) + + def dumps(self): + raise NotImplementedError("%s needs define '%s' method" % + (self.__class__.__name__, 'dumps')) + + def inject(self): + raise NotImplementedError("%s needs define '%s' method" % + (self.__class__.__name__, 'inject')) |