
    \OgJX                    $   % S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ r   SSK!J"r"  \\\#\$\$\#\\#   4      r%\RL                  " \'5      r(\RR                  1r*S\+S'   S\+S'   \RX                        S!S j5       r-S"S jr.S#S jr/ " S S5      r0 " S S5      r1      S$S jr2      S%S  jr3g)&z$Checker Manager and Checker classes.    )annotationsN)Any)	Generator)List)Optional)Sequence)Tuple)defaults)
exceptions)	processor)utils)FSTRING_START)expand_paths)
parse_args)Checkers)LoadedPlugin)StyleGuideManagerr   _mp_pluginsargparse.Namespace_mp_optionsc              #  0   #    Xsq q S v   B Bg ! B Bf = f7fN)r   r   )pluginsoptionss     S/Users/admin/workspace/ai/Jarvis/env/lib/python3.13/site-packages/flake8/checker.py_mp_preforkr   5   s#       'K%Ks    c                    [         R                   " [         R                  [         R                  5         [        [        4  g ! [
         a    [        U 5      u  pUR                  Usqq g f = fr   )signalSIGINTSIG_IGNr   r   	NameErrorr   checkers)argvr   r   s      r   _mp_initr$   B   sU     MM&--0=[  =%d+#*#3#3W [=s   A &A+*A+c                D    [        U [        [        S9R                  5       $ )Nfilenamer   r   )FileCheckerr   r   
run_checksr'   s    r   _mp_runr+   P   s    ;jl    c                      \ rS rSrSr        SS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSS jrSrg)ManagerV   a*  Manage the parallelism and checker instances for each plugin and file.

This class will be responsible for the following:

- Determining the parallelism of Flake8, e.g.:

  * Do we use :mod:`multiprocessing` or is it unavailable?

  * Do we automatically decide on the number of jobs to use or did the
    user provide that?

- Falling back to a serial way of processing files if we run into an
  OSError related to :mod:`multiprocessing`

- Organizing the results of each checker so we can group the output
  together and make our output deterministic.
c                   Xl         UR                  U l        X l        U R                  5       U l        SSSSS.U l        / U R                  R                  QU R                  R                  Q7U l        X0l        / U l	        g)z Initialize our Manager instance.r   )fileslogical linesphysical linestokensN)
style_guider   r   
_job_countjobs
statisticsexcludeextend_excluder#   results)selfr5   r   r#   s       r   __init__Manager.__init__i   ss     '"**OO%		
 M--L0K0KL	BDr,   c                    U R                    H6  u    p[        R                   H  nU R                  U==   X#   -  ss'   M     M8     U R                  S==   [	        U R
                  5      -  ss'   g )Nr1   )r;   r
   STATISTIC_NAMESr8   len	filenames)r<   _r8   	statistics       r   _process_statisticsManager._process_statistics~   s[     $Aq%55		*j.CC* 6 !- 	 C$77 r,   c                >   [         R                  " U R                  R                  5      (       a  [        R                  S5        gU R                  R                  nUR                  (       a   [        R                  " 5       $ UR                  $ ! [         a     gf = f)Nz]The --jobs option is not compatible with supplying input using - . Ignoring --jobs arguments.r   )r   is_using_stdinr   rB   LOGwarningr7   is_automultiprocessing	cpu_countNotImplementedErrorn_jobs)r<   r7   s     r   r6   Manager._job_count   s      6 677KK= ||   <<&0022 {{ ' s   .B 
BBc                h    U R                   nSnU H  u  pVpxn	XCR                  UUUUUU	S9-  nM     U$ )Nr   )coder'   line_numbercolumn_numbertextphysical_line)r5   handle_error)
r<   r'   r;   r5   reported_results_count
error_coderS   columnrU   rV   s
             r   _handle_resultsManager._handle_results   s[    &&!"DK@JV="&>&>!'$+ '? ' " EL &%r,   c                   S=pU R                   R                  [        R                  " S5      S9  U R                    Ho  u  p4nUR                  [        R                  " SS5      S9  U R                  R                  U5         XR                  X45      -  nSSS5        U[        U5      -  nMq     X!4$ ! , (       d  f       N#= f)zReport all of the errors found in the managed file checkers.

This iterates over each of the checkers and reports the errors sorted
by line number.

:returns:
    A tuple of the total results found and the results reported.
r   )key      N)r;   sortoperator
itemgetterr5   processing_filer[   rA   )r<   results_reportedresults_foundr'   r;   rC   s         r   reportManager.report   s     ,-,h11!45$(LL HqLLX00A6L7!!11(; $8$8$KK  <S\)M	 %1
 00 <;s   B33
