
    Vh-                       d Z ddl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
Z
ddlZddlmZmZmZmZmZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZm Z  ddl!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z.  G d de      Z/y)Sanity test using pylint.    )annotationsN   )SanitySingleVersionSanityMessageSanityFailureSanitySuccessSanityTargetsSANITY_ROOT   )CONTROLLER_PYTHON_VERSIONSREMOTE_ONLY_PYTHON_VERSIONS)	make_dirs)
TestResult)
TestTarget)SubprocessErrordisplay	is_subdir)run_command)ansible_environmentget_collection_detailCollectionDetailCollectionDetailError
ResultType)SanityConfig)data_context)PythonConfigc                  |     e Zd ZdZd fdZedd       Zd	dZd
dZe		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Z
 xZS )
PylintTestr   c                \    t         |           | j                  j                  ddg       y )Nzansible-deprecated-dateztoo-complex)super__init__optional_error_codesupdate)self	__class__s    ]/home/dcms/DCMS/lib/python3.12/site-packages/ansible_test/_internal/commands/sanity/pylint.pyr"   zPylintTest.__init__H   s-    !!((%*
 	    c                     y)zError code for ansible-test matching the format used by the underlying test program, or None if the program does not use error codes.ansible-test )r%   s    r'   
error_codezPylintTest.error_codeO   s     r(   c                    |D cg c]J  }t         j                  j                  |j                        d   dk(  st        |j                  d      sI|L c}S c c}w )z\Return the given list of test targets, filtered to include only those relevant for the test.r   .pybin)ospathsplitextr   )r%   targetstargets      r'   filter_targetszPylintTest.filter_targetsT   sH    %,{60@0@0Ma0PTY0Y]fgmgrgrty]z{{{s   A
AAc                  %& t        d | j                  t        |j                              D              &t        j
                  j                  t        dd      }t        d t	        j                  |      D cg c]!  }t        j
                  j                  |      # c}D              }| j                  |      }|j                  D cg c]  }|j
                   }	}|	D cg c]  }t        |t               j                  j                         rct        j
                  j#                  |t               j                  j                         j%                  t        j
                  j&                         }
}t        |
D ch c]  }t)        |      dkD  s|d    c}      }d}t+        j,                  |
d       D cg c]  \  }}t)        t        |            |kD  r|  }}}|	D cg c]y  t/        fd	|D              rct        j
                  j#                  t               j                  j                         j%                  t        j
                  j&                        { }}t        |D ch c]=  }t)        |      d
kD  st        j
                  j&                  j                  |d d
       ? c}      }g %t        |	      }d4%&fd}d5d6d}|D ]O  } ||d|z   |t        j
                  j                  t               j                  j                   |                   Q |D ]O  } ||d|z   |t        j
                  j                  t               j                  j                   |                   Q  ||d |t               j                  j                                 ||d |t               j                  j0                                ||d |t               j                  j2                               t               j                  j4                  r ||dd        n{ ||d |d              ||d |d              ||d |d              ||d |d              ||d |d              ||d |d              ||d |d               ||d!d"        g }g }d }t               j                  j4                  r-	 t7        |      }|j8                  st;        j<                  d#       tB        jB                  jE                  tB        jF                  jH                  %      }t        %      D ]  \  }}}|s
tB        jB                  jE                  tB        jF                  jH                  %      }|| jK                  ||||||||      z  }tB        jB                  jE                  tB        jF                  jH                  %      } |jM                  d&|t)        |      | |z
  fz          tB        jB                  jE                  tB        jF                  jH                  %      }!|D ]  }"t;        jN                  |"d'(        t;        jN                  d)t)        |	      |!|z
  fz  d'(       |D #cg c]G  }#tQ        |#d*   jS                  d+d,      |#d-   tU        |#d.         tU        |#d/         |#d0   |#d1   2      I }$}#|jV                  rtY        | jZ                        S |j]                  |$|	      }$|$rt_        | jZ                  |$3      S tY        | jZ                        S c c}w c c}w c c}w c c}w c c}}w c c}w c c}w # t>        $ r-}t;        j<                  d$|j@                  z         Y d }~d }~ww xY wc c}#w )7Nc              3  4   K   | ]  }|j                     y wN)r1   ).0r4   s     r'   	<genexpr>z"PylintTest.test.<locals>.<genexpr>Y   s     g66;;gs   pylintpluginsc              3  F   K   | ]  }|d    dk(  r|d   dk7  r|d     yw)r   r.   r   r"   Nr+   )r9   ps     r'   r:   z"PylintTest.test.<locals>.<genexpr>\   s7      jqDEaDEMVWXYVZ^hVh  d js   !r   r   i  c                ,    t        |       dkD  r| d   S dS )Nr   r    )lenr>   s    r'   <lambda>z!PylintTest.test.<locals>.<lambda>i   s    QTUVQWZ[Q[1 ac r(   c              3     K   | ]J  }t        t        j                  j                  t	               j
                  j                  |             L y wr8   )r   r0   r1   joinr   contentmodule_path)r9   gr>   s     r'   r:   z"PylintTest.test.<locals>.<genexpr>l   s=       +Kqr9Q\^E[E[EgEgij8k+l  +Ks   AA   c                    t        fd| D              }t        fd|D              x}rj                  |d|f       t        fd|D              x}rj                  |d|f       | |z  } y)zmAdd the specified context to the context list, consuming available paths that match the given context filter.c              3  4   K   | ]  } |      s|  y wr8   r+   )r9   r>   context_filters     r'   r:   z7PylintTest.test.<locals>.add_context.<locals>.<genexpr>t   s      Qq~a?P Qs   c              3  ,   K   | ]  }|v s|  y wr8   r+   r9   r1   target_pathss     r'   r:   z7PylintTest.test.<locals>.add_context.<locals>.<genexpr>v   s     '`4S_K_'`   	Tc              3  ,   K   | ]  }|vs|  y wr8   r+   rN   s     r'   r:   z7PylintTest.test.<locals>.add_context.<locals>.<genexpr>y   s     'd4WcKc'drP   FN)setsortedappend)available_pathscontext_namerL   filtered_pathsselected_pathscontextsrO   s     `  r'   add_contextz$PylintTest.test.<locals>.add_contextr   so      QO QQN!''`'`!``~`t^ DE!''d'd!dd~dun EF~-Or(   c                     d fd}|S )zXReturn a function that filters out paths which are not a subdirectory of the given path.c                    t        |       S )z>Return true if the given path matches, otherwise return False.)r   )path_to_filterpath_filters    r'   rL   z<PylintTest.test.<locals>.filter_path.<locals>.context_filter   s     ==r(   )r]   strreturnboolr+   )r^   rL   s   ` r'   filter_pathz$PylintTest.test.<locals>.filter_path~   s    > "!r(   z
