
    Vh&                    R   d dl mZ d dlZd dlZd dlmZmZ d dlm	Z	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 d d	lmZ d d
lmZ 	 d dlmZ dZ e       Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd!dZ(d Z)d Z*d"dZ+d"dZ,d#dZ-d$dZ.d$dZ/ G d d e0      Z1y# e$ r dZY Uw xY w)%    )annotationsN)MutableMappingMutableSequence)LooseVersionStrictVersionerrors)	to_nativeto_textto_bytes)boolean)is_encrypted_file)Display)SemanticVersion)VersionTFc                    t        | t              st        j                  d      | j	                  dd      xr | d   j	                  dd      S )z& Test if task result yields a time outz(The 'timedout' test expects a dictionarytimedoutFperiod
isinstancer   r	   AnsibleFilterErrorgetresults    I/home/dcms/DCMS/lib/python3.12/site-packages/ansible/plugins/test/core.pyr   r   +   sF    fn-''(RSS::j%(TVJ-?-C-CHe-TT    c                p    t        | t              st        j                  d      | j	                  dd      S )z# Test if task result yields failed z&The 'failed' test expects a dictionaryfailedFr   r   s    r   r   r   2   s/    fn-''(PQQ::h&&r   c                    t        |        S )z$ Test if task result yields success )r   r   s    r   successr    9   s    f~r   c                p    t        | t              st        j                  d      | j	                  dd      S )z( Test if task result yields unreachable z+The 'unreachable' test expects a dictionaryunreachableFr   r   s    r   r"   r"   >   s/    fn-''(UVV::mU++r   c                    t        |        S )z& Test if task result yields reachable )r"   r   s    r   	reachabler$   E   s    6"""r   c                    t        | t              st        j                  d      d| vrRd}d| v rJt        | d   t              r7t        | d   d   t              r!| d   D ]  }|j                  dd      sd} |S  |S | j                  dd      }|S )z$ Test if task result yields changed z'The 'changed' test expects a dictionarychangedFresultsr   T)r   r   r	   r   r   r   )r   r&   ress      r   r&   r&   J   s    fn-''(QRRvi(/:vi(+^<i( 779e,"G N N **Y.Nr   c                p    t        | t              st        j                  d      | j	                  dd      S )z$ Test if task result yields skipped z'The 'skipped' test expects a dictionaryskippedFr   r   s    r   r*   r*   ^   s/    fn-''(QRR::i''r   c                    t        | t              st        j                  d      d| v r| j	                  dd      dk(  S t
        j                  d       y)z  Test if async task has started z'The 'started' test expects a dictionarystartedr      zIThe 'started' test expects an async task, but a non-async task was testedTr   r   r	   r   r   displaywarningr   s    r   r,   r,   e   sP    fn-''(QRRF zz)Q'1,, 	cdr   c                    t        | t              st        j                  d      d| v r| j	                  dd      dk(  S t
        j                  d       y)z! Test if async task has finished z(The 'finished' test expects a dictionaryfinishedr   r-   zJThe 'finished' test expects an async task, but a non-async task was testedTr.   r   s    r   r2   r2   s   sP    fn-''(RSSV zz*a(A-- 	der   c                    t        | d      } d}|r|t        j                  z  }|r|t        j                  z  }t        j                  ||      }t         t        ||d      |             S )z Expose `re` as a boolean filter using the `search` method by default.
        This is likely only useful for `search` and `match` which already
        have their own filters.
    surrogate_or_strictr   r   )flagssearch)r   reIMcompileboolgetattr)valuepattern
ignorecase	multiline
match_typer5   _res          r   regexrC      sb     E"78EE
**WE
*C2Z259::r   c                @    t        | dd      xr | j                         S )z^Evaluate whether a variable is a single vault encrypted value

    .. versionadded:: 2.10
    __ENCRYPTED__F)r<   is_encrypted)r=   s    r   vault_encryptedrG      s!    
 5/51Je6H6H6JJr   c                    	 t        t        |       d      5 }t        |      cddd       S # 1 sw Y   yxY w# t        t        f$ r }t        j                  d|  d|      d}~ww xY w)zCEvaluate whether a file is a vault

    .. versionadded:: 2.18
    rbNzCannot test if the file z is a vault)orig_exc)openr   r   OSErrorIOErrorr	   r   )r=   fes      r   vaulted_filerP      si    
