
    h?                         S r SSKrSSKrSSKJr  SSKJrJrJrJ	r	J
r
Jr  SSKJrJr  SrSr \R"                  " \5      rSS jrSS	 jrSS
 jrS rS r\4S jr " S S\5      rg)a;  
Interactive terminal prompts.

The :mod:`~humanfriendly.prompts` module enables interaction with the user
(operator) by asking for confirmation (:func:`prompt_for_confirmation()`) and
asking to choose from a list of options (:func:`prompt_for_choice()`). It works
by rendering interactive prompts on the terminal.
    N)interactive_prompt)HIGHLIGHT_COLOR
ansi_strip	ansi_wrapconnected_to_terminalterminal_supports_colorswarning)formatconcatenate)	MAX_ATTEMPTSTooManyInvalidRepliesloggerprepare_friendly_promptsprepare_prompt_textprompt_for_choiceprompt_for_confirmationprompt_for_inputretry_limit
   c                    [        U SS9nU(       a  SOUb  SOSnUS[        U[        S9-  -  n[        R                  S	[	        U5      R                  5       5        [        5        H  n[        US
USS9nUR                  5       S;   a  [        R                  SU5          gUR                  5       S;   a  [        R                  SU5          gU(       d&  Ub#  [        R                  SU(       a  SOS5        Us  $ U(       a  SU-  OSn[        R                  SU(       a  SOSUU[        5        [        SU(       a  SOS
US9  M     g)a  
Prompt the user for confirmation.

:param question: The text that explains what the user is confirming (a string).
:param default: The default value (a boolean) or :data:`None`.
:param padding: Refer to the documentation of :func:`prompt_for_input()`.
:returns: - If the user enters 'yes' or 'y' then :data:`True` is returned.
          - If the user enters 'no' or 'n' then :data:`False`  is returned.
          - If the user doesn't enter any text or standard input is not
            connected to a terminal (which makes it impossible to prompt
            the user) the value of the keyword argument ``default`` is
            returned (if that value is not :data:`None`).
:raises: - Any exceptions raised by :func:`retry_limit()`.
         - Any exceptions raised by :func:`prompt_for_input()`.

When `default` is :data:`False` and the user doesn't enter any text an
error message is printed and the prompt is repeated:

>>> prompt_for_confirmation("Are you sure?")
 <BLANKLINE>
 Are you sure? [y/n]
 <BLANKLINE>
 Error: Please enter 'yes' or 'no' (there's no default choice).
 <BLANKLINE>
 Are you sure? [y/n]

The same thing happens when the user enters text that isn't recognized:

>>> prompt_for_confirmation("Are you sure?")
 <BLANKLINE>
 Are you sure? [y/n] about what?
 <BLANKLINE>
 Error: Please enter 'yes' or 'no' (the text 'about what?' is not recognized).
 <BLANKLINE>
 Are you sure? [y/n]
Tboldz[Y/n]Nz[y/N]z[y/n]z %s )colorz5Requesting interactive confirmation from terminal: %r paddingstrip)yyesz#Confirmation granted by reply (%r).)nnoz"Confirmation denied by reply (%r).F,Default choice selected by empty reply (%r).granteddeniedzthe text '%s' is not recognizedthere's no default choice&Got %s reply (%s), retrying (%i/%i) ..invalidemptyz6{indent}Error: Please enter 'yes' or 'no' ({details}). )indentdetails)r   r   r   debugr   rstripr   r   lowerr   r	   )questiondefaultr   prompt_texthintattemptreplyr+   s           O/var/www/fran/franai/venv/lib/python3.13/site-packages/humanfriendly/prompts.pyr   r   6   s    L &hT:K7g.A7wD6/OLLLK
LLH*U`JaJhJhJjk= b'N;;=L(LL>F[[]k)LL=uEW0LLG&-8=N   95@%@ LLA&+' ,0 L")3r7D% !    c                    U(       a  SOSn[        U 5      n [        U 5      S:X  a  [        R                  SU S   5        U S   $ U (       d  [	        S5      eU(       a  SOSR                  SR                  [        U SS	9 VVs/ s H  u  pES
XE4-  XQ:X  a  SOS-   PM     snn5      S/5      n[        USS9n[        R                  S[        [        [        U 5      5      5        [        5        GH  n[        USUSS9nU(       d  Ub  [        R                  SU5        Us  $ UR                  5       (       aF  [        U5      S-
  n	SU	s=::  a  [        U 5      :  a"  O  O[        R                  SX	   U5        X	   s  $ / n
U  Hm  nUR                  5       nUR                  5       nX:X  a  [        R                  SU5        Us  s  $ X;   d  MK  [        U5      S:  d  M\  U
R!                  U5        Mo     [        U
5      S:X  a!  [        R                  SU
S   U5        U
S   s  $ U
(       a  [#        SU[        U
5      5      nOVUR                  5       (       a  [#        S[        U5      5      nO+U(       a"  UR%                  5       (       d  [#        SU5      nOSn[        R                  SU(       a  SOSUU[&        5        [)        SX=5        GM     gs  snnf )a~  
Prompt the user to select a choice from a group of options.

:param choices: A sequence of strings with available options.
:param default: The default choice if the user simply presses Enter
                (expected to be a string, defaults to :data:`None`).
:param padding: Refer to the documentation of
                :func:`~humanfriendly.prompts.prompt_for_input()`.
:returns: The string corresponding to the user's choice.
:raises: - :exc:`~exceptions.ValueError` if `choices` is an empty sequence.
         - Any exceptions raised by
           :func:`~humanfriendly.prompts.retry_limit()`.
         - Any exceptions raised by
           :func:`~humanfriendly.prompts.prompt_for_input()`.

When no options are given an exception is raised:

>>> prompt_for_choice([])
Traceback (most recent call last):
  File "humanfriendly/prompts.py", line 148, in prompt_for_choice
    raise ValueError("Can't prompt for choice without any options!")
ValueError: Can't prompt for choice without any options!

If a single option is given the user isn't prompted:

>>> prompt_for_choice(['only one choice'])
'only one choice'

Here's what the actual prompt looks like by default:

>>> prompt_for_choice(['first option', 'second option'])
<BLANKLINE>
  1. first option
  2. second option
<BLANKLINE>
 Enter your choice as a number or unique substring (Control-C aborts): second
<BLANKLINE>
'second option'

If you don't like the whitespace (empty lines and indentation):

>>> prompt_for_choice(['first option', 'second option'], padding=False)
 1. first option
 2. second option
Enter your choice as a number or unique substring (Control-C aborts): first
'first option'
r)   r      z=Skipping interactive prompt because there's only option (%r).r   z,Can't prompt for choice without any options!z


)startz %i. %sz (default choice)zFEnter your choice as a number or unique substring (Control-C aborts): Tr   z=Requesting interactive choice on terminal (options are %s) ..r   Nr"   z+Option (%r) selected by numeric reply (%s).z,Option (%r) selected by reply (exact match).z6Option (%r) selected by reply (substring match on %r).z*text '%s' matches more than one choice: %sznumber %i is not a valid choicez#text '%s' doesn't match any choicesr%   r&   r'   r(   z%sError: Invalid input (%s).)listlenr   r,   
ValueErrorjoin	enumerater   r   mapreprr   r   isdigitintr.   appendr
   isspacer   r	   )choicesr0   r   r*   ichoicer1   r3   r4   indexmatcheslower_replylower_choicer+   s                 r5   r   r   x   ss   ` SF7mG
7|qTV]^_V`aqzGHH$6$44		&wa8
8	 1+%AR*=XZ[8
 	
 	Q6 K &k=K
LLPSw/02= b'N,LLGQN]]__JNEE(CL(JGN\ab~%F++-K!<<>L*KVT,[1AA1Ev&  w<1LLQSZ[\S]_de1:  !MuVabiVjk !BCJOu}} !FN5LLA&+' ,0 2FDO !
s   Kc                    [        5         Sn U(       a  SU -   n U R                  SS5      n  [        U 5      nUc  [        R                  R                  S5        U(       a  [        R                  R                  S5        Ub	  U(       d  U$ UR                  5       $ ! Uc  [        R                  R                  S5        U(       a   [        R                  R                  S5        f f = f! [         aO  n[        U[        5      (       a   Ub  [        R                  SU5        Us SnA$ [        R                  SSS9  e SnAff = f)a  
Prompt the user for input (free form text).

:param question: An explanation of what is expected from the user (a string).
:param default: The return value if the user doesn't enter any text or
                standard input is not connected to a terminal (which
                makes it impossible to prompt the user).
:param padding: Render empty lines before and after the prompt to make it
                stand out from the surrounding text? (a boolean, defaults
                to :data:`True`)
:param strip: Strip leading/trailing whitespace from the user's reply?
:returns: The text entered by the user (a string) or the value of the
          `default` argument.
:raises: - :exc:`~exceptions.KeyboardInterrupt` when the program is
           interrupted_ while the prompt is active, for example
           because the user presses Control-C_.
         - :exc:`~exceptions.EOFError` when reading from `standard input`_
           fails, for example because the user presses Control-D_ or
           because the standard input stream is redirected (only if
           `default` is :data:`None`).

.. _Control-C: https://en.wikipedia.org/wiki/Control-C#In_command-line_environments
.. _Control-D: https://en.wikipedia.org/wiki/End-of-transmission_character#Meaning_in_Unix
.. _interrupted: https://en.wikipedia.org/wiki/Unix_signal#SIGINT
.. _standard input: https://en.wikipedia.org/wiki/Standard_streams#Standard_input_.28stdin.29
Nr9   z
 z6Got EOF from terminal, returning default value (%r) ..z0Interactive prompt was interrupted by exception!T)exc_info)r   replacer   sysstderrwriteBaseException
isinstanceEOFErrorr   r,   r	   r   )r/   r0   r   r   r4   es         r5   r   r      s   6 E'hH''e4H	'&x0E} 

  &
 

  & 5 {{}K } 

  &
 

  &   
a""w': LLQSZ[N NNMX\N]
s;   C* B AC* AC''C* *
E4/D>#E)D>>Ec                     [        [        R                  5      (       a%  [        U 4S[	        [        R
                  5      0UD6$ U $ )a  
Wrap a text to be rendered as an interactive prompt in ANSI escape sequences.

:param prompt_text: The text to render on the prompt (a string).
:param options: Any keyword arguments are passed on to :func:`.ansi_wrap()`.
:returns: The resulting prompt text (a string).

ANSI escape sequences are only used when the standard output stream is
connected to a terminal. When the standard input stream is connected to a
terminal any escape sequences are wrapped in "readline hints".
readline_hints)r   rP   stdoutr   r   stdin)r1   optionss     r5   r   r   8  s?     (

33 k^2G		2R^V]^ r6   c                  .     SSK n g! [         a     gf = f)ux  
Make interactive prompts more user friendly.

The prompts presented by :func:`python2:raw_input()` (in Python 2) and
:func:`python3:input()` (in Python 3) are not very user friendly by
default, for example the cursor keys (:kbd:`←`, :kbd:`↑`, :kbd:`→` and
:kbd:`↓`) and the :kbd:`Home` and :kbd:`End` keys enter characters instead
of performing the action you would expect them to. By simply importing the
:mod:`readline` module these prompts become much friendlier (as mentioned
in the Python standard library documentation).

This function is called by the other functions in this module to enable
user friendly prompts.
r   N)readlineImportError)r]   s    r5   r   r   I  s     s    
c              #      #    [        U 5       H
  nUS-   v   M     SnX -  n[        R                  U5        [        U5      e7f)a  
Allow the user to provide valid input up to `limit` times.

:param limit: The maximum number of attempts (a number,
              defaults to :data:`MAX_ATTEMPTS`).
:returns: A generator of numbers starting from one.
:raises: :exc:`TooManyInvalidReplies` when an interactive prompt
         receives repeated invalid input (:data:`MAX_ATTEMPTS`).

This function returns a generator for interactive prompts that want to
repeat on invalid input without getting stuck in infinite loops.
r8   zTReceived too many invalid replies on interactive prompt, giving up! (tried %i times))ranger   r	   r   )limitrG   msgformatted_msgs       r5   r   r   _  sA      5\!e 
`CKM
NN=!

..s   A Ac                       \ rS rSrSrSrg)r   iv  zLRaised by interactive prompts when they've received too many invalid inputs. N)__name__
__module____qualname____firstlineno____doc____static_attributes__re   r6   r5   r   r   v  s    Vr6   r   )NT)NTT)rj   loggingrP   humanfriendly.compatr   humanfriendly.terminalr   r   r   r   r   r	   humanfriendly.textr
   r   __all__r   	getLoggerrf   r   r   r   r   r   r   r   	Exceptionr   re   r6   r5   <module>rs      s     
 4  3
  W 
		8	$?DDoEdK\", # /.WI Wr6   