o
    jĎi?                     @   s   d Z ddlZddlZddlZddlZejd dkZereZ	dZ
dZG dd deZejfdd	Zd
d ZdddZdddZdS )zEGeneric wrapper for read-eval-print-loops, a.k.a. interactive shells
    N   z[PEXPECT_PROMPT>z[PEXPECT_PROMPT+c                   @   s<   e Zd ZdZeedfddZdd Zdd	d
ZdddZ	dS )REPLWrappera  Wrapper for a REPL.

    :param cmd_or_spawn: This can either be an instance of :class:`pexpect.spawn`
      in which a REPL has already been started, or a str command to start a new
      REPL process.
    :param str orig_prompt: The prompt to expect at first.
    :param str prompt_change: A command to change the prompt to something more
      unique. If this is ``None``, the prompt will not be changed. This will
      be formatted with the new and continuation prompts as positional
      parameters, so you can use ``{}`` style formatting to insert them into
      the command.
    :param str new_prompt: The more unique prompt to expect after the change.
    :param str extra_init_cmd: Commands to do extra initialisation, such as
      disabling pagers.
    Nc                 C   s   t |trtj|ddd| _n|| _| jjr!| jd | j  |d u r)|| _n| 	||
|| || _|| _|   |d urH| | d S d S )NFutf-8echoencoding)
isinstance
basestringpexpectspawnchildr   setecho
waitnoechoprompt
set_promptformatcontinuation_prompt_expect_promptrun_command)selfcmd_or_spawnorig_promptprompt_change
new_promptr   extra_init_cmd r   L/home/jeff/fluffinator/venv/lib/python3.10/site-packages/pexpect/replwrap.py__init__!   s"   


zREPLWrapper.__init__c                 C   s   | j | | j | d S )N)r   expectsendline)r   r   r   r   r   r   r   <   s   zREPLWrapper.set_promptFc                 C   s   | j j| j| jg||dS )N)timeoutasync_)r   expect_exactr   r   )r   r!   r"   r   r   r   r   @   s   zREPLWrapper._expect_promptc                 C   s   |  }|dr|d |std|r"ddlm} || ||S g }| j|d  |dd D ]}| j|d || jj	 | j| q2| j|ddkrc| j
tj | jdd td	| d|| jj	g S )
a0  Send a command to the REPL, wait for and return output.

        :param str command: The command to send. Trailing newlines are not needed.
          This should be a complete block of input that will trigger execution;
          if a continuation prompt is found after sending input, :exc:`ValueError`
          will be raised.
        :param int timeout: How long to wait for the next prompt. -1 means the
          default from the :class:`pexpect.spawn` object (default 30 seconds).
          None means to wait indefinitely.
        :param bool async_: On Python 3.4, or Python 3.3 with asyncio
          installed, passing ``async_=True`` will make this return an
          :mod:`asyncio` Future, which you can yield from to get the same
          result that this method would normally give directly.
        
 zNo command was given   )repl_run_command_asyncr   N)r!   z2Continuation prompt found - input was incomplete:
)
splitlinesendswithappend
ValueError_asyncr'   r   r   r   beforekillsignalSIGINTjoin)r   commandr!   r"   cmdlinesr'   resliner   r   r   r   D   s*   

zREPLWrapper.run_command)r    F)
__name__
__module____qualname____doc__PEXPECT_PROMPTPEXPECT_CONTINUATION_PROMPTr   r   r   r   r   r   r   r   r      s    

r   c                 C   s   t | ddS )z>Start a Python shell and return a :class:`REPLWrapper` object.z>>> z(import sys; sys.ps1={0!r}; sys.ps2={1!r})r   )r2   r   r   r   pythono   s   r<   c                 C   sf   t j| |ddd}td d | tdd   }td d | tdd   }d||}t|d|ddS )	NFr   r      z%PS1='{0}' PS2='{1}' PROMPT_COMMAND=''z\$zexport PAGER=cat)r   )r
   r   r:   r;   r   r   )r2   argsnon_printable_insertr   ps1ps2r   r   r   r   _repl_shs   s   rB   bashc                 C   s(   t jt jtd}t| d|gddS )z<Start a bash shell and return a :class:`REPLWrapper` object.z	bashrc.shz--rcfilez\[\]r?   )ospathr1   dirname__file__rB   )r2   bashrcr   r   r   rC      s   zshz--no-rcsz-Vz+Zc                 C   s   t | t|ddS )z;Start a zsh shell and return a :class:`REPLWrapper` object.z%(!..)rD   )rB   list)r2   r>   r   r   r   rJ      s   )rC   )rJ   rK   )r9   os.pathrE   r/   sysr
   version_infoPY3strr	   r:   r;   objectr   
executabler<   rB   rC   rJ   r   r   r   r   <module>   s    ^
