
    2Bf~6                     ^   U d dl Z d dlZ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 ej                  ej                  ej                   ej"                  hZ eed      rej'                  ej(                          ee      Z[dej.                  e   fdZd	ej4                  e   d
ej4                  e   ddfdZdej4                  e   d
ej4                  e   dej8                  e   fdZdej4                  e   d
ej4                  e   dej8                  e   fdZd	ej8                  e   dej8                  e   fdZdej@                  e   fdZ! G d d      Z" G d de"      Z# G d de"      Z$e#e$dZ%ejL                  eejN                  e"   f   e(d<   	  e)d       e%d   e%d<   d"dZ+	 	 	 	 d#dejX                  g df   dejZ                  ej8                  e      d
ejZ                  ej8                  e      dej\                  e/e0f   d eddfd!Z1y# e*$ r e%d   e%d<   Y {w xY w)$    N)chain)PurePath   )_logreal_prefixreturnc               #   X  K   t        t        j                  j                               D ]|  } t	        | dd      }|t
        j                  j                  |      sG|}t
        j                  j                  |      }||k(  rYt
        j                  j                  |      sG| ~ yw)z;Find the filesystem paths associated with imported modules.__file__N)	listsysmodulesvaluesgetattrospathisfiledirname)modulenameolds      R/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/werkzeug/_reloader.py_iter_module_pathsr      s      s{{))+, vz40<''..&C77??4(Ds{ ''..& Js   B B*#B*pathsexclude_patternsc                 \    |D ]'  }| j                  t        j                  | |             ) y N)difference_updatefnmatchfilter)r   r   patterns      r   _remove_by_patternr!   .   s,    # @ug >?@    extra_filesc           	         t               }t        t        t        j                        |       D ]  }t
        j                  j                  |      }t
        j                  j                  |      r|j                  |       t        j                  |      D ]  \  }}}|j                  t              s!t
        j                  j                  |      dv r|j                          N|D ]C  }|j                  d      s|j                  t
        j                  j                  ||             E   |j!                  t#                      t%        ||       |S )ax  Find paths for the stat reloader to watch. Returns imported
    module files, Python files under non-system paths. Extra files and
    Python files under extra directories can also be scanned.

    System paths have to be excluded for efficiency. Non-system paths,
    such as a project root or ``sys.path.insert``, should be the paths
    of interest to the user anyway.
    >   .hg.git__pycache__)z.pyz.pyc)setr   r   r   r   r   abspathr   addwalk
startswith_ignore_prefixesbasenameclearendswithjoinupdater   r!   )r#   r   r   r   rootdirsfilesr   s           r   _find_stat_pathsr6   3   s    EEd388nk2 8wwt$77>>$IIdO!# 	8D$
 /0BGG4D4DT4J O 5
 

 8==1IIbggll4678	880 
LL#%&u./Lr"   c                    t               }t        t        t        j                        |       D ]p  }t
        j                  j                  |      }t
        j                  j                  |      rt
        j                  j                  |      }|j                  |       r t               D ]0  }|j                  t
        j                  j                  |             2 t        ||       t        |      S )zFind paths for the stat reloader to watch. Looks at the same
    sources as the stat reloader, but watches everything under
    directories instead of individual files.
    )r(   r   r   r   r   r   r)   r   r   r*   r   r!   _find_common_roots)r#   r   r4   r   s       r   _find_watchdog_pathsr9   ]   s     5Dd388nk2 wwt$77>>$77??4(D #$ (&'( t-.d##r"   c                 D   i }t        d | D        t        d      D ]-  }|}|D ]  }|j                  |i       } |j                          / t	               dt
        j                  t        t        f   dt
        j                  t        df   dd ffd |d	       S )
