o
    eW                     @   s  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ZddlZddlZejd dkrTddlmZ ddlmZ ddlmZ ddlmZ n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$m%Z% ddl&m'Z'm(Z( ddl)m*Z+ G dd de,Z-G dd de.Z/G dd de.Z0dd Z1dd Z2dd Z3dd Z4dd Z5d d! Z6dS )"a`  cli.

Desc: Command-line tool for listing Python packages installed by setuptools,
      package metadata, package dependencies, and querying The Cheese Shop
      (PyPI) for Python package release information such as which installed
      packages have updates available.

Author: Rob Cakebread <gentoodev a t gmail.com>

License : BSD (See COPYING)

    )print_functionN   )HTTPException)urlretrieve)urlparse)Fault)get_python_lib)get_metadata)yolklib)
CheeseShop)get_download_uriget_pkglist)run_commandcommand_successful)__version__c                   @   s   e Zd ZdZdS )YolkExceptionz4Exception for communicating top-level error to user.N)__name__
__module____qualname____doc__ r   r   @/home/ubuntu/flask/venv/lib/python3.10/site-packages/yolk/cli.pyr   2   s    r   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )StdOutz]Filter stdout or stderr from specific modules So far this is just used
    for pkg_resources.c                 C   s   || _ || _d S N)stdoutmodulenames)selfstreamr   r   r   r   __init__<   s   
zStdOut.__init__c                 C   s(   || j vs	|dkrt| j|S | j | S )Nr   )__dict__getattrr   )r   	attributer   r   r   __getattr__A   s   
zStdOut.__getattr__c                 C   s   dS )z{Bug workaround for Python 3.2+: Exception AttributeError: 'flush'
        in.

        <yolk.cli.StdOut object...

        Nr   r   r   r   r   flushF   s    zStdOut.flushc                 C   sL   t  j}|r|jd}n	tdjd}|| jvr$| j	| dS dS )a  Write a line to stdout if it isn't in a blacklist.

        Try to get the name of the calling module to see if we want to
        filter it. If there is no calling module, use current frame in
        case there's a traceback before there is any calling module

        r   r   N)
inspectcurrentframef_back	f_globalsgetsys	_getframer   r   write)r   inlineframemodr   r   r   r,   N   s   

zStdOut.writec                 C   s   |D ]}|  | qdS )zWrite multiple lines.N)r,   )r   r-   liner   r   r   
writelines^   s   zStdOut.writelinesN)	r   r   r   r   r   r"   r$   r,   r1   r   r   r   r   r   7   s    r   c                   @   s   e Zd ZdZ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d Z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$d% Zd9d'd(Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd&S ):YolkzMain class for yolk.c                 C   sJ   d| _ d| _g | _d | _d | _dg}ttj|t_ttj|t_d | _	d S )N zdistutils.log)
project_nameversionall_versionspkg_specoptionsr   r*   r   stderrpypi)r   shut_upr   r   r   r   h   s   
zYolk.__init__c                 C   sT   g }t dD ] }| }| }|| jd |jr't||s"d}q|| q|S )zReturn plugin object if CLI option is activated and method exists.

        @param method: name of plugin's method we're calling
        @type method: string

        @returns: list of plugins with `method`

        zyolk.pluginsN)pkg_resourcesiter_entry_pointsload	configurer8   enabledhasattrappend)r   methodall_pluginsentry_point
plugin_objpluginr   r   r   
get_pluginy   s   	

zYolk.get_pluginc                 C   sz  t  }zddl}|| W n	 ty   Y nw | | _t|}|s'| jj}|| _| jjr=dd | jj	dD | j_ng | j_| jj
sRttjdkrR|  dS | jjsl| jjsl| jjsl| jjsl| jjrh|sl| jjrod}nd	}|r{| jjs{| jjrt| jj| _|r| |\| _| _| _|r| jstd
|tjd dS g d}|D ]}t| j|rt| |   S q|  dS )zNPerform actions based on CLI options.

        @returns: status code

        r   Nc                 S   s   g | ]}|   qS r   )striplower).0sr   r   r   
