
    Vh                       d Z ddlmZ ddlmZ ddlZddlmZm	Z	m
Z
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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) ddl*m+Z+ ddZ, G d de      Z-edd       Z.y)1Sanity test for proper import exception handling.    )annotationsN   )	SanityMultipleVersionSanityMessageSanityFailureSanitySuccessSanitySkippedTARGET_SANITY_ROOTSanityTargetscreate_sanity_virtualenvcheck_sanity_virtualenv_yaml   )CONTROLLER_MIN_PYTHON_VERSIONREMOTE_ONLY_PYTHON_VERSIONS)
TestResult)
TestTarget)cacheSubprocessErrordisplayparse_to_list_of_dict	is_subdirANSIBLE_TEST_TOOLS_ROOT)
ResultTypecreate_temp_dir)ansible_environment)SanityConfig)cover_python)data_context)PythonConfigc                    t               j                  j                  t               j                  j                  | rfdS fdS )zLCreate a predicate which tests whether a path can be used by modules or not.c                8    t        |       xs t        |       S Nr   pathmodule_pathmodule_utils_paths    ]/home/dcms/DCMS/lib/python3.12/site-packages/ansible_test/_internal/commands/sanity/import.py<lambda>z"_get_module_test.<locals>.<lambda>H   s    IdK8^IdL]<^     c                :    t        |       xs t        |        S r#   r$   r%   s    r)   r*   z"_get_module_test.<locals>.<lambda>I   s    Yt[9_YtM^=_` r+   )r   contentr'   r(   )module_restrictionsr'   r(   s    @@r)   _get_module_testr/   C   s9    .((44K$..@@^^``r+   c                  2    e Zd ZdZddZedd       ZddZy)	
ImportTestr   c                f   t               j                  j                  rdg}n5t        t               j                  j                  j                               }|D cg c]H  t        j                  j                  j                        d   dk(  s3t        fd|D              rJ c}S c c}w )z\Return the given list of test targets, filtered to include only those relevant for the test.zlib/ansibler   z.pyc              3  J   K   | ]  }t        j                  |        y wr#   )r   r&   ).0r&   targets     r)   	<genexpr>z,ImportTest.filter_targets.<locals>.<genexpr>[   s     CTIfkk40Cs    #)
r   r-   
is_ansiblelistplugin_pathsvaluesosr&   splitextany)selftargetspathsr5   s      `r)   filter_targetszImportTest.filter_targetsO   s    >!!,, #OE //<<CCEFE%, E60@0@0Ma0PTY0YCUCC  E 	E Es   4B.B.c                     y)z0True if the test requires PyPI, otherwise False.T )r>   s    r)   
needs_pypizImportTest.needs_pypi]   s     r+   c                X
   | j                  ||j                        }|j                  D cg c]  }|j                   }}t        j                  j                  t        j                  j                  dd      }g }dt        d      fdt        d      ffD ]  \  }	}
