
_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 Gd
 d   d e e  Z e Gd d   d e e   Z Gd 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-5gj8f0j9/flask/flask/debughelpers.pyr	      s   r	   c               @   s.   e  Z d  Z d Z d d   Z d d   Z d S)DebugFilesKeyErrorzRaised from request.files during debugging.  The idea is that it can
    provide a better error message than just a generic KeyError/BadRequest.
    c             C   sk   | j  j |  } d | | j f g } | rU | 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)FormDataRoutingRedirectzThis 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   s   | j  } d | j | j f g } | j d | j j d  d k rR | 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                sS    j  j   G   f d d   d    }   j | _   j | _ |  j  _ d S)zSince 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                sN   y   j  |  |  SWn3 t k
 rI |  j k r6   t  |   Yn Xd  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  rU q7 t | t t	 f  r t
 d d   | D  s q7 d | Vx | D] } d | Vq Wq7 n! t | t t t t t f  s q7 d | | f Vq7 Wd  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   s  d | g } d } d } t  j } | d k	 rL | j j d k	 rL | j j } x t |  D] \ } \ } }	 }
 t |	 t  r d |	 j } n4 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 |  qY Wd } | d k rt| 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   s2   t  j j d  d k r. t t d  d d d  S)NZWERKZEUG_RUN_MAINtruezSilently 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