o
    tBh[                  	   @   s4  d dl Z d dlmZm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	m
Z
 d dl	mZ d dl	mZ d dlmZmZ d dlmZ d	Zd
dhZh dZh dZdddddddddZdd Zdd Zd2ddZdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Z G d,d- d-Z!G d.d/ d/e j"Z#d0d1 Z$dS )3    N)fnmatchfnmatchcasePath)lines)noqa)utils)
InputErrormake_config)ExitCode<   objectself>   setup_modulesetup_functionteardown_moduleteardown_function>   setup_classsetup_methodteardown_classteardown_methodV101V102V103V104V105V106V107V201)	attributeclassfunctionimportmethodpropertyvariableunreachable_codec                    s*    fddt | D }|jdd d |S )Nc                    s   g | ]	}|j  vr|qS  name.0item
used_namesr'   c/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/vulture/core.py
<listcomp>-       z%_get_unused_items.<locals>.<listcomp>c                 S   s
   | j  S N)r)   lowerr,   r'   r'   r/   <lambda>0   s   
 z#_get_unused_items.<locals>.<lambda>key)setsort)defined_itemsr.   unused_itemsr'   r-   r/   _get_unused_items,   s
   
r<   c                 C   s   |  do	| dS )N__)
startswithendswithr(   r'   r'   r/   _is_special_name4      r@   Tc                    s$   |rt nt t fdd|D S )Nc                 3   s    | ]} |V  qd S r2   r'   r+   patternfuncr)   r'   r/   	<genexpr>:   s    z_match.<locals>.<genexpr>)r   r   any)r)   patternscaser'   rD   r/   _match8   s   rJ   c                 C   s   t |  g dddS )N)z*/test/*z	*/tests/*z
*/test*.pyz*[-_]test.pyFrI   )rJ   resolvefilenamer'   r'   r/   _is_test_file=   s
   rO   c                 C   s8   t | tjsJ t | jtjtjfotdd | jD S )Nc                 s   s&    | ]}t |tjr|jd kV  qdS )__all__N)
isinstanceastNameid)r+   targetr'   r'   r/   rF   G   s    

z3_assigns_special_variable__all__.<locals>.<genexpr>)rQ   rR   AssignvalueListTuplerG   targetsnoder'   r'   r/    _assigns_special_variable__all__E   s   r]   c                 C   s   t | od|v S )NTest)rO   )rN   
class_namer'   r'   r/   _ignore_classN      r`   c                 C   s   | j dkp|dkS )z
    Ignore star-imported names since we can't detect whether they are used.
    Ignore imports from __init__.py files since they're commonly used to
    collect objects from a package.
    z__init__.py*r(   )rN   import_namer'   r'   r/   _ignore_importR   s   rd   c                 C   s   |t v p|dot| S Ntest_)PYTEST_FUNCTION_NAMESr>   rO   )rN   function_namer'   r'   r/   _ignore_function[   s
   ri   c                 C   s"   t |p|tv s|dot| S re   )r@   PYTEST_METHOD_NAMESr>   rO   )rN   method_namer'   r'   r/   _ignore_methodb   s   rl   c                 C   s&   |t v p|do|d pt|S )zr
    Ignore _ (Python idiom), _x (pylint convention) and
    __x__ (special variable or method), but not __x.
    _r=   )IGNORED_VARIABLE_NAMESr>   r@   )rN   varnamer'   r'   r/   _ignore_variablei   s
   rp   c                   @   s`   e Zd ZdZdZdefddZedd Zdd	d
Z	dd Z
dd Zdd Zdd Zdd ZdS )Itemz;
    Hold the name, type and location of defined code.
    r)   typrN   first_linenolast_linenomessage
confidence c                 C   s@   || _ || _|| _|| _|| _|pd| d| d| _|| _d S )Nzunused z ''rr   )r   r)   rs   rN   rt   ru   rv   rw   r'   r'   r/   __init__   s   

zItem.__init__c                 C   s    | j | jksJ | j | j d S )N   )ru   rt   r   r'   r'   r/   size   s   z	Item.sizeFc                 C   sP   |r| j dkr	dnd}d| j dd| }nd}dt| j| j| j| j|S )	Nr{   liner   z, d rx   z{}:{:d}: {} ({}% confidence{}))r}   formatr   format_pathrN   rt   rv   rw   )r   add_sizeline_formatsize_reportr'   r'   r/   
get_report   s   
zItem.get_reportc                 C   s\   t | j}| jdkrd| j d| d| j dS d}| jdv r"d}d	|| j| j|| jS )
Nr&   z# z (:)rx   )r   r#   r$   z_.z{}{}  # unused {} ({}:{:d}))r   r   rN   rs   rv   rt   r   r)   )r   rN   prefixr'   r'   r/   get_whitelist_string   s   

