o
    h                     @  sj   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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 | ] 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 h/var/www/html/construction_image-detection-poc/venv/lib/python3.10/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,)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|}|d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>L   s    z"resolve_lambda.<locals>.<dictcomp>Nr   )r   dict__globals__r!   typesFunctionType__code__)__fnr)   pos_argspass_pos_argsglbnew_fnr   r(   r   resolve_lambdaB   s   	

r5   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 d S | j w )Nr   )schema)
sqlalchemyr9   MetaDatametadata
create_alldbdrop_all)selfr9   r<   result)r   fnr   r   run_ddlZ   s   
z3metadata_fixture.<locals>.decorate.<locals>.run_ddl)scope)fixture)rB   rC   r   ddlr8   )rB   r   decorateY   s   z"metadata_fixture.<locals>.decorate)r   r    r8   )rG   rH   r   rF   r   metadata_fixtureS   s   rJ   valuestrreturnUnion[int, str]c                 C  s   zt | W S    |  Y S )N)int)rK   r   r   r   	_safe_intl   s   
rP   Fc                 C  sX   ddl m} ddlm} |st|jjdd}ts!|rd|ini }ni }|| |fi |S )Nr   r   )testing_enginefuture_engineFfuture)r   r   sqlalchemy.testing.enginesrQ   getattr_currentoptionsr   )urlrW   rS   r   rQ   r)   r   r   r   rQ   s   s   rQ   )r6   )rK   rL   rM   rN   )NNF)
__future__r   r-   typingr   sqlalchemy.utilr   utilr   r%   r5   rJ   rP   rQ   r   r   r   r   <module>   s   1

