
    wdf-                     L   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	 ddlm
Z
 ddlmZ d Zdd	Zd
 Zd Z G d de          Z G d de          Z G d de          ZeedZ	  ed           ed         ed<   n# e$ r ed         ed<   Y nw xY wd ZddZdS )    N)chain   )	iteritems)PY2)	text_type)_logc               #     K   t          t          j                                                  D ]} | t	          | dd          }|rt
          j                            |          r]t
          j                            t
          j        	                    |d                    r t
          j        	                    |d          }d}t
          j        
                    |          sG|}t
          j                            |          }||k    rn9t
          j        
                    |          G|dd         dv r
|dd         }|V  dS )zThis 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.
    N__file__z__init__.py).pyc.pyo)listsysmodulesvaluesgetattrospathisdirexistsjoinisfiledirname)modulefilenameolds      W/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/werkzeug/_reloader.py_iter_module_filesr      s5      s{))++,,  >6:t44 	w}}X&& A27>>X}55, , A 7<<-@@CgnnX.. 7??844s??	 gnnX..  BCC=$444'}H'     c                 8   t          d t          j        D                       }| pdD ]Q}|                    t          j                            t          j                            |                               Rt          t          j        	                                          D ]g}t          |dd          }|t          j                            |          }|                    t          j                            |                     ht          |          S )z(Finds all paths that should be observed.c              3   
  K   | ]~}t           j                            |          r<t           j                            t           j                            |                    nt           j                            |          V  d S N)r   r   r   r   abspath.0xs     r   	<genexpr>z)_find_observable_paths.<locals>.<genexpr>-   sy         02w~~a/@/@X**+++bgooVWFXFX     r     r
   N)setr   r   addr   r   r$   r   r   r   r   _find_common_roots)extra_filesrvr   r   fns        r   _find_observable_pathsr0   +   s    	     
 
B
  %2 ; ;
rwrwx8899::::s{))++,, $ $VZ..:W__R  
rwr""####b!!!r    c                     t           j        g} t           j        d         }t           j        dd         }t           j        d         }t	          |dd          _t
          j        dk    rJ|j        dk    r>t
          j        	                    |          st
          j        	                    |dz             rt
          j        
                    |          }t
          j        dk    rt
          j        	                    |          s't
          j        	                    |dz             r|dz  }t
          j                            t           j                  d         dk    r>t
          j                            |          d         dk    r|                     d           |                     |           nt           j        d         d	k    rt           j        }nt
          j                            |          rX|j        }t
          j                            t
          j                            |                    d         }|dk    r|d
|z   z  }n|}|                     d	|                    d
          f           |                     |           | S )zpDetermine how the script was executed, and return the args needed
    to execute it again in a new process.
    r   r   N__main____package__nt z.exez-m.)r   
executableargvr   r   r   namer3   r   r   r$   splitextpopappendr   basenameextendlstrip)r.   	py_scriptargsr2   	py_moduler9   s         r   _get_args_for_reloadingrC   ?   s    .	BI8ABB<D{:&H
 x--5
4 B&&y)) 'GNN9v-.. '
 GOOI..	7d?? 7>>),, $	F@R1S1S $V#	   003v==G$$Y//2f<<q			
		) 8A;$ 8DDw~~i(( 	&$0	w''(8(8(C(CDDQG:%%t+I &	IItY--c223444IIdOOOIr    c                     d | D             } i }t          | t          d          D ]3}|}|D ]}|                    |i           }|                                 4t	                      fd |d           S )zAOut of some paths it finds the common roots that need monitoring.c                 V    g | ]&}|                     t          j        j                  'S r)   )splitr   r   sepr%   s     r   
