o
    h5X                     @  s  U d Z 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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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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dl!m"Z" eee#e$e$e#ee# f  Z%e&e'Z(ej)hZ*de+d< de+d< ej,d7ddZ-d8d!d"Z.d9d&d'Z/G d(d) d)Z0G d*d+ d+Z1d:d/d0Z2d;d5d6Z3dS )<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_optionspluginsoptionsreturnGenerator[None, None, None]c                 c  s$    | |a azd V  W b bd S b bw N)r   r   )r   r    r   D/var/www/html/ai/venv/lib/python3.10/site-packages/flake8/checker.py_mp_prefork5   s
   
r   argvSequence[str]Nonec                 C  sL   t  t jt j zttf W d S  ty%   t| \}}|j|aaY d S w r   )signalSIGINTSIG_IGNr   r   	NameErrorr   checkers)r   r   r   r   r   r   _mp_initB   s   r&   filenamestr#tuple[str, Results, dict[str, int]]c                 C  s   t | ttd S )Nr'   r   r   )FileCheckerr   r   
run_checksr'   r   r   r   _mp_runO   s
   r.   c                   @  st   e Zd ZdZd%d
dZd&ddZd'ddZd(ddZd)ddZd&ddZ	d&ddZ
d&ddZd&d d!Zd&d"d#Zd$S )*ManageraR  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.
    style_guider   r   r   r   r   r   r    c                 C  sV   || _ |j| _|| _|  | _ddddd| _g | jj| jjR | _|| _g | _	dS )z Initialize our Manager instance.r   )fileslogical linesphysical linestokensN)
r0   r   r   
_job_countjobs
statisticsexcludeextend_excluder   results)selfr0   r   r   r   r   r   __init__h   s   

zManager.__init__c                 C  sP   | j D ]\}}}tjD ]}| j|  || 7  < qq| jd  t| j7  < d S )Nr1   )r:   r	   STATISTIC_NAMESr7   len	filenames)r;   _r7   	statisticr   r   r   _process_statistics}   s
   
zManager._process_statisticsintc                 C  sP   t | jjrtd dS | jj}|jr%zt	 W S  t
y$   Y dS w |jS )Nz]The --jobs option is not compatible with supplying input using - . Ignoring --jobs arguments.r   )r   is_using_stdinr   r?   LOGwarningr6   is_automultiprocessing	cpu_countNotImplementedErrorn_jobs)r;   r6   r   r   r   r5      s   
zManager._job_countr'   r(   r:   Resultsc           
   
   C  s<   | j }d}|D ]\}}}}}	||j||||||	d7 }q|S )Nr   )coder'   line_numbercolumn_numbertextphysical_line)r0   handle_error)
r;   r'   r:   r0   reported_results_count
error_coderN   columnrP   rQ   r   r   r   _handle_results   s   
zManager._handle_resultstuple[int, int]c              	   C  s   d }}| j jtdd | j D ]3\}}}|jtddd | j| || ||7 }W d   n1 s9w   Y  |t|7 }q||fS )a  Report 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
itemgetterr0   processing_filerV   r>   )r;   results_reportedresults_foundr'   r:   r@   r   r   r   report   s   	zManager.reportc                 C  s   t | j| j t| j| j}W d   n1 sw   Y  |du r(|   dS d}z#t|t	| j
| _|  |  d}W |sL|  |  dS dS |sY|  |  w w )zRun the checkers in parallel.NFT)r   r   r   _try_initialize_processpoolr6   r   
run_seriallistimap_unorderedr.   r?   r:   closejoin	terminate)r;   poolpool_closedr   r   r   run_parallel   s&   
zManager.run_parallelc                   s    fdd j D  _dS )zRun the checkers in serial.c                   s"   g | ]}t | j jd  qS )r*   )r+   r   r   r,   ).0r'   r;   r   r   
<listcomp>   s    z&Manager.run_serial.<locals>.<listcomp>N)r?   r:   rm   r   rm   r   rc      s   
zManager.run_serialc                 C  sX   z| j dkrt| jdkr|   W dS |   W dS  ty+   td t	dw )a#  Run 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.
        rY   z"Flake8 was interrupted by the userzEarly quit while running checksN)
r6   r>   r?   rk   rc   KeyboardInterruptrE   rF   r
   	EarlyQuitrm   r   r   r   run   s   	