Nc              3   F   K   | ]  }t        |      j                    y wr   )r   parts).0xs     r   	<genexpr>z%_find_common_roots.<locals>.<genexpr>x   s     ;(1+++;s   !T)keyreversenoder   .r   c                     | j                         D ]  \  }} |||fz           | s,j                  t        j                  j                  |        y y r   )itemsr*   r   r   r1   )rB   r   prefixchild_walkrvs       r   rG   z!_find_common_roots.<locals>._walk   sP    !ZZ\ 	+MFE%	)*	+ FF277<<&' r"    )
sortedlen
setdefaultr/   r(   tMappingstrdictTuple)r   r3   chunksrB   chunkrG   rH   s        @@r   r8   r8   u   s     D;U;dS  	.E??5"-D	. 	

 
B(AIIc4i( (S0A (d ( 
$OIr"   c                  >   t         j                  g} t         j                  d   }t         j                  dd }t         j                  d   }t	        |dd      ft
        j                  dk(  rE|j                  dk(  r5t
        j                  j                  |      st
        j                  j                  | d      rt
        j                  j                  |      }t
        j                  dk(  rt
        j                  j                  |      s't
        j                  j                  | d      r|dz  }t
        j                  j                  t         j                        d   dk(  r6t
        j                  j                  |      d   dk(  r| j                  d       | j                  |       nt         j                  d   d	k(  rt         j                  }nt
        j                  j                  |      rqt        j                   t"        |j                        }t
        j                  j                  t
        j                  j%                  |            d   }|dk7  r|d
| z  }n|}| j'                  d	|j)                  d
      f       | j'                  |       | 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   r   rV   r   existsr)   splitextpopappendr   rM   castrO   r.   extendlstrip)rH   	py_scriptargsrU   	py_moduler   s         r   _get_args_for_reloadingrf      s    ..	BI88AB<D{{:&H
 x-5
4  B&y)GGNNi[-. GGOOI.	77d? 77>>),9+T@R1SV#	   03v=GG$$Y/2f<q	
		) 88A;$ 88Dww~~i(FF3(<(<=	ww''(8(8(CDQG:%1TF+I &	IItY--c234IIdOIr"   c            	           e Zd ZdZ	 	 	 ddej
                  ej                  e      dej
                  ej                  e      dej                  e	e
f   ddfdZddZd	 Zdd
ZddZde	fdZdeddfdZdeddfdZy)ReloaderLooprX   Nr#   r   intervalr   c                     |xs dD ch c]!  }t         j                  j                  |      # c}| _        t	        |xs d      | _        || _        y c c}w )NrI   )r   r   r)   r#   r(   r   ri   )selfr#   r   ri   r>   s        r   __init__zReloaderLoop.__init__   sL     EPDUSU'Vq(:'V,/0@0FB,G  (Ws   &Ac                 &    | j                          | S )zgDo any setup, then run one step of the watch to populate the
        initial filesystem state.
        )run_steprk   s    r   	__enter__zReloaderLoop.__enter__   s     	r"   c                      y)z4Clean up any resources associated with the reloader.NrI   rk   exc_typeexc_valexc_tbs       r   __exit__zReloaderLoop.__exit__   s    r"   c                 d    	 | j                          t        j                  | j                         0)zfContinually run the watch step, sleeping for the configured
        interval after each step.
        )rn   timesleepri   ro   s    r   runzReloaderLoop.run   s%     MMOJJt}}% r"   c                      y)z}Run one step for watching the filesystem. Called once to set
        up initial state, then repeatedly to update it.
        NrI   ro   s    r   rn   zReloaderLoop.run_step   s     	r"   c                     	 t        dd| j                          t               }t        j                  j                         }d|d<   t        j                  ||d      }|dk7  r|S f)z|Spawn a new Python interpreter with the same arguments as the
        current one, but running the reloader thread.
        infoz * Restarting with trueWERKZEUG_RUN_MAINF)env	close_fds   )r   r   rf   r   environcopy
subprocesscall)rk   rd   new_environ	exit_codes       r   restart_with_reloaderz"ReloaderLoop.restart_with_reloader   sd     .tyyk:;*,D**//+K/5K+,"+OIA~   r"   filenamec                 P    | j                  |       t        j                  d       y Nr   )
log_reloadr   exitrk   r   s     r   trigger_reloadzReloaderLoop.trigger_reload   s    !r"   c                 b    t         j                  j                  |      }t        dd|d       y )Nr}   z * Detected change in z, reloading)r   r   r)   r   r   s     r   r   zReloaderLoop.log_reload  s(    77??8,V-h\EFr"   )NNr   )r   rh   r   N)__name__
__module____qualname__r   rM   OptionalIterablerO   Unionintfloatrl   rp   rv   rz   rn   r   r   r   rI   r"   r   rh   rh      s    D 488<()	!ZZ

30! **QZZ_5! ''#u*%	!
 
!&!s !s t G3 G4 Gr"   rh   c                   0     e Zd ZdZdef fdZddZ xZS )StatReloaderLoopstatr   c                 .    i | _         t        | 	         S r   )mtimessuperrp   rk   	__class__s    r   rp   zStatReloaderLoop.__enter__	  s    *,w ""r"   c                 F   t        t        | j                  | j                              D ]f  }	 t	        j
                  |      j                  }| j                  j                  |      }||| j                  |<   P||kD  sV| j                  |       h y # t        $ r Y uw xY wr   )r   r6   r#   r   r   r   st_mtimeOSErrorr   getr   )rk   r   mtimeold_times       r   rn   zStatReloaderLoop.run_step  s    *4+;+;T=R=RST 	*D.. {{t,H$)D!x##D)	*  s   B	B B r   )r   r   r   r   rh   rp   rn   __classcell__r   s   @r   r   r     s    D#< #*r"   r   c                        e Zd Zdej                  dej                  ddf fdZdeddfdZdef fdZ	d	 Z
dd
ZddZ xZS )WatchdogReloaderLooprd   kwargsr   Nc                   	 ddl m} ddlm} t	        
|   |i | | j                  	 G 	fdd|      }|j                  j                         }|j                  d      r|d d }d| d	| _
         |       | _        | j                  D cg c]$  }t        j                  j                  |      r#|& }} |d
