B
    `WY                 @   s  d Z ddlmZmZmZ e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mZ ddlmZ ddlmZmZmZmZ dd	lmZ d
ZyejdddZW n ek
r   dZY nX yejdddZW n ek
r   dZY nX dd Z d:ddZ!d;ddZ"d<ddZ#dd Z$dd Z%d=ddZ&d>d d!Z'd"d# Z(d?d$d%Z)d@d&d'Z*dAd(d)Z+d*d+ Z,d,d- Z-dBd.d/Z.d0d1 Z/G d2d dZ0G d3d4 d4e0Z1G d5d6 d6e0Z2G d7d de0Z3G d8d9 d9eZ4dS )Cz>Test target identification, iteration and inclusion/exclusion.    )absolute_importdivisionprint_functionN   )types)to_bytesto_text)read_text_file)ApplicationErrordisplayread_lines_without_comments	is_subdir)data_context)z.pyz.ps1TCompletionTargetCompletionTarget)boundTIntegrationTargetIntegrationTargetc          
   C   sT   y&|  }t jddk}t|||}|S  tk
rN } z
d| gS d}~X Y nX dS )zy
    :type target_func: () -> collections.Iterable[CompletionTarget]
    :type prefix: unicode
    :rtype: list[str]
    Z	COMP_TYPEZ63z%sN)osenvirongetwalk_completion_targets	Exception)Ztarget_funcprefixtargetsshortmatchesex r   L/home/dcms/DCMS/lib/python3.7/site-packages/ansible_test/_internal/target.pyfind_target_completion.   s    r    Fc                s   t dd | D }dr.|kr.| fdd|D }|rttj  r d7   fdd|D }t|dkr|}tt|S )z
    :type targets: collections.Iterable[CompletionTarget]
    :type prefix: str
    :type short: bool
    :rtype: tuple[str]
    c             s   s   | ]}|j D ]
}|V  qqd S )N)aliases).0targetaliasr   r   r   	<genexpr>D   s    z*walk_completion_targets.<locals>.<genexpr>/c                s.   g | ]&}|  rd |t d kr|qS )r&   )
startswithlen)r"   r$   )r   r   r   
<listcomp>I   s    z+walk_completion_targets.<locals>.<listcomp>r   c                s$   g | ]}t | kr| d  qS )N)r)   )r"   match)offsetr   r   r*   O   s    )	setendswithremover)   r   pathdirnametuplesorted)r   r   r   r!   r   Zrelative_matchesr   )r,   r   r   r   =   s    
r   c                s   t | } tt| |ddddd d}|rNtt| |ddd  fdd|D }|rhtt| |dddd	 tt||dddd	}t t|d
d dS )z
    :type targets: collections.Iterable[T <= CompletionTarget]
    :type includes: list[str]
    :type excludes: list[str]
    :type requires: list[str]
    :rtype: tuple[T <= CompletionTarget]
    TF)errorsdirectoriesc             S   s   | j S )N)name)Zinclude_targetr   r   r   <lambda>`       z'walk_internal_targets.<locals>.<lambda>)keyc                s   g | ]}| kr|qS r   r   )r"   Zrequire_target)require_targetsr   r   r*   d   s    z)walk_internal_targets.<locals>.<listcomp>)r4   includer5   c             S   s   | j S )N)r6   )Zsort_targetr   r   r   r7   j   r8   )r2   r3   filter_targetsr-   list)r   ZincludesZexcludesrequiresZinclude_targetsZinternal_targetsr   )r:   r   walk_internal_targetsV   s    r?   Tc             c   s  t |pd}|r"tdd |D nd}xR| D ]H}t  }d}	|rx|jD ]}
x||D ]t}|| |
rTd}	y|| W n tk
r   Y nX |
drT|jrt|jt|
kr|	|j qT|	|
 qTW qJW nh|r:d}	|js|	d xL|jD ]B}
|
dr|jr,t|jt|
kr,|	|j q|	|
 qW |	|krFq.|rr|rrt
