B
    \1                 @   sp  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d	Z	d=d
dZ
G dd deZdd Zdd Zd>ddZd?ddZG dd deZG dd deZG dd deZG dd deZG dd deZG d d! d!eZejZd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd@d,d-Zed.d/ ZdAd0d1Z d2d3 Z!dBd4d5Z"dCd6d7Z#dDd8d9Z$d:d; Z%dS )E    N   )config   )util)	decorator)inspect_getfullargspecc             C   s    t  }t| |}|j| |S )N)compound_as_predicateskipsadd)	predicatereasonrulepred r   <lib/python3.7/site-packages/sqlalchemy/testing/exclusions.pyskip_if   s    
r   c             C   s    t  }t| |}|j| |S )N)r   r	   failsr   )r   r   r   r   r   r   r   fails_if   s    
r   c               @   s   e Zd Zdd Zdd Zdd Zdd Zed	d
 Zdd Z	dd Z
dd Zdd Zdd Zejdd Zdd ZdddZd ddZdS )!r   c             C   s   t  | _t  | _t  | _d S )N)setr   r
   tags)selfr   r   r   __init__"   s    zcompound.__init__c             C   s
   |  |S )N)r   )r   otherr   r   r   __add__'   s    zcompound.__add__c             G   sl   t  }|j| j |j| j |j| j x6|D ].}|j|j |j|j |j|j q6W |S )N)r   r   updater
   r   )r   Zotherscopyr   r   r   r   r   *   s    
zcompound.addc             C   sH   t  }|jdd | jD  |jdd | jD  |j| j |S )Nc             s   s   | ]}t |V  qd S )N)NotPredicate).0failr   r   r   	<genexpr>7   s    z compound.not_.<locals>.<genexpr>c             s   s   | ]}t |V  qd S )N)r   )r   skipr   r   r   r    8   s    )r   r   r   r
   r   )r   r   r   r   r   not_5   s
    zcompound.not_c             C   s   |  tjS )N)enabled_for_configr   _current)r   r   r   r   enabled<   s    zcompound.enabledc             C   s,   x&| j | jD ]}||rdS qW dS d S )NFT)r
   unionr   )r   r   r   r   r   r   r#   @   s    zcompound.enabled_for_configc                s    fdd| j | jD S )Nc                s   g | ]}| r|  qS r   )
_as_string)r   r   )r   r   r   
<listcomp>I   s   z4compound.matching_config_reasons.<locals>.<listcomp>)r
   r&   r   )r   r   r   )r   r   matching_config_reasonsG   s    
z compound.matching_config_reasonsc             C   s$   t | j| o | p | j|S )N)boolr   intersection)r   Zinclude_tagsZexclude_tagsr   r   r   include_testN   s    zcompound.include_testc             C   s.   | j |j  | j|j | j|j d S )N)r
   r   r   r   )r   r   r   r   r   _extendT   s    zcompound._extendc                s<   t |dr|j  |S t fdd}||} |_|S )N_sa_exclusion_extendc                s    j tj| f||S )N)_dor   r$   )fnargskw)r   r   r   decorate^   s    z#compound.__call__.<locals>.decorate)hasattrr.   r-   r   )r   r0   r3   Z	decoratedr   )r   r   __call__Y   s    
zcompound.__call__c          
   c   sh   t  }|j| j| j y
d V  W n0 tk
rV } z|tj| W d d }~X Y nX |	tj d S )N)
r   r   r   r
   r&   	Exception_expect_failurer   r$   _expect_success)r   Z	all_failsexr   r   r   fail_iff   s    
 zcompound.fail_ifc       	   
   O   s   x4| j D ]*}||rd|j||f }t| qW y|||}W n4 tk
rx } z| j|||jd W d d }~X Y nX | j||jd |S d S )Nz	'%s' : %s)name)r
   __name__r'   r   Z	skip_testr6   r7   r8   )	r   Zcfgr0   r1   r2   r!   msgZreturn_valuer9   r   r   r   r/   r   s    $zcompound._doblockc             C   sD   x>| j D ]*}||rtd|||t|f  P qW t| d S )Nz%s failed as expected (%s): %s )r   printr'   strr   Zraise_from_cause)r   r   r9   r;   r   r   r   r   r7      s    zcompound._expect_failurec                sN   | j s
d S x>| j D ]}| sP qW td|d fdd| j D f d S )Nz Unexpected success for '%s' (%s)z and c             3   s   | ]}|  V  qd S )N)r'   )r   r   )r   r   r   r       s    z+compound._expect_success.<locals>.<genexpr>)r   AssertionErrorjoin)r   r   r;   r   r   )r   r   r8      s    zcompound._expect_successN)r>   )r>   )r<   
__module____qualname__r   r   r   r"   propertyr%   r#   r)   r,   r-   r5   
contextlibcontextmanagerr:   r/   r7   r8   r   r   r   r   r   !   s   
r   c             C   s
   t | gS )N)r   )Ztagnamer   r   r   requires_tag   s    rH   c             C   s   t  }|j|  |S )N)r   r   r   )Ztagnamescompr   r   r   r      s    r   c             C   s   t | } tt| |S )N)r	   r   r   )r   r   r   r   r   only_if   s    rJ   c             C   s   t | } tt| |S )N)r	   r   r   )r   r   r   r   r   succeeds_if   s    rK   c               @   s.   e Zd Zed	ddZd
