
    kh                         d dl Z d dlZd dlmZmZ ddlmZ  G d dej                        Z G d de      Z	 G d	 d
e	      Z
y)    N)	GeneratorIterable   )ResponseNotAcceptedc                   &    e Zd ZdZdedee   fdZy)StreamWatchera}  
    A class whose subclasses may act on seen stream data from subprocesses.

    Subclasses must exhibit the following API; see `Responder` for a concrete
    example.

    * ``__init__`` is completely up to each subclass, though as usual,
      subclasses *of* subclasses should be careful to make use of `super` where
      appropriate.
    * `submit` must accept the entire current contents of the stream being
      watched, as a string, and may optionally return an iterable of strings
      (or act as a generator iterator, i.e. multiple calls to ``yield
      <string>``), which will each be written to the subprocess' standard
      input.

    .. note::
        `StreamWatcher` subclasses exist in part to enable state tracking, such
        as detecting when a submitted password didn't work & erroring (or
        prompting a user, or etc). Such bookkeeping isn't easily achievable
        with simple callback functions.

    .. note::
        `StreamWatcher` subclasses `threading.local` so that its instances can
        be used to 'watch' both subprocess stdout and stderr in separate
        threads.

    .. versionadded:: 1.0
    streamreturnc                     t         )a  
        Act on ``stream`` data, potentially returning responses.

        :param str stream:
            All data read on this stream since the beginning of the session.

        :returns:
            An iterable of ``str`` (which may be empty).

        .. versionadded:: 1.0
        )NotImplementedError)selfr	   s     a/var/www/pru.catia.catastroantioquia-mas.com/tasa/lib/python3.12/site-packages/invoke/watchers.pysubmitzStreamWatcher.submit&   s
     "!    N)__name__
__module____qualname____doc__strr   r    r   r   r   r      s    :"S "Xc] "r   r   c            	       ^    e Zd ZdZdededdfdZdedededee   fd	Zdedeeddf   fd
Z	y)	Responderz
    A parameterizable object that submits responses to specific patterns.

    Commonly used to implement password auto-responds for things like ``sudo``.

    .. versionadded:: 1.0
    patternresponser
   Nc                 .    || _         || _        d| _        y)aY  
        Imprint this `Responder` with necessary parameters.

        :param pattern:
            A raw string (e.g. ``r"\[sudo\] password for .*:"``) which will be
            turned into a regular expression.

        :param response:
            The string to submit to the subprocess' stdin when ``pattern`` is
            detected.
        r   N)r   r   index)r   r   r   s      r   __init__zResponder.__init__>   s      
r   r	   
index_attrc                     t        | |      }||d }t        j                  ||t        j                        }|rt	        | ||t        |      z          |S )a  
        Generic "search for pattern in stream, using index" behavior.

        Used here and in some subclasses that want to track multiple patterns
        concurrently.

        :param str stream: The same data passed to ``submit``.
        :param str pattern: The pattern to search for.
        :param str index_attr: The name of the index attribute to use.
        :returns: An iterable of string matches.

        .. versionadded:: 1.0
        N)getattrrefindallSsetattrlen)r   r	   r   r   r   newmatchess          r   pattern_matcheszResponder.pattern_matchesO   sN    & j)UVn**Wc2440D*ec#h&67r   c              #   l   K   | j                  || j                  d      D ]  }| j                    y w)Nr   )r(   r   r   )r   r	   _s      r   r   zResponder.submitk   s2     %%fdllGD 	 A--	 s   24)
r   r   r   r   r   r   r   r(   r   r   r   r   r   r   r   5   sh     s t "$'58	#8 S  YsD$%?  r   r   c                   T     e Zd ZdZdedededdf fdZdedeeddf   f fd	Z xZS )
FailingRespondera  
    Variant of `Responder` which is capable of detecting incorrect responses.

    This class adds a ``sentinel`` parameter to ``__init__``, and its
    ``submit`` will raise `.ResponseNotAccepted` if it detects that sentinel
    value in the stream.

    .. versionadded:: 1.0
    r   r   sentinelr
   Nc                 P    t         |   ||       || _        d| _        d| _        y )Nr   F)superr   r-   failure_indextried)r   r   r   r-   	__class__s       r   r   zFailingResponder.__init__|   s(    (+ 
r   r	   c                     t         |   |      }| j                  || j                  d      }| j                  r3|r1dj                  | j                  | j                        }t        |      |rd| _        |S )Nr0   z(Auto-response to r"{}" failed with {!r}!T)r/   r   r(   r-   r1   formatr   r   )r   r	   r   failederrr2   s        r   r   zFailingResponder.submit   sk    7>&)%%fdmm_M::&<CCdmmC &c**DJr   )	r   r   r   r   r   r   r   r   __classcell__)r2   s   @r   r,   r,   q   sL     s c d S YsD$%?  r   r,   )r!   	threadingtypingr   r   
exceptionsr   localr   r   r,   r   r   r   <module>r<      s;    	  & +*"IOO *"Z9  9 x y  r   