modules/%smodulesmodule_utilsunits
collectionc                     yNTr+   rB   s    r'   rC   z!PylintTest.test.<locals>.<lambda>       r(   zvalidate-modulesz?test/lib/ansible_test/_util/controller/sanity/validate-modules/zvalidate-modules-unitz2test/lib/ansible_test/tests/validate-modules-unit/z
code-smellz9test/lib/ansible_test/_util/controller/sanity/code-smell/zansible-test-targetz#test/lib/ansible_test/_util/target/r*   z	test/lib/testztest/hackingzhacking/ansiblec                     yrh   r+   rB   s    r'   rC   z!PylintTest.test.<locals>.<lambda>   ri   r(   zPSkipping pylint collection version checks since no collection version was found.zTSkipping pylint collection version checks since collection detail loading failed: %s)tzz%s: %d (%s)   	verbosityztotal: %d (%s)message
 r1   linecolumntypesymbol)rr   r1   ru   rv   levelcode)messages)rU   zset[str]rV   r_   rL   c.Callable[[str], bool]r`   Noner8   )r^   r_   r`   r|   )0rR   filter_remote_targetslistr3   r0   r1   rE   r   rS   listdirr2   load_processorincluder   r   rF   rG   relpathsplitseprA   	itertoolsgroupbyanymodule_utils_path	unit_pathrf   r   versionr   warningr   reasondatetimenowtimezoneutcr;   rT   infor   replaceintexplainr	   nameprocess_errorsr   )'r%   argsr3   python
