Mercurial > kallithea
view rhodecode/lib/ext_json.py @ 2865:6d9b3ade3051 beta
Allowing multiple issue servers to be autolinked in the changeset view;
linking is now contingent on issue_server_link, issue_pat and issue_prefix
being defined; multiple servers can be used by specifying a common suffix on all
the above variables, ie ..
issue_server_link_1
issue_pat_1
issue_prefix_1
.. and ..
issue_server_link_other
issue_pat_other
issue_prefix_other
.. would be treated as two distinct servers, but ..
issue_pat_thing
.. would be ignored (since the other two requisite vars aren't present).
This patch is backwards compatible with existing variables (as a suffix
isn't needed).
author | Zachary Auclair <zach101@gmail.com> |
---|---|
date | Thu, 20 Sep 2012 20:30:55 -0400 |
parents | 3ae42e10b665 |
children | 83159d73b13b |
line wrap: on
line source
import datetime import functools import decimal __all__ = ['json', 'simplejson', 'stdjson'] def _is_aware(value): """ Determines if a given datetime.time is aware. The logic is described in Python's docs: http://docs.python.org/library/datetime.html#datetime.tzinfo """ return (value.tzinfo is not None and value.tzinfo.utcoffset(value) is not None) def _obj_dump(obj): """ Custom function for dumping objects to JSON, if obj has __json__ attribute or method defined it will be used for serialization :param obj: """ if isinstance(obj, complex): return [obj.real, obj.imag] # See "Date Time String Format" in the ECMA-262 specification. # some code borrowed from django 1.4 elif isinstance(obj, datetime.datetime): r = obj.isoformat() if obj.microsecond: r = r[:23] + r[26:] if r.endswith('+00:00'): r = r[:-6] + 'Z' return r elif isinstance(obj, datetime.date): return obj.isoformat() elif isinstance(obj, decimal.Decimal): return str(obj) elif isinstance(obj, datetime.time): if _is_aware(obj): raise ValueError("JSON can't represent timezone-aware times.") r = obj.isoformat() if obj.microsecond: r = r[:12] return r elif isinstance(obj, set): return list(obj) elif hasattr(obj, '__json__'): if callable(obj.__json__): return obj.__json__() else: return obj.__json__ else: raise NotImplementedError # Import simplejson try: # import simplejson initially import simplejson def extended_encode(obj): try: return _obj_dump(obj) except NotImplementedError: pass raise TypeError("%r is not JSON serializable" % (obj,)) # we handle decimals our own it makes unified behavior of json vs # simplejson simplejson.dumps = functools.partial(simplejson.dumps, default=extended_encode, use_decimal=False) simplejson.dump = functools.partial(simplejson.dump, default=extended_encode, use_decimal=False) except ImportError: # no simplejson set it to None simplejson = None try: # simplejson not found try out regular json module import json # extended JSON encoder for json class ExtendedEncoder(json.JSONEncoder): def default(self, obj): try: return _obj_dump(obj) except NotImplementedError: pass raise TypeError("%r is not JSON serializable" % (obj,)) # monkey-patch JSON encoder to use extended version json.dumps = functools.partial(json.dumps, cls=ExtendedEncoder) json.dump = functools.partial(json.dump, cls=ExtendedEncoder) except ImportError: json = None stdlib = json # set all available json modules if simplejson: json = simplejson elif json: json = json else: raise ImportError('Could not find any json modules')