o
    eW	                     @   s   d Z ddlmZ ddlZddlZddlZe dr$ddlZddl	Z	nddl
mZ ddlmZ	 ddlZddlZddlmZ dZG dd dejZd	d
 ZG dd deZdd Zdd ZdS )zpypi.

Desc: Library for getting information about Python packages by querying
      The CheeseShop (PYPI a.k.a. Python Package Index).


Author: Rob Cakebread <cakebread at gmail>

License  : BSD (See COPYING)

    )print_functionN2)get_yolk_dirzhttps://pypi.python.org/pypic                   @   s   e Zd ZdZdd ZdS )ProxyTransporta  Provides an XMl-RPC transport routing via a http proxy.

    This is done by using urllib2, which in turn uses the environment
    varable http_proxy and whatever else it is built to use (e.g. the
    windows    registry).

    NOTE: the environment variable http_proxy should be set correctly.
    See check_proxy_setting() below.

    Written from scratch but inspired by xmlrpc_urllib_transport.py
    file from http://starship.python.net/crew/jjkunce/ by jjk.

    A. Ellerton 2006-07-06

    c           
      C   s   || _ d| | }t|}z|| W n ty!   ||_Y nw |d| j |dd t }t	|}|
|}	| |	S )z!Send xml-rpc request using proxy.zhttps://z
User-AgentzContent-Typeztext/xml)verboseurllib2Requestadd_dataAttributeErrordata
add_header
user_agentProxyHandlerbuild_openeropenparse_response)
selfhosthandlerrequest_bodyr   urlrequestproxy_handleropenerfhandle r   A/home/ubuntu/flask/venv/lib/python3.10/site-packages/yolk/pypi.pyr   3   s   




zProxyTransport.requestN)__name__
__module____qualname____doc__r   r   r   r   r   r   !   s    r   c                  C   s\   zt jd } W n
 ty   Y dS w | ds,td| }d|d|df t jd< dS )a  If the environmental variable 'HTTP_PROXY' is set, it will most likely
    be in one of these forms:

    proxyhost:8080 http://proxyhost:8080 urlllib2
    requires the proxy URL to start with 'http://' This routine does that, and
    returns the transport for xmlrpc.

    
HTTP_PROXYNzhttp://z(http://)?([-_\.A-Za-z]+):(\d+)zhttp://%s:%s      )osenvironKeyError
startswithrematchgroup)
http_proxyr)   r   r   r   check_proxy_settingF   s   	

r,   c                   @   s   e Zd ZdZd ddZdd Zdd	 Zd
d Zdd Zdd Z	d!ddZ
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )"
CheeseShopz"Interface to Python Package Index.FNc                 C   sF   || _ || _|r|| _nt | _|  | _|  | _d | _| 	  d S )N)
debugno_cacheyolk_dirr   get_xmlrpc_serverxmlrpcget_pkg_cache_filepkg_cache_filepkg_list	get_cache)r   r.   r/   r0   r   r   r   __init___   s   

zCheeseShop.__init__c              	   C   sb   | j r
|  | _dS tj| jst| j z|  | _W dS  t	t
fy0   | d Y dS w )z0Get a package name list from disk cache or PyPI.NT)r/   list_packagesr5   r$   pathexistsr0   mkdirquery_cached_package_listIOError
ValueErrorfetch_pkg_listr   r   r   r   r6   k   s   
zCheeseShop.get_cachec                 C   s,   t   dtjv rd}nd}tjtt |dS )z&Return PyPI's XML-RPC server instance.XMLRPC_DEBUG   r   )	transportr   )r,   r$   r%   	xmlrpclibServerXML_RPC_SERVERr   )r   r.   r   r   r   r1   z   s   

zCheeseShop.get_xmlrpc_serverc                 C   s   t jd| j S )zReturn filename of pkg cache.z%s/pkg_list.py)r$   r9   abspathr0   r@   r   r   r   r3         zCheeseShop.get_pkg_cache_filec                 C   s`   t t| j}t||vr|   g }| jD ]}t|t|kr+| |}|} ||fS q||fS )z9Fetch list of available versions for a package from PyPI.)map	normalizer5   r?   package_releases)r   package_namenormalize_pkg_listversionspypi_pkgr   r   r   query_versions_pypi   s   

zCheeseShop.query_versions_pypic                 C   s>   t | jd}t| W  d   S 1 sw   Y  dS )z.Return list of cached package names from PYPI.rN)r   r4   astliteral_evalread)r   
input_filer   r   r   r<      s   $z$CheeseShop.query_cached_package_listc                 C   sJ   |   }t| jd}t||d W d   n1 sw   Y  || _dS )z7Fetch and cache master list of package names from PYPI.w)fileN)r8   r   r4   printr5   )r   ignore_cachepackage_listoutput_filer   r   r   r?      s
   
zCheeseShop.fetch_pkg_listc                 C   s   | j || S z2Query PYPI via XMLRPC interface using search spec.)r2   searchlower)r   specoperatorr   r   r   r]      rH   zCheeseShop.searchc                 C      | j t|S r\   )r2   	changelogget_secondsr   hoursr   r   r   rb         zCheeseShop.changelogc                 C   ra   r\   )r2   updated_releasesrc   rd   r   r   r   rg      rf   zCheeseShop.updated_releasesc                 C   s
   | j  S )zJQuery PYPI via XMLRPC interface for a a list of all package
        names.)r2   r8   r@   r   r   r   r8      s   
zCheeseShop.list_packagesc                 C   s   | j ||S z?Query PYPI via XMLRPC interface for a pkg's available versions.)r2   release_urlsr   rL   versionr   r   r   ri      s   zCheeseShop.release_urlsc                 C   s(   z| j ||W S  tjy   Y dS w )z5Query PYPI via XMLRPC interface for a pkg's metadata.N)r2   release_datarD   Faultrj   r   r   r   rl      s
   zCheeseShop.release_datac                 C   s   | j |S rh   )r2   rK   )r   rL   r   r   r   rK      s   zCheeseShop.package_releases)FFN)F)r   r   r   r    r7   r6   r1   r3   rP   r<   r?   r]   rb   rg   r8   ri   rl   rK   r   r   r   r   r-   [   s     


	r-   c                 C   s   t t d|   S )zGet number of seconds since epoch from now minus `hours`

    @param hours: Number of `hours` back in time we are checking
    @type hours: int

    Return integer for number of seconds for now minus hours

    i  )inttime)re   r   r   r   rc      s   	rc   c                 C   s   |   ddS )zReturn normalized name._-)r^   replace)namer   r   r   rJ      rf   rJ   )r    
__future__r   rR   r(   platformpython_versionr'   rD   r   xmlrpc.clientclienturllib.requestr   r$   ro   
yolk.utilsr   rF   	Transportr   r,   objectr-   rc   rJ   r   r   r   r   <module>   s&    
%m