diff options
| author | 2011-11-08 11:27:36 +0100 | |
|---|---|---|
| committer | 2011-11-08 23:00:41 +0100 | |
| commit | d783e2580388b1c9d403959925fefdb967f765da (patch) | |
| tree | 77e87224613c3a953659ceec11cc9da185eb0477 /github3/converters.py | |
| parent | Fix clean (diff) | |
| download | python-github3-d783e2580388b1c9d403959925fefdb967f765da.tar.xz python-github3-d783e2580388b1c9d403959925fefdb967f765da.zip | |
Abstract and decouple converters
Diffstat (limited to '')
| -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 |