<listcomp>   s    zYolk.run.<locals>.<listcomp>,   r   TFz{} is not installedfile)	show_depsquery_metadata_pypifetchversions_availableshow_updatesupgradebrowse_websiteshow_download_linkspypi_searchshow_pypi_changelogshow_pypi_releasesyolk_versionshow_allshow_activeshow_non_activeshow_entry_mapshow_entry_points) setup_parserargcompleteautocompleteImportError
parse_argsr8   validate_pypi_optsr7   fieldssplitrZ   lenr*   argv
print_helprR   r^   r_   r`   rV   rW   r   debugr:   parse_pkg_verr4   r5   r6   printformatr9   r    )r   parserrd   r7   want_installedcommandsactionr   r   r   run   sz   


zYolk.runc                 C   
   |  dS )zShow installed active packages.activeshow_distributionsr#   r   r   r   r_         
zYolk.show_activec                 C   rw   )z#Show installed non-active packages.	nonactivery   r#   r   r   r   r`      r{   zYolk.show_non_activec                 C   rw   )zShow all installed packages.allry   r#   r   r   r   r^      r{   zYolk.show_allc                 C   sL   | j r| j g}nt }t|| j| jjdD ]\}}}td||| qdS )a  Check installed packages for available updates on PyPI.

        @param project_name: optional package name to check; checks every
                             installed package if none specified
        @type project_name: string

        @returns: None

        user_installs_onlyz
{} {} ({})r   )r4   r   _updatesr:   r8   userrp   rq   )r   pkg_listr4   r5   newestr   r   r   rV      s   

zYolk.show_updatesc                 C   sh   | j r| j g}nt }dd t|| j| jjdD }|r2ttj	ddddg| jjr,dgng  |  d	S )
a  Check installed packages for available updates on PyPI and upgrade.

        @param project_name: optional package name to check; checks every
                             installed package if none specified
        @type project_name: string

        @returns: None

        c                 S   s   g | ]}|d  qS )r   r   )rK   valuesr   r   r   rM     s    z Yolk.upgrade.<locals>.<listcomp>r~   -mpipinstall	--upgrade--userr   )
r4   r   r   r:   r8   r   
subprocesscallr*   
executable)r   r   namesr   r   r   rW     s$   

zYolk.upgradec                 C   s|  |  d}ddg}tjd}|r|| d}t|| j| jD ]Q\}}t	|}|D ]}	|j
|	r;|j
|	d|_
q+|j
 t  rJd}
n|j
}
|rhd}|D ]}|||d 7 }qS| ||
|| ntt|d  d	}q!|s| jr| jrd
| j| j}n| j}|dkrtd|tjd dS td||tjd dS |dkr|r| jjrtd td dS dS dS dS )zShow list of installed activated OR non-activated packages.

        @param show: type of pkgs to show (all, active or nonactive)
        @type show: string

        @returns: None or 2 if error

        
add_columnz/UNIONFSz/KNOPPIX.IMGWORKING_ENVNr3    z has no metadataTz{}=={}r}   z%There are no versions of {} installedrP   z(There are no {} versions of {} installedr   z!Versions with '*' are non-active.z3Versions with '!' are deployed in development mode.)rH   osenvironr)   rB   r
   get_distributionsr4   r5   r	   location
startswithreplacerJ   r   r   print_metadatarp   strrq   r*   r9   r8   ri   )r   showpluginsignores
workingenvresultsdistrx   metadataprefixdevelopadd_column_text	my_pluginr7   r   r   r   rz   #  s\   


zYolk.show_distributionsc                 C   s:  | j j}|d }|r| j jrd}nd}n	| j jrd}nd}|r/| j jr)d|}nd|}n|}d||}	| j jrHtd	|d
 ||| nt|d
 dd |d d |	  | j jr~| D ]}
|
 | j jv rxtd|
||
  qdt  dS |r| D ]}
|
d
kr|
dkrtd|
||
  qdS dS )a	  Print out formatted metadata.

        @param metadata: package's metadata
        @type metadata:  pkg_resources Distribution obj

        @param develop: path to pkg if its deployed in development mode
        @type develop: string

        @param active: show if package is activated or not
        @type active: boolean

        @param installed_by: Shows if pkg was installed by a package manager
                             other than setuptools
        @type installed_by: string

        @returns: None

        Versionr3   rx   *z
non-activez! ({})zdevelopment ({}){} {}z{} ({}){} {}Name   z -    z
    {}: {}SummaryN)r8   r   ri   rq   rp   ljustkeysrJ   )r   r   r   rx   installed_byshow_metadatar5   active_statusdevelopment_statusstatusfieldr   r   r   r   b  sN   
