
    ce[(                         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 G d d	e          Z G d
 de          Z G d de          Z G d de          ZdS )zQ
Workers and manager for running long processes in threads without blocking GUI.
    )dequeN)
QByteArrayQObjectQProcessQThreadQTimerSignal)PY2to_text_stringntc                 v    t          | t                    r|                                 } t          | |          S )z"Qt/Python2/3 compatibility helper.)encoding)
isinstancer   datar   )objr   s     >lib/python3.11/site-packages/anaconda_navigator/api/process.pyhandle_qbytearrayr      s4    #z"" hhjj#1111    c                        e Zd ZdZ ee          Z eeee          Z eeee          Z fdZ	d Z
d Zd Zd Z xZS )PythonWorkerz
    Generic python worker for running python code on threads.

    For running processes (via QProcess) use the ProcessWorker.
    c                     t                                                       || _        || _        || _        d| _        d| _        dS )z9Generic python worker for running python code on threads.FN)super__init__funcargskwargs_is_finished_started)selfr   r   r   	__class__s       r   r   zPythonWorker.__init__.   sA    		!r   c                     | j         S )z@Return True if worker status is finished otherwise return False.r   r   s    r   is_finishedzPythonWorker.is_finished7   s      r   c                 Z    | j         s#| j                            |            d| _         dS dS )z?Start the worker (emits sig_started signal with worker as arg).TNr   sig_startedemitr#   s    r   startzPythonWorker.start;   8    } 	!!!$''' DMMM	! 	!r   c                     d| _         dS )zMark the worker as finished.TNr"   r#   s    r   	terminatezPythonWorker.terminateA   s     r   c                     d}d}	  | j         | j        i | j        }n# t          $ r}|}Y d}~nd}~ww xY w| j        s| j                            | ||           d| _        dS )z6Start process worker for given method args and kwargs.NT)r   r   r   	Exceptionr   sig_finishedr(   )r   erroroutputerrs       r   _startzPythonWorker._startE   s    	TY	9T[99FF 	 	 	EEEEEE	   	8""4777 s    
4/4)__name__
__module____qualname____doc__r	   objectr'   sig_partialr/   r   r$   r)   r,   r3   __classcell__r    s   @r   r   r   $   s         
 &..K&00K6&&&11L    ! ! !! ! !! ! !! ! ! ! ! ! !r   r   c                   \    e Zd ZdZ ee          Z eeee          Z eeee          ZdS )DummyWorker7Process worker based on a QProcess for non blocking UI.N)	r4   r5   r6   r7   r	   r8   r'   r9   r/    r   r   r=   r=   T   sG        AA&..K&00K6&&&11LLLr   r=   c                        e Zd ZdZ ee          Z eeee          Z eeee          Zd fd	Z	e
d             Zd Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zd Z xZS )ProcessWorkerr>   Nc                    t                                                       d| _        || _        d| _        d| _        d| _        d| _        d| _        t                      | _
        t                      | _        |                     |           | j
                            d           | j
        j                            | j                   | j        j                            | j                   dS )z
        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,
        NF   )r   r   _result	_cmd_list_fired_communicate_first_partial_stdout_partial_stderrr   r   _timerr   _process_set_environmentsetIntervaltimeoutconnect_communicatereadyReadStandardOutput_partial)r   cmd_listenvironr    s      r   r   zProcessWorker.__init__c   s     	!"'##hh 

g&&&$$$##D$5666-55dmDDDDDr   c                      d} t           r4ddl}t          |j        j                                                  }d|z   } | S )z$Return the encoding/codepage to use.zutf-8r   Ncp)WINctypesr   cdllkernel32GetACP)encorX   codepages      r   _get_encodingzProcessWorker._get_encoding   sH       	#MMM%fk&:&A&A&C&CDDH(?Dr   c                     |re| j                                         }|                                D ]\  }}|                    ||           | j                             |           dS dS )z$Set the environment on the QProcess.N)rK   processEnvironmentitemsinsertsetProcessEnvironment)r   rT   	q_environkvs        r   rL   zProcessWorker._set_environment   sw     	;88::I ' '1  A&&&&M//	:::::		; 	;r   c                     | j                                         }t          ||                                           }| j        || _        n| xj        |z  c_        | j                            | |d           dS )zCallback for partial output.N)rK   readAllStandardOutputr   r^   rH   r9   r(   )r   
raw_stdoutstdouts      r   rR   zProcessWorker._partial   s{    ]88::
":t/A/A/C/CDD'#)D    F*   	dFD11111r   c                     | j         s=| j                                        t          j        k    r|                                  dS | j        r| j                                         dS dS )zCallback for communicate.N)	rG   rK   stater   
NotRunningcommunicaterF   rJ   stopr#   s    r   rP   zProcessWorker._communicate   so    ' 	##%%)<<<[ 	K	 	r   c                 .   d| _         | j                                         |                                 }| j        *| j                                        }t          ||          }n| j        }| j        *| j                                        }t          ||          }n| j        }t          r(|
                                }|
                                }||g}|| _        | j        s(| j                            | |d         |d                    d| _        |S )zRetrieve information.TNr   )rG   rK   waitForFinishedr^   rH   rh   r   rI   readAllStandardErrorr
   decoderD   rF   r/   r(   )r   r\   ri   rj   
