3
\f[                   @   s  d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	 ddl
mZ ddlmZmZ dd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zedd Zdd Zd.ddZdd Zdd Zd d! Zd"d# Zd$d% Zd&d' ZG d(d) d)eZG d*d+ d+e Z!d/d,d-Z"dS )0z
    jinja2.asyncsupport
    ~~~~~~~~~~~~~~~~~~~

    Has all the code for async support which is implemented as a patch
    for supported Python versions.

    :copyright: (c) 2017 by the Jinja Team.
    :license: BSD, see LICENSE for more details.
    N)update_wrapper)concatinternalcodeMarkup)TemplateModule)LoopContextBase_last_iterationc                s&   g  fdd}| I d H  t S )Nc                 s@   x: 2 d H y3 d H } W n t k
r,   Y W q<X j|  q
W d S )N)StopAsyncIterationappend)event)	async_genrv EC:\prj\env\wsgidav_build_3.6\lib\site-packages\jinja2\asyncsupport.pycollect   s    .zconcat_async.<locals>.collect)r   )r   r   r   )r   r   r   concat_async   s    r   c             O  s   t ||}yHxB| j| j|2 d H y3 d H }W n tk
rD   Y W qPX |V  q"W W n tk
rn   tj }Y nX d S | jj|dV  d S )NT)	dictroot_render_funcnew_contextr	   	Exceptionsysexc_infoenvironmenthandle_exception)selfargskwargsvarsr   r   r   r   r   generate_async   s    
:r   c                s    dd   fdd}t |S )Nc             s   s@   | j ||}yx|j|j V  qW W n tk
r:   Y nX d S )N)r   run_until_complete	__anext__r	   )r   loopr   r   r   r   r   r   _convert_generator,   s    z.wrap_generate_func.<locals>._convert_generatorc                s*   | j js| f||S  | tj ||S )N)r   is_asyncasyncioget_event_loop)r   r   r   )r"   original_generater   r   generate3   s    z$wrap_generate_func.<locals>.generate)r   )r&   r'   r   )r"   r&   r   wrap_generate_func+   s    r(   c                sd   | j jstdt||}| j|}yt| j|I d H S  tk
rT   tj	 }Y nX | j j
|dS )Nz8The environment was not created with async mode enabled.T)r   r#   RuntimeErrorr   r   r   r   r   r   r   r   )r   r   r   r   ctxr   r   r   r   render_async:   s    

r+   c                s    fdd}t | S )Nc                s2   | j js | f||S tj }|j| j||S )N)r   r#   r$   r%   r   r+   )r   r   r   r!   )original_renderr   r   renderJ   s    z wrap_render_func.<locals>.render)r   )r,   r-   r   )r,   r   wrap_render_funcI   s    r.   c                s(   t dd  t  fdd}t|S )Nc                s2   t | j| j | jI d H }| jjjr.t|}|S )N)r   _stack_depth_contexteval_ctx
autoescaper   )r   r   r   r   r   
async_callS   s    
z-wrap_block_reference_call.<locals>.async_callc                s   | j jjs| S  | S )N)r1   r   r#   )r   )r4   original_callr   r   __call__Z   s    
z+wrap_block_reference_call.<locals>.__call__)r   r   )r5   r6   r   )r4   r5   r   wrap_block_reference_callR   s    r7   c                s(   t dd  t  fdd}t|S )Nc                s    | j | I d H }|rt|}|S )N)_funcr   )r   	argumentsr3   r   r   r   r   async_invoked   s    z'wrap_macro_invoke.<locals>.async_invokec                s    | j js| ||S  | ||S )N)_environmentr#   )r   r9   r3   )r:   original_invoker   r   _invokek   s    z"wrap_macro_invoke.<locals>._invoke)r   r   )r<   r=   r   )r:   r<   r   wrap_macro_invokec   s    r>   c                s(   | j d k	r| j S | j I d H  | _ }|S )N)_modulemake_module_async)r   r   r   r   r   get_default_module_asyncs   s    
rA   c                s   t  fdd}|S )Nc                s   | j jrtd | S )Nz6Template module attribute is unavailable in async mode)r   r#   r)   )r   )original_default_moduler   r   _get_default_module|   s    z0wrap_default_module.<locals>._get_default_module)r   )rB   rC   r   )rB   r   wrap_default_module{   s    rD   Fc                s`   | j |||}g }x@| j|2 d H y3 d H }W n tk
rD   Y W qTX |j| q"W t| ||S )N)r   r   r	   r
   r   )r   r   sharedlocalscontextbody_streamitemr   r   r   r@      s
    4r@   c              C   sd   ddl m}  t| j| _tt| j| _tt| j| _t| j| _t	| j
