
Á«‘_w  ã               @   s�   d  Z  d d l m Z d d l Z d d l Z d d l Z d d l m Z y d d l	 m
 Z
 Wn" e k
 r‚ d d l m
 Z
 Yn XGd d „  d e ƒ Z d S)a9  
Application Profiler
====================

This module provides a middleware that profiles each request with the
:mod:`cProfile` module. This can help identify bottlenecks in your code
that may be slowing down your application.

.. autoclass:: ProfilerMiddleware

:copyright: 2007 Pallets
:license: BSD-3-Clause
é    )Úprint_functionN)ÚStats)ÚProfilec               @   s@   e  Z d  Z d Z e j d
 f  d d d d „ Z d d	 „  Z d S)ÚProfilerMiddlewarea  Wrap a WSGI application and profile the execution of each
    request. Responses are buffered so that timings are more exact.

    If ``stream`` is given, :class:`pstats.Stats` are written to it
    after each request. If ``profile_dir`` is given, :mod:`cProfile`
    data files are saved to that directory, one file per request.

    The filename can be customized by passing ``filename_format``. If
    it is a string, it will be formatted using :meth:`str.format` with
    the following fields available:

    -   ``{method}`` - The request method; GET, POST, etc.
    -   ``{path}`` - The request path or 'root' should one not exist.
    -   ``{elapsed}`` - The elapsed time of the request.
    -   ``{time}`` - The time of the request.

    If it is a callable, it will be called with the WSGI ``environ``
    dict and should return a filename.

    :param app: The WSGI application to wrap.
    :param stream: Write stats to this stream. Disable with ``None``.
    :param sort_by: A tuple of columns to sort stats by. See
        :meth:`pstats.Stats.sort_stats`.
    :param restrictions: A tuple of restrictions to filter stats by. See
        :meth:`pstats.Stats.print_stats`.
    :param profile_dir: Save profile data files to this directory.
    :param filename_format: Format string for profile data file names,
        or a callable returning a name. See explanation above.

    .. code-block:: python

        from werkzeug.middleware.profiler import ProfilerMiddleware
        app = ProfilerMiddleware(app)

    .. versionchanged:: 0.15
        Stats are written even if ``profile_dir`` is given, and can be
        disable by passing ``stream=None``.

    .. versionadded:: 0.15
        Added ``filename_format``.

    .. versionadded:: 0.9
        Added ``restrictions`` and ``profile_dir``.
    ÚtimeÚcallsNz/{method}.{path}.{elapsed:.0f}ms.{time:.0f}.profc             C   s:   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ d  S)N)Ú_appÚ_streamÚ_sort_byÚ_restrictionsÚ_profile_dirÚ_filename_format)ÚselfZappÚstreamZsort_byZrestrictionsZprofile_dirZfilename_format© r   ú@/tmp/pip-build-5gj8f0j9/Werkzeug/werkzeug/middleware/profiler.pyÚ__init__I   s    						zProfilerMiddleware.__init__c       
   	      sÍ  g  ‰ d  ‡ ‡ f d d † ‰  ‡  ‡ ‡ ‡ f d d †  } t  ƒ  } t j ƒ  } | j | ƒ d j ˆ ƒ } t j ƒ  | } ˆ j d  k	 r(t ˆ j ƒ rª ˆ j ˆ ƒ } nY ˆ j j d ˆ d d ˆ j d	 ƒ j	 d
 ƒ j
 d
 d ƒ pç d d | d d t j ƒ  ƒ } t j j ˆ j | ƒ } | j | ƒ ˆ j d  k	 rÆt | d ˆ j ƒ}	 |	 j ˆ j Œ  t d d d ˆ j ƒt d j ˆ j d	 d ƒ ƒ d ˆ j ƒ|	 j ˆ j Œ  t d d d d ˆ j ƒ| g S)Nc                s   ˆ |  | | ƒ ˆ  j  S)N)Úappend)ÚstatusÚheadersÚexc_info)Úresponse_bodyÚstart_responser   r   Úcatching_start_response\   s    z<ProfilerMiddleware.__call__.<locals>.catching_start_responsec                 s<   ˆ j  ˆ ˆ  ƒ }  ˆ j |  ƒ t |  d ƒ r8 |  j ƒ  d  S)NÚclose)r   ÚextendÚhasattrr   )Zapp_iter)r   Úenvironr   r   r   r   Úrunapp`   s    z+ProfilerMiddleware.__call__.<locals>.runappó    ÚmethodÚREQUEST_METHODÚpathZ	PATH_INFOú/Ú.ÚrootÚelapsedg     @�@r   r   ú-éP   Úfilez
PATH: {!r}Ú Ú
)r   r   ZruncallÚjoinr   Úcallabler   ÚformatÚgetÚstripÚreplaceÚosr"   Z
dump_statsr	   r   Z
sort_statsr
   ÚprintZprint_statsr   )
r   r   r   r   ÚprofileÚstartÚbodyr&   ÚfilenameÚstatsr   )r   r   r   r   r   r   Ú__call__Y   s4    	
*
(zProfilerMiddleware.__call__)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚsysÚstdoutr   r9   r   r   r   r   r      s   ,	r   )r=   Ú
__future__r   Úos.pathr2   r>   r   Zpstatsr   ZcProfiler   ÚImportErrorr4   Úobjectr   r   r   r   r   Ú<module>   s   