zItem.get_whitelist_stringc                 C   s   | j | j| jfS r2   )rN   rt   r)   r|   r'   r'   r/   _tuple   ra   zItem._tuplec                 C   s
   t | jS r2   )reprr)   r|   r'   r'   r/   __repr__      
zItem.__repr__c                 C   s   |   |  kS r2   )r   )r   otherr'   r'   r/   __eq__   ra   zItem.__eq__c                 C   s   t |  S r2   )hashr   r|   r'   r'   r/   __hash__   s   zItem.__hash__N)F)__name__
__module____qualname____doc__	__slots__DEFAULT_CONFIDENCErz   r$   r}   r   r   r   r   r   r   r'   r'   r'   r/   rq   u   s    


rq   c                   @   s|  e Zd ZdZ	dQddZdRddZdSd	d
ZdTddZ	dUddZe	dd Z
e	dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd Zddddd Zd!d" Zd#d$ Zddedfd%d&Zefd'd(Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zed5d6 Zd7d8 Zd9d: Z d;d< Z!d=d> Z"d?d@ Z#dAdB Z$dCdD Z%dEdF Z&dGdH Z'dIdJ Z(dKdL Z)dMdN Z*dOdP Z+dS )VVulturezFind dead code.FNc                    s   | _  fdd}|d _|d _|d _|d _|d _|d _|d	 _|d
 _t	
d j  _|p<g  _|pAg  _t  _g  _tj _d S )Nc                    s   t |  jS r2   )r   LoggingListverbose)rs   r|   r'   r/   get_list      z"Vulture.__init__.<locals>.get_listr   r    r!   r"   r#   r$   r%   r&   r)   )r   defined_attrsdefined_classesdefined_funcsdefined_importsdefined_methodsdefined_propsdefined_varsr&   r   
LoggingSetr.   ignore_namesignore_decoratorsr   rN   coder   
NoDeadCode	exit_code)r   r   r   r   r   r'   r|   r/   rz      s    









zVulture.__init__rx   c              
      s  t   | _tj_ _ fdd}ztj|t	jdd}W n? t
y> } z|| W Y d }~d S d }~w tyf } zjt  d| dtjdd tj_W Y d }~d S d }~ww z| W d S  t
y } z|| W Y d }~d S d }~ww )Nc                    sX   | j rd| j   dnd}jt  d| j d| j | tjdd t	j
_d S )Nz at ""rx   r   z: Tfileforce)textstrip_logr   r   linenomsgsysstderrr   InvalidInputr   )er   rN   r   r'   r/   handle_syntax_error   s    z)Vulture.scan.<locals>.handle_syntax_errorT)rN   type_commentsz: invalid source code "r   r   )r   
splitlinesr   r   
parse_noqa
noqa_linesrN   rR   parsestrSyntaxError
ValueErrorr   r   r   r   r   r   r   r   visit)r   r   rN   r   r\   errr'   r   r/   scan   s6   
	