zYolk.print_metadatac                 C   s   t  }|| j D ]Z}| jst|j|j tt|j d }|ra|r`| jr0| jrZ|j| jkrZ| jrG|tt|j d krGt|j|j tdt	t|j d |d    |d8 }|s$q	 dS dS )zjShow dependencies for package(s)

        @returns: 0 - success  1 - No dependency info supplied

        r   z  rO   )
r<   Environmentr4   r5   rp   rk   list_dep_mapr   r   )r   pkgspkgir   r   r   rR     s<   
zYolk.show_depsc              
   C   s   | j j}| stdtjd dS z
| jt|}W n! t	y< } zt|tjd tdtjd W Y d}~dS d}~ww d}|D ]%}|d }||kr]td
|d |d |d	  |}qAtd

|d	  qAdS )zShow detailed PyPI ChangeLog for the last `hours`

        @returns: 0 = success or 1 if failed to retrieve from XML-RPC server

        You must supply an integerrP   rO   zCouldn't retrieve changelogNr3   r   z	{} {}
	{}   z	{})r8   r[   isdigitrp   r*   r9   r:   	changelogintXMLRPCFaultrq   )r   hoursr   err_msglast_pkgentryr   r   r   r   r[     s,   zYolk.show_pypi_changelogc              
   C   s   zt | jj}W n ty   tdtjd Y dS w z| j|}W n! t	yC } zt|tjd tdtjd W Y d}~dS d}~ww |D ]}td
|d |d  qFdS )zShow PyPI releases for the last number of `hours`

        @returns: 0 = success or 1 if failed to retrieve from XML-RPC server

        r   rP   rO   z"Couldn't retrieve latest releases.Nr   r   )r   r8   r\   
ValueErrorrp   r*   r9   r:   updated_releasesr   rq   )r   r   latest_releasesr   releaser   r   r   r\     s"   zYolk.show_pypi_releasesc                 C   s   | j jdkr| jdkrd| j _| j jdkrd}n| jr| j}n| jd }| j jdkr>| |d | |d | dd dS | j jdkrGd}nd}| || dS )zLQuery PyPI for pkg download URI for a packge.

        @returns: 0

        r}   devsvnr   TFsource)r8   	file_typer5   r6   print_download_uri)r   r5   r   r   r   r   rY     s"   
zYolk.show_download_linksc                 C   s:   |dkrd}t | j||| jj}|rtd| dS dS )z@param version: version number or 'dev' for svn.

        @type version: string

        @param source: download source or egg
        @type source: boolean

        @returns: None

        r   Tz{}N)r   r4   r8   
pypi_indexrp   rq   )r   r5   r   urlr   r   r   r     s   
zYolk.print_download_uric                 C   s   d}d}| j jdkr+t| jdd}|r| jd }| ||S td| jtjd dS | j jd	kr4d}n| j jd
kr<d}t| j| j	|}|rL| 
||S td| j j| j dS )zTDownload a package.

        @returns: 0 = success or 1 if failed download

        T.r   r   _svnz%No subversion repository found for {}rP   rO   r   eggFzNo {} URI found for package: {})r8   r   r   r4   	fetch_svnrp   rq   r*   r9   r5   	fetch_uri)r   r   	directorysvn_uriurir   r   r   rT   $  s6   

z
Yolk.fetchc              
   C   s   t jt|d }t j|rtd| tjd dS z	t||\}}W n' t	yK } ztd
||tjd tt|tjd W Y d}~dS d}~ww d|v rpt|}tdd	| rl|  td
tjd dS |  dS )a#  Use ``urllib.urlretrieve`` to download package to file in sandbox
        dir.

        @param directory: directory to download to
        @type directory: string

        @param uri: uri to download
        @type uri: string

        @returns: 0 = success or 1 for failed download

        r   zFile exists: rP   rO   z(Error downloading package {} from URL {}Nz	text/htmlz404 Not Foundr3   z'404 Not Found' errorr   )r   pathbasenamer   existsrp   r*   r9   r   IOErrorrq   r   openresearchjoin	readlinesclose)r   r   r   filenamedownloaded_filenameheadersr   dfiler   r   r   r   F  s2   zYolk.fetch_uric              
   C   s   t ddgs
tdtj|rtd|zt| W n ty2 } ztdt| d}~ww tj	tj
}t| tdd|g\}}t| dS )zFetch subversion repository.

        @param svn_uri: subversion repository uri to check out
        @type svn_uri: string

        @param directory: directory to download to
        @type directory: string

        r   	--versionz!Do you have subversion installed?zCheckout directory exists - {}r3   Ncheckout)r   r   r   r   r   rq   mkdirOSErrorr   realpathcurdirchdirr   )r   r   r   r   cwdr   _r   r   r   r   k  s    

zYolk.fetch_svnNc                 C   sj   t | jr,| j| j| jd }d|v r,|dkrt }dS t }||d d dS t	dt
jd dS )zLaunch web browser at project's homepage.

        @param browser: name of web browser to use
        @type browser: string

        @returns: 0 if homepage found, 1 if no homepage found

        r   	home_page	konquerorr   zNo homepage URL foundrP   rO   )rk   r6   r:   release_datar4   
webbrowser	Konquerorr)   r   rp   r*   r9   )r   browserr   r   r   r   rX     s   
	
zYolk.browse_websitec                 C   s   | j r| j | jv r| j| j| j }n| j| j| jd }|rat| jjdkr@zt|| jjd   W dS  t	y?   Y dS w |
 D ]}| jjrV| jjr`| | jjv r`td|||  qDdS )zCShow pkg metadata queried from PyPI.

        @returns: 0

        r   rO   z{}: {})r5   r6   r:   r   r4   rk   r8   ri   rp   KeyErrorr   rJ   rq   )r   r   keyr   r   r   rS     s.   
	zYolk.query_metadata_pypic                 C   s~   | j r| j| j v rt| j| jg dS | js"| j r"t| j| j  dS | jr2td| jtjd dS td| jtjd dS )zQuery PyPI for a particular version or all versions of a package.

        @returns: 0 if version(s) found or 1 if none found

        zNo package found for version {}rP   zNo package found for {}rO   r   )r6   r5   print_pkg_versionsr4   rp   rq   r*   r9   r#   r   r   r   rU     s"   

zYolk.versions_availablec           
      C   s   d}|st |tjd dS zUd|}d}d }}d|v r%|d\}}nd|v r3|d	\}}d	}n|}|d
\}}| }|rM|d
\}}	| }i }|||< |r^|	||< W ||fS W ||fS    t |tjd d }}Y ||fS )av  Parse search args and return spec dict for PyPI.

        * Owwww, my eyes!. Re-write this.

        @param spec: Cheese Shop package search spec
                     e.g.
                     name=Cheetah
                     license=ZPL
                     license=ZPL AND name=Cheetah
        @type spec: string

        @returns:  tuple with spec and operator

        a?  You can search PyPI by the following:
     name
     version
     author
     author_email
     maintainer
     maintainer_email
     home_page
     license
     summary
     description
     keywords
     platform
     download_url

     e.g. yolk -S name=Cheetah
          yolk -S name=yolk AND license=PSF
          rP   )NNr   ANDr3   z AND z OR OR=N)rp   r*   r9   r   rj   rI   )
r   specusageoperatorfirstsecondkey1term1key2term2r   r   r   parse_search_spec  s<   


zYolk.parse_search_specc                 C   s   | j }| jj}|d|  | |\}}|sdS | j||D ] }|d r/|d d}nd}t	d
|d d|d | q!dS )	ab  Search PyPI by metadata keyword e.g.

        yolk -S name=yolk AND license=GPL

        @param spec: Cheese Shop search spec
        @type spec: list of strings

        spec examples:
          ["name=yolk"]
          ["license=GPL"]
          ["name=yolk", "AND", "license=GPL"]

        @returns: 0 on success or 1 if mal-formed search spec

        r   rO   summaryzutf-8r3   z{} ({}):
        {}
    namer5   )r7   r8   rZ   insertrI   r  r:   r   encoderp   rq   )r   r   
search_argr   r   r  r   r   r   rZ     s    zYolk.pypi_searchc                 C   s`   t  }zt| jj}|r| | W dS W dS  tjy/   td| jjt	j
d Y dS w )zShow entry map for a package.

        @param dist: package
        @param type: string

        @returns: 0 for success or 1 if error

        zDistribution not found: {}rP   rO   r   )pprintPrettyPrinterr<   get_entry_mapr8   ra   DistributionNotFoundrp   rq   r*   r9   )r   pprinter	entry_mapr   r   r   ra   1  s&   	zYolk.show_entry_mapc              	   C   s   d}t | jjD ]*}d}z| }t|j td| |jr&t|j t  W q	 t	y3   Y q	w |sDtd| jjt
