
¾«‘_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)Ú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   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)Ú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   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)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                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Ú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