B
    }hb6W                 @   sJ  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 d d
lmZ edZejdejdejf dZejd ddddZG dd dZG dd deje ZG dd dZG dd dZG dd deZeedddZeed d!d"Z G d#d$ d$eje Z!dS )%    N)
ContextVar)partial)update_wrapper)
attrgetter   )ClosingIterator)StartResponse)WSGIApplication)WSGIEnvironmentTF.)Zbound)Local
LocalStack)localreturnc             C   s   |    dS )zRelease the data for the current context in a :class:`Local` or
    :class:`LocalStack` without using a :class:`LocalManager`.

    This should not be needed for modern use cases, and may be removed
    in the future.

    .. versionadded:: 0.6.1
    N)__release_local__)r    r   -lib/python3.7/site-packages/werkzeug/local.pyrelease_local   s    	r   c               @   s   e Zd ZdZdZdejeeje	ej
f   ddddZejeje	ej
f  ddd	Zdd
e	eje	 ddddZddddZe	ej
dddZe	ej
ddddZe	ddddZdS )r   aq  Create a namespace of context-local data. This wraps a
    :class:`ContextVar` containing a :class:`dict` value.

    This may incur a performance penalty compared to using individual
    context vars, as it has to copy data to avoid mutating the dict
    between nested contexts.

    :param context_var: The :class:`~contextvars.ContextVar` to use as
        storage for this local. If not given, one will be created.
        Context vars not created at the global scope may interfere with
        garbage collection.

    .. versionchanged:: 2.0
        Uses ``ContextVar`` instead of a custom storage implementation.
    )Z	__storageN)context_varr   c             C   s.   |d krt dt|  d}t| d| d S )Nzwerkzeug.Local<z	>.storage_Local__storage)r   idobject__setattr__)selfr   r   r   r   __init__4   s    zLocal.__init__)r   c             C   s   t | ji  S )N)iterr   getitems)r   r   r   r   __iter__@   s    zLocal.__iter__)unbound_message
LocalProxy)namer    r   c            C   s   t | ||dS )zCreate a :class:`LocalProxy` that access an attribute on this
        local namespace.

        :param name: Proxy this attribute.
        :param unbound_message: The error message that the proxy will
            show if the attribute isn't set.
        )r    )r!   )r   r"   r    r   r   r   __call__C   s    
zLocal.__call__c             C   s   | j i  d S )N)r   set)r   r   r   r   r   O   s    zLocal.__release_local__)r"   r   c             C   s(   | j i }||kr|| S t|d S )N)r   r   AttributeError)r   r"   valuesr   r   r   __getattr__R   s    zLocal.__getattr__)r"   valuer   c             C   s(   | j i  }|||< | j | d S )N)r   r   copyr$   )r   r"   r(   r&   r   r   r   r   Z   s    zLocal.__setattr__c             C   s<   | j i }||kr0| }||= | j | nt|d S )N)r   r   r)   r$   r%   )r   r"   r&   r   r   r   __delattr___   s    zLocal.__delattr__)N)__name__
__module____qualname____doc__	__slots__tOptionalr   ZDictstrAnyr   IteratorZTupler   r#   r   r'   r   r*   r   r   r   r   r   !   s   
 
r   c               @   s   e Zd ZdZdZdejeeje	   ddddZ
dddd	Ze	eje	 d
ddZeje	 dddZeeje	 dddZdddeje eje ddddZdS )r   a  Create a stack of context-local data. This wraps a
    :class:`ContextVar` containing a :class:`list` value.

    This may incur a performance penalty compared to using individual
    context vars, as it has to copy data to avoid mutating the list
    between nested contexts.

    :param context_var: The :class:`~contextvars.ContextVar` to use as
        storage for this local. If not given, one will be created.
        Context vars not created at the global scope may interfere with
        garbage collection.

    .. versionchanged:: 2.0
        Uses ``ContextVar`` instead of a custom storage implementation.

    .. versionadded:: 0.6.1
    )_storageN)r   r   c             C   s&   |d krt dt|  d}|| _d S )Nzwerkzeug.LocalStack<z	>.storage)r   r   r5   )r   r   r   r   r   r      s    zLocalStack.__init__)r   c             C   s   | j g  d S )N)r5   r$   )r   r   r   r   r      s    zLocalStack.__release_local__)objr   c             C   s*   | j g  }|| | j | |S )z'Add a new item to the top of the stack.)r5   r   r)   appendr$   )r   r6   stackr   r   r   push   s    