jd dS dS )zXShow entry points for a module.

        @returns: 0 for success or 1 if error

        FTz   {}zNo entry points found for {}rP   rO   r   )r<   r=   r8   rb   r>   rp   r   rq   r   rf   r*   r9   )r   foundrE   rG   r   r   r   rb   H  s0   


zYolk.show_entry_pointsc                 C   s   t dt dS )zShow yolk's version.zyolk {}N)rp   rq   VERSIONr#   r   r   r   r]   d  s   zYolk.yolk_versionc                 C   s   g }| j }d|vr|}d}n|d\}}| }| }|r%t|}n!| j|\}}t|sFd|}|d7 }t	|t
jd t
d |||fS )aB  Return tuple with project_name and version from CLI args If the user
        gave the wrong case for the project name, this corrects it.

        @param want_installed: whether package we want is installed or not
        @type want_installed: boolean

        @returns: tuple(project_name, version, all_versions)

        z==NzI'm afraid we have no '{}' at z1The Cheese Shop. A little Red Leicester, perhaps?rP   r   )r7   rj   rI   r
   case_sensitive_namer:   query_versions_pypirk   rq   rp   r*   r9   exit)r   rs   r6   arg_strr4   r5   msgr   r   r   ro   h  s&   



zYolk.parse_pkg_verr   )r   r   r   r   r   rH   rv   r_   r`   r^   rV   rW   rz   r   rR   r[   r\   rY   r   rT   r   r   rX   rS   rU   r  rZ   ra   rb   r]   ro   r   r   r   r   r2   d   s:    U?;"%
A#r2   c               	   C   s2  t  } | jdddddd | jddddd	 | jd
ddddd	 | jddd | dd}|jddddddd |jddddddd |jddddddd |jddddd d	 |jd!d"d#dd$d	 |jd%d&d#d'd(d)d* |jd+d#d,dd-d.d/ |jd0d#d1dd2d3d/ | d4d5}|jd6d7d#d8d9dd:d; |jd<d=d#d(d>dd?d@ |jdAdBd#d(dCddDd@ |jdEdFd#d(dGddHd@ |jdIdJd#ddKd	 |jdLdMd#dNd9ddOd; |jdPdQd#dRdd(dSdT |jdUd#dVddWdXd/ |jdYdZd#d[d\d	 |jd]d^ddd_d	 |jd`daddbdc |jddddedc |jdfdgd#dd(dhdi | S )jz?Setup the argparser.

    @returns: parser.ArgumentParser

    r   
