B
    L[3                 @   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mZm	Z	 ej
eddd   Zerld 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   )	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   ,lib/python3.7/site-packages/click/testing.py__init__   s    zEchoingStdin.__init__c             C   s   t | j|S )N)getattrr
   )r   xr   r   r   __getattr__   s    zEchoingStdin.__getattr__c             C   s   | j | |S )N)r   write)r   rvr   r   r   _echo"   s    zEchoingStdin._echoc             C   s   |  | j|S )N)r   r
   read)r   nr   r   r   r   &   s    zEchoingStdin.readc             C   s   |  | j|S )N)r   r
   readline)r   r   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>-   s    z*EchoingStdin.readlines.<locals>.<listcomp>)r
   	readlines)r   r   )r   r   r   ,   s    zEchoingStdin.readlinesc                s   t  fdd jD S )Nc             3   s   | ]}  |V  qd S )N)r   )r   r   )r   r   r   	<genexpr>0   s    z(EchoingStdin.__iter__.<locals>.<genexpr>)iterr
   )r   r   )r   r   __iter__/   s    zEchoingStdin.__iter__c             C   s
   t | jS )N)reprr
   )r   r   r   r   __repr__2   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 k	r&|S td| d kr<d} nt| tsP| |} 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_stream6   s    


r0   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 )N)runnerstdout_bytesstderr_bytes	exit_code	exceptionexc_info)r   r2   r3   r4   r5   r6   r7   r   r   r   r   L   s    zResult.__init__c             C   s   | j S )z(The (standard) output as unicode string.)stdout)r   r   r   r   r   [   s    zResult.outputc             C   s   | j | jjdddS )z&The standard output as unicode string.replacez

)r3   decoder2   r/   r9   )r   r   r   r   r8   `   s    zResult.stdoutc             C   s(   | j std| j | jjdddS )z%The standard error as unicode string.zstderr not separately capturedr9   z
r:   )r4   
ValueErrorr;   r2   r/   r9   )r   r   r   r   stderrf   s    zResult.stderrc             C   s"   dt | j| jrt| jpdf S )Nz<%s %s>Zokay)typer$   r6   r"   )r   r   r   r   r#   o   s    zResult.__repr__)N)
r$   r%   r&   __doc__r   propertyr   r8   r=   r#   r   r   r   r   r1   I   s   
	r1   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 krd}|| _ |pi | _|| _|| _d S )Nzutf-8)r/   env
echo_stdin
mix_stderr)r   r/   rB   rC   rD   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.)dictrB   update)r   Z	overridesr   r   r   r   make_env   s    

zCliRunner.make_envc             #   sb  t | jtj}tj}tj}tjj}dtj_| 	|}t
rlt }| jrRt||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j}tjj}tjj}tjj}|
tj_|tj_|tj_|tj_i }zzx`t|D ]T\}}tj|||< |dkrytj|= W n tk
r   Y nX n
|tj|< q`W || j o|	fV  W dxPt|D ]D\}}|dkrytj|= W n tk
r   Y nX n
|tj|< qW |t_|t_|t_|tj_|tj_|tj_|tj_|tj_X 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 z
r:   )sysr8   r   r   rstripflush)promptval)r   r   r   visible_input   s
    
z*CliRunner.isolation.<locals>.visible_inputc                s,   t j| pdd  t j    dS )NrN   r:   z
)rO   r8   r   rQ   r   rP   )rR   )r   r   r   hidden_input   s    
z)CliRunner.isolation.<locals>.hidden_inputc             S   s*   t jd}| r&t j| t j  |S )Nr   )rO   stdinr   r8   r   rQ   )Zechocharr   r   r   _getchar   s
    
z%CliRunner.isolation.<locals>._getcharc                s   |d kr  S | S )Nr   )streamcolor)default_colorr   r   should_strip_ansi   s    z.CliRunner.isolation.<locals>.should_strip_ansi)N)N)NN)r0   r/   rO   rV   r8   r=   clickpkgZ
formattingZFORCED_WIDTHrK   r   r   rC   r	   rD   r-   r.   TextIOWrapperZtermuiZvisible_prompt_funcZhidden_prompt_funcrX   Zutilsr\   r   osenvironget	Exception)r   r   rB   rZ   Z	old_stdinZ
old_stdoutZ
old_stderrZold_forced_widthZbytes_outputZbytes_errorrT   rU   rX   r\   Zold_visible_prompt_funcZold_hidden_prompt_funcZold__getchar_funcZold_should_strip_ansiZold_envkeyvaluer   )r[   r   r   	isolation   s    




zCliRunner.isolationc             K   s  d}	| j |||dP}
d}d}t|tr4t|}y|d}W n tk
r`   | |}Y nX zy|jf |prd|d| W n t	k
r } zTt
 }	|j}|dkrd}|dkr|}t|tst
jt| t
jd d}W dd}~X Y n< tk
r. } z|s |}d}t
 }	W dd}~X Y nX W dt
j  |
d  }|
d o^|
d  }X W dQ R X 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   rB   rZ   r   	prog_namer   )argsrf   r:   r   )r2   r3   r4   r5   r6   r7   )re   r*   r   shlexsplitpopKeyErrorrH   main
SystemExitrO   r7   codeintr8   r   strrb   rQ   getvaluer1   )r   rG   rg   r   rB   Zcatch_exceptionsrZ   rD   Zextrar7   Z
outstreamsr6   r5   rf   er8   r=   r   r   r   invoke  sL     



"zCliRunner.invokec             c   s^   t  }t }t | z
|V  W dt | yt| W n ttfk
rV   Y nX X dS )zA context manager that creates a temporary folder and changes
        the current working directory to it for isolated filesystem tests.
        N)	r_   getcwdtempfileZmkdtempchdirshutilZrmtreeOSErrorIOError)r   cwdtr   r   r   isolated_filesystemg  s    


zCliRunner.isolated_filesystem)NNFT)N)NNF)NNNTFF)r$   r%   r&   r?   r   rH   rK   
contextlibcontextmanagerre   rs   r|   r   r   r   r   rA   v   s    

u 
NrA   )r_   rO   rw   ru   r}   rh   Z_compatr   r   r   modulesr$   rsplitr]   Z	cStringIOr   r-   r   objectr	   r0   r1   rA   r   r   r   r   <module>   s   -