Ë
    ðmxi¾8  ã                  ó`  — d dl mZ d dlmZ d dlmZ d dlZd dlZd dlZd dlm	Z	 d dl
Z
d dlZd dlZ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
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z# ddl"m$Z$ ddl"m%Z% ddl"m&Z& e%sd„ Z'e'xZ(Z)nejT                  Z(d„ Z)d„ Z+d6d„Z,d„ Z- G d„ d e.«      Z/d!„ Z0d"„ Z1d#„ Z2d$„ Z3d%„ Z4d&„ Z5e#d'„ «       Z6d(„ Z7d)„ Z8d*„ Z9d7d+„Z:d,„ Z; G d-„ d.e<«      Z=d/„ Z>	 	 	 d8d1„Z?d2„ Z@d3„ ZAd4„ ZBej†                  d0d9d5„«       ZDy):é    )Úannotations)Údeque)Ú
namedtupleN)Úchain)Ú	getsizeof)ÚAnyé   )Úconfig)Úmocké   )Úinspect)Ú
Connection)ÚColumn)ÚDropConstraint)Ú	DropTable)ÚForeignKeyConstraint)ÚMetaData)ÚTable©Úschema)ÚInteger©Ú	decorator)Údefaultdict)Úhas_refcount_gc)Úinspect_getfullargspecc                 óT   — t        j                  «        t        j                  «        y ©N)ÚgcÚcollect)Úargss    úN/home/htdocs/ttos/venv/lib/python3.12/site-packages/sqlalchemy/testing/util.pyÚnon_refcount_gc_collectr#   .   s   € Ü
�
‰
ŒÜ
�
‰
�ó    c                  ó   — y r   © r&   r$   r"   Úlazy_gcr'   7   s   € Ør$   c               #  ó¦   ‡K  — t        dddg«      } t        dt        j                  dz   «      D ]  Š | t        j                  ˆfd„«      –— Œ  y ­w)NÚpicklersÚloadsÚdumpséþÿÿÿr	   c                ó0   •— t        j                  | ‰«      S r   )Úpickler+   )ÚdÚprotocols    €r"   ú<lambda>zpicklers.<locals>.<lambda>?   s   ø€ ¬¯©°a¸Ó)B€ r$   )r   Úranger.   ÚHIGHEST_PROTOCOLr*   )Úntr0   s    @r"   r)   r)   ;   sM   øè ø€ Ü	�J ¨'Ð 2Ó	3€Bä˜"œf×5Ñ5¸Ñ9Ó:ò DˆÙ”—‘ÓBÓCÓCñDùs   ƒAAc                ó0   — t        j                  | |¬«      S )N)Úk)ÚrandomÚchoices)Ú
populationr6   s     r"   Úrandom_choicesr:   B   s   € Ü�>‰>˜*¨Ô*Ð*r$   c                óÊ   — t        | t        «      rt        | |«      S | t        j                  dd|z  z   «      z  j                  t        j                  «      t        d|«      z  S )NÚ1Ú0é
   )Ú
isinstanceÚfloatÚroundÚdecimalÚDecimalÚto_integralÚROUND_FLOORÚpow)ÚvalueÚprecs     r"   Úround_decimalrI   F   s\   € Ü�%œÔÜ�U˜DÓ!Ð!ð ”G—O‘O C¨#°©*Ñ$4Ó5Ñ5×BÑBÜ×ÑóäˆB�‹ñð r$   c                  ó0   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)Ú	RandomSetc                ó~   — t        t        j                  | «      «      }t        j                  |«       t        |«      S r   )ÚlistÚsetÚ__iter__r7   ÚshuffleÚiter)ÚselfÚls     r"   rO   zRandomSet.__iter__Q   s*   € Ü”—‘˜dÓ#Ó$ˆÜ�‰�qÔÜ�A‹wˆr$   c                ó®   — t        j                  dt        | «      dz
  «      }t        t        j                  | «      «      |   }| j                  |«       |S )Nr   r	   )r7   ÚrandintÚlenrM   rN   rO   Úremove)rR   ÚindexÚitems      r"   ÚpopzRandomSet.popV   sC   € Ü—‘˜q¤# d£)¨a¡-Ó0ˆÜ”C—L‘L Ó&Ó'¨Ñ.ˆØ�‰�DÔØˆr$   c                ó@   — t        t        j                  | |«      «      S r   )rK   rN   Úunion©rR   Úothers     r"   r\   zRandomSet.union\   s   € ÜœŸ™ 4¨Ó/Ó0Ð0r$   c                ó@   — t        t        j                  | |«      «      S r   )rK   rN   Ú
differencer]   s     r"   r`   zRandomSet.difference_   s   € ÜœŸ™¨¨eÓ4Ó5Ð5r$   c                ó@   — t        t        j                  | |«      «      S r   )rK   rN   Úintersectionr]   s     r"   rb   zRandomSet.intersectionb   s   € Üœ×)Ñ)¨$°Ó6Ó7Ð7r$   c                ó   — t        | «      S r   )rK   )rR   s    r"   ÚcopyzRandomSet.copye   s   € Ü˜‹Ðr$   N)	Ú__name__Ú
__module__Ú__qualname__rO   rZ   r\   r`   rb   rd   r&   r$   r"   rK   rK   P   s    „ òò
ò1ò6ò8ór$   rK   c                ó¬   — t        t        «      }| D ]  \  }}||   j                  |«       Œ t        |«      D ]  \  }}||d D ]  }|||   v sŒ  y Œ y)zATrue if the given sorting conforms to the given partial ordering.NFT)r   rN   ÚaddÚ	enumerate)ÚtuplesÚsorted_elementsÚdepsÚparentÚchildÚiÚnodeÚns           r"   Úconforms_partial_orderingrs   i   st   € ô ”sÓ€DØò  ‰ˆ�ØˆV‰×Ñ˜Õð ä˜_Ó-ò ‰ˆˆ4Ø   Ð$ò 	ˆAØ�t˜A‘wŠÚñ	ðð
 r$   c                óŽ   ‡‡— t        t        «      Š| D ]  \  }}‰|   j                  |«       Œ ˆˆfd„Št         ‰|«      «      S )Nc              3  óÞ   •K  — t        | «      dk(  rt        | «      –— y | D ]G  }t        | «      j                  |g«      }|j	                  ‰|   «      rŒ3 ‰|«      D ]
  }|g|z   –— Œ ŒI y ­w)Nr	   )rV   rM   rN   r`   rb   )ÚelementsÚelemÚsubsetÚsub_orderingÚ_all_orderingsÚedgess       €€r"   rz   z-all_partial_orderings.<locals>._all_orderings|   su   øè ø€ Üˆx‹=˜AÒÜ�x“.Ó à ò 4�Ü˜X›×1Ñ1°4°&Ó9�Ø×*Ñ*¨5°©;Õ7Ù(6°vÓ(>ò 4˜Ø#˜f |Ñ3Ó3ñ4ñ4ùs   ƒAA-ÁA-)r   rN   ri   rQ   )rk   rv   rn   ro   rz   r{   s       @@r"   Úall_partial_orderingsr|   w   sI   ù€ ÜœÓ€EØò !‰ˆ�Øˆe‰×Ñ˜Õ ð!õ4ô ‘˜xÓ(Ó)Ð)r$   c                ó¸   — 	 || _         | S # t        $ rE t        j                  | j                  | j
                  || j                  | j                  «      } Y | S w xY w)ac  Return a function with a given __name__.

    Will assign to __name__ and return the original function if possible on
    the Python implementation, otherwise a new function will be constructed.

    This function should be phased out as much as possible
    in favor of @decorator.   Tests that "generate" many named tests
    should be modernized.

    )re   Ú	TypeErrorÚtypesÚFunctionTypeÚ__code__Ú__globals__Ú__defaults__Ú__closure__)ÚfnÚnames     r"   Úfunction_namedr‡   ‰   sX   € ð