raw_stderrstderrresults          r   rn   zProcessWorker.communicate   s   "&%%'''!!##'<<>>J&z488FF)F';;==J&z488FF)F 	%]]__F]]__F&!{ 	@""4F2J???r   c                 8    | j                                          dS )zClose the running process.N)rK   closer#   s    r   ry   zProcessWorker.close   s    r   c                 ^    | j                                         t          j        k    o| j        S )z.Return True if worker has finished processing.)rK   rl   r   rm   rF   r#   s    r   r$   zProcessWorker.is_finished   s%    }""$$(;;KKr   c                     | j         s\d| _        | j        r3| j                            | j        d         | j        dd                    | j                                         dS dS )zStart process.Nr      )rF   _partial_ouputrE   rK   r)   rJ   r#   s    r   r3   zProcessWorker._start   sm    { 	 "&D~ K##DN1$5t~abb7IJJJK	  	 r   c                     | j                                         t          j        k    rJt	          j        t                    5  | j                                          ddd           n# 1 swxY w Y   d| _        dS )zTerminate running processes.NT)	rK   rl   r   Running
contextlibsuppressBaseExceptionr,   rF   r#   s    r   r,   zProcessWorker.terminate   s    =  H$444$]33 * *'')))* * * * * * * * * * * * * * *s   A''A+.A+c                 L    | j         r| j                            |           d S d S N)r   rK   write)r   r   s     r   r   zProcessWorker.write   s2    = 	&M%%%%%	& 	&r   c                 Z    | j         s#| j                            |            d| _         dS dS )zStart worker.TNr&   r#   s    r   r)   zProcessWorker.start   r*   r   r   )r4   r5   r6   r7   r	   r8   r'   r9   r/   r   staticmethodr^   rL   rR   rP   rn   ry   r$   r3   r,   r   r)   r:   r;   s   @r   rA   rA   \   s1       AA&..K&00K6&&&11LE E E E E E8 
 
 \
; ; ;2 2 2    @  L L L       & & &! ! ! ! ! ! !r   rA   c                   F     e Zd ZdZd
 fd	Zd ZddZd ZddZd	 Z	 xZ
S )WorkerManager*Spyder Worker Manager for Generic Workers.
   c                 6   t                                                       t                      | _        t                      | _        g | _        g | _        t                      | _        t                      | _	        d| _
        || _        t                      | _        | j                            d           | j        j                            | j                   | j	                            d           | j	        j                            | j                   dS )r   r   iM  i  N)r   r   r   _queue_queue_workers_threads_workersr   rJ   _timer_worker_delete_running_threads_max_threads_bag_collectorrM   rN   rO   r3   _clean_workers)r   max_threadsr    s     r   r   zWorkerManager.__init__   s    gg#gghh$*HH! !' $gg$$$##DK000!--d333!)11$2EFFFFFr   c                     | j         r | j                                          | j          | j                                         dS )z0Dereference workers in workers bag periodically.N)r   popleftr   ro   r#   s    r   r   zWorkerManager._clean_workers  sJ    ! 	*''))) ! 	*!&&(((((r   Nc                    |r| j                             |           | j         r| j        | j        k     r| xj        dz  c_        | j                                         }t                      }t          |t                    rh|                    |           |j	        
                    |j                   |j        
                    |j                   |                                 n=t          |t                    r(|                                 |                                 | j                            |           n| j                                         | j        rR| j        D ]J}|                                r4| j                            |           | j                            |           K| j        rH| j        D ]@}|                                r*| j                            |           | xj        dz  c_        At/          | j                  dk    rLt/          | j                  dk    r6| j                                         | j                                         dS dS dS )z-Start threads and check for inactive workers.r|   r   N)r   appendr   r   r   r   r   r   moveToThreadr/   rO   quitstartedr3   r)   rA   r   rJ   r   r$   r   remove
isFinishedlenro   r   )r   workerthreadwts        r   r3   zWorkerManager._start
  sA    	/&&v... 	 4#84;L#L#L!!Q&!!(0022FYYF&,//  ##F+++#++FK888&&v}555FM22  M  ((((K= 	,] , ,==?? ,'..q111M((+++= 	/] / /<<>> /M((+++))Q.))t}""s4='9'9Q'>'>K%++----- #"'>'>r   c                 R    t          |||          }|                     |           |S )z$Create a new python worker instance.)r   _create_worker)r   r   r   r   r   s        r   create_python_workerz"WorkerManager.create_python_worker/  s,    dD&11F###r   c                 R    t          ||          }|                     |           |S )z%Create a new process worker instance.)rT   )rA   r   )r   rS   rT   r   s       r   create_process_workerz#WorkerManager.create_process_worker5  s-    x999F###r   c                 x    |j                             | j                   | j                            |           dS )zCommon worker setup.N)r'   rO   r3   r   r   )r   r   s     r   r   zWorkerManager._create_worker;  s7    ""4;///V$$$$$r   )r   r   )r4   r5   r6   r7   r   r   r3   r   r   r   r:   r;   s   @r   r   r      s        44G G G G G G*) ) )#. #. #. #.J     % % % % % % %r   r   )r7   collectionsr   r   osqtpy.QtCorer   r   r   r   r   r	   "anaconda_navigator.utils.py3compatr
   r   namerW   r   r   r=   rA   r   r?   r   r   <module>r      sb              				 N N N N N N N N N N N N N N N N B B B B B B B B 	go2 2 2-! -! -! -! -!7 -! -! -!`2 2 2 2 2' 2 2 2M! M! M! M! M!G M! M! M!`R% R% R% R% R%G R% R% R% R% R%r   