
    iX                       d dl mZ d dlmZ 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Zd dlZd dlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ ej,                  rd d
lmZ ddlmZ  G d d      Zej8                  dd       Z G d dej<                        Z G d d      Z  G d dejB                        Z"	 	 	 	 	 	 ddZ# G d d      Z$ G d d      Z%y)    )annotationsN)TracebackType   )_compat)
formatting)termui)utils)_find_binary_reader)ReadableBuffer)Commandc                  Z    e Zd ZddZddZddZdddZdddZdddZddZ	ddZ
dd	Zy
)EchoingStdinc                .    || _         || _        d| _        y )NF)_input_output_paused)selfinputoutputs      @/root/searxng-venv/lib/python3.12/site-packages/click/testing.py__init__zEchoingStdin.__init__   s        c                .    t        | j                  |      S N)getattrr   r   xs     r   __getattr__zEchoingStdin.__getattr__    s    t{{A&&r   c                T    | j                   s| j                  j                  |       |S r   )r   r   write)r   rvs     r   _echozEchoingStdin._echo#   s     ||LLr"	r   c                V    | j                  | j                  j                  |            S r   )r"   r   readr   ns     r   r$   zEchoingStdin.read)   s     zz$++**1-..r   c                V    | j                  | j                  j                  |            S r   )r"   r   read1r%   s     r   r(   zEchoingStdin.read1,   s     zz$++++A.//r   c                V    | j                  | j                  j                  |            S r   )r"   r   readliner%   s     r   r*   zEchoingStdin.readline/   s     zz$++..q122r   c                z    | j                   j                         D cg c]  }| j                  |       c}S c c}w r   )r   	readlinesr"   r   s     r   r,   zEchoingStdin.readlines2   s+    '+{{'<'<'>?!

1???s   8c                @     t         fd j                  D              S )Nc              3  @   K   | ]  }j                  |        y wr   )r"   ).0r   r   s     r   	<genexpr>z(EchoingStdin.__iter__.<locals>.<genexpr>6   s     7aDJJqM7s   )iterr   r   s   `r   __iter__zEchoingStdin.__iter__5   s    74;;777r   c                ,    t        | j                        S r   )reprr   r2   s    r   __repr__zEchoingStdin.__repr__8   s    DKK  r   N)r   
t.BinaryIOr   r7   returnNone)r   strr8   t.Any)r!   bytesr8   r<   ))r&   intr8   r<   )r8   zlist[bytes])r8   zcabc.Iterator[bytes]r8   r:   )__name__
__module____qualname__r   r   r"   r$   r(   r*   r,   r3   r6    r   r   r   r      s0    
'/03@8!r   r   c              #  >   K   | d  y d| _         d  d| _         y w)NTF)r   streams    r   _pause_echorG   <   s     ~s   c                  <     e Zd ZdZd fdZd fdZd fdZ xZS )BytesIOCopyzdPatch ``io.BytesIO`` to let the written stream be copied to another.

    .. versionadded:: 8.2
    c                0    t         |           || _        y r   )superr   copy_to)r   rL   	__class__s     r   r   zBytesIOCopy.__init__L   s    r   c                V    t         |           | j                  j                          y r   )rK   flushrL   r   rM   s    r   rO   zBytesIOCopy.flushP   s    r   c                X    | j                   j                  |       t        |   |      S r   )rL   r    rK   )r   brM   s     r   r    zBytesIOCopy.writeT   s$    1w}Qr   )rL   z
io.BytesIOr8   r9   r8   r9   )rR   r   r8   r>   )r@   rA   rB   __doc__r   rO   r    __classcell__rM   s   @r   rI   rI   F   s    
   r   rI   c                      e Zd ZdZddZy)StreamMixerzMixes `<stdout>` and `<stderr>` streams.

    The result is available in the ``output`` attribute.

    .. versionadded:: 8.2
    c                    t        j                         | _        t        | j                        | _        t        | j                        | _        y )N)rL   )ioBytesIOr   rI   stdoutstderrr2   s    r   r   zStreamMixer.__init__a   s/    "$**,"-dkk"B"-dkk"Br   NrS   )r@   rA   rB   rT   r   rC   r   r   rX   rX   Y   s    Cr   rX   c                  x     e Zd ZdZdd	 	 	 	 	 	 	 	 	 	 	 d	 fdZd
