o
    �õ±j\  ã                   @  sæ   U 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	m
Z
 e	r5d dlmZ d dlmZ dd	lmZ g d
¢ZG dd„ dƒZedeƒ d�Zded< d'dd„Zd(dd„Zd)dd„Zed*dd„ƒZe	d+d,d#d$„ƒZed-d%d&„ƒZdS ).é    )Úannotations)Ú	Generator)Úcontextmanager)Ú
ContextVar)ÚTYPE_CHECKINGÚAny)ÚInput)ÚOutputé   )ÚApplication)Ú
AppSessionÚget_app_sessionÚget_appÚget_app_or_noneÚset_appÚcreate_app_sessionÚcreate_app_session_from_ttyc                   @  sD   e Zd ZdZ	ddd	d
„Zddd„Zeddd„ƒZeddd„ƒZdS )r   aY  
    An AppSession is an interactive session, usually connected to one terminal.
    Within one such session, interaction with many applications can happen, one
    after the other.

    The input/output device is not supposed to change during one session.

    Warning: Always use the `create_app_session` function to create an
    instance, so that it gets activated correctly.

    :param input: Use this as a default input for all applications
        running in this session, unless an input is passed to the `Application`
        explicitly.
    :param output: Use this as a default output.
    NÚinputúInput | NoneÚoutputúOutput | NoneÚreturnÚNonec                 C  s   || _ || _d | _d S ©N)Ú_inputÚ_outputÚapp)Úselfr   r   © r   ú•/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/prompt_toolkit/application/current.pyÚ__init__*   s   
zAppSession.__init__Ústrc                 C  s   d| j ›d�S )NzAppSession(app=ú))r   )r   r   r   r   Ú__repr__4   s   zAppSession.__repr__r   c                 C  ó$   | j d u rddlm} |ƒ | _ | j S )Nr   ©Úcreate_input)r   Úprompt_toolkit.input.defaultsr&   )r   r&   r   r   r   r   7   ó   
zAppSession.inputr	   c                 C  r$   )Nr   ©Úcreate_output)r   Úprompt_toolkit.output.defaultsr*   )r   r*   r   r   r   r   ?   r(   zAppSession.output©NN)r   r   r   r   r   r   )r   r!   )r   r   )r   r	   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r#   Úpropertyr   r   r   r   r   r   r      s    ÿ

r   Ú_current_app_session)ÚdefaultzContextVar[AppSession]r   c                   C  s   t  ¡ S r   )r2   Úgetr   r   r   r   r   M   s   r   úApplication[Any]c                  C  s*   t  ¡ } | jdur| jS ddlm} |ƒ S )a'  
    Get the current active (running) Application.
    An :class:`.Application` is active during the
    :meth:`.Application.run_async` call.

    We assume that there can only be one :class:`.Application` active at the
    same time. There is only one terminal window, with only one stdin and
    stdout. This makes the code significantly easier than passing around the
    :class:`.Application` everywhere.

    If no :class:`.Application` is running, then return by default a
    :class:`.DummyApplication`. For practical reasons, we prefer to not raise
    an exception. This way, we don't have to check all over the place whether
    an actual `Application` was returned.

    (For applications like pymux where we can have more than one `Application`,
    we'll use a work-around to handle that.)
    Nr
   )ÚDummyApplication)r2   r4   r   Údummyr6   )Úsessionr6   r   r   r   r   Q   s
   
r   úApplication[Any] | Nonec                  C  s   t  ¡ } | jS )zj
    Get the current active (running) Application, or return `None` if no
    application is running.
    ©r2   r4   r   )r8   r   r   r   r   m   s   r   r   úGenerator[None, None, None]c                 c  s2   � t  ¡ }|j}| |_z	dV  W ||_dS ||_w )aµ  
    Context manager that sets the given :class:`.Application` active in an
    `AppSession`.

    This should only be called by the `Application` itself.
    The application will automatically be active while its running. If you want
    the application to be active in other threads/coroutines, where that's not
    the case, use `contextvars.copy_context()`, or use `Application.context` to
    run it in the appropriate context.
    Nr:   )r   r8   Úprevious_appr   r   r   r   v   s   €r   Nr   r   r   r   ú!Generator[AppSession, None, None]c              	   c  s\   � | du r	t ƒ j} |du rt ƒ j}t| |d�}t |¡}z|V  W t |¡ dS t |¡ w )z§
    Create a separate AppSession.

    This is useful if there can be multiple individual ``AppSession``'s going
    on. Like in the case of a Telnet/SSH server.
    N©r   r   )r   r   r   r   r2   ÚsetÚreset)r   r   r8   Útokenr   r   r   r   Œ   s   €
r   c                  c  sf   � ddl m}  ddlm} | dd�}|dd�}t||d��}|V  W d  ƒ dS 1 s,w   Y  dS )a‘  
    Create `AppSession` that always prefers the TTY input/output.

    Even if `sys.stdin` and `sys.stdout` are connected to input/output pipes,
    this will still use the terminal for interaction (because `sys.stderr` is
    still connected to the terminal).

    Usage::

        from prompt_toolkit.shortcuts import prompt

        with create_app_session_from_tty():
            prompt('>')
    r   r%   r)   T)Úalways_prefer_ttyr>   N)r'   r&   r+   r*   r   )r&   r*   r   r   Úapp_sessionr   r   r   r   ­   s   €

"ÿr   )r   r   )r   r5   )r   r9   )r   r5   r   r;   r,   )r   r   r   r   r   r=   )r   r=   )Ú
__future__r   Úcollections.abcr   Ú
contextlibr   Úcontextvarsr   Útypingr   r   Úprompt_toolkit.input.baser   Úprompt_toolkit.output.baser	   Úapplicationr   Ú__all__r   r2   Ú__annotations__r   r   r   r   r   r   r   r   r   r   Ú<module>   s0    /ÿ


	ÿ 