plugin_dirr>   plugin_namessettingsr4   pathsmodule_pathsmodule_dirslarge_module_group_thresholdkeyvaluelarge_module_groupslarge_module_group_pathslarge_module_group_dirsremaining_pathsrZ   rb   large_module_dir
module_dirr{   context_timescollection_detailex
test_startcontext	is_targetcontext_pathscontext_startcontext_endtest_endcontext_timemerrorsrY   rO   s'        `                               @@r'   rj   zPylintTest.testX   s   gT5O5OPTU\UdUdPe5fggWW\\+xC
 j)+J)?-A$%BGGQ-A j j &&t,+2??;;; Sfg!*1ln.D.D.P.P!Q <>+A+A+M+MNTTUWU\U\U`U`a S SLGqCFQJadGH'*$(00?cdYzsEhklpqvlwhx  |X  iX  # Y Y x} $Lrs'*  +K  wJ  +K  (K %'GGOOA|~7M7M7Y7Y$Z$`$`acahahalal$m $L  $L"(Kc)ragjklgmpqgq"''++*:*:1Ra5*A)r"se*
	.	" !8 	[8H)H+VXV]V]VbVbcocqcycy  dF  dF  HX  WY  KZ  [	[ & 	OJ
)BKPRPWPWP\P\]i]k]s]s]]  BL  QM  EN  O	O 	OYLN<R<R<^<^0_`O^[AWAWAiAi5jkOWk,.:P:P:Z:Z.[\>!!,,~F);[  JK  >L  M)@+  OC  CD  E{C~7  A)>Lq@rs[9QRW1EFK
4KLNC >!!,,D$9&$A!(00OO$vw &&**h.?.?.C.C*D
171A 	m-GY $--11X5F5F5J5J1KMD'9mZYegm  pA  B  BH"++//83D3D3H3H/IK  '3};M{]jOj1k!kl	m $$((H,=,=,A,A(B) 	4LLL3	4 	%UX
5J(KKWXY    iL((s36QvYq{#F)8
   << ++((7 V<<TYY''i-A
 <SGY$L)rx ) D vy{  zC  zC  !C  D  DD,sW   ;&\&
\+%B\0\5\5 #\:+A>] 4].],]
 7A^
	^ "];;^ c                   t         j                  j                  t        dd|j	                  d      d   dz         }t         j                  j                  |      skt               j                  j                  r't         j                  j                  t        ddd      }n&t         j                  j                  t        ddd      }t        j                         }	|	j                  |       |	j                  d      rt        |	j                  d            }
ni }
t        d	 |
j!                  d
d      j	                  d      D              }t        |dgz         |z
  }|rd}t"        d   }nd}t$        d   }|j                  ddddddddddd|ddddj                  t'        |            d|g|z   }t               j                  j                  rd|j)                  dt               j                  j                  j*                  g       |r)|j,                  r|j)                  d|j,                  g       |g}t               j                  j                  r7|j/                  t               j                  j                  j0                         t3        |       }|d xx   t         j                  j4                  t         j                  j4                  j                  |      z   z  cc<   |j7                  t        d! t               j                  j8                  j                         D                     t         j                  j                  t:        j<                  j                  d      }t?        |       |j7                  |"       |rWtA        jB                  d#tE        |       d$|d%| d&| d'(       	 tG        | ||d)*      \  }}d}|s|d,k\  rtI        ||||-      d+}| jP                  s|rtS        jT                  |      }|S g }|S # tH        $ r.}|jJ                  }|jL                  }|jN                  }Y d+}~sd+}~ww xY w).zLRun pylint using the config specified by the context on the specified paths.r;   config/r   z.cfgzcollection.cfgzdefault.cfgr*   c              3  B   K   | ]  }|s|j                           y wr8   )strip)r9   is     r'   r:   z$PylintTest.pylint.<locals>.<genexpr>   s     cAabaggics   zdisable-pluginsr@   ,zpylint.extensions.mccaber4   
controllerz-mz--jobs0z	--reportsnz--max-line-length160z--max-complexity20z--rcfilez--output-formatjsonz--load-pluginsz--py-versionz--collection-namez--collection-version
PYTHONPATHc              3     K   | ]T  \  }}d |j                         z  t        j                  j                  |      t        j                  j                  z   f V yw)zANSIBLE_TEST_%s_PATHN)upperr0   r1   abspathr   )r9   kvs      r'   r:   z$PylintTest.pylint.<locals>.<genexpr>  sM       Xcgcdfg/!'');RWW__Q=ORTRYRYR]R]=]^  Xs   AA)
PYLINTHOMEz	Checking z file(s) in context z (z) with config: r   rp   T)envcaptureN    )cmdstatusstderrstdout)+r0   r1   rE   r   r   existsr   rF   rf   configparserConfigParserreadhas_sectiondictitemsrR   getr   r   rS   extend	full_namer   rT   rootr   pathsepr$   plugin_pathsr   TMPr   r   r   rA   r   r   r   r   r   r   r   loads)r   r   r   r   r   r   r   r   rcfileparserr   disable_pluginsload_pluginscontext_labelmin_python_versionr   append_python_pathr   pylint_homer   r   r   r   r{   s                           r'   r;   zPylintTest.pylint   s    k8Xw}}S?QRS?TW]?]^ww~~f%~%%00k8XGWXk8X}U**,Fn-&,,~67FFc<Mr1R1X1XY\1]cc<+E*FFG/Y$M!<Q!?(M!;A!> KK(cvchhvl';<.
  >!!,,JJ+\^-C-C-N-N-X-XYZ %6%>%>

24E4M4MNO(\>!!,,%%ln&<&<&G&G&L&LM!$'LRWW__rww/C/CDV/WWW 	

4  Xkwky  lB  lB  lO  lO  lU  lU  lW  X  X  	Y ggll:>>#6#6A+

k
*LL9SZL0DWKrR_Q``opvowx  EF  G#!,T3C!N 2%#fVTZ[[F||zz&)H  H # ##s   2P 	P>$P99P>)r`   r}   )r`   zt.Optional[str])r3   list[TestTarget]r`   r   )r   r   r3   r
   r   r   r`   r   )r   r   r   r_   r   ra   r   	list[str]r   r_   r   r   r   r   r   r   r`   zlist[dict[str, str]])__name__
__module____qualname____doc__r"   propertyr,   r5   rj   staticmethodr;   __classcell__)r&   s   @r'   r   r   E   s    #  |x(t ^^^ ^ 	^
 ^  ^ ^ ,^ 
^ ^r(   r   )0r   
__future__r   collections.abcabccr   r   r0   r   r   typingtr@   r   r   r   r	   r
   r   	constantsr   r   ior   rj   r   r4   r   utilr   r   r   util_commonr   ansible_utilr   r   r   r   r   r   r   datar   host_configsr   r   r+   r(   r'   <module>r      su     "    	    
  
l$ lr(   