U
    ;»{jŸ0  ã                   @   sØ  d dl mZmZmZmZmZmZmZmZ ddl	m
Z
 ddlmZ ddlmZmZ edƒZedƒZG dd	„ d	eƒZG d
d„ deƒZG dd„ dee ƒZG dd„ dee ƒZG dd„ dee ƒZG dd„ dee ƒZG dd„ dee ƒZedk�rÔd dlm Z  ej!ddd��rÌej!ddd�Z"e"dk�r0e"dk�r0�q<e dƒ �q
e de"› �ƒ ej!d dd!�Z#e$e#ƒdk�rj�qve d"ƒ �qJe d#e#›�ƒ ej!d$d%d&d'gd(�Z%e d)e%›�ƒ ej!d*d+d,d-gd.d/�Z&e d0e&›�ƒ ne d1ƒ d2S )3é    )ÚAnyÚGenericÚListÚOptionalÚTextIOÚTypeVarÚUnionÚoverloadé   )Úget_console)ÚConsole)ÚTextÚTextTypeÚ
PromptTypeÚDefaultTypec                   @   s   e Zd ZdZdS )ÚPromptErrorz/Exception base class for prompt related errors.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú8/tmp/pip-install-zsn1f9xv/pip/pip/_vendor/rich/prompt.pyr      s   r   c                   @   s.   e Zd ZdZeddœdd„Zedœdd„ZdS )	ÚInvalidResponsezÌException to indicate a response was invalid. Raise this within process_response() to indicate an error
    and provide an error message.

    Args:
        message (Union[str, Text]): Error message.
    N)ÚmessageÚreturnc                 C   s
   || _ d S ©N©r   )Úselfr   r   r   r   Ú__init__   s    zInvalidResponse.__init__©r   c                 C   s   | j S r   r   ©r   r   r   r   Ú__rich__   s    zInvalidResponse.__rich__)r   r   r   r   r   r   r!   r   r   r   r   r      s   r   c                   @   sD  e Zd ZU dZeZeed< dZdZ	dZ
dZeee  ed< d3dd	dd
d
d
dœeee eeee  eeeddœdd„Zeed4dd	dd
d
d
ddœeee eeee  eeeeee eeef dœ
dd„ƒƒZeed5dd	dd
d
d
ddœeee eeee  eeeee edœ	dd„ƒƒZed6dd	dd
d
d
dddœeee eeee  eeeeee edœ
dd„ƒZeedœdd„Zeedœdd„Zed7eeeee edœdd„ƒZeed œd!d"„Zeed œd#d$„Zee dd%œd&d'„Z!dd(œd)d*„Z"edd+œee ed,œd-d.„ƒZ#edd+œeee eeef d/œd0d.„ƒZ#ddd1œeee ed/œd2d.„Z#dS )8Ú
PromptBaseaé  Ask the user for input until a valid response is received. This is the base class, see one of
    the concrete classes for examples.

    Args:
        prompt (TextType, optional): Prompt text. Defaults to "".
        console (Console, optional): A Console instance or None to use global console. Defaults to None.
        password (bool, optional): Enable password input. Defaults to False.
        choices (List[str], optional): A list of valid choices. Defaults to None.
        case_sensitive (bool, optional): Matching of choices should be case-sensitive. Defaults to True.
        show_default (bool, optional): Show default in prompt. Defaults to True.
        show_choices (bool, optional): Show choices in prompt. Defaults to True.
    Úresponse_typez*[prompt.invalid]Please enter a valid valuezA[prompt.invalid.choice]Please select one of the available optionsz: NÚchoicesÚ FT©ÚconsoleÚpasswordr$   Úcase_sensitiveÚshow_defaultÚshow_choices)Úpromptr'   r(   r$   r)   r*   r+   r   c                C   sT   |pt ƒ | _t|tƒr$tj|dd�n|| _|| _|d k	r>|| _|| _	|| _
|| _d S )Nr,   ©Ústyle)r   r'   Ú
isinstanceÚstrr   Zfrom_markupr,   r(   r$   r)   r*   r+   )r   r,   r'   r(   r$   r)   r*   r+   r   r   r   r   6   s    ÿýzPromptBase.__init__)r'   r(   r$   r)   r*   r+   Ústream)
r,   r'   r(   r$   r)   r*   r+   Údefaultr1   r   c          
      C   s   d S r   r   )
