Ë
    ¹Å:j…'  ã                  ó^  — 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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j6                  rd dlmZ d dlmZ ddlm Z   G d„ dejB                  jD                  «      Z"da#dd„Z$ G d„ de«      Z% G d„ de«      Z&y)é    )ÚannotationsN)Úcontextmanager)Ú	ExitStack)Úcopy)ÚTracebackType)Úurlsplit)Ú	CliRunner)ÚResult)ÚClient)ÚRequesté   )Ú
ScriptInfo)ÚSessionMixin)ÚWSGIEnvironment)ÚTestResponse)ÚFlaskc                  óT   ‡ — e Zd ZdZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zˆ xZS )ÚEnvironBuildera½  An :class:`~werkzeug.test.EnvironBuilder`, that takes defaults from the
    application.

    :param app: The Flask application to configure the environment from.
    :param path: URL path being requested.
    :param base_url: Base URL where the app is being served, which
        ``path`` is relative to. If not given, built from
        :data:`PREFERRED_URL_SCHEME`, ``subdomain``,
        :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`.
    :param subdomain: Subdomain name to append to :data:`SERVER_NAME`.
    :param url_scheme: Scheme to use instead of
        :data:`PREFERRED_URL_SCHEME`.
    :param json: If given, this is serialized as JSON and passed as
        ``data``. Also defaults ``content_type`` to
        ``application/json``.
    :param args: other positional arguments passed to
        :class:`~werkzeug.test.EnvironBuilder`.
    :param kwargs: other keyword arguments passed to
        :class:`~werkzeug.test.EnvironBuilder`.
    c                óä  •— |s|s|r|d ut        |xs |«      k7  sJ d«       ‚|€±|j                  j                  d«      xs d}|j                  d   }	|r|› d|› �}|€|j                  d   }t        |«      }
|
j                  xs |› d|
j
                  xs |› d|	j                  d«      › �}|
j                  }|
j                  r|› d	|
j                  › �}|| _	        t        ‰| �,  ||g|¢­i |¤Ž y )
Nz8Cannot pass "subdomain" or "url_scheme" with "base_url".ÚSERVER_NAMEÚ	localhostÚAPPLICATION_ROOTú.ÚPREFERRED_URL_SCHEMEz://ú/ú?)ÚboolÚconfigÚgetr   ÚschemeÚnetlocÚlstripÚpathÚqueryÚappÚsuperÚ__init__)Úselfr%   r#   Úbase_urlÚ	subdomainÚ
url_schemeÚargsÚkwargsÚ	http_hostÚapp_rootÚurlÚ	__class__s              €úb/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/flask/testing.pyr'   zEnvironBuilder.__init__1   s  ø€ ñ ¡	©ZØ˜DÐ Ü�)Ò)˜zÓ*ò=+ð 	
ð Gó	
ð +ð ÐØŸ
™
Ÿ™ }Ó5ÒD¸ˆIØ—z‘zÐ"4Ñ5ˆHáØ(˜k¨¨9¨+Ð6�	àÐ!Ø ŸZ™ZÐ(>Ñ?�
ä˜4“.ˆCà—:‘:Ò+ Ð,¨C°·
±
Ò0G¸iÐ/HØ�H—O‘O CÓ(Ð)ð+ð ð —8‘8ˆDà�yŠyØ˜˜q §¡ Ð,�àˆŒÜ‰Ñ˜˜xÐ9¨$Ò9°&Ó9ó    c                óP   —  | j                   j                  j                  |fi |¤ŽS )z³Serialize ``obj`` to a JSON-formatted string.

        The serialization will be configured according to the config associated
        with this EnvironBuilder's ``app``.
        )r%   ÚjsonÚdumps)r(   Úobjr-   s      r2   Ú
json_dumpszEnvironBuilder.json_dumpsX   s$   € ð #ˆt�x‰x�}‰}×"Ñ" 3Ñ1¨&Ñ1Ð1r3   )r   NNN)r%   r   r#   Ústrr)   ú
str | Noner*   r:   r+   r:   r,   út.Anyr-   r;   ÚreturnÚNone)r7   r;   r-   r;   r<   r9   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r'   r8   Ú__classcell__©r1   s   @r2   r   r      so   ø„ ñð0 Ø#Ø $Ø!%ð%:àð%:ð ð%:ð ð	%:ð
 ð%:ð ð%:ð ð%:ð ð%:ð 
õ%:÷N2r3   r   Ú c                 óX   — t         st        j                  j                  d«      a t         S )NÚwerkzeug)Ú_werkzeug_versionÚ	importlibÚmetadataÚversion© r3   r2   Ú_get_werkzeug_versionrL   d   s$   € õ Ü%×.Ñ.×6Ñ6°zÓBÐäÐr3   c                  ó°   ‡ — e Zd ZU dZded<   dˆ fd„Ze	 	 	 	 	 	 dd„«       Zdd„Z	 	 	 	 	 	 dd„Z	ddd	œ	 	 	 	 	 	 	 	 	 dˆ fd
„Z
dd„Z	 	 	 	 	 	 	 	 dd„Zˆ xZS )ÚFlaskClienta  Works like a regular Werkzeug test client but has knowledge about
    Flask's contexts to defer the cleanup of the request context until
    the end of a ``with`` block. For general information about how to
    use this class refer to :class:`werkzeug.test.Client`.

    .. versionchanged:: 0.12
       `app.test_client()` includes preset default environment, which can be
       set after instantiation of the `app.test_client()` object in
       `client.environ_base`.

    Basic usage is outlined in the :doc:`/testing` chapter.
    r   Úapplicationc                óˆ   •— t        ‰| �  |i |¤Ž d| _        g | _        t	        «       | _        ddt        «       › �dœ| _        y )NFz	127.0.0.1z	Werkzeug/)ÚREMOTE_ADDRÚHTTP_USER_AGENT)r&   r'   Úpreserve_contextÚ_new_contextsr   Ú_context_stackrL   Úenviron_base)r(   r,   r-   r1   s      €r2   r'   zFlaskClient.__init__}   sK   ø€ Ü‰Ñ˜$Ð) &Ò)Ø %ˆÔØ<>ˆÔÜ'›kˆÔà&Ø!*Ô+@Ó+BÐ*CÐDñ
ˆÕr3   c              /  óè  K  — | j                   €t        d«      ‚| j                  } |j                  |i |¤Ž}| j	                  |j
                  j                  «       |5  |j                  j                  ||j
                  «      }ddd«       €t        d«      ‚|–— |j                  «       }|j                  j                  |«      ry|5  |j                  j                  |||«       ddd«       | j                  |j
                  j                  j                  d«      d   |j
                  j                   |j"                  j%                  d«      «       y# 1 sw Y   ŒÕxY w# 1 sw Y   Œ|xY w­w)a’  When used in combination with a ``with`` statement this opens a
        session transaction.  This can be used to modify the session that
        the test client uses.  Once the ``with`` block is left the session is
        stored back.

        ::

            with client.session_transaction() as session:
                session['value'] = 42

        Internally this is implemented by going through a temporary test
        request context and since session handling could depend on
        request variables this function accepts the same arguments as
        :meth:`~flask.Flask.test_request_context` which are directly
        passed through.
        Nz>Cookies are disabled. Create a client with 'use_cookies=True'.z'Session backend did not open a session.ú:r   z
Set-Cookie)Ú_cookiesÚ	TypeErrorrO   Útest_request_contextÚ_add_cookies_to_wsgiÚrequestÚenvironÚsession_interfaceÚopen_sessionÚRuntimeErrorÚresponse_classÚis_null_sessionÚsave_sessionÚ_update_cookies_from_responseÚhostÚ	partitionr#   ÚheadersÚgetlist)r(   r,   r-   r%   ÚctxÚsessÚresps          r2   Úsession_transactionzFlaskClient.session_transaction‡   sR  è ø€ ð( �=‰=Ð ÜØPóð ð ×ÑˆØ&ˆc×&Ñ&¨Ð7°Ñ7ˆØ×!Ñ! #§+¡+×"5Ñ"5Ô6àñ 	HØ×(Ñ(×5Ñ5°c¸3¿;¹;ÓGˆD÷	Hð ˆ<ÜÐHÓIÐIàŠ
Ø×!Ñ!Ó#ˆà× Ñ ×0Ñ0°Ô6Øàñ 	@Ø×!Ñ!×.Ñ.¨s°D¸$Ô?÷	@ð 	×*Ñ*Ø�K‰K×Ñ×&Ñ& sÓ+¨AÑ.Ø�K‰K×ÑØ�L‰L× Ñ  Ó.õ	
÷	Hð 	Hú÷	@ð 	@üs8   ‚AE2Á'EÂAE2ÃE&Ã+A/E2ÅE#ÅE2Å&E/Å+E2c                óp   — i | j                   ¥|¥}| j                  r| j                  j                  |d<   |S )Nzwerkzeug.debug.preserve_context)rV   rS   rT   Úappend)r(   ÚotherÚouts      r2   Ú_copy_environzFlaskClient._copy_environ¹   s<   € Ø,�×"Ñ"Ð, eÐ,ˆà× Ò Ø59×5GÑ5G×5NÑ5NˆCÐ1Ñ2àˆ
r3   c                óè   — | j                  |j                  di «      «      |d<   t        | j                  g|¢­i |¤Ž}	 |j	                  «       |j                  «        S # |j                  «        w xY w)NrV   )rr   r   r   rO   Úget_requestÚclose)r(   r,   r-   Úbuilders       r2   Ú_request_from_builder_argsz&FlaskClient._request_from_builder_argsÁ   sb   € ð "&×!3Ñ!3°F·J±J¸~ÈrÓ4RÓ!Sˆˆ~ÑÜ  ×!1Ñ!1ÐC°DÒC¸FÑCˆð	Ø×&Ñ&Ó(à�M‰M�OøˆG�M‰M�Oús   ¿A ÁA1F©ÚbufferedÚfollow_redirectsc               óŽ  •— |�r!t        |d   t        j                  j                  t        t
        f«      rït        |d   t        j                  j                  «      rCt        |d   «      }| j                  |j                  xs i «      |_        |j                  «       }n—t        |d   t        «      rCt        j                  |d   | j                  | j                  i «      ¬«      j                  «       }nAt        |d   «      }| j                  |j                  «      |_        n| j                  ||«      }| j                  j                  «        t         ‰	| �E  |||¬«      }| j                  j$                  |_        | j(                  D ]  }| j                  j+                  |«       Œ | j(                  j-                  «        |S )Nr   )r%   rV   rx   )Ú
isinstancerF   Útestr   ÚdictÚBaseRequestr   rr   rV   rt   Úfrom_environrO   r^   rw   rU   ru   r&   Úopenr5   Újson_modulerT   Úenter_contextÚclear)
r(   ry   rz   r,   r-   rv   r]   ÚresponseÚcmr1   s
            €r2   r�   zFlaskClient.openÌ   sŠ  ø€ ò ”JØ�‰G”h—m‘m×2Ñ2´D¼+ÐFô
ô ˜$˜q™'¤8§=¡=×#?Ñ#?Ô@Ü˜t A™w›-�Ø'+×'9Ñ'9¸'×:NÑ:NÒ:TÐRTÓ'U�Ô$Ø!×-Ñ-Ó/‘Ü˜D ™G¤TÔ*Ü(×5Ñ5Ø˜‘G ×!1Ñ!1À×@RÑ@RÐSUÓ@Vð 6ó ç‘+“-ñ ô
 ˜t A™w›-�Ø"&×"4Ñ"4°W·_±_Ó"E�•ð ×5Ñ5°d¸FÓCˆGð
 	×Ñ×!Ñ!Ô#ä‘7‘<ØØØ-ð  ó 
ˆð
  $×/Ñ/×4Ñ4ˆÔð ×$Ñ$ò 	2ˆBØ×Ñ×-Ñ-¨bÕ1ð	2ð 	×Ñ× Ñ Ô"Øˆr3   c                óB   — | j                   rt        d«      ‚d| _         | S )NzCannot nest client invocationsT)rS   ra   ©r(   s    r2   Ú	__enter__zFlaskClient.__enter__ù   s$   € Ø× Ò ÜÐ?Ó@Ð@Ø $ˆÔØˆr3   c                óF   — d| _         | j                  j                  «        y )NF)rS   rU   ru   )r(   Úexc_typeÚ	exc_valueÚtbs       r2   Ú__exit__zFlaskClient.__exit__ÿ   s   € ð !&ˆÔØ×Ñ×!Ñ!Õ#r3   )r,   r;   r-   r;   r<   r=   )r,   r;   r-   r;   r<   zt.Iterator[SessionMixin])rp   r   r<   r   )r,   ztuple[t.Any, ...]r-   zdict[str, t.Any]r<   r   )
r,   r;   ry   r   rz   r   r-   r;   r<   r   )r<   rN   )r‹   ztype | NonerŒ   zBaseException | Noner�   zTracebackType | Noner<   r=   )r>   r?   r@   rA   Ú__annotations__r'   r   rm   rr   rw   r�   r‰   rŽ   rB   rC   s   @r2   rN   rN   m   sÒ   ø… ñð Óõ
ð ð/
Øð/
Ø&+ð/
à	!ò/
ó ð/
óbð	Ø%ð	Ø/?ð	à	ó	ð Ø!&ñ	+àð+ð ð+ð ð	+ð
 ð+ð 
õ+óZð$àð$ð (ð$ð !ð	$ð
 
÷$r3   rN   c                  óB   ‡ — e Zd ZdZdˆ fd„Z	 d	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚFlaskCliRunnerz®A :class:`~click.testing.CliRunner` for testing a Flask app's
    CLI commands. Typically created using
    :meth:`~flask.Flask.test_cli_runner`. See :ref:`testing-cli`.
    c                ó2   •— || _         t        ‰| �  di |¤Ž y )NrK   )r%   r&   r'   )r(   r%   r-   r1   s      €r2   r'   zFlaskCliRunner.__init__  s   ø€ ØˆŒÜ‰ÑÑ"˜6Ó"r3   c                ó„   •‡ — |€‰ j                   j                  }d|vrt        ˆ fd„¬«      |d<   t        ‰‰ �  ||fi |¤ŽS )ac  Invokes a CLI command in an isolated environment. See
        :meth:`CliRunner.invoke <click.testing.CliRunner.invoke>` for
        full method documentation. See :ref:`testing-cli` for examples.

        If the ``obj`` argument is not given, passes an instance of
        :class:`~flask.cli.ScriptInfo` that knows how to load the Flask
        app being tested.

        :param cli: Command object to invoke. Default is the app's
            :attr:`~flask.app.Flask.cli` group.
        :param args: List of strings to invoke the command with.

        :return: a :class:`~click.testing.Result` object.
        r7   c                 ó   •— ‰ j                   S )N)r%   rˆ   s   €r2   ú<lambda>z'FlaskCliRunner.invoke.<locals>.<lambda>(  s   ø€ ¸$¿(¹(€ r3   )Ú
create_app)r%   Úclir   r&   Úinvoke)r(   r—   r,   r-   r1   s   `   €r2   r˜   zFlaskCliRunner.invoke  sD   ù€ ð" ˆ;Ø—(‘(—,‘,ˆCà˜ÑÜ&Ó2BÔCˆF�5‰Mä‰w‰~˜c 4Ñ2¨6Ñ2Ð2r3   )r%   r   r-   r;   r<   r=   )NN)r—   r;   r,   r;   r-   r;   r<   r
   )r>   r?   r@   rA   r'   r˜   rB   rC   s   @r2   r‘   r‘   	  s<   ø„ ñõ
#ð
 04ð3Øð3Ø',ð3Ø?Dð3à	÷3ñ 3r3   r‘   )r<   r9   )'Ú
__future__r   Úimportlib.metadatarH   ÚtypingÚtÚ
contextlibr   r   r   Útypesr   Úurllib.parser   Úwerkzeug.testrF   Úclick.testingr	   r
   r   Úwerkzeug.wrappersr   r   r—   r   Úsessionsr   ÚTYPE_CHECKINGÚ_typeshed.wsgir   r   r%   r   r}   r   rG   rL   rN   r‘   rK   r3   r2   ú<module>r¦      sƒ   ðÝ "ã Û Ý %Ý  Ý Ý Ý !ã Ý #Ý  Ý  Ý 4å Ý "à‡?‚?Ý.Ý*åôC2�X—]‘]×1Ñ1ô C2ðL Ð óôY$�&ô Y$ôx!3�Yõ !3r3   