3
[ð]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j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   ú./tmp/pip-build-w1as9q70/click/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 j|ƒ |S )N)r   Úwrite)r   Úrvr   r   r   Ú_echo"   s    zEchoingStdin._echor   c             C   s   | j | jj|ƒƒS )N)r   r
   Úread)r   Únr   r   r   r   &   s    zEchoingStdin.readc             C   s   | j | jj|ƒƒS )N)r   r
   Úreadline)r   r   r   r   r   r   )   s    zEchoingStdin.readlinec                s   ‡ fdd„ˆ j jƒ D ƒS )Nc                s   g | ]}ˆ j |ƒ‘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   | ]}ˆ j |ƒ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#   )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| j|ƒ} tr\t| ƒS tj	| ƒ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jdƒj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jdƒj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>Ú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/   rC   rD   rE   r   r   r   r   ‹   s    
zCliRunner.__init__c             C   s
   |j pdS )zžGiven 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|j|ƒ |S )z8Returns the environment overrides for invoking a script.)ÚdictrC   Ú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_| j	|ƒ}t
rltƒ }| jrRtˆ|ƒ‰|t_| jsÆtƒ }	|	t_nZtjƒ }| jr„tˆ|ƒ‰tjˆ| jd�‰tj|| jd�t_| jsÆtjƒ }	tj|	| jd�t_| jrÔt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j|ƒ||< |dk�r¨y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|< �qÚW |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j| pdƒ ˆ jƒ jdƒ}t jj|d ƒ t j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j| pdd ƒ t jjƒ  ˆ jƒ jdƒS )NrO   r:   z
)rP   r8   r   rR   r   rQ   )rS   )r   r   r   Úhidden_inputÞ   s    
z)CliRunner.isolation.<locals>.hidden_inputc             S   s*   t jjdƒ}| r&t jj|ƒ t jjƒ  |S )Nr   )rP   Ústdinr   r8   r   rR   )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/   rP   rW   r8   r=   ÚclickpkgZ
formattingZFORCED_WIDTHrL   r   r   rD   r	   rE   r-   r.   ÚTextIOWrapperZtermuiZvisible_prompt_funcZhidden_prompt_funcrY   Úutilsr]   r   ÚosÚenvironÚgetÚ	Exception)r   r   rC   r[   Z	old_stdinZ
old_stdoutZ
old_stderrZold_forced_widthZbytes_outputZbytes_errorrU   rV   rY   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j|ƒ}y|jdƒ}W n tk
r`   | j|ƒ}Y nX zÐy|jf |prf |dœ|—Ž W n¬ t	k
rô } zVt
jƒ }	|j}|dkr®d}|dkrº|}t|tƒsät
jjt|ƒƒ t
jjdƒ d}W Y dd}~X n< tk
�r. } z|�s‚ |}d}t
jƒ }	W Y dd}~X nX W dt
jjƒ  |
d jƒ }|
d �o^|
d jƒ }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   rC   r[   r   Ú	prog_name)Úargsrh   r:   r   )r2   r3   r4   r5   r6   r7   )rg   r*   r   ÚshlexÚsplitÚpopÚKeyErrorrI   ÚmainÚ
SystemExitrP   r7   ÚcodeÚintr8   r   Ústrrd   rR   Úgetvaluer1   )r   rH   ri   r   rC   Zcatch_exceptionsr[   rE   Úextrar7   Z
outstreamsr6   r5   rh   Úer8   r=   r   r   r   Úinvoke  sL     



"zCliRunner.invokec             c   s^   t jƒ }tjƒ }t j|ƒ z
|V  W dt j|ƒ ytj|ƒ W n ttfk
rV   Y nX X dS )z‘A context manager that creates a temporary folder and changes
        the current working directory to it for isolated filesystem tests.
        N)	ra   ÚgetcwdÚtempfileÚmkdtempÚchdirÚshutilÚrmtreeÚOSErrorÚIOError)r   ÚcwdÚtr   r   r   Úisolated_filesystemg  s    


zCliRunner.isolated_filesystem)NNFT)N)NNF)NNNTFF)r$   r%   r&   r@   r   rI   rL   Ú
contextlibÚcontextmanagerrg   rv   r�   r   r   r   r   rB   v   s    

u 
NrB   )ra   rP   r{   rx   r‚   rj   Ú_compatr   r   r   Úmodulesr$   Úrsplitr^   Ú	cStringIOr   r-   r   Úobjectr	   r0   r1   rB   r   r   r   r   Ú<module>   s   -