tt|td	d
 |jV  q.|V  q.W |r|rt|dS )zOIterate over the given targets and filter them based on the supplied arguments.r   c             s   s    | ]}|t d | fV  qdS )z^%s$N)recompile)r"   pr   r   r   r%   u   s    z!filter_targets.<locals>.<genexpr>NFTr&   .)r9   r   )r-   dictr!   r+   r/   KeyErrorr.   	base_pathr)   addDirectoryTargetr   r3   modulesTargetPatternsNotMatched)r   patternsr;   r5   r4   	unmatchedZcompiled_patternsr#   Zmatched_directoriesr+   r$   patternr   r   r   r<   m   sF    




 
r<   c              c   s6   x0t t jjt jjtdD ]} | js(q| V  qW dS )z2
    :rtype: collections.Iterable[TestTarget]
    )r0   module_path
extensionsN)walk_test_targetsr   contentrN   MODULE_EXTENSIONSmodule)r#   r   r   r   walk_module_targets   s     rT   c               C   s   t t jjt jjdddS )z2
    :rtype: collections.Iterable[TestTarget]
    )z.pyZtest_)r0   rN   rO   r   )rP   r   rQ   Z	unit_pathZunit_module_pathr   r   r   r   walk_units_targets   s    rU   c             C   s   t t jjdd| dS )zS
    :type include_symlinks: bool
    :rtype: collections.Iterable[TestTarget]
    )z.py)bin)rN   rO   
extra_dirsinclude_symlinks)rP   r   rQ   rN   )rX   r   r   r   walk_compile_targets   s    rY   c             C   s   t t jjd| dS )z2
    :rtype: collections.Iterable[TestTarget]
    )z.ps1z.psm1)rN   rO   rX   )rP   r   rQ   rN   )rX   r   r   r   walk_powershell_targets   s    rZ   c               C   s   t t jjdddS )z2
    :rtype: collections.Iterable[TestTarget]
    T)rN   rX   include_symlinked_directories)rP   r   rQ   rN   r   r   r   r   walk_sanity_targets   s    r\   c             c   s2   x,t  D ]"}d|jks$| rd|jkr|V  qW dS )zX
    :type include_hidden: bool
    :rtype: collections.Iterable[IntegrationTarget]
    zposix/zhidden/posix/N)walk_integration_targetsr!   )include_hiddenr#   r   r   r   walk_posix_integration_targets   s    r_   c             c   s2   x,t  D ]"}d|jks$| rd|jkr|V  qW dS )zX
    :type include_hidden: bool
    :rtype: collections.Iterable[IntegrationTarget]
    znetwork/zhidden/network/N)r]   r!   )r^   r#   r   r   r    walk_network_integration_targets   s    r`   c             c   s2   x,t  D ]"}d|jks$| rd|jkr|V  qW dS )zX
    :type include_hidden: bool
    :rtype: collections.Iterable[IntegrationTarget]
    zwindows/zhidden/windows/N)r]   r!   )r^   r#   r   r   r    walk_windows_integration_targets   s    ra   c           	   #   s4  t  jj} tdd t D }t  j| }t }t| t	j
