a
    g	g                     @  sl   d dl mZ d dlZd dl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_getfullargspecc                    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 W/var/www/html/llm_bihealth/app/venv/lib/python3.9/site-packages/alembic/testing/util.py	<genexpr>8       z/flag_combinations.<locals>.<listcomp>.<genexpr>c                 3  s   | ]}  |d V  qdS r   r	   r   r   r   r   r   9   r   )jointuple)r   keysr   r   
<listcomp>7   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                   sN   t | d } fdd|D }t| j}|  t| j|}|f i |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>K   r   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_lambdaA   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  sZ   ddl m} |  }| _z,| |}| j |V  W | j n| j 0 d S )Nr   )schema)
sqlalchemyr2   ZMetaDatametadataZ
create_alldbZdrop_all)selfr2   r4   result)r   fnr   r   run_ddlY   s    
z3metadata_fixture.<locals>.decorate.<locals>.run_ddl)Zscope)Zfixture)r8   r9   r   ddlr1   )r8   r   decorateX   s    z"metadata_fixture.<locals>.decorate)r   r    r1   )r;   r<   r   r:   r   metadata_fixtureR   s    r>   strzUnion[int, str])valuereturnc                 C  s    z
t | W S    |  Y S 0 d S )N)int)r@   r   r   r   	_safe_intk   s    
rC   Fc           	      C  s   ddl m} ddlm} ddlm} tdd td|D }|dk }|sZt	|j
jd	d
}|rp|rjd|ini }ni }|| |fi |S )Nr   r   )testing_engine)__version__c                 S  s   g | ]}t |qS r   )rC   )r   xr   r   r   r   x   r   z"testing_engine.<locals>.<listcomp>z(\d+|[abc]\d))   Zfuture_engineFfuture)r   r   Zsqlalchemy.testing.enginesrD   r3   rE   r   refindallgetattr_currentoptions)	urlrM   rH   r   rD   rE   Z_versZsqla_1xr'   r   r   r   rD   r   s    rD   )r/   )NNF)
__future__r   rI   r+   typingr   Zsqlalchemy.utilr   r#   r.   r>   rC   rD   r   r   r   r   <module>   s   1