ØˆŒð
 €Iøô	 ò 
Ü×ÑØ�K‰K˜Ÿ™¨¨r¯©ÀÇÁó
‰ð €Ið	
ús   ‚ ‹A
AÁAc                óÄ   — | j                  «       }	  ||g|¢­i |¤Ž}| j                  ddd«       |S #  t        j                  «       } | j                  |Ž }|s‚ |cY S xY w)a  Run the given function under the given contextmanager,
    simulating the behavior of 'with' to support older
    Python versions.

    This is not necessary anymore as we have placed 2.6
    as minimum Python version, however some tests are still using
    this structure.

    N)Ú	__enter__Ú__exit__ÚsysÚexc_info)Úctxr…   ÚargÚkwÚobjÚresultrŒ   Úraise_s           r"   Úrun_as_contextmanagerr“   �   sj   € ð �-‰-‹/€Cð
Ù�CÐ$˜#Ò$ Ñ$ˆØ�‰�T˜4 Ô&ØˆøðÜ—<‘<“>ˆØ�—‘˜xÐ(ˆÙØàŠMús	   ’ 3 ³*Ac                ó>   — | D �ch c]  }t        |«      ’Œ c}S c c}w )zŠConverts the results of sql execution into a plain set of column tuples.

    Useful for asserting the results of an unordered query.
    ©Útuple)ÚresultsÚrows     r"   Úrowsetr™   ¶   s   € ð #*Ö*˜3ŒE�#�JÒ*Ð*ùÒ*s   …c                ó   — J | «       ‚r   r&   )Úmsgs    r"   Úfailrœ   ¿   s   € Ø�#Óˆ5r$   c                óp  — ddl m} t        j                  «       }|d   }t	        |dd«      }||_        	  | |i |¤Ž|j                  «        |j                  j                  }|r2t        ||«       |j                  «       j                  «        ||_        S t        |t        j                  «       ||_        S # |j                  «        |j                  j                  }|r2t        ||«       |j                  «       j                  «        ||_        w t        |t        j                  «       ||_        w xY w)ztProvide bound MetaData for a single test, dropping afterwards.

    Legacy; use the "metadata" pytest fixture.

    r	   )Úfixturesr   ÚmetadataN)Ú rž   r   r   ÚgetattrrŸ   Úclose_all_sessionsÚbaseÚ_connection_fixture_connectionÚdrop_all_tables_from_metadataÚget_transactionÚcommitr
   Údb)r…   r!   r�   rž   rŸ   rR   Ú	prev_metaÚcfcs           r"   Úprovide_metadatar«   Ã   s  € õ ä�‰Ó €HØ�‰7€DÜ˜˜j¨$Ó/€IØ€D„Mð"Ù�4ˆ˜2‰ð 	×#Ñ#Ô%ð �m‰m×:Ñ:ˆÙô *¨(°CÔ8ð
 ×ÑÓ!×(Ñ(Ô*ð "ˆ�ô *¨(´F·I±IÔ>Ø!ˆ�øð# 	×#Ñ#Ô%ð �m‰m×:Ñ:ˆÙô *¨(°CÔ8ð
 ×ÑÓ!×(Ñ(Ô*ð "ˆ�ô *¨(´F·I±IÔ>Ø!ˆ�ús   µB8 Â8A=D5c            
     óJ  ‡— t        «       }| D ]  Š|j                  ‰«       Œ t        |«      }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 )aq  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),
        )
        def test_fn(lazy, passive, raiseload): ...

    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",
        )
        def test_fn(lazy, passive, raiseload): ...

    Ú_c              3  óH   •K  — | ]  }‰j                  |d «      sŒ|–— Œ y­w©FN©Úget©Ú.0r6   r/   s     €r"   ú	<genexpr>z$flag_combinations.<locals>.<genexpr>  s   øè ø€ Ò9˜A¨¯©¨q°%­”aÑ9ùs   ƒ"›"c              3  óB   •K  — | ]  }‰j                  |d «      –— Œ y­wr¯   r°   r²   s     €r"   r´   z$flag_combinations.<locals>.<genexpr>  s   øè ø€ Ò2¨�A—E‘E˜!˜U—OÑ2ùs   ƒrp   Úaú,)Úid_Úargnames)rN   ÚupdateÚsortedr
   ÚcombinationsÚjoinr–   rV   )r¼   Úkeysr/   s     `r"   Úflag_combinationsr¿   ï   s¥   ø€ ô> ‹5€Dàò ˆØ�‰�A�ðô �$‹<€Dä×Ñð "÷

ð ð �X‰XÓ9 Ô9Ó9Ð;ÜÓ2¨TÔ2Ó2ó3ò

ð
 �3œ˜T›‘?Ñ#Ø—‘˜$“òð ùò

s   Á7B c                ó   ‡ — t        ‰ «      } ‰ |d   D �cg c]  }t        j                  «       ‘Œ c}Ž }ˆ fd„}t        j                  t        t        |«      «      D �cg c]  } ||«      f‘Œ c}i |¤ŽS c c}w c c}w )Nr   c                ó*   •‡ — ˆˆ fd„}d‰ z  |_         |S )Nc                 ó   •—  ‰di | ¤Ž‰   S )Nr&   r&   )r�   Úlambda_arg_setsÚposs    €€r"   Úfixturez<lambda_combinations.<locals>.create_fixture.<locals>.fixture&  s   ø€ Ù"Ñ( RÑ(¨Ñ-Ð-r$   zfixture_%3.3d)re   )rÄ   rÅ   rÃ   s   ` €r"   Úcreate_fixturez+lambda_combinations.<locals>.create_fixture%  s   ù€ õ	.ð +¨SÑ0ˆÔØˆr$   )r   r   ÚMockr
   r¼   r2   rV   )rÃ   r�   r!   rŽ   Úarg_setsrÆ   rp   s   `      r"   Úlambda_combinationsrÉ      sx   ø€ Ü! /Ó2€Dá¸¸Q¹Ö @°¤§¡¥Ò @ÐA€Hôô ×ÑÜ(-¬c°(«mÓ(<Ö	= 1‰>˜!ÓÒ
Ò	=ðØACñð ùò !Aùò 
>s   –A6ÁA;c                ó  — t        | «      d   }|D �ci c]  }||j                  |«      “Œ }}t        | j                  «      }|j	                  |«       t        j                  | j                  |«      } |di |¤ŽS c c}w )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   r&   )r   rZ   Údictr‚   rº   r   r€   r�   )Ú__fnr�   Úpos_argsrŽ   Úpass_pos_argsÚglbÚnew_fns          r"   Úresolve_lambdarÑ   1  sw   € ô & dÓ+¨AÑ.€HØ19Ö:¨#�S˜"Ÿ&™& ›+Ñ%Ð:€MÐ:Ü
ˆt×ÑÓ
 €CØ‡J�Jˆr„NÜ×Ñ §¡¨sÓ3€FÙÑ"�MÑ"Ð"ùò	 ;s   “A<c                ó   ‡ — ˆ fd„}|S )z&Provide MetaData for a pytest fixture.c                óH   •‡ — ˆ fd„} t        j                  ‰¬«      |«      S )Nc              3  ó$  •K  — t        j                  «       x}| _        	  ‰| |«      }|j                  t        j
                  «       |–— |j                  t        j
                  «       y # |j                  t        j
                  «       w xY w­wr   )r   r   rŸ   Ú
create_allr
   r¨   Údrop_all)rR   rŸ   r‘   r…   s      €r"   Úrun_ddlz3metadata_fixture.<locals>.decorate.<locals>.run_ddlF  sh   øè ø€ Ü'-§¡Ó'8Ð8ˆH�t”}ð-Ù˜D (Ó+�Ø×#Ñ#¤F§I¡IÔ.ð ’à×!Ñ!¤&§)¡)Õ,ø�×!Ñ!¤&§)¡)Õ,üs   ƒB ,A, Á BÁ,!BÂB)Úscope)r
   rÅ   )r…   r×   Úddls   ` €r"   Údecoratez"metadata_fixture.<locals>.decorateE  s    ù€ ô		-ð )Œv�~‰~ CÔ(¨Ó1Ð1r$   r&   )rÙ   rÚ   s   ` r"   Úmetadata_fixturerÛ   B  s   ø€ ô2ð €Or$   c                 ó$   ‡ — t         ˆ fd„«       }|S )ziForce the given table names to be dropped after test complete,
    isolating for foreign key cycles

    c                óì   •— 	  | |i |¤Žt        t        j                  t        t        j                  «      ‰¬«       S # t        t        j                  t        t        j                  «      ‰¬«       w xY w)N)Úinclude_names)Údrop_all_tablesr
   r¨   r   )r…   r!   r�   Únamess      €r"   Úgozforce_drop_names.<locals>.go\  sG   ø€ ð	PÙ�t�?˜r‘?äœFŸI™I¤w¬v¯y©yÓ'9ÈÖOøŒOœFŸI™I¤w¬v¯y©yÓ'9ÈÖOús	   ƒ> ¾5A3r   )rà   rá   s   ` r"   Úforce_drop_namesrâ   V  s    ø€ ô óPó ðPð €Ir$   c                  ó    — e Zd ZdZd„ Zd„ ZeZy)Úadictz,Dict keys available as attributes.  Shadows.c                óX   — 	 | |   S # t         $ r t        j                  | |«      cY S w xY wr   )ÚKeyErrorrË   Ú__getattribute__)rR   Úkeys     r"   rç   zadict.__getattribute__i  s3   € ð	4Ø˜‘9ÐøÜò 	4Ü×(Ñ(¨¨sÓ3Ò3ð	4ús   ‚ ‡)¨)c                óD   — t        |D �cg c]  }| |   ‘Œ	 c}«      S c c}w r   r•   )rR   r¾   rè   s      r"   Ú__call__zadict.__call__o  s   € Ü¨4Ö0 C�d˜3“iÒ0Ó1Ð1ùÒ0s   ŠN)re   rf   rg   Ú__doc__rç   rê   Úget_allr&   r$   r"   rä   rä   f  s   „ Ù6ò4ò2ð �Gr$   rä   c                ó¬   ‡ ‡— ddl mŠ ˆˆ fd„}t        |t        «      s"|j	                  «       5 } ||«       d d d «       y  ||«       y # 1 sw Y   y xY w)Nr	   )Úenginesc                ó
  •— ‰j                   j                  | «       | j                  j                  s4ddlm} |j                  dd¬«      5  ‰j                  | «       d d d «       y ‰j                  | «       y # 1 sw Y   y xY w)Nr	   )Ú
