
    [FiP                        d dl Z d dlm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
 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 d dlmZ d dlZd dlmZ d dlmZ dZ G d d      Z e       Ze	 G d d             Zdeed      defdZ G d de      Z G d d      Z G d d       Z  G d! d"e jB                        Z" G d# d$e jF                        Z$y)%    N)gettext)Any)Callable)cast)Dict)final)List)Literal)Mapping)NoReturn)Optional)Sequence)Tuple)Union)
UsageError)check_ispytestfile_or_dirc                       e Zd ZdefdZy)NotSetreturnc                      y)Nz<notset> selfs    k/var/www/html/BankruptcyAI-uat/bankruptcy-ai/venv/lib/python3.12/site-packages/_pytest/config/argparsing.py__repr__zNotSet.__repr__   s        N)__name__
__module____qualname__strr   r   r   r   r   r      s    # r   r   c                   H   e Zd ZU dZdZee   ed<   	 	 d#dddee   deedgdf      d	e	d
dfdZ
d$dZ	 d%dededee   d
dfdZdeded
dfdZ	 d&deeedf      deej$                     d
ej$                  fdZd'dZ	 d&deeedf      dej$                  deej$                     d
ee   fdZ	 d&deeedf      deej$                     d
ej$                  fdZ	 d&deeedf      deej$                     d
eej$                  ee   f   fdZdefdededeed       d!ed
df
d"Zy)(ParserzParser for command line arguments and ini-file values.

    :ivar extra_info: Dict of generic param -> value to display in case
        there's an error processing the command line arguments.
    NprogF	_ispytestusage
