import datetime import decimal import json as jsonlib from .._compat import PY2, integer_types long = integer_types[-1] class Serializers(object): _custom_ = {} def _json_parse(self, o): if hasattr(o, "custom_json") and callable(o.custom_json): return o.custom_json() if isinstance(o, (datetime.date, datetime.datetime, datetime.time)): return o.isoformat()[:19].replace("T", " ") elif isinstance(o, long): return int(o) elif isinstance(o, decimal.Decimal): return str(o) elif isinstance(o, set): return list(o) elif hasattr(o, "as_list") and callable(o.as_list): return o.as_list() elif hasattr(o, "as_dict") and callable(o.as_dict): return o.as_dict() if self._custom_.get("json") is not None: return self._custom_["json"](o) raise TypeError(repr(o) + " is not JSON serializable") def __getattr__(self, name): if self._custom_.get(name) is not None: return self._custom_[name] raise NotImplementedError("No " + str(name) + " serializer available.") def json(self, value): value = jsonlib.dumps(value, default=self._json_parse) rep28 = r"\u2028" rep29 = r"\2029" if PY2: rep28 = rep28.decode("raw_unicode_escape") rep29 = rep29.decode("raw_unicode_escape") return value.replace(rep28, "\\u2028").replace(rep29, "\\u2029") def yaml(self, value): if self._custom_.get("yaml") is not None: return self._custom_.get("yaml")(value) try: from yaml import dump except ImportError: raise NotImplementedError("No yaml serializer available.") return dump(value) serializers = Serializers()