diff options
Diffstat (limited to 'github3/handlers/base.py')
-rw-r--r-- | github3/handlers/base.py | 85 |
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) |