
    VPi?                       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	Z	ddl
Z
ddlZddlmZmZmZ ddlmZ ddlmZ ddlmZ ddlmZmZmZ dd	lmZ dd
lmZ ddlm Z 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l0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7  e	j8        e9          Z:ee;e;f         Z<dJdZ= G d de>          Z?dKd!Z@ G d" d#e>          ZAdLd&ZBdMd'ZCdNd*ZD G d+ d,          ZE G d- d.e          ZFdOd0ZGeGdPd4            ZH ed56           G d7 d2                      ZI G d8 d9e          ZJ	 dQdRd@ZK	 dSdTdCZLdUdEZM G dF dGe          ZN G dH dI          ZOdS )VzO
The main purpose of this module is to expose LinkCollector.collect_sources().
    )annotationsN)IterableMutableMappingSequence)	dataclass)
HTMLParser)Values)Callable
NamedTupleProtocol)requests)Response)
RetryErrorSSLError)NetworkConnectionError)Link)SearchScope)
PipSession)raise_for_status)is_archive_fileredact_auth_from_url)url_to_path)vcs   )CandidatesFromPage
LinkSourcebuild_sourceurlstrreturn
str | Nonec                    t           j        D ]D}|                                                     |          r| t	          |                   dv r|c S EdS )zgLook for VCS schemes in the URL.

    Returns the matched VCS scheme, or None if there's no match.
    z+:N)r   schemeslower
startswithlen)r   schemes     q/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/pip/_internal/index/collector.py_match_vcs_schemer*   .   sW    
 +  99;;!!&)) 	c#f++.>$.F.FMMM4    c                        e Zd Zd fdZ xZS )_NotAPIContentcontent_typer    request_descr!   Nonec                h    t                                          ||           || _        || _        d S N)super__init__r.   r/   )selfr.   r/   	__class__s      r)   r4   z_NotAPIContent.__init__:   s3    |444((r+   )r.   r    r/   r    r!   r0   )__name__
__module____qualname__r4   __classcell__r6   s   @r)   r-   r-   9   s=        ) ) ) ) ) ) ) ) ) )r+   r-   responser   r0   c                    | j                             dd          }|                                }|                    d          rdS t	          || j        j                  )z
    Check the Content-Type header to ensure the response contains a Simple
    API Response.

    Raises `_NotAPIContent` if the content type is not a valid content-type.
    Content-TypeUnknown)z	text/htmlz#application/vnd.pypi.simple.v1+html#application/vnd.pypi.simple.v1+jsonN)headersgetr%   r&   r-   requestmethod)r<   r.   content_type_ls      r)   _ensure_api_headerrF   @   sg     #''	BBL!''))N  	
   	
