
    =eU                     v   d dl mZ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	 d dl
mZ d dlZd dlmZ d dlmZmZ d dlmZ d Zd	 Z ej        d
ej        ej        z            Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d  Z/e0d!k    r e/             dS dS )"    )print_functionunicode_literalsN)Parser)path)errors)extract_firstpop_key)PackageTypec                     | d         S )N    items    Clib/python3.11/site-packages/binstar_client/inspect_package/pypi.pysort_verr      s    7N    c                     | d         S Nnamer   r   s    r   sort_keyr      s    <r   z
    # Text needs to be stripped and all extra spaces replaced by single spaces
    (?P<name>^[A-Z0-9][A-Z0-9._-]*)?
    \s?
    (\[(?P<extras>.*)\])?
    \s?
    (?P<constraints>\(? \s? ([\w\d<>=!~,\s\.\*]*) \s? \)? )?
    \s?
c                     | r<|                      dd                               dd                                          ndS )N.-_ )replacelower)r   s    r   norm_package_namer   -   s<    ?CK4<<S!!))#s3399;;;Kr   c                     | r\d                     |                                           } |                     d          r|                     d          r
| dd         } nd} | S )z=Normalize a version by removing extra spaces and parentheses.r   ()r   )joinsplit
startswithendswith)versions    r   norm_package_versionr(   1   sf     '''--//**c"" 	$w'7'7'<'< 	$admGNr   c                     |                      |d          }|d                                         }d}t          |          dk    r|d                                         }||fS )zBSplit a spec by separator and return stripped start and end parts.r   r   r      r"   )rsplitstriplen)specsepparts
spec_startspec_ends        r   
split_specr3   =   sZ    KKQEq!!JH
5zzQ9??$$xr   c                    | g d}}}d                     d |                     d          D                                                       } t          | d          \  } }t          | d          \  } }t                              |           }|r|                    d          }|                    d          }|rd |                    d	          D             ng }|                    d
          }d                     d |                    d          D                                                       }|                    d          r|                    d          r
|dd         }|||||fS )a  
    Parse a requirement from a python distribution metadata and return a
    tuple with name, extras, constraints, marker and url components.

    This method does not enforce strict specifications but extracts the
    information which is assumed to be *correct*. As such no errors are raised.

    Example
    -------
    spec = 'requests[security, tests] >=3.3.0 ; foo >= 2.7 or bar == 1'

    ('requests', ['security', 'pyfoo'], '>=3.3.0', 'foo >= 2.7 or bar == 1', '')
    r    c              3      K   | ]}||V  	d S Nr   .0parts     r   	<genexpr>z&parse_specification.<locals>.<genexpr>X   s'      ==T=D======r   ;@r   extrasc                 :    g | ]}||                                 S r   )r,   )r9   extras     r   
<listcomp>z'parse_specification.<locals>.<listcomp>h   s%    HHHE%H%++--HHHr   ,constraintsc              3      K   | ]}||V  	d S r7   r   r8   s     r   r;   z&parse_specification.<locals>.<genexpr>l   s'      BBTBBBBBBBr   r    r!   r   r"   )	r#   r$   r,   r3   PARTIAL_PYPI_SPEC_PATTERNmatchgroupr%   r&   )r.   r   r>   constmarkerurlrs          r   parse_specificationrL   G   so    B%&D 88==TZZ__=====CCEED dC((LD& 4%%ID# 	"''--A  wwv ""LRZHHV\\#->->HHHHXZ &&BBS)9)9BBBBBHHJJC   	 U^^C%8%8 	 !B$KE++r   c                    t           j        j        }|dk    r"t                                          |           } n5t                                          |                     dd                    } |                                 }|                    d          }	 |r!|d         dk    r|                                 nn%d	                    |          S )zEGet description from metadata file and remove any empty lines at end.   UTF-8r   
Tr"   r   )
sysversion_infomajorr   parsestrencodeget_payloadr$   popr#   )filedatapython_versionpayloadliness       r   get_header_descriptionr\   t   s    %+N88$$X..88$$X__Wi%H%HII""$$GMM$E 	U2Y"__IIKKKK	
 99Ur   c                 *   t           j        j        }|dk    r4t                                          |                                           } nGt                                          |                     dd                                                    } | S )NrN   rO   r   )rQ   rR   rS   r   rT   itemsrU   )rX   rY   s     r   python_version_checkr_      ss    %+N88$$X..446688$$X__Wi%H%HIIOOQQOr   c                    t           j                            |           }|j                            t
                     |r+||                             |j        |j        pg d           n$|                    |j        |j        pg d           |                    t                     |	                                D ]}|                    t                     d S )Nkeyr   specs)
pkg_resourcesRequirementparserd   sortr   appendrb   r   values)linedepsr>   r@   req
extra_items         r   parse_requirementro      s    

#
)
)$
/
/CINNxN    Aucg	RHHIIIISWsyB??@@@II(Immoo & &
H%%%%& &r   c                    g }d}i }d }|                      d          D ]}|                                }|s|                    d          r6|                    d          r!|dd         }|                    |g            d	 t          ||||           x# t          $ r d}Y w xY wd |                                D             }|t          |t          	          t          |t          	          d
S )NFrP   []r   r"   Tc                 F    g | ]\  }}|t          |t                     dS )ra   r   depends)sortedr   r9   rb   values      r   rA   z&parse_requires_txt.<locals>.<listcomp>   sH       
 C e222	
 	
  r   ra   )has_dep_errorsru   r>   )
r$   r,   r%   r&   
setdefaultro   
ValueErrorr^   rv   r   )requires_txtrl   errorr>   r@   rk   s         r   parse_requires_txtr~      s4   DEFE""4((  zz|| 	??3 	DMM#$6$6 	2JEeR(((	dD&%8888 	 	 	EEE	 
 !,,..  F  $H---X...  s   BB%$B%c                    g }| D ]N}|                                 }d }d|v r.|                    dd          \  }}|                                 }nd }|                    dd          }t          |          dk    r+|                    |                                g d           |\  }}|                                 }|d         dk    r
|dd          }|d         dk    r
|d d         }t
          j                            |d|          }|j        	                    t          	           |                    |j        |j        pg d           P|S )
Nr<   r   r5   rc   r   r    r"   r!   ra   )r,   r$   r-   ri   r   re   rf   rg   rd   rh   r   rb   )requiresobjrm   rI   req_specr.   s         r   format_requirementsr      sd   
C  iikk #::))C++KC\\^^FFF99S!$$x==A JJ		b99:::: IC::<<DAw#~~ABBxBx3CRCy+11SSS$$2GHHCINNxN(((JJb      Jr   c                 H   g }g }g }| D ]}|                     d          }|                     d          }|d         }|rg }|                    ||d           n||}ng }|                    ||d           |                    t          |                     t	          |           |                    t                     |                    t                     |D ]#}|d                             t                     $dt          |t                    ||d}	|	S )	Nr@   environmentr   rt   ra   ru   Fry   ru   r>   environments)getri   extendr   printrh   r   rv   )
run_requiresrl   r>   r   run_requirer@   envr   r   attrss
             r   format_run_requires_metadatar      sO   DFL#  ((oom,,z* 	;C = =>>>>]CCCMM5S99:::

&x00111c



II(I
KKHK , ,i(++++  $H---$	 E Lr   c                    g }g }t          j        d          }d}t          | t                    sd}i } |                                 D ]z\  }}|                    |          }|r:|                                d         }||}	ng }	|                    ||	d           n|}	|	                    t          |                     {|||d}
|
S )Nzextra == [''](.*)['']FTr   rt   )ry   ru   extra_depends)
recompile
isinstancedictr^   rF   groupsri   r   r   )r   rl   r>   	extras_rery   rb   requirementsis_extrar@   r   r   s              r   format_requires_metadatar     s    DF
677INlD)) )//11 6 6\??3'' 		OO%%a(E}u==>>>> C

&|445555 ) E Lr   c                    t          |           }t          |           }t          |          }t          |dd          }t	          j        |          }||                    d          d         }|t          |dd          t          |dd          d}t          |d          t          |d	|          t          |d
d          d}|dddd}	g }
i }i }|D ]\  }}|dv rt          |          \  }}}}}t          |          }|                    d          }g }|D ]t}d t          |          D             }|rW|d         }|d|         
                                ||d         
                                }}|                    ||f           u|r |                    d          r|                    dd          }|                    dd          
                                }|                    d          d         }|                    d          r|                    d          r
|dd         }||vr||dg||<   q||                             ||d           ||vr||dg||<   ||                             ||d           |
                    ||d           |
                    d            g }|                                D ]\  }}|                    ||d           g }|                                D ]\  }}|                    ||d           |	                    d|
||d            |||	fS )!z
    Format the metadata of Standard Python packages stored in email header format.

    Currently only used as backup on the wheel (compressed) file format.
    NameNr   r   SummaryLicenser   summarylicenseVersionDescription	Home-pager'   description	home_pagesdistsourcepackagetyperY   basenamer   zRequires-DistRequiresrB   c                      g | ]\  }}|d v 	|S )
0123456789r   )r9   index	characters      r   rA   z0format_sdist_header_metadata.<locals>.<listcomp>_  s(    bbb!1		UaHaHauHaHaHar   r@   r   z==r5   r"   )"'r   rc   c                     | d         S r   r   )os    r   <lambda>z.format_sdist_header_metadata.<locals>.<lambda>~  s
    AfI r   ra   rt   Fr   dependencies)r\   r_   r   r	   r   r   r$   rL   r   	enumerater,   ri   r%   r   r+   r&   rh   r^   update)datafilenamer   config_itemsr   r   r   package_datarelease_data	file_datarl   extsr   rb   valr>   rH   rI   rJ   rd   	new_specsr.   poscompspec_extnew_extsrj   new_environmentss                                r   format_sdist_header_metadatar   1  s    )..K'--LE5&$''D}X&&H|~~c""1% 5)T225)T22 L 5),,um[AAUK66 L "&
 
 I DDL  $ $S////B3/G/G,D&%$T**DKK$$EI 4 4bbYt__bbb 4a&C"&tt*"2"2"4"4d344j6F6F6H6H%D$$dE]333  $$W-- X#^^GR88F#^^D"55;;==F --,,R0C~~k22 (s||K7P7P (!!B$i$.2Y%G%G$HS		S	(($)K)KLLLL\119=	0R0R/SV,,$V,33TI4V4VWWWW &    
 	II%%I&&&Hzz|| : :V889999#))++ B BV @ @AAAA(	# #    y00r   c                    t          | d          t          | dd           t          | dd           d}|                     d          pi                     d          }|sQ|                     di                               di                               di                               d          }|r&t          |d	|z                                            }nd }|                     d
i                               d          }|sQ|                     di                               di                               d
i                               d          }t          | d          ||d}ddd |                                 D             d}|                     di           rt          | d                   }	n#t          |                     di                     }	t          j        |          ||	d}
|||
fS )Nr   r   r   r   document_namesr   
extensionszpython.detailsz*.dist-info/%sproject_urlsHomer'   r   bdist_wheelr   c                     g | ]
\  }}||d S ))rb   rx   r   rw   s      r   rA   z.format_wheel_json_metadata.<locals>.<listcomp>  s;     
 
 

 U  
 
 
r   )r   rY   pypir   r   )r   r   r   )	r	   r   r   r,   r^   r   r   r   r   )r   r   zip_filer   description_docr   r   r   r   r   r   s              r   format_wheel_json_metadatar     s%   f%%4D114D11 L
 xx 0117R<<]KKO  O((<4488b" ""%#&6";";CC<N<N 	  #H.>.PQQWWYY."--226::I mHH\2..223CRHHLL^]_``ddekll	 4++" L %"
 

 #jjll
 
 

 
E xx## J3D4HII/R0H0HII M(++$ I y00r   c                    t          j        |          }t          |d          }|t          |d          }d }t          |d          }|r(t          t	          j        |          | |          \  }}}n|rt          ||           \  }}}ni i i }}}t          j        |           } | d d         	                    d          }t          |          dk    r|\  }	}	}
}}d}n,t          |          dk    r
|\  }	}	}}
}}nt          d	          |d
k    rd }|dk    rd }|                    di            ||
|dd|d<   |                    |           |||fS )Nz*.dist-info/metadata.jsonz*.dist-info/pydist.jsonz*.dist-info/METADATAr      r      zBad wheel package nameanynoner   r   )build_norY   abir   )platform)zipfileZipFiler   r   jsonloadsr   r   r   r$   r-   	TypeErrorrz   r   )r   fileobjtar_file	json_datar   r   r   r   file_componentsr   rY   r   r   r   s                 r   inspect_pypi_package_whlr     s   w''Hh(CDDI!(,EFF	 D#9::D ;0J4:L L (1, 1,-lII	 ;0LTS[0\0\-lII02BIl}X&&Hssm))#..O
?q  .=+1nc8	_			"	"8G51hXX01115
f}}"%%% ($	 Ig h'''y00r   c                 D    d | D             }t          |          }|g ddS )Nc                      g | ]\  }}|d v 	|S )r   r   rw   s      r   rA   z)disutils_dependencies.<locals>.<listcomp>  s2       C/// 	///r   F)ru   r>   ry   )r   )r   r   ru   s      r   disutils_dependenciesr     sI     &  L
 ",//G   r   c                 H   t          j        | |          }t          |d          }d}|Jt          |d          }d}|6t          j        d                    t          j        j                            t          |          }t          |          }t          |dd           }|/t          j        |           }|                    d          d	         }|t          |d
