§
    eŠtjE(  ã                  óú   — d Z ddlmZ ddlZddlZddlZddlZddl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Zn# e$ r dZY nw xY wdZ	 da	 d
„ Z G d„ d¦  «        Zdd„Zej        dd„¦   «         ZdS )z§Profiling support for unit and performance tests.

These are special purpose profiling methods which operate
in a more fine-grained way than nose's profiling plugin.

é    )ÚannotationsNé   )Úconfig)Ú
gc_collecté   )Úfreethreading)Úhas_compiled_extc                óX   — | a t          j        rt                               ¦   «          d S d S ©N)Ú_current_testÚ_profile_statsÚforce_writeÚreset_count)Úid_s    úZ/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sqlalchemy/testing/profiling.pyÚ_start_current_testr   6   s4   € à€MåÔ!ð %Ý×"Ò"Ñ$Ô$Ð$Ð$Ð$ð%ð %ó    c                  óZ   — e Zd ZdZdd„Zed„ ¦   «         Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ ZdS )ÚProfileStatsFilezøStore per-platform/fn profiling results in a file.

    There was no json module available when this was written, but now
    the file format which is very deterministically line oriented is kind of
    handy in any case for diffs and merges.

    Ú
cumulativeNc                óü  — t           j        d uot           j        j        | _        | j        pt           j        d uot           j        j        | _        t          j                             |¦  «        | _	        t          j         
                    | j	        ¦  «        d         | _        t          j        d„ ¦  «        | _        || _        || _        |                      ¦   «          | j        r|                      ¦   «          d S d S )Néÿÿÿÿc                 ó4   — t          j        t          ¦  «        S r   )ÚcollectionsÚdefaultdictÚdict© r   r   ú<lambda>z+ProfileStatsFile.__init__.<locals>.<lambda>Q   s   € •KÔ+­DÑ1Ô1€ r   )r   ÚoptionsÚforce_write_profilesr   Úwrite_profilesÚwriteÚosÚpathÚabspathÚfnameÚsplitÚshort_fnamer   r   ÚdataÚdumpÚsortÚ_readÚ_write)ÚselfÚfilenamer+   r*   s       r   Ú__init__zProfileStatsFile.__init__G   sØ   € åŒN $Ð&ÐN­6¬>Ô+Nð 	Ôð Ô%ð 
ÝŒN $Ð&ÐH­6¬>Ô+Hð 	Œ
õ ”W—_’_ XÑ.Ô.ˆŒ
Ýœ7Ÿ=š=¨¬Ñ4Ô4°RÔ8ˆÔÝÔ+Ø1Ð1ñ
ô 
ˆŒ	ð ˆŒ	ØˆŒ	Ø�
Š
‰ŒˆØŒ:ð 	ð �KŠK‰MŒMˆMˆMˆMð	ð 	r   c                óö  — t           j        j        dz   t           j        j        z   }t           j        j        j        r|dz  }t           j        j        dk    r8t           j        j                             t           j        j        ¦  «        r|dz  }d                     d„ t          j
        dd…         D ¦   «         ¦  «        }t          r|d	z  }t          j        ¦   «         t          j        ¦   «                              ¦   «         t          j        ¦   «                              ¦   «         ||g}|                     d
