o
    [h62                     @   s   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
mZ ddl
mZ erEd d	lmZ n
d dlZdd
l
mZ G dd deZdd ZG dd deZG dd deZdS )    N   )
formatting)termui)utils)	iteritems)PY2)string_types)StringIO)_find_binary_readerc                   @   sP   e Zd Zdd Zdd Zdd Zddd	Zdd
dZdd Zdd Z	dd Z
dS )EchoingStdinc                 C   s   || _ || _d S N)_input_output)selfinputoutput r   t/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/click/testing.py__init__   s   
zEchoingStdin.__init__c                 C   s   t | j|S r   )getattrr   )r   xr   r   r   __getattr__   s   zEchoingStdin.__getattr__c                 C   s   | j | |S r   )r   write)r   rvr   r   r   _echo   s   zEchoingStdin._echoc                 C      |  | j|S r   )r   r   readr   nr   r   r   r   #      zEchoingStdin.readc                 C   r   r   )r   r   readliner   r   r   r   r!   &   r    zEchoingStdin.readlinec                    s    fdd j  D S )Nc                    s   g | ]}  |qS r   r   .0r   r   r   r   
<listcomp>*   s    z*EchoingStdin.readlines.<locals>.<listcomp>)r   	readlinesr%   r   r%   r   r'   )      zEchoingStdin.readlinesc                    s   t  fdd jD S )Nc                 3   s    | ]}  |V  qd S r   r"   r#   r%   r   r   	<genexpr>-   s    z(EchoingStdin.__iter__.<locals>.<genexpr>)iterr   r%   r   r%   r   __iter__,   r(   zEchoingStdin.__iter__c                 C   s
   t | jS r   )reprr   r%   r   r   r   __repr__/   s   
zEchoingStdin.__repr__N)r   )__name__
__module____qualname__r   r   r   r   r!   r'   r+   r-   r   r   r   r   r      s    

r   c                 C   sf   t | drtr	| S t| }|d ur|S td| d u rd} n
t| ts(| |} tr.t| S t	| S )Nr   z.Could not find binary reader for input stream.    )
hasattrr   r
   	TypeError
isinstancebytesencoder	   ioBytesIO)r   charsetr   r   r   r   make_input_stream3   s   



r:   c                   @   sH   e Zd ZdZ	dddZedd Zedd Zed	d
 Zdd Z	dS )Resultz3Holds the captured result of an invoked CLI script.Nc                 C   s(   || _ || _|| _|| _|| _|| _d S r   runnerstdout_bytesstderr_bytes	exit_code	exceptionexc_info)r   r=   r>   r?   r@   rA   rB   r   r   r   r   I   s   
zResult.__init__c                 C   s   | j S )z(The (standard) output as unicode string.)stdoutr%   r   r   r   r   Y   s   zResult.outputc                 C   s   | j | jjdddS )z&The standard output as unicode string.replace

)r>   decoder=   r9   rD   r%   r   r   r   rC   ^   s   zResult.stdoutc                 C   s,   | j du r	td| j | jjdddS )z%The standard error as unicode string.Nzstderr not separately capturedrD   rE   rF   )r?   
ValueErrorrG   r=   r9   rD   r%   r   r   r   stderre   s
   
zResult.stderrc                 C   s$   d t| j| jrt| jS dS )Nz<{} {}>okay)formattyper.   rA   r,   r%   r   r   r   r-   n   s
   zResult.__repr__r   )
r.   r/   r0   __doc__r   propertyr   rC   rI   r-   r   r   r   r   r;   F   s    



r;   c                   @   s^   e Zd ZdZdddZdd Zdd	d
ZejdddZ						dddZ
ejdd ZdS )	CliRunnera  The CLI runner provides functionality to invoke a Click command line
    script for unittesting purposes in a isolated environment.  This only
    works in single-threaded systems without any concurrency as it changes the
    global interpreter state.

    :param charset: the character set for the input and output data.  This is
                    UTF-8 by default and should not be changed currently as
                    the reporting to Click only works in Python 2 properly.
    :param env: a dictionary with environment variables for overriding.
    :param echo_stdin: if this is set to `True`, then reading from stdin writes
                       to stdout.  This is useful for showing examples in
                       some circumstances.  Note that regular prompts
                       will automatically echo the input.
    :param mix_stderr: if this is set to `False`, then stdout and stderr are
                       preserved as independent streams.  This is useful for
                       Unix-philosophy apps that have predictable stdout and
                       noisy stderr, such that each may be measured
                       independently
    NFTc                 C   s,   |d u rd}|| _ |pi | _|| _|| _d S )Nzutf-8)r9   env
echo_stdin
mix_stderr)r   r9   rP   rQ   rR   r   r   r   r      s   

zCliRunner.__init__c                 C   s
   |j pdS )zGiven a command object it will return the default program name
        for it.  The default is the `name` attribute or ``"root"`` if not
        set.
        root)name)r   clir   r   r   get_default_prog_name   s   
zCliRunner.get_default_prog_namec                 C   s   t | j}|r|| |S )z8Returns the environment overrides for invoking a script.)dictrP   update)r   Z	overridesr   r   r   r   make_env   s   

zCliRunner.make_envc                 #   s   t | jtj}tj}tj}tj}dt_| |}t	r5t
 }| jr(t||t_| js4t
 }	|	t_n-t }| jrAt|tj| jdtj|| jdt_| jsbt }	tj|	| jdt_| jritjt_t_dfdd	}