zManager.runc                 C  s2   t d tt| jj| jj| jj| jd| _dS )zStart 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_patternsr8   N)	rE   infotupler   r   r?   rs   r'   r8   rm   r   r   r   start   s   

zManager.startc                 C  s   |    dS )zStop checking files.N)rB   rm   r   r   r   stop     zManager.stopN)r0   r   r   r   r   r   r   r    r   r    )r   rC   )r'   r(   r:   rL   r   rC   )r   rW   )__name__
__module____qualname____doc__r<   rB   r5   rV   ra   rk   rc   rq   rw   rx   r   r   r   r   r/   U   s    








r/   c                   @  s   e Zd ZdZd9d
dZd:ddZd;ddZd<ddZd=ddZe	d>d"d#Z
d?d$d%Zd?d&d'Zd@d)d*Zd?d+d,ZdAd.d/ZdBd1d2ZdCd6d7Zd8S )Dr+   z;Manage running checks for a file and aggregate the results.r'   r(   r   r   r   r   r   r    c                C  sx   || _ || _|| _g | _dddd| _|  | _|| _d| _| jdur:| jj| _| j	  | _t
| jj| jd< dS dS )zInitialize our file checker.r   )r4   r2   r3   FNr3   )r   r'   r   r:   r7   _make_processorr   display_nameshould_processshould_ignore_filer>   lines)r;   r'   r   r   r   r   r   r<     s    


zFileChecker.__init__c                 C  s   d| j  S )z)Provide helpful debugging representation.zFileChecker for r-   rm   r   r   r   __repr__$  ry   zFileChecker.__repr__processor.FileProcessor | Nonec                 C  sZ   z	t | j| jW S  ty, } z| dddt|j d|  W Y d }~d S d }~ww )NE902r   : )r   FileProcessorr'   r   OSErrorra   typer{   )r;   er   r   r   r   (  s    zFileChecker._make_processorrT   
str | NonerN   rC   rU   rP   c                 C  sX   |du r| dd\}}t| dr| jdur| j|}nd}| j|||||f |S )z2Report an error by storing it in the results list.N rY   r   )splithasattrr   noqa_line_forr:   append)r;   rT   rN   rU   rP   liner   r   r   ra   5  s   zFileChecker.reportpluginr   	argumentsr   c              
   K  s   | j dus
J | jz
| j |j|}W n ty( } ztj|j|dd}~ww z|jdi ||W S  t	yS } zt
jd|jdd tj| j|j|dd}~ww )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	ExceptionrE   criticalPluginExecutionFailed)r;   r   r   paramsaeall_excr   r   r   	run_checkJ  s4   zFileChecker.run_checkr   r   rW   c           
      C  s  t | jdkr#| jd r#t | jd dkr#| jd }|dd \}}n&t| tjrCt | jdkrCt | jd dkrCd}| jd \}}nd}d\}}|dkr|rt| trt |dkrd}d}|d }|d ur|dd}t |d }|d }t |}	||	kr|	}||8 }||8 }||fS )	NrY   rZ      r   )rY   r   r      
)r>   args
isinstancetokenize
TokenErrorSyntaxErrorrstripr   )
r   tokenrowrU   column_offset
row_offsetrQ   r   logical_linelogical_line_lengthr   r   r   _extract_syntax_informationc  sB   

	z'FileChecker._extract_syntax_informationc           	   	   C  s   | j dus
J | j| j  }| jjD ]-}| j||d}z| }W n ty-   |}Y nw |D ]\}}}}| jd|||d q0qdS )z1Run all checks expecting an abstract syntax tree.N)treerT   rN   rU   rP   )	r   r'   	build_astr   r   r   rq   r   ra   )	r;   astr   checkerrunnerrN   offsetrP   r@   r   r   r   run_ast_checks  s$   
zFileChecker.run_ast_checksc           
      C  s   | j dusJ | j  \}}}|sdS | j | td|  | jjD ]:}| j | | j	||dp5d}|D ]&\}}t
||\}}	||	  krMdkrUn ntd| | jd||	|d q8q%| j   dS )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_staterE   debugr   r   r   update_checker_state_forr   find_offsetrF   ra   next_logical_line)
r;   commentsr   mappingr   r:   r   rP   rN   r   r   r   r   run_logical_checks  s*   zFileChecker.run_logical_checksrQ   c              
   C  s   | j dusJ | jjD ]C}| j | | j||d}|durNd}z|d }W n ttfy1   Y nw t|tr:|f}|D ]}|\}}| j	d| j j
