aboutsummaryrefslogtreecommitdiffstats
path: root/github3/core.py
diff options
context:
space:
mode:
Diffstat (limited to 'github3/core.py')
-rw-r--r--github3/core.py124
1 files changed, 104 insertions, 20 deletions
diff --git a/github3/core.py b/github3/core.py
index d6eed22..0aa5949 100644
--- a/github3/core.py
+++ b/github3/core.py
@@ -1,30 +1,114 @@
-# -*- coding: utf-8 -*-
+#!/usr/bin/env python
+# -*- encoding: utf-8 -*-
+#
+# author: David Medina
-"""
-github3.core
-~~~~~~~~~~~~
+class Paginate:
+ """ Paginate resource iterator
-This module provides the entrance point for the GitHub3 module.
-"""
+ :param resource: URL resource
+ :param requester: Bound method to request. See `GithubCore.get`
+ """
-__version__ = '0.0.0'
-__license__ = 'MIT'
-__author__ = 'Kenneth Reitz'
+ def __init__(self, resource, requester):
+ self.resource = resource
+ self.requester = requester
+ self.page = 1
-from .api import Github
+ 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())
-def no_auth():
- """Returns an un-authenticated Github object."""
+ return self.last
- gh = Github()
+ def __iter__(self):
+ return self
- return gh
+ 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 basic_auth(username, password):
- """Returns an authenticated Github object, via HTTP Basic."""
+ 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
- gh = Github()
- gh.is_authenticated = True
- gh.session.auth = (username, password)
+class Modelizer(object):
+ """ Converter json into model and vice versa """
- return gh
+ def __init__(self, model):
+ self.model = model
+ self.attrs = {}
+
+ def _parse_date(self, string_date):
+ from datetime import datetime
+ try:
+ date = datetime.strptime(string_date, '%Y-%m-%dT%H:%M:%SZ')
+ except TypeError:
+ date = None
+
+ return date
+
+ def _parse_map(self, model, raw_resource):
+ if model == 'self':
+ model = self.model
+
+ return Modelizer(model).loads(raw_resource)
+
+ def _parse_collection_map(self, model, raw_resources):
+ # Dict of resources (Ex: Gist file)
+ if getattr(raw_resources, 'items', False):
+ dict_map = {}
+ for key, raw_resource in raw_resources.items():
+ dict_map[key] = Modelizer(model).loads(raw_resource)
+ return dict_map
+ # list of resources
+ else:
+ return [Modelizer(model).loads(raw_resource)
+ for raw_resource in raw_resources]
+
+ def loads(self, raw_resource):
+ attrs = {}
+ idl = self.model.idl()
+ attrs.update(
+ {attr: raw_resource[attr] for attr in idl.get('strs',())
+ if raw_resource.get(attr)})
+ attrs.update(
+ {attr: raw_resource[attr] for attr in idl.get('ints',())
+ if raw_resource.get(attr)})
+ attrs.update(
+ {attr: self._parse_date(raw_resource[attr])
+ for attr in idl.get('dates',()) if raw_resource.get(attr)})
+ attrs.update(
+ {attr: raw_resource[attr] for attr in idl.get('bools',())
+ if raw_resource.get(attr)})
+ attrs.update(
+ {attr: self._parse_map(model, raw_resource[attr])
+ for attr, model in idl.get('maps',{}).items()
+ if raw_resource.get(attr)})
+ attrs.update(
+ {attr: self._parse_collection_map(model, raw_resource[attr])
+ for attr, model in idl.get('collection_maps',{}).items()
+ if raw_resource.get(attr)})
+
+ return self.model(attrs)
+
+ def dumps(self):
+ # return JSON
+ pass