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