store_truer]   Fzshow yolk version and exit)ru   destdefaulthelpz--debugzshow debugging information)ru   r  r  z-qz--quietzshow less outputr7   ?)nargszQuery installed Python packagesau  The following options show information about installed Python packages. Activated packages are normal packages on sys.path that can be imported. Non-activated packages need 'pkg_resources.require()' before they can be imported, such as packages installed with 'easy_install --multi-version'. PKG_SPEC can be either a package name or package name and version e.g. Paste==0.9z-lz--listr^   z]list all Python packages installed by distutils or setuptools. Use PKG_SPEC to narrow resultsz-az--activatedr_   z\list activated packages installed by distutils or setuptools. Use PKG_SPEC to narrow resultsz-nz--non-activatedr`   z`list non-activated packages installed by distutils or setuptools. Use PKG_SPEC to narrow resultsr   z
--metadatazMshow all metadata for packages installed by setuptools (use with -l -a or -n)z-fz--fieldsstorezBshow specific metadata (comma-separated) fields; use with -m or -Mz-dz	--dependsrR   PKG_SPECzMshow dependencies for a package installed by setuptools if they are available)ru   r  metavarr  z--entry-pointsrb   z@list entry points for a module. e.g. --entry-points nose.pluginsMODULE)ru   r  r  r  r  z--entry-mapra   z3list entry map for a package. e.g. --entry-map yolkPACKAGE_NAMEzPyPI (Cheese Shop) optionsz5The following options query the Python Package Index:z-Cz--changelogr[   HOURSz1show detailed ChangeLog for PyPI for last n hours)ru   r  r  r  r  z-Dz--download-linksrY   zVshow download URL's for package listed on PyPI. Use with -T to specify egg, source etc)ru   r  r  r  r  z-Fz--fetch-packagerT   zCdownload package source or egg; You can specify a file type with -Tz-Hz--browse-homepagerX   z+launch web browser at home page for packagez-Iz--pypi-indexz%specify PyPI mirror for package indexz-Lz--latest-releasesr\   z#show PyPI releases for last n hoursz-Mz--query-metadatarS   zLshow metadata for a package listed on PyPI. Use -f to show particular fields)ru   r  r  r  r  z-SrZ   z0search PyPI by spec and optional AND/OR operatorz SEARCH_SPEC <AND/OR SEARCH_SPEC>z-Tz--file-typer}   z>You may specify 'source', 'egg', 'svn' or 'all' when using -D.z-Uz--show-updatesz$check PyPI for updates on package(s)r   z--pipzErun pip command to upgrade outdated packages; may be used with --user)ru   r  r   z+run pip with --user; for use with --upgradez-Vz--versions-availablez8show available versions for given package listed on PyPI)ru   r  r  r  )argparseArgumentParseradd_argumentadd_argument_group)rr   group_local
group_pypir   r   r   rc     s   

	