zLocalStack.pushc             C   s<   | j g }t|dkrdS |d }| j |dd  |S )zjRemove the top item from the stack and return it. If the
        stack is empty, return ``None``.
        r   N)r5   r   lenr$   )r   r8   rvr   r   r   pop   s    zLocalStack.popc             C   s$   | j g }t|dkrdS |d S )z[The topmost item on the stack.  If the stack is empty,
        `None` is returned.
        r   Nr:   )r5   r   r;   )r   r8   r   r   r   top   s    zLocalStack.top)r    r!   )r"   r    r   c            C   s   t | ||dS )a@  Create a :class:`LocalProxy` that accesses the top of this
        local stack.

        :param name: If given, the proxy access this attribute of the
            top item, rather than the item itself.
        :param unbound_message: The error message that the proxy will
            show if the stack is empty.
        )r    )r!   )r   r"   r    r   r   r   r#      s    zLocalStack.__call__)N)N)r+   r,   r-   r.   r/   r0   r1   r   ZListr   r   r   r9   r=   propertyr>   r2   r#   r   r   r   r   r   j   s   "
r   c            	   @   s   e Zd ZdZdZdejejee	ej
ejee	f  f  ddddZdddd	Zd
d
dddZd
d
dddZedddZdS )LocalManagera>  Manage releasing the data for the current context in one or more
    :class:`Local` and :class:`LocalStack` objects.

    This should not be needed for modern use cases, and may be removed
    in the future.

    :param locals: A local or list of locals to manage.

    .. versionchanged:: 2.0
        ``ident_func`` is deprecated and will be removed in Werkzeug
         2.1.

    .. versionchanged:: 0.7
        The ``ident_func`` parameter was added.

    .. versionchanged:: 0.6.1
        The :func:`release_local` function can be used instead of a
        manager.
    )localsN)rA   r   c             C   s2   |d krg | _ nt|tr$|g| _ n
t|| _ d S )N)rA   
isinstancer   list)r   rA   r   r   r   r      s
    

zLocalManager.__init__)r   c             C   s   x| j D ]}t| qW dS )zRelease the data in the locals for this context. Call this at
        the end of each request or use :meth:`make_middleware`.
        N)rA   r   )r   r   r   r   r   cleanup   s    zLocalManager.cleanupr	   )appr   c                s"   ddt jt d fdd}|S )zWrap a WSGI application so that local data is released
        automatically after the response has been sent for a request.
        r
   r   )environstart_responser   c                s   t  | |jS )N)r   rD   )rF   rG   )rE   r   r   r   application   s    z1LocalManager.make_middleware.<locals>.application)r0   Iterablebytes)r   rE   rH   r   )rE   r   r   make_middleware   s    zLocalManager.make_middleware)funcr   c             C   s   t | ||S )zLike :meth:`make_middleware` but used as a decorator on the
        WSGI application function.

        .. code-block:: python

            @manager.middleware
            def application(environ, start_response):
                ...
        )r   rK   )r   rL   r   r   r   
