Changeset - 83159d73b13b
[Not reviewed]
beta
0 1 0
Marcin Kuzminski - 13 years ago 2012-11-18 20:07:45
marcin@python-works.com
merge ext_json with upstream
1 file changed with 30 insertions and 19 deletions:
0 comments (0 inline, 0 general)
rhodecode/lib/ext_json.py
Show inline comments
 
import datetime
 
import functools
 
import decimal
 
import imp
 

	
 
__all__ = ['json', 'simplejson', 'stdjson']
 
__all__ = ['json', 'simplejson', 'stdlibjson']
 

	
 

	
 
def _is_aware(value):
 
@@ -60,7 +61,7 @@ def _obj_dump(obj):
 
# Import simplejson
 
try:
 
    # import simplejson initially
 
    import simplejson
 
    _sj = imp.load_module('_sj', *imp.find_module('simplejson'))
 

	
 
    def extended_encode(obj):
 
        try:
 
@@ -70,12 +71,23 @@ try:
 
        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)
 
    sj_version = [int(x) for x in _sj.__version__.split('.')]
 
    major, minor = sj_version[0], sj_version[1]
 
    if major < 2 or (major == 2 and minor < 1):
 
        # simplejson < 2.1 doesnt support use_decimal
 
        _sj.dumps = functools.partial(_sj.dumps,
 
                                             default=extended_encode)
 
        _sj.dump = functools.partial(_sj.dump,
 
                                            default=extended_encode)
 
    else:
 
        _sj.dumps = functools.partial(_sj.dumps,
 
                                             default=extended_encode,
 
                                             use_decimal=False)
 
        _sj.dump = functools.partial(_sj.dump,
 
                                            default=extended_encode,
 
                                            use_decimal=False)
 
    simplejson = _sj
 

	
 
except ImportError:
 
    # no simplejson set it to None
 
    simplejson = None
 
@@ -83,10 +95,10 @@ except ImportError:
 

	
 
try:
 
    # simplejson not found try out regular json module
 
    import json
 
    _json = imp.load_module('_json', *imp.find_module('json'))
 

	
 
    # extended JSON encoder for json
 
    class ExtendedEncoder(json.JSONEncoder):
 
    class ExtendedEncoder(_json.JSONEncoder):
 
        def default(self, obj):
 
            try:
 
                return _obj_dump(obj)
 
@@ -94,18 +106,17 @@ try:
 
                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)
 
    _json.dumps = functools.partial(_json.dumps, cls=ExtendedEncoder)
 
    _json.dump = functools.partial(_json.dump, cls=ExtendedEncoder)
 

	
 
    stdlibjson = _json
 
except ImportError:
 
    json = None
 

	
 
stdlib = json
 
    stdlibjson = None
 

	
 
# set all available json modules
 
if simplejson:
 
    json = simplejson
 
elif json:
 
    json = json
 
    json = _sj
 
elif stdlibjson:
 
    json = _json
 
else:
 
    raise ImportError('Could not find any json modules')
 
    raise ImportError('Could not find any json modules')
 
\ No newline at end of file
0 comments (0 inline, 0 general)