rc   c                 C   s   |D ]
}t d| | qdS )zIPrint list of versions available for a package.

    @returns: None

    r   N)rp   rq   )r4   versionsverr   r   r   r   #  s   r   c                 C   s>   |   }|j|j|j|j|j|jg}|D ]}|r|  S qdS )zHCheck parse options that require pkg_spec.

    @returns: pkg_spec

    N)rg   rU   rS   rY   rX   rT   rR   )rr   r8   options_pkg_specsr7   r   r   r   rh   -  s   rh   c              
   #   s   ddl m} d  fdd}ddl}|| }z||| }W n ty6 } z| W Y d}~nd}~ww tddtjd  rEt	 |D ]<\}	}
}}z|rZ|
j
t sZW qGW n	 tyd   Y nw |rt|}||
jkrt|
jt|k r||
j|fV  qGdS )	zReturn updates.r   )
ThreadPoolNc                    sl   t d| t | D ]%\}} r d S t }|r'td|j|dtj	d 
|j\}}q
| |||fS )Nr}   zChecking {}r3   endrQ   )r
   r   get_highest_installedterminal_widthrp   rq   r4   r   r*   r9   r  )r   r   rx   widthr4   r'  	exceptionr:   r   r   worker_functionG  s    
z!_updates.<locals>.worker_functionr3   r+  )multiprocessing.poolr*  multiprocessing	cpu_countmapr   rp   r*   r9   r   r   r   sitegetusersitepackagesAttributeErrorr
   get_highest_versionr5   r<   parse_version)r   r:   r   r*  r2  r5  poolr   
_exceptionr   r   r4   r'  r   r   r0  r   r   A  sF   


r   c                  C   s\   z!dd l } dd l}td| tj |jt	dddddd W S  t
tfy-   Y d S w )Nr   HHHHrO   )fcntltermiosstructunpackioctlr*   r9   fileno
TIOCGWINSZpackrf   r   )r@  rA  r   r   r   r.    s   r.  c               
   C   sb   z
t  } |   W dS  tttfy' } zt|tjd W Y d}~dS d}~w ty0   Y dS w )zLet's do it.rP   NrO   )	r2   rv   r   r   r   rp   r*   r9   KeyboardInterrupt)my_yolkr1  r   r   r   main  s   rJ  )7r   
__future__r   r!  r%   r   r<   r  r   r8  rB  r   r*   r   version_infohttplibr   urllibr   r   	xmlrpclibr   r   http.clienturllib.requesturllib.parsexmlrpc.clientdistutils.sysconfigr   yolk.metadatar	   yolkr
   	yolk.pypir   yolk.setuptools_supportr   r   
yolk.utilsr   r   yolk.__init__r   r  	Exceptionr   objectr   r2   rc   r   rh   r   r.  rJ  r   r   r   r   <module>   sZ   -      . 
?