4V=j::UddlmZddlZddlZddlZddlZddlZddlZddlZ ddl m Z ddl m Z ddlmZeejejhZheejejZeedreejeeZ[hdZd.d Zd/dZd0dZd0dZd1dZd2dZ GddZ!Gdde!Z"Gdde!Z#e"e#dZ$de%d < e&d!e$d"e$d#<n#e'$re$d$e$d#<YnwxYwd3d%Z( d4d5d-Z)dS)6) annotationsN)chain)PurePath)_log real_prefix>.hg.git.nox.tox .mypy_cache .pytest_cache __pycache__returnt.Iterator[str]c#KttjD]}t |dd}||t r0tj |sG|}tj |}||krn#tj |G|VdS)z;Find the filesystem paths associated with imported modules.__file__N) listsysmodulesvaluesgetattr startswith_ignore_alwaysospathisfiledirname)modulenameolds @C:\PYTHON\_runtimes\venv\Lib\site-packages\werkzeug/_reloader.py_iter_module_pathsr#+ss{))++,,vz400 <4??>::< '..&& C7??4((Ds{{ '..&& JJJpathsset[str]exclude_patternsNonec`|D]*}|tj||+dSN)difference_updatefnmatchfilter)r%r'patterns r"_remove_by_patternr/?sB#@@ ug > >????@@r$ extra_filest.Iterable[str]c t}tttj|D]z}t j|}t j|r||Wt j |di}t j |D]\}}}| ts&t j |tvr|[d}|D]L} | dr5d}|t j|| M|s:|t j |s||||<||t't)|||S)axFind 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)setrrrrrabspathraddrwalkr_stat_ignore_scanbasename_ignore_common_dirsclearendswithjoinupdater#r/) r0r'r%r parent_has_pyrootdirsfileshas_pyr s r"_find_stat_pathsrCDs EEEd38nnk22))wt$$ 7>>$    IIdOOO ..5 !# ) ) D$ 122 7##D))-@@@ F 8 8==118!FIIbgll466777 mBGOOD,A,AB  "(M$  + ). LL#%%&&&u./// Lr$ct}tttj|D]t}t j|}t j|rt j|}| |utD]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. ) r3rrrrrr4rrr5r#r/_find_common_roots)r0r'r@r s r"_find_watchdog_pathsrFws 55Dd38nnk22wt$$ 7>>$   )7??4((D "$$(( &&''''t-... d # ##r$ci}td|DtdD]3}|}|D]}||i}|4t d fd |d S) Nc3>K|]}t|jVdSr*)rparts.0xs r" z%_find_common_roots..s+;;(1+++;;;;;;r$T)keyreversenode t.Mapping[str, dict[str, t.Any]]rtuple[str, ...]rr(c|D]\}}|||fz|s*|r*tjj|dSdSdSr*)itemsr5rrr<)rPrprefixchild_walkrvs r"rWz!_find_common_roots.._walks!ZZ\\ + +MFE E% ) * * * * ( ( FF27<& ' ' ' ' ' ( ( ( (r$)rPrQrrRrr()sortedlen setdefaultr:r3)r%r?chunksrPchunkrWrXs @@r"rErEs(*D;;U;;;dSSS . .E??5"--DD B((((((( E$OOO Ir$ list[str]cjtjdkr!tjgtjddStjg}tjd}tjdd}tjd}t |dd_tjdkrJ|j dkr>tj |stj |d rtj |}tjdkrtj |s'tj |d r|d z }tj tjdd kr>tj |dd kr|d||ntj |rpt#jt&|j }tj tj |d}|dkr|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. ) rNr__main__ __package__ntz.exe.z-m)r version_info executable orig_argvargvrrrr rdrexistsr4splitextpopappendrtcaststrr8extendlstrip)rX py_scriptargsrc py_moduler s r"_get_args_for_reloadingrxs; 7""3qrr!233 . B I 8ABB>),, $9@R@R@R1S1S $V#   003v==G$$Y//2f<<q  ) 7>>) $ $ "sH$899I7##BG$4$4Y$?$?@@CDz!!ZZZ' "I 4))#../000IIdOOO Ir$cXeZdZdZ ddd Zdd Zd ZddZddZddZ ddZ ddZ dS) ReloaderLooprfNrr0t.Iterable[str] | Noner'interval int | floatrr(cfd|pdD|_t|pd|_||_dS)NcLh|]!}tj|"SrY)rrr4rJs r" z(ReloaderLoop.__init__..s&%T%T%TQbgooa&8&8%T%T%Tr$rY)r0r3r'r|)selfr0r'r|s r"__init__zReloaderLoop.__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_steprs r" __enter__zReloaderLoop.__enter__s  r$cdS)z4Clean up any resources associated with the reloader.NrYrexc_typeexc_valexc_tbs r"__exit__zReloaderLoop.__exit__s r$c` |tj|j.)zfContinually run the watch step, sleeping for the configured interval after each step. )rtimesleepr|rs r"runzReloaderLoop.runs+ & MMOOO Jt} % % % &r$cdS)z}Run one step for watching the filesystem. Called once to set up initial state, then repeatedly to update it. NrYrs r"rzReloaderLoop.run_steps  r$intc tdd|jt}tj}d|d<t j||d}|dkr|Si) z|Spawn a new Python interpreter with the same arguments as the current one, but running the reloader thread. Tinfoz * Restarting with trueWERKZEUG_RUN_MAINF)env close_fdsra)rr rxrenvironcopy subprocesscall)rrv new_environ exit_codes r"restart_with_reloaderz"ReloaderLoop.restart_with_reloader ss ! :ty:: ; ; ;*,,D*//++K/5K+ ,"+OOOIA~~   !r$filenamerrcX||tjddS)Nra) log_reloadrexitrrs r"trigger_reloadzReloaderLoop.trigger_reloads% !!!  r$ str | bytescltj|}tdd|ddS)Nrz * Detected change in z , reloading)rrr4rrs r"rzReloaderLoop.log_reloads77??8,, VEhEEEFFFFFr$)NNr)r0r{r'r{r|r}rr(rrzrr()rr)rrrrr(rrrr() __name__ __module__ __qualname__r rrrrrrrrrYr$r"rzrzs D/337 ! !!!!!   &&&&    ! ! ! !GGGGGGr$rzc,eZdZdZdfd ZddZxZS) StatReloaderLoopstatrrzcRi|_tSr*)mtimessuperrr __class__s r"rzStatReloaderLoop.__enter__$s (* ww  """r$r(ct|j|jD]o} tj|j}n#t $rY)wxYw|j|}| ||j|<T||kr| |pdSr*) rCr0r'rrst_mtimeOSErrorrgetr)rr mtimeold_times r"rzStatReloaderLoop.run_step(s$T%5t7LMM * *D  .    {t,,H$) D!x##D))) * *s8 AArr)rrrr rr __classcell__rs@r"rr!sV D######********r$rcJeZdZdfd Zdd Zdfd Zd Zdd ZddZxZ S)WatchdogReloaderLooprvt.Anykwargsrr(c2 ddlm ddlm ddlm ddlm ddlm ddlm}ddlm}dd lm }tj |i||j G fd d |}|j }|d r |dd }d|d|_||_d|jD}|dddg|gdt&D|j|_t-j|_dS)Nr)EVENT_TYPE_CLOSED)EVENT_TYPE_CREATED)EVENT_TYPE_DELETED)EVENT_TYPE_MODIFIED)EVENT_TYPE_MOVED)FileModifiedEvent)PatternMatchingEventHandler)Observerc&eZdZdfd ZdS)3WatchdogReloaderLoop.__init__..EventHandlereventrrr(cH|jhvrdS|jdSr*) event_typesrc_path)rrrrrrrrs r" on_any_eventz@WatchdogReloaderLoop.__init__..EventHandler.on_any_eventHsF#%&&'$ ,Fu~.....r$N)rrrr()rrrr)rrrrrrsr" EventHandlerrGsL / / / / / / / / / / / / /r$robserveriz watchdog ()c3XK|]%}tj|!|V&dSr*)rrisdir)rKps r"rMz0WatchdogReloaderLoop.__init__..\s5NNRW]]1=M=MN!NNNNNNr$z*.pyz*.pycz*.zipcg|]}d|d S)z*/z/*rY)rKds r" z1WatchdogReloaderLoop.__init__..`s :::*q***:::r$)patternsignore_patterns)watchdog.eventsrrrrrrrwatchdog.observersrrrrrlowerr;r rr0r9r' event_handler threadingEvent should_reload)rrvrrrrr reloader_nameextra_patternsrrrrrrrs @@@@@@r"rzWatchdogReloaderLoop.__init__:s555555666666666666777777444444555555??????//////$)&))), / / / / / / / / / / / /6 / / /!)//11  ! !* - - /)#2#.M1111    NNT%5NNN)\gw@@::&9:::&   '_..r$rrcb|j||dSr*)rr3rrs r"rz#WatchdogReloaderLoop.trigger_reloadfs1     !!!!!r$rzci|_|jtSr*)watchesrstartrrrs r"rzWatchdogReloaderLoop.__enter__ms4)+  ww  """r$cj|j|jdSr*)rstopr<rs r"rzWatchdogReloaderLoop.__exit__rs0  r$c|j|js4||j|j4t jddS)N)timeoutra)rwaitr|rrrrs r"rzWatchdogReloaderLoop.runvs`$))$-)@@  MMOOO$))$-)@@   r$ct|j}t|j|jD]f}||jvrF |j|j|d|j|<n#t$r d|j|<YnwxYw| |g|D]9}|j |d}||j |:dS)NT) recursive) r3rrFr0r'rschedulerrdiscardrn unschedule)r to_deleterwatchs r"rzWatchdogReloaderLoop.run_step|s  %% ()94;PQQ $ $D4<''.)-)?)?*DD*@**DL&&...*.DL&&& .   d # # # # 0 0DL$$T400E  ((///  0 0s*A&&A=<A=)rvrrrrr(rrr) rrrrrrrrrrrs@r"rr9s*/*/*/*/*/*/X""""######  00000000r$r)rwatchdogzdict[str, type[ReloaderLoop]]reloader_loopszwatchdog.observersrautorcdtjtjsdS ddl}n#t$rYdSwxYw|tj}|d|jzs=|dxx|jzcc<|tj|j|dSdS)zuEnsure that echo mode is enabled. Some tools such as PDB disable it which causes usability issues after a reload.Nrra) rstdinisattytermios ImportError tcgetattrECHO tcsetattrTCSANOW)r attributess r"ensure_echo_onrs y 0 0 2 2 ""39--J a=7< 'B1 % #)W_jAAAAABBs3 AA main_funct.Callable[[], None]r{r|r} reloader_typerrcddl}||jdt||||} tjddkrkt tj|d}d |_ |5|j | ddddS#1swxYwYdStj |dS#t$rYdSwxYw) zz#run_with_reloader..s r$)r0r'r|rrrY)targetrvT)signalSIGTERMrrrrrrThreaddaemonrrrrrKeyboardInterrupt)rr0r'r|rr reloaderrps r"run_with_reloaderrs[MMM MM&.";";<<<m,2BXH :>>- . .& 8 8     ;;;AAH                       HX3355 6 6 6 6 6      s<AC0 $B;. C0;B??C0B?C0&C00 C>=C>)rr)r%r&r'r&rr()r0r&r'r&rr1)r%r1rr1)rr_r)NNrr) rrr0r{r'r{r|r}rrrrr()* __future__rr,rrrrrtypingrp itertoolsrpathlibr _internalrtuple base_prefixbase_exec_prefixrrU exec_prefixhasattrr5rr7r9r#r/rCrFrErxrzrrr__annotations__ __import__rrrrYr$r"rs"""""""   )=>?? 7> 73: 7s 7 73   JJsE&MM (@@@@ 0000f$$$$048888v:G:G:G:G:G:G:G:Gz*****|***0X0X0X0X0X0<X0X0X0x $11 8J#$$$,J7N6444+F3N64 BBBB*+//3        s! C88D  D