dZd fdZedd       Zedd       Z	 xZ
S )_NamedTextIOWrappera  A :class:`~io.TextIOWrapper` with custom ``name`` and ``mode``
    that does not close its underlying buffer.

    An optional ``original_fd`` preserves the file descriptor of the
    stream being replaced, so that C-level consumers that call
    :meth:`fileno` (``faulthandler``, ``subprocess``, ...) still work.
    Inspired by pytest's ``capsys``/``capfd`` split: see :doc:`/testing`
    for details.

    .. versionchanged:: 8.3.3
        Added ``original_fd`` parameter and :meth:`fileno` override.
    r=   )original_fdc               P    t        |   |fi | || _        || _        || _        y r   )rK   r   _name_mode_original_fd)r   buffernamemoder`   kwargsrM   s         r   r   z_NamedTextIOWrapper.__init__u   s-     	*6*

'r   c                     y)zThe buffer this object contains belongs to some other object,
        so prevent the default ``__del__`` implementation from closing
        that buffer.

        .. versionadded:: 8.3.2
        NrC   r2   s    r   closez_NamedTextIOWrapper.close   s    r   c                V    | j                   dk\  r| j                   S t        | 	         S )ax  Return the file descriptor of the original stream, if one was
        provided at construction time.

        This allows C-level consumers (``faulthandler``, ``subprocess``,
        signal handlers, ...) to obtain a valid fd without crashing, even
        though the Python-level writes are redirected to an in-memory
        buffer.

        .. versionadded:: 8.3.3
        r   )rd   rK   filenorP   s    r   rl   z_NamedTextIOWrapper.fileno   s,     !$$$w~r   c                    | j                   S r   )rb   r2   s    r   rf   z_NamedTextIOWrapper.name       zzr   c                    | j                   S r   )rc   r2   s    r   rg   z_NamedTextIOWrapper.mode   rn   r   )re   r7   rf   r:   rg   r:   r`   r>   rh   r;   r8   r9   rS   )r8   r>   r?   )r@   rA   rB   rT   r   rj   rl   propertyrf   rg   rU   rV   s   @r   r_   r_   g   s~    & (( ( 	( ( ( 
(     r   r_   c                    t        | d      r.t        t        j                  d|             }||S t	        d      | d} n!t        | t              r| j                  |      } t        j                  |       S )Nr$   t.IO[t.Any]z.Could not find binary reader for input stream.r   )
hasattrr
   tcast	TypeError
isinstancer:   encoderZ   r[   )r   charsetr!   s      r   make_input_streamrz      sj     uf u!=>>IHII}	E3	W%::er   c                  x    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	y)ResultaC  Holds the captured result of an invoked CLI script.

    :param runner: The runner that created the result
    :param stdout_bytes: The standard output as bytes.
    :param stderr_bytes: The standard error as bytes.
    :param output_bytes: A mix of ``stdout_bytes`` and ``stderr_bytes``, as the
        user would see  it in its terminal.
    :param return_value: The value returned from the invoked command.
    :param exit_code: The exit code as integer.
    :param exception: The exception that happened if one did.
    :param exc_info: Exception information (exception type, exception instance,
        traceback type).

    .. versionchanged:: 8.2
        ``stderr_bytes`` no longer optional, ``output_bytes`` introduced and
        ``mix_stderr`` has been removed.

    .. versionadded:: 8.0
        Added ``return_value``.
    Nc	                t    || _         || _        || _        || _        || _        || _        || _        || _        y r   runnerstdout_bytesstderr_bytesoutput_bytesreturn_value	exit_code	exceptionexc_info)	r   r   r   r   r   r   r   r   r   s	            r   r   zResult.__init__   s@     (((("" r   c                    | j                   j                  | j                  j                  d      j	                  dd      S )a  The terminal output as unicode string, as the user would see it.

        .. versionchanged:: 8.2
            No longer a proxy for ``self.stdout``. Now has its own independent stream
            that is mixing `<stdout>` and `<stderr>`, in the order they were written.
        replace

)r   decoder   ry   r   r2   s    r   r   zResult.output   s9       ''(;(;YGOOD
 	
r   c                    | j                   j                  | j                  j                  d      j	                  dd      S )z&The standard output as unicode string.r   r   r   )r   r   r   ry   r   r2   s    r   r\   zResult.stdout   s9       ''(;(;YGOOD
 	
r   c                    | j                   j                  | j                  j                  d      j	                  dd      S )zThe standard error as unicode string.

        .. versionchanged:: 8.2
            No longer raise an exception, always returns the `<stderr>` string.
        r   r   r   )r   r   r   ry   r   r2   s    r   r]   zResult.stderr   s9       ''(;(;YGOOD
 	
r   c                    | j                   rt        | j                         nd}dt        |       j                   d| dS )Nokay< >)r   r5   typer@   )r   exc_strs     r   r6   zResult.__repr__   s8    *...$t~~&f4:&&'q	33r   r   )r   	CliRunnerr   r<   r   r<   r   r<   r   r;   r   r>   r   zBaseException | Noner   z?tuple[type[BaseException], BaseException, TracebackType] | Noner?   )
r@   rA   rB   rT   r   rp   r   r\   r]   r6   rC   r   r   r|   r|      s    > !! ! 	!
 ! ! ! (!!* 	
 	
 
 
 
 
4r   r|   c                      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d       Zy)r   a  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.
    :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 catch_exceptions: Whether to catch any exceptions other than
                             ``SystemExit`` when running :meth:`~CliRunner.invoke`.

    .. versionchanged:: 8.2
        Added the ``catch_exceptions`` parameter.

    .. versionchanged:: 8.2
        ``mix_stderr`` parameter has been removed.
    Nc                D    || _         |xs i | _        || _        || _        y r   )ry   env