processoptArgumentr&   r   c                    t        |       t        d| d      | _        g | _        || _        || _        i | _        g | _        i | _        y )NzCustom optionsTparserr&   )	r   OptionGroup
_anonymous_groups_processopt_usage_inidict	_ininames
extra_info)r   r'   r(   r&   s       r   __init__zParser.__init__.   sH     	y!%&6ttT*,%CE$&*,r   optionc                 Z    | j                   r|j                  r| j                  |       y y y N)r0   dest)r   r6   s     r   processoptionzParser.processoption>   s*    {{  (  r   namedescriptionafterr-   c                 
   | j                   D ]  }|j                  |k(  s|c S  t        ||| d      }d}t        | j                         D ]  \  }}|j                  |k(  s n | j                   j	                  |dz   |       |S )a  Get (or create) a named option Group.

        :param name: Name of the option group.
        :param description: Long description for --help output.
        :param after: Name of another group, used for ordering --help output.
        :returns: The option group.

        The returned group object has an ``addoption`` method with the same
        signature as :func:`parser.addoption <pytest.Parser.addoption>` but
        will be shown in the respective group in the output of
        ``pytest --help``.
        Tr+   r      )r/   r;   r-   	enumerateinsert)r   r;   r<   r=   groupigrps          r   getgroupzParser.getgroupC   s     \\ 	EzzT!	 D+ddK- 	FAsxx5 	 	AE5)r   optsattrsc                 <     | j                   j                  |i | y)a  Register a command line option.

        :param opts:
            Option names, can be short or long options.
        :param attrs:
            Same attributes as the argparse library's :meth:`add_argument()
            <argparse.ArgumentParser.add_argument>` function accepts.

        After command line parsing, options are available on the pytest config
        object via ``config.option.NAME`` where ``NAME`` is usually set
        by passing a ``dest`` attribute, for example
        ``addoption("--long", dest="NAME", ...)``.
        N)r.   	addoption)r   rF   rG   s      r   rI   zParser.addoption]   s     	"!!4151r   argszos.PathLike[str]	namespacec                     ddl m} | j                         | _         || j                         |D cg c]  }t	        j
                  |       }}| j                  j                  ||      S c c}w )Nr   )try_argcompleterK   )_pytest._argcompleterM   
_getparser	optparserosfspath
parse_args)r   rJ   rK   rM   xstrargss         r   parsezParser.parsem   s[    
 	9*')-.A299Q<..~~((I(FF /s   A-c                    ddl m} t        | | j                  | j                        }g | j
                  | j                  }|D ]}  }|j                  s|j                  xs |j                  }|j                  |      }|j                  D ]4  }|j                         }|j                         }	 |j                  |i |	 6  |j                  t        d      }
||
_        |S )Nr   )filescompleter)r$   *)nargs)rO   rY   MyOptionParserr4   r$   r/   r.   optionsr<   r;   add_argument_groupnamesrG   add_argumentFILE_OR_DIR	completer)r   rY   rQ   groupsrB   descarggroupr6   nafile_or_dir_args              r   rP   zParser._getparsery   s    7"4tyyI	14<<11 	3E}}((6EJJ$77=#mm 3FAA)H))1223		3 $00C0H %3!r   c                     | j                  ||      }|j                  j                         D ]  \  }}t        |||        t	        t
        t           t        |t                    S )NrN   )	rW   __dict__itemssetattrr   r	   r!   getattrra   )r   rJ   r6   rK   parsedoptionr;   values          r   parse_setoptionzParser.parse_setoption   s\     zz$)z<'00668 	)KD%FD%(	)DIw|[ABBr   c                 .    | j                  ||      d   S )zbParse the known arguments at this point.

        :returns: An argparse namespace object.
        rN   r   )parse_known_and_unknown_args)r   rJ   rK   s      r   parse_known_argszParser.parse_known_args   s     000KANNr   c                     | j                         }|D cg c]  }t        j                  |       }}|j                  ||      S c c}w )a  Parse the known arguments at this point, and also return the
        remaining unknown arguments.

        :returns:
            A tuple containing an argparse namespace object for the known
            arguments, and a list of the unknown arguments.
        rN   )rP   rR   rS   rs   )r   rJ   rK   rQ   rU   rV   s         r   rr   z#Parser.parse_known_and_unknown_args   sF     OO%	)-.A299Q<..))'Y)GG /s   AhelptypestringpathspathlistrJ   linelistbooldefaultc                     |dv sJ |t         u rt        |      }|||f| j                  |<   | j                  j	                  |       y)aR  Register an ini-file option.

        :param name:
            Name of the ini-variable.
        :param type:
            Type of the variable. Can be:

                * ``string``: a string
                * ``bool``: a boolean
                * ``args``: a list of strings, separated as in a shell
                * ``linelist``: a list of strings, separated by line breaks
                * ``paths``: a list of :class:`pathlib.Path`, separated as in a shell
                * ``pathlist``: a list of ``py.path``, separated as in a shell

            For ``paths`` and ``pathlist`` types, they are considered relative to the ini-file.
            In case the execution is happening without an ini-file defined,
            they will be considered relative to the current working directory (for example with ``--override-ini``).

            .. versionadded:: 7.0
                The ``paths`` variable type.

            .. versionadded:: 8.1
                Use the current working directory to resolve ``paths`` and ``pathlist`` in the absence of an ini-file.

            Defaults to ``string`` if ``None`` or not passed.
        :param default:
            Default value if no ini-file option exists but is queried.

        The value of ini-variables can be retrieved via a call to
        :py:func:`config.getini(name) <pytest.Config.getini>`.
        )Nrx   ry   rz   rJ   r{   r|   N)NOT_SETget_ini_default_for_typer2   r3   append)r   r;   ru   rv   r}   s        r   addinizParser.addini   sM    P XXXXg.t4G#T73dd#r   NN)r6   r)   r   N Nr8   )r   r\   )r   r   r    __doc__r$   r   r!   __annotations__r   r|   r5   r:   rE   r   rI   r   r   argparse	NamespacerW   rP   r	   rp   rs   r   rr   r   r
   r   r   r   r   r#   r#   $   sQ    D(3-  $=A-
  -}- XzlD&89:-
 - 
- ) HL&)7?}	42s 2S 2T 2& 37
GuS"4456
G H../
G 
			
G. 37		CuS"4456	C ""	C H../		C
 
c	C 37	OuS"4456	O H../	O 
				O 37HuS"4456H H../H 
x!!49,	-	H, -$-$ -$ MN
	-$ -$ 
-$r   r#   rv   rw   r   c                 "    | y| dv rg S | dk(  ryy)zp
    Used by addini to get the default value for a given ini-option type, when
    default is not supplied.
    r   )ry   rz   rJ   r{   r|   Fr   )rv   s    r   r   r      s'     |	:	:		r   c                   :    e Zd ZdZdededef   ddfdZdefdZy)	ArgumentErrorzURaised if an Argument instance is created with invalid or
    inconsistent arguments.msgr6   r)   r   Nc                 2    || _         t        |      | _        y r8   )r   r!   	option_id)r   r   r6   s      r   r5   zArgumentError.__init__   s    Vr   c                 j    | j                   rd| j                    d| j                   S | j                  S )Nzoption : )r   r   r   s    r   __str__zArgumentError.__str__   s.    >>T^^,Btxxj9988Or   )r   r   r    r   r!   r   r5   r   r   r   r   r   r      s6    %C %z3)? %D % r   r   c                   n    e Zd ZdZdededdfdZdee   fdZde	eef   fdZ
d	ee   ddfd
ZdefdZy)r)   zClass that mimics the necessary behaviour of optparse.Option.

    It's currently a least effort implementation and ignoring choices
    and integer prefixes.

    https://docs.python.org/3/library/optparse.html#optparse-standard-option-types
    r_   rG   r   Nc                    || _         g | _        g | _        	 |d   | _        	 |d   | _        | j                  |       |j                  d      }|r|| _        y| j                  r(| j                  d   dd j                  dd      | _        y	 | j                  d   d	d | _        y# t        $ r Y w xY w# t        $ r Y w xY w# t        $ r}d
| _        t        d|       |d}~ww xY w)z5Store params in private vars for use in add_argument.rv   r}   r9   r      N-_r?   z???zneed a long or short option)_attrs_short_opts
_long_optsrv   KeyErrorr}   _set_opt_stringsgetr9   replace
IndexErrorr   )r   r_   rG   r9   es        r   r5   zArgument.__init__  s    &(%'	fDI	 +DL 	e$#ii/DI__*12.66sC@DIP ,,Q/3	  		
  		  P!	#$A4HaOPs:   
B% 
B4 C %	B10B14	C ?C 	C%C  C%c                 4    | j                   | j                  z   S r8   )r   r   r   s    r   r_   zArgument.names&  s    $//11r   c                     dj                         }|j                  | j                         |D ]  }	 t        | |      | j                  |<    | j                  S # t
        $ r Y 6w xY w)Nzdefault dest help)splitr   r9   rm   r   AttributeError)r   rG   attrs      r   rG   zArgument.attrs)  si    #))+TYY 	D$+D$$7D!	
 {{ " s   A	A%$A%rF   c                 R   |D ]  }t        |      dk  rt        d|z  |       t        |      dk(  r;|d   dk(  r|d   dk7  st        d|z  |       | j                  j                  |       i|dd dk(  r|d   dk7  st        d|z  |       | j                  j                  |        y	)
zhDirectly from optparse.

        Might not be necessary as this is passed to argparse later on.
        r   z>invalid option string %r: must be at least two characters longr   r   r?   zMinvalid short option string %r: must be of the form -x, (x any non-dash char)--zGinvalid long option string %r: must start with --, followed by non-dashN)lenr   r   r   r   )r   rF   opts      r   r   zArgument._set_opt_strings4  s    
  	,C3x!|#;=@A 
 SQA##a&C-'HJMN 
   '',AaD(SVs]'CEHI 
 &&s+-	,r   c                    g }| j                   r|dt        | j                         z   gz  }| j                  r|dt        | j                        z   gz  }|dt        | j                        z   gz  }t	        | d      r|dt        | j
                        z   gz  }t	        | d      r|dt        | j                        z   gz  }dj                  d	j                  |            S )
Nz_short_opts: z_long_opts: zdest: rv   ztype: r}   z	default: zArgument({}), )	r   reprr   r9   hasattrrv   r}   formatjoin)r   rJ   s     r   r   zArgument.__repr__Q  s    _tD,<,<'==>>D??^d4??&;;<<DDO+,,4 XTYY/00D4#[4#5566D$$TYYt_55r   )r   r   r    r   r!   r   r5   r	   r_   r   rG   r   r   r   r   r   r   r)   r)     sm    Ps PS PT P62tCy 2	wsCx( 	,Xc] ,t ,:6# 6r   r)   c                   |    e Zd ZdZ	 	 ddddededee   ded	df
d
Zdede	d	dfdZ
dede	d	dfdZdddded	dfdZy)r-   z,A group of options shown in its own section.NFr%   r;   r<   r,   r&   r   c                R    t        |       || _        || _        g | _        || _        y r8   )r   r;   r<   r]   r,   )r   r;   r<   r,   r&   s        r   r5   zOptionGroup.__init__b  s)     	y!	&')r   rF   rG   c                     t        |      j                  d | j                  D              }|rt        d|z        t	        |i |}| j                  |d       y)aJ  Add an option to this group.

        If a shortened version of a long option is specified, it will
        be suppressed in the help. ``addoption('--twowords', '--two-words')``
        results in help showing ``--two-words`` only, but ``--twowords`` gets
        accepted **and** the automatic destination is in ``args.twowords``.

        :param opts:
            Option names, can be short or long options.
        :param attrs:
            Same attributes as the argparse library's :meth:`add_argument()
            <argparse.ArgumentParser.add_argument>` function accepts.
        c              3   J   K   | ]  }|j                         D ]  }|   y wr8   )r_   ).0r   r;   s      r   	<genexpr>z(OptionGroup.addoption.<locals>.<genexpr>~  s-      *
SYY[*
-1D*
*
s   !#zoption names %s already addedF
shortupperN)setintersectionr]   
ValueErrorr)   _addoption_instance)r   rF   rG   conflictr6   s        r   rI   zOptionGroup.addoptionp  sa     t9)) *
 LL*
 
 <xGHH4)5)  E :r   c                 @    t        |i |}| j                  |d       y )NTr   )r)   r   )r   rF   rG   r6   s       r   
_addoptionzOptionGroup._addoption  s$    4)5)  D 9r   r6   r)   r   c                     |s8|j                   D ])  }|d   dk(  s|d   j                         s t        d       | j                  r| j                  j	                  |       | j
                  j                  |       y )Nr   r   r?   zlowercase shortoptions reserved)r   islowerr   r,   r:   r]   r   )r   r6   r   r   s       r   r   zOptionGroup._addoption_instance  sm    )) Hq6S=SV^^%5$%FGGH ;;KK%%f-F#r   r   )F)r   r   r    r   r!   r   r#   r|   r5   r   rI   r   r   r   r   r   r-   r-   _  s    6
 #'	     	  
;s ;S ;T ;,: :c :d :$* $$ $SW $r   r-   c            	           e Zd Z	 	 ddedeeeef      dee   ddf fdZdede	fdZ
	 	 dd	eee      d
eej                     dej                  fdZej                   dk  r%dedeeeej$                     eee   f      fdZ xZS  xZS )r\   Nr,   r4   r$   r   c                 |    || _         t        | 	  ||j                  dt        dd       |r|| _        y i | _        y )NF@)r$   r'   add_helpformatter_classallow_abbrevfromfile_prefix_chars)_parsersuperr5   r1   DropShorterLongHelpFormatterr4   )r   r,   r4   r$   	__class__s       r   r5   zMyOptionParser.__init__  sE     --8"% 	 	
 )3*r   messagec                     | j                    d| }t        | j                  d      r| d| j                  j                   d}t	        | j                         |z         )z1Transform argparse error message into UsageError.z	: error: _config_source_hintz ())r$   r   r   r   r   format_usage)r   r   r   s      r   errorzMyOptionParser.error  s[    9WI.4<<!67EDLL<<=Q?C**,s233r   rJ   rK   c                    | j                  ||      \  }}|r|D ]  }|s|d   dk(  sddj                  |      z  g}t        | j                  j	                               D ]  \  }}|j                  d| d|         | j                  dj                  |              t        |t              j                  |       |S )z(Allow splitting of positional arguments.r   r   zunrecognized arguments: %s z  r   
)
rs   r   sortedr4   rk   r   r   rm   ra   extend)	r   rJ   rK   parsedunrecognizedarglineskvs	            r   rT   zMyOptionParser.parse_args  s      $44T9E# 13q6S=9SXXl=STUE &t'<'<'> ? 41r!Bqc]34JJtyy/01 FK(//=r   )   	   
arg_stringc                 ~   |sy |d   | j                   vry || j                  v r| j                  |   }||d fS t        |      dk(  ry d|v r7|j                  dd      \  }}|| j                  v r| j                  |   }|||fS | j                  s|j                  d      sn| j                  |      }t        |      dkD  r;t        d      }dj                  d |D              }| j                  |||dz         nt        |      dk(  r|\  }|S | j                  j                  |      r| j                  sy d	|v ry d |d fS )
Nr   r?   =r   z4ambiguous option: %(option)s could match %(matches)sr   c              3   (   K   | ]
  \  }}}|  y wr8   r   )r   r   r6   s      r   r   z1MyOptionParser._parse_optional.<locals>.<genexpr>  s     'Q<1fa'Qs   )r6   matchesr   )prefix_chars_option_string_actionsr   r   r   
startswith_get_option_tuplesr   r   r   _negative_number_matchermatch_has_negative_number_optionals)	r   r   actionoption_stringexplicit_argoption_tuplesr   r]   option_tuples	            r   _parse_optionalzMyOptionParser._parse_optional  sa    !}D$5$55T88844Z@z4//:!#j .8.>.>sA.F+| D$?$??!88GF!=,>>  
(=(=d(C $ 7 7
 C}%)!NC #ii'Q='QQGJJs
w%OOP'1,&3O\'',,22:>::j T))r   r   )r   r   r    r#   r   r   r!   r   r5   r   r   r   r   r   rT   sysversion_infor   Actionr   __classcell__r   s   @r   r\   r\     s     04"	;; T#s(^,; sm	;
 
;&4S 4X 4 )-26x}% H../ 
			" & !	*!!	*eHX__5sHSMIJK!	* !r   r\   c                   ^     e Zd ZdZdededdf fdZdej                  def fdZ	d	 Z
 xZS )
r   a+  Shorten help for long options that differ only in extra hyphens.

    - Collapse **long** options that are the same except for extra hyphens.
    - Shortcut if there are only two options and one of them is a short one.
    - Cache result on the action object as this is called at least 2 times.
    rJ   kwargsr   Nc                 n    d|vr!t         j                  j                         |d<   t        |   |i | y )Nwidth)_pytest_ioget_terminal_widthr   r5   )r   rJ   r   r   s      r   r5   z%DropShorterLongHelpFormatter.__init__  s3    & %kk<<>F7O$)&)r   r   c                    t         |   |      }|r
|d   dk7  r|S t        |dd       }|r|S |j                  d      }t	        |      dk(  r+t	        |d         dk(  st	        |d         dk(  r	||_        |S g }i }|D ]t  }t	        |      dk(  s|d   dk(  r|j                  d      st        d	|z  |      |dd  }|j                  dd
      }	|	|vst	        ||	         t	        |      k  sp|||	<   v |D ]s  }t	        |      dk(  s|d   dk(  r|j                  |       |dd  |j                  |j                  dd
            k(  sR|j                  |j                  ddd             u dj                  |      }
|
|_        |
S )Nr   r   _formatted_action_invocationr   r   r?   r   r   z)long optional argument without "--": [%s]r   r   )r   _format_action_invocationrm   r   r   r   r   r   r   r   r   r   )r   r   orgstrresr]   return_list
short_longr6   xxoption	shortenedformatted_action_invocationr   s              r   r   z6DropShorterLongHelpFormatter._format_action_invocation  s   26:fQi3&M$V-KTRJ,,t$w<1#gaj/Q"6#gaj/Q:N28F/M%'
 	1F6{a6!9#3$$T*#?6JF  abzH ((b1I
*c*Y2G.H3L / )1
9%	1  	@F6{a6!9#3""6*abzZ^^FNN3,CDD""6>>#sA#>?		@
 '+ii&<#.I+**r   c                     ddl }g }|j                         D ]1  }|j                  |j                  |j	                         |             3 |S )z}Wrap lines after splitting on original newlines.

        This allows to have explicit line breaks in the help text.
        r   N)textwrap
splitlinesr   wrapstrip)r   textr   r  r   lines         r   _split_linesz)DropShorterLongHelpFormatter._split_lines  sD    
 	OO% 	=DLLtzz|U;<	=r   )r   r   r    r   r   r5   r   r   r!   r   r  r   r   s   @r   r   r     s?    *c *S *T *$+ $+C $+L
r   r   )%r   r   rR   r   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   _pytest._ior   _pytest.config.exceptionsr   _pytest.deprecatedr   ra   r   r   r#   r   	Exceptionr   r)   r-   ArgumentParserr\   HelpFormatterr   r   r   r   <module>r     s      	 
               0 -  
 ( z$ z$ z$z
7TU
V"I Z6 Z6z2$ 2$jS*X,, S*l>8#9#9 >r   