aboutsummaryrefslogtreecommitdiffstats
path: root/github3/handlers/base.py
diff options
context:
space:
mode:
Diffstat (limited to 'github3/handlers/base.py')
-rw-r--r--github3/handlers/base.py76
1 files changed, 58 insertions, 18 deletions
diff --git a/github3/handlers/base.py b/github3/handlers/base.py
index 50e2df8..565978f 100644
--- a/github3/handlers/base.py
+++ b/github3/handlers/base.py
@@ -1,11 +1,43 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
-#
-# author: David Medina
from github3.core import Paginate
from github3.converters import Modelizer
+
+class MimeTypeMixin(object):
+
+ VERSION = 'beta'
+
+ def __init__(self):
+ self.mimetypes = set()
+
+ def _parse_mime_type(self, type):
+ return 'application/vnd.github.%s.%s+json' % (
+ self.VERSION, type)
+
+ def add_raw(self):
+ self.mimetypes.add(self._parse_mime_type('raw'))
+ return self
+
+ def add_text(self):
+ self.mimetypes.add(self._parse_mime_type('text'))
+ return self
+
+ def add_html(self):
+ self.mimetypes.add(self._parse_mime_type('html'))
+ return self
+
+ def add_full(self):
+ self.mimetypes.add(self._parse_mime_type('full'))
+ return self
+
+ def mime_header(self):
+ if self.mimetypes:
+ return {'Accept': ', '.join(self.mimetypes)}
+ return None
+
+
class Handler(object):
""" Handler base. Requests to API and modelize responses """
@@ -13,17 +45,23 @@ class Handler(object):
self._gh = gh
super(Handler, self).__init__()
+ def _inject_handler(self, handler, prefix=''):
+ import inspect
+ for method, callback in inspect.getmembers(handler):
+ if method.startswith(prefix) and inspect.ismethod(callback):
+ setattr(self, method, callback)
+
def _prefix_resource(self, resource):
prefix = getattr(self, 'prefix', '')
- return '/'.join((prefix, resource)).rstrip('/')
+ return '/'.join((prefix, str(resource))).strip('/')
- def _get_converter(self, **kwargs):
- converter = kwargs.get(
- 'converter', # 1. in kwargs
- getattr(self, 'converter', # 2. in handler
- Modelizer())) # 3. Default
+ def _get_converter(self, kwargs={}):
+ converter = kwargs.pop(
+ 'converter', # 1. in kwargs
+ getattr(self, 'converter', # 2. in handler
+ Modelizer)) # 3. Default
- return converter
+ return converter()
def _put(self, resource, **kwargs):
""" Put proxy request"""
@@ -41,27 +79,29 @@ class Handler(object):
from github3.exceptions import NotFound
resource = self._prefix_resource(resource)
try:
- callback = getattr(self._gh, kwargs.get('method',''), self._gh.head)
+ callback = getattr(self._gh, kwargs.get('method', ''),
+ self._gh.head)
response = callback(resource, **kwargs)
except NotFound:
return False
assert response.status_code == 204
return True
- #TODO: if limit is multiple of per_page... it do another request for nothing
def _get_resources(self, resource, model=None, limit=None, **kwargs):
""" Hander request to multiple resources """
+ if limit:
+ limit = abs(limit)
resource = self._prefix_resource(resource)
- page_resources = Paginate(resource, self._gh.get, **kwargs)
+ converter = self._get_converter(kwargs)
counter = 1
- for page in page_resources:
+ for page in Paginate(resource, self._gh.get, **kwargs):
for raw_resource in page:
- if limit and counter > limit: break
counter += 1
- converter = self._get_converter(**kwargs)
converter.inject(model)
yield converter.loads(raw_resource)
+ if limit and counter > limit:
+ break
else:
continue
break
@@ -70,8 +110,8 @@ class Handler(object):
""" Handler request to single resource """
resource = self._prefix_resource(resource)
- raw_resource = self._gh.get(resource)
- converter = self._get_converter(**kwargs)
+ converter = self._get_converter(kwargs)
+ raw_resource = self._gh.get(resource, **kwargs)
converter.inject(model)
return converter.loads(raw_resource)
@@ -80,6 +120,6 @@ class Handler(object):
resource = self._prefix_resource(resource)
raw_resource = self._gh.post(resource, data=data)
- converter = self._get_converter(**kwargs)
+ converter = self._get_converter(kwargs)
converter.inject(model)
return converter.loads(raw_resource)