
    yIfM                       d 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	m
Z
mZ ddlmZ ddlmZmZmZmZmZmZ ddlmZ ddlZddlmZmZ d	d
lmZ d	dlmZmZm Z m!Z!  ej"        d          Z# ej"        dej$                  Z% ej"        d          Z& ej"        d          Z' ej"        d          Z(eee)e*f                  Z+dZ, G d d          Z- G d d          Z. G d d          Z/dZ0dS )zAdapted from the pip code base.    )annotationsN)ArgumentParser	Namespace)Path)IOAnyIteratorListTuplecast)urlopen)InvalidRequirementRequirement   )build_parser)VCSget_url_schemeis_urlurl_to_pathz!(?P<var>\${(?P<name>[A-Z0-9_]+)})z^(http|https|file):z(^|\s+)#.*$z(.*)\[([-._,\sa-zA-Z0-9]*)]z[a-zA-Z0-9]*[-._a-zA-Z0-9]zhttps://pypi.org/simplec                      e Zd Zdd
Zedd            Zedd            Zedd            Zedd            ZddZ	ddZ
ddZdS )ParsedRequirementreqstroptionsdict[str, Any]	from_filelinenointreturnNonec                                        d                              d          	 t                    | _        n# t          $ r t                    s t          fdt          D                       r	| _        nt          |          j	        }g }t                              t                    j                  }|r|                    d                              d          D ]Q}|                                }|st                               |          s	g }|z  }	 nC|                    |           R|t                    j	        z  |                    d          z  }	n|z  }	|r&dd                    t'          |                     dnd}
	 t)          |	                                                    |                    }|d	k    rt.          j        |vrd	t.          j         | }n1# t2          $ r$ t)          |	                                          }Y nw xY w| |
 | _        Y nw xY w|| _        || _        || _        d S )