middleware   s    
zLocalManager.middlewarec             C   s   dt | j dt| j dS )N<z storages: >)typer+   r;   rA   )r   r   r   r   __repr__   s    zLocalManager.__repr__)N)r+   r,   r-   r.   r/   r0   r1   Unionr   r   rI   r   rD   rK   rM   r2   rQ   r   r   r   r   r@      s   &r@   c               @   s   e Zd ZdZdZdejej ejej ejej e	ddddZ
dedd	d
dZddeje ejdddZedddZdejejejdddZdS )_ProxyLookupa  Descriptor that handles proxied attribute lookup for
    :class:`LocalProxy`.

    :param f: The built-in function this attribute is accessed through.
        Instead of looking up the special method, the function call
        is redone on the object.
    :param fallback: Return this function if the proxy is unbound
        instead of raising a :exc:`RuntimeError`.
    :param is_attr: This proxied name is an attribute, not a function.
        Call the fallback immediately to get the value.
    :param class_value: Value to return when accessed from the
        ``LocalProxy`` class directly. Used for ``__doc__`` so building
        docs still works.
    )bind_ffallbackis_attrclass_valuer"   NF)frU   rW   rV   r   c                sj   t  dr&dtjtjd fdd}n( d k	rJdtjtjd fdd}nd }|| _|| _|| _|| _d S )N__get__r!   )instancer6   r   c                s     |t|S )N)rY   rP   )rZ   r6   )rX   r   r   rT     s    z%_ProxyLookup.__init__.<locals>.bind_fc                s
   t  |S )N)r   )rZ   r6   )rX   r   r   rT   %  s    )hasattrr0   r3   CallablerT   rU   rW   rV   )r   rX   rU   rW   rV   rT   r   )rX   r   r     s    	
z_ProxyLookup.__init__r!   )ownerr"   r   c             C   s
   || _ d S )N)r"   )r   r]   r"   r   r   r   __set_name__1  s    z_ProxyLookup.__set_name__)rZ   r]   r   c             C   s   |d kr| j d k	r| j S | S y| }W n: tk
rb   | jd krD | j||}| jr^| S |S X | jd k	rz| ||S t|| jS )N)	rW   _get_current_objectRuntimeErrorrU   rY   rV   rT   getattrr"   )r   rZ   r]   r6   rU   r   r   r   rY   4  s     


z_ProxyLookup.__get__)r   c             C   s   d| j  S )Nzproxy )r"   )r   r   r   r   rQ   O  s    z_ProxyLookup.__repr__)rZ   argskwargsr   c             O   s   |  |t|||S )zSupport calling unbound methods from the class. For example,
        this happens with ``copy.copy``, which does
        ``type(x).__copy__(x)``. ``type(x)`` can't be proxied, so it
        returns the proxy type and descriptor.
        )rY   rP   )r   rZ   rb   rc   r   r   r   r#   R  s    z_ProxyLookup.__call__)NNNF)N)r+   r,   r-   r.   r/   r0   r1   r\   r3   boolr   r2   r^   rP   rY   rQ   r#   r   r   r   r   rS     s      "rS   c                   s@   e Zd ZdZdZdejej ejej dd fddZ  Z	S )	_ProxyIOpzLook up an augmented assignment method on a proxied object. The
    method is wrapped to return the proxy instead of the object.
    r   N)rX   rU   r   c                s2   t   | dtjtjd fdd}|| _d S )Nr!   )rZ   r6   r   c                s,   t jt jdd fdd}||t|S )Nr!   )r   otherr   c                s    | | S )Nr   )r   rf   )rX   rZ   r   r   i_oph  s    
z0_ProxyIOp.__init__.<locals>.bind_f.<locals>.i_op)r0   r3   rY   rP   )rZ   r6   rg   )rX   )rZ   r   rT   g  s    z"_ProxyIOp.__init__.<locals>.bind_f)superr   r0   r3   r\   rT   )r   rX   rU   rT   )	__class__)rX   r   r   b  s    z_ProxyIOp.__init__)NN)
r+   r,   r-   r.   r/   r0   r1   r\   r   __classcell__r   r   )ri   r   re   [  s   re   )opr   c                s(   t jt jt jd fdd}t t|S )z5Swap the argument order to turn an l-op into an r-op.)r6   rf   r   c                s
    || S )Nr   )r6   rf   )rk   r   r   r_opt  s    z_l_to_r_op.<locals>.r_op)r0   r3   castr   )rk   rl   r   )rk   r   
