ó
Ò:\c           @   s  d  Z  d d l m Z d d l Z d d l Z d d l m Z m Z m Z m	 Z	 m
 Z
 m Z d d l m Z m Z e j d k Z d „  Z d e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d d d „ Z d „  Z e d k re ƒ  n  d S(   sQ   
Workers and manager for running long processes in threads without blocking GUI.
iÿÿÿÿ(   t   dequeN(   t
   QByteArrayt   QObjectt   QProcesst   QThreadt   QTimert   Signal(   t   PY2t   to_text_stringt   ntc         C   s.   t  |  t ƒ r |  j ƒ  }  n  t |  d | ƒS(   s"   Qt/Python2/3 compatibility helper.t   encoding(   t
   isinstanceR   t   dataR   (   t   objR
   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyt   handle_qbytearray   s    t   PythonWorkerc           B   s}   e  Z d  Z e e ƒ Z e e e e ƒ Z e e e e ƒ Z d „  Z d „  Z	 d „  Z
 d „  Z d „  Z d „  Z d „  Z RS(   s„   
    Generic python worker for running python code on threads.

    For running processes (via QProcess) use the ProcessWorker.
    c         C   sD   t  t |  ƒ j ƒ  | |  _ | |  _ | |  _ t |  _ t |  _ d S(   s9   Generic python worker for running python code on threads.N(	   t   superR   t   __init__t   funct   argst   kwargst   Falset   _is_finishedt   _started(   t   selfR   R   R   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyR   1   s    				c         C   s   d S(   t    N(    (   R   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyt   disable_main_signals:   s    c         C   s   d S(   R   N(    (   R   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyt   enable_main_signals>   s    c         C   s   |  j  S(   s@   Return True if worker status is finished otherwise return False.(   R   (   R   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyt   is_finishedB   s    c         C   s)   |  j  s% |  j j |  ƒ t |  _  n  d S(   s?   Start the worker (emits sig_started signal with worker as arg).N(   R   t   sig_startedt   emitt   True(   R   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyt   startF   s    	c         C   s   t  |  _ d S(   s   Mark the worker as finished.N(   R   R   (   R   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyt	   terminateL   s    c         C   ss   d } d } y |  j |  j |  j Ž  } Wn t k
 rC } | } n X|  j sf |  j j |  | | ƒ n  t |  _ d S(   s6   Start process worker for given method args and kwargs.N(	   t   NoneR   R   R   t	   ExceptionR   t   sig_finishedR   R   (   R   t   errort   outputt   err(    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyt   _startP   s    
	(   t   __name__t
   __module__t   __doc__R   t   objectR   t   sig_partialR$   R   R   R   R   R    R!   R(   (    (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyR   '   s   							t   DummyWorkerc           B   s>   e  Z d  Z e e ƒ Z e e e e ƒ Z e e e e ƒ Z RS(   s7   Process worker based on a QProcess for non blocking UI.(   R)   R*   R+   R   R,   R   R-   R$   (    (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyR.   _   s   t   ProcessWorkerc           B   s­   e  Z d  Z e e ƒ Z e e e e ƒ Z e e e e ƒ Z d d „ Z	 d „  Z
 d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z RS(   s7   Process worker based on a QProcess for non blocking UI.c         C   s·   t  t |  ƒ j ƒ  d |  _ | |  _ t |  _ t |  _ d |  _	 d |  _
 t |  _ t ƒ  |  _ t ƒ  |  _ |  j | ƒ |  j j d ƒ |  j j j |  j ƒ |  j j j |  j ƒ d S(   sö   
        Process worker based on a QProcess for non blocking UI.

        Parameters
        ----------
        cmd_list : list of str
            Command line arguments to execute.
        environ : dict
            Process environment,
        i–   N(   R   R/   R   R"   t   _resultt	   _cmd_listR   t   _firedt   _communicate_firstt   _partial_stdoutt   _partial_stderrR   R   t   _timerR   t   _processt   _set_environmentt   setIntervalt   timeoutt   connectt   _communicatet   readyReadStandardOutputt   _partial(   R   t   cmd_listt   environ(    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyR   n   s    							c         C   sA   d } t  r= d d l } t | j j j ƒ  ƒ } d | } n  | S(   s$   Return the encoding/codepage to use.s   utf-8iÿÿÿÿNt   cp(   t   WINt   ctypesR   t   cdllt   kernel32t   GetACP(   R   t   encoRC   t   codepage(    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyt   _get_encodingŠ   s    c         C   sY   | rU |  j  j ƒ  } x* | j ƒ  D] \ } } | j | | ƒ q" W|  j  j | ƒ n  d S(   s$   Set the environment on the QProcess.N(   R7   t   processEnvironmentt   itemst   insertt   setProcessEnvironment(   R   R@   t	   q_environt   kt   v(    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyR8   —   s
    c         C   sh   |  j  j ƒ  } t | |  j ƒ  ƒ } |  j d k r? | |  _ n |  j | 7_ |  j j |  | d ƒ d S(   s   Callback for partial output.N(   R7   t   readAllStandardOutputR   RI   R4   R"   R-   R   (   R   t
   raw_stdoutt   stdout(    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyR>   Ÿ   s    c         C   sL   |  j  r/ |  j j ƒ  t j k r/ |  j ƒ  n |  j rH |  j j ƒ  n  d S(   s   Callback for communicate.N(	   R3   R7   t   stateR   t
   NotRunningt   communicateR2   R6   t   stop(   R   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyR<   ³   s
    
	c         C   s  t  |  _ |  j j ƒ  |  j ƒ  } |  j d k rR |  j j ƒ  } t | | ƒ } n	 |  j } |  j	 d k r‹ |  j j
 ƒ  } t | | ƒ } n	 |  j	 } t rµ | j ƒ  } | j ƒ  } n  | | g } | |  _ |  j sô |  j j |  | d | d ƒ n  t  |  _ | S(   s   Retrieve information.i    iÿÿÿÿN(   R   R3   R7   t   waitForFinishedRI   R4   R"   RQ   R   R5   t   readAllStandardErrorR   t   decodeR0   R2   R$   R   (   R   RG   RR   RS   t
   raw_stderrt   stderrt   result(    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyRV   »   s(    					!	c         C   s   |  j  j ƒ  d S(   s   Close the running process.N(   R7   t   close(   R   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyR^   Û   s    c         C   s   |  j  j ƒ  t j k o |  j S(   s.   Return True if worker has finished processing.(   R7   RT   R   RU   R2   (   R   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyR   ß   s    c         C   sG   |  j  sC d |  _ |  j j |  j d |  j d ƒ |  j j ƒ  n  d S(   s   Start process.i    i   N(   R2   R"   t   _partial_ouputR7   R    R1   R6   (   R   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyR(   ã   s    		!c         C   sM   |  j  j ƒ  t j k r@ y |  j  j ƒ  Wq@ t k
 r< q@ Xn  t |  _ d S(   s   Terminate running processes.N(   R7   RT   R   t   RunningR!   R#   R   R2   (   R   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyR!   ë   s    c         C   s    |  j  r |  j j | ƒ n  d  S(   N(   R   R7   t   write(   R   R   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyRa   ô   s    	c         C   s)   |  j  s% |  j j |  ƒ t |  _  n  d S(   s   Start worker.N(   R   R   R   R   (   R   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyR    ø   s    	N(   R)   R*   R+   R   R,   R   R-   R$   R"   R   RI   R8   R>   R<   RV   R^   R   R(   R!   Ra   R    (    (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyR/   g   s    					 						t   WorkerManagerc           B   sV   e  Z d  Z d d „ Z d „  Z d	 d „ Z d „  Z d	 d „ Z d „  Z	 d „  Z
 RS(
   s*   Spyder Worker Manager for Generic Workers.i
   c         C   sÃ   t  t |  ƒ j ƒ  t ƒ  |  _ t ƒ  |  _ g  |  _ g  |  _ t ƒ  |  _	 t ƒ  |  _
 d |  _ | |  _ t ƒ  |  _ |  j	 j d ƒ |  j	 j j |  j ƒ |  j
 j d ƒ |  j
 j j |  j ƒ d S(   s*   Spyder Worker Manager for Generic Workers.i    iM  iˆ  N(   R   R   R   R    t   _queuet   _queue_workerst   _threadst   _workersR   R6   t   _timer_worker_deletet   _running_threadst   _max_threadst   _bag_collectorR9   R:   R;   R(   t   _clean_workers(   R   t   max_threads(    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyR     s    				c         C   s.   x |  j  r |  j  j ƒ  q W|  j j ƒ  d S(   s0   Dereference workers in workers bag periodically.N(   Rj   t   popleftRg   RW   (   R   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyRk     s    c         C   sØ  | r |  j  j | ƒ n  |  j  rã |  j |  j k  rã |  j d 7_ |  j  j ƒ  } t ƒ  } t | t ƒ rª | j | ƒ | j	 j
 | j ƒ | j j
 | j ƒ | j ƒ  n& t | t ƒ rÐ | j ƒ  | j ƒ  n  |  j j | ƒ n |  j j ƒ  |  j r?xC |  j D]5 } | j ƒ  r|  j j | ƒ |  j j | ƒ qqWn  |  j rxB |  j D]4 } | j ƒ  rR|  j j | ƒ |  j d 8_ qRqRWn  t |  j ƒ d k rÔt |  j ƒ d k rÔ|  j j ƒ  |  j j ƒ  n  d S(   s-   Start threads and check for inactive workers.i   i    N(   Rd   t   appendRh   Ri   Rm   R   R   R   t   moveToThreadR$   R;   t   quitt   startedR(   R    R/   Re   R6   Rf   R   Rj   t   removet
   isFinishedt   lenRW   Rg   (   R   t   workert   threadt   wt   t(    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyR(     s:    	
		*c         O   s#   t  | | | ƒ } |  j | ƒ | S(   s$   Create a new python worker instance.(   R   t   _create_worker(   R   R   R   R   Ru   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyt   create_python_workerG  s    c         C   s#   t  | d | ƒ} |  j | ƒ | S(   s%   Create a new process worker instance.R@   (   R/   Ry   (   R   R?   R@   Ru   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyt   create_process_workerM  s    c         C   s.   x |  j  D] } | j ƒ  q
 Wt ƒ  |  _ d S(   s   Terminate all worker processes.N(   Rf   R!   R    Rd   (   R   Ru   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyt   terminate_allS  s    c         C   s'   | j  j |  j ƒ |  j j | ƒ d S(   s   Common worker setup.N(   R   R;   R(   Rf   Rn   (   R   Ru   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyRy   `  s    N(   R)   R*   R+   R   Rk   R"   R(   Rz   R{   R|   Ry   (    (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyRb   ÿ   s   	*		c         C   s   |  | | f GHd S(   s   Print worker output for tests.N(    (   Ru   R&   R%   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyt   ready_printh  s    i
   c         C   s=   d d l  } | j | ƒ | d k	 r5 | j |  ƒ n |  Sd S(   s5   This methods illustrates how the workers can be used.iÿÿÿÿN(   t   timet   sleepR"   t   put(   t   argt   secst   result_queueR~   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyt   sleeping_funcm  s
    c          C   sõ   d d l  m }  |  ƒ  } t d d ƒ } xO t d ƒ D]A } | j t d j | ƒ d d ƒ} | j j t	 ƒ | j
 ƒ  q5 W| j t d	 d d ƒ} | j j t	 ƒ | j
 ƒ  | j d
 d d g ƒ } | j j t	 ƒ | j
 ƒ  t j | j ƒ  ƒ d S(   s   Main local test.iÿÿÿÿ(   t   qapplicationRl   i   i   s   BOOM! {}R‚   i   s   BOOM!t   condat   infos   --jsonN(   t   spyder.utils.qthelpersR…   Rb   t   rangeRz   R„   t   formatR$   R;   R}   R    R{   t   syst   exitt   exec_(   R…   t   appt   wmt   iRu   (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyt
   local_testw  s    	

t   __main__(   R+   t   collectionsR    t   osR‹   t   qtpy.QtCoreR   R   R   R   R   R   t"   anaconda_navigator.utils.py3compatR   R   t   nameRB   R   R   R.   R/   Rb   R}   R"   R„   R‘   R)   (    (    (    s=   lib/python2.7/site-packages/anaconda_navigator/api/process.pyt   <module>
   s    .	8˜i	
	