Nzutf-8c              3     K   | ]C}                     | d           o&t          t          |          dz   d                   V  DdS )+r   N)
startswithr   len).0vr   s     S/var/www/piapp/venv/lib/python3.11/site-packages/tox/tox_env/python/pip/req/file.py	<genexpr>z-ParsedRequirement.__init__.<locals>.<genexpr>(   sW      !e!e\]#..A"9"9"WfSQRSEV>W>W!e!e!e!e!e!e       ,r   [] .)encodedecoder   _requirementr   r   anyr   r   parent_EXTRA_PATH	fullmatchnamegroupsplitstrip_EXTRA_ELEMENTappendjoinsortedr   resolverelative_toossep
ValueError_options
_from_file_lineno)selfr   r   r   r   rootextrasmatchextrapath
extra_partrel_paths    `          r(   __init__zParsedRequirement.__init__#   sY   jj!!((11 	>:Ec:J:JD! 	> 	> 	>c{{ >c!e!e!e!ead!e!e!eee >$'!!I-$&#--d3iin== &!&Q!5!5c!:!: 
H 
H %$ %$-77>> "%'F#'#:D!Ee,,,,#d3ii&66QG#:D@FN<&..!9!9<<<<B
3"4<<>>#=#=d#C#CDDH326+A+A#9rv#9x#9#9! 3 3 3"4<<>>22HHH3 (0$=$=$=!=	>>  #s7   A EH9 AG:9H9:+H(%H9'H((H98H9Requirement | Path | strc                    | j         S N)r3   rH   s    r(   requirementzParsedRequirement.requirementJ   s      r*   c                    | j         S rS   )rF   rT   s    r(   r   zParsedRequirement.from_fileN   s
    r*   c                    | j         S rS   )rG   rT   s    r(   r   zParsedRequirement.linenoR   s
    |r*   c                    | j         S rS   )rE   rT   s    r(   r   zParsedRequirement.optionsV   s
    }r*   c                    | j         j         d| j         d}| j        r|d| j        dz  }|                    d           dS )Nz(requirement=z, zoptions=))	__class____name__r3   rE   rstrip)rH   bases     r(   __repr__zParsedRequirement.__repr__Z   s]    .)MM8IMMM= 	32t}2222D++d##&&&&r*   c                   g }| j                             d          r|                    d           | j                             d          r|                    d           |                    t          | j                             | j                             dg           D ]}|                    d|f           d                    |          S )Nis_constraint-cis_editable-ehashz--hash )r   getr=   r   rU   extendr>   )rH   result
hash_values      r(   __str__zParsedRequirement.__str__`   s    <O,, 	 MM$<M** 	 MM$c$*++,,,,**6266 	2 	2JMM8Z01111xxr*   Iterator[str]c              #  r   K   | j                             d          rdV  t          | j                  V  d S )Nrc   rd   )r   rg   r   r3   rT   s    r(   as_argszParsedRequirement.as_argsk   sD      <M** 	JJJ$#$$$$$$$r*   N)
r   r   r   r   r   r   r   r   r   r    )r   rQ   r   r   )r   r   )r   r   )r   rl   )r\   
__module____qualname__rP   propertyrU   r   r   r   r_   rk   rn    r*   r(   r   r   "   s        % % % %N ! ! ! X!    X    X    X' ' ' '	  	  	  	 % % % % % %r*   r   c                      e Zd ZddZdS )
ParsedLinefilenamer   r   r   argsoptsr   
constraintboolr   r    c                    || _         || _        || _        || _        |rd| _        d| _        || _        d S |j        r"d| _        d| _        |j        d         | _        d S d| _        d S )NTFr   )rv   r   rx   ry   is_requirementrc   rU   	editables)rH   rv   r   rw   rx   ry   s         r(   rP   zParsedLine.__init__r   s     !	$ 
	("&D$D#D^ 	("&D#D#~a0D"'Dr*   N)rv   r   r   r   rw   r   rx   r   ry   rz   r   r    )r\   rp   rq   rP   rs   r*   r(   ru   ru   q   s(        ( ( ( ( ( (r*   ru   c                     e Zd Zd9dZed:d            Zd;d
Zed<d            Zed=d            Zed>d            Z	ed?d            Z
ed@d            ZdAdZdBdZdCdZdDdZdEdZdFd!ZdGd"ZedHd%            ZdId(ZdJd*ZedKd,            ZdLd.ZedMd0            ZedNd2            ZedNd3            ZedNd4            ZedOd6            ZdPd7Zd8S )QRequirementsFilerM   r   ry   rz   r   r    c                r    || _         || _        t                      | _        d | _        d | _        d | _        d S rS   )_path_is_constraintr   _opt_requirements_as_root_args_parser_private)rH   rM   ry   s      r(   rP   zRequirementsFile.__init__   s:    
$.KK	=A/36:r*   c                    | S rS   rs   rT   s    r(   _req_parserzRequirementsFile._req_parser   s    r*   r   c                ,    | j         rdnd d| j         S )Nrb   -rrf   )ra   rM   rT   s    r(   rk   zRequirementsFile.__str__   s$    ,6$$$DDDDDr*   c                    | j         S rS   )r   rT   s    r(   rM   zRequirementsFile.path   s
    zr*   c                    | j         S rS   )r   rT   s    r(   ra   zRequirementsFile.is_constraint   s    ""r*   r   c                8    |                                   | j        S rS   )_ensure_requirements_parsedr   rT   s    r(   r   zRequirementsFile.options   s    ((***yr*   list[ParsedRequirement]c                t    |                                   t          t          t                   | j                  S rS   )r   r   r
   r   r   rT   s    r(   requirementszRequirementsFile.requirements   s-    ((***D*+T-?@@@r*   r   c                x    | j         -t                      | _         |                     | j                    | j         S rS   )r   r   _extend_parserrT   s    r(   _parserzRequirementsFile._parser   s7    '#/>>D  4555##r*   parserc                    d S rS   rs   )rH   r   s     r(   r   zRequirementsFile._extend_parser   s      r*   c                Z    | j         #|                     | j        d          | _         d S d S )NToptrecurse)r   _parse_requirementsr   rT   s    r(   r   z,RequirementsFile._ensure_requirements_parsed   s7    %!%!9!9diQU!9!V!VD &%r*   r   r   c                   g t                      }}|                     t          | j                  | j        |          D ]}}|j        rS|                     |          }t          |          }||vr*|                    |           |                    |           \| 	                    ||j
        |j                   ~|                    | j                   |S )N)key)set_parse_and_recurser   r   ra   r|   _handle_requirement_lineaddr=   _merge_option_linerx   rv   sort	_key_func)rH   r   r   ri   foundparsed_line
parsed_reqr   s           r(   r   z$RequirementsFile._parse_requirements   s    CEE223tz??DDVX_`` 	U 	UK) U!::;GG
*ooe##IIcNNNMM*---''[-={?STTTT'''r*   liner    tuple[int, tuple[int, str, str]]c                   t           dt          dt          dit          |j                           }|t          |j                                                  t          |j                  f}d|j        v rd|fS d|j        v rd|fS d|fS )Nr   r   r+   ra   rc   )r   r   r   typerU   lowerr   )rH   r   of_typebetweens       r(   r   zRequirementsFile._key_func   s    4C3D9I4J4JK3t/006688#dl:K:KKdl**g:DL((g:'zr*   rv   Iterator[ParsedLine]c              #  F  K   |                      ||          D ]}|j        s|j        j        s|j        j        r|j        j        rd|j        j        d         }}nd|j        j        d         }}t
                              |          r!t          j        	                    ||          }n>t
                              |          s$t          t          |          j        |z            }|r#| j                            |||          E d {V  ||_        |V  |V  d S )NFr   T)_parse_filer|   rx   r   constraints