¦  «         t%          ¦   «         }|                     |rdpd¦  «         d                     |¦  «        S )NÚ_Ú_asyncÚsqliteÚ_fileú.c                ó,   — g | ]}t          |¦  «        ‘ŒS r   ©Ústr)Ú.0Úvs     r   ú
<listcomp>z1ProfileStatsFile.platform_key.<locals>.<listcomp>g   s   € ÐEÐEÐE¨!�s 1™vœvÐEÐEÐEr   r   r   ÚtÚdbapiunicodeÚcextensionsÚnocextensions)r   ÚdbÚnameÚdriverÚdialectÚis_asyncÚ_is_url_file_dbÚurlÚjoinÚsysÚversion_infor   ÚplatformÚmachineÚsystemÚlowerÚpython_implementationÚappendr	   )r.   Ú	dbapi_keyÚ
py_versionÚplatform_tokensÚ	_has_cexts        r   Úplatform_keyzProfileStatsFile.platform_key[   sK  € å”I”N SÑ(­6¬9Ô+;Ñ;ˆ	ÝŒ9ÔÔ%ð 	"Ø˜Ñ!ˆIåŒ9Œ>˜XÒ%Ð%­&¬)Ô*;×*KÒ*KÝŒIŒMñ+
ô +
Ð%ð ˜Ñ ˆIð —X’XÐEÐE­sÔ/?ÀÀ!ÀÔ/DÐEÑEÔEÑFÔFˆ
Ýð 	Ø˜#ÑˆJõ ÔÑÔÝŒOÑÔ×#Ò#Ñ%Ô%ÝÔ*Ñ,Ô,×2Ò2Ñ4Ô4ØØð
ˆð 	×Ò˜~Ñ.Ô.Ð.Ý$Ñ&Ô&ˆ	Ø×Ò˜yÐ:¨]ÐM¸oÑNÔNÐNØ�xŠx˜Ñ(Ô(Ð(r   c                óJ   — t           }|| j        v o| j        | j        |         v S r   ©r   r)   rU   )r.   Útest_keys     r   Ú	has_statszProfileStatsFile.has_statsx   s*   € Ý ˆà˜œ	Ð!ÐN dÔ&7¸4¼9ÀXÔ;NÐ&Nð	
r   c                óh  — t           }| j        |         }|| j                 }d|vrg x|d<   }n|d         }d|vrdx|d<   }n|d         }t          |¦  «        |k    }|s3|                     |¦  «         | j        r|                      ¦   «          d }n|d         ||         f}|dxx         dz  cc<   |S )NÚcountsÚcurrent_countr   Úlinenor   )r   r)   rU   ÚlenrP   r"   r-   )	r.   Ú	callcountrX   Úper_fnÚper_platformr[   r\   Ú	has_countÚresults	            r   rc   zProfileStatsFile.result~   sê   € Ý ˆØ”˜8Ô$ˆØ˜dÔ/Ô0ˆà˜<Ð'Ð'Ø.0Ð0ˆL˜Ñ" V Và! (Ô+ˆFà ,Ð.Ð.Ø<=Ð=ˆL˜Ñ)¨M¨Mà(¨Ô9ˆMå˜‘K”K -Ò/ˆ	àð 	CØ�MŠM˜)Ñ$Ô$Ð$ØŒzð Ø—’‘”�ØˆFˆFà! (Ô+¨V°MÔ-BÐBˆFØ�_Ð%Ð%Ô%¨Ñ*Ð%Ð%Ñ%Øˆr   c                óš   — t           }|| j        vrd S | j        |         }| j        |vrd S || j                 }d|v rg |d         d d …<   d S d S )Nr[   rW   )r.   rX   r`   ra   s       r   r   zProfileStatsFile.reset_count™   ss   € Ý ˆð ˜4œ9Ð$Ð$ØˆFØ”˜8Ô$ˆØÔ FÐ*Ð*ØˆFØ˜dÔ/Ô0ˆØ�|Ð#Ð#Ø(*ˆL˜Ô" 1 1 1Ñ%Ð%Ð%ð $Ð#r   c                óä   — t           }| j        |         }|| j                 }|d         }|d         }|t          |¦  «        k     r	|||dz
  <   n||d<   | j        r|                      ¦   «          d S d S )Nr[   r\   r   r   )r   r)   rU   r^   r"   r-   )r.   r_   rX   r`   ra   r[   r\   s          r   ÚreplacezProfileStatsFile.replace¦   s…   € Ý ˆØ”˜8Ô$ˆØ˜dÔ/Ô0ˆØ˜hÔ'ˆØ$ _Ô5ˆØ�3˜v™;œ;Ò&Ð&Ø(1ˆF�= 1Ñ$Ñ%Ð%à"ˆF�2‰JØŒ:ð 	Ø�KŠK‰MŒMˆMˆMˆMð	ð 	r   c                ó   — d| j         z  S )Na  # %s
# This file is written out on a per-environment basis.
# For each test in aaa_profiling, the corresponding function and 
# environment is located within this file.  If it doesn't exist,
# the test is skipped.
# If a callcount does exist, it is compared to what we received. 
# assertions are raised if the counts do not match.
# 
# To add a new callcount test, apply the function_call_count 
# decorator and re-run the tests using the --write-profiles 
# option - this file will be rewritten including the new count.
# 
)r&   )r.   s    r   Ú_headerzProfileStatsFile._header³   s   € ðð ŒZñ!ð 	r   c                óº  — 	 t          | j        ¦  «        }n# t          $ r Y d S w xY wt          |¦  «        D ]�\  }}|                     ¦   «         }|r|                     d¦  «        rŒ1|                     ¦   «         \  }}}| j        |         }||         }d„ |                     d¦  «        D ¦   «         }	|	|d<   |dz   |d<   d|d<   Œ�|                     ¦   «          d S )	Nú#c                ó,   — g | ]}t          |¦  «        ‘ŒS r   )Úint©r:   Úcounts     r   r<   z*ProfileStatsFile._read.<locals>.<listcomp>Ó   s   € Ð;Ð;Ð; •�U‘”Ð;Ð;Ð;r   ú,r[   r   r]   r   r\   )	Úopenr&   ÚOSErrorÚ	enumerateÚstripÚ
startswithr'   r)   Úclose)
r.   Ú	profile_fr]   ÚlinerX   rU   r[   r`   ra   Úcs
             r   r,   zProfileStatsFile._readÆ   s  € ð	Ý˜TœZÑ(Ô(ˆIˆIøÝð 	ð 	ð 	ØˆFˆFð	øøøå% iÑ0Ô0ð 	.ð 	.‰LˆF�DØ—:’:‘<”<ˆDØð ˜4Ÿ?š?¨3Ñ/Ô/ð Øà-1¯ZªZ©\¬\Ñ*ˆH�l FØ”Y˜xÔ(ˆFØ! ,Ô/ˆLØ;Ð;¨¯ª°cÑ):Ô):Ð;Ñ;Ô;ˆAØ%&ˆL˜Ñ"Ø%+¨a¡ZˆL˜Ñ"Ø,-ˆL˜Ñ)Ð)Ø�ŠÑÔÐÐÐs   ‚ —
%¤%c           
     ó  — t          d| j        z  ¦  «         t          | j        d¦  «        }|                     |                      ¦   «         ¦  «         t          | j        ¦  «        D ]„}| j        |         }|                     d|z  ¦  «         t          |¦  «        D ]M}||         }d                     d„ |d         D ¦   «         ¦  «        }|                     |›d|›d|›d�¦  «         ŒNŒ…|                     ¦   «          d S )	NzWriting profile file %sÚwz
# TEST: %s

ro   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r   r8   rm   s     r   ú	<genexpr>z*ProfileStatsFile._write.<locals>.<genexpr>â   s(   è è € ÐLÐL¨E�S ™ZœZÐLÐLÐLÐLÐLÐLr   r[   ú ú
)	Úprintr&   rp   r"   rh   Úsortedr)   rH   ru   )r.   rv   rX   r`   rU   ra   rx   s          r   r-   zProfileStatsFile._writeÙ   s  € ÝÐ'¨$¬*Ñ4Ñ5Ô5Ð5Ý˜œ SÑ)Ô)ˆ	Ø�Š˜Ÿš™œÑ'Ô'Ð'Ý˜tœyÑ)Ô)ð 	Lð 	LˆHØ”Y˜xÔ(ˆFØ�OŠOÐ.°Ñ9Ñ:Ô:Ð:Ý & v¡¤ð Lð L�Ø% lÔ3�Ø—H’HÐLÐL°\À(Ô5KÐLÑLÔLÑLÔL�Ø—’°°°¸,¸,¸,ÈÈÈÐ JÑKÔKÐKÐKðLð 	�ŠÑÔÐÐÐr   )r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r0   ÚpropertyrU   rY   rc   r   rf   rh   r,   r-   r   r   r   r   r   >   s¶   € € € € € ðð ðð ð ð ð( ð)ð )ñ „Xð)ð8
ð 
ð 
ðð ð ð6+ð +ð +ðð ð ðð ð ð&ð ð ð&ð ð ð ð r   r   çš™™™™™©?c                ó6   ‡ ‡‡— ddl m} |ˆˆ ˆfd„¦   «         }|S )a©  Assert a target for a test case's function call count.

    The main purpose of this assertion is to detect changes in
    callcounts for various functions - the actual number is not as important.
    Callcounts are stored in a file keyed to Python version and OS platform
    information.  This file is generated automatically for new tests,
    and versioned so that unexpected changes in callcounts will be detected.

    r   )Ú	decoratorc                óÈ   •— t          ‰	¦  «        D ]
} | |i |¤Ž Œt          ‰¦  «        }t          ‰¬¦  «        5  |D ]
} | |i |¤Ž}Œ|cd d d ¦  «         S # 1 swxY w Y   d S )N)Úvariance)ÚrangeÚcount_functions)
ÚfnÚargsÚkwÚwarmÚ	timerangeÚtimeÚrvÚtimesrŠ   Úwarmups
          €€€r   Úwrapz!function_call_count.<locals>.wrapø   sÐ   ø€ å˜&‘M”Mð 	ð 	ˆDØˆB�ˆO˜ˆOˆOˆOˆOå˜%‘L”Lˆ	Ý hÐ/Ñ/Ô/ð 	ð 	Ø!ð %ð %�Ø�R˜�_ �_�_��Øð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   »AÁAÁA)Úsqlalchemy.utilrˆ   )rŠ   r”   r•   rˆ   r–   s   ```  r   Úfunction_call_countr˜   ç   sM   øøø€ ð *Ð)Ð)Ð)Ð)Ð)àðð ð ð ð ð ñ „Yðð €Kr   c              #  óü  K  — t           €t          j        d¦  «        ‚t                               ¦   «         s-t          j        s!t          j        dt          j        z  ¦  «         t          ¦   «          t          j	        ¦   «         }| 
                    ¦   «          d V — |                     ¦   «          t          j        |t          j        ¬¦  «        }|j        }t                               |¦  «        }|€d }n|\  }}t%          d||fz  ¦  «          |j        t)          j        dt          j        ¦  «        Ž  |                     ¦   «          t          j        r~t2          j                             t          j        ¦  «        \  }}t8                               d¦  «        d         }	|›d|	›|pd	›�}
|                     |
¦  «         t%          d
|
z  ¦  «         t          j        rt                               |¦  «         d S |r{tA          || z  ¦  «        }tC          ||z
  ¦  «        |k    }|rSt          j        rt                               |¦  «         d S tE          d|›d| dz  ›d|›dt          j#        ›d�	¦  «        ‚d S d S )NzcProfile is not installedzŒNo profiling stats available on this platform for this function.  Run tests with --write-profiles to add statistics to %s for this platform.)ÚstreamzPstats calls: %d Expected %sz[, ]r6   r   r2   z.profilezDumped stats to file %szAdjusted function call count z not within éd   z% of expected z, platform z;. Rerun with --write-profiles to regenerate this callcount.)$ÚcProfiler   Ú_skip_test_exceptionr   rY   r"   Ú	skip_testr(   r   ÚProfileÚenableÚdisableÚpstatsÚStatsrI   ÚstdoutÚtotal_callsrc   r   Ú
sort_statsÚrer'   r+   Úprint_statsr*   r#   r$   Úsplitextr   Ú
dump_statsr   rf   rl   ÚabsÚAssertionErrorrU   )rŠ   ÚprÚstatsr_   ÚexpectedÚexpected_countÚline_noÚbaseÚextÚ	test_nameÚdumpfileÚdevianceÚfaileds                r   rŒ   rŒ     s�  è è € åÐÝÔ)Ð*EÑFÔFÐFå×#Ò#Ñ%Ô%ð 
­nÔ.Bð 
ÝÔðõ  .Ô9ñ:ñ	
ô 	
ð 	
õ �L„L€Lå	Ô	Ñ	Ô	€BØ‡I‚I�K„K€Kà	€E€E€Eà‡J‚J�L„L€Lõ ŒL˜¥C¤JÐ/Ñ/Ô/€Eð Ô!€Iå×$Ò$ YÑ/Ô/€HàÐØˆˆà"*Ñˆ�å	Ð
(¨I°~Ð+FÑ
FÑGÔGÐGØ€EÔ•b”h˜w­Ô(;Ñ<Ô<Ð=Ð=Ø	×ÒÑÔÐÝÔð 4Ý”G×$Ò$¥^Ô%8Ñ9Ô9‰	ˆˆcÝ!×'Ò'¨Ñ,Ô,¨RÔ0ˆ	Ø $   i i°Ð1B¸
Ð1BÐCˆØ×Ò˜Ñ"Ô"Ð"ÝÐ'¨(Ñ2Ñ3Ô3Ð3åÔ!ð Ý×Ò˜yÑ)Ô)Ð)Ð)Ð)Ø	ð Ý�y 8Ñ+Ñ,Ô,ˆÝ�Y Ñ/Ñ0Ô0°8Ò;ˆàð 	ÝÔ#ð Ý×&Ò& yÑ1Ô1Ð1Ð1Ð1å$�nð "˜	˜	Ø! C™˜˜Ø&˜˜Ý&Ô3Ð3Ð3ð	ñô ð ðð ð	ð 	r   )r†   r   r   )r†   )r„   Ú
__future__r   r   Ú
contextlibr#   rK   r¢   r§   rI   Ú r   Úutilr   r   r	   rœ   ÚImportErrorr   r   r   r   r˜   ÚcontextmanagerrŒ   r   r   r   ú<module>r¾      s„  ððð ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø Ð Ð Ð Ø 	€	€	€	Ø €€€Ø €€€Ø 	€	€	€	Ø 
€
€
€
à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø #Ð #Ð #Ð #Ð #Ð #ðØ€O€O€O€OøØð ð ð Ø€H€H€Hðøøøð €ðð €ðð%ð %ð %ðfð fð fð fð fñ fô fð fðRð ð ð ð> ÔðAð Að Añ ÔðAð Að As   ¾A ÁAÁA