
:\c           @   s  d  Z  d d l m 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	 m
 Z
 m Z m Z m Z d d l Z d d l 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 m Z d d l  m! Z! d e
 f d     YZ" d f  d     YZ# d e
 f d     YZ$ d e% d  Z& e' a( e' d  Z) d   Z* d   Z+ e, d k re+   n  d S(   s1   Worker threads for using the anaconda-client api.i(   t   deque(   t
   format_excN(   t   QObjectt   QThreadt   QTimert   Signal(   t   CondaAPI(   t   CONFt   DEFAULT_BRAND(   t	   constants(   t   sort_versions(   t   logger(   t   is_internet_available(   t   is_text_stringt   to_text_string(   t   MessageBoxErrort   ClientWorkerc           B   sM   e  Z d  Z e e e e  Z e e e e  Z d   Z d   Z d   Z	 RS(   s#   Anaconda Client API process worker.c         C   s;   t  t |   j   | |  _ | |  _ | |  _ t |  _ d S(   s#   Anaconda Client API process worker.N(   t   superR   t   __init__t   methodt   argst   kwargst   Falset   _is_finished(   t   selfR   R   R   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyR   (   s
    			c         C   s   |  j  S(   s>   Return wether or not the worker has finished running the task.(   R   (   R   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   is_finished0   s    c         C   s   d \ } } y) t j d  |  j |  j |  j   } Wnk t k
 r } t j t	 |  j j
 |  j j | f   t	 |  } | j d d  } | j d d  } n X|  j j |  | |  t |  _ d S(   s   Start the worker process.g?t   (t    t   )N(   NN(   t   Nonet   timet   sleepR   R   R   t	   ExceptionR   t   debugt   strt
   __module__t   __name__t   replacet   sig_finishedt   emitt   TrueR   (   R   t   errort   outputt   err(    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   start4   s    "(
   R$   R#   t   __doc__R   t   objectt   sig_chain_finishedR&   R   R   R,   (    (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyR   "   s   		t   Argsc           B   s   e  Z d  Z RS(   sD   Dummy class to pass to anaconda client on token loading and removal.(   R$   R#   R-   (    (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyR0   F   s   t
   _ClientAPIc           B   sd  e  Z d  Z d Z d d  Z d   Z d   Z d   Z d   Z	 e
 d d d   Z e
 d d   Z d d	  Z d
   Z d   Z d   Z d   Z d   Z d   Z d d d  Z d d  Z d d  Z d   Z d   Z d d d d d d  Z d   Z e
 d    Z e
 d    Z e d  Z d   Z d d  Z  d e d  Z! d e d  Z" RS(    s   Anaconda Client API wrapper.i   c         C   s   t  t |   j   t   |  _ d |  _ | |  _ t   |  _	 g  |  _
 g  |  _ t   |  _ t |  _ |  j j d  |  j j j |  j  |  j   d S(   s   Anaconda Client API wrapper.i  N(   R   R   R   R   t
   _conda_apiR   t   _anaconda_client_apit   _configR    t   _queuet   _threadst   _workersR   t   _timerR   t   configt   setIntervalt   timeoutt   connectt   _cleant   reload_binstar_client(   R   R9   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyR   O   s    					c         C   s   |  j  r? x3 |  j  D]% } | j   r |  j  j |  q q Wn  |  j r~ x@ |  j D]% } | j   rR |  j j |  qR qR Wn |  j j   d S(   s7   Check for inactive workers and remove their references.N(   R7   R   t   removeR6   t
   isFinishedR8   t   stop(   R   t   wt   t(    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyR=   a   s    		c         C   sB   t  |  j  d k r> |  j j   } | j   |  j j   n  d S(   s2   Take avalaible worker from the queue and start it.i   N(   t   lenR5   t   popleftR,   R8   (   R   t   thread(    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   _starto   s    
c         O   s   t    } t | | |  } | j |  | j j |  j  | j j | j  | j j | j  |  j	 j
 |  |  j j
 |  |  j j
 |  |  j   | S(   s?   Create a worker for this client to be run in a separate thread.(   R   R   t   moveToThreadR&   R<   RG   t   quitt   startedR,   R5   t   appendR6   R7   (   R   R   R   R   RF   t   worker(    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   _create_workerv   s    	
c         C   s@   |  j  r! |  j  j d d  } n t } | r6 t } n t } | S(   s   Check initernet availability.t   maint   offline_mode(   R4   t   getR   R(   (   R   t   config_valuet   connectivity(    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   _is_internet_available   s    		c         C   s  | r | n i  } i  } x|  j    D]\ } } | j d i   } x| D]} | | } t | j d d   \ } }	 }
 | | k r i t   d 6i  d 6i  d 6i  d 6i  d 6| | <n | | k rB| | } | | j d	 d
  | d	 <| | j d d
  | d <| | j d d
  | d <| | j d  | d <| | | <n  | | d j |	  | j d d
  | | d |	 <| j d  rJ | j d  | | d |	 <| j d  | | d |	 <| j d  | | d |	 <qJ qJ Wq% Wx@ | D]8 } t t | | d d t  } | d | | d <qWi  } x | D] } t t	 | | d   } | | | d <x | D] }	 | | j d  } | rf| | j
   | | <| | d } | | d } g  | D] } | | k r| ^ q} | | | d <qfqfWq0W| | f S(   sp   
        Load all the available package information.

        See load_repadata for full documentation.
        t   packagest   -i   t   versionst   sizet   typet	   app_entryt   app_typet   homeR   t   licenset   summaryt   versiont   latest_versiont   reversei    (   t   itemsRP   t   tuplet   rsplitt   sett   addt   sortedR(   R
   t   listt   copy(   t   repodatat   metadatat   python_versiont   all_packagest   channel_urlt   dataRT   t   canonical_namet   nameR^   t   bt	   temp_dataRV   t   all_appst   has_typet   typest   vt   app_versions(    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   _load_repodata   sX    
!

&%c         C   s`  | r | n g  } g  } i  } x@ | D]8 } t  | j d d   \ } } } i | d 6| | <q% Wi  }	 x@ | D]8 } t  | j d d   \ } } } i | d 6|	 | <qn Wt t t t | j    t |	 j    t |  j       }
 xk|
 D]c} |  j |  } | r"| j d d  n d } | r@| j d d  n d } | r^| j d d  n d } | r|| j d d  n g  } | r| j d	 d  n d } | |	 k rt j } |	 | j d d  } t j	 } n| | k rt j
 } | | j d d  } t j	 } | | k r| } | | d
 k o=t |  d k } | | d k o`t |  d k } | r{| r{t j } q| rt j } q| rt j } qqn= t j
 } t j } | d k rt |  d k r| d
 } n  i	 t j t j 6| t j 6| t j 6| j   t j 6| t j 6| t j 6| t j 6| t j 6d t j 6} | j |  q W| S(   s0   Prepare model data for the packages table model.RU   i   R^   R]   R   R[   R\   RV   R_   ii   i    N(   Rb   Rc   Rf   Rg   Rd   t   keysRP   t   Ct   PIP_PACKAGEt	   INSTALLEDt   CONDA_PACKAGERD   t   MIXGRADABLEt
   UPGRADABLEt   DOWNGRADABLEt   NOT_INSTALLEDt   ACTION_NONEt
   COL_ACTIONt   COL_PACKAGE_TYPEt   COL_NAMEt
   capitalizet   COL_DESCRIPTIONt   COL_VERSIONt
   COL_STATUSt   COL_URLt   COL_LICENSER   t   COL_ACTION_VERSIONRK   (   RT   t   linkedt   pipRn   t   linked_packagesRo   Rp   R^   Rq   t   pip_packagest   packages_namest   p_dataR]   t   urlt   license_RV   t   type_t   statust   verst
   upgradablet   downgradablet   row(    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   _prepare_model_data   sp    !!			##		





c         C   sn   g  } yC |  j  j   } | j d g   } t |  rH t j |  } n  Wn t k
 ri t j d  n X| S(   s/   Get user trial/paid licenses from anaconda.org.Rn   g333333?(	   R3   t   user_licensesRP   R   t   jsont   loadsR    R   R   (   R   t   productst   license_datat   res(    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   _get_user_licenses+  s    c         C   sX   t  j j   } |  j   } t  j j d | d d d d d | d t j  } | |  _ | S(   sr  
        Recreate the binstar client with new updated values.

        Notes:
        ------
        The Client needs to be restarted because on domain change it will not
        validate the user since it will check against the old domain, which
        was used to create the original client.

        See: https://github.com/ContinuumIO/navigator/issues/1325
        t   tokent   sitet   clsR9   t	   log_levelN(	   t   binstar_clientt   utilst
   get_configt
   load_tokent   get_server_apiR   t   loggingt   NOTSETR3   (   R   R9   R   t   binstar(    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyR>   <  s    	c         C   s
   |  j  j S(   s6   Return the current token registered with authenticate.(   R3   R   (   R   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyR   T  s    c         C   s:   d } y t j j |  j    } Wn t k
 r5 n X| S(   s!   Load current authenticated token.N(   R   R   R   R   t   get_api_urlR    (   R   R   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyR   X  s    c         C   sM   |  j  j | | | |  } t   } d | _ | | _ t j j | |  | S(   s   Login callback.N(	   R3   t   authenticateR0   R   R   R   R   R   t   store_token(   R   t   usernamet   passwordt   applicationt   application_urlt	   new_tokenR   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   _logina  s    				c         C   s>   t  j t | | | f   |  j } |  j | | | | |  S(   s   Login to anaconda server.(   R   R!   R"   R   RM   (   R   R   R   R   R   R   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   loginl  s    	c         C   s   d } t   } d | _ |  j | _ t j j |  |  j r y |  j j   Wq t j	 j
 k
 r } | } t j d j |   q t k
 r } | } t j d j |   q Xn  t j d  | S(   sr   
        Logout from anaconda.org.

        This method removes the authentication and removes the token.
        s;   The token that you are trying to remove may not be valid {}s$   The certificate might be invalid. {}s   logout successfulN(   R   R0   R   R   R   R   t   remove_tokenR3   t   remove_authenticationt   errorst   UnauthorizedR   R!   t   formatR    t   info(   R   R)   R   t   e(    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   logoutt  s$    			c         C   s2   t  j d  |  j } |  j | | d | d | S(   s  
        Load all the available packages information for downloaded repodata.

        For downloaded repodata files (repo.anaconda.com), additional
        data provided (anaconda cloud), and additional metadata and merge into
        a single set of packages and apps.

        If python_version is not none, exclude all package/versions which
        require an incompatible version of python.

        Parameters
        ----------
        repodata: dict of dicts
            Data loaded from the conda cache directories.
        metadata: dict
            Metadata info form different sources. For now only from
            repo.anaconda.com
        python_version: str
            Python version used in preprocessing.
        R   Rj   Rk   (   R   R!   Rx   RM   (   R   Ri   Rj   Rk   R   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   load_repodata  s    	c         C   s/   t  j d  |  j } |  j | | | d | S(   s=   Prepare downloaded package info along with pip pacakges info.R   R   (   R   R!   R   RM   (   R   RT   R   R   R   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   prepare_model_data  s    	s   https://api.anaconda.orgc         C   s   t  j d j |   t j j   } | | d <y t j j |  Wnf t j j k
 r t  j	 d  t
   } t d d d d d d	 | d
 d t d d  } | j   n Xt j j d d d t j  |  _ d S(   s   Reset current api domain.s   Setting domain {}R   s,   Could not write anaconda client configuationt   titles#   Anaconda Client configuration errort   textsj   Anaconda Client domain could not be updated.<br><br>This may result in Navigator not working properly.<br>R)   s   <pre>s   </pre>t   reportt
   learn_moreR   R   N(   R   R!   R   R   R   R   t
   set_configR   t   BinstarErrorR)   R   R   R   R   t   exec_R   R   R   R3   (   R   t   domainR9   t	   tracebackt   msg_box(    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt
   set_domain  s$    
		c         C   s   |  j  d d  S(   s'   Return current logged user information.R   N(   t   organizationsR   (   R   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   user  s    c         C   s
   |  j  j S(   s   Return current domain.(   R3   R   (   R   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyR     s    c         C   sD   t  j d  |  j j } |  j | d | d | d | d | d | S(   s]  Return all the available packages for a given user.

        Parameters
        ----------
        type_: Optional[str]
            Only find packages that have this conda `type`, (i.e. 'app').
        access : Optional[str]
            Only find packages that have this access level (e.g. 'private',
            'authenticated', 'public').
        R   R   t   platformt   package_typeR   t   access(   R   R!   R3   t   user_packagesRM   (   R   R   R   R   R   R   R   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyRT     s    c         C   s7   y |  j  j d |  } Wn t k
 r2 i  } n X| S(   s0   List all the organizations a user has access to.R   (   R3   R   R    (   R   R   R   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyR     s
    
c          C   s   t  j j   }  |  j d d  S(   s*   Get the anaconda client url configuration.R   s   https://api.anaconda.org(   R   R   R   RP   (   t   config_data(    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyR      s    c         C   s   t  j j   } |  | d <y t  j j |  WnQ t k
 r } t j d  t d d d d d | d t d	 d
  } | j
   n Xd
 S(   s*   Set the anaconda client url configuration.R   s-   Could not write anaconda client configurationR   s#   Anaconda Client configuration errorR   sm   Anaconda Client configuration could not be updated.<br>This may result in Navigator not working properly.<br>R)   R   R   N(   R   R   R   R   R    R   R)   R   R   R   R   (   R   R   R   R   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   set_api_url  s    
	c         C   sS   t  j j   } | j d | j d t   } | rO |  j j d |  j   n  | S(   sV   
        Get the anaconda client url configuration and set conda accordingly.
        t
   ssl_verifyt
   verify_ssl(   R   R   R   RP   R(   R2   t
   config_sett   communicate(   R   t   set_conda_sslR9   t   value(    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   get_ssl  s
    c         C   s   t  j j   } | | d <| | d <y- t  j j |  |  j j d |  j   WnQ t k
 r } t j	 d  t
 d d d d d | d	 t d
 d  } | j   n Xd S(   s*   Set the anaconda client url configuration.R   R   s-   Could not write anaconda client configurationR   s#   Anaconda Client configuration errorR   sm   Anaconda Client configuration could not be updated.<br>This may result in Navigator not working properly.<br>R)   R   R   N(   R   R   R   R   R2   R   R   R    R   R)   R   R   R   R   (   R   R   R   R   R   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   set_ssl'  s    

	c         C   s/   t  j t |   |  j } |  j | d | S(   s/   Get user trial/paid licenses from anaconda.org.R   (   R   R!   R"   R   RM   (   R   R   R   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   get_user_licenses;  s    	c         C   s  | p	 i  } i | d 6d d 6t  d 6d d 6d d 6d	 d
 6d d 6} |  j   ry t j | d | d | d |  j } t | j d d } t j |  } xM | j	   D]? \ } }	 t
 |	  r |	 d d k r |	 d  n |	 | | <q q WWqt k
 r}
 t j t |
   qXn  | S(   s	   Callback.t   api_urls   https://api.anaconda.org/docst   api_docs_urlt   brands   https://conda.anaconda.orgt	   conda_urls   https://anaconda.orgt   main_urls   https://pypi.anaconda.orgt   pypi_urls%   https://api.anaconda.org/swagger.jsont   swagger_urlt   proxiest   verifyR;   t   encodings   utf-8it   /(   R   RS   t   requestsRP   t   DEFAULT_TIMEOUTR   t   contentR   R   Ra   R   R    R   R)   R"   (   R   R   t   proxy_serversR   Rn   t   rR   t   new_datat   keyR   R)   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   _get_api_infoA  s0    
/c         C   sD   t  j t |   | p i  } |  j } |  j | | d | d | S(   s   Query anaconda api info.R   R   (   R   R!   R"   R   RM   (   R   R   R   R   R   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   get_api_infob  s
    	N(#   R$   R#   R-   R   R   R   R=   RG   RM   RS   t   staticmethodRx   R   R   R>   R   R   R   R   R   R   R   R   R   R   RT   R   R   R   R(   R   R   R   R   R   (    (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyR1   J   sH   				JJ											!t   pythonc   
      C   s  t  } zt j d  } x|  D]} | j |  j   \ } } }	 | j d d  } | | k rg q n  | r~ | | |	 g GHn  d |	 k r t t j |	 j d d  |   } n| p | d k r |	 | k } Pn | d k r| j d  |	 j d  k  } n | d	 k r.| j d  |	 j d  k } n | d
 k r[| j d  |	 j d  k } n] | d k r| j d  |	 j d  k } n0 | d k r| j d  |	 j d  k } n q Pq WWd | SX(   sA   Can this package dependency list be met given the pinned version.s   ([^ ><=]+)([ <>=]+)([\d.*]+)t    R   t   *s   .*s   ==t   <t   .t   >s   <=s   >=s   !=N(   R(   t   ret   compilet   matcht   groupsR%   t   boolt   split(
   t   deplistR^   t   packageR!   t   flagt   st   dept   pnamet   relR   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   is_dependency_metl  s8    '!!!!!	c         C   s"   t  d k r t d |   a  n  t  S(   s   Client API threaded worker.R9   N(   t
   CLIENT_APIR   R1   (   R9   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt	   ClientAPI  s    c         C   s   | | f GHd S(   s   Test helper print function.N(    (   RL   R*   R)   (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   print_output  s    c          C   s\   d d l  m }  |    } t   } | j d d d d  | j d d d d  | j   d S(	   s   Local main test.i(   t   qapplicationt   goanpecat   asdasdt   babyR   t   bruceN(   t"   anaconda_navigator.utils.qthelpersR  R	  R   R   (   R  t   appt   api(    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt
   local_test  s    		t   __main__(-   R-   t   collectionsR    R   R   R   R   R   R   t   qtpy.QtCoreR   R   R   R   R   R   t    anaconda_navigator.api.conda_apiR   t   anaconda_navigator.configR   R   t   anaconda_navigator.utilsR	   Rz   R
   t   anaconda_navigator.utils.logsR   t   anaconda_navigator.utils.miscR   t"   anaconda_navigator.utils.py3compatR   R   t"   anaconda_navigator.widgets.dialogsR   R   R0   R1   R   R  R   R  R	  R
  R  R$   (    (    (    s@   lib/python2.7/site-packages/anaconda_navigator/api/client_api.pyt   <module>   s:   "$  $%
		