ddg|dddg| j                         | _        d| _        y c c}w )Nr   )Observer)PatternMatchingEventHandlerc                       e Zd Z fdZy)3WatchdogReloaderLoop.__init__.<locals>.EventHandlerc                 *     |j                          y r   )src_path)rk   eventr   s     r   on_any_eventz@WatchdogReloaderLoop.__init__.<locals>.EventHandler.on_any_event'  s    u~~.r"   N)r   r   r   r   )r   s   r   EventHandlerr   &  s    /r"   r   observeriz
watchdog ()z*.pyz*.pycz*.zipz*/__pycache__/*z*/.git/*z*/.hg/*)patternsignore_patternsF)watchdog.observersr   watchdog.eventsr   r   rl   r   r   lowerr0   r   r   r#   r   r   isdirr   event_handlershould_reload)rk   rd   r   r   r   r   reloader_namepextra_patternsr   r   s            @r   rl   zWatchdogReloaderLoop.__init__  s    /?$)&),,	/6 	/ !))//1!!*-)#2.M q1	 
 &*%5%5NRWW]]1=M!NN)gw@@! &&	
 # Os   $C"1C"r   c                 4    d| _         | j                  |       y )NT)r   r   r   s     r   r   z#WatchdogReloaderLoop.trigger_reloadB  s     "!r"   c                 b    i | _         | j                  j                          t        |          S r   )watchesr   startr   rp   r   s    r   rp   zWatchdogReloaderLoop.__enter__I  s(    +-w ""r"   c                 l    | j                   j                          | j                   j                          y r   )r   stopr1   rr   s       r   rv   zWatchdogReloaderLoop.__exit__N  s"    r"   c                     | j                   s<| j                          t        j                  | j                         | j                   s<t        j                  d       y r   )r   rn   rx   ry   ri   r   r   ro   s    r   rz   zWatchdogReloaderLoop.runR  s<    $$MMOJJt}}% $$ 	r"   c                    t        | j                        }t        | j                  | j                        D ]W  }|| j                  vr6	 | j
                  j                  | j                  |d      | j                  |<   |j                  |       Y |D ]<  }| j                  j                  |d       }|"| j
                  j                  |       > y # t        $ r d | j                  |<   Y ow xY w)NT)	recursive)r(   r   r9   r#   r   r   scheduler   r   discardr^   
unschedule)rk   	to_deleter   watchs       r   rn   zWatchdogReloaderLoop.run_stepY  s    %	()9)94;P;PQ 	$D4<<'.)-)?)?**DD *@ *DLL& d#	$  	0DLL$$T40E ((/		0  . *.DLL&	.s   5CC-,C-r   )r   r   r   rM   Anyrl   rO   r   rh   rp   rv   rz   rn   r   r   s   @r   r   r     sT    !#aee !#quu !# !#F"s "t "#< #
0r"   r   )r   watchdogreloader_loopszwatchdog.observersr   autor   c                  r   t         j                  t         j                  j                         sy	 ddl} | j                  t         j                        }|d   | j                  z  sC|dxx   | j                  z  cc<   | j                  t         j                  | j                  |       yy# t        $ r Y yw xY w)zuEnsure that echo mode is enabled. Some tools such as PDB disable
    it which causes usability issues after a reload.Nr   r   )	r   stdinisattytermiosImportError	tcgetattrECHO	tcsetattrTCSANOW)r   
attributess     r   ensure_echo_onr   ~  s     yy		 0 0 2 ""399-Ja=7<<'1%#))W__jA (  s   B* *	B65B6	main_funcri   reloader_typec                    ddl }|j                  |j                  d        t        |   |||      }	 t        j                  j                  d      dk(  rUt                t        j                  | d      }d	|_	        |5   |j                          |j                          ddd       yt        j                  |j                                y# 1 sw Y   yxY w# t        $ r Y yw xY w)
z<Run the given function in an independent Python interpreter.r   Nc                  ,    t        j                  d      S )Nr   )r   r   )rd   s    r   <lambda>z#run_with_reloader.<locals>.<lambda>  s     r"   )r#   r   ri   r   r~   rI   )targetrd   T)signalSIGTERMr   r   r   r   r   	threadingThreaddaemonr   rz   r   r   r   KeyboardInterrupt)r   r#   r   ri   r   r   reloaderrM   s           r   run_with_reloaderr     s     
MM&..";<m,2BXH::>>-.&8  	;AAH  	  HHX3356	 
  s6   AC  "C"C +#C CC C 	C'&C'r   )NNr   r   )2r   r   r   r   r   rx   typingrM   	itertoolsr   pathlibr   	_internalr   rE   base_prefixexec_prefixbase_exec_prefixhasattrr*   r   tupler-   IteratorrO   r   Setr!   r   r6   r9   r8   Listrf   rh   r   r   r   DictType__annotations__
__import__r   r   Callabler   r   r   r   r   rI   r"   r   <module>r     sr    	  
      
 **coos8L8L	M
3
JJs= 
AJJsO (@aeeCj @AEE#J @4 @
's'/0uuSz'ZZ_'T$s$/0uuSz$ZZ_$0ajjo !**S/ 09 9x:G :Gz*| *0P0< P0h $5sAFF<001 
8#$ ,J7N6B* 0448$%zz"d(#AJJsO, jjC1 ggc5j!	
  
3  4+F3N64s    H H,+H,