echo_stdincatch_exceptions)r   ry   r   r   r   s        r   r   zCliRunner.__init__  s%     25)$ 0r   c                "    |j                   xs 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)rf   )r   clis     r   get_default_prog_namezCliRunner.get_default_prog_name'  s    
 xx!6!r   c                V    t        | j                        }|r|j                  |       |S )z8Returns the environment overrides for invoking a script.)dictr   update)r   	overridesr!   s      r   make_envzCliRunner.make_env.  s%     $((^IIi 	r   c              #  l	  K   t        || j                        }d}t        j                  }t        j                  }t        j
                  }t        j                  }	dt        _        | j                  |      }t               }
dd} ||      } ||      }| j                  r:t        j                  t        j                  t        ||
j                              x}}t        || j                  dd      xt        _        | j                  rd_        t        |
j                  | j                  dd	|
      t        _        t        |
j
                  | j                  dd	d|      t        _        t#        |      ddfd       }t#        |      ddfd       }t#        |      dd       }|	 d	 	 	 	 	 dfd}t$        j&                  }t$        j(                  }t$        j*                  }t,        j.                  }t0        j.                  }t2        j4                  j6                  |t$        _        |t$        _        |t$        _        |t,        _        |t0        _        	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dfd}|t2        j4                  _        i }	 |j9                         D ]O  \  }}t:        j<                  j?                  |      ||<   |	 t:        j<                  |= =|t:        j<                  |<   Q |
j                  |
j
                  |
jB                  f |j9                         D ]-  \  }}|	 t:        j<                  |= |t:        j<                  |<   / |t        _        |t        _        |t        _        |t$        _        |t$        _        |t$        _        |t,        _        |t0        _        |	t        _        t2        j4                  _        y# t@        $ r Y <w xY w# t@        $ r Y w xY w# |j9                         D ]<  \  }}|"	 t:        j<                  |= # t@        $ r Y &w xY w|t:        j<                  |<   > |t        _        |t        _        |t        _        |t$        _        |t$        _        |t$        _        |t,        _        |t0        _        |	t        _        t2        j4                  _        w xY ww)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.

        :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.

        .. versionadded:: 8.2
            An additional output stream is returned, which is a mix of
            `<stdout>` and `<stderr>` streams.

        .. versionchanged:: 8.2
            Always returns the `<stderr>` stream.

        .. versionchanged:: 8.0
            `<stderr>` is opened with ``errors="backslashreplace"``
            instead of the default ``"strict"``.

        .. versionchanged:: 4.0
            Added the ``color`` parameter.
        NP   c                b    	 | j                         S # t        t        j                  f$ r Y yw xY w)Nr=   )rl   AttributeErrorrZ   UnsupportedOperationrE   s    r   _safe_filenoz)CliRunner.isolation.<locals>._safe_filenok  s0    }}&"B$;$;< s    ..z<stdin>r)encodingrf   rg   r   z<stdout>w)r   rf   rg   r`   z<stderr>backslashreplace)r   rf   rg   errorsr`   c                <   t         j                  j                  | xs d       	 t              j	                  d      }t         j                  j                  | d       t         j                  j                          |S # t
        $ r}t               |d }~ww xY w)N r   r   )sysr\   r    nextrstripStopIterationEOFErrorrO   )promptvale