zVulture.scanc                    sf  dd fdd pg D   fdd}dd |D }t |D ]I}||r.| d| q!| d	| zt |}W n' t jyb } z| jd
| d| dtjdd tj| _	W Y d }~q!d }~ww | j
||d q!dd | jD }|D ];}td|d  }	||	r| d|	 quztdt|	}
| d|	 W n	 ty   Y quw |
d}| j
||	d qud S )Nc                    s&   t  fdddD sd  d  S )Nc                 3   s    | ]}| v V  qd S r2   r'   )r+   charrC   r'   r/   rF     s    z<Vulture.scavenge.<locals>.prepare_pattern.<locals>.<genexpr>z*?[rb   )rG   r   r'   r   r/   prepare_pattern  s   z)Vulture.scavenge.<locals>.prepare_patternc                    s   g | ]} |qS r'   r'   rB   )r   r'   r/   r0   	      z$Vulture.scavenge.<locals>.<listcomp>c                    s   t |  ddS )NFrK   )rJ   )pathexcluder'   r/   exclude_path  r   z&Vulture.scavenge.<locals>.exclude_pathc                 S   s   g | ]}t |qS r'   r   )r+   r   r'   r'   r/   r0     r   z	Excluded:z	Scanning:zError: Could not read file z - z%
Try to change the encoding to UTF-8.Tr   rM   c                 S   s   h | ]}|j qS r'   r(   r*   r'   r'   r/   	<setcomp>#  s    z#Vulture.scavenge.<locals>.<setcomp>
whitelistsz_whitelist.pyzExcluded whitelist:vulturezIncluded whitelist:zutf-8)r   get_modulesr   	read_fileVultureInputExceptionr   r   r   r   r   r   r   r   pkgutilget_datar   OSErrordecode)r   pathsr   r   modulemodule_stringr   unique_importsrc   r   module_datar'   )r   r   r/   scavenge  sF   	
zVulture.scavenger   c                    s   d  krdkst d t ddd   fdd}| j| j | j | j | j | j | j | j }fdd	|D }t	||rE|d
S  d
S )z=
        Return ordered list of unused Item objects.
        r   d   z)min_confidence must be between 0 and 100.c                 S   s   t | j | jfS r2   )r   rN   r3   rt   r4   r'   r'   r/   by_name9  rA   z(Vulture.get_unused_code.<locals>.by_namec                    s   | j f |  S r2   )r}   r4   )r   r'   r/   by_size<  ra   z(Vulture.get_unused_code.<locals>.by_sizec                    s   g | ]	}|j  kr|qS r'   rw   )r+   obj)min_confidencer'   r/   r0   J  r1   z+Vulture.get_unused_code.<locals>.<listcomp>r6   )
r   unused_attrsunused_classesunused_funcsunused_importsunused_methodsunused_propsunused_varsr&   sorted)r   r   sort_by_sizer   unused_codeconfidently_unusedr'   )r   r   r/   get_unused_code2  s<   
zVulture.get_unused_codec                 C   sD   | j ||dD ]}| j|r| n|j|ddd tj| _q| jS )z?
        Print ordered list of Item objects to stdout.
        )r   r   )r   T)r   )r   r   r   r   r   DeadCoder   )r   r   r   make_whitelistr,   r'   r'   r/   reportR  s   



zVulture.reportc                 C      t | j| jS r2   )r<   r   r.   r|   r'   r'   r/   r   d     zVulture.unused_classesc                 C   r   r2   )r<   r   r.   r|   r'   r'   r/   r   h  r   zVulture.unused_funcsc                 C   r   r2   )r<   r   r.   r|   r'   r'   r/   r   l  r   zVulture.unused_importsc                 C   r   r2   )r<   r   r.   r|   r'   r'   r/   r   p  r   zVulture.unused_methodsc                 C   r   r2   )r<   r   r.   r|   r'   r'   r/   r   t  r   zVulture.unused_propsc                 C   r   r2   )r<   r   r.   r|   r'   r'   r/   r   x  r   zVulture.unused_varsc                 C   r   r2   )r<   r   r.   r|   r'   r'   r/   r   |  r   zVulture.unused_attrsr   c                G   sb   | j s|r/|p	tj}z
t|d|i W d S  ty.   dtt|}t| |d Y d S w d S )Nr   r   r   )	r   r   stdoutprintUnicodeEncodeErrorjoinmapr   encode)r   r   r   argsxr'   r'   r/   r     s   

zVulture._logc                 C   sl   t |tjtjfsJ |jD ]%}|jdd }|j}| j| j	|p"||dt
d |dur3| j|j qdS )z
        We delegate to this method instead of using visit_alias() to have
        access to line numbers and to filter imports from __future__.
        .r   Z   rw   ignoreN)rQ   rR   Import
ImportFromnamesr)   	partitionasname_definer   rd   r.   add)r   r\   name_and_aliasr)   aliasr'   r'   r/   _add_aliases  s   
zVulture._add_aliasesc                 C   s   t |jr$| j| j||t|tjr|jn|jd d| ddd d S t 	|jrc|j
}|dkr>| j| j||ddd d S |rR| j| jd	|d
 |d ddd d S |dkre| j| j||ddd d S d S d S )Nzunsatisfiable 'z' conditionr   	last_noderv   rw   ternaryzunreachable 'else' expressionrv   rw   elser   zunreachable 'else' blockifzredundant if-condition)r   condition_is_always_falsetestr  r&   rQ   rR   IfExpbodycondition_is_always_trueorelse)r   r\   r)   	else_bodyr'   r'   r/   _handle_conditional_node  sP   