<listcomp>z&_find_common_roots.<locals>.<listcomp>}   s(    111aQWWRW[!!111r    T)keyreversec                     t          |           D ]\  }} |||fz              | s*                    d                    |                     d S d S )N/)r   r+   r   )noder   prefixchild_walkr.   s       r   rP   z!_find_common_roots.<locals>._walk   sl    &t__ 	+ 	+MFEE%	)**** 	#FF388D>>"""""	# 	#r    r)   )sortedlen
setdefaultclearr*   )pathsrootchunksrM   chunkrP   r.   s        @@r   r,   r,   {   s    115111EDC666   	. 	.E??5"--DD

	B# # # # # # 
E$OOOIr    c                   R    e Zd ZdZ eej                  ZddZd Z	d Z
d Zd ZdS )	ReloaderLoopNr   c                 T    t          d |pdD                       | _        || _        d S )Nc              3   T   K   | ]#}t           j                            |          V  $d S r#   )r   r   r$   r%   s     r   r(   z(ReloaderLoop.__init__.<locals>.<genexpr>   s0      MMarwq11MMMMMMr    r)   )r*   r-   interval)selfr-   r]   s      r   __init__zReloaderLoop.__init__   s1    MM;;L"MMMMM r    c                     d S r#   r)   )r^   s    r   runzReloaderLoop.run   s    r    c                    	 t          dd| j        z             t                      }t          j        dk    rt          r{i }t          t          j                  D ]^\  }}t          |t                    r|	                    d          }t          |t                    r|	                    d          }|||<   _nt          j        
                                }d|d<   t          j        ||d	          }|d
k    r|S )zuSpawn a new Python interpreter with the same arguments as this one,
        but running the reloader thread.
        r   infoz * Restarting with %sr4   z
iso-8859-1trueWERKZEUG_RUN_MAINF)env	close_fds   )r   r9   rC   r   r   r   environ
isinstancer   encodecopy
subprocesscall)r^   rA   new_environrI   value	exit_codes         r   restart_with_reloaderz"ReloaderLoop.restart_with_reloader   s    	!049<===*,,D
 w$3 "+BJ"7"7 - -JC!#y11 7!jj66!%33 ; %\ : :',K$$- !joo///5K+,"+OOOIA~~  +	!r    c                 X    |                      |           t          j        d           d S )Nrh   )
log_reloadr   exitr^   r   s     r   trigger_reloadzReloaderLoop.trigger_reload   s%    !!!r    c                 j    t           j                            |          }t          dd|z             d S )Nrc   z# * Detected change in %r, reloading)r   r   r$   r   rv   s     r   rt   zReloaderLoop.log_reload   s1    7??8,,V:XEFFFFFr    )Nr   )__name__
__module____qualname__r9   staticmethodtimesleep_sleepr_   ra   rr   rw   rt   r)   r    r   rZ   rZ      s        D
 \$*%%F! ! ! !  ! ! !6  G G G G Gr    rZ   c                       e Zd ZdZd ZdS )StatReloaderLoopstatc                 L   i }	 t          t                      | j                  D ]e}	 t          j        |          j        }n# t          $ r Y )w xY w|                    |          }||||<   J||k    r|                     |           f| 	                    | j
                   r#   )r   r   r-   r   r   st_mtimeOSErrorgetrw   r   r]   )r^   mtimesr   mtimeold_times        r   ra   zStatReloaderLoop.run   s    	'!"4"6"68HII 2 2GH--6EE   H "::h//#',F8$X%%''111KK&&&	's   A
AAN)ry   rz   r{   r9   ra   r)   r    r   r   r      s(        D' ' ' ' 'r    r   c                        e Zd Zd Zd Zd ZdS )WatchdogReloaderLoopc                 ^    t          j         g|R i | ddlm} ddlm} t                       _         fd G fdd|          }|j        	                                }|
                    d          r
|d d         }|d	z  }| _        | _         |             _        d
 _        d S )Nr   )Observer)FileSystemEventHandlerc                 ,   | j         v r                    |            t          j                            |           }|                    t          j                            r,|                     d          r                    |            d S d S d S )N)r   r   z.py)	r-   rw   r   r   r   
