B
    `KI              
   @   s  d dl Zd dlZd dl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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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lmZ d dlmZ d dlmZ d dl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lm Z  d dl!m"Z" d dl#m$Z$ erjddl%m&Z& dZ'e(dd d!Z)e ee* d"d#d$d%Z+G d&d' d'ed'd(eee,ef  fd)eed*  fd+ee* fgZ-eej.d,d-G d.d/ d/Z/ed0eed1e,f e0f d2Z1ej.G d3d" d"Z2e
e/ dd4d5Z3eee/e2f  e
e/ d6d7d8Z4e/dd9d:d;Z5erd d<l6m7Z7 G d=d> d>e2Z8G d?d@ d@e2Z9G dAdB dBe2Z:G dCdD dDe2Z;G dEdF dFe2Z<G dGdH dHe2Z=eG dIdJ dJZ>e> Z?eG dKdL dLee*ef Z@dS )M    N)Any)Callable)
Collection)Iterable)Iterator)List)Mapping)MutableMapping)
NamedTuple)Optional)overload)Sequence)Set)Tuple)Type)TYPE_CHECKING)TypeVar)Union   )getfslineno)ascii_escaped)final)NOTSET)
NotSetType)Config)fail)PytestUnknownMarkWarning)NodeZempty_parameter_set_mark)returnc             C   s   t | dot| dddkS )N__call____name__z<lambda>)hasattrgetattr)func r$   _/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/_pytest/mark/structures.py
istestfunc)   s    
r&   MarkDecorator)configargnamesr   c             C   s   ddl m} t|\}}d||j||f }| t}|dkrJtj|d}nR|dkrbtj|dd}n:|d	kr|j}	t|\}
}|	d
|	|d f nt
||S )Nr   )	Collectorz0got empty parameter set %r, function %s at %s:%d) Nskip)reasonxfailF)r-   runZfail_at_collectz&Empty parameter set in '%s' at line %d   )nodesr*   r   r    getiniEMPTY_PARAMETERSET_OPTIONMARK_GENr,   r.   ZCollectErrorLookupError)r(   r)   r#   r*   fslinenor-   Zrequested_markmarkf_name_r$   r$   r%   get_empty_parameterset_mark0   s&    
r;   c               @   sN  e Zd Zedddeedeed  f ee d dddZ	eded e
e ef ed d
ddZeeeee eedf f eed e
e ef  eeee eedf f ef dddZeeed e
e ef  eed  dddZeeeee eedf f eed e
e ef  eeeeee eedf f ed  f dddZdS )ParameterSetr$   N)marksidr'   )r'   Mark)valuesr=   r>   r   c            G   s^   t |tr|f}nt |tjjs$t|d k	rRt |tsJtdt	||t
|}| |||S )Nz(Expected id to be a string, got {}: {!r})
isinstancer'   collectionsabcr   AssertionErrorstr	TypeErrorformattyper   )clsr=   r>   r@   r$   r$   r%   paramW   s    

zParameterSet.paramF)parametersetforce_tupler   c             C   s.   t || r|S |r| |S | |g ddS dS )aj  Extract from an object or objects.

        :param parameterset:
            A legacy style parameterset that may or may not be a tuple,
            and may or may not be wrapped into a mess of mark objects.

        :param force_tuple:
            Enforce tuple wrapping so single argument tuple values
            don't get decomposed and break tests.
        N)r=   r>   )rA   rJ   )rI   rK   rL   r$   r$   r%   extract_fromk   s
    

zParameterSet.extract_from.)r)   	argvaluesr   c             O   s<   t | ttfs0dd | dD } t| dk}nd}| |fS )Nc             S   s   g | ]}|  r|  qS r$   )strip).0xr$   r$   r%   
<listcomp>   s    z8ParameterSet._parse_parametrize_args.<locals>.<listcomp>,r0   F)rA   tuplelistsplitlen)r)   rN   argskwargsrL   r$   r$   r%   _parse_parametrize_args   s
    z$ParameterSet._parse_parametrize_args)rN   rL   r   c                s    fdd| D S )Nc                s   g | ]}t j| d qS ))rL   )r<   rM   )rP   rQ   )rL   r$   r%   rR      s    z>ParameterSet._parse_parametrize_parameters.<locals>.<listcomp>r$   )rN   rL   r$   )rL   r%   _parse_parametrize_parameters   s    z*ParameterSet._parse_parametrize_parameters)r)   rN   r(   nodeidr   c          	   C   s   |  ||\}}| ||}~|rpxx|D ]B}t|jt|kr(d}	t|	j||j|t|t|jddd q(W n,t|||}
|tt	ft| |
gd d ||fS )Nz{nodeid}: in "parametrize" the number of names ({names_len}):
  {names}
must be equal to the number of values ({values_len}):
  {values})r\   r@   namesZ	names_lenZ
values_lenF)pytrace)r@   r=   r>   )
rZ   r[   rW   r@   r   rG   r;   appendr<   r   )rI   r)   rN   r#   r(   r\   rL   
parametersrJ   msgr8   r$   r$   r%   _for_parametrize   s&    	
zParameterSet._for_parametrize)F)r    
__module____qualname__classmethodobjectr   r   r   rE   rJ   r   boolrM   staticmethodr   r   r   rZ   r[   r   rb   r$   r$   r$   r%   r<   M   s*   
 ,r<   r@   r=   )r'   r?   r>   T)frozenc               @   s   e Zd ZejedZejeedf dZ	eje
eef dZejed  dddZejeee  dddZedddZd d d	d
dZdS )r?   )rH   .NF)rH   defaultrepr)r   c             C   s   d| j kpt| jdkS )Nids   )rY   rW   rX   )selfr$   r$   r%   _has_param_ids   s    zMark._has_param_ids)otherr   c             C   s^   | j |j kstd}| j dkr8| r,|}n|  r8| }t| j | j|j t| jf|j|dS )zReturn a new Mark which is a combination of this
        Mark and another Mark.

        Combines by appending args and merging kwargs.

        :param Mark other: The mark to combine with.
        :rtype: Mark
        Nparametrize)param_ids_from)namerD   ro   r?   rX   dictrY   )rn   rp   rr   r$   r$   r%   combined_with   s    	

zMark.combined_with)r    rc   rd   attribrE   rs   r   r   rX   r   rY   r   Z_param_ids_fromr   Z_param_ids_generatedrg   ro   ru   r$   r$   r$   r%   r?      s   r?   	_Markable.)boundc               @   s   e Zd ZdZejeejedZ	e
edddZe
eedf dddZe
eeef dd	d
Ze
edddZedddZeed dddZeeedddZeeed dddZeedddZdS )r'   aJ  A decorator for applying a mark on test functions and classes.

    MarkDecorators are created with ``pytest.mark``::

        mark1 = pytest.mark.NAME              # Simple MarkDecorator
        mark2 = pytest.mark.NAME(name1=value) # Parametrized MarkDecorator

    and can then be applied as decorators to test functions::

        @mark2
        def test_function():
            pass

    When a MarkDecorator is called it does the following:

    1. If called with a single class as its only positional argument and no
       additional keyword arguments, it attaches the mark to the class so it
       gets applied automatically to all test cases found in that class.

    2. If called with a single function as its only positional argument and
       no additional keyword arguments, it attaches the mark to the function,
       containing all the arguments already stored internally in the
       MarkDecorator.

    3. When called in any other case, it returns a new MarkDecorator instance
       with the original MarkDecorator's content updated with the arguments
       passed to this call.

    Note: The rules above prevent MarkDecorators from storing only a single
    function or class reference as their positional argument with no
    additional keyword or positional arguments. You can work around this by
    using `with_args()`.
    )rH   Z	validator)r   c             C   s   | j jS )zAlias for mark.name.)r8   rs   )rn   r$   r$   r%   rs   %  s    zMarkDecorator.name.c             C   s   | j jS )zAlias for mark.args.)r8   rX   )rn   r$   r$   r%   rX   *  s    zMarkDecorator.argsc             C   s   | j jS )zAlias for mark.kwargs.)r8   rY   )rn   r$   r$   r%   rY   /  s    zMarkDecorator.kwargsc             C   s   | j S )N)rs   )rn   r$   r$   r%   markname4  s    zMarkDecorator.marknamec             C   s   d| j dS )Nz<MarkDecorator >)r8   )rn   r$   r$   r%   __repr__8  s    zMarkDecorator.__repr__)rX   rY   r   c             O   s    t | j||}| | j|S )zReturn a MarkDecorator with extra arguments added.

        Unlike calling the MarkDecorator, with_args() can be used even
        if the sole argument is a callable/class.

        :rtype: MarkDecorator
        )r?   rs   	__class__r8   ru   )rn   rX   rY   r8   r$   r$   r%   	with_args;  s    zMarkDecorator.with_args)argr   c             C   s   d S )Nr$   )rn   r   r$   r$   r%   r   I  s    zMarkDecorator.__call__c             O   s   d S )Nr$   )rn   rX   rY   r$   r$   r%   r   M  s    )rX   rY   c             O   sN   |rB|sB|d }t |}t|dkrBt|s2|rBt|| j |S | j||S )zCall the MarkDecorator.r   r0   )inspectisclassrW   r&   
store_markr8   r~   )rn   rX   rY   r#   Zis_classr$   r$   r%   r   Q  s    
N)r    rc   rd   __doc__rv   rw   r?   Z
validatorsZinstance_ofr8   propertyrE   rs   r   r   rX   r   rY   rz   r|   rf   r~   r   rx   r   r$   r$   r$   r%   r'      s"   "c             C   s$   t | dg }t|ts|g}t|S )z7Obtain the unpacked marks that are stored on an object.
pytestmark)r"   rA   rU   normalize_mark_list)obj	mark_listr$   r$   r%   get_unpacked_marks\  s    
r   )r   r   c             C   sD   dd | D }x&|D ]}t |tstd|dqW dd |D S )zNormalize marker decorating helpers to mark objects.

    :type List[Union[Mark, Markdecorator]] mark_list:
    :rtype: List[Mark]
    c             S   s   g | ]}t |d |qS )r8   )r"   )rP   r8   r$   r$   r%   rR   k  s    z'normalize_mark_list.<locals>.<listcomp>zgot z instead of Markc             S   s   g | ]}t |tr|qS r$   )rA   r?   )rP   rQ   r$   r$   r%   rR   p  s    )rA   r?   rF   )r   Z	extractedr8   r$   r$   r%   r   d  s
    

r   )r8   r   c             C   s&   t |tst|t| |g | _dS )zjStore a Mark on an object.

    This is used to implement the Mark declarations/decorators correctly.
    N)rA   r?   rD   r   r   )r   r8   r$   r$   r%   r   s  s    r   )_Scopec               @   s6   e Zd ZeeedddZed	eddddZdS )
_SkipMarkDecorator)r   r   c             C   s   d S )Nr$   )rn   r   r$   r$   r%   r     s    z_SkipMarkDecorator.__call__.r'   )r-   r   c             C   s   d S )Nr$   )rn   r-   r$   r$   r%   r     s    N).)r    rc   rd   r   rx   r   rE   r$   r$   r$   r%   r     s   r   c               @   s8   e Zd Zdddeeef eeef eedddZdS )_SkipifMarkDecorator.)r-   )	condition
conditionsr-   r   c            G   s   d S )Nr$   )rn   r   r-   r   r$   r$   r%   r     s    z_SkipifMarkDecorator.__call__N).)r    rc   rd   r   rE   rg   r'   r   r$   r$   r$   r%   r     s   r   c               @   st   e Zd ZeeedddZed	dddddeeef eeef eeee	e
 ee	e
 df f eedddZdS )
_XfailMarkDecorator)r   r   c             C   s   d S )Nr$   )rn   r   r$   r$   r%   r     s    z_XfailMarkDecorator.__call__.)r-   r/   raisesstrict)r   r   r-   r/   r   r   r   c            G   s   d S )Nr$   )rn   r   r-   r/   r   r   r   r$   r$   r%   r     s    
N).)r    rc   rd   r   rx   r   r   rE   rg   r   BaseExceptionr   r'   r$   r$   r$   r%   r     s   :r   c               @   s   e Zd Zddddeeee eedf f eeee	e
 e
f  eee	e f eeeedeeeef  eegee
 f f  ee edddZdS )_ParametrizeMarkDecorator.)indirectrl   scopeN)r)   rN   r   rl   r   r   c            C   s   d S )Nr$   )rn   r)   rN   r   rl   r   r$   r$   r%   r     s    z"_ParametrizeMarkDecorator.__call__)r    rc   rd   r   rE   r   r   r   r<   r   rf   rg   r   floatintr   r   r   r'   r   r$   r$   r$   r%   r     s   tr   c               @   s   e Zd ZeedddZdS )_UsefixturesMarkDecorator)fixturesr   c             G   s   d S )Nr$   )rn   r   r$   r$   r%   r     s    z"_UsefixturesMarkDecorator.__call__N)r    rc   rd   rE   r'   r   r$   r$   r$   r%   r     s   r   c               @   s   e Zd ZeedddZdS )_FilterwarningsMarkDecorator)filtersr   c             G   s   d S )Nr$   )rn   r   r$   r$   r%   r     s    z%_FilterwarningsMarkDecorator.__call__N)r    rc   rd   rE   r'   r   r$   r$   r$   r%   r     s   r   c               @   sx   e Zd ZU dZdZee ed< e Z	e
e ed< erdeed< eed< eed< eed< eed	< eed
< eedddZdS )MarkGeneratora  Factory for :class:`MarkDecorator` objects - exposed as
    a ``pytest.mark`` singleton instance.

    Example::

         import pytest

         @pytest.mark.slowtest
         def test_function():
            pass

    applies a 'slowtest' :class:`Mark` on ``test_function``.
    N_config_markersr,   Zskipifr.   rq   Zusefixturesfilterwarnings)rs   r   c             C   s   |d dkrt d| jd k	r|| jkrfx<| jdD ],}|dd dd  }| j| q6W || jkr| jjjs| jjj	rt
|ddd	 |d
krd}t
d| d td| td tt|di S )Nr   r:   z*Marker name must NOT start with underscoremarkers:(z, not found in `markers` configuration optionF)r^   )ZparameterizeZparametriseZparameteriseTz	Unknown 'z#' mark, did you mean 'parametrize'?zUnknown pytest.mark.%s - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.htmlr   r$   )AttributeErrorr   r   r2   rV   rO   addoptionZstrict_markersr   r   warningswarnr   r'   r?   )rn   rs   linemarkerZ__tracebackhide__r$   r$   r%   __getattr__  s*    


zMarkGenerator.__getattr__)r    rc   rd   r   r   r   r   __annotations__setr   r   rE   r   r   r   r   r   r   r   r'   r   r$   r$   r$   r%   r     s   
r   c               @   s   e Zd ZdddddZeedddZeedd	d
dZeddddZe	e dddZ
ee dddZedddZedddZdS )NodeKeywordsr   N)noder   c             C   s   || _ |j| _|jdi| _d S )NT)r   parentrs   r   )rn   r   r$   r$   r%   __init__  s    zNodeKeywords.__init__)keyr   c             C   s8   y
| j | S  tk
r2   | jd kr& | jj| S X d S )N)r   KeyErrorr   keywords)rn   r   r$   r$   r%   __getitem__  s    

zNodeKeywords.__getitem__)r   valuer   c             C   s   || j |< d S )N)r   )rn   r   r   r$   r$   r%   __setitem__  s    zNodeKeywords.__setitem__c             C   s   t dd S )Nz"cannot delete key in keywords dict)
ValueError)rn   r   r$   r$   r%   __delitem__  s    zNodeKeywords.__delitem__)r   c             C   s   |   }t|S )N)_seeniter)rn   seenr$   r$   r%   __iter__!  s    zNodeKeywords.__iter__c             C   s&   t | j}| jd k	r"|| jj |S )N)r   r   r   updater   )rn   r   r$   r$   r%   r   %  s    

zNodeKeywords._seenc             C   s   t |  S )N)rW   r   )rn   r$   r$   r%   __len__+  s    zNodeKeywords.__len__c             C   s   d| j  dS )Nz<NodeKeywords for node r{   )r   )rn   r$   r$   r%   r|   .  s    zNodeKeywords.__repr__)r    rc   rd   r   rE   r   r   r   r   r   r   r   r   r   r   r|   r$   r$   r$   r%   r     s   r   )Acollections.abcrB   r   r   typingr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   rv   _coder   compatr   r   r   r   Z_pytest.configr   Z_pytest.outcomesr   Z_pytest.warning_typesr   r1   r   r3   rg   r&   rE   r;   rf   r<   sr?   rH   rx   r'   r   r   r   Z_pytest.fixturesr   r   r   r   r   r   r   r   r4   r   r$   r$   r$   r%   <module>   sx   
w1] 		E