z Vulture._handle_conditional_nodec           
         sv    fdd}|p|}|j t|}	||	r'd d d d S |tj|	t|||d d S )Nc                    s0    r j ptjptj| t S r2   )rN   rJ   r   r   ignore_liner   ERROR_CODES)r   r   r)   r   rs   r'   r/   ignored  s
   
z Vulture._define.<locals>.ignored	Ignoring  "r   r  )rs   r   get_first_line_numberr   appendrq   rN   get_last_line_number)
r   
collectionr)   
first_noder  rv   rw   r   r  rt   r'   r  r/   r    s"   

zVulture._definec                 C   s   | j | j|||td d S )Nr   )r  r   rp   )r   r)   r\   rw   r'   r'   r/   _define_variable  s   
zVulture._define_variablec                 C   s   | j |j|dd dS )zFunction argumentr   r   N)r%  argr   r\   r'   r'   r/   	visit_arg  s   zVulture.visit_argc                 C   s
   |  |S r2   )visit_FunctionDefr'  r'   r'   r/   visit_AsyncFunctionDef  r   zVulture.visit_AsyncFunctionDefc                 C   sH   t |jtjr| | j|j| d S t |jtjr"| j	|j d S d S r2   )
rQ   ctxrR   Storer  r   attrLoadr.   r  r'  r'   r'   r/   visit_Attribute  s
   zVulture.visit_Attributec                 C   sT   t |jr$t|jtjr&| |jr(|  j	t
td|jjO  _	dS dS dS dS )z^
        Parse variable names in old format strings:

        "%(my_var)s" % locals()
        z
%\((\w+)\)N)r   is_ast_stringleftrQ   oprR   Mod_is_locals_callrightr.   r8   refindallrW   r'  r'   r'   r/   visit_BinOp  s   

"zVulture.visit_BinOpc                    s   t |jtjr9|jjdkrdt|j  krdks(n |jjdkr9t|jdkr9|jd }t|r9 j	
|j t |jtjrct|jjre|jjdkrgt fdd|jD ri |jjj d S d S d S d S d S )	Ngetattr      hasattrr{   r   c                 3   s&    | ]}|j d u o |jV  qd S r2   )r&  r4  rW   )r+   kwr|   r'   r/   rF     s
    
