B
    `
                 @   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	m
Z ddlmZmZmZ yejddd	ZW n ek
rv   dZY nX d
d Zdd ZG dd deZG dd deZdS )z2Provider (plugin) infrastructure for ansible-test.    )absolute_importdivisionprint_functionN   )types)ABCApplicationErrorget_subclassesTPathProviderPathProvider)boundc             C   s   t t| dd dS )z9Return a list of path provider classes of the given type.c             S   s   | j | jfS )N)priority__name__)c r   W/home/dcms/DCMS/lib/python3.7/site-packages/ansible_test/_internal/provider/__init__.py<lambda>       z+get_path_provider_classes.<locals>.<lambda>)key)sortedr	   )provider_typer   r   r   get_path_provider_classes   s    r   c       	         s   t tdd |D }xh|D ]` |} fdd|D }xDx|D ]}||r>||S q>W |s^P tj|}||krtP |}q8W qW t| |dS )zJReturn the first found path provider of the given type for the given path.c             s   s   | ]}|j d kr|j V  qdS )r   N)sequence).0pcr   r   r   	<genexpr>"   s    z%find_path_provider.<locals>.<genexpr>c                s   g | ]}|j  kr|qS r   )r   )r   r   )r   r   r   
<listcomp>&   s    z&find_path_provider.<locals>.<listcomp>N)r   setis_content_rootospathdirnameProviderNotFoundForPath)	r   Zprovider_classesr    walk	sequencesZcandidate_pathZtier_classesZprovider_classparent_pathr   )r   r   find_path_provider   s    


r&   c                   s    e Zd ZdZ fddZ  ZS )r"   zPException generated when a path based provider cannot be found for a given path.c                s*   t t| d|j|f  || _|| _d S )NzNo %s found for path: %s)superr"   __init__r   r   r    )selfr   r    )	__class__r   r   r(   <   s    z ProviderNotFoundForPath.__init__)r   
__module____qualname____doc__r(   __classcell__r   r   )r*   r   r"   :   s   r"   c               @   s2   e Zd ZdZdZdZdd Zeej	dd Z
dS )r   z4Base class for provider plugins that are path based.i  c             C   s
   || _ d S )N)root)r)   r/   r   r   r   r(   H   s    zPathProvider.__init__c             C   s   dS )zBReturn True if the given path is a content root for this provider.Nr   )r    r   r   r   r   K   s    zPathProvider.is_content_rootN)r   r+   r,   r-   r   r   r(   staticmethodabcabstractmethodr   r   r   r   r   r   C   s   )r-   
__future__r   r   r   type__metaclass__r1   r    r   tutilr   r   r	   TypeVarr
   AttributeErrorr   r&   r"   r   r   r   r   r   <module>   s   
	