
     f:                    :   U d dl m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Z	d dl
mZ d dlmZ ddlmZ  eej        ej        h          Zh eej        ej        Z eed          re                    ej                    ee          Z[h dZd.dZd/dZd0dZd0dZd1dZd2dZ  G d d          Z! G d de!          Z" G d de!          Z#e"e#dZ$de%d <   	  e&d!           e$d"         e$d#<   n# e'$ r e$d$         e$d#<   Y nw xY wd3d%Z(	 	 	 	 d4d5d-Z)dS )6    )annotationsN)chain)PurePath   )_logreal_prefix>   .hg.git.nox.tox.mypy_cache.pytest_cache__pycache__returnt.Iterator[str]c               #    K   t          t          j                                                  D ]} t	          | dd          }||                    t                    r0t          j        	                    |          sG|}t          j        
                    |          }||k    rn#t          j        	                    |          G|V  dS )z;Find the filesystem paths associated with imported modules.__file__N)listsysmodulesvaluesgetattr
startswith_ignore_alwaysospathisfiledirname)modulenameolds      U/var/www/api.educacionweb.es/myenv/lib/python3.11/site-packages/werkzeug/_reloader.py_iter_module_pathsr#   (   s       s{))++,,  vz400<4??>::<'..&& 	C7??4((Ds{{ '..&& 	 JJJ     pathsset[str]exclude_patternsNonec                `    |D ]*}|                      t          j        | |                     +d S N)difference_updatefnmatchfilter)r%   r'   patterns      r"   _remove_by_patternr/   <   sB    # @ @ug > >????@ @r$   extra_filest.Iterable[str]c           	        t                      }t          t          t          j                  |           D ]z}t
          j                            |          }t
          j                            |          r|                    |           Wt
          j        	                    |          di}t          j
        |          D ]\  }}}|                    t                    s&t
          j                            |          t          v r|                                 [d}|D ]L}	|	                    d          r5d}|                    t
          j                            ||	                     M|s:|t
          j        	                    |                   s|                                 |||<   ||                    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.
    TF)z.pyz.pyc)setr   r   r   r   r   abspathr   addr   walkr   _stat_ignore_scanbasename_ignore_common_dirsclearendswithjoinupdater#   r/   )
r0   r'   r%   r   parent_has_pyrootdirsfileshas_pyr    s
             r"   _find_stat_pathsrC   A   s    EEEd38nnk22 ") ")wt$$7>>$ 	IIdOOO..5!# 	) 	)D$
  1227##D))-@@@

F 8 8==11 8!FIIbgll466777  mBGOOD,A,AB 