C	c                0   [        U R                  U R                  5         [        U R                  U R
                  5      nSSS5        Wc  U R                  5         gSn [        UR                  [        U R                  5      5      U l        UR                  5         UR                  5         SnU(       d!  UR                  5         UR                  5         gg! , (       d  f       N= f! U(       d!  UR                  5         UR                  5         f f = f)zRun the checkers in parallel.NFT)r   r   r   _try_initialize_processpoolr7   r#   
run_seriallistimap_unorderedr+   rB   r;   closejoin	terminate)r<   poolpool_closeds      r   run_parallelManager.run_parallel   s    t||4.tyy$))DD 5 <OO	 3 3GT^^ LMDLJJLIIKK 		  54  		 s   !C!AC+ 
C(+*Dc           	         U R                    Vs/ s H0  n[        UU R                  U R                  S9R	                  5       PM2     snU l        gs  snf )zRun the checkers in serial.r&   N)rB   r(   r   r   r)   r;   )r<   r'   s     r   rk   Manager.run_serial   sT     !NN
 + ! jl	
 +
 
s   7Ac                    U R                   S:  a*  [        U R                  5      S:  a  U R                  5         gU R	                  5         g! [
         a,    [        R                  S5        [        R                  " S5      ef = f)zRun all the checkers.

This will intelligently decide whether to run the checks in parallel
or whether to run them in serial.

If running the checks in parallel causes a problem (e.g.,
:issue:`117`) this also implements fallback to serial processing.
r_   z"Flake8 was interrupted by the userzEarly quit while running checksN)
r7   rA   rB   rs   rk   KeyboardInterruptrI   rJ   r   	EarlyQuitr<   s    r   runManager.run   si    	Jyy1}T^^!4q!8!!#!  	JKK<=&&'HII	Js   9A A 6Bc           	         [         R                  S5        [        [        U R                  R
                  U R                  R                  U R                  R                  U R                  S95      U l        g)z}Start checking files.

:param paths:
    Path names to check. This is passed directly to
    :meth:`~Manager.make_checkers`.
zMaking checkers)pathsstdin_display_namefilename_patternsr9   N)	rI   infotupler   r   rB   r   r'   r9   rz   s    r   startManager.start   sS     	"#ll,,#'<<#B#B"&,,"7"7	
r,   c                $    U R                  5         g)zStop checking files.N)rE   rz   s    r   stopManager.stop  s      "r,   )	r#   r9   rB   r7   r   r   r;   r8   r5   N)r5   r   r   r   r#   Sequence[str]returnNoner   r   )r   int)r'   strr;   Resultsr   r   )r   tuple[int, int])__name__
__module____qualname____firstlineno____doc__r=   rE   r6   r[   rg   rs   rk   r{   r   r   __static_attributes__ r,   r   r.   r.   V   se    $E&E E 	E
 
E*8<&1$(	
J$
"#r,   r.   c                      \ rS rSrSr        SS jrSS jrSS jr          SS jrSS jr	\
SS j5       rSS	 jrSS
 jrSS jrSS jrSS jrSS jr      SS jrSrg)r(   i	  z;Manage running checks for a file and aggregate the results.c                  X0l         Xl        X l        / U l        SSSS.U l        U R                  5       U l        Xl        SU l        U R                  bl  U R                  R                  U l        U R                  R                  5       (       + U l        [        U R                  R                  5      U R                  S'   gg)zInitialize our file checker.r   )r4   r2   r3   FNr3   )r   r'   r   r;   r8   _make_processorr   display_nameshould_processshould_ignore_filerA   lines)r<   r'   r   r   s       r   r=   FileChecker.__init__  s       "

 --/$#>>% $ 7 7D&*nn&G&G&I"ID03DNN4H4H0IDOO,- &r,   c                     SU R                    3$ )z)Provide helpful debugging representation.zFileChecker for r*   rz   s    r   __repr__FileChecker.__repr__%  s    !$--11r,   c           	          [         R                  " U R                  U R                  5      $ ! [         a6  nU R                  SSS[        U5      R                   SU 35         S nAg S nAff = f)NE902r   : )r   FileProcessorr'   r   OSErrorrg   typer   )r<   es     r   r   FileChecker._make_processor)  s_    
	**4==$,,GG 	 KK1a)9)9(:"QC&@A	s   *- 
A-,A((A-c                    Uc  UR                  SS5      u  p[        U S5      (       a)  U R                  b  U R                  R                  U5      nOSnU R                  R                  XX4U45        U$ )z2Report an error by storing it in the results list.N r_   r   )splithasattrr   noqa_line_forr;   append)r<   rY   rS   rZ   rU   lines         r   rg   FileChecker.report6  sm     #zz#q1J 4%%$..*D>>//<DDZfDIJr,   c                   U R                   c   U R                  5       e U R                   R                  UR                  U5      n UR                  " S0 UDUD6$ ! [         a$  n[
        R                  " UR                  US9eSnAff = f! [         aN  n[        R                  SUR                  SS9  [
        R                  " U R                  UR                  US9eSnAff = f)z!Run the check in a single plugin.N)plugin_name	exceptionz(Plugin %s raised an unexpected exceptionT)exc_info)r'   r   r   r   )r   r'   keyword_arguments_for
parametersAttributeErrorr    PluginRequestedUnknownParametersr   obj	ExceptionrI   criticalPluginExecutionFailed)r<   plugin	argumentsparamsaeall_excs         r   	run_checkFileChecker.run_checkK  s    ~~)84==8)	^^99!!9F	::4	4V44  	=="//2 	  
	LL:##  
 22"//! 
	s0   &A B 