text_inputs      r   visible_inputz*CliRunner.isolation.<locals>.visible_input  s~    JJV\r*(:&--f5 JJuBZ(JJJ	 ! (ja'(s   B 	BBBc                    t         j                  j                  | xs d d       t         j                  j                          	 t	              j                  d      S # t        $ r}t               |d }~ww xY w)Nr   r   r   )r   r\   r    rO   r   r   r   r   )r   r   r   s     r   hidden_inputz)CliRunner.isolation.<locals>.hidden_input  se    JJ"~R01JJ(J'..v66  (ja'(s   A! !	A:*A55A:c                    t         j                  j                  d      }| rt         j                  j	                  |       t         j                  j                          |S )Nr   )r   stdinr$   r\   r    rO   )echochars     r   _getcharz%CliRunner.isolation.<locals>._getchar  s>    99>>!$D

  &JJKr   c                    | S | S r   rC   )rF   colordefault_colors     r   should_strip_ansiz.CliRunner.isolation.<locals>.should_strip_ansi  s     }(((9r   c                h    |t         j                  }|t         j                  } | f|||d| y)ab  Default ``pdb.Pdb`` to real terminal streams during
            ``CliRunner`` isolation.

            Without this patch, ``pdb.Pdb.__init__`` inherits from
            ``cmd.Cmd`` which falls back to ``sys.stdin``/``sys.stdout``
            when no explicit streams are provided. During isolation
            those are ``BytesIO``-backed wrappers, so the debugger
            reads from an empty buffer and writes to captured output,
            making interactive debugging impossible.

            By defaulting to ``sys.__stdin__``/``sys.__stdout__`` (the
            original terminal streams Python preserves regardless of
            redirection), debuggers can interact with the user while
            ``click.echo`` output is still captured normally.

            This covers ``pdb.set_trace()``, ``breakpoint()``,
            ``pdb.post_mortem()``, and debuggers that subclass
            ``pdb.Pdb`` (ipdb, pdbpp). Explicit ``stdin``/``stdout``
            arguments are honored and not overridden. Debuggers that
            do not subclass ``pdb.Pdb`` (pudb, debugpy) are not
            covered.
            N)completekeyr   r\   )r   	__stdin__
__stdout__)r   r   r   r\   rh   old_pdb_inits        r   _patched_pdb_initz.CliRunner.isolation.<locals>._patched_pdb_init  s@    : }~"-U6MSr   )rF   rr   r8   r>   r   )r   z
str | Noner8   r:   )r   boolr8   r:   )NN)rF   zt.IO[t.Any] | Noner   bool | Noner8   r   )tabNN)r   zpdb.Pdbr   r:   r   t.IO[str] | Noner\   r   rh   r;   r8   r9   )"rz   ry   r   r   r\   r]   r   FORCED_WIDTHr   rX   r   rt   ru   BinaryIOr   r_   _CHUNK_SIZErG   r   visible_prompt_funchidden_prompt_funcr   r	   r   r   pdbPdbr   itemsosenvironget	Exceptionr   )r   r   r   r   bytes_input
echo_input	old_stdin
old_stdout
old_stderrold_forced_widthstream_mixerr   old_stdout_fdold_stderr_fdr   r   r   r   old_visible_prompt_funcold_hidden_prompt_funcold__getchar_funcold_should_strip_ansiold__compat_should_strip_ansir   old_envkeyvaluer   r   r   s                              @@@r   	isolationzCliRunner.isolation7  sJ    D (t||<
II	ZZ
ZZ
%22"$
mmC "}	 %Z0$Z0??'(vv

Ll6I6IJ( K* "5$,,YS"
 	
	J ?? &'J"(\\%

 )\\%%

 
Z	 	 
!	 
Z	 	( 
!	( 
Z	 	 
!	  EI	&	6A		 #)"<"<!'!:!:"OO % 7 7(/(A(A%ww''%2"$0!""3$5!  %&*'+	#	#	#	 $#	 %	#	
 #	 #	J -	,!iik ,
U!zz~~c2=JJsO ',BJJsO,  &&(;(;\=P=PQQ%mmo ,
U=JJsO ',BJJsO, $CJ#CJ!CI)@F&(>F%/FO&;E#(EG%&6J#+CGG/ %  % 	 &mmo ,
U=JJsO$  ',BJJsO, $CJ#CJ!CI)@F&(>F%/FO&;E#(EG%&6J#+CGGs   JR4	:O( O	;O( R4)O:BR4		OO( OO( 	O%"R4$O%%R4(R1PR1	P 	R1P 	 BR11R4c           
     &   d}|| j                   }| j                  |||      5 }	d}
d}d}t        |t              rt	        j
                  |      }	 |j                  d      }	  |j                  d|xs d|d|}
t        j"                  j)                          t        j*                  j)                          |	d   j-                         }|	d	   j-                         }|	d
   j-                         }	 ddd       t/        | 