Úclsr,   r'   r(   r$   r)   r*   r+   r2   r1   r   r   r   ÚaskN   s    zPromptBase.ask)	r,   r'   r(   r$   r)   r*   r+   r1   r   c          	      C   s   d S r   r   )	r3   r,   r'   r(   r$   r)   r*   r+   r1   r   r   r   r4   _   s    .)r'   r(   r$   r)   r*   r+   r2   r1   c             	   C   s"   | |||||||d�}
|
||	d�S )a‚  Shortcut to construct and run a prompt loop and return the result.

        Example:
            >>> filename = Prompt.ask("Enter a filename")

        Args:
            prompt (TextType, optional): Prompt text. Defaults to "".
            console (Console, optional): A Console instance or None to use global console. Defaults to None.
            password (bool, optional): Enable password input. Defaults to False.
            choices (List[str], optional): A list of valid choices. Defaults to None.
            case_sensitive (bool, optional): Matching of choices should be case-sensitive. Defaults to True.
            show_default (bool, optional): Show default in prompt. Defaults to True.
            show_choices (bool, optional): Show choices in prompt. Defaults to True.
            stream (TextIO, optional): Optional text file open for reading to get input. Defaults to None.
        r&   ©r2   r1   r   )r3   r,   r'   r(   r$   r)   r*   r+   r2   r1   Z_promptr   r   r   r4   o   s    ù	©r2   r   c                 C   s   t d|› d�dƒS )zÊTurn the supplied default in to a Text instance.

        Args:
            default (DefaultType): Default value.

        Returns:
            Text: Text containing rendering of default value.
        ú(ú)úprompt.default)r   )r   r2   r   r   r   Úrender_default—   s    	zPromptBase.render_defaultc                 C   s–   | j  ¡ }d|_| jrJ| jrJd | j¡}d|› d�}| d¡ | |d¡ |dkr†| jr†t|t	| j
fƒr†| d¡ |  |¡}| |¡ | | j¡ |S )zšMake prompt text.

        Args:
            default (DefaultType): Default value.

        Returns:
            Text: Text to display in prompt.
        r%   ú/ú[ú]ú zprompt.choices.)r,   ÚcopyÚendr+   r$   ÚjoinÚappendr*   r/   r0   r#   r:   Úprompt_suffix)r   r2   r,   Z_choicesr$   Ú_defaultr   r   r   Úmake_prompt¢   s$    	

ÿþý


zPromptBase.make_prompt)r'   r,   r(   r1   r   c                 C   s   |j |||d�S )zòGet input from user.

        Args:
            console (Console): Console instance.
            prompt (TextType): Prompt text.
            password (bool): Enable password entry.

        Returns:
            str: String from user.
        )r(   r1   )Úinput)r3   r'   r,   r(   r1   r   r   r   Ú	get_inputÁ   s    zPromptBase.get_input©Úvaluer   c                 C   s>   | j dk	st‚| jr"| ¡ | j kS | ¡  ¡ dd„ | j D ƒkS )zÃCheck value is in the list of valid choices.

        Args:
            value (str): Value entered by user.

        Returns:
            bool: True if choice was valid, otherwise False.
        Nc                 S   s   g | ]}|  ¡ ‘qS r   ©Úlower©Ú.0Úchoicer   r   r   Ú
<listcomp>á   s     z+PromptBase.check_choice.<locals>.<listcomp>)r$   ÚAssertionErrorr)   ÚstriprK   ©r   rI   r   r   r   Úcheck_choiceÕ   s    	zPromptBase.check_choicec                 C   s„   |  ¡ }z|  |¡}W n tk
r4   t| jƒ‚Y nX | jdk	r€|  |¡sTt| jƒ‚| js€|  | jdd„ | jD ƒ 	| 
¡ ¡ ¡}|S )a  Process response from user, convert to prompt type.

        Args:
            value (str): String typed by user.

        Raises:
            InvalidResponse: If ``value`` is invalid.

        Returns:
            PromptType: The value to be returned from ask method.
        Nc                 S   s   g | ]}|  ¡ ‘qS r   rJ   rL   r   r   r   rO   ý   s     z/PromptBase.process_response.<locals>.<listcomp>)rQ   r#   Ú
ValueErrorr   Úvalidate_error_messager$   rS   Úillegal_choice_messager)   ÚindexrK   )r   rI   Úreturn_valuer   r   r   Úprocess_responseã   s    


ÿÿzPromptBase.process_response)rI   Úerrorr   c                 C   s   | j  |¡ dS )z¼Called to handle validation error.

        Args:
            value (str): String entered by user.
            error (InvalidResponse): Exception instance the initiated the error.
        N)r'   Úprint)r   rI   rZ   r   r   r   Úon_validate_error  s    zPromptBase.on_validate_errorr   c                 C   s   dS )z,Hook to display something before the prompt.Nr   r    r   r   r   Ú
