Skip to content
This repository was archived by the owner on Oct 24, 2022. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
beebe5c
Testing post gist
copitux Oct 29, 2011
c23698e
Wip on handlers
copitux Oct 29, 2011
b17dbea
Decouple Handlers and Models
copitux Nov 1, 2011
2506d0e
Merge branch 'handlers' into develop
copitux Nov 1, 2011
51d258b
Fix bug. Import own exceptions
copitux Nov 1, 2011
c0a5c2c
Fix bug. PEP8
copitux Nov 1, 2011
15b7cc0
Fix names. Added raw request
copitux Nov 1, 2011
d57caeb
Fix bug generate_url
copitux Nov 1, 2011
aeed4c5
Add get_bool request
copitux Nov 1, 2011
81f483a
Complete AuthUser handler
copitux Nov 1, 2011
bb54072
Refactor base to handler design
copitux Nov 4, 2011
bdc593a
Fix litle bugs and args to request
copitux Nov 5, 2011
7616bc8
Handlers and paginate resources
copitux Nov 5, 2011
dfc3826
Added gitignore, it doesn't matter
copitux Nov 6, 2011
df73c78
Doc and refactorize
copitux Nov 6, 2011
79b46e9
Cleaning files from origin repo
copitux Nov 6, 2011
6f2d211
Modelizer class. json<->model parser
copitux Nov 6, 2011
b9dc036
Fix typo
copitux Nov 7, 2011
a423c22
_post_resource
akaihola Nov 7, 2011
6d7b654
Added the create_gist() method
akaihola Nov 7, 2011
86da17c
Added akaihola to authors
akaihola Nov 7, 2011
878a2fa
Added create_gist() example to readme
akaihola Nov 7, 2011
e738e47
Fix clean
copitux Nov 8, 2011
d783e25
Abstract and decouple converters
copitux Nov 8, 2011
88f3b88
Added post_resource to handler
copitux Nov 8, 2011
a7cb909
Prefix handlers
copitux Nov 8, 2011
6dc5997
Added User/AuthUser handler
copitux Nov 8, 2011
c614dde
Added support for extra args to get_resources
copitux Nov 8, 2011
ba1fcac
Support for proxys in _bool handler
copitux Nov 8, 2011
40cbe59
Fixing bugs. Crazy night :S
copitux Nov 9, 2011
f1a03e9
Merged create_gist() into current HEAD of copitux/develop
akaihola Nov 9, 2011
15fd929
Updated example in README.rst to work with current version
akaihola Nov 9, 2011
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Abstract and decouple converters
  • Loading branch information
copitux committed Nov 8, 2011
commit d783e2580388b1c9d403959925fefdb967f765da
100 changes: 100 additions & 0 deletions github3/converters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
#
# author: David Medina
from .core import Converter

class Rawlizer(Converter):
""" Raw converter """

def inject(self, fake):
pass

def loads(self, raw_resource):
return raw_resource

def dumps(self):
pass

class Json(Converter):
""" Json converter """

def __init__(self):
import json
self.parser = json

def inject(self, fake):
pass

def loads(self, raw_resource):
return self.parser.dumps(raw_resource)

def dumps(self):
pass

class Modelizer(Converter):
""" Own model converter """

def __init__(self, model=None):
if model:
self.inject(model)

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 inject(self, model):
self.model = model

def _parse_map(self, model, raw_resource):
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 = {}
if not getattr(self, 'model', False):
raise NotImplementedError("%s needs model attr" %
self.__class__.__name__)
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, model):
# return JSON
pass
70 changes: 11 additions & 59 deletions github3/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,65 +49,17 @@ def next(self):
self.page += 1
return content

class Modelizer(object):
""" Converter json into model and vice versa """
class Converter(object):
""" Abstract converter class """

def __init__(self, model):
self.model = model

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 loads(self):
raise NotImplementedError("%s needs define '%s' method" %
(self.__class__.__name__, 'loads'))

def dumps(self):
# return JSON
pass
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'))
19 changes: 15 additions & 4 deletions github3/handlers/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
#
# author: David Medina

from github3.core import Paginate, Modelizer
from github3.core import Paginate
from github3.converters import Modelizer

class Handler(object):
""" Handler base. Requests to API and modelize responses """
Expand All @@ -12,6 +13,12 @@ def __init__(self, gh):
self._gh = gh
super(Handler, self).__init__()

def _get_converter(self):
try:
return getattr(self, 'converter')
except AttributeError:
return Modelizer()

def _bool(self, resource, **kwargs):
""" Handler request to boolean response """

Expand All @@ -33,8 +40,9 @@ def _get_resources(self, resource, model=None, limit=None):
for raw_resource in page:
if limit and counter > limit: break
counter += 1
yield Modelizer(model or self.model).loads(raw_resource)
#yield raw_resource
converter = self._get_converter()
converter.inject(model)
yield converter.loads(raw_resource)
else:
continue
break
Expand All @@ -43,4 +51,7 @@ def _get_resource(self, resource, model=None):
""" Handler request to single resource """

raw_resource = self._gh.get(resource)
return Modelizer(model or self.model).loads(raw_resource)
converter = self._get_converter()
converter.inject(model)
return converter.loads(raw_resource)