d           t          |dd           d}	t          |d          t          |dd           t          |dd           d}
t          j        |           dddd}|r#|                    t!          |                     t          |d          }|r#|                    t#          |                     |	|
|fS )N)r   z*.egg-info/PKG-INFOF
*/PKG-INFOTz3Could not find *.egg-info/PKG-INFO file in {} sdistr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   z*.egg-info/requires.txt)tarfileopenr   r   NoMetadataErrorformatr
   STANDARD_PYTHONlabelr_   r   r	   r   r   r$   r   r   r~   )r   r   r   r   
distributer   r   r   r   r   r   r   r|   s                r   inspect_pypi_package_sdistr   
  s   |Hg666H#899DJ|X|44
<(ELL[MhMnooq q q'--LE5&$''D|=**~~c""1% 5)T225)T22 L 5),,umT::UK66 L M(++"&
 
 I  K&;L&I&IJJJ +DEEL H&8&F&FGGGy00r   c                 &   t          j        |          }t          |d          }|6t          j        d                    t          j        j                            t          t          |                    }t          |d          t          |dd           t          |dd           d}t          |d          t          |dd           t          |d	d           d
}t          j        |           }t          |                    d                    dk    r#|d d                             d          \  }}}	}
nd}	d }
t          j        |           d|	d|
d}t          |d          }|r#|                    t#          |                     |||fS )NzEGG-INFO/PKG-INFO1Could not find EGG-INFO/PKG-INFO file in {} sdistr   r   r   r   r   r   r   r   r      r   r   	bdist_eggr   )r   r   r   zEGG-INFO/requires.txtr   )r   r   r   r   r   r   r
   r   r   r   r_   r	   r   r   r-   r$   r   r~   )r   r   r   r   r   r   r   r   r   rY   r   r   r|   s                r   inspect_pypi_package_eggr   <  s   w''H#677D|$?FF{GbGhiik k 	k%d++,,E#E622&ui>>&ui>>@ @L  'ui88#*5-#F#F!(T!B!BD DL }X&&H