ddZdddZdS )	PredicateNc                s  t |tr |j|S t |tr:|r6|jd kr6||_|S t |ttfr`t fdd|D |S t |t	rrt
| S t |tjrtd|}|std| |d}|d}|drt	dd	 |dd
D nd }t
||||dS t|r t||S dstd| d S )Nc                s   g | ]}  |qS r   )as_predicate)r   r   )clsr   r   r(      s    z*Predicate.as_predicate.<locals>.<listcomp>z.([\+\w]+)\s*(?:(>=|==|!=|<=|<|>)\s*([\d\.]+))?z(Couldn't locate DB name in predicate: %rr   r      c             s   s   | ]}t |V  qd S )N)int)r   dr   r   r   r       s    z)Predicate.as_predicate.<locals>.<genexpr>.)descriptionFzunknown predicate type: %s)
isinstancer   rM   r#   rL   rS   listr   OrPredicatetupleSpecPredicater   Zstring_typesrematch
ValueErrorgroupsplitcallableLambdaPredicaterA   )rN   r   rS   tokensdbopspecr   )rN   r   rM      s2    





(
zPredicate.as_predicateFc             C   sV   | |}|r| }| j |r&|jj nd|r8|jj nd|rBdnd|rLdndd S )Nz<no driver>z<no database>zdoesn't supportzdoes support)driverZdatabaseZdoesnt_supportZdoes_support)rS   ra   ZurlZget_driver_nameZget_backend_name)r   r   negateZbool_r   r   r   _format_description   s    
zPredicate._format_descriptionc             C   s
   t  d S )N)NotImplementedError)r   r   re   r   r   r   r'      s    zPredicate._as_string)N)F)NF)r<   rC   rD   classmethodrM   rf   r'   r   r   r   r   rL      s   #
rL   c               @   s(   e Zd Zd	ddZdd Zd
ddZdS )BooleanPredicateNc             C   s   || _ |pd| | _d S )Nz
boolean %s)valuerS   )r   rj   rS   r   r   r   r      s    zBooleanPredicate.__init__c             C   s   | j S )N)rj   )r   r   r   r   r   r5      s    zBooleanPredicate.__call__Fc             C   s   | j ||dS )N)re   )rf   )r   r   re   r   r   r   r'      s    zBooleanPredicate._as_string)N)F)r<   rC   rD   r   r5   r'   r   r   r   r   ri      s   
ri   c            	   @   sP   e Zd ZdddZejejejejej	ej
ejdd dZdd Zdd
dZdS )rX   Nc             C   s   || _ || _|| _|| _d S )N)ra   rb   rc   rS   )r   ra   rb   rc   rS   r   r   r   r      s    zSpecPredicate.__init__c             C   s   | |d ko| |d kS )Nr   r   r   )valZpairr   r   r   <lambda>  s    zSpecPredicate.<lambda>)<>z==z!=z<=z>=inZbetweenc             C   s   |j }d| j kr"| j d\}}n| j d  }}|r@|j|kr@dS |d k	rV|j|krVdS | jd k	r|d ksptdt|}t| jdr| jp| j| j }||| j	S dS d S )N+Fz%DBAPI version specs not supported yetr5   T)
ra   r]   r;   rd   rb   rA   _server_versionr4   _opsrc   )r   r   enginedialectrd   versionZoperr   r   r   r5   	  s    

zSpecPredicate.__call__Fc             C   sh   | j d k	r| |S | jd kr8|r,d| j S d| j S n,|rPd| j| j| jf S d| j| j| jf S d S )Nznot %sz%sznot %s %s %sz%s %s %s)rS   rf   rb   ra   rc   )r   r   re   r   r   r   r'   !  s    



zSpecPredicate._as_string)NNN)F)r<   rC   rD   r   operatorltgteqnelegecontainsrr   r5   r'   r   r   r   r   rX      s   
rX   c               @   s(   e Zd Zd	ddZdd Zd
ddZdS )r_   Nc                s`   t  }|d s  fdd| _n | _|p,d| _|p6i | _|rF|| _n jrV j| _nd| _d S )Nr   c                s     S )Nr   )ra   )lambda_r   r   rl   4  s    z*LambdaPredicate.__init__.<locals>.<lambda>r   zcustom function)r   r~   r1   r2   rS   __doc__)r   r~   rS   r1   r2   rc   r   )r~   r   r   1  s    