j}d}d}g  x4|D ],}x&|D ]} t	j
t	j
j|| q`W qVW tdd |D }	|	 fdd|D  ||	kr|	| d}
g }xBt|	D ]6}|
r|
|dt|
 krq|}
|t	j
j| qW x |D ]} tt| ||V  qW dS )z9
    :rtype: collections.Iterable[IntegrationTarget]
    c             s   s   | ]}|j V  qd S )N)rS   )r"   r#   r   r   r   r%      s    z+walk_integration_targets.<locals>.<genexpr>)defaultsfileshandlersmetaZtasksZ	templatesvars)zmain.ymlz	main.yamlc             s   s(   | ] }t tj|tjjV  qd S )N)r2   r   r0   r1   splitsep)r"   rB   r   r   r   r%   	  s   c             3   sF   | ]> t  fd dD rttjtj tjjV  qdS )c             3   s   | ]}  |V  qd S )N)r.   )r"   entry_point)rB   r   r   r%     s    z5walk_integration_targets.<locals>.<genexpr>.<genexpr>N)anyr2   r   r0   r1   rg   rh   )r"   )entry_points)rB   r   r%     s   N)r   rQ   integration_targets_path	frozensetrT   
walk_filesload_integration_prefixesr2   rg   r   r0   rh   appendjoinr-   updater/   r3   r)   r   r   )r0   rI   pathsprefixesZtargets_path_tupleZ
entry_dirsZentry_filesZ	entry_dirZ
entry_fileZpath_tuplesZprevious_path_tupleZ
path_tupler   )rk   r   r]      s4    



"



r]   c                 sx   t  jj} tdd t  j| D }i }xH|D ]@}tj|d dd  |t	 fddt
| D  q0W |S )z 
    :rtype: dict[str, str]
    c             s   s.   | ]&}t jt j|d  dkr|V  qdS )r   ztarget-prefixesN)r   r0   splitextbasename)r"   fr   r   r   r%   (  s    z,load_integration_prefixes.<locals>.<genexpr>r   Nc             3   s   | ]}| fV  qd S )Nr   )r"   k)r   r   r   r%   -  s    )r   rQ   Zintegration_pathr3   	get_filesr   r0   ru   rr   rD   r	   
splitlines)r0   
file_pathsrt   	file_pathr   )r   r   ro   #  s    

(ro   c             c   s*  | rt  jj| |d}nt  jj|d}x||D ]t}tjtj|\}	}
|rX|
|krXq.|rh|	|shq.tj	t
|tjj}|r|sq.tt|||| |V  q.W g }|rx.|D ]&}x t  j|D ]}|| qW qW xF|D ]>}tj	t
|tjj}|r|sqt|||| |V  qW dS )a+  
    :type path: str | None
    :type module_path: str | None
    :type extensions: tuple[str] | None
    :type prefix: str | None
    :type extra_dirs: tuple[str] | None
    :type include_symlinks: bool
    :type include_symlinked_directories: bool
    :rtype: collections.Iterable[TestTarget]
    )r[   N)r   rQ   rn   	all_filesr   r0   ru   rv   r(   islinkr   rstriprh   
TestTargetr   ry   rp   )r0   rN   rO   r   rW   rX   r[   r{   r|   r6   extsymlinkZ	extra_dirr   r   r   rP   2  s.    


rP   c          
   C   s  t jt jjd }dd | D }tdd |D }tt}x2| D ]*}x$|j	|j
 D ]}|| |j qXW qFW x,| D ]$}x|jD ]}|| |j qW qzW x| D ]}xt j|jD ]p}t jt|t jjsqt j|}	|	|sq|	t|d dd }
|
|jkrq||
 |j qW qW x| D ]}t j|jd}t j|sbq<t j|}x|D ]}t j|rvyt| }W n tk
r   wvY nX xX|D ]P}td	|rАq| sސqx(|D ] }||kr|| |j qW qW qvW q<W xzd}xf|  D ]Z\}}xNt!|D ]B}|"|}|r<x*|D ]"}||krV|| |d
7 }qVW q<W q*W |sP qW x\t#|D ]P}|| }|sqt$j%d| dd x$t#|D ]}t$j%d| dd qW qW |S )z[
    :type integration_targets: list[IntegrationTarget]
    :rtype: dict[str,set[str]]
    r&   c             S   s   g | ]}|j d kr|qS )role)type)r"   r#   r   r   r   r*   i  s    z;analyze_integration_target_dependencies.<locals>.<listcomp>c             s   s   | ]}d |j kr|jV  qdS )zhidden/N)r!   r6   )r"   r#   r   r   r   r%   j  s    z:analyze_integration_target_dependencies.<locals>.<genexpr>Nr   re   z^ *#.*$r   z%s:   )	verbosityz  %s)&r   r0   realpathr   rQ   rl   r-   collectionsdefaultdictsetup_always
setup_oncerG   r6   needs_targetrn   r~   r   r   rh   r(   r)   rg   rq   isdirry   existsr	   rz   UnicodeDecodeErrorr@   searchstripitemsr=   r   r3   r   info)Zintegration_targetsZreal_target_rootZrole_targetsZhidden_role_target_namesZdependenciesr#   Zsetup_target_nameZneed_targetr0   Zreal_link_pathZlink_targetZmeta_dirZ
meta_paths	meta_pathZ
meta_linesZ	meta_lineZhidden_target_namechangesdummyZdependent_target_namesZdependent_target_nameZnew_target_namesZnew_target_nameZtarget_nameZ	consumersZconsumerr   r   r   'analyze_integration_target_dependenciesb  sx    











(



r   c               @   sN   e Zd ZdZejZdd Zdd Zdd Z	dd	 Z
d
d Zdd Zdd ZdS )r   z3Command-line argument completion target base class.c             C   s&   d | _ d | _d | _t | _t | _d S )N)r6   r0   rF   r2   rI   r!   )selfr   r   r   __init__  s
    zCompletionTarget.__init__c             C   s   t |tr|  | kS dS )NF)
isinstancer   __repr__)r   otherr   r   r   __eq__  s    
zCompletionTarget.__eq__c             C   s   |  | S )N)r   )r   r   r   r   r   __ne__  s    zCompletionTarget.__ne__c             C   s   | j |j S )N)r6   __lt__)r   r   r   r   r   r     s    zCompletionTarget.__lt__c             C   s   | j |j S )N)r6   __gt__)r   r   r   r   r   r     s    zCompletionTarget.__gt__c             C   s   t |  S )N)hashr   )r   r   r   r   __hash__  s    zCompletionTarget.__hash__c             C   s"   | j rd| jd| j f S | jS )Nz%s (%s)z, )rI   r6   rq   )r   r   r   r   r     s    zCompletionTarget.__repr__N)__name__
__module____qualname____doc__abcABCMeta__metaclass__r   r   r   r   r   r   r   r   r   r   r   r     s   c                   s    e Zd ZdZ fddZ  ZS )rH   zDirectory target.c                s$   t t|   || _|| _|| _dS )zC
        :type path: str
        :type modules: tuple[str]
        N)superrH   r   r6   r0   rI   )r   r0   rI   )	__class__r   r   r     s    zDirectoryTarget.__init__)r   r   r   r   r   __classcell__r   r   )r   r   rH     s   rH   c                   s"   e Zd ZdZd fdd	Z  ZS )r   zGeneric test target.Nc                s2  t t|   |dkr0tjt|tjj}|| _	|| _|rH|d nd| _
|| _tjtj| j\}}|rt||r|dkr|tkr|t|pdd d| _| jf| _nd| _t | _| j| jg}| jd}	x6tdt|	D ]$}
dd|	d|
  }|| qW dd	 |D }tt|| _dS )
z
        :type path: str
        :type module_path: str | None
        :type module_prefix: str | None
        :type base_path: str
        :type symlink: bool | None
        Nr&   r    _r   z%s/c             S   s   g | ]}|r|qS r   r   )r"   ar   r   r   r*     s    z'TestTarget.__init__.<locals>.<listcomp>)r   r   r   r   r0   r~   r   r   rh   r6   rF   r   ru   rv   r   rR   r)   lstriprS   rI   r2   rg   rangerq   rp   r3   r!   )r   r0   rN   Zmodule_prefixrF   r   r6   r   r!   partsir$   )r   r   r   r     s(    zTestTarget.__init__)N)r   r   r   r   r   r   r   r   )r   r   r     s   r   c                   s8   e Zd ZdZedZeeedB Z fddZ  ZS )r   zIntegration test target.)networkwindows)posixrS   Zneedsskipc          	      s  t t  tj|t jj_	j	
tjjd_|_t j|}tj|d}||krpd_|_nd_d_tj|d}||krtt|dd}nt }j krj}n2jd	rjd
d  krjd
d }nd}tt fdd|t|g D _jg}	|	 fdd|D 7 }	|	dd jD 7 }	jsX|	d d|	krl|	d djkrjdjd }
nd}
|
|kr||
 }||
krd||
f }|	| jd	r|	d jdr|	d jdsjdr|	d jdkr2|	d t jjtdd |	D _tttfdd|	D _dd |	D }|r|d nd_xbt|	dt|	D ]L}d |kr|d }x0t d!t|D ]}|	d |d|  qW qW t!fd"d|	D s|	d# jgd$d |	D  fd%d|	D  }d&|kr^d&gd'd |D  }ttt|_"tttd(d |	D _#tttd)d |	D _$tttd*d |	D _%dS )+zn
        :type path: str
        :type modules: frozenset[str]
        :type prefixes: dict[str, str]
        rC   zrunme.shscriptr   Nr!   T)Zremove_blank_linesZwin_r   c             3   s   | ]}| kr|V  qd S )Nr   )r"   r   )rI   r   r   r%   Y  s    z-IntegrationTarget.__init__.<locals>.<genexpr>c                s   g | ]}| kr|qS r   r   )r"   r   )rI   r   r   r*   ^  s    z.IntegrationTarget.__init__.<locals>.<listcomp>c             S   s   g | ]}d | qS )z	module/%sr   )r"   mr   r   r   r*   _  s    Z
non_moduleZdestructiveZnon_destructiver   z%s/%sr   Zconnection_
connectionZsetup_Zprepare_hidden)r   r   c             s   s   | ]}| d r|V  qdS )zskip/N)r(   )r"   gr   r   r   r%     s    c             3   s>   | ]6}| d r| d  sd|ddd V  qdS )zneeds/file/zneeds/file/%s/r&      N)r(   rq   rg   )r"   r   )targets_relative_pathr   r   r%     s    c             S   s$   g | ]}| d r|dd qS )znetwork/r&   r   )r(   rg   )r"   r   r   r   r   r*     s    r   r&   r   c             3   s   | ]}| j kV  qd S )N)	non_posix)r"   r   )r   r   r   r%     s    r   c             S   s   g | ]}d | qS )z%s/r   )r"   r   r   r   r   r*     s    c                s$   g | ]}| j krd | jf qS )z%s/%s)
categoriesr6   )r"   r   )r   r   r   r*     s    zhidden/c             S   s   g | ]}| d sd| qS )zhidden/z	hidden/%s)r(   )r"   r   r   r   r   r*     s    c             s   s&   | ]}| d r|dd V  qdS )zsetup/once/r&   r   N)r(   rg   )r"   r   r   r   r   r%     s    c             s   s&   | ]}| d r|dd V  qdS )zsetup/always/r&   r   N)r(   rg   )r"   r   r   r   r   r%     s    c             s   s&   | ]}| d r|dd V  qdS )zneeds/target/r&   r   N)r(   rg   )r"   r   r   r   r   r%     s    )&r   r   r   r   r0   relpathr   rQ   rl   relative_pathreplacerh   r6   ry   rq   r   Zscript_pathr2   r   r(   r3   rI   rp   findskipsr-   Z
needs_fileZnetwork_platform	itertoolsislicer)   rg   r   rj   r!   r   r   r   )r   r0   rI   rt   r{   Z
runme_pathZaliases_pathZstatic_aliasesmodule_namegroupsr   groupZnetworksr   r   r!   )r   )rI   r   r   r   r   /  s    
&










 

$

zIntegrationTarget.__init__)	r   r   r   r   rm   r   r   r   r   r   r   )r   r   r   !  s   
c                   s    e Zd ZdZ fddZ  ZS )rJ   z?One or more targets were not matched when a match was required.c                sJ   t || _t|dkr(dd| j }nd| jd  }tt| | dS )z*
        :type patterns: set[str]
        r   zTarget patterns not matched:
%s
zTarget pattern not matched: %sr   N)r3   rK   r)   rq   r   rJ   r   )r   rK   message)r   r   r   r     s
    
z!TargetPatternsNotMatched.__init__)r   r   r   r   r   r   r   r   )r   r   rJ     s   rJ   )F)NNN)TTT)T)T)F)F)F)NNNNNFF)5r   
__future__r   r   r   r   r   r   r   r@   r   r   r   r   tencodingr   r   ior	   utilr
   r   r   r   datar   rR   TypeVarr   AttributeErrorr   r    r   r?   r<   rT   rU   rY   rZ   r\   r_   r`   ra   r]   ro   rP   r   r   rH   r   r   rJ   r   r   r   r   <module>   sZ   



  
2







:
0d$) 	