3
[ð]Æ  ã               @   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>   x8ˆ 2 d H y3 d H } W n
 t k
s.X ˆj| ƒ q
   Y  W d S )N)ÚStopAsyncIterationÚappend)Úevent)Ú	async_genÚrv© ú5/tmp/pip-build-w1as9q70/Jinja2/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 ||Ž}yFx@| j| j|ƒƒ2 d H y3 d H }W n
 tk
sBX |V  q"   Y  W W n tk
rl   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Ú_contextZ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   )r3   Úoriginal_callr   r   Ú__call__Z   s    
z+wrap_block_reference_call.<locals>.__call__)r   r   )r4   r5   r   )r3   r4   r   Úwrap_block_reference_callR   s    r6   c                s(   t dd„ ƒ‰ t ‡ ‡fdd„ƒ}t|ˆƒS )Nc             Ó   s    | j |Ž I d H }|rt|ƒ}|S )N)Z_funcr   )r   Ú	argumentsr2   r   r   r   r   Úasync_invoked   s    z'wrap_macro_invoke.<locals>.async_invokec                s    | j jsˆ| ||ƒS ˆ | ||ƒS )N)Z_environmentr#   )r   r7   r2   )r8   Úoriginal_invoker   r   Ú_invokek   s    z"wrap_macro_invoke.<locals>._invoke)r   r   )r9   r:   r   )r8   r9   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    
r>   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   )r?   r@   r   )r?   r   Úwrap_default_module{   s    rA   Fc             Ã   s^   | j |||ƒ}g }x>| j|ƒ2 d H y3 d H }W n
 tk
sFX |j|ƒ q"   Y  W t| ||ƒS )N)r   r   r	   r
   r   )r   r   ZsharedÚlocalsÚcontextZbody_streamÚitemr   r   r   r=   …   s
    (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)Zjinja2rE   r(   r'   r   r   r+   r.   r-   rA   r@   r>   Z_get_default_module_asyncr=   )rE   r   r   r   Úpatch_template�   s    
rF   c              C   s,   ddl m} m} t| jƒ| _t|jƒ|_d S )Nr   )ÚBlockReferenceÚMacro)Újinja2.runtimerG   rH   r6   r5   r;   r:   )rG   rH   r   r   r   Úpatch_runtimeœ   s    
rJ   c              C   s&   ddl m}  ddlm} | j|ƒ d S )Nr   )ÚFILTERS)ÚASYNC_FILTERS)Zjinja2.filtersrK   Zjinja2.asyncfiltersrL   Úupdate)rK   rL   r   r   r   Úpatch_filters£   s    rN   c               C   s   t ƒ  tƒ  tƒ  d S )N)rF   rJ   rN   r   r   r   r   Ú	patch_all©   s    rO   c             Ã   s   t j| ƒr| I d H S | S )N)ÚinspectÚisawaitable)Úvaluer   r   r   Ú
auto_await¯   s    

rS   c             C  s\   t | dƒrDx4| 2 d H y3 d H }W n
 tk
s4X |V  q   Y  W d S x| D ]
}|V  qJW d S )NÚ	__aiter__)Úhasattrr	   )ÚiterablerD   r   r   r   Ú
auto_aiterµ   s    
"
rW   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   rY   À   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)r\   Ú	TypeError)r   r   r   r   r`   Ç   s    
zAsyncLoopContext.lengthc             C   s   t | ƒS )N)ÚAsyncLoopContextIterator)r   r   r   r   rT   Î   s    zAsyncLoopContext.__aiter__)Nr   )Ú__name__Ú
__module__Ú__qualname__rY   Úpropertyr`   rT   r   r   r   r   rX   ¾   s    
rX   c               @   s(   e Zd Zd	Zdd„ Zdd„ Zdd„ ZdS )
rd   rC   c             C   s
   || _ d S )N)rC   )r   rC   r   r   r   rY   Õ   s    z!AsyncLoopContextIterator.__init__c             C   s   | S )Nr   )r   r   r   r   rT   Ø   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é   )	rC   Zindex0r[   r   r	   Ú_currentZ_beforerZ   r    )r   r*   r   r   r   r    Û   s    
z"AsyncLoopContextIterator.__anext__N)rC   )re   rf   rg   Ú	__slots__rY   rT   r    r   r   r   r   rd   Ò   s   rd   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 )NrT   )
Úlenrc   ÚAttributeErrorrU   ÚtuplerW   r    r	   r   rX   )rV   r^   ra   rb   r`   r]   r_   r   r   r   Úmake_async_loop_contexté   s    	



ro   )NFN)Nr   )#Ú__doc__r   r$   rP   Ú	functoolsr   Zjinja2.utilsr   r   r   Zjinja2.environmentr   rI   r   r   r   r   r(   r+   r.   r6   r;   r>   rA   r=   rF   rJ   rN   rO   rS   rW   rX   Úobjectrd   ro   r   r   r   r   Ú<module>   s4   		

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