startswithtupleobservable_pathsendswith)r   r   r^   s     r   _check_modificationz:WatchdogReloaderLoop.__init__.<locals>._check_modification   s    4+++##H---gooh//G!!%(=">">?? 2$$%<== 2''111112 22 2r    c                   8    e Zd Z fdZ fdZ fdZ fdZdS )5WatchdogReloaderLoop.__init__.<locals>._CustomHandlerc                 (     |j                    d S r#   src_pathr^   eventr   s     r   
on_createdz@WatchdogReloaderLoop.__init__.<locals>._CustomHandler.on_created       ##EN33333r    c                 (     |j                    d S r#   r   r   s     r   on_modifiedzAWatchdogReloaderLoop.__init__.<locals>._CustomHandler.on_modified   r   r    c                 H     |j                     |j                   d S r#   )r   	dest_pathr   s     r   on_movedz>WatchdogReloaderLoop.__init__.<locals>._CustomHandler.on_moved   s/    ##EN333##EO44444r    c                 (     |j                    d S r#   r   r   s     r   
on_deletedz@WatchdogReloaderLoop.__init__.<locals>._CustomHandler.on_deleted   r   r    N)ry   rz   r{   r   r   r   r   )r   s   r   _CustomHandlerr      sy        4 4 4 4 44 4 4 4 45 5 5 5 54 4 4 4 4 4 4r    r   observeriz	 reloaderF)rZ   r_   watchdog.observersr   watchdog.eventsr   r*   r   ry   lowerr   r9   observer_classevent_handlershould_reload)r^   rA   kwargsr   r   r   reloader_namer   s   `      @r   r_   zWatchdogReloaderLoop.__init__   s   d4T444V444//////:::::: #	2 	2 	2 	2 	2	4 	4 	4 	4 	4 	4 	43 	4 	4 	4 !)//11!!*-- 	/)#2#.M$!	&+^--"r    c                 >    d| _         |                     |           d S )NT)r   rt   rv   s     r   rw   z#WatchdogReloaderLoop.trigger_reload  s$     "!!!!!r    c                    i }|                                  }|                                 	 | j        st          |          }t	          | j                  }|D ]R}||vr7	 |                    | j        |d          ||<   n# t          $ r d ||<   Y nw xY w|	                    |           S|D ]/}|
                    |d           }||                    |           0|| _        |                     | j                   | j        |                                 |                                 n-# |                                 |                                 w xY wt#          j        d           d S )NT)	recursiverh   )r   startr   r*   r0   r-   scheduler   r   discardr;   
unscheduler   r   r]   stopr   r   ru   )r^   watchesr   	to_deleterU   r   watchs          r   ra   zWatchdogReloaderLoop.run	  s   &&((	( +LL	.t/?@@! , ,D7**1,4,=,= $ 2DD -> - -GDMM  ' 1 1 1 -1GDMMM	1
 %%d++++% 3 3D#KKd33E( ++E222(-%DM***) ( +, MMOOOMMOOOO MMOOOMMOOOOs0   2D.  B ?D.  BD. BA3D. .*EN)ry   rz   r{   r_   rw   ra   r)   r    r   r   r      sB        &# &# &#P" " "    r    r   )r   watchdogzwatchdog.observersr   autor   c                  L   t           j                                        sdS 	 ddl} n# t          $ r Y dS w xY w|                     t           j                  }|d         | j        z  s=|dxx         | j        z  cc<   |                     t           j        | j        |           dS dS )zsEnsure that echo mode is enabled. Some tools such as PDB disable
    it which causes usability issues after reload.Nr   rh   )	r   stdinisattytermiosImportError	tcgetattrECHO	tcsetattrTCSANOW)r   
attributess     r   ensure_echo_onr   5  s     9    ""39--Ja=7<' B1%#)W_jAAAAAB Bs   ' 
55c                    ddl }t          |         ||          }|                     |j        d            	 t          j                            d          dk    rct                       t          j        | d          }|	                    d           |
                                 |                                 dS t          j        |                                           dS # t          $ r Y dS w xY w)	z<Run the given function in an independent python interpreter.r   Nc                  *    t          j        d          S )Nr   )r   ru   )rA   s    r   <lambda>z#run_with_reloader.<locals>.<lambda>J  s     r    re   rd   r)   )targetrA   T)signalreloader_loopsSIGTERMr   ri   r   r   	threadingThread	setDaemonr   ra   r   ru   rr   KeyboardInterrupt)	main_funcr-   r]   reloader_typer   reloaderts          r   run_with_reloaderr   E  s    MMMm,[(CCH
MM&.";";<<<
:>>-..&88 	;;;AKKGGIIILLNNNNNHX335566666   s   BC& >&C& &
C43C4r#   )Nr   r   )r   rm   r   r   r}   	itertoolsr   _compatr   r   r   	_internalr   r   r0   rC   r,   objectrZ   r   r   r   
__import__r   r   r   r)   r    r   <module>r      s    				     



                                     :" " " "(9 9 9x  ,0G 0G 0G 0G 0G6 0G 0G 0Gf' ' ' ' '| ' ' '*O O O O O< O O Od +8LMM8J#$$$ ,J7N6  4 4 4+F3N64B B B      s   0B BB