"(M$1	)4 
LL#%%&&&u.///Lr$   c                   t                      }t          t          t          j                  |           D ]t}t
          j                            |          }t
          j                            |          rt
          j                            |          }|	                    |           ut                      D ]4}|	                    t
          j                            |                     5t          ||           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.
    )r3   r   r   r   r   r   r4   r   r   r5   r#   r/   _find_common_roots)r0   r'   r@   r    s       r"   _find_watchdog_pathsrF   w   s     55Dd38nnk22  wt$$7>>$ 	)7??4((D"$$ ( (&&''''t-...d###r$   c                    i }t          d | D             t          d          D ]3}|}|D ]}|                    |i           }|                                 4t	                      dfd
 |d           S )Nc              3  >   K   | ]}t          |          j        V  d S r*   )r   parts.0xs     r"   	<genexpr>z%_find_common_roots.<locals>.<genexpr>   s+      ;;(1+++;;;;;;r$   T)keyreversenode t.Mapping[str, dict[str, t.Any]]r   tuple[str, ...]r   r(   c                    |                                  D ]\  }} |||fz              | s*|r*                    t          j        j        |            d S d S d S r*   )itemsr5   r   r   r<   )rP   r   prefixchild_walkrvs       r"   rW   z!_find_common_roots.<locals>._walk   s    !ZZ\\ 	+ 	+MFEE%	)****  	( 	(FF27<&'''''	( 	( 	( 	(r$    )rP   rQ   r   rR   r   r(   )sortedlen
setdefaultr:   r3   )r%   r?   chunksrP   chunkrW   rX   s        @@r"   rE   rE      s    (*D;;U;;;dSSS   	. 	.E??5"--DD

	B( ( ( ( ( ( ( 
E$OOOIr$   	list[str]c                 j   t           j        dk    r!t           j        gt           j        dd         S 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	          rt          j
                            |          }t          j        dk    rt          j
                            |          s't          j
                            | d	          r|d	z  }t          j
                            t           j                  d         d	k    r>t          j
                            |          d         d	k    r|                     d           |                     |           nt          j
                            |          rpt#          j        t&          |j	                  }t          j
                            t          j
                            |                    d         }|dk    r|d
| 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   Nr   __main____package__nt z.exe.z-m)r   version_info
executable	orig_argvargvr   r   r   r    rd   r   existsr4   splitextpopappendr   tcaststrr8   extendlstrip)rX   	py_scriptargsrc   	py_moduler    s         r"   _get_args_for_reloadingrx      s;    7"" 3qrr!233
.	BI8ABB<D{:&H
 x--5
4 B&&y)) 'GNNi---.. '
 GOOI..	7d?? 7>>),, $9@R@R@R1S1S $V#	   003v==G$$Y//2f<<q			
		) 7>>)$$ 		"sH$899I7##BG$4$4Y$?$?@@CDz!!ZZZ'	 "I
		4))#../000IIdOOOIr$   c                  X    e Zd ZdZ	 	 	 dddZddZd ZddZddZddZ	ddZ
ddZdS )ReloaderLooprf   Nr   r0   t.Iterable[str] | Noner'   intervalint | floatr   r(   c                f    d |pdD             | _         t          |pd          | _        || _        d S )Nc                L    h | ]!}t           j                            |          "S rY   )r   r   r4   rJ   s     r"   	<setcomp>z(ReloaderLoop.__init__.<locals>.<setcomp>   s&    %T%T%TQbgooa&8&8%T%T%Tr$   rY   )r0   r3   r'   r|   )selfr0   r'   r|   s       r"   __init__zReloaderLoop.__init__   sB     &U%T+BSQS%T%T%T*-.>.D"*E*E r$   c                .    |                                   | S )zgDo any setup, then run one step of the watch to populate the
        initial filesystem state.
        )run_stepr   s    r"   	__enter__zReloaderLoop.__enter__   s     	r$   c                    dS )z4Clean up any resources associated with the reloader.NrY   r   exc_typeexc_valexc_tbs       r"   __exit__zReloaderLoop.__exit__   s    r$   c                `    	 |                                   t          j        | j                   .)zfContinually run the watch step, sleeping for the configured
        interval after each step.
        )r   timesleepr|   r   s    r"   runzReloaderLoop.run   s+    	&MMOOOJt}%%%	&r$   c                    dS )z}Run one step for watching the filesystem. Called once to set
        up initial state, then repeatedly to update it.
        NrY   r   s    r"   r   zReloaderLoop.run_step  s	     	r$   intc                    	 t          dd| j                    t                      }t          j                                        }d|d<   t          j        ||d          }|dk    r|S i)	z|Spawn a new Python interpreter with the same arguments as the
        current one, but running the reloader thread.
        Tinfoz * Restarting with trueWERKZEUG_RUN_MAINF)env	close_fdsra   )r   r    rx   r   environcopy
subprocesscall)r   rv   new_environ	exit_codes       r"   restart_with_reloaderz"ReloaderLoop.restart_with_reloader
  ss    	!:ty::;;;*,,D*//++K/5K+,"+OOOIA~~  	!r$   filenamerr   c                X    |                      |           t          j        d           d S Nra   )
log_reloadr   exitr   r   s     r"   trigger_reloadzReloaderLoop.trigger_reload  s%    !!!r$   c                l    t           j                            |          }t          dd|d           d S )Nr   z * Detected change in z, reloading)r   r   r4   r   r   s     r"   r   zReloaderLoop.log_reload  s7    7??8,,VEhEEEFFFFFr$   )NNr   )r0   r{   r'   r{   r|   r}   r   r(   r   rz   r   r(   )r   r   r   rr   r   r(   )__name__
__module____qualname__r    r   r   r   r   r   r   r   r   rY   r$   r"   rz   rz      s        D /337 !	! ! ! ! !     & & & &   ! ! ! !   G G G G G Gr$   rz   c                  ,     e Zd ZdZd fdZddZ xZS )	StatReloaderLoopstatr   rz   c                R    i | _         t                                                      S r*   )mtimessuperr   r   	__class__s    r"   r   zStatReloaderLoop.__enter__$  s     (*ww  """r$   r(   c                   t          | j        | j                  D ]o}	 t          j        |          j        }n# t          $ r Y )w xY w| j                            |          }||| j        |<   T||k    r| 	                    |           pd S r*   )
rC   r0   r'   r   r   st_mtimeOSErrorr   getr   )r   r    mtimeold_times       r"   r   zStatReloaderLoop.run_step(  s    $T%5t7LMM 	* 	*D.    {t,,H$)D!x##D)))	* 	*s   8
AAr   r   )r   r   r   r    r   r   __classcell__r   s   @r"   r   r   !  sV        D# # # # # #* * * * * * * *r$   r   c                  J     e Zd Zd fdZdd	Zd fdZd ZddZddZ xZ	S )WatchdogReloaderLooprv   t.Anykwargsr   r(   c                  	
 ddl m	 ddl m} ddl m} ddlm}  t                      j        |i | | j        
 G 	
fdd|          }|j	        
                                }|                    d          r
|d d	         }d
| d| _         |            | _        d | j        D             } |dddg|g d t          D             | j                  | _        d| _        d S )Nr   )EVENT_TYPE_OPENED)FileModifiedEvent)PatternMatchingEventHandler)Observerc                      e Zd Zd fdZdS )3WatchdogReloaderLoop.__init__.<locals>.EventHandlereventr   c                B    |j         k    rd S  |j                   d S r*   )
event_typesrc_path)r   r   r   r   s     r"   on_any_eventz@WatchdogReloaderLoop.__init__.<locals>.EventHandler.on_any_eventD  s/    #'888Fu~.....r$   N)r   r   )r   r   r   r   )r   r   s   r"   EventHandlerr   C  s8        / / / / / / / / /r$   r   observeriz
watchdog ()c                P    g | ]#}t           j                            |          !|$S rY   )r   r   isdir)rK   ps     r"   
<listcomp>z1WatchdogReloaderLoop.__init__.<locals>.<listcomp>V  s+    NNNRW]]1=M=MN!NNNr$   z*.pyz*.pycz*.zipc                    g | ]}d | d	S )z*/z/*rY   )rK   ds     r"   r   z1WatchdogReloaderLoop.__init__.<locals>.<listcomp>Z  s     :::*q***:::r$   )patternsignore_patternsF)watchdog.eventsr   r   r   watchdog.observersr   r   r   r   r   lowerr;   r    r   r0   r9   r'   event_handlershould_reload)r   rv   r   r   r   r   r   reloader_nameextra_patternsr   r   r   s            @@r"   r   zWatchdogReloaderLoop.__init__:  s|   555555555555??????//////$)&))),	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/6 	/ 	/ 	/ !)//11!!*-- 	/)#2#.M1111	 

 ONT%5NNN)\gw@@::&9:::&
 
 
 #r$   r   rr   c                >    d| _         |                     |           d S )NT)r   r   r   s     r"   r   z#WatchdogReloaderLoop.trigger_reload`  s$     "!!!!!r$   rz   c                    i | _         | j                                         t                                                      S r*   )watchesr   startr   r   r   s    r"   r   zWatchdogReloaderLoop.__enter__g  s4    )+ww  """r$   c                j    | j                                          | j                                          d S r*   )r   stopr<   r   s       r"   r   zWatchdogReloaderLoop.__exit__l  s0    r$   c                    | j         s4|                                  t          j        | j                   | j         4t          j        d           d S r   )r   r   r   r   r|   r   r   r   s    r"   r   zWatchdogReloaderLoop.runp  sL    $ 	&MMOOOJt}%%% $ 	& 	r$   c                   t          | j                  }t          | j        | j                  D ]f}|| j        vrF	 | j                            | j        |d          | j        |<   n# t          $ r d | j        |<   Y nw xY w|	                    |           g|D ]9}| j        
                    |d           }|| j                            |           :d S )NT)	recursive)r3   r   rF   r0   r'   r   scheduler   r   discardrn   
unschedule)r   	to_deleter   watchs       r"   r   zWatchdogReloaderLoop.run_stepw  s
   %%	()94;PQQ 	$ 	$D4<''.)-)?)?*DD *@ * *DL&&  . . . *.DL&&&	. d#### 	0 	0DL$$T400E ((///		0 	0s   *A&&A=<A=)rv   r   r   r   r   r(   r   r   r   )
r   r   r   r   r   r   r   r   r   r   r   s   @r"   r   r   9  s        $# $# $# $# $# $#L" " " "# # # # # #
     0 0 0 0 0 0 0 0r$   r   )r   watchdogzdict[str, type[ReloaderLoop]]reloader_loopszwatchdog.observersr   autor   c                 d   t           j        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 )zuEnsure that echo mode is enabled. Some tools such as PDB disable
    it which causes usability issues after a reload.Nr   ra   )	r   stdinisattytermiosImportError	tcgetattrECHO	tcsetattrTCSANOW)r   
attributess     r"   ensure_echo_onr     s     y	 0 0 2 2    ""39--Ja=7<' B1%#)W_jAAAAAB Bs   3 
A A	main_funct.Callable[[], None]r{   r|   r}   reloader_typerr   c                   ddl }|                     |j        d            t          |         |||          }	 t          j                            d          dk    rkt                       t          j        | d          }d	|_	        |5   |j
                     |                                 ddd           dS # 1 swxY w Y   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   r   )rv   s    r"   <lambda>z#run_with_reloader.<locals>.<lambda>  s     r$   )r0   r'   r|   r   r   rY   )targetrv   T)signalSIGTERMr   r   r   r   r   	threadingThreaddaemonr   r   r   r   r   KeyboardInterrupt)r   r0   r'   r|   r   r  reloaderrp   s           r"   run_with_reloaderr
    s[    MMM
MM&.";";<<<m,2BX  H:>>-..&88 	;;;AAH   			                  HX335566666   s<   AC0 
$B;.C0 ;B??C0 B?C0 &C0 0
C>=C>)r   r   )r%   r&   r'   r&   r   r(   )r0   r&   r'   r&   r   r1   )r%   r1   r   r1   )r   r_   r   )NNr   r   )r   r   r0   r{   r'   r{   r|   r}   r   rr   r   r(   )*
__future__r   r,   r   r   r   r  r   typingrp   	itertoolsr   pathlibr   	_internalr   tuplebase_prefixbase_exec_prefixr   rU   exec_prefixhasattrr5   r   r7   r9   r#   r/   rC   rF   rE   rx   rz   r   r   r   __annotations__
__import__r   r   r
  rY   r$   r"   <module>r     s   " " " " " " "  				     



                            )=>??	7>	73:	7s	7
73  
JJsE&MM 
      (@ @ @ @
3 3 3 3l$ $ $ $0   48 8 8 8v:G :G :G :G :G :G :G :Gz* * * * *| * * *0S0 S0 S0 S0 S0< S0 S0 S0n $1 1    
8J#$$$ ,J7N6  4 4 4+F3N64B B B B* +//3      s   !C8 8D
D