a
    xd62                     @   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rd 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   E/var/www/html/Ranjet/env/lib/python3.9/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   s   |  | j|S r   )r   r   readr   nr   r   r   r   #   s    zEchoingStdin.readc                 C   s   |  | j|S r   )r   r   readliner   r   r   r   r   &   s    zEchoingStdin.readlinec                    s    fdd j  D S )Nc                    s   g | ]}  |qS r   r   .0r   r   r   r   
<listcomp>*       z*EchoingStdin.readlines.<locals>.<listcomp>)r   	readlinesr#   r   r#   r   r&   )   s    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>-   r%   z(EchoingStdin.__iter__.<locals>.<genexpr>)iterr   r#   r   r#   r   __iter__,   s    zEchoingStdin.__iter__c                 C   s
   t | jS r   )reprr   r#   r   r   r   __repr__/   s    zEchoingStdin.__repr__N)r   )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sP| |} tr\t| S t	| S )Nr   z.Could not find binary reader for input stream.r%   )
hasattrr   r
   	TypeError
isinstancebytesencoder	   ioBytesIO)r   charsetr   r   r   r   make_input_stream3   s    


r7   c                   @   sF   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=   r>   r?   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:   r6   rA   r#   r   r   r   r@   ^   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 capturedrA   rB   rC   )r<   
ValueErrorrD   r:   r6   rA   r#   r   r   r   stderre   s
    
zResult.stderrc                 C   s"   d t| j| jrt| jndS )Nz<{} {}>okay)formattyper,   r>   r*   r#   r   r   r   r+   n   s    zResult.__repr__)N)
r,   r-   r.   __doc__r   propertyr   r@   rF   r+   r   r   r   r   r8   F   s    



r8   c                   @   sT   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)r6   env
echo_stdin
mix_stderr)r   r6   rM   rN   rO   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.)dictrM   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	rht
 }| jrNt||t_| jst
 }	|	t_nZt }| jrt|tj| jdtj|| jdt_| jst }	tj|	| jdt_| jrt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 }zt|D ]R\}}tj|||< |du rztj|= W n ty   Y n0 n
|tj|< qJ|| j o|	fV  W t|D ]B\}}|du rztj|= W n ty   Y n0 n
|tj|< q|t_|t_|t_|t_|t_|t_|t_|t_n~t|D ]B\}}|du rpztj|= W n tyl   Y n0 n
|tj|< q:|t_|t_|t_|t_|t_|t_|t_|t_0 dS )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 rB   {}
)sysr@   r   r   rstriprH   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 )NrZ   rY   rB   )r[   r@   r   rH   r]   r   r\   )r^   r`   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   r@   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_ansi)N)N)NN)r7   r6   r[   rc   r@   rF   r   ZFORCED_WIDTHrV   r   r	   rN   r   rO   r4   r5   TextIOWrapperr   Zvisible_prompt_funcZhidden_prompt_funcre   r   ri   r   osenvironget	Exception)r   r   rM   rg   Z	old_stdinZ
old_stdoutZ
old_stderrZold_forced_widthZbytes_outputZbytes_errorra   rb   re   ri   Zold_visible_prompt_funcZold_hidden_prompt_funcZold__getchar_funcZold_should_strip_ansiZold_envkeyvaluer   )rh   r   r   	isolation   s    





zCliRunner.isolationc                 K   s  d}| j |||d}	d}
d}t|tr4t|}z|d}W n ty^   | |}Y n0 zz|jf |prd|d| W n t	y } z\t
 }|j}|du rd}|dkr|}
t|tst
jt| t
jd d}W Y d}~nFd}~0  ty2 } z$|s |}
d}t
 }W Y d}~n
d}~0 0 W t
j  |	d  }| jrZd}n|	d  }n2t
j  |	d  }| jrd}n|	d  }0 W d   n1 s0    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   rM   rg   r   	prog_namer   )argsrr   rC   r   r9   )rq   r1   r   shlexsplitpopKeyErrorrS   main
SystemExitr[   r?   codeintr@   r   strrn   r]   getvaluerO   r8   )r   rR   rs   r   rM   Zcatch_exceptionsrg   extrar?   Z
outstreamsr>   r=   rr   er@   rF   r   r   r   invoke  s^    (


 

.zCliRunner.invokec                 c   s   t  }t }t | z:|V  W t | zt| W q ttfyR   Y q0 n2t | zt| W n ttfy   Y n0 0 dS )zA context manager that creates a temporary folder and changes
        the current working directory to it for isolated filesystem tests.
        N)	rk   getcwdtempfilemkdtempchdirshutilrmtreeOSErrorIOError)r   cwdtr   r   r   isolated_filesystemo  s    


zCliRunner.isolated_filesystem)NNFT)N)NNF)NNNTF)r,   r-   r.   rJ   r   rS   rV   
contextlibcontextmanagerrq   r   r   r   r   r   r   rL   t   s   

v     
\rL   )r   rk   rt   r   r[   r   rY   r   r   r   _compatr   r   r   	cStringIOr	   r4   r
   objectr   r7   r8   rL   r   r   r   r   <module>   s&   .