_SCHEME_REsearchurllibparseurljoinr   r   r5   r   r   rv   )rH   rv   ry   r   r   nested_constraintreq_paths          r(   r   z#RequirementsFile._parse_and_recurse   sG      $$Xz:: 	 	D& DI,B diF[ 9) Q279OPQ9Rx%%26	8Ma8Px%$$X.. E%|33HhGGHH#**844 E"4>>#88#CDDH #/BB8M^`ghhhhhhhhhh$,DMJJJJ



!	 	r*   urlc              #     K   |                      |          }|                     |          D ]2\  }}|                     |          \  }}t          |||||          V  3d S rS   )_get_file_content_pre_process_parse_lineru   )rH   r   ry   contentline_numberr   args_strrx   s           r(   r   zRequirementsFile._parse_file   s      ((--!%!2!27!;!; 	K 	KK!--d33NHdS+xzJJJJJJ	K 	Kr*   c                   t          |          }|dv r=t          |          5 }|                     |          cddd           S # 1 swxY w Y   n|dk    rt          |          }	 t	          |                              d          5 }|                     |          }ddd           n# 1 swxY w Y   n*# t          $ r}d| d| }t          |          |d}~ww xY w|S )a  
        Gets the content of a file; it may be a filename, file: URL, or http: URL.  Returns (location, content).
        Content is unicode. Respects # -*- coding: declarations on the retrieved files.

        :param url:         File path or url.
        >   httphttpsNfilerbz!Could not open requirements file z: )r   r   _read_decoder   r   openOSErrorrD   )rH   r   schemeresponsefile_handlertextexcmsgs           r(   r   z"RequirementsFile._get_file_content   sz     $$&&& 3((223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3vc""C	+c%% 7((667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 	+ 	+ 	+BcBBSBBCS//s*	+ sM   AA	A	'"B7 	B+B7 +B//B7 2B/3B7 7
CCCr   	IO[bytes]c                    |                                  }|sdS t          j        |          d         }|                    |          S )Nr/   encoding)readchardetdetectr2   )r   rawcodecs      r(   r   zRequirementsFile._read_decode  sF    !! 	2s##J/zz%   r*   r   ReqFileLinesc                    t          |                                d          }|                     |          }|                     |          }|                     |          S )z
        Split, filter, and join lines, and return a line iterator.

        :param content: the content of the requirements file
        r   )start)	enumerate