assertionszCan't sort tablesF)Úassert_)Útesting_reaperÚprepare_for_drop_tablesÚdialectÚsupports_alterr    rð   Úexpect_warningsrÖ   )Ú
connectionrð   rî   rŸ   s     €€r"   rá   z)drop_all_tables_from_metadata.<locals>.gox  s{   ø€ Ø×Ñ×6Ñ6°zÔBà×!Ñ!×0Ò0Ý$à×+Ñ+Ø#¨Uð ,ó ñ .ð ×!Ñ! *Ô-÷.ð .ð
 ×Ñ˜jÕ)÷.ð .ús   ÁA9Á9B)r    rî   r?   r   Úbegin)rŸ   Úengine_or_connectionrá   r÷   rî   s   `   @r"   r¥   r¥   u  sR   ù€ Ýõ*ô Ð*¬JÔ7Ø!×'Ñ'Ó)ð 	¨ZÙˆzŒN÷	ð 	ñ 	ÐÕ ÷	ð 	ús   ¯	A
Á
Ar   c                óÆ  — |�t        |«      }|�|dk(  sJ d«       ‚|f}| j                  «       5 }t        |j                  |¬«      «      D ]ÿ  \  }}|r?|�|d   |vrŒ|j	                  t        t        |d   t        «       |d   ¬«      «      «       ŒG|sŒJ| j                  j                  sŒa|D ]™  \  }}	|�|d   |vrŒt        |d   t        «       t        dt        «      t        dt        «      |d   ¬«      }
|j	                  t        t        |
j                  j                  g|
j                  j                   g|	¬	«      «      «       Œ› �Œ 	 d d d «       y # 1 sw Y   y xY w)
Nr   z2consider_schemas and schema are mutually exclusive)Úconsider_schemasr	   r   r   ÚxÚy)r†   )rN   rø   ÚreversedÚ%sort_tables_on_foreign_key_dependencyÚexecuter   r   r   rô   rõ   r   r   r   r   Úcrü   rý   )ÚengineÚ	inspectorr   rû   rÞ   ÚconnÚ	table_keyÚfkcsÚt_keyÚfkcÚtbs              r"   rß   rß   Œ  s{  € ð Ð Ü˜MÓ*ˆàÐØð $
ò 
ð 	@à?ó	@ð 
ð #˜9Ðà	�‰‹ð %˜4Ü'Ø×;Ñ;Ø!1ð <ó ó 
ò $	‰OˆI�tñ
 à!Ð-Ø! !™¨MÑ9àØ—‘ÜÜ˜i¨™l¬H«J¸yÈ¹|ÔLóõò
 Ø—~‘~×4Ò4ØØ"&ò ‘J�E˜3à%Ð1Ø! !™H¨MÑ9à ÜØ˜a™Ü ›
Ü˜s¤GÓ,Ü˜s¤GÓ,Ø$ Q™xô�Bð —L‘LÜ&Ü0°"·$±$·&±&°¸B¿D¹D¿F¹F¸8È#ÔNóõòñ'$	÷%÷ %ñ %ús   ¯A%EÂB8EÅE c                ó$   ‡ — t         ˆ fd„«       }|S )Nc                ó`   •— 	  | |i |¤Ž‰j                  «        S # ‰j                  «        w xY wr   )Ú_clear)r…   rŽ   r�   Ú	event_clss      €r"   rÚ   z!teardown_events.<locals>.decorateÅ  s,   ø€ ð	Ù�s�>˜b‘>à×ÑÕøˆI×ÑÕús   ƒ ›-r   )r  rÚ   s   ` r"   Úteardown_eventsr  Ä  s   ø€ Üóó ðð €Or$   c                óÎ   ‡‡‡‡— d„ }t         t        t        t        t        t        t        |t
        t        t        t        iŠt        «       Št        d«      Šˆˆˆˆfd„Š ‰| «      S )z�Returns the approximate memory footprint an object and all of its
    contents.

    source: https://code.activestate.com/recipes/577504/


    c                óH   — t        j                  | j                  «       «      S r   )r   Úfrom_iterableÚitems)r/   s    r"   Údict_handlerz total_size.<locals>.dict_handlerØ  s   € Ü×"Ñ" 1§7¡7£9Ó-Ð-r$   r   c           
     óú   •— t        | «      ‰v ry‰j                  t        | «      «       t        | ‰«      }‰j                  «       D ]2  \  }}t	        | |«      sŒ|t        t        ‰ || «      «      «      z  } |S  |S )Nr   )Úidri   r   r  r?   ÚsumÚmap)ÚoÚsÚtypÚhandlerÚall_handlersÚdefault_sizeÚseenÚsizeofs       €€€€r"   r  ztotal_size.<locals>.sizeofæ  s{   ø€ Üˆa‹5�D‰=ØØ�‰”�A“ŒÜ�a˜Ó&ˆà(×.Ñ.Ó0ò 	‰LˆC�Ü˜!˜SÕ!Ø”Sœ˜V¡W¨Q£ZÓ0Ó1Ñ1�ØØˆð		ð ˆr$   )r–   rQ   rM   r   rË   rN   Ú	frozensetr   )r  r  r  r  r  r  s     @@@@r"   Ú
