aboutsummaryrefslogtreecommitdiffstats
path: root/github3/converters.py
diff options
context:
space:
mode:
Diffstat (limited to 'github3/converters.py')
-rw-r--r--github3/converters.py100
1 files changed, 100 insertions, 0 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