splitlines_join_lines_ignore_comments_expand_env_variables)rH   r   
lines_enums      r(   r   zRequirementsFile._pre_process  s\     $-W-?-?-A-A#K#K#K
%%j11
**:66
))*555r*   tuple[str, Namespace]c                    |                      |          \  }}t          j        |t          j        dk              }| j                            |          }||fS )Nwin32)posix)_break_args_optionsshlexr:   sysplatformr   
parse_args)rH   r   r   options_strrw   rx   s         r(   r   zRequirementsFile._parse_line  sT     $ 8 8 > >+{;clg.EFFF|&&t,,~r*   ru   c                    i }| j         r
| j         |d<   | j        r
| j        |d<   t          | j        dg           }|r||d<   t	          | j        || j        | j                  S )Nrc   ra   re   )rc   ry   getattrrx   r   rU   rv   r   )r   req_optionshash_valuess      r(   r   z)RequirementsFile._handle_requirement_line  sw     ') 	:)-)9K&? 	;+/?K(di44 	."-K !1;t{[[[r*   base_optc                   |j         rPt          |d          sg |_         |j         d         |j         vr%|j                             |j         d                    |j        rPt          |d          sg |_        |j        d         |j        vr%|j                            |j        d                    |j        rd|_        |j        r]t          |d          sg |_        |j        D ]%}||j        vr|j                            |           &|j                                         |j        r.t          |dg           r|j        |j        d<   n|j        g|_        |j	        du rg |_        |j
        rPt          |dg           st          g|_        |j
        D ]*}||j        vr|j                            |j
                   +|j        rt          |d          sg |_        |j        d         }t          |                                          j        }||z  }t"          j                            t)          |                    rt)          |          }||j        vr|j                            |           |j        rd|_        |j        rd|_        |j        pg D ]<}	t          |d          sg |_        |	|j        vr|j                            |	           =|j        r|j        |_        |j        r|j        |_        d S d S )	Nr   r   r   Tfeatures_enabled	index_url
find_linkstrusted_hosts)r   hasattrr=   r   require_hashesr   r   r   r   no_indexextra_index_urlDEFAULT_INDEX_URLrh   r   r   absoluter5   rB   rM   existsr   preprefer_binarytrusted_hostr   	no_binaryonly_binary)
rH   r   r   rv   featurer   valuereq_dirrelative_to_reqs_filehosts
             r(   r   z#RequirementsFile._merge_option_line+  sO     	B8^44 +(*%"(*???%,,S-=a-@AAA? 	@8]33 *')$q!)===$++COA,>??? 	+&*H# 	-8%788 /,.)/ > >(";;;-44W===%**,,,= 	5xb11 5(+"1%%&)m_"<4!#H 	C8["55 9&7%8"* C Ch000&--c.ABBB> 
	28\22 )&(#N1%E8nn--//6G$+eO!w~~c"78899 3122H///#**51117 	 HL 	*%)H"$* 	4 	4D8_55 ,)+&8111&--d333= 	/!$H? 	3#&?H   	3 	3r*   tuple[str, str]c                H   |                      d          }g }|dd         }|D ]C}|                    d          r n+|                    |           |                    d           Dd                    |                                          d                    |          fS )z
        Break up the line into an args and options string.  We only want to shlex (and then optparse) the options, not
        the args. args can contain markers which are corrupted by shlex.
        rf   N-r   )r:   r$   r=   popr>   r;   )r   tokensrw   r   tokens        r(   r   z$RequirementsFile._break_args_optionsk  s     C) 	 	E$$ KKKKNNNNxx~~##%%sxx'8'888r*   r   c              #    K   d}g }| D ]\  }}|                     d          rt                              |          r]t                              |          rd| }|r5|                    |           |J |d                    |          fV  g }||fV  |s|}|                    |                    d                     |r|J |d                    |          fV  dS dS )z
        Joins a line ending in '' with the previous line (except when following comments). The joined line takes on the
        index of the first line.
        N\rf   r/   )endswith_COMMENT_RErK   r=   r>   r;   )r   primary_line_numbernew_liner   r   s        r(   r   zRequirementsFile._join_lines{  s?      # !+ 	2 	2K==&& 2+*;*;D*A*A 2$$T** &%t::D ,OOD))).:::-rwwx/@/@@@@@!HH%t+++++ 6*5'

4 0 01111 	9&222%rwwx'8'8888888	9 	9r*   c              #     K   | D ]:\  }}t                               d|                                          }|r||fV  ;dS )z'Strips comments and filter empty lines.r/   N)r  subr;   )r   r   r   processed_lines       r(   r   z!RequirementsFile._ignore_comments  s_       ", 	2 	2K(__R66<<>>N 2!>1111	2 	2r*   c              #     K   | D ]Z\  }}|}t                               |          D ]2\  }}t          j        |          }|s|                    ||          }3||fV  [dS )a  
        Replace all environment variables that can be retrieved via `os.getenv`.

        The only allowed format for environment variables defined in the requirement file is `${MY_VARIABLE_1}` to
        ensure two things:

        1. Strings that contain a `$` aren't accidentally (partially) expanded.
        2. Ensure consistency across platforms for requirement files.

        These points are the result of a discussion on the `github pull request #3514
        <https://github.com/pypa/pip/pull/3514>`_. Valid characters in variable names follow the `POSIX standard
        <http://pubs.opengroup.org/onlinepubs/9699919799/>`_ and are limited to uppercase letter, digits and the `_`.
        N)_ENV_VAR_REfindallrB   getenvreplace)r   r   r   expanded_lineenv_varvar_namer  s          r(   r   z&RequirementsFile._expand_env_variables  s       ", 	- 	-K M%0%8%8%G%G F F!	(++  - 5 5gu E E},,,,,	- 	-r*   	list[str]c                "   | j         t                      }g }|                     |d          D ])}|                    |                                           *|                     |          }|                    |           || _         | j         S )NFr   )r   r   r   rh   rn   _option_to_args)rH   r   ri   r   option_argss        r(   as_root_argszRequirementsFile.as_root_args  s    %++C "F//C/GG - -ckkmm,,,,..s33KMM+&&&!'D!!r*   c                @   g }t          |dg           D ]}|                    d|f           t          |dg           D ]}|                    d|f           t          |dd           }|j|rS|d         t          k    r|                    d|d         f           |dd          D ]}|                    d	|f           n|                    d
           t          |dg           D ]}|                    d|f           t	          |d          r|                    d           t          |dg           D ]}|                    d|f           t	          |d          r|                    d           t	          |d          r|                    d           t          |dg           D ]}|                    d|f           t	          |d          r|                    d|j        f           t	          |d          r|                    d|j        f           |S )Nr   r   r   rb   r   r   z-ir   z--extra-index-urlz