|	dk(  r|j                  t        v rd}n|	}dj                  |D cg c]  } |
|      s| c}      }|s|j                  sZt        ||| j                   d	| |j                  d
      }|sRt        j                  d| j                   d|j                   d       t!        | j                  |j                        c S |j"                  xs t%        |      }|du r3t        j                  d| j                   d|	 d|j                   d       t'        |d      }|j)                  t        j                  j                  |	       t+               j,                  j.                  rt        ||j0                  | j                        }|j)                  t+               j,                  j.                  j2                  |j                  t        j                  j                  t4        d      t6        dj                  t9               |d   f             |j                  r4t        j:                  |	dz   |z   d       dg}|j)                  t        j<                  j                  t        j                  j                  t>        d      |d   g             	 tA        |||| j                  |d|      \  }}|s|rtC        |||       |j                  r!t!        | j                  |j                  '      S |jY                  ||      }|r"t[        | j                  ||j                  (      S t]        | j                  |j                  '      S c c}w c c}w # tB        $ r}|jD                  d k7  s|jF                  s|jH                  s d!}tK        ||jH                        }t        j                  jM                  |t+               j,                  jN                        t        j                  jP                  z   }||D cg c]f  }tS        |d"   |d#   jU                  |      r#t        j                  jM                  |d#   |      n|d#   tW        |d$         tW        |d%         &      h nc c}w c}z  }Y d }~d }~ww xY w))NsanityimportmoduleTpluginFempty
.)coverageminimizezSkipping sanity test "z" on Python z, due to missing virtual environment support.zSanity test "z" (z) on Python z6 may be slow due to missing libyaml support in PyYAML.)color)SANITY_TEMP_PATHSANITY_IMPORTER_TYPEzyaml_to_json.py:
PYTHONPATH)SANITY_COLLECTION_FULL_NAMESANITY_EXTERNAL_PYTHONSANITY_YAML_TO_JSON%ANSIBLE_CONTROLLER_MIN_PYTHON_VERSIONrS   z:    )	verbosityzimporter.pyPATH)rZ   )capturedata)stdoutstderr
   zF^(?P<path>[^:]*):(?P<line>[0-9]+):(?P<column>[0-9]+): (?P<message>.*)$messager&   linecolumn)r`   r&   ra   rb   )python_version)messagesrc   )/load_processorversionincluder&   r;   joinr   TMPr/   r   prime_venvsr   namerM   r   warningr
   explainr   r   updater   r-   
collectioncontroller_python	full_namer   r   get_ansible_test_python_pathinfopathsepr   r   r   statusr^   r]   r   relpathrootsepr   
startswithintprocess_errorsr   r	   )r>   argsr?   pythonsettingsr5   r@   	temp_rootrd   import_typetest	venv_typer&   r\   virtualenv_pythonvirtualenv_yamlenvexternal_pythoncmdr]   r^   expatternparsedrelative_temp_rootrresultss                              r)   r   zImportTest.testb   s   &&tV^^<+2??;;;GGLL!4!4hI	 '-.'./"
 O	#K h&6>>=X+X
 $	'	99uCtT
dCDD 0 0 8v$))TUV_U`Galplyly  EI  !J$"8<PVP^P^O_  `L  !M  N$TYY??"ll].JK\.]O%'-		{#k],W]WeWeVf  g]  !^  _%d%8CJJ!+!4!4%0  
 ~%%00":4AWAWY]YbYb"c

0<0F0F0Q0Q0[0[+:+?+?(*5LN_(`:W"xx)E)G\IZ([\   LLt+d2a@ /C JJZZ__bggll3Ex&PRUV\R]%^_  #!-d4EsDIIWZdhos!tV)#fVLL $}O	#b  6>>JJ))(E: WV^^\\TYYv~~FF <& Df # #99?biiryyc.w		B%'WW__Y@V@V@[@[%\_a_f_f_j_j%j"
 "#
  +iLKLV9K_K_`rKs64FGyz  |B  zCQvYq{+	 # # ##s7   O8O=
O=
 1P
T)BT$(A+T
T$$T)N)r?   list[TestTarget]returnr   )r   bool)r|   r   r?   r   r}   r    r   r   )__name__
__module____qualname____doc__rA   propertyrD   r   rC   r+   r)   r1   r1   L   s&    ;E  bGr+   r1   c                     t        d      } | S )z
    Return a directory usable for PYTHONPATH, containing only the ansible-test collection loader.
    The temporary directory created will be cached for the lifetime of the process and cleaned up at exit.
    zansible-test-)prefix)r   )python_paths    r)   rr   rr      s     "9Kr+   )r.   r   r   zc.Callable[[str], bool])r   str)/r   
__future__r   collections.abcabccr;    r   r   r   r	   r
   r   r   r   r   	constantsr   r   r   r   r5   r   utilr   r   r   r   r   r   util_commonr   r   ansible_utilr   configr   coverage_utilr   r\   r   host_configsr    r/   r1   rr   rC   r+   r)   <module>r      s    7 "  	
 
 

 

axG& xGv  r+   