z%Vulture.visit_Call.<locals>.<genexpr>)rQ   rE   rR   rS   rT   lenr   r   r0  r.   r  rW   	Attributer-  rG   keywords_handle_new_format_string)r   r\   attr_name_argr'   r|   r/   
visit_Call  s$   (

zVulture.visit_Callc                 C   s   dd }t  }zdd ||D }W n ty   g }Y nw |D ]}tdd|d}|D ]}||r<| j| q0q"d S )Nc                 S   s   t td| S )Nz[a-zA-Z_][a-zA-Z0-9_]*)boolr6  matchr(   r'   r'   r/   is_identifier'  ra   z8Vulture._handle_new_format_string.<locals>.is_identifierc                 S   s   g | ]
\}}}}|r|qS r'   r'   )r+   rm   r)   r'   r'   r/   r0   ,  s    z5Vulture._handle_new_format_string.<locals>.<listcomp>z\[\w*\]rx   r   )	string	Formatterr   r   r6  subsplitr.   r  )r   srF  parserr  
field_namevarsvarr'   r'   r/   rA  &  s   z!Vulture._handle_new_format_stringc                 C   s6   t | tjot | jtjo| jjdko| j o| j S )z&Return True if the node is `locals()`.locals)rQ   rR   CallrE   rS   rT   r   r@  r[   r'   r'   r/   r4  9  s   
zVulture._is_locals_callc                 C   sR   |j D ]}tt|| jr| d|j d  d S q| j| j|j|t	d d S )NzIgnoring class "" (decorator whitelisted)r   )
decorator_listrJ   r   get_decorator_namer   r   r)   r  r   r`   )r   r\   	decoratorr'   r'   r/   visit_ClassDefD  s   

zVulture.visit_ClassDefc                    s   dd |j D }|jjr|jjd jnd }d|v rd}nd|v s(d|v s(|dkr+d	}nd
}t fdd|D rG d| d|j d d S |dkrV  j|j| d S |d	krg j j|j|t	d d S  j j
|j|td d S )Nc                 S   s   g | ]}t |qS r'   )r   rU  )r+   rV  r'   r'   r/   r0   S  s    z-Vulture.visit_FunctionDef.<locals>.<listcomp>r   z	@propertyr$   z@staticmethodz@classmethodr   r#   r!   c                 3   s    | ]	}t | jV  qd S r2   )rJ   r   )r+   r)   r|   r'   r/   rF   e  s    
z,Vulture.visit_FunctionDef.<locals>.<genexpr>r  r  rR  rS  )rT  r   r&  rG   r   r)   r  r   r   rl   r   ri   )r   r\   decorator_names	first_argrs   r'   r|   r/   r)  R  s0   

zVulture.visit_FunctionDefc                 C      |  |d d S )Nr  r  r'  r'   r'   r/   visit_Ift  ra   zVulture.visit_Ifc                 C   rZ  )Nr  r[  r'  r'   r'   r/   visit_IfExpw  ra   zVulture.visit_IfExpc                 C   s   |  | d S r2   )r
  r'  r'   r'   r/   visit_Importz  r   zVulture.visit_Importc                 C   s   |j dkr| | d S d S )N
__future__)r   r
  r'  r'   r'   r/   visit_ImportFrom}     
zVulture.visit_ImportFromc                 C   sZ   t |jtjtjfr|jtvr| j|j d S t |jtj	tj
fr+| |j| d S d S r2   )rQ   r+  rR   r.  DelrT   rn   r.   r  Paramr,  r%  r'  r'   r'   r/   
visit_Name  s   
zVulture.visit_Namec                 C   sN   t |r#t|jtjtjfsJ |jjD ]}t|r"| j	
|j qd S d S r2   )r]   rQ   rW   rR   rX   rY   eltsr   r0  r.   r  )r   r\   eltr'   r'   r/   visit_Assign  s   
zVulture.visit_Assignc                 C   rZ  )Nwhiler[  r'  r'   r'   r/   visit_While  ra   zVulture.visit_Whilec                 C   s   |j D ]}| j| qd S r2   )	kwd_attrsr.   r  )r   r\   kwd_attrr'   r'   r/   visit_MatchClass  ra  zVulture.visit_MatchClassc                 C   s   d|j j }t| |d }| jr+t|dd}| jr| j|d  nd}| |t|| |r1|| t|dd }|d urSt|tj	tj
frFdnd}| tj|d|d	 | |S )
Nvisit_r   r{   rx   type_comment	func_typeevalz<type_comment>)rN   mode)	__class__r   r9  r   r   r   rR   dumprQ   FunctionDefAsyncFunctionDefr   r   generic_visit)r   r\   r#   visitorr   r~   rn  rq  r'   r'   r/   r     s$   
zVulture.visitc              	   C   s   t |D ]>\}}t|tjtjtjtjfrBz||d  }W n	 ty&   Y qw |jj	
 }| j| j|||d d| ddd  dS qdS )zL
        Find unreachable nodes in the given sequence of ast nodes.
        r{   r  zunreachable code after 'ry   r   r  N)	enumeraterQ   rR   BreakContinueRaiseReturn
IndexErrorrr  r   r3   r  r&   )r   ast_listindexr\   first_unreachable_noder_   r'   r'   r/   _handle_ast_list  s*   
zVulture._handle_ast_listc                 C   sd   t |D ]*\}}t|tr$| | |D ]}t|t jr"| | qqt|t jr/| | qdS )z9Called if no explicit visitor function exists for a node.N)rR   iter_fieldsrQ   listr  ASTr   )r   r\   rm   rW   r,   r'   r'   r/   rv    s   



zVulture.generic_visit)FNN)rx   r2   )r   F)r   FF),r   r   r   r   rz   r   r   r   r   r$   r   r   r   r   r   r   r   r   r
  r  r   r  r%  r(  r*  r/  r8  rC  rA  staticmethodr4  rW  r)  r\  r]  r^  r`  rd  rg  ri  rl  r   r  rv  r'   r'   r'   r/   r      sj    


$
/!








.
$	

"	r   c               
   C   s   zt  } W n ty$ } zt|tjd ttj W Y d }~nd }~ww t| d | d | d d}|j	| d | d d t|j
| d	 | d
 | d d d S )Nr   r   r   r   )r   r   r   r   r   r   r   r   r   )r   r   r   )r
   r	   r   r   r   exitr   InvalidCmdlineArgumentsr   r   r   )configr   r   r'   r'   r/   main  s(   
r  )T)%rR   r   r   pathlibr   r   r6  rG  r   r   r   r   r   vulture.configr	   r
   vulture.utilsr   r   rn   rg   rj   r  r<   r@   rJ   rO   r]   r`   rd   ri   rl   rp   rq   NodeVisitorr   r  r'   r'   r'   r/   <module>   sT    
		M    