3
eH/                 @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZ d dlmZ ddlmZ ddlmZ ejrddlmZ dd	lmZ yd dlZW n ek
r   dZY nX G d
d dejZG dd dejZd*ejeejf ejd ddddZd+ejeejf ejd ddddZ d,ejejd ejedddZ!d-ejej"e ejd ejddddZ#d.eejd ejejdddZ$d/ej"e ejd ejejdddZ%ejejed d!d"Z&ejej"e ejdd#d$d%Z'ejejd&d'd(d)Z(dS )0    N)date)htmlsafe_json_dumps)	http_date   )current_app)request)Flask)Responsec                   s,   e Zd ZdZejejd fddZ  ZS )JSONEncodera  The default JSON encoder. Handles extra types compared to the
    built-in :class:`json.JSONEncoder`.

    -   :class:`datetime.datetime` and :class:`datetime.date` are
        serialized to :rfc:`822` strings. This is the same as the HTTP
        date format.
    -   :class:`uuid.UUID` is serialized to a string.
    -   :class:`dataclasses.dataclass` is passed to
        :func:`dataclasses.asdict`.
    -   :class:`~markupsafe.Markup` (or any object with a ``__html__``
        method) will call the ``__html__`` method to get a string.

    Assign a subclass of this to :attr:`flask.Flask.json_encoder` or
    :attr:`flask.Blueprint.json_encoder` to override the default.
    )oreturnc                sf   t |trt|S t |tjtjfr,t|S trDtj	|rDtj
|S t|drZt|j S t j|S )zConvert ``o`` to a JSON serializable type. See
        :meth:`json.JSONEncoder.default`. Python does not support
        overriding how basic types like ``str`` or ``list`` are
        serialized, they are handled before this method.
        __html__)
isinstancer   r   decimalDecimaluuidUUIDstrdataclassesZis_dataclassZasdicthasattrr   superdefault)selfr   )	__class__ 4/tmp/pip-build-3irwxpxt/Flask/flask/json/__init__.pyr   +   s    


zJSONEncoder.default)__name__
__module____qualname____doc__tAnyr   __classcell__r   r   )r   r   r
      s   r
   c               @   s   e Zd ZdZdS )JSONDecoderzThe default JSON decoder.

    This does not change any behavior from the built-in
    :class:`json.JSONDecoder`.

    Assign a subclass of this to :attr:`flask.Flask.json_decoder` or
    :attr:`flask.Blueprint.json_decoder` to override the default.
    N)r   r   r   r   r   r   r   r   r#   <   s   r#   r   )kwargsappr   c             C   s   |dkrt }|r|j}tr(|jjtjnd}|dk	rD|jdk	rD|j}|tjk	rZ| jd| | jd| | jd|j	d  | jd|j	d  n| jdd | jdt dS )z,Inject default arguments for dump functions.Nclsensure_asciiZJSON_AS_ASCII	sort_keysZJSON_SORT_KEYST)
r   Zjson_encoderr   
blueprintsget	blueprint_jsonr
   
setdefaultconfig)r$   r%   r&   bpr   r   r   _dump_arg_defaultsG   s    
r0   c             C   sb   |dkrt }|r^|j}tr(|jjtjnd}|dk	rD|jdk	rD|j}|ttjhkr^| jd| dS )z,Inject default arguments for load functions.Nr&   )	r   Zjson_decoderr   r)   r*   r+   r#   r,   r-   )r$   r%   r&   r/   r   r   r   _load_arg_defaultsa   s    r1   )objr%   r$   r   c             K   sV   t ||d |jdd}tj| f|}|dk	rRtjdtdd t|trR|j	|S |S )a  Serialize an object to a string of JSON.

    Takes the same arguments as the built-in :func:`json.dumps`, with
    some defaults from application configuration.

    :param obj: Object to serialize to JSON.
    :param app: Use this app's config instead of the active app context
        or defaults.
    :param kwargs: Extra arguments passed to :func:`json.dumps`.

    .. versionchanged:: 2.0.2
        :class:`decimal.Decimal` is supported by converting to a string.

    .. versionchanged:: 2.0
        ``encoding`` is deprecated and will be removed in Flask 2.1.

    .. versionchanged:: 1.0.3
        ``app`` can be passed directly, rather than requiring an app
        context for configuration.
    )r%   encodingNz:'encoding' is deprecated and will be removed in Flask 2.1.r   )
stacklevel)
r0   popr,   dumpswarningswarnDeprecationWarningr   r   encode)r2   r%   r$   r3   rvr   r   r   r6   t   s    

r6   )r2   fpr%   r$   r   c             K   s   t ||d |jdd}|dk	}y|jd W n( tk
rV   d}tj||pNd}Y nX |rltjdtdd	 t	j
| |f| dS )
a@  Serialize an object to JSON written to a file object.

    Takes the same arguments as the built-in :func:`json.dump`, with
    some defaults from application configuration.

    :param obj: Object to serialize to JSON.
    :param fp: File object to write JSON to.
    :param app: Use this app's config instead of the active app context
        or defaults.
    :param kwargs: Extra arguments passed to :func:`json.dump`.

    .. versionchanged:: 2.0
        Writing to a binary file, and the ``encoding`` argument, is
        deprecated and will be removed in Flask 2.1.
    )r%   r3   N Tzutf-8zfWriting to a binary file, and the 'encoding' argument, is deprecated and will be removed in Flask 2.1.r   )r4   )r0   r5   write	TypeErrorioTextIOWrapperr7   r8   r9   r,   dump)r2   r<   r%   r$   r3   Zshow_warningr   r   r   rB      s    rB   )sr%   r$   r   c             K   sR   t ||d |jdd}|dk	rDtjdtdd t| trD| j|} tj	| f|S )a  Deserialize an object from a string of JSON.

    Takes the same arguments as the built-in :func:`json.loads`, with
    some defaults from application configuration.

    :param s: JSON string to deserialize.
    :param app: Use this app's config instead of the active app context
        or defaults.
    :param kwargs: Extra arguments passed to :func:`json.loads`.

    .. versionchanged:: 2.0
        ``encoding`` is deprecated and will be removed in Flask 2.1. The
        data must be a string or UTF-8 bytes.

    .. versionchanged:: 1.0.3
        ``app`` can be passed directly, rather than requiring an app
        context for configuration.
    )r%   r3   Nzd'encoding' is deprecated and will be removed in Flask 2.1. The data must be a string or UTF-8 bytes.r   )r4   )
