a
    ïâübû  ã                   @   sÂ  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	 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 ddlmZ ejrªddlmZ ddlmZ ejeejf dœdd„ZG dd„ deƒZG dd„ deƒZdeejeejf edœdd„Zejeeejejeef  f ejedœdd„Zeejedœdd „Z deejeejf ej!e dœd!d"„Z"ejeeejejeef  f ejej!e dœd#d$„Z#eejej!e dœd%d&„Z$dS )'é    N)Ú
BaseLoader)ÚEnvironment)ÚTemplate)ÚTemplateNotFoundé   )Ú_cv_app)Ú_cv_request)Úcurrent_app)Úrequest)Ústream_with_context)Úbefore_render_template)Útemplate_rendered)ÚFlask)ÚScaffold©Úreturnc                  C   sJ   t  d¡} t d¡}i }| dur*| j|d< |durF|j|d< |j|d< |S )zSDefault template context processor.  Injects `request`,
    `session` and `g`.
    NÚgr
   Úsession)r   Úgetr   r   r
   r   )ZappctxZreqctxÚrv© r   ú7/tmp/pip-target-elb4bz0j/lib/python/flask/templating.pyÚ_default_template_ctx_processor   s    




r   c                   @   s$   e Zd ZdZdejddœdd„ZdS )r   zÌWorks like a regular Jinja2 environment but has some additional
    knowledge of how Flask's blueprint works so that it can prepend the
    name of the blueprint to referenced templates if necessary.
    r   N)ÚappÚoptionsr   c                 K   s0   d|vr|  ¡ |d< tj| fi |¤Ž || _d S )NÚloader)Zcreate_global_jinja_loaderÚBaseEnvironmentÚ__init__r   )Úselfr   r   r   r   r   r   *   s    zEnvironment.__init__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚtÚAnyr   r   r   r   r   r   $   s   r   c                   @   sÞ   e Zd ZdZdddœdd„Zeeejeej	e ej	ej
 f dœdd	„Zeeejeej	e ej	ej
 f dœd
d„Zeeejeej	e ej	ej
 f dœdd„Zeejejdef ddf dœdd„Zeje dœdd„ZdS )ÚDispatchingJinjaLoaderz\A loader that looks for templates in the application and all
    the blueprint folders.
    r   N)r   r   c                 C   s
   || _ d S ©N)r   )r   r   r   r   r   r   6   s    zDispatchingJinjaLoader.__init__)ÚenvironmentÚtemplater   c                 C   s$   | j jd r|  ||¡S |  ||¡S )NZEXPLAIN_TEMPLATE_LOADING)r   ÚconfigÚ_get_source_explainedÚ_get_source_fast)r   r'   r(   r   r   r   Ú
get_source9   s    z!DispatchingJinjaLoader.get_sourcec           	   	   C   s’   g }d }|   |¡D ]L\}}z| ||¡}|d u r4|}W n tyL   d }Y n0 | |||f¡ qddlm} || j||ƒ |d ur†|S t|ƒ‚d S )Nr   )Ú!explain_template_loading_attempts)Ú_iter_loadersr,   r   ÚappendZdebughelpersr-   r   )	r   r'   r(   ÚattemptsZtrvÚsrcobjr   r   r-   r   r   r   r*   @   s     þ
z,DispatchingJinjaLoader._get_source_explainedc              	   C   sJ   |   |¡D ]2\}}z| ||¡W   S  ty:   Y q
Y q
0 q
t|ƒ‚d S r&   )r.   r,   r   )r   r'   r(   Z_srcobjr   r   r   r   r+   Z   s    z'DispatchingJinjaLoader._get_source_fastr   )r(   r   c                 c   sH   | j j}|d ur| j |fV  | j  ¡ D ]}|j}|d ur&||fV  q&d S r&   )r   Újinja_loaderÚiter_blueprints)r   r(   r   Ú	blueprintr   r   r   r.   d   s    z$DispatchingJinjaLoader._iter_loadersr   c                 C   sb   t ƒ }| jj}|d ur$| | ¡ ¡ | j ¡ D ]*}|j}|d ur.| ¡ D ]}| |¡ qHq.t|ƒS r&   )Úsetr   r2   ÚupdateÚlist_templatesr3   ÚaddÚlist)r   Úresultr   r4   r(   r   r   r   r7   p   s    z%DispatchingJinjaLoader.list_templates)r   r    r!   r"   r   r   Ústrr#   ÚTupleÚOptionalÚCallabler,   r*   r+   Ú	Generatorr   r.   ÚListr7   r   r   r   r   r%   1   s   þþþþr%   r   )r   r(   Úcontextr   c                 C   s8   |   |¡ tj| ||d | |¡}tj| ||d |S ©N©r(   rA   )Úupdate_template_contextr   ÚsendÚrenderr   )r   r(   rA   r   r   r   r   Ú_render   s
    

rG   )Útemplate_name_or_listrA   r   c                 K   s    t  ¡ }|j | ¡}t|||ƒS )a  Render a template by name with the given context.

    :param template_name_or_list: The name of the template to render. If
        a list is given, the first name to exist will be rendered.
    :param context: The variables to make available in the template.
    )r	   Ú_get_current_objectÚ	jinja_envÚget_or_select_templaterG   ©rH   rA   r   r(   r   r   r   Úrender_template‡   s    
rM   )ÚsourcerA   r   c                 K   s    t  ¡ }|j | ¡}t|||ƒS )zÓRender a template from the given source string with the given
    context.

    :param source: The source code of the template to render.
    :param context: The variables to make available in the template.
    )r	   rI   rJ   Úfrom_stringrG   ©rN   rA   r   r(   r   r   r   Úrender_template_string–   s    rQ   c                    sL   ˆ   ˆ¡ tjˆ ˆˆd tjt dœ‡ ‡‡fdd„}|ƒ }trHt|ƒ}|S )NrC   r   c                   3   s$   ˆ  ˆ¡E d H  tjˆ ˆˆd d S rB   )Úgenerater   rE   r   ©r   rA   r(   r   r   rR   ¨   s    z_stream.<locals>.generate)rD   r   rE   r#   ÚIteratorr;   r
   r   )r   r(   rA   rR   r   r   rS   r   Ú_stream¢   s    
rU   c                 K   s    t  ¡ }|j | ¡}t|||ƒS )a“  Render a template by name with the given context as a stream.
    This returns an iterator of strings, which can be used as a
    streaming response from a view.

    :param template_name_or_list: The name of the template to render. If
        a list is given, the first name to exist will be rendered.
    :param context: The variables to make available in the template.

    .. versionadded:: 2.2
    )r	   rI   rJ   rK   rU   rL   r   r   r   Ústream_templateµ   s    rV   c                 K   s    t  ¡ }|j | ¡}t|||ƒS )aZ  Render a template from the given source string with the given
    context as a stream. This returns an iterator of strings, which can
    be used as a streaming response from a view.

    :param source: The source code of the template to render.
    :param context: The variables to make available in the template.

    .. versionadded:: 2.2
    )r	   rI   rJ   rO   rU   rP   r   r   r   Ústream_template_stringÈ   s    
rW   )%Útypingr#   Zjinja2r   r   r   r   r   Úglobalsr   r   r	   r
   Zhelpersr   Zsignalsr   r   ÚTYPE_CHECKINGr   r   Zscaffoldr   ÚDictr;   r$   r   r%   rG   ÚUnionr@   rM   rQ   rT   rU   rV   rW   r   r   r   r   Ú<module>   s>   N 	ýþý