_l_to_r_opq  s    rn   )or   c             C   s   | S )Nr   )ro   r   r   r   	_identityz  s    rp   c            	   @   s0  e Zd ZU dZdZejg ef ed< dddej	e
e eee ejg ef f eje eje ddddZeed	d
 ddZedd
 ddZeedd
 dZeeZeeZe ZeejZeejZeejZeejZ eej!Z"eej#Z$ee%Z&ee'dd
 dZ(ee)Z*ee+Z,ee-Z.ee/dd
 dZ0edd
 ddZ1edd
 Z2edd
 Z3edd
 Z4ee5Z6eej7Z8eej9Z:eej;Z<eej=Z>ee?Z@eeAZBeeCZDeejEZFeejGZHeejIZJeejKZLeejMZNeejOZPeejQZReejSZTeeUZVeeWZXeejYZZeej[Z\eej]Z^eej_Z`eejaZbeecejGZdeecejIZeeecejKZfeecejMZgeecejOZheecejQZieecejSZjeeceUZkeeceWZleecejYZmeecej[Zneecej]Zoeecej_ZpeecejaZqerejsZterejuZverejwZxerejyZzerej{Z|erej}Z~erejZerejZerejZerejZerejZerejZerejZeejZeejZeeZeejZeeZeeZeeZeejZeeZeejZeejZeejZe Ze Ze Ze Ze Ze Ze ZeejZeejZdS )r!   as	  A proxy to the object bound to a context-local object. All
    operations on the proxy are forwarded to the bound object. If no
    object is bound, a ``RuntimeError`` is raised.

    :param local: The context-local object that provides the proxied
        object.
    :param name: Proxy this attribute from the proxied object.
    :param unbound_message: The error message to show if the
        context-local object is unbound.

    Proxy a :class:`~contextvars.ContextVar` to make it easier to
    access. Pass a name to proxy that attribute.

    .. code-block:: python

        _request_var = ContextVar("request")
        request = LocalProxy(_request_var)
        session = LocalProxy(_request_var, "session")

    Proxy an attribute on a :class:`Local` namespace by calling the
    local with the attribute name:

    .. code-block:: python

        data = Local()
        user = data("user")

    Proxy the top item on a :class:`LocalStack` by calling the local.
    Pass a name to proxy that attribute.

    .. code-block::

        app_stack = LocalStack()
        current_app = app_stack()
        g = app_stack("g")

    Pass a function to proxy the return value from that function. This
    was previously used to access attributes of local objects before
    that was supported directly.

    .. code-block:: python

        session = LocalProxy(lambda: request.session)

    ``__repr__`` and ``__class__`` are proxied, so ``repr(x)`` and
    ``isinstance(x, cls)`` will look like the proxied object. Use
    ``issubclass(type(x), LocalProxy)`` to check if an object is a
    proxy.

    .. code-block:: python

        repr(user)  # <User admin>
        isinstance(user, User)  # True
        issubclass(type(user), LocalProxy)  # True

    .. versionchanged:: 2.2.2
        ``__wrapped__`` is set when wrapping an object, not only when
        wrapping a function, to prevent doctest from failing.

    .. versionchanged:: 2.2
        Can proxy a ``ContextVar`` or ``LocalStack`` directly.

    .. versionchanged:: 2.2
        The ``name`` parameter can be used with any proxied object, not
        only ``Local``.

    .. versionchanged:: 2.2
        Added the ``unbound_message`` parameter.

    .. versionchanged:: 2.0
        Updated proxied attributes and methods to reflect the current
        data model.

    .. versionchanged:: 0.6.1
        The class can be instantiated with a callable.
    )Z	__wrappedr_   r_   N)r    )r   r"   r    r   c               s   |d krt  nt| d kr"dttrT|d kr<tdtd fdd}nvttrvtd fdd}nTttrtd fdd}n2trtd fdd}ntd	t	 d
t
| d t
| d| d S )Nzobject is not boundz2'name' is required when proxying a 'Local' object.)r   c                  s,   y S  t k
r&   td Y nX d S )N)r%   r`   r   )get_namer   r    r   r   r_     s    z0LocalProxy.__init__.<locals>._get_current_objectc                 s   j } | d krt | S )N)r>   r`   )r6   )rq   r   r    r   r   r_     s    c                 s4   y  } W n tk
r*   td Y nX  | S )N)r   LookupErrorr`   )r6   )rq   r   r    r   r   r_     s
    c                  s
     S )Nr   r   )rq   r   r   r   r_     s    zDon't know how to proxy 'z'._LocalProxy__wrappedr_   )rp   r   rB   r   	TypeErrorr   r   r   callablerP   r   r   )r   r   r"   r    r_   r   )rq   r   r    r   r     s$    