8>>#1$$)1#2#)<)<S)A)A&1nhh!!]844*5-;= =%' 'I
 !+BCCL H&8&F&FGGGy00r   c                 h   t          j        |          }t          |d          }|6t          j        d                    t          j        j                            t          t                                          |                    dd                                                              }t          |d          t          |dd           t          |dd           d}t          |d	          t          |d
d           t          |dd           d}t          j        |           dddd}|||fS )Nr   r   rO   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r
   r   r   r   r   rT   rU   r^   r	   r   r   )r   r   r   r   r   r   r   r   s           r   inspect_pypi_package_zipr   `  s=   w''H<00D|$?FF{GbGhiik k 	k ""4;;w	#B#BCCIIKKLLE#E622&ui>>&ui>>@ @L  'ui88#*5-#F#F!(T!B!BD DL "]844$/'/1 1 I y00r   c                     | d d                              dd          \  }}|                    dd          \  }}d|i}d|i}dd|d	t          j        |           d
}|||fS )Nr   r   r   r   r   r'   bdist_wininstr   )r   rY   windistr   r   r+   r$   r   r   )r   name_versionr  r   r'   r   r   r   s           r   inspect_pypi_package_exer  {  s    $SbSM00a88L' &&sA..MD'D>Lw'L*9-5&-/ / "]8446 6I
 y00r   c                     | d d                              dd          \  }}|                    dd          \  }}}d|i}d|i}d||d	t          j        |           d
}|||fS )Nr   r   r   r   r*   r   r'   	bdist_rpm)r   rY   rpmarchr  r  )	r   r  r  r   r'   rY   r   r   r   s	            r   inspect_pypi_package_rpmr	    s    $SbSM00a88L'$0$6$6sA$>$>!D'>D>Lw'L*5-;&-/ / "]8446 6I
 y00r   c                 v   |                      d          s|                      d          rt          | |          S |                      d          rt          | |          S |                      d          rt          | |          S |                      d          rt	          | |          S |                      d          rt          |           S |                      d          rt          |           S t          j        |           \  }}t          j
        d                    t          j        |                    )	Nz.tar.gzz.tar.bz2z.whlz.eggz.zipz.exez.rpmz6Can not inspect {} package with file with extension {})r&   r   r   r   r   r  r	  r   splitextr   r   r   r
   r   )r   r   argskwargsr   etxs         r   inspect_pypi_packager    s9   ## =x'8'8'D'D =)(G<<<   ;'':::   ;'':::   ;'':::   2'111   2'111]8$$FAs

 @GGHcehiik k kr   c                     ddl m }  t          j        d         }|                    d          s|                    d          rMdd l}dd l}|                    |dd          j                                        }|	                    |          }nt          |          }t          ||          \  }}} | |           t          d	            | |           t          d	            | |           d S )
Nr   )pprintr   zhttps://zhttp://Ti  )streamtimeoutz--)r  rQ   argvr%   iorequestsr   rawreadBytesIOr   r  r   )	r  r   r  r  r   r   r   r   r   s	            r   mainr    s   x{H:&& !(*=*=i*H*H !			||HT<|HHLQQSS**T""x..,@7,S,S)L,	
F<	$KKK
F<	$KKK
F9r   __main__)1
__future__r   r   r   r   rQ   r   r   email.parserr   osr   re   binstar_clientr   $binstar_client.inspect_package.uitlsr   r	   binstar_client.utils.configr
   r   r   r   VERBOSE
IGNORECASErE   r   r(   r3   rL   r\   r_   ro   r~   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  __name__r   r   r   <module>r%     s   8 7 7 7 7 7 7 7  				 



                   ! ! ! ! ! ! G G G G G G G G 3 3 3 3 3 3     'BJ ( Z"-! ! L L L	 	 	     *, *, *,Z  (  
& 
& 
&" " "J" " "J! ! !H     F^1 ^1 ^1B31 31 31l/1 /1 /1d   /1 /1 /1d!1 !1 !1H1 1 161 1 1"1 1 1"k k k0  * zDFFFFF r   