o
    ‹åg  ã                   @  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© úP/var/www/html/flaskapp/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 )zÝGiven 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

