bazarr/libs/flask/json/__init__.py

171 lines
5.5 KiB
Python
Raw Normal View History

2022-11-07 18:06:49 +00:00
from __future__ import annotations
import json as _json
import typing as t
2019-11-28 11:40:45 +00:00
from ..globals import current_app
2022-11-07 18:06:49 +00:00
from .provider import _default
2019-11-28 11:40:45 +00:00
2022-11-07 18:06:49 +00:00
if t.TYPE_CHECKING: # pragma: no cover
from ..wrappers import Response
2019-11-28 11:40:45 +00:00
def dumps(obj: t.Any, **kwargs: t.Any) -> str:
2022-11-07 18:06:49 +00:00
"""Serialize data as JSON.
2019-11-28 11:40:45 +00:00
2022-11-07 18:06:49 +00:00
If :data:`~flask.current_app` is available, it will use its
:meth:`app.json.dumps() <flask.json.provider.JSONProvider.dumps>`
method, otherwise it will use :func:`json.dumps`.
2019-11-28 11:40:45 +00:00
2022-11-07 18:06:49 +00:00
:param obj: The data to serialize.
:param kwargs: Arguments passed to the ``dumps`` implementation.
2019-11-28 11:40:45 +00:00
.. versionchanged:: 2.3
The ``app`` parameter was removed.
2022-11-07 18:06:49 +00:00
.. versionchanged:: 2.2
Calls ``current_app.json.dumps``, allowing an app to override
the behavior.
2019-11-28 11:40:45 +00:00
.. versionchanged:: 2.0.2
:class:`decimal.Decimal` is supported by converting to a string.
.. versionchanged:: 2.0
2022-11-07 18:06:49 +00:00
``encoding`` will be removed in Flask 2.1.
.. versionchanged:: 1.0.3
``app`` can be passed directly, rather than requiring an app
context for configuration.
2019-11-28 11:40:45 +00:00
"""
if current_app:
return current_app.json.dumps(obj, **kwargs)
2019-11-28 11:40:45 +00:00
2022-11-07 18:06:49 +00:00
kwargs.setdefault("default", _default)
return _json.dumps(obj, **kwargs)
2019-11-28 11:40:45 +00:00
def dump(obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None:
2022-11-07 18:06:49 +00:00
"""Serialize data as JSON and write to a file.
2019-11-28 11:40:45 +00:00
2022-11-07 18:06:49 +00:00
If :data:`~flask.current_app` is available, it will use its
:meth:`app.json.dump() <flask.json.provider.JSONProvider.dump>`
method, otherwise it will use :func:`json.dump`.
2019-11-28 11:40:45 +00:00
2022-11-07 18:06:49 +00:00
:param obj: The data to serialize.
:param fp: A file opened for writing text. Should use the UTF-8
encoding to be valid JSON.
:param kwargs: Arguments passed to the ``dump`` implementation.
.. versionchanged:: 2.3
The ``app`` parameter was removed.
2022-11-07 18:06:49 +00:00
.. versionchanged:: 2.2
Calls ``current_app.json.dump``, allowing an app to override
the behavior.
.. versionchanged:: 2.0
2022-11-07 18:06:49 +00:00
Writing to a binary file, and the ``encoding`` argument, will be
removed in Flask 2.1.
"""
if current_app:
current_app.json.dump(obj, fp, **kwargs)
2022-11-07 18:06:49 +00:00
else:
kwargs.setdefault("default", _default)
_json.dump(obj, fp, **kwargs)
2019-11-28 11:40:45 +00:00
def loads(s: str | bytes, **kwargs: t.Any) -> t.Any:
2022-11-07 18:06:49 +00:00
"""Deserialize data as JSON.
2019-11-28 11:40:45 +00:00
2022-11-07 18:06:49 +00:00
If :data:`~flask.current_app` is available, it will use its
:meth:`app.json.loads() <flask.json.provider.JSONProvider.loads>`
method, otherwise it will use :func:`json.loads`.
2019-11-28 11:40:45 +00:00
2022-11-07 18:06:49 +00:00
:param s: Text or UTF-8 bytes.
:param kwargs: Arguments passed to the ``loads`` implementation.
2019-11-28 11:40:45 +00:00
.. versionchanged:: 2.3
The ``app`` parameter was removed.
2022-11-07 18:06:49 +00:00
.. versionchanged:: 2.2
Calls ``current_app.json.loads``, allowing an app to override
the behavior.
2019-11-28 11:40:45 +00:00
.. versionchanged:: 2.0
2022-11-07 18:06:49 +00:00
``encoding`` will be removed in Flask 2.1. The data must be a
string or UTF-8 bytes.
2019-11-28 11:40:45 +00:00
.. versionchanged:: 1.0.3
``app`` can be passed directly, rather than requiring an app
context for configuration.
"""
if current_app:
return current_app.json.loads(s, **kwargs)
2019-11-28 11:40:45 +00:00
return _json.loads(s, **kwargs)
2019-11-28 11:40:45 +00:00
def load(fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any:
2022-11-07 18:06:49 +00:00
"""Deserialize data as JSON read from a file.
If :data:`~flask.current_app` is available, it will use its
:meth:`app.json.load() <flask.json.provider.JSONProvider.load>`
method, otherwise it will use :func:`json.load`.
2019-11-28 11:40:45 +00:00
2022-11-07 18:06:49 +00:00
:param fp: A file opened for reading text or UTF-8 bytes.
:param kwargs: Arguments passed to the ``load`` implementation.
2019-11-28 11:40:45 +00:00
.. versionchanged:: 2.3
The ``app`` parameter was removed.
2022-11-07 18:06:49 +00:00
.. versionchanged:: 2.2
Calls ``current_app.json.load``, allowing an app to override
the behavior.
.. versionchanged:: 2.2
The ``app`` parameter will be removed in Flask 2.3.
.. versionchanged:: 2.0
2022-11-07 18:06:49 +00:00
``encoding`` will be removed in Flask 2.1. The file must be text
mode, or binary mode with UTF-8 bytes.
2019-11-28 11:40:45 +00:00
"""
if current_app:
return current_app.json.load(fp, **kwargs)
2019-11-28 11:40:45 +00:00
return _json.load(fp, **kwargs)
2022-11-07 18:06:49 +00:00
def jsonify(*args: t.Any, **kwargs: t.Any) -> Response:
"""Serialize the given arguments as JSON, and return a
:class:`~flask.Response` object with the ``application/json``
mimetype. A dict or list returned from a view will be converted to a
JSON response automatically without needing to call this.
2019-11-28 11:40:45 +00:00
2022-11-07 18:06:49 +00:00
This requires an active request or application context, and calls
:meth:`app.json.response() <flask.json.provider.JSONProvider.response>`.
2019-11-28 11:40:45 +00:00
2022-11-07 18:06:49 +00:00
In debug mode, the output is formatted with indentation to make it
easier to read. This may also be controlled by the provider.
2022-11-07 18:06:49 +00:00
Either positional or keyword arguments can be given, not both.
If no arguments are given, ``None`` is serialized.
2019-11-28 11:40:45 +00:00
2022-11-07 18:06:49 +00:00
:param args: A single value to serialize, or multiple values to
treat as a list to serialize.
:param kwargs: Treat as a dict to serialize.
2019-11-28 11:40:45 +00:00
2022-11-07 18:06:49 +00:00
.. versionchanged:: 2.2
Calls ``current_app.json.response``, allowing an app to override
the behavior.
2019-11-28 11:40:45 +00:00
.. versionchanged:: 2.0.2
:class:`decimal.Decimal` is supported by converting to a string.
2019-11-28 11:40:45 +00:00
.. versionchanged:: 0.11
2022-11-07 18:06:49 +00:00
Added support for serializing top-level arrays. This was a
security risk in ancient browsers. See :ref:`security-json`.
2019-11-28 11:40:45 +00:00
.. versionadded:: 0.2
"""
return current_app.json.response(*args, **kwargs) # type: ignore[return-value]