| _
t| _tt| j| _d S )Nr   )Template)jinja2rJ   r(   r'   r   r   r+   r.   r-   rD   rC   rA   Z_get_default_module_asyncr@   )rJ   r   r   r   patch_template   s    
rL   c              C   s,   ddl m} m} t| j| _t|j|_d S )Nr   )BlockReferenceMacro)jinja2.runtimerM   rN   r7   r6   r>   r=   )rM   rN   r   r   r   patch_runtime   s    
rP   c              C   s&   ddl m}  ddlm} | j| d S )Nr   )FILTERS)ASYNC_FILTERS)jinja2.filtersrQ   jinja2.asyncfiltersrR   update)rQ   rR   r   r   r   patch_filters   s    rV   c               C   s   t   t  t  d S )N)rL   rP   rV   r   r   r   r   	patch_all   s    rW   c                s   t j| r| I d H S | S )N)inspectisawaitable)valuer   r   r   
auto_await   s    

r[   c             C  s^   t | drFx6| 2 d H y3 d H }W n tk
r6   Y W qBX |V  qW d S x| D ]
}|V  qLW d S )N	__aiter__)hasattrr	   )iterablerI   r   r   r   
auto_aiter   s    
.

r_   c               @   s*   e Zd Zd	ddZedd Zdd ZdS )
AsyncLoopContextNr   c             C   s&   t j| ||| || _|| _|| _d S )N)r   __init___async_iterator_after_length)r   async_iterator	undefinedafterlengthrecursedepth0r   r   r   ra      s    zAsyncLoopContext.__init__c             C   s   | j d krtd| j S )NzHLoop length for some iterators cannot be lazily calculated in async mode)rd   	TypeError)r   r   r   r   rh      s    
zAsyncLoopContext.lengthc             C   s   t | S )N)AsyncLoopContextIterator)r   r   r   r   r\      s    zAsyncLoopContext.__aiter__)Nr   )__name__
__module____qualname__ra   propertyrh   r\   r   r   r   r   r`      s    
r`   c               @   s(   e Zd Zd	Zdd Zdd Zdd ZdS )
rl   rG   c             C   s
   || _ d S )N)rG   )r   rG   r   r   r   ra      s    z!AsyncLoopContextIterator.__init__c             C   s   | S )Nr   )r   r   r   r   r\      s    z"AsyncLoopContextIterator.__aiter__c                sp   | j }| jd7  _|jtkr$t |j|_|j|_y|jj I d H |_W n tk
rd   t|_Y nX |j|fS )N   )	rG   index0rc   r   r	   _current_beforerb   r    )r   r*   r   r   r   r       s    
z"AsyncLoopContextIterator.__anext__N)rG   )rm   rn   ro   	__slots__ra   r\   r    r   r   r   r   rl      s   rl   c                s   yt | }W n8 ttfk
rD   t| ds<t| } t | }nd }Y nX t| }y|j I d H }W n tk
rx   t}Y nX t	||||||S )Nr\   )
lenrk   AttributeErrorr]   tupler_   r    r	   r   r`   )r^   rf   ri   rj   rh   re   rg   r   r   r   make_async_loop_context   s    	



ry   )NFN)Nr   )#__doc__r   r$   rX   	functoolsr   jinja2.utilsr   r   r   jinja2.environmentr   rO   r   r   r   r   r(   r+   r.   r7   r>   rA   rD   r@   rL   rP   rV   rW   r[   r_   r`   objectrl   ry   r   r   r   r   <module>   s4   		

	