c(5/4( 	(A$Q'	( 	( 	(W c''*B5'(U`abbcs)   8 ,	8 58 8 A'A""A'c                     t        | |||d      S )z* Perform a `re.match` returning a boolean matchrC   r=   r>   r?   r@   s       r   rR   rR      s    Y@@r   c                     t        | |||d      S )z+ Perform a `re.search` returning a boolean r6   rS   rT   s       r   r6   r6      s    YAAr   c                :   ddddddddddddddd}t         t        t        t        t        d}||t	        j
                  d
      | st	        j
                  d      |st	        j
                  d      |dk(  rt        st	        j
                  d      t         }|rt        }n|r	 ||   }||v r||   }n8t	        j
                  d|ddj                  t        t        |                  	 t        t        |      } | |t        |              |t        |                  S # t        $ r9 t	        j
                  d|ddj                  t        t        |                  w xY w# t        $ r&}	t	        j
                  dt        |	      z        d	}	~	ww xY w)z) Perform a version comparison on a value eqltlegtgene)z===rW   <rX   z<=rY   >rZ   z>=r[   z!=z<>r\   )loosestrictsemversemanticpep440Nz/Cannot specify both 'strict' and 'version_type'z#Input version value cannot be emptyz4Version parameter to compare against cannot be emptyrd   z?The pep440 version_type requires the Python 'packaging' libraryzInvalid version type (z). Must be one of z, zInvalid operator type (zVersion comparison failed: %s)r   r   r   PEP440Versionr	   r   HAS_PACKAGINGKeyErrorjoinmapreprr<   py_operatorr   	Exceptionr
   )
r=   versionoperatorra   version_typeop_maptype_mapr   methodrO   s
             r   version_comparers      s    T$$$dF !#H l6''(YZZ''(MNN''(^__x''(ijjG		|,G 6(#''?GSVW[]cSdIef
 	
Xh/ggen-www7G/HII  	++BNPTPYPYZ]^bdlZmPno 	  X''(G)TU,(VWWXs%   'D& /6E+ &AE(+	F4!FFc                |    |r	 t        |       } t        |       S t        |       S # t        $ r Y t        |       S w xY w)zEvaluate as value for truthiness using python ``bool``

    Optionally, attempt to do a conversion to bool from boolean like values
    such as ``"false"``, ``"true"``, ``"yes"``, ``"no"``, ``"on"``, ``"off"``, etc.

    .. versionadded:: 2.10
    )r   	TypeErrorr;   r=   convert_bools     r   truthyrx      sH     	ENE ;4;  	;	s   % 	;;c                    t        | |       S )zEvaluate as value for falsiness using python ``bool``

    Optionally, attempt to do a conversion to bool from boolean like values
    such as ``"false"``, ``"true"``, ``"yes"``, ``"no"``, ``"on"``, ``"off"``, etc.

    .. versionadded:: 2.10
    )rw   )rx   rv   s     r   falsyrz      s     e,777r   c                      e Zd ZdZd Zy)
TestModulez Ansible core jinja2 tests c           
     J   i dt         dt         dt        dt        dt        dt        dt        dt        d	t
        d
t
        dt        dt        dt        dt        dt        dt        dt        t        t        t        t        t        t         t"        t$        dS )Nr   failure	succeededr    
successfulr$   r"   r   r&   changer*   skipr2   r,   rR   r6   rC   )rs   rm   anyallrx   rz   rG   rP   )r   r    r$   r"   r   r&   r*   r2   r,   rR   r6   rC   rs   r   r   rx   rz   rG   rP   )selfs    r   testszTestModule.tests  s    +
f+
 v+
 	+

 w+
 '+
 +
 ;+
 +
 w+
 g+
  w!+
" G#+
( )+
* w++
0 U1+
2 f3+
4 U5+
:  /&    /(U+
 +	
r   N)__name__
__module____qualname____doc__r    r   r   r|   r|     s
    %,
r   r|   ) r   FFr6   )r   FF)rW   NN)F)2
__future__r   r7   rn   rk   collections.abcr   r   #ansible.module_utils.compat.versionr   r   ansibler	   +ansible.module_utils.common.text.convertersr
   r   r   )ansible.module_utils.parsing.convert_boolr   ansible.parsing.vaultr   ansible.utils.displayr   ansible.utils.versionr   packaging.versionr   re   rf   ImportErrorr/   r   r   r    r"   r$   r&   r*   r,   r2   rC   rG   rP   rR   r6   rs   rx   rz   objectr|   r   r   r   <module>r      s   $ # 	  ; K  T T = 3 ) 1:M )U'
,#
((;"K	cA
B
5Xp"8/
 /
  Ms   B B&%B&