pre_prompt  s    zPromptBase.pre_prompt©r1   )r1   r   c                C   s   d S r   r   )r   r1   r   r   r   Ú__call__  s    zPromptBase.__call__)r2   r1   r   c                C   s   d S r   r   )r   r2   r1   r   r   r   r_     s    r5   c             
   C   sŒ   |   ¡  |  |¡}| j| j|| j|d�}|dkr<|dkr<|S z|  |¡}W n6 tk
r€ } z|  ||¡ W Y ¢q W 5 d}~X Y q X |S q dS )z¤Run the prompt loop.

        Args:
            default (Any, optional): Optional default value.

        Returns:
            PromptType: Processed value.
        r^   r%   .N)r]   rE   rG   r'   r(   rY   r   r\   )r   r2   r1   r,   rI   rX   rZ   r   r   r   r_     s    

)r%   )r%   )r%   )r%   )N)$r   r   r   r   r0   r#   ÚtypeÚ__annotations__rU   rV   rC   r$   r   r   r   r   Úboolr   Úclassmethodr	   r   r   r   r   r4   r   r   r:   rE   rG   rS   rY   r   r\   r]   r_   r   r   r   r   r"      sì   
ÿ þ÷
ö þõ

ô þö
õ þõ
ô' ûú	ÿ 
þr"   c                   @   s   e Zd ZdZeZdS )ÚPromptzbA prompt that returns a str.

    Example:
        >>> name = Prompt.ask("Enter your name")


    N)r   r   r   r   r0   r#   r   r   r   r   rd   0  s   rd   c                   @   s   e Zd ZdZeZdZdS )Ú	IntPromptz‰A prompt that returns an integer.

    Example:
        >>> burrito_count = IntPrompt.ask("How many burritos do you want to order")

    z3[prompt.invalid]Please enter a valid integer numberN)r   r   r   r   Úintr#   rU   r   r   r   r   re   <  s   re   c                   @   s   e Zd ZdZeZdZdS )ÚFloatPromptzyA prompt that returns a float.

    Example:
        >>> temperature = FloatPrompt.ask("Enter desired temperature")

    z%[prompt.invalid]Please enter a numberN)r   r   r   r   Úfloatr#   rU   r   r   r   r   rg   H  s   rg   c                   @   sN   e Zd ZU dZeZdZddgZee	 e
d< eedœdd„Ze	ed	œd
d„ZdS )ÚConfirmzuA yes / no confirmation prompt.

    Example:
        >>> if Confirm.ask("Continue"):
                run_job()

    z#[prompt.invalid]Please enter Y or NÚyÚnr$   r6   c                 C   s.   | j \}}t|rd|› d�n
d|› d�dd�S )z8Render the default as (y) or (n) rather than True/False.r7   r8   r9   r-   )r$   r   )r   r2   ÚyesÚnor   r   r   r:   a  s    
zConfirm.render_defaultrH   c                 C   s.   |  ¡  ¡ }|| jkr t| jƒ‚|| jd kS )zConvert choices to a bool.r   )rQ   rK   r$   r   rU   rR   r   r   r   rY   f  s    

zConfirm.process_responseN)r   r   r   r   rb   r#   rU   r$   r   r0   ra   r   r   r:   rY   r   r   r   r   ri   T  s   
ri   Ú__main__)r[   zRun [i]prompt[/i] tests?T)r2   z6:rocket: Enter a number between [b]1[/b] and [b]10[/b]é   é
   z=:pile_of_poo: [prompt.invalid]Number must be between 1 and 10znumber=z=Please enter a password [cyan](must be at least 5 characters))r(   z"[prompt.invalid]password too shortz	password=zEnter a fruitZappleZorangeZpear)r$   zfruit=z'What's the best Dog? (Case INSENSITIVE)zBorder TerrierZCollieZLabradoodleF)r$   r)   zdoggie=z[b]OK :loudly_crying_face:N)'Útypingr   r   r   r   r   r   r   r	   r%   r   r'   r   Útextr   r   r   r   Ú	Exceptionr   r   r"   r0   rd   rf   re   rh   rg   rb   ri   r   Zpip._vendor.richr[   r4   Úresultr(   ÚlenZfruitZdoggier   r   r   r   Ú<module>   sT   (  
 ÿþý