total_sizer!  Ï  sR   û€ ò.ô 	ŒtÜŒdÜŒtÜˆlÜŒTÜ”4ð€Lô ‹5€DÜ˜Q“<€L÷
ñ �!‹9Ðr$   c                ó¬   — | g}t        «       }d}|rB|j                  d«      }||u r|dz  }n$t        |t        «      r|rt	        |«      |gz   |z   }|rŒB|S )z�given a cache key tuple, counts how many instances of actual
    tuples are found.

    used to alert large jumps in cache key complexity.

    r   r	   )ÚobjectrZ   r?   r–   rM   )ÚtupÚstackÚsentinelÚnum_elementsrw   s        r"   Úcount_cache_key_tuplesr(  õ  sh   € ð ˆE€Eä‹x€HØ€Lá
Ø�y‰y˜‹|ˆØ�8ÑØ˜AÑ‰LÜ˜œeÔ$ÙÜ˜T›
 h ZÑ/°%Ñ7�ò ð Ðr$   c           	   #  ó  K  — t        j                   «       }d –— t        j                   «       |z
  }|| kD  r&	  |«        t        j                  d|d›d| › d�«       y y # t        j                  d|d›d| › d�«       w xY w­w)Nztest took too long (z.4fz seconds > ú))Útimer
   Ú	skip_test)ÚsecondsÚcleanupÚnowÚsecs       r"   Úskip_if_timeoutr1    sƒ   è ø€ ô �)‰)‹+€CÛ	Ü
