# HG changeset patch # User RhodeCode Admin # Date 2023-03-20 19:33:56 # Node ID da637531830ded58ac837aeae8743345ec5f8e19 # Parent b21cebd3cc24ef064e638ca4305eb0e77e856fee deps: replaced simplejson with much faster orjson implementation diff --git a/requirements.txt b/requirements.txt --- a/requirements.txt +++ b/requirements.txt @@ -145,13 +145,12 @@ nbconvert==7.2.9 tinycss2==1.2.1 webencodings==0.5.1 traitlets==5.9.0 +orjson==3.8.7 pastescript==3.3.0 paste==3.5.2 six==1.16.0 pastedeploy==3.0.1 six==1.16.0 -pathlib2==2.3.7.post1 - six==1.16.0 premailer==3.10.0 cachetools==5.3.0 cssselect==1.2.0 diff --git a/rhodecode/lib/ext_json.py b/rhodecode/lib/ext_json.py --- a/rhodecode/lib/ext_json.py +++ b/rhodecode/lib/ext_json.py @@ -1,10 +1,15 @@ import datetime import decimal import functools +# we keep simplejson for having dump functionality still +# orjson doesn't support it +import orjson +import simplejson +import orjson as json -import simplejson as json from rhodecode.lib.datelib import is_aware +from rhodecode.lib.str_utils import safe_str try: import rhodecode.translation @@ -57,8 +62,22 @@ def _obj_dump(obj): raise TypeError(repr(obj) + " is not JSON serializable") -json.dumps = functools.partial(json.dumps, default=_obj_dump, use_decimal=False) -json.dump = functools.partial(json.dump, default=_obj_dump, use_decimal=False) +json.dumps = functools.partial(json.dumps, default=_obj_dump, option=orjson.OPT_NON_STR_KEYS) +json.dump = functools.partial(simplejson.dump, default=_obj_dump) + + +def formatted_json(*args, **kwargs): + # alias for formatted json + opts = orjson.OPT_NON_STR_KEYS | orjson.OPT_INDENT_2 | orjson.OPT_SORT_KEYS + return functools.partial(json.dumps, option=opts)(*args, **kwargs) + -# alias for formatted json -formatted_json = functools.partial(json.dumps, indent=4, sort_keys=True) +def formatted_str_json(*args, **kwargs): + opts = orjson.OPT_NON_STR_KEYS | orjson.OPT_INDENT_2 | orjson.OPT_SORT_KEYS + closure = functools.partial(json.dumps, option=opts) + return safe_str(closure(*args, **kwargs)) + + +def str_json(*args, **kwargs): + closure = functools.partial(json.dumps) + return safe_str(closure(*args, **kwargs))