Skip to content

Commit 498d0c9

Browse files
EvanR-DevEvan Romangavin-aguiar
authored
feat: allow different json library imports (#285)
* add jsonutils * formatting * add simpeljson * format * orjson only * fix * fix * Fix * pydoc * add to files * rm kwargs * order * fb --------- Co-authored-by: Evan Roman <[email protected]> Co-authored-by: Gavin Aguiar <[email protected]>
1 parent 494c607 commit 498d0c9

File tree

18 files changed

+97
-17
lines changed

18 files changed

+97
-17
lines changed

azure/functions/_cosmosdb.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
# Licensed under the MIT License.
33

44
import collections
5-
import json
65

76
from . import _abc
7+
from ._jsonutils import json
88

99

1010
class Document(_abc.Document, collections.UserDict):

azure/functions/_http.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
import collections.abc
55
import http
66
import io
7-
import json
87
import types
98
import typing
109

10+
from ._jsonutils import json
1111
from werkzeug import formparser as _wk_parser
1212
from werkzeug import http as _wk_http
1313
from werkzeug.datastructures import (Headers, FileStorage, MultiDict,

azure/functions/_jsonutils.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# Copyright (c) Microsoft Corporation. All rights reserved.
2+
# Licensed under the MIT License.
3+
4+
from abc import ABC, abstractmethod
5+
from typing import Any, Union
6+
from types import SimpleNamespace
7+
8+
9+
"""
10+
Azure Functions JSON utilities.
11+
This module provides a JSON interface that can be used to serialize and
12+
deserialize objects to and from JSON format. It supports both the `orjson`
13+
and the standard `json` libraries, falling back to the standard library
14+
if `orjson` is not available (installed).
15+
"""
16+
17+
18+
try:
19+
import orjson as _orjson
20+
except ImportError:
21+
_orjson = None
22+
23+
# Standard library is always present
24+
import json as _std_json
25+
26+
27+
class JsonInterface(ABC):
28+
@abstractmethod
29+
def dumps(self, obj: Any) -> str:
30+
pass
31+
32+
@abstractmethod
33+
def loads(self, s: Union[str, bytes, bytearray]) -> Any:
34+
pass
35+
36+
37+
class OrJsonAdapter(JsonInterface):
38+
def __init__(self):
39+
assert _orjson is not None
40+
self.orjson = _orjson
41+
42+
def dumps(self, obj: Any) -> str:
43+
# orjson.dumps returns bytes, decode to str
44+
return self.orjson.dumps(obj).decode("utf-8")
45+
46+
def loads(self, s: Union[str, bytes, bytearray]) -> Any:
47+
return self.orjson.loads(s)
48+
49+
50+
class StdJsonAdapter(JsonInterface):
51+
def __init__(self):
52+
self.json = _std_json
53+
54+
def dumps(self, obj: Any) -> str:
55+
return self.json.dumps(obj)
56+
57+
def loads(self, s: Union[str, bytes, bytearray]) -> Any:
58+
return self.json.loads(s)
59+
60+
61+
if _orjson is not None:
62+
json_impl = OrJsonAdapter()
63+
else:
64+
json_impl = StdJsonAdapter()
65+
66+
67+
def dumps(obj: Any) -> str:
68+
return json_impl.dumps(obj)
69+
70+
71+
def loads(s: Union[str, bytes, bytearray]) -> Any:
72+
return json_impl.loads(s)
73+
74+
75+
json = SimpleNamespace(
76+
dumps=dumps,
77+
loads=loads
78+
)

azure/functions/_mysql.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
# Licensed under the MIT License.
33
import abc
44
import collections
5-
import json
5+
6+
from ._jsonutils import json
67

78

89
class BaseMySqlRow(abc.ABC):

azure/functions/_queue.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
# Licensed under the MIT License.
33

44
import datetime
5-
import json
65
import typing
76

87
from . import _abc
8+
from ._jsonutils import json
99

1010

1111
class QueueMessage(_abc.QueueMessage):

azure/functions/_sql.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
# Licensed under the MIT License.
33
import abc
44
import collections
5-
import json
5+
6+
from ._jsonutils import json
67

78

89
class BaseSqlRow(abc.ABC):

azure/functions/cosmosdb.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
# Licensed under the MIT License.
33

44
import collections.abc
5-
import json
65
import typing
76

87
from azure.functions import _cosmosdb as cdb
8+
from ._jsonutils import json
99

1010
from . import meta
1111

azure/functions/eventgrid.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33

44
import collections
55
import datetime
6-
import json
76
from typing import Optional, List, Any, Dict, Union
87

98
from azure.functions import _eventgrid as azf_eventgrid
9+
from ._jsonutils import json
1010

1111
from . import meta
1212
from .meta import Datum

azure/functions/eventhub.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# Copyright (c) Microsoft Corporation. All rights reserved.
22
# Licensed under the MIT License.
33

4-
import json
54
from typing import Dict, Any, List, Union, Optional, Mapping
65

76
from azure.functions import _eventhub
7+
from ._jsonutils import json
88

99
from . import meta
1010

azure/functions/extension/extension_meta.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33

44
from typing import Optional, Union, Dict, List
55
import abc
6-
import json
76
from .app_extension_hooks import AppExtensionHooks
87
from .func_extension_hooks import FuncExtensionHooks
98
from .extension_hook_meta import ExtensionHookMeta
109
from .extension_scope import ExtensionScope
1110
from .function_extension_exception import FunctionExtensionException
11+
from .._jsonutils import json
1212

1313

1414
class ExtensionMeta(abc.ABCMeta):

azure/functions/http.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# Copyright (c) Microsoft Corporation. All rights reserved.
22
# Licensed under the MIT License.
33

4-
import json
54
import logging
65
import sys
76
import typing
@@ -10,6 +9,7 @@
109
from azure.functions import _abc as azf_abc
1110
from azure.functions import _http as azf_http
1211
from . import meta
12+
from ._jsonutils import json
1313
from werkzeug.datastructures import Headers
1414

1515

azure/functions/kafka.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
# Licensed under the MIT License.
33

44
import typing
5-
import json
65

76
from typing import Any, List
87

98
from . import meta
9+
from ._jsonutils import json
1010

1111
from ._kafka import AbstractKafkaEvent
1212

azure/functions/meta.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
import abc
55
import collections.abc
66
import datetime
7-
import json
87
import re
98
from typing import Dict, Optional, Union, Tuple, Mapping, Any
109

10+
from ._jsonutils import json
1111
from ._thirdparty import typing_inspect
1212
from ._utils import (
1313
try_parse_datetime_with_formats,

azure/functions/mysql.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
# Licensed under the MIT License.
33

44
import collections.abc
5-
import json
65
import typing
76

87
from azure.functions import _mysql as mysql
98

109
from . import meta
10+
from ._jsonutils import json
1111

1212

1313
class MySqlConverter(meta.InConverter, meta.OutConverter,

azure/functions/queue.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33

44
import collections.abc
55
import datetime
6-
import json
76
from typing import List, Dict, Any, Union, Optional
87

98
from azure.functions import _abc as azf_abc
109
from azure.functions import _queue as azf_queue
1110

1211
from . import meta
12+
from ._jsonutils import json
1313

1414

1515
class QueueMessage(azf_queue.QueueMessage):

azure/functions/servicebus.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
# Licensed under the MIT License.
33

44
import datetime
5-
import json
65
from typing import Dict, Any, List, Union, Optional, Mapping, cast
76

87
from azure.functions import _servicebus as azf_sbus
98

109
from . import meta
10+
from ._jsonutils import json
1111

1212

1313
class ServiceBusMessage(azf_sbus.ServiceBusMessage):

azure/functions/sql.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
# Licensed under the MIT License.
33

44
import collections.abc
5-
import json
65
import typing
76

87
from azure.functions import _sql as sql
98

109
from . import meta
10+
from ._jsonutils import json
1111

1212

1313
class SqlConverter(meta.InConverter, meta.OutConverter,

azure/functions/timer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
# Copyright (c) Microsoft Corporation. All rights reserved.
22
# Licensed under the MIT License.
33

4-
import json
54
import typing
65

76
from azure.functions import _abc as azf_abc
87
from . import meta
8+
from ._jsonutils import json
99

1010

1111
class TimerRequest(azf_abc.TimerRequest):

0 commit comments

Comments
 (0)