U
    ^g%i                     @  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                    s`   ddl m} t  | D ]} | q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 S/var/www/html/api-medvista/venv/lib/python3.8/site-packages/alembic/testing/util.py	<genexpr>9   s      z/flag_combinations.<locals>.<listcomp>.<genexpr>c                 3  s   | ]}  |d V  qdS r
   r   r   r   r   r   r   :   s     )jointuple)r   keysr   r   
<listcomp>8   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 5 | j X d S )Nr   )schema)Z
sqlalchemyr3   ZMetaDatametadataZdrop_alldbZ
create_all)selfr3   r4   result)r   fnr   r   run_ddlZ   s    

z3metadata_fixture.<locals>.decorate.<locals>.run_ddl)scope)Zfixture)r8   r9   r   ddlr2   )r8   r   decorateY   s    z"metadata_fixture.<locals>.decorate)r   r    r2   )r<   r=   r   r;   r   metadata_fixtureS   s    r?   strzUnion[int, str])valuereturnc                 C  s    z
t | W S    |  Y S X d S )N)int)rA   r   r   r   	_safe_intl   s    
rD   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.enginesrE   getattr_currentoptionsr   )urlrI   rF   r   rE   r(   r   r   r   rE   s   s    rE   )r0   )NNF)
__future__r   r,   typingr   Zsqlalchemy.utilr   utilr   r$   r/   r?   rD   rE   r   r   r   r   <module>   s   1