dfdd	}dd	 }| d fd
d	}tj}tj}tj}tj}|
t_|t_|t_|t_i }zpt|D ]%\}}tj|||< |du rztj|= W q ty   Y qw |tj|< q|| j o|	fV  W t|D ]\}}|du rztj|= W q ty   Y qw |tj|< q|t_|t_|t_|t_|t_|t_|t_|t_dS t|D ]"\}}|du r2ztj|= W q ty1   Y qw |tj|< q|t_|t_|t_|t_|t_|t_|t_|t_w )a  A context manager that sets up the isolation for invoking of a
        command line tool.  This sets up stdin with the given input data
        and `os.environ` with the overrides from the given dictionary.
        This also rebinds some internals in Click to be mocked (like the
        prompt functionality).

        This is automatically done in the :meth:`invoke` method.

        .. versionadded:: 4.0
           The ``color`` parameter was added.

        :param input: the input stream to put into sys.stdin.
        :param env: the environment overrides as dictionary.
        :param color: whether the output should contain color codes. The
                      application can still override this explicitly.
        P   )encodingNc                    s>   t j| pd   d}t jd| t j  |S )N rE   {}
)sysrC   r   r!   rstriprK   flush)promptvalr   r   r   visible_input   s
   
z*CliRunner.isolation.<locals>.visible_inputc                    s.   t jd| pd t j    dS )Nr]   r\   rE   )r^   rC   r   rK   r`   r!   r_   )ra   rc   r   r   hidden_input   s   
z)CliRunner.isolation.<locals>.hidden_inputc                 S   s*   t jd}| rt j| t j  |S )Nr   )r^   stdinr   rC   r   r`   )Zechocharr   r   r   _getchar   s
   
z%CliRunner.isolation.<locals>._getcharc                    s   |d u r  S | S r   r   )streamcolor)default_colorr   r   should_strip_ansi   s   z.CliRunner.isolation.<locals>.should_strip_ansir   )NN)r:   r9   r^   rf   rC   rI   r   ZFORCED_WIDTHrY   r   r	   rQ   r   rR   r7   r8   TextIOWrapperr   Zvisible_prompt_funcZhidden_prompt_funcrh   r   rl   r   osenvironget	Exception)r   r   rP   rj   Z	old_stdinZ
old_stdoutZ
old_stderrZold_forced_widthZbytes_outputZbytes_errorrd   re   rh   rl   Zold_visible_prompt_funcZold_hidden_prompt_funcZold__getchar_funcZold_should_strip_ansiZold_envkeyvaluer   )rk   r   r   	isolation   s   




zCliRunner.isolationc                 K   s  d}| j |||d}	d}
d}t|trt|}z|d}W n ty.   | |}Y nw zz|jd|p7d|d| W nV t	yy } z.t
 }|j}|du rTd}|dkrZ|}
t|tsot
jt| t
jd d}W Y d}~n!d}~w ty } z|s |}
d}t
 }W Y d}~nd}~ww W t
j  |	d  }| jrd}n|	d  }nt
j  |	d  }| jrd}w |	d  }w W d   n1 sw   Y  t| ||||
|d	S )
a;  Invokes a command in an isolated environment.  The arguments are
        forwarded directly to the command line script, the `extra` keyword
        arguments are passed to the :meth:`~clickpkg.Command.main` function of
        the command.

        This returns a :class:`Result` object.

        .. versionadded:: 3.0
           The ``catch_exceptions`` parameter was added.

        .. versionchanged:: 3.0
           The result object now has an `exc_info` attribute with the
           traceback if available.

        .. versionadded:: 4.0
           The ``color`` parameter was added.

        :param cli: the command to invoke
        :param args: the arguments to invoke. It may be given as an iterable
                     or a string. When given as string it will be interpreted
                     as a Unix shell command. More details at
                     :func:`shlex.split`.
        :param input: the input data for `sys.stdin`.
        :param env: the environment overrides.
        :param catch_exceptions: Whether to catch any other exceptions than
                                 ``SystemExit``.
        :param extra: the keyword arguments to pass to :meth:`main`.
        :param color: whether the output should contain color codes. The
                      application can still override this explicitly.
        N)r   rP   rj   r   	prog_namer   )argsru   rF   r   r<   )rt   r4   r   shlexsplitpopKeyErrorrV   main
SystemExitr^   rB   codeintrC   r   strrq   r`   getvaluerR   r;   )r   rU   rv   r   rP   Zcatch_exceptionsrj   extrarB   Z
outstreamsrA   r@   ru   erC   rI   r   r   r   invoke  sl   (




*zCliRunner.invokec                 c   s    t  }t }t | z|V  W t | zt| W dS  ttfy,   Y dS w t | zt| W w  ttfyD   Y w w )zA context manager that creates a temporary folder and changes
        the current working directory to it for isolated filesystem tests.
        N)	rn   getcwdtempfilemkdtempchdirshutilrmtreeOSErrorIOError)r   cwdtr   r   r   isolated_filesystemo  s$   


zCliRunner.isolated_filesystem)NNFTr   )NNF)NNNTF)r.   r/   r0   rM   r   rV   rY   
contextlibcontextmanagerrt   r   r   r   r   r   r   rO   t   s    

v
\rO   )r   rn   rw   r   r^   r   r\   r   r   r   Z_compatr   r   r   	cStringIOr	   r7   r
   objectr   r:   r;   rO   r   r   r   r   <module>   s(    .