
    +h                    `    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 Z	d Z
dd	Zdd
ZddZy)    )annotationsN)Union)inspect_getfullargspec   )sqla_2c            
     P   ddl m} t               }| D ]  |j                          t	        |      } |j
                  | D cg c]2  dj                  fd|D              ft        fd|D              z   4 c}ddt        |      z  z   dj                  |      d	S c c}w )
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   config_c              3  H   K   | ]  }j                  |d       s|  ywFNget.0kds     G/var/www/html/venv/lib/python3.12/site-packages/alembic/testing/util.py	<genexpr>z$flag_combinations.<locals>.<genexpr>9   s     9Aq%a9s   ""c              3  B   K   | ]  }j                  |d         ywr   r   r   s     r   r   z$flag_combinations.<locals>.<genexpr>:   s     2AEE!UO2s   ia,)id_argnames)	sqlalchemy.testingr
   setupdatesortedcombinationsjointuplelen)r    r
   keysr   s      `r   flag_combinationsr%      s    : *5D A $<D6 "

  XX999;2T223


 3T?#$ 

s   7B#c                   t        |       d   }|D ci c]  }||j                  |       }}t        | j                        }|j	                  |       t        j                  | j                  |      } |di |S c c}w )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    )r   popdict__globals__r   typesFunctionType__code__)__fnkwpos_argsargpass_pos_argsglbnew_fns          r   resolve_lambdar5   B   sw     &d+A.H19:#S"&&+%:M:
t
 CJJrNs3F"M""	 ;s   A<c                2     ddl m ddlm  fd}|S )z&Provide MetaData for a pytest fixture.r   r	      )fixture_functionsc                B      fd} j                        |      S )Nc              3    K   ddl m} |j                         x}| _        	  | |      }|j	                  j
                         | |j                  j
                         y # |j                  j
                         w xY ww)Nr   )schema)
sqlalchemyr;   MetaDatametadata
create_alldbdrop_all)selfr;   r>   resultr
   fns       r   run_ddlz3metadata_fixture.<locals>.decorate.<locals>.run_ddlZ   sk     )'-'88Ht}-D(+##FII. !!&)),!!&)),s   B(A& 
B&BB)scope)fixture)rD   rE   r
   ddlr8   s   ` r   decoratez"metadata_fixture.<locals>.decorateY   s&    	- 4 ((s(3G<<    )r   r
    r8   )rH   rI   r
   r8   s   ` @@r   metadata_fixturerL   S   s     *#=  OrJ   c                ,    	 t        |       S #  | cY S xY w)N)int)values    r   	_safe_intrP   l   s    5zs   
 c                    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.enginesrR   getattr_currentoptionsr   )urlrX   rT   r
   rR   r/   s         r   rR   rR   s   sK    )900/5I#)hr#w-"--rJ   )function)rO   strreturnzUnion[int, str])NNF)
__future__r   r+   typingr   sqlalchemy.utilr   utilr   r%   r5   rL   rP   rR   r'   rJ   r   <module>ra      s0    #   2 .b#"2.rJ   