aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--github3/converters.py100
-rw-r--r--github3/core.py70
-rw-r--r--github3/handlers/base.py19
3 files changed, 126 insertions, 63 deletions
diff --git a/github3/converters.py b/github3/converters.py
new file mode 100644
index 0000000..1df61a6
--- /dev/null
+++ b/github3/converters.py
@@ -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
diff --git a/github3/core.py b/github3/core.py
index ccc9f7b..5c7343a 100644
--- a/github3/core.py
+++ b/github3/core.py
@@ -49,65 +49,17 @@ class Paginate:
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'))
diff --git a/github3/handlers/base.py b/github3/handlers/base.py
index de470e9..858ca51 100644
--- a/github3/handlers/base.py
+++ b/github3/handlers/base.py
@@ -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 """
@@ -12,6 +13,12 @@ class Handler(object):
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 """
@@ -33,8 +40,9 @@ class Handler(object):
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
@@ -43,4 +51,7 @@ class Handler(object):
""" 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)
+