|      S # t        $ r | j                  |      }Y w xY w# t        $ r}t        j                         }t        j                  d|j                        }|d}|dk7  r|}t        |t               sIt        j"                  j%                  t        |             t        j"                  j%                  d       d	}|}Y d}~Zd}~wt&        $ r&}|s |}d	}t        j                         }Y d}~d}~ww xY w# t        j"                  j)                          t        j*                  j)                          |	d   j-                         }|	d	   j-                         }|	d
   j-                         }w xY w# 1 sw Y   xY w)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.

        :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``. If :data:`None`, the value
                                 from :class:`CliRunner` is used.
        :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.

        .. versionadded:: 8.2
            The result object has the ``output_bytes`` attribute with
            the mix of ``stdout_bytes`` and ``stderr_bytes``, as the user would
            see it in its terminal.

        .. versionchanged:: 8.2
            The result object always returns the ``stderr_bytes`` stream.

        .. versionchanged:: 8.0
            The result object has the ``return_value`` attribute with
            the value returned from the invoked command.

        .. versionchanged:: 4.0
            Added the ``color`` parameter.

        .. versionchanged:: 3.0
            Added the ``catch_exceptions`` parameter.

        .. versionchanged:: 3.0
            The result object has the ``exc_info`` attribute with the
            traceback if available.
        N)r   r   r   r   	prog_namerC   )argsr   zint | t.Any | Noner   r      r~   )r   r   rw   r:   shlexsplitpopKeyErrorr   main
SystemExitr   r   rt   ru   coder>   r\   r    r   rO   r]   getvaluer|   )r   r   r   r   r   r   r   extrar   
outstreamsr   r   r   r   r   e_coder\   r]   r   s                      r   invokezCliRunner.invoke  sG   j ##44^^%S^> +	2*L.2II$${{4(<!IIk2	2'sxxVTZR9VPUV2 

  "

  "#A//1#A//1#A//1W+	2Z %	
 		
G  < 66s;	<
  #<<> 4aff=>FQ; !I!&#.JJ$$S[1JJ$$T*F"	 *'		<<>* 

  "

  "#A//1#A//1#A//1W+	2 +	2st   ,JD$D.=A5JD+(J*D++J.	H	7BGHH	#H>HH		HA7JJJc              #    K   t        j                         }t        j                  |      }t        j                  |       	 | t        j                  |       |ddl}	 |j                  |       yy# t        $ r Y yw xY w# t        j                  |       |&ddl}	 |j                  |       w # t        $ r Y w w xY ww xY ww)a  A context manager that creates a temporary directory and
        changes the current working directory to it. This isolates tests
        that affect the contents of the CWD to prevent them from
        interfering with each other.

        :param temp_dir: Create the temporary directory under this
            directory. If given, the created directory is not removed
            when exiting.

        .. versionchanged:: 8.0
            Added the ``temp_dir`` parameter.
        )dirNr   )r   getcwdtempfilemkdtempchdirshutilrmtreeOSError)r   temp_dircwddtr  s        r   isolated_filesystemzCliRunner.isolated_filesystem~  s       iik(+
	HHHSMMM"%	  
   HHSMMM"%   sf   A CB C#A6 4C6	B?CBCC"B43C4	C =C?C  CC)zutf-8NFT)
ry   r:   r   $cabc.Mapping[str, str | None] | Noner   r   r   r   r8   r9   )r   r   r8   r:   r   )r   r  r8   zcabc.Mapping[str, str | None])NNF)r    str | bytes | t.IO[t.Any] | Noner   r  r   r   r8   z8cabc.Iterator[tuple[io.BytesIO, io.BytesIO, io.BytesIO]])NNNNF)r   r   r   zstr | cabc.Sequence[str] | Noner   r  r   r  r   r   r   r   r   r;   r8   r|   )r  zstr | os.PathLike[str] | Noner8   zcabc.Iterator[str])r@   rA   rB   rT   r   r   r   
contextlibcontextmanagerr   r   r
  rC   r   r   r   r     sY   . 48 !%
1
1 2
1 	
1
 
1 

1" AE=	&  3748	S,/S, 2S, 	S,
 
BS, S,p 152648(,o
o
 .o
 0	o

 2o
 &o
 o
 o
 
o
b 8<5	 r   r   )rF   zEchoingStdin | Noner8   zcabc.Iterator[None])r   r  ry   r:   r8   r7   )&
__future__r   collections.abcabccabcr  rZ   r   r   r   r   r  typingrt   typesr   r   r   r   r   r	   r
   TYPE_CHECKING	_typeshedr   corer   r   r  rG   r[   rI   rX   TextIOWrapperr_   rz   r|   r   rC   r   r   <module>r     s    "   	 	 
  
        (??(! !D   "**  &C C9"** 9x+69(K4 K4\X Xr   