||d q<qdS )zoRun all checks for a given physical line.

        A single physical check may return multiple errors.
        N)rQ   r   r   )r   r   rQ   r   r   
IndexError	TypeErrorr   rC   ra   rN   )r;   rQ   r   resultr   result_singlerP   r   r   r   run_physical_checks  s.   
zFileChecker.run_physical_checksc                 C  s   | j dusJ d}| j}| j }d}| D ]6}|d  d7  < | || |dd \}}|tjkr9t ||}n|dkrGt |rG| | |d }q|j	r]| 
|jd  |   dS dS )	zProcess tokens and trigger checks.

        Instead of using this directly, you should use
        :meth:`flake8.checker.FileChecker.run_checks`.
        Nr    r4   rY   rZ   r   )r   r7   generate_tokenscheck_physical_eolr   OPcount_parenthesestoken_is_newlinehandle_newliner4   r   r   r   )r;   parensr7   file_processorprev_physicalr   
token_typerP   r   r   r   process_tokens  s&   



zFileChecker.process_tokensr)   c                 C  s   | j du s| js| j| j| jfS z
|   |   W nA ttj	fy[ } z2t
|tj	r-dnd}| |\}}| |||t|j d|jd   | j| j| jfW  Y d}~S d}~ww | j jd }|| jd< | j| j| jfS )zRun checks against the file.Nr   E999r   r   r2   )r   r   r   r:   r7   r   r   r   r   r   r   r   ra   r   r{   r   )r;   r   rM   r   rU   logical_linesr   r   r   r,     s   &
zFileChecker.run_checksr   c                 C  sb   | j dusJ |tjkr|   | j   dS t| j jdkr+| j   | j   dS |   dS )z3Handle the logic when encountering a newline token.NrY   )	r   r   NEWLINEr   reset_blank_beforer>   r4   visited_new_blank_linedelete_first_token)r;   r   r   r   r   r     s   

zFileChecker.handle_newliner   tokenize.TokenInfor   c                 C  s   | j dusJ |jtkr| j |jd  dS t |r0|jdkr(| | dS | |j dS t |rC| j 	|D ]	}| | q;dS dS )z@Run physical checks if and only if it is at the end of the line.Nr   r   )
r   r   r   fstring_startrw   is_eol_tokenr   r   is_multiline_stringmultiline_string)r;   r   r   r   r   r   r   r   &  s   



zFileChecker.check_physical_eolN)r'   r(   r   r   r   r   r   r    )r   r(   )r   r   )
rT   r   rN   rC   rU   rC   rP   r(   r   r(   )r   r   r   r   r   r   )r   r   r   rW   rz   )rQ   r(   r   r    )r   r)   )r   rC   r   r    )r   r   r   r(   r   r    )r{   r|   r}   r~   r<   r   r   ra   r   staticmethodr   r   r   r   r   r,   r   r   r   r   r   r   r+     s     





:




r+   	job_countrC    multiprocessing.pool.Pool | Nonec              
   C  sZ   z
t j| t|fdW S  ty# } z|jtvr W Y d}~dS d}~w ty,   Y dS w )z@Return a new process pool instance if we are able to create one.)initargsN)rH   Poolr&   r   errnoSERIAL_RETRY_ERRNOSImportError)r   r   errr   r   r   rb   F  s   

rb   r   r   processor._LogicalMappingrW   c                 C  sX   t | tr| S |D ]}|d }| |kr|d } nq	d}d } }|d |d |  | fS )z*Find the offset tuple for a single offset.r   rY   )r   r   )r   rv   )r   r   r   token_offsetpositionr   r   r   r   V  s   
r   )r   r   r   r   r   r   )r   r   r   r    )r'   r(   r   r)   )r   rC   r   r   r   r   )r   rC   r   r   r   rW   )4r~   
__future__r   argparse
contextlibr   loggingmultiprocessing.poolrH   r\   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(   rC   rL   	getLoggerr{   rE   ENOSPCr   __annotations__contextmanagerr   r&   r.   r/   r+   rb   r   r   r   r   r   <module>   sV    



 4  
@