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.py85
1 files changed, 85 insertions, 0 deletions
diff --git a/github3/handlers/base.py b/github3/handlers/base.py
new file mode 100644
index 0000000..50e2df8
--- /dev/null
+++ b/github3/handlers/base.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+# -*- encoding: utf-8 -*-
+#
+# author: David Medina
+
+from github3.core import Paginate
+from github3.converters import Modelizer
+
+class Handler(object):
+ """ Handler base. Requests to API and modelize responses """
+
+ def __init__(self, gh):
+ self._gh = gh
+ super(Handler, self).__init__()
+
+ def _prefix_resource(self, resource):
+ prefix = getattr(self, 'prefix', '')
+ return '/'.join((prefix, resource)).rstrip('/')
+
+ def _get_converter(self, **kwargs):
+ converter = kwargs.get(
+ 'converter', # 1. in kwargs
+ getattr(self, 'converter', # 2. in handler
+ Modelizer())) # 3. Default
+
+ return converter
+
+ def _put(self, resource, **kwargs):
+ """ Put proxy request"""
+
+ return self._bool(resource, method='put', **kwargs)
+
+ def _delete(self, resource, **kwargs):
+ """ Delete proxy request"""
+
+ return self._bool(resource, method='delete', **kwargs)
+
+ def _bool(self, resource, **kwargs):
+ """ Handler request to boolean response """
+
+ from github3.exceptions import NotFound
+ resource = self._prefix_resource(resource)
+ try:
+ 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 """
+
+ resource = self._prefix_resource(resource)
+ page_resources = Paginate(resource, self._gh.get, **kwargs)
+ counter = 1
+ for page in page_resources:
+ 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)
+ else:
+ continue
+ break
+
+ def _get_resource(self, resource, model=None, **kwargs):
+ """ Handler request to single resource """
+
+ resource = self._prefix_resource(resource)
+ raw_resource = self._gh.get(resource)
+ converter = self._get_converter(**kwargs)
+ converter.inject(model)
+ return converter.loads(raw_resource)
+
+ def _post_resource(self, resource, data, model=None, **kwargs):
+ """ Handler request to create a resource """
+
+ resource = self._prefix_resource(resource)
+ raw_resource = self._gh.post(resource, data=data)
+ converter = self._get_converter(**kwargs)
+ converter.inject(model)
+ return converter.loads(raw_resource)