3
üZð]K  ã               @   s°   d 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
 dd	lmZ G d
d„ deeƒZeG dd„ deeƒƒZG dd„ deƒZdd„ Zdd„ Zdd„ Zdd„ ZdS )z¨
    flask.debughelpers
    ~~~~~~~~~~~~~~~~~~

    Various helpers to make the development experience better.

    :copyright: 2010 Pallets
    :license: BSD-3-Clause
é    N)Úwarné   )Úimplements_to_string)Ú	text_type)ÚFlask)Ú	Blueprint)Ú_request_ctx_stackc               @   s   e Zd ZdZdS )ÚUnexpectedUnicodeErrorzjRaised in places where we want some better error reporting for
    unexpected unicode or binary data.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú3/tmp/pip-build-w1as9q70/flask/flask/debughelpers.pyr	      s   r	   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚDebugFilesKeyErrorz•Raised from request.files during debugging.  The idea is that it can
    provide a better error message than just a generic KeyError/BadRequest.
    c             C   sN   |j j|ƒ}d||jf g}|r>|jddjdd„ |D ƒƒ ƒ dj|ƒ| _d S )Na%  You tried to access the file "%s" in the request.files dictionary but it does not exist.  The mimetype for the request is "%s" instead of "multipart/form-data" which means that no file contents were transmitted.  To fix this error you should provide enctype="multipart/form-data" in your form.zI

The browser instead transmitted some file names. This was submitted: %sz, c             s   s   | ]}d | V  qdS )z"%s"Nr   )Ú.0Úxr   r   r   ú	<genexpr>.   s    z.DebugFilesKeyError.__init__.<locals>.<genexpr>Ú )ÚformÚgetlistÚmimetypeÚappendÚjoinÚmsg)ÚselfÚrequestÚkeyZform_matchesÚbufr   r   r   Ú__init__!   s    zDebugFilesKeyError.__init__c             C   s   | j S )N)r   )r   r   r   r   Ú__str__2   s    zDebugFilesKeyError.__str__N)r
   r   r   r   r   r    r   r   r   r   r      s   r   c               @   s   e Zd ZdZdd„ ZdS )ÚFormDataRoutingRedirectzÎThis exception is raised by Flask in debug mode if it detects a
    redirect caused by the routing system when the request method is not
    GET, HEAD or OPTIONS.  Reasoning: form data will be dropped.
    c             C   sr   |j }d|j|jf g}|jd |jjdƒd kr<|jdƒ |jd|j ƒ |jdƒ tj| dj	|ƒj
d	ƒƒ d S )
NzjA request was sent to this URL (%s) but a redirect was issued automatically by the routing system to "%s".ú/ú?r   z“  The URL was defined with a trailing slash so Flask will automatically redirect to the URL with the trailing slash if it was accessed without one.z£  Make sure to directly send your %s-request to this URL since we can't make browsers or HTTP clients redirect with form data reliably or without user interaction.z3

Note: this exception is only raised in debug moder   zutf-8)Zrouting_exceptionÚurlÚnew_urlÚbase_urlÚsplitr   ÚmethodÚAssertionErrorr   r   Úencode)r   r   Úexcr   r   r   r   r   <   s    

z FormDataRoutingRedirect.__init__N)r
   r   r   r   r   r   r   r   r   r!   6   s   r!   c                s:   ˆj j‰ G ‡ ‡fdd„dˆ ƒ}ˆ j|_ˆ j|_|ˆj _dS )z¨Since Flask 0.8 we're monkeypatching the files object in case a
    request is detected that does not use multipart form data but the files
    object is accessed.
    c                   s   e Zd Z‡ ‡fdd„ZdS )z.attach_enctype_error_multidict.<locals>.newclsc                s<   yˆ j | |ƒS  tk
r6   |ˆjkr(‚ tˆ|ƒ‚Y nX d S )N)Ú__getitem__ÚKeyErrorr   r   )r   r   )Úoldclsr   r   r   r,   ^   s    
z:attach_enctype_error_multidict.<locals>.newcls.__getitem__N)r
   r   r   r,   r   )r.   r   r   r   Únewcls]   s   r/   N)ÚfilesÚ	__class__r
   r   )r   r/   r   )r.   r   r   Úattach_enctype_error_multidictV   s
    	r2   c             c   s²   dt | ƒjt | ƒjf V  x’t| jjƒ ƒD ]€\}}|jdƒr>q*t|tt	fƒr†t
dd„ |D ƒƒs`q*d| V  x|D ]}d| V  qpW q*nt|tttttfƒsœq*d||f V  q*W d S )Nzclass: %s.%sÚ_c             s   s   | ]}t |ttfƒV  qd S )N)Ú
isinstanceÚstrr   )r   r   r   r   r   r   q   s    z$_dump_loader_info.<locals>.<genexpr>z%s:z  - %sz%s: %r)Útyper   r
   ÚsortedÚ__dict__ÚitemsÚ
startswithr4   ÚtupleÚlistÚallr5   r   ÚintÚfloatÚbool)Úloaderr   ÚvalueÚitemr   r   r   Ú_dump_loader_infok   s    


rD   c             C   sr  d| g}d}d}t j}|dk	r4|jjdk	r4|jj}x¾t|ƒD ]²\}\}}	}
t|	tƒrbd|	j }n$t|	tƒr~d|	j	|	jf }nt
|	ƒ}|jd|d |f ƒ xt|ƒD ]}|jd| ƒ q¦W |
dkrÊd	}nd
|
d pÖd }|d7 }|jd| ƒ q>W d}|dk�r|jdƒ d}n|dk�r*|jdƒ d}|dk	�r\|�r\|jd| ƒ |jdƒ |jdƒ | jjdj|ƒƒ dS )z2This should help developers understand what failedzLocating template "%s":r   Nzapplication "%s"zblueprint "%s" (%s)z% 5d: trying loader of %sr   z	       %szno matchz
found (%r)z<string>z       -> %sFz'Error: the template could not be found.Tz<Warning: multiple loaders returned a match for the template.zQ  The template was looked up from an endpoint that belongs to the blueprint "%s".z9  Maybe you did not place a template in the right folder?z7  See http://flask.pocoo.org/docs/blueprints/#templatesÚ
)r   Útopr   Ú	blueprintÚ	enumerater4   r   Úimport_namer   ÚnameÚreprr   rD   ÚloggerÚinfor   )ÚappÚtemplateÚattemptsrM   Ztotal_foundrG   ZreqctxÚidxrA   ZsrcobjZtripleZsrc_infoÚlineZdetailZseems_fishyr   r   r   Ú!explain_template_loading_attempts|   sD    








rS   c               C   s$   t jjdƒdkr ttdƒdd� d S )NZWERKZEUG_RUN_MAINÚtruezÁSilently ignoring app.run() because the application is run from the flask command line executable.  Consider putting app.run() behind an if __name__ == "__main__" guard to silence this warning.é   )Ú
stacklevel)ÚosÚenvironÚgetr   ÚWarningr   r   r   r   Úexplain_ignored_app_run¬   s
    r[   )r   rW   Úwarningsr   Ú_compatr   r   rN   r   Z
blueprintsr   Úglobalsr   r)   ÚUnicodeErrorr	   r-   r   r!   r2   rD   rS   r[   r   r   r   r   Ú<module>
   s   
 0