ó
PVc           @   s@  d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Z d  d l m Z d  d l m Z d  d l	 m
 Z
 m Z m Z d „  Z d d „ Z d „  Z d e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ i e d 6e d 6Z y e d ƒ Wn e k
 re d e d <n Xe d e d <d d d d „ Z d S(   iÿÿÿÿN(   t   chain(   t   _log(   t   PY2t	   iteritemst	   text_typec          c   sº   x³ t  t j j ƒ  ƒ D]œ }  |  d k r. q n  t |  d d ƒ } | r d } xc t j j | ƒ sŒ | } t j j	 | ƒ } | | k rO PqO qO W| d d k rª | d  } n  | Vq q Wd S(   sË   This iterates over all relevant Python files.  It goes through all
    loaded files from modules, all files in folders of already loaded modules
    as well as all files reachable through a package.
    t   __file__iüÿÿÿs   .pycs   .pyoiÿÿÿÿN(   s   .pycs   .pyo(
   t   listt   syst   modulest   valuest   Nonet   getattrt   ost   patht   isfilet   dirname(   t   modulet   filenamet   old(    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyt   _iter_module_files   s    c         C   sÎ   t  d „  t j Dƒ ƒ } x9 |  p% d D]+ } | j t j j t j j | ƒ ƒ ƒ q& Wxl t t j j	 ƒ  ƒ D]U } t
 | d d ƒ } | d k r• qk n  t j j | ƒ } | j t j j | ƒ ƒ qk Wt | ƒ S(   s(   Finds all paths that should be observed.c         s   s!   |  ] } t  j j | ƒ Vq d  S(   N(   R   R   t   abspath(   t   .0t   x(    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pys	   <genexpr>&   s    R   (    N(   t   setR   R   t   addR   R   R   R   R   R	   R   R
   t   _find_common_roots(   t   extra_filest   rvR   R   t   fn(    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyt   _find_observable_paths$   s    )c            s°   g  |  D] } | j  t j j ƒ ^ q }  i  } xS t |  d t d t ƒD]9 } | } x  | D] } | j | i  ƒ } qZ W| j ƒ  qG Wt	 ƒ  ‰ ‡  ‡ f d †  ‰  ˆ  | d ƒ ˆ S(   sA   Out of some paths it finds the common roots that need monitoring.t   keyt   reversec            sT   x. t  |  ƒ D]  \ } } ˆ  | | | f ƒ q W|  sP ˆ j d j | ƒ ƒ n  d  S(   Nt   /(   R   R   t   join(   t   nodeR   t   prefixt   child(   t   _walkR   (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyR%   =   s    (    (
   t   splitR   R   t   sept   sortedt   lent   Truet
   setdefaultt   clearR   (   t   pathsR   t   roott   chunksR"   t   chunk(    (   R%   R   s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyR   2   s    (	t   ReloaderLoopc           B   sG   e  Z d Z e e j ƒ Z d d  d „ Z d „  Z	 d „  Z
 d „  Z RS(   i   c         C   s,   t  d „  | p d Dƒ ƒ |  _ | |  _ d  S(   Nc         s   s!   |  ] } t  j j | ƒ Vq d  S(   N(   R   R   R   (   R   R   (    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pys	   <genexpr>O   s   (    (   R   R   t   interval(   t   selfR   R2   (    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyt   __init__N   s    	c         C   s   d  S(   N(    (   R3   (    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyt   runS   s    c         C   sÉ   xÂ t  d d |  j ƒ t j g t j } t j j ƒ  } d | d <t j d k r t r xB t	 | ƒ D]1 \ } } t
 | t ƒ re | j d ƒ | | <qe qe Wn  t j | d | ƒ} | d k r | Sq d	 S(
   su   Spawn a new Python interpreter with the same arguments as this one,
        but running the reloader thread.
        t   infos    * Restarting with %st   truet   WERKZEUG_RUN_MAINt   nts
   iso-8859-1t   envi   N(   R   t   nameR   t
   executablet   argvR   t   environt   copyR   R   t
   isinstanceR   t   encodet
   subprocesst   call(   R3   t   argst   new_environR   t   valuet	   exit_code(    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyt   restart_with_reloaderV   s    
c         C   s4   t  j j | ƒ } t d d | ƒ t j d ƒ d  S(   NR6   s#    * Detected change in %r, reloadingi   (   R   R   R   R   R   t   exit(   R3   R   (    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyt   trigger_reloadl   s    N(   t   __name__t
   __module__R
   R;   t   staticmethodt   timet   sleept   _sleepR4   R5   RH   RJ   (    (    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyR1   F   s   		t   StatReloaderLoopc           B   s   e  Z d  Z d „  Z RS(   t   statc         C   s´   i  } x§ x‘ t  t ƒ  |  j ƒ D]z } y t j | ƒ j } Wn t k
 rQ q n X| j | ƒ } | d  k r} | | | <q q | | k r |  j	 | ƒ q q W|  j
 |  j ƒ q	 d  S(   N(   R    R   R   R   RR   t   st_mtimet   OSErrort   getR
   RJ   RP   R2   (   R3   t   mtimesR   t   mtimet   old_time(    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyR5   u   s    
(   RK   RL   R;   R5   (    (    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyRQ   r   s   t   WatchdogReloaderLoopc           B   s#   e  Z d  „  Z d „  Z d „  Z RS(   c            sÊ   t  j ˆ | | Ž d d l m } d d l m } t ƒ  ˆ _ ‡ f d †  ‰  d | f ‡  f d †  ƒ  Y} | j j	 ƒ  } | j
 d ƒ r• | d  } n  | d	 7} | ˆ _ | ˆ _ | ƒ  ˆ _ t ˆ _ d  S(
   Niÿÿÿÿ(   t   Observer(   t   FileSystemEventHandlerc            s’   |  ˆ  j  k r ˆ  j |  ƒ n  t j j |  ƒ } | j t ˆ  j ƒ ƒ rŽ |  j d ƒ rl ˆ  j |  d  ƒ qŽ |  j d ƒ rŽ ˆ  j |  ƒ qŽ n  d  S(   Ns   .pycs   .pyoiÿÿÿÿs   .py(   s   .pycs   .pyo(	   R   RJ   R   R   R   t
   startswitht   tuplet   observable_pathst   endswith(   R   R   (   R3   (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyt   _check_modification   s    t   _CustomHandlerc              s&   e  Z ‡  f d  †  Z ‡  f d †  Z RS(   c            s   ˆ  | j  ƒ d  S(   N(   t   src_path(   R3   t   event(   R`   (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyt
   on_createdš   s    c            s   ˆ  | j  ƒ d  S(   N(   Rb   (   R3   Rc   (   R`   (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyt   on_modifiedœ   s    (   RK   RL   Rd   Re   (    (   R`   (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyRa   ™   s   t   observeriøÿÿÿs	    reloader(   R1   R4   t   watchdog.observersRZ   t   watchdog.eventsR[   R   R^   RK   t   lowerR_   R;   t   observer_classt   event_handlert   Falset   should_reload(   R3   RD   t   kwargsRZ   R[   Ra   t   reloader_name(    (   R`   R3   s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyR4   ‰   s    

		c         C   s   t  |  _ t j |  | ƒ d  S(   N(   R*   Rm   R1   RJ   (   R3   R   (    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyRJ   ª   s    	c         C   s  i  } |  j  ƒ  } | j ƒ  xî |  j st | ƒ } t |  j ƒ } xk | D]c } | | k r  y# | j |  j | d t ƒ| | <Wq  t	 k
 rœ d  | | <q  Xn  | j | ƒ qJ Wx< | D]4 } | j | d  ƒ } | d  k	 r¸ | j | ƒ q¸ q¸ W| |  _ |  j |  j ƒ q Wt j d ƒ d  S(   Nt	   recursivei   (   Rj   t   startRm   R   R   R   t   scheduleRk   R*   RT   R
   t   discardt   popt
   unscheduleR^   RP   R2   R   RI   (   R3   t   watchesRf   t	   to_deleteR-   R   t   watch(    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyR5   °   s*    
	(   RK   RL   R4   RJ   R5   (    (    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyRY   ‡   s   	!	RR   t   watchdogs   watchdog.observerst   autoi   c         C   s¸   d d l  } t | | | ƒ } | j  | j d „  ƒ yk t j j d ƒ d k rŒ t j d |  d d ƒ } | j t	 ƒ | j
 ƒ  | j ƒ  n t j | j ƒ  ƒ Wn t k
 r³ n Xd S(	   s<   Run the given function in an independent python interpreter.iÿÿÿÿNc          W   s   t  j d ƒ S(   Ni    (   R   RI   (   RD   (    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyt   <lambda>ß   s    R8   R7   t   targetRD   (    (   t   signalt   reloader_loopst   SIGTERMR   R>   RU   t	   threadingt   Threadt	   setDaemonR*   Rq   R5   R   RI   RH   t   KeyboardInterrupt(   t	   main_funcR   R2   t   reloader_typeR}   t   reloadert   t(    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyt   run_with_reloaderÚ   s    
(   R   R   RN   RB   R€   t	   itertoolsR    t   werkzeug._internalR   t   werkzeug._compatR   R   R   R   R
   R   R   t   objectR1   RQ   RY   R~   t
   __import__t   ImportErrorRˆ   (    (    (    s4   /tmp/pip-build-yRzxKb/Werkzeug/werkzeug/_reloader.pyt   <module>   s.   		,F
