B
    f                 @  sp   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 Z	d	d
 Z
dddZdddddZdddZdS )    )annotationsN)Union)inspect_getfullargspec   )sqla_2c                sd   ddl m} t  x| D ]} | qW t  |j fdd| D ddt   d dS )	a  A facade around @testing.combinations() oriented towards boolean
    keyword-based arguments.

    Basically generates a nice looking identifier based on the keywords
    and also sets up the argument names.

    E.g.::

        @testing.flag_combinations(
            dict(lazy=False, passive=False),
            dict(lazy=True, passive=False),
            dict(lazy=False, passive=True),
            dict(lazy=False, passive=True, raiseload=True),
        )


    would result in::

        @testing.combinations(
            ('', False, False, False),
            ('lazy', True, False, False),
            ('lazy_passive', True, True, False),
            ('lazy_passive', True, True, True),
            id_='iaaa',
            argnames='lazy,passive,raiseload'
        )

    r   )configc               s<   g | ]4 d   fddD ft fddD  qS )_c             3  s   | ]}  |d r|V  qdS )FN)get).0k)d VC:\Users\Lenovo\AppData\Local\Temp\pip-unpacked-wheel-q6xnih48\alembic\testing\util.py	<genexpr>9   s    z/flag_combinations.<locals>.<listcomp>.<genexpr>c             3  s   | ]}  |d V  qdS )FN)r	   )r
   r   )r   r   r   r   :   s    )jointuple)r
   )keys)r   r   
<listcomp>9   s   z%flag_combinations.<locals>.<listcomp>ia,)Zid_argnames)sqlalchemy.testingr   setupdatesortedcombinationslenr   )r   r   r   r   )r   r   flag_combinations   s    

r   c               sJ   t | d } fdd|D }t| j}|  t| j|}|f |S )zGiven a no-arg lambda and a namespace, return a new lambda that
    has all the values filled in.

    This is used so that we can have module-level fixtures that
    refer to instance-level variables using lambdas.

    r   c               s   i | ]}  ||qS r   )pop)r
   arg)kwr   r   
<dictcomp>L   s    z"resolve_lambda.<locals>.<dictcomp>)r   dict__globals__r   typesFunctionType__code__)Z__fnr!   Zpos_argsZpass_pos_argsZglbZnew_fnr   )r!   r   resolve_lambdaB   s    	

r(   functionc               s,   ddl m  ddlm  fdd}|S )z&Provide MetaData for a pytest fixture.r   )r      )fixture_functionsc               s    fdd}j d|S )Nc          	   3  sN   ddl m} |  }| _z | |}| j |V  W d | j X d S )Nr   )schema)Z
sqlalchemyr,   ZMetaDatametadataZ
create_alldbZdrop_all)selfr,   r-   result)r   fnr   r   run_ddlZ   s    

z3metadata_fixture.<locals>.decorate.<locals>.run_ddl)Zscope)Zfixture)r1   r2   )r   ddlr+   )r1   r   decorateY   s    z"metadata_fixture.<locals>.decorate)r   r    r+   )r3   r4   r   )r   r3   r+   r   metadata_fixtureS   s    r6   strzUnion[int, str])valuereturnc             C  s   yt | S    | S d S )N)int)r8   r   r   r   	_safe_intl   s    r;   Fc             C  sT   ddl m} ddlm} |s,t|jjdd}tsB|r<d|ini }ni }|| |f|S )Nr   )r   )testing_engineZfuture_engineFfuture)r   r   Zsqlalchemy.testing.enginesr<   getattr_currentoptionsr   )urlr@   r=   r   r<   r!   r   r   r   r<   s   s    r<   )r)   )NNF)
__future__r   r%   typingr   Zsqlalchemy.utilr   utilr   r   r(   r6   r;   r<   r   r   r   r   <module>   s   1