zLocalProxy.__init__c             C   s
   t | jS )N)rP   r.   )r   r   r   r   <lambda>      zLocalProxy.<lambda>T)rW   rU   rV   c             C   s   | j S )N)rs   )r   r   r   r   rv     rw   )rU   rV   c             C   s   dt | j dS )NrN   z	 unbound>)rP   r+   )r   r   r   r   rv     rw   )rU   c             C   s   dS )NFr   )r   r   r   r   rv   $  rw   c             C   s   g S )Nr   )r   r   r   r   rv   )  rw   c             C   s   t | S )N)rP   )r   r   r   r   rv   5  rw   c             C   s
   t || S )N)rB   )r   rf   r   r   r   rv   7  rw   c             C   s
   t || S )N)
issubclass)r   rf   r   r   r   rv   8  rw   c             O   s
   | ||S )Nr   )r   rb   rc   r   r   r   rv   :  rw   )N)r+   r,   r-   r.   r/   r0   r\   r   __annotations__rR   r   r   r   r1   r2   r   rS   __wrapped__reprrQ   __str__rJ   	__bytes__
__format__operatorlt__lt__le__le__eq__eq__ne__ne__gt__gt__ge__ge__hash__hash__rd   __bool__ra   r'   setattrr   delattrr*   dir__dir__ri   __instancecheck____subclasscheck__r#   r;   __len__length_hint__length_hint__getitem__getitem__setitem__setitem__delitem__delitem__r   r   next__next__reversed__reversed__contains__contains__add__add__sub__sub__mul__mul__matmul
__matmul__truediv__truediv__floordiv__floordiv__mod__mod__divmod
__divmod__pow__pow__lshift
__lshift__rshift
__rshift__and___and__xor__xor__or___or__rn   __radd____rsub____rmul____rmatmul____rtruediv____rfloordiv____rmod____rdivmod____rpow____rlshift____rrshift____rand____rxor____ror__re   iadd__iadd__isub__isub__imul__imul__imatmul__imatmul__itruediv__itruediv__	ifloordiv__ifloordiv__imod__imod__ipow__ipow__ilshift__ilshift__irshift__irshift__iand__iand__ixor__ixor__ior__ior__neg__neg__pos__pos__abs__abs__invert
__invert__complex__complex__int__int__float	__float__index	__index__round	__round__mathZtrunc	__trunc__Zfloor	__floor__Zceil__ceil__	__enter____exit__	__await__	__aiter__	__anext__
__aenter__	__aexit__r)   __copy__deepcopy__deepcopy__r   r   r   r   r!   ~  s   
L82











































r!   )"r)   r   r   typingr0   Zcontextvarsr   	functoolsr   r   r   Zwsgir   ZTYPE_CHECKINGZ_typeshed.wsgir   r	   r
   ZTypeVarr   r\   r3   r   rR   r   r   ZGenericr   r@   rS   re   rn   rp   r!   r   r   r   r   <module>   s.   
IPGZ	