--no-indexr   z-fr   z--prer   z--trusted-hostr   z--prefer-binaryr   z--require-hashesr   z--use-featurer   z--no-binaryr   z--only-binary)r   rh   r   r=   r   r   r   )	rH   r   ri   r   r   r   linkr  r  s	            r(   r  z RequirementsFile._option_to_args  sn   333 	' 	'CMM4+&&&&3r22 	' 	'CMM4+&&&&Cd33	  ,Q<#444MM41"6777$QRR= > >CMM#6"<====> l+++Cr22 	( 	(DMM4,''''3 	#MM'"""C"55 	4 	4DMM+T233333(( 	-MM+,,,3()) 	.MM,---s$6;; 	6 	6GMM?G455553$$ 	:MM=#-89993&& 	>MM?CO<===r*   N)rM   r   ry   rz   r   r    )r   r   ro   )r   r   )r   rz   )r   r   )r   r   )r   r   )r   r   r   r    )r   r    )r   r   r   rz   r   r   )r   r   r   r   )rv   r   ry   rz   r   rz   r   r   )r   r   ry   rz   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r   ru   r   r   )r   r   r   r   rv   r   r   r    )r   r   r   r  )r   r   r   r   )r   r  )r   r   r   r  )r\   rp   rq   rP   rr   r   rk   rM   ra   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r!  r  rs   r*   r(   r   r      s       ; ; ; ;    XE E E E    X # # # X#    X A A A XA $ $ $ X$ BAAAW W W W         0K K K K   * ! ! ! \!	6 	6 	6 	6    \ \ \ \\>3 >3 >3 >3@ 9 9 9 \9 9 9 9 \96 2 2 2 \2 - - - \-. 
" 
" 
" X
"     r*   r   )r   r   r   )1__doc__
__future__r   rB   rer   r   urllib.parser   argparser   r   pathlibr   typingr   r   r	   r
   r   r   urllib.requestr   r   packaging.requirementsr   r   rw   r   utilr   r   r   r   compiler  
IGNORECASEr   r  r6   r<   r   r   r   r   r   ru   r   __all__rs   r*   r(   <module>r2     s   % % " " " " " " 				 				  



     . . . . . . . .       7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 " " " " " "  B B B B B B B B       : : : : : : : : : : : : bj=>>RZ.>>
bj((bj7889::c3h(- L% L% L% L% L% L% L% L%^( ( ( ( ( ( ( (4X X X X X X X Xv
r*   