r1   r5   r7   r8   r9   r   bytesdecoder,   loads)rC   r%   r$   r3   r   r   r   rF      s    

rF   )r<   r%   r$   r   c             K   sZ   t ||d |jdd}|dk	rLtjdtdd t| jdtrLtj	| |} t
j| f|S )a(  Deserialize an object from JSON read from a file object.

    Takes the same arguments as the built-in :func:`json.load`, with
    some defaults from application configuration.

    :param fp: File object to read JSON from.
    :param app: Use this app's config instead of the active app context
        or defaults.
    :param kwargs: Extra arguments passed to :func:`json.load`.

    .. versionchanged:: 2.0
        ``encoding`` is deprecated and will be removed in Flask 2.1. The
        file must be text mode, or binary mode with UTF-8 bytes.
    )r%   r3   Nzw'encoding' is deprecated and will be removed in Flask 2.1. The file must be text mode, or binary mode with UTF-8 bytes.r   )r4   r   )r1   r5   r7   r8   r9   r   readrD   r@   rA   r,   load)r<   r%   r$   r3   r   r   r   rH      s    rH   )r2   r$   r   c             K   s   t | fdti|S )a6  Serialize an object to a string of JSON with :func:`dumps`, then
    replace HTML-unsafe characters with Unicode escapes and mark the
    result safe with :class:`~markupsafe.Markup`.

    This is available in templates as the ``|tojson`` filter.

    The returned string is safe to render in HTML documents and
    ``<script>`` tags. The exception is in HTML attributes that are
    double quoted; either use single quotes or the ``|forceescape``
    filter.

    .. versionchanged:: 2.0
        Uses :func:`jinja2.utils.htmlsafe_json_dumps`. The returned
        value is marked safe by wrapping in :class:`~markupsafe.Markup`.

    .. versionchanged:: 0.10
        Single quotes are escaped, making this safe to use in HTML,
        ``<script>`` tags, and single-quoted attributes without further
        escaping.
    r6   )_jinja_htmlsafe_dumpsr6   )r2   r$   r   r   r   htmlsafe_dumps  s    rJ   )r2   r<   r$   r   c             K   s   |j t| f| dS )zSerialize an object to JSON written to a file object, replacing
    HTML-unsafe characters with Unicode escapes. See
    :func:`htmlsafe_dumps` and :func:`dumps`.
    N)r>   rJ   )r2   r<   r$   r   r   r   htmlsafe_dump  s    rK   r	   )argsr$   r   c              O   st   d}d}t jd st jr d}d}| r2|r2tdnt| d	krH| d
 }n| pN|}t jt|||d dt jd dS )a  Serialize data to JSON and wrap it in a :class:`~flask.Response`
    with the :mimetype:`application/json` mimetype.

    Uses :func:`dumps` to serialize the data, but ``args`` and
    ``kwargs`` are treated as data rather than arguments to
    :func:`json.dumps`.

    1.  Single argument: Treated as a single value.
    2.  Multiple arguments: Treated as a list of values.
        ``jsonify(1, 2, 3)`` is the same as ``jsonify([1, 2, 3])``.
    3.  Keyword arguments: Treated as a dict of values.
        ``jsonify(data=data, errors=errors)`` is the same as
        ``jsonify({"data": data, "errors": errors})``.
    4.  Passing both arguments and keyword arguments is not allowed as
        it's not clear what should happen.

    .. code-block:: python

        from flask import jsonify

        @app.route("/users/me")
        def get_current_user():
            return jsonify(
                username=g.user.username,
                email=g.user.email,
                id=g.user.id,
            )

    Will return a JSON response like this:

    .. code-block:: javascript

        {
          "username": "admin",
          "email": "admin@localhost",
          "id": 42
        }

    The default output omits indents and spaces after separators. In
    debug mode or if :data:`JSONIFY_PRETTYPRINT_REGULAR` is ``True``,
    the output will be formatted to be easier to read.

    .. versionchanged:: 2.0.2
        :class:`decimal.Decimal` is supported by converting to a string.

    .. versionchanged:: 0.11
        Added support for serializing top-level arrays. This introduces
        a security risk in ancient browsers. See :ref:`security-json`.

    .. versionadded:: 0.2
    N,:ZJSONIFY_PRETTYPRINT_REGULARr   , : z=jsonify() behavior undefined when passed both args and kwargs   r   )indent
separators
ZJSONIFY_MIMETYPE)mimetype)rM   rN   )rO   rP   )r   r.   debugr?   lenresponse_classr6   )rL   r$   rR   rS   datar   r   r   jsonify&  s    4

rZ   )N)N)N)N)N)N))r   r@   jsonr,   typingr    r   r7   datetimer   Zjinja2.utilsr   rI   Zwerkzeug.httpr   globalsr   r   ZTYPE_CHECKINGr%   r   Zwrappersr	   r   ImportErrorr
   r#   Dictr   r!   Optionalr0   r1   r6   ZIOrB   rF   rH   rJ   rK   rZ   r   r   r   r   <module>   s>   
" '% $&!