�)‰)‹+˜Ñ
€CØ
ˆW‚}ð	ÙŒIä×ÑØ& s¨3 i¨{¸7¸)À1ÐEõð	 øô ×ÑØ& s¨3 i¨{¸7¸)À1ÐEõüs   ‚5B ¸A ¿B ÁA=Á=B )r	   )Úfunction)Nr   N)r-  r@   r.  r   )EÚ
__future__r   Úcollectionsr   r   Ú
contextlibrB   r   Ú	itertoolsr   r.   r7   r‹   r   r+  r   Útypingr   r    r
   r   r   r  r   r   r   r   r   r   r   r   ÚsqlÚsql.sqltypesr   Úutilr   r   r   r   r#   Ú
gc_collectr'   r    r)   r:   rI   rN   rK   rs   r|   r‡   r“   r™   rœ   r«   r¿   rÉ   rÑ   rÛ   râ   rË   rä   r¥   rß   r  r!  r(  Úcontextmanagerr1  r&   r$   r"   ú<module>r=     s<  ðõ #å Ý "Û Û Û 	Ý Û Û Û 
Ý Û Û Ý å Ý Ý Ý Ý Ý #Ý Ý )Ý Ý Ý Ý "Ý Ý Ý "Ý )ñ òð 3Ð2€J‘ð —‘€JòòDó+òô�ô ò2ò*ò$ò(ò2+òð ñ("ó ð("òV.òbò"#ó"ò(ô ˆDô ò!ð4 ØØó5òpò#òLð, ×Ñóó ñr$   