B	%BB	
C$A	CC$c                   [        U R                  5      S:  aG  U R                  S   (       a3  [        U R                  S   5      S:  a  U R                  S   nUSS u  p#On[        U [        R                  5      (       aI  [        U R                  5      S:X  a0  [        U R                  S   5      S:X  a  SnU R                  S   u  p#OSnSu  p#US:  a  U(       a}  [        U [
        5      (       ah  [        U5      S:X  aY  SnSnUS   nUbE  UR                  S5      R                  S5      n[        U5      S-
  nUS   n[        U5      n	X9:  a  U	nX%-  nX4-  nX#4$ )	Nr_   r`      r   )r_   r   r      
)rA   args
isinstancetokenize
TokenErrorSyntaxErrorrstripr   )
r   tokenrowrZ   column_offset
row_offsetrV   r   logical_linelogical_line_lengths
             r   _extract_syntax_information'FileChecker._extract_syntax_informationd  sU    	!#q!INN1%&*NN1%E!*KCy("5"566INN#q(INN1%&!+E#..+KCE KC QJ9k22E
a
 MJ "!HM
 (
 &,,T288> Z!^
$Qx&),&7#/0FC#F{r,   c           	     N   U R                   c   U R                  5       eU R                   R                  5       nU R                  R                   HA  nU R                  X!S9n UR                  5       nU H  u  pVpxU R                  SUUUS9  M     MC     g! [         a    Un N1f = f)z1Run all checks expecting an abstract syntax tree.N)treerY   rS   rZ   rU   )	r   r'   	build_astr   r   r   r{   r   rg   )	r<   astr   checkerrunnerrS   offsetrU   rC   s	            r   run_ast_checksFileChecker.run_ast_checks  s    ~~)84==8)nn&&(ll''FnnVn6G!  17,T# +!	   17 ( " ! !s   "BB$#B$c           	     \   U R                   c   eU R                   R                  5       u  pnU(       d  gU R                   R                  U5        [        R	                  SUR                  5       5        U R                  R                   H  nU R                   R                  U5        U R                  XBS9=(       d    SnU HI  u  pg[        Xc5      u  pXs=:X  a  S:X  a  O  O[        R                  SU5        U R                  SUU	US9  MK     M     U R                   R                  5         g)z(Run all checks expecting a logical line.NzLogical line: "%s")r   r   r   z#position of error out of bounds: %sr   )r   build_logical_lineupdate_staterI   debugr   r   r   update_checker_state_forr   find_offsetrJ   rg   next_logical_line)
r<   commentsr   mappingr   r;   r   rU   rS   r   s
             r   run_logical_checksFileChecker.run_logical_checks  s    ~~)))*...*K*K*M'##G,		&(;(;(=>ll//FNN33F;nnVnGM2G '-8-I*414KK EvN# +(	  	 !( 0 	((*r,   c           	        U R                   c   eU R                  R                   H  nU R                   R                  U5        U R	                  X!S9nUc  M2  Sn US   n[        U[        5      (       a  U4nU H-  nUu  pFU R                  SU R                   R                  UUS9  M/     M     g! [
        [        4 a     Nbf = f)z_Run all checks for a given physical line.

A single physical check may return multiple errors.
N)rV   r   r   )r   r   rV   r   r   
IndexError	TypeErrorr   r   rg   rS   )r<   rV   r   resultr   result_singlerU   s          r   run_physical_checksFileChecker.run_physical_checks  s    
 ~~)))ll00FNN33F;^^F^HF! $$*1IM mS11$YF%+M*7'MKK#'$(NN$>$>,!	    &,! 1 #I. s   B00CCc                   U R                   c   eSnU R                  nU R                   nSnUR                  5        H  nUS==   S-  ss'   U R                  XT5        USS u  pgU[        R
                  :X  a  [         R                  " X5      nO2US:X  a,  [         R                  " U5      (       a  U R                  U5        US   nM     UR                  (       a/  U R                  UR                  S   5        U R                  5         gg)	zProcess tokens and trigger checks.

Instead of using this directly, you should use
:meth:`flake8.checker.FileChecker.run_checks`.
Nr    r4   r_   r`   r   )r   r8   generate_tokenscheck_physical_eolr   OPcount_parenthesestoken_is_newlinehandle_newliner4   r   r   r   )r<   parensr8   file_processorprev_physicalr   
token_typerU   s           r   process_tokensFileChecker.process_tokens  s     ~~)))__
#335Ex A% ##E9$QqzJX[[("44VB1--e44''
3!!HM 6   $$^%9%9"%=>##% !r,   c           
        U R                   b  U R                  (       d#  U R                  U R                  U R                  4$  U R                  5         U R                  5         U R                   R                  S   nXPR                  S'   U R                  U R                  U R                  4$ ! [        [        R                  4 a  n[        U[        R                  5      (       a  SOSnU R                  U5      u  p4U R                  X#U[        U5      R                   SUR                  S    35        U R                  U R                  U R                  4s SnA$ SnAff = f)zRun checks against the file.Nr   E999r   r   r2   )r   r   r   r;   r8   r   r   r   r   r   r   r   rg   r   r   r   )r<   r   rR   r   rZ   logical_liness         r   r)   FileChecker.run_checks  s   >>!)<)<$$dllDOOCC	D!! 11/B+8(  $,,?? X001 	D'8+>+>??6VD::1=KCKK6d1g.>.>-?r!&&)+MN$$dllDOOCC		Ds    B- -E"BEE"E"c                p   U R                   c   eU[        R                  :X  a+  U R                  5         U R                   R	                  5         g[        U R                   R                  5      S:X  a5  U R                   R                  5         U R                   R                  5         gU R                  5         g)z3Handle the logic when encountering a newline token.Nr_   )	r   r   NEWLINEr   reset_blank_beforerA   r4   visited_new_blank_linedelete_first_token)r<   r   s     r   r   FileChecker.handle_newline  s    ~~))))))##%NN--/&&'1,NN113NN--/##%r,   c                   U R                   c   eUR                  [        :X  a)  U R                   R                  UR                  S   5        g[         R
                  " U5      (       a>  UR                  S:X  a  U R                  U5        gU R                  UR                  5        g[         R                  " U5      (       a4  U R                   R                  U5       H  nU R                  U5        M     gg)z@Run physical checks if and only if it is at the end of the line.Nr   r   )
r   r   r   fstring_startr   is_eol_tokenr   r   is_multiline_stringmultiline_string)r<   r   r   r   s       r   r   FileChecker.check_physical_eol'  s     ~~)))::&NN((Q8##E** zzR((7((4**511 77>((. ? 2r,   )r   r'   r   r   r   r;   r   r8   N)r'   r   r   r   r   r   r   r   )r   r   )r   zprocessor.FileProcessor | None)
rY   z
str | NonerS   r   rZ   r   rU   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   )rV   r   r   r   )r   #tuple[str, Results, dict[str, int]])r   r   r   r   )r   ztokenize.TokenInfor   r   r   r   )r   r   r   r   r   r=   r   r   rg   r   staticmethodr   r   r   r   r   r)   r   r   r   r   r,   r   r(   r(   	  s    EJ J 	J
 $J 
J22  	
  
*2 8 8t*+4>&6@$&/'/8;/	/r,   r(   c                     [         R                  " U [        U4S9$ ! [         a  nUR                  [
        ;  a  e  SnAgSnAf[         a     gf = f)z@Return a new process pool instance if we are able to create one.)initargsN)rL   Poolr$   r   errnoSERIAL_RETRY_ERRNOSImportError)	job_countr#   errs      r   rj   rj   G  sX    
##Ix4'JJ 99// 0
   s    
AAAAc                    [        U [        5      (       a  U $ U H  nUS   nX::  d  M  US   n  O   SnS=pUS   US   U -   U-
  4$ )z*Find the offset tuple for a single offset.r   r_   )r   r   )r   r   )r   r   r   token_offsetpositions        r   r   r   W  sg     &%  Qx!QxH	   !!QK!v-<==r,   )r   r   r   r   r   zGenerator[None, None, None])r#   r   r   r   )r'   r   r   r  )r  r   r#   r   r   z multiprocessing.pool.Pool | None)r   r   r   zprocessor._LogicalMappingr   r   )4r   
__future__r   argparse
contextlibr  loggingmultiprocessing.poolrL   rb   r   r   typingr   r   r   r   r   r	   flake8r
   r   r   r   flake8._compatr   flake8.discover_filesr   flake8.options.parse_argsr   flake8.plugins.finderr   r   flake8.style_guider   r   r   r   	getLoggerr   rI   ENOSPCr  __annotations__contextmanagerr   r$   r+   r.   r(   rj   r   r   r,   r   <module>r/     s2   * "                   ( . 0 * . 0
uS#sC#67
8! 
LL     	%	% 2	% 	% 	%=p# p#f{/ {/|	
 & >>3>>r,   