zLambdaPredicate.__init__c             C   s
   |  |S )N)r~   )r   r   r   r   r   r5   @  s    zLambdaPredicate.__call__Fc             C   s
   |  |S )N)rf   )r   r   re   r   r   r   r'   C  s    zLambdaPredicate._as_string)NNN)F)r<   rC   rD   r   r5   r'   r   r   r   r   r_   0  s   
r_   c               @   s(   e Zd Zd	ddZdd Zd
ddZdS )r   Nc             C   s   || _ || _d S )N)r   rS   )r   r   rS   r   r   r   r   H  s    zNotPredicate.__init__c             C   s   |  | S )N)r   )r   r   r   r   r   r5   L  s    zNotPredicate.__call__Fc             C   s(   | j r| || S | j|| S d S )N)rS   rf   r   r'   )r   r   re   r   r   r   r'   O  s    zNotPredicate._as_string)N)F)r<   rC   rD   r   r5   r'   r   r   r   r   r   G  s   
r   c               @   s:   e Zd ZdddZdd ZdddZd	d
 ZdddZdS )rV   Nc             C   s   || _ || _d S )N)
predicatesrS   )r   r   rS   r   r   r   r   W  s    zOrPredicate.__init__c             C   s    x| j D ]}||rdS qW dS )NTF)r   )r   r   r   r   r   r   r5   [  s    zOrPredicate.__call__Fc                s*   r
d}nd}|  fdd| jD S )Nz and z or c             3   s   | ]}|j  d V  qdS ))re   N)r'   )r   p)r   re   r   r   r    g  s    z(OrPredicate._eval_str.<locals>.<genexpr>)rB   r   )r   r   re   Zconjunctionr   )r   re   r   	_eval_stra  s
    zOrPredicate._eval_strc             C   s*   | j d k	rd| | S | j|ddS d S )NzNot T)re   )rS   rf   r   )r   r   r   r   r   _negation_strj  s    
zOrPredicate._negation_strc             C   s0   |r|  |S | jd k	r"| |S | |S d S )N)r   rS   rf   r   )r   r   re   r   r   r   r'   p  s
    


zOrPredicate._as_string)N)F)F)r<   rC   rD   r   r5   r   r   r'   r   r   r   r   rV   V  s
   

	rV   c             C   s   t | ||tjS )N)rX   r   r$   )ra   rb   rc   r   r   r   _is_excluded}  s    r   c             C   s.   |   }t| jdd}|dkr"d}|  |S )z#Return a server_version_info tuple.Zserver_version_infoNr   )Zconnectgetattrrt   close)rs   Zconnru   r   r   r   rq     s    rq   c              G   s   t dd | D S )Nc             S   s   g | ]}t |qS r   )rL   rM   )r   ra   r   r   r   r(     s    zdb_spec.<locals>.<listcomp>)rV   )dbsr   r   r   db_spec  s    r   c               C   s   t tddS )NFzmark as execute)r   ri   r   r   r   r   open  s    r   c               C   s   t tddS )NTzmarked as skip)r   ri   r   r   r   r   closed  s    r   c             C   s   t td| pdS )NTzexpected to fail)r   ri   )r   r   r   r   r     s    r   c             G   s   t t| dS )NzFuture feature)r   r_   )r0   argr   r   r   future  s    r   c             C   s
   t | |S )N)r   )ra   r   r   r   r   fails_on  s    r   c              G   s   t tdd | D S )Nc             S   s   g | ]}t |qS r   )rL   rM   )r   ra   r   r   r   r(     s    z.fails_on_everything_except.<locals>.<listcomp>)rK   rV   )r   r   r   r   fails_on_everything_except  s    r   c             C   s
   t | |S )N)r   )ra   r   r   r   r   r!     s    r!   c                s    t t fddt| D S )Nc                s   g | ]}t | qS r   )rL   rM   )r   ra   )r   r   r   r(     s    zonly_on.<locals>.<listcomp>)rJ   rV   r   Zto_list)r   r   r   )r   r   only_on  s    r   c             C   s   t t| |||S )N)r   rX   )ra   rb   rc   r   r   r   r   exclude  s    r   c             G   s"   |st dtdd |D | S )Nzno queries sent!c             S   s   g | ]}t |qS r   )rL   rM   )r   Zqueryr   r   r   r(     s    zagainst.<locals>.<listcomp>)rA   rV   )r   Zqueriesr   r   r   against  s    r   )N)N)N)N)N)N)N)N)N)&rF   rv   rY    r   r   r   Zutil.compatr   r   r   objectr   rH   r   rJ   rK   rL   ri   rX   r_   r   rV   rM   r	   r   rq   r   r   r   r   r   r   r   r!   r   r   r   r   r   r   r   <module>	   sB   

~

89$




