From 0eaff19761538c9c08998eec59a97cb03de80407 Mon Sep 17 00:00:00 2001 From: Evan Blaudy Date: Mon, 25 Sep 2023 23:19:17 +0200 Subject: [PATCH] [qa] use orjson instead of json lib everywhere --- tests/auth/test_auth_route.py | 2 +- tests/base.py | 2 +- tests/misc/test_commands.py | 6 +++--- tests/source/csv/test_import_assets.py | 2 +- tests/source/shotgun/base.py | 2 +- zou/app/blueprints/auth/resources.py | 4 +--- zou/app/blueprints/comments/resources.py | 2 +- zou/app/blueprints/crud/base.py | 2 +- zou/app/config.py | 1 - zou/app/services/file_tree_service.py | 2 +- zou/app/services/playlists_service.py | 2 +- zou/app/utils/api.py | 4 ++-- zou/app/utils/commands.py | 2 +- zou/app/utils/fields.py | 4 ---- zou/app/utils/flask.py | 23 +++++++++++++++++++++-- zou/app/utils/remote_job.py | 2 +- zou/remote/config_payload.py | 2 +- zou/remote/playlist.py | 2 +- 18 files changed, 39 insertions(+), 27 deletions(-) diff --git a/tests/auth/test_auth_route.py b/tests/auth/test_auth_route.py index e2e11c5f86..30a7b7de33 100644 --- a/tests/auth/test_auth_route.py +++ b/tests/auth/test_auth_route.py @@ -1,4 +1,4 @@ -import json +import orjson as json from tests.base import ApiDBTestCase diff --git a/tests/base.py b/tests/base.py index f96a35988c..4bee6867d2 100644 --- a/tests/base.py +++ b/tests/base.py @@ -1,6 +1,6 @@ import datetime import unittest -import json +import orjson as json import os import ntpath diff --git a/tests/misc/test_commands.py b/tests/misc/test_commands.py index 2902b92dca..33b97265cc 100644 --- a/tests/misc/test_commands.py +++ b/tests/misc/test_commands.py @@ -1,4 +1,4 @@ -import json +import orjson as json import datetime from tests.base import ApiDBTestCase @@ -34,7 +34,7 @@ def test_clean_auth_tokens_revoked(self): }, "revoked": False, } - ).encode("utf-8"), + ), ) self.store.add( "testkey2", @@ -45,7 +45,7 @@ def test_clean_auth_tokens_revoked(self): }, "revoked": True, } - ).encode("utf-8"), + ), ) self.assertEqual(len(self.store.keys()), 2) commands.clean_auth_tokens() diff --git a/tests/source/csv/test_import_assets.py b/tests/source/csv/test_import_assets.py index 82383e74c7..6ebb93862c 100644 --- a/tests/source/csv/test_import_assets.py +++ b/tests/source/csv/test_import_assets.py @@ -1,5 +1,5 @@ import os -import json +import orjson as json from tests.base import ApiDBTestCase from zou.app import db diff --git a/tests/source/shotgun/base.py b/tests/source/shotgun/base.py index b01add53ad..4db73a8cda 100644 --- a/tests/source/shotgun/base.py +++ b/tests/source/shotgun/base.py @@ -1,4 +1,4 @@ -import json +import orjson as json from tests.base import ApiDBTestCase diff --git a/zou/app/blueprints/auth/resources.py b/zou/app/blueprints/auth/resources.py index 00799a0de5..b7587eac4f 100644 --- a/zou/app/blueprints/auth/resources.py +++ b/zou/app/blueprints/auth/resources.py @@ -83,9 +83,7 @@ def wrong_auth_handler(identity_user=None): @identity_loaded.connect_via(app) def on_identity_loaded(sender, identity): - if identity.id is not None: - from zou.app.services import persons_service - + if isinstance(identity.id, str): try: identity.user = persons_service.get_person(identity.id) diff --git a/zou/app/blueprints/comments/resources.py b/zou/app/blueprints/comments/resources.py index 2a1dcf66b4..9559464ca8 100644 --- a/zou/app/blueprints/comments/resources.py +++ b/zou/app/blueprints/comments/resources.py @@ -1,4 +1,4 @@ -import json +import orjson as json from flask import abort, request, send_file as flask_send_file from flask_restful import Resource, reqparse diff --git a/zou/app/blueprints/crud/base.py b/zou/app/blueprints/crud/base.py index 5d351d0ffd..7a212e5470 100644 --- a/zou/app/blueprints/crud/base.py +++ b/zou/app/blueprints/crud/base.py @@ -1,5 +1,5 @@ import math -import json +import orjson as json import sqlalchemy.orm as orm from flask import request, abort, current_app diff --git a/zou/app/config.py b/zou/app/config.py index d818dea4ef..3f47cb152c 100644 --- a/zou/app/config.py +++ b/zou/app/config.py @@ -6,7 +6,6 @@ from zou.app.utils.env import envtobool, env_with_semicolon_to_list PROPAGATE_EXCEPTIONS = True -RESTFUL_JSON = {"ensure_ascii": False} DEBUG = envtobool("DEBUG", False) DEBUG_PORT = int(os.getenv("DEBUG_PORT", 5000)) diff --git a/zou/app/services/file_tree_service.py b/zou/app/services/file_tree_service.py index 9b4dcd09cf..83f547acbd 100644 --- a/zou/app/services/file_tree_service.py +++ b/zou/app/services/file_tree_service.py @@ -1,6 +1,6 @@ import os import re -import json +import orjson as json from collections import OrderedDict from slugify import slugify diff --git a/zou/app/services/playlists_service.py b/zou/app/services/playlists_service.py index 0c8688f720..6c54b13e78 100644 --- a/zou/app/services/playlists_service.py +++ b/zou/app/services/playlists_service.py @@ -1,6 +1,6 @@ import base64 -import json +import orjson as json import os import zlib diff --git a/zou/app/utils/api.py b/zou/app/utils/api.py index e7bc9d0e3e..f4369f1196 100644 --- a/zou/app/utils/api.py +++ b/zou/app/utils/api.py @@ -1,4 +1,5 @@ -from flask_restful import Api, output_json +from flask_restful import Api +from zou.app.utils.flask import output_json def configure_api_from_blueprint(blueprint, route_tuples): @@ -13,7 +14,6 @@ def configure_api_from_blueprint(blueprint, route_tuples): api = Api(blueprint, catch_all_404s=True) api.representations = { - "application/json; charset=utf-8": output_json, "application/json": output_json, } diff --git a/zou/app/utils/commands.py b/zou/app/utils/commands.py index e808b7ae9a..6003abee8f 100644 --- a/zou/app/utils/commands.py +++ b/zou/app/utils/commands.py @@ -1,7 +1,7 @@ # coding: utf-8 import os -import json +import orjson as json import datetime import tempfile diff --git a/zou/app/utils/fields.py b/zou/app/utils/fields.py index b6f460aa3b..807ec83d08 100644 --- a/zou/app/utils/fields.py +++ b/zou/app/utils/fields.py @@ -26,10 +26,6 @@ def serialize_value(value): return serialize_orm_arrays(value) elif isinstance(value, bytes): return value.decode("utf-8") - elif isinstance(value, str): - return value - elif isinstance(value, int): - return value elif isinstance(value, list): return serialize_list(value) elif isinstance(value, Locale): diff --git a/zou/app/utils/flask.py b/zou/app/utils/flask.py index 88f75a5313..9367dc1230 100644 --- a/zou/app/utils/flask.py +++ b/zou/app/utils/flask.py @@ -2,8 +2,28 @@ from werkzeug.user_agent import UserAgent from werkzeug.utils import cached_property from flask.json.provider import JSONProvider +from flask import current_app, make_response import orjson +orjson_options = orjson.OPT_NON_STR_KEYS + + +def output_json(data, code, headers=None): + """Makes a Flask response with a JSON encoded body""" + + # If we're in debug mode, and the indent is not set, we set it to a + # reasonable value here. Note that this won't override any existing value + # that was set. + option = orjson_options + if current_app.debug: + option |= orjson.OPT_INDENT_2 + + dumped = orjson.dumps(data, option=option).decode("utf-8") + + resp = make_response(dumped, code) + resp.headers.extend(headers or {}) + return resp + class ORJSONProvider(JSONProvider): def __init__(self, *args, **kwargs): @@ -14,8 +34,7 @@ def loads(self, s, **kwargs): return orjson.loads(s) def dumps(self, obj, **kwargs): - # decode back to str, as orjson returns bytes - return orjson.dumps(obj, option=orjson.OPT_NON_STR_KEYS) + return orjson.dumps(obj, option=orjson_options).decode("utf-8") class ParsedUserAgent(UserAgent): diff --git a/zou/app/utils/remote_job.py b/zou/app/utils/remote_job.py index 26916d2e5b..9e58e95fb6 100644 --- a/zou/app/utils/remote_job.py +++ b/zou/app/utils/remote_job.py @@ -1,6 +1,6 @@ import nomad import base64 -import json +import orjson as json import textwrap import time diff --git a/zou/remote/config_payload.py b/zou/remote/config_payload.py index 804cc675b6..c0d72f6d4f 100644 --- a/zou/remote/config_payload.py +++ b/zou/remote/config_payload.py @@ -1,5 +1,5 @@ import os -import json +import orjson as json import sys from pathlib import Path diff --git a/zou/remote/playlist.py b/zou/remote/playlist.py index 47694e3952..e2188701c6 100755 --- a/zou/remote/playlist.py +++ b/zou/remote/playlist.py @@ -1,6 +1,6 @@ #!/usr/bin/env python import base64 -import json +import orjson as json import logging import os import sys