x'7'>
?
??r+   c                      e Zd ZdS )_NotHTTPN)r7   r8   r9    r+   r)   rH   rH   V   s        Dr+   rH   sessionr   c                    t           j                            |           \  }}}}}|dvrt                      |                    | d          }t          |           t          |           dS )z
    Send a HEAD request to the URL, and ensure the response contains a simple
    API Response.

    Raises `_NotHTTP` if the URL is not available for a HEAD request, or
    `_NotAPIContent` if the content type is not a valid content type.
    >   httphttpsT)allow_redirectsN)urllibparseurlsplitrH   headr   rF   )r   rJ   r(   netlocpathqueryfragmentresps           r)   _ensure_api_responserX   Z   sq     -3L,A,A#,F,F)FFD%&&&jj<<T<22DTtr+   c                   t          t          |           j                  rt          | |           t                              dt          |                      |                    | d                    g d          dd          }t          |           t          |           t                              dt          |           |j                            d	d
                     |S )aY  Access an Simple API response with GET, and return the response.

    This consists of three parts:

    1. If the URL looks suspiciously like an archive, send a HEAD first to
       check the Content-Type is HTML or Simple API, to avoid downloading a
       large file. Raise `_NotHTTP` if the content type cannot be determined, or
       `_NotAPIContent` if it is not HTML or a Simple API.
    2. Actually perform the request. Raise HTTP exceptions on network failures.
    3. Check the Content-Type header to make sure we got a Simple API response,
       and raise `_NotAPIContent` otherwise.
    rJ   zGetting page %sz, )r@   z*application/vnd.pypi.simple.v1+html; q=0.1ztext/html; q=0.01z	max-age=0)AcceptzCache-Control)rA   zFetched page %s as %sr>   r?   )r   r   filenamerX   loggerdebugr   rB   joinr   rF   rA   )r   rJ   rW   s      r)   _get_simple_responser`   l   s     tCyy)** 3S'2222
LL"$8$=$=>>>;;ii   ( )+
 
   D4 T t
LLS!!33   Kr+   rA   ResponseHeadersc                    | rSd| v rOt           j                                        }| d         |d<   |                    d          }|rt	          |          S dS )z=Determine if we have any encoding information in our headers.r>   zcontent-typecharsetN)emailmessageMessage	get_paramr    )rA   mrc   s      r)   _get_encoding_from_headersri      s`      >W,,M!!###N3.++i(( 	 w<<4r+   c                  &    e Zd ZddZdd	ZddZdS )CacheablePageContentpageIndexContentr!   r0   c                &    |j         sJ || _        d S r2   )cache_link_parsingrl   r5   rl   s     r)   r4   zCacheablePageContent.__init__   s    &&&&			r+   otherobjectboolc                p    t          |t          |                     o| j        j        |j        j        k    S r2   )
isinstancetyperl   r   )r5   rq   s     r)   __eq__zCacheablePageContent.__eq__   s*    %d,,P%*.1PPr+   intc                4    t          | j        j                  S r2   )hashrl   r   r5   s    r)   __hash__zCacheablePageContent.__hash__   s    DIM"""r+   N)rl   rm   r!   r0   )rq   rr   r!   rs   )r!   rx   )r7   r8   r9   r4   rw   r|   rI   r+   r)   rk   rk      sT           Q Q Q Q# # # # # #r+   rk   c                      e Zd ZddZdS )
ParseLinksrl   rm   r!   Iterable[Link]c                    d S r2   rI   rp   s     r)   __call__zParseLinks.__call__   s      r+   Nrl   rm   r!   r   )r7   r8   r9   r   rI   r+   r)   r~   r~      s        AAAAAAr+   r~   fnc                |     t           j        d	 fd            t          j                   d
 fd            }|S )z
    Given a function that parses an Iterable[Link] from an IndexContent, cache the
    function's result (keyed by CacheablePageContent), unless the IndexContent
    `page` has `page.cache_link_parsing == False`.
    cacheable_pagerk   r!   
list[Link]c                >    t           | j                            S r2   )listrl   )r   r   s    r)   wrapperz*with_cached_index_content.<locals>.wrapper   s    BB~*++,,,r+   rl   rm   c                r    | j         r t          |                     S t           |                     S r2   )ro   rk   r   )rl   r   r   s    r)   wrapper_wrapperz2with_cached_index_content.<locals>.wrapper_wrapper   s;    " 	77/55666BBtHH~~r+   )r   rk   r!   r   )rl   rm   r!   r   )	functoolscachewraps)r   r   r   s   ` @r)   with_cached_index_contentr      sr     _- - - - - _- _R      
 r+   rl   rm   r   c              #    K   | j                                         }|                    d          rUt          j        | j                  }|                    dg           D ]#}t          j        || j	                  }||V  $dS t          | j	                  }| j        pd}|                    | j                            |                     | j	        }|j        p|}|j        D ] }	t          j        |	||          }||V  !dS )z\
    Parse a Simple API's Index Content, and yield its anchor elements as Link objects.
    r@   filesNzutf-8)page_urlbase_url)r.   r%   r&   jsonloadscontentrB   r   	from_jsonr   HTMLLinkParserencodingfeeddecoder   anchorsfrom_element)
rl   rE   datafilelinkparserr   r   r   anchors
             r)   parse_linksr      s!      &,,..N  !FGG z$,''HHWb)) 	 	D>$11D|JJJJDH%%F}'H
KK##H--...
(C%#H.   #III<



	 r+   T)frozenc                  R    e Zd ZU dZded<   ded<   ded<   ded<   d	Zd
ed<   ddZdS )rm   a  Represents one response (or page), along with its URL.

    :param encoding: the encoding to decode the given content.
    :param url: the URL from which the HTML was downloaded.
    :param cache_link_parsing: whether links parsed from this page's url
                               should be cached. PyPI index urls should
                               have this set to False, for example.
    bytesr   r    r.   r"   r   r   Trs   ro   r!   c                *    t          | j                  S r2   )r   r   r{   s    r)   __str__zIndexContent.__str__  s    #DH---r+   N)r!   r    )r7   r8   r9   __doc____annotations__ro   r   rI   r+   r)   rm   rm      sr           NNNHHH#####. . . . . .r+   c                  4     e Zd ZdZd fdZdd
ZddZ xZS )r   zf
    HTMLParser that keeps the first base HREF and a list of all anchor
    elements' attributes.
    r   r    r!   r0   c                v    t                                          d           || _        d | _        g | _        d S )NT)convert_charrefs)r3   r4   r   r   r   )r5   r   r6   s     r)   r4   zHTMLLinkParser.__init__  s7    $///$(46r+   tagattrslist[tuple[str, str | None]]c                    |dk    r)| j         "|                     |          }|	|| _         d S d S |dk    r)| j                            t	          |                     d S d S )Nbasea)r   get_hrefr   appenddict)r5   r   r   hrefs       r)   handle_starttagzHTMLLinkParser.handle_starttag  sn    &==T]2==''D $  CZZLU,,,,, Zr+   r"   c                *    |D ]\  }}|dk    r|c S d S )Nr   rI   )r5   r   namevalues       r)   r   zHTMLLinkParser.get_href!  s1      	 	KD%v~~ tr+   )r   r    r!   r0   )r   r    r   r   r!   r0   )r   r   r!   r"   )r7   r8   r9   r   r4   r   r   r:   r;   s   @r)   r   r     so         
7 7 7 7 7 7- - - -       r+   r   r   r   reasonstr | ExceptionmethCallable[..., None] | Nonec                <    |t           j        } |d| |           d S )Nz%Could not fetch URL %s: %s - skipping)r]   r^   )r   r   r   s      r)   _handle_get_simple_failr   (  s+    
 ||D	0$?????r+   ro   rs   c                |    t          | j                  }t          | j        | j        d         || j        |          S )Nr>   )r   r   ro   )ri   rA   rm   r   r   )r<   ro   r   s      r)   _make_index_contentr   2  sG     *(*:;;H(L-   r+   IndexContent | Nonec                  | j                             dd          d         }t          |          }|rt                              d||            d S |                    d          rt          j                            t          |                    rU|
                    d          s|dz  }t          j                            |d          }t                              d|           	 t          ||	          }t!          || j        
          S # t$          $ r t                              d|            Y nt&          $ r1}t                              d| |j        |j                   Y d }~nd }~wt,          $ r}t/          | |           Y d }~nd }~wt0          $ r}t/          | |           Y d }~nd }~wt2          $ r:}d}|t5          |          z  }t/          | |t          j                   Y d }~nRd }~wt8          j        $ r}t/          | d|            Y d }~n(d }~wt8          j        $ r t/          | d           Y nw xY wd S )N#r   r   zICannot look at %s URL %s because it does not support lookup as web pages.zfile:/z
index.htmlz# file: URL is directory, getting %srZ   )ro   z`Skipping page %s because it looks like an archive, and cannot be checked by a HTTP HEAD request.zSkipping page %s because the %s request got Content-Type: %s. The only supported Content-Types are application/vnd.pypi.simple.v1+json, application/vnd.pypi.simple.v1+html, and text/htmlz4There was a problem confirming the ssl certificate: )r   zconnection error: z	timed out)r   splitr*   r]   warningr&   osrT   isdirr   endswithrO   rP   urljoinr^   r`   r   ro   rH   r-   r/   r.   r   r   r   r   r    infor   ConnectionErrorTimeout)r   rJ   r   
vcs_schemerW   excr   s          r)   _get_index_contentr   ?  s   
(..a
 
 
#C #3''J W	
 	
 	

 t ~~g 
A27==S1A1A#B#B 
A ||C   	3JC
 l""355:C@@@U#C999: #4D<STTTT9  
 
 
1	
 	
 	
 	
 	

  
 
 
A 	
 	
 	
 	
 	
 	
 	
 	
 " + + +c******** + + +c******** @ @ @G#c((f6;?????????# B B B&@3&@&@AAAAAAAA 3 3 3k222223 4sT   (D %I7	I 'E,,I9FIF00I=0G22IH"I Ic                  $    e Zd ZU ded<   ded<   dS )CollectedSourceszSequence[LinkSource | None]
find_links
index_urlsN)r7   r8   r9   r   rI   r+   r)   r   r   {  s*         ++++++++++r+   r   c                  ^    e Zd ZdZddZe	 ddd            Zedd            Zd dZ	d!dZ
dS )"LinkCollectorz
    Responsible for collecting Link objects from all configured locations,
    making network requests as needed.

    The class's main method is its collect_sources() method.
    rJ   r   search_scoper   r!   r0   c                "    || _         || _        d S r2   )r   rJ   )r5   rJ   r   s      r)   r4   zLinkCollector.__init__  s    
 )r+   Foptionsr	   suppress_no_indexrs   c                   |j         g|j        z   }|j        r<|s:t                              dd                    d |D                                  g }|j        pg }t          j        |||j                  }t          ||          }|S )z
        :param session: The Session to use to make requests.
        :param suppress_no_index: Whether to ignore the --no-index option
            when constructing the SearchScope object.
        zIgnoring indexes: %s,c              3  4   K   | ]}t          |          V  d S r2   r   ).0r   s     r)   	<genexpr>z'LinkCollector.create.<locals>.<genexpr>  s+      IIs-c22IIIIIIr+   )r   r   no_index)rJ   r   )
	index_urlextra_index_urlsr   r]   r^   r_   r   r   creater   )clsrJ   r   r   r   r   r   link_collectors           r)   r   zLinkCollector.create  s     '(7+CC
 	$5 	LL&IIjIIIII   J '-2
")!!%
 
 

 '%
 
 
 r+   	list[str]c                    | j         j        S r2   )r   r   r{   s    r)   r   zLinkCollector.find_links  s     ++r+   locationr   r   c                .    t          || j                  S )z>
        Fetch an HTML page containing package links.
        rZ   )r   rJ   )r5   r   s     r)   fetch_responsezLinkCollector.fetch_response  s     "(DLAAAAr+   project_namer    candidates_from_pager   r   c                z    t          j         fd j                                      D                                                       }t          j         fd j        D                                                       }t                              t          j	                  red t          j        ||          D             }t          |           d dg|z   }t                              d                    |                     t          t!          |          t!          |                    S )Nc           	   3  V   K   | ]#}t          |j        j        d d           V  $dS )Fr   page_validator
expand_dirro   r   Nr   rJ   is_secure_originr   locr   r   r5   s     r)   r   z0LinkCollector.collect_sources.<locals>.<genexpr>  s_       
4
 
4
  %9#|< #()  
4
 
4
 
4
 
4
 
4
 
4
r+   c           	   3  V   K   | ]#}t          |j        j        d d           V  $dS )Tr   Nr   r   s     r)   r   z0LinkCollector.collect_sources.<locals>.<genexpr>  s_       
5
 
5
  %9#|<#')  
5
 
5
 
5
 
5
 
5
 
5
r+   c                4    g | ]}||j         d|j          S )Nz* )r   )r   ss     r)   
<listcomp>z1LinkCollector.collect_sources.<locals>.<listcomp>  s6       =QV%7 QV%7%7%7r+   z' location(s) to search for versions of :
)r   r   )collectionsOrderedDictr   get_index_urls_locationsvaluesr   r]   isEnabledForloggingDEBUG	itertoolschainr'   r^   r_   r   r   )r5   r   r   index_url_sourcesfind_links_sourcesliness   ```   r)   collect_sourceszLinkCollector.collect_sources  s    (3 
4
 
4
 
4
 
4
 
4
 
4
 (AA,OO
4
 
4
 
4
 

 

 &(( 	 )4 
5
 
5
 
5
 
5
 
5
 
5
 
5
 
5
 
5
 

 

 &(( 	 w}-- 
	+ ");=NOO  E u:: 3 3#/3 3 3 E LL5))***.//-..
 
 
 	
r+   N)rJ   r   r   r   r!   r0   )F)rJ   r   r   r	   r   rs   r!   r   )r!   r   )r   r   r!   r   )r   r    r   r   r!   r   )r7   r8   r9   r   r4   classmethodr   propertyr   r   r  rI   r+   r)   r   r     s             
 #(	    [B , , , X,B B B B,
 ,
 ,
 ,
 ,
 ,
r+   r   )r   r    r!   r"   )r<   r   r!   r0   )r   r    rJ   r   r!   r0   )r   r    rJ   r   r!   r   )rA   ra   r!   r"   )r   r~   r!   r~   r   r2   )r   r   r   r   r   r   r!   r0   )T)r<   r   ro   rs   r!   rm   )r   r   rJ   r   r!   r   )Pr   
__future__r   r   email.messagerd   r   r  r   r  r   urllib.parserO   collections.abcr   r   r   dataclassesr   html.parserr   optparser	   typingr
   r   r   pip._vendorr   pip._vendor.requestsr   pip._vendor.requests.exceptionsr   r   pip._internal.exceptionsr   pip._internal.models.linkr   !pip._internal.models.search_scoper   pip._internal.network.sessionr   pip._internal.network.utilsr   pip._internal.utils.filetypesr   pip._internal.utils.miscr   pip._internal.utils.urlsr   pip._internal.vcsr   sourcesr   r   r   	getLoggerr7   r]   r    ra   r*   	Exceptionr-   rF   rH   rX   r`   ri   rk   r~   r   r   rm   r   r   r   r   r   r   rI   r+   r)   <module>r%     s    # " " " " "                   				     > > > > > > > > > > ! ! ! ! ! ! " " " " " "                !           ) ) ) ) ) ) @ @ @ @ @ @ @ @ ; ; ; ; ; ; * * * * * * 9 9 9 9 9 9 4 4 4 4 4 4 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 0 0 0 0 0 0 ! ! ! ! ! ! A A A A A A A A A A		8	$	$ c*   ) ) ) ) )Y ) ) )@ @ @ @,	 	 	 	 	y 	 	 	   $< < < <~   	# 	# 	# 	# 	# 	# 	# 	#B B B B B B B B   (    8 $. . . . . . . .(    Z   > (,@ @ @ @ @ 48
 
 
 
 
9 9 9 9x, , , , ,z , , ,
h
 h
 h
 h
 h
 h
 h
 h
 h
 h
r+   