B
    `?                 @   s   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mZ ddl	m
Z
mZmZ ddlmZ ddlmZ G dd dejZd	d
 Zdd ZdddZG dd deZdadd Zdd ZG dd deZdd ZdddZdS )    N   )ipc)get_py_pathget_site_packagesinterrupt_main)IReloaderProxy)resolve_specc                   sX   e Zd ZdZdZdZ fddZdd Zdd	 Zd
d Z	dd Z
dd Zdd Z  ZS )WatchSysModulesz+ Poll ``sys.modules`` for imported modules.r   Tc                s8   t t|   t | _|| _t | _d| _	t
 | _d S )NF)superr	   __init__setpathscallback	threadingLocklockstoppedget_system_pathssystem_paths)selfr   )	__class__ U/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/hupper/worker.pyr      s    
zWatchSysModules.__init__c             C   s$   x| j s|   t| j qW d S )N)r   update_pathstimesleeppoll_interval)r   r   r   r   run   s    zWatchSysModules.runc             C   s
   d| _ d S )NT)r   )r   r   r   r   stop"   s    zWatchSysModules.stopc          	   C   s\   g }| j : x2tt D ]$}|| jkr| j| || qW W dQ R X |rX| | dS )z4 Check sys.modules for paths to add to our path set.N)r   expand_source_pathsiter_module_pathsr   addappendwatch_paths)r   	new_pathspathr   r   r   r   %   s    
zWatchSysModules.update_pathsc          	   C   sp   g }| j N xFt|D ]8\}}}}tj|}|| jkr| j| || qW W dQ R X |rl| 	| dS )z: Inspect a traceback for new paths to add to our path set.N)
r   	traceback
extract_tbosr%   abspathr   r!   r"   r#   )r   tbr$   filenamelinefuncnametxtr%   r   r   r   search_traceback0   s    
z WatchSysModules.search_tracebackc                s*    j r fdd|D }|r& | d S )Nc                s   g | ]}  |s|qS r   )in_system_paths).0r%   )r   r   r   
<listcomp>>   s    z/WatchSysModules.watch_paths.<locals>.<listcomp>)ignore_system_pathsr   )r   r   r   )r   r   r#   <   s    zWatchSysModules.watch_pathsc             C   s.   t j|}x| jD ]}||rdS qW dS )NTF)r(   r%   realpathr   
startswith)r   r%   prefixr   r   r   r0   B   s
    
zWatchSysModules.in_system_paths)__name__
__module____qualname____doc__r   r3   r   r   r   r   r/   r#   r0   __classcell__r   r   )r   r   r	      s   r	   c              C   s4   t  } x(dD ] }t|}|d k	r| | qW | S )N>   stdlib
platstdlibplatlibpurelib)r   	sysconfigget_pathr"   )r   namer%   r   r   r   r   L   s    

r   c             c   s:   x4| D ],}| dr,t|}tj|r,|}|V  qW dS )z1 Convert pyc files into their source equivalents.)z.pycz.pyoN)endswithr   r(   r%   exists)r   Zsrc_pathZpy_pathr   r   r   r   U   s    

r   c          
   c   sp   | pt tj } xX| D ]P}y
|j}W n ttfk
r@   wY nX |dk	rtj	|}tj
|r|V  qW dS )z% Yield paths of all imported modules.N)listsysmodulesvalues__file__AttributeErrorImportErrorr(   r%   r)   isfile)rG   moduler+   Zabs_filenamer   r   r   r    b   s    

r    c                   sT   e Zd ZdZd fdd	ZdddZedd Zdd
dZdddZ	dd Z
  ZS )Workerz: A helper object for managing a worker process lifecycle. Nc                sL   t t|   || _|| _|| _t \| _| _	d | _
d | _d | _d | _d S )N)r
   rN   r   worker_specworker_argsworker_kwargsr   ZPipepipe_child_pipepidprocessexitcodestdin_termios)r   specargskwargs)r   r   r   r   s   s    zWorker.__init__c             C   sl   t tj| _t| j| j| j| j	d}t j
td || j	j| j	jgd| _| jj| _| j| | j	  d S )N)rX   	spec_argsspec_kwargsrR   z.worker_main)rZ   pass_fds)r   Zsnapshot_termiosrF   stdinrW   dictrO   rP   rQ   rS   spawnr7   Zr_fdZw_fdrU   rT   rR   activateclose)r   Z	on_packetkwr   r   r   start~   s    

zWorker.startc             C   s,   | j d k	rdS | jr(tj| jddd kS dS )NFr   )timeout)rV   rU   r   wait)r   r   r   r   is_alive   s
    
zWorker.is_aliveFc             C   s   t j| j|dS )N)soft)r   killrU   )r   rh   r   r   r   ri      s    zWorker.killc             C   s   t j| j|dS )N)re   )r   rf   rU   )r   re   r   r   r   rf      s    zWorker.waitc             C   s\   |   | _| jr ttj| j | jrXz(y| j  W n t	k
rJ   Y nX W d d | _X d S )N)
rf   rV   rW   r   Zrestore_termiosrF   r^   rR   rb   	Exception)r   r   r   r   join   s    

zWorker.join)NN)N)F)N)r7   r8   r9   r:   r   rd   propertyrg   ri   rf   rk   r;   r   r   )r   r   rN   p   s   


rN   c               C   s   t dkrtdt S )z
    Get a reference to the current :class:`hupper.interfaces.IReloaderProxy`.

    Raises a ``RuntimeError`` if the current process is not actively being
    monitored by a parent process.

    Nz#process is not controlled by hupper)_reloader_proxyRuntimeErrorr   r   r   r   get_reloader   s    ro   c               C   s   t dk	S )zV
    Return ``True`` if the current process being monitored by a parent process.

    N)rm   r   r   r   r   	is_active   s    rp   c               @   s$   e Zd Zdd Zdd Zdd ZdS )ReloaderProxyc             C   s
   || _ d S )N)rR   )r   rR   r   r   r   r      s    zReloaderProxy.__init__c             C   s"   dd |D }| j d|f d S )Nc             S   s   g | ]}t j|qS r   )r(   r%   r)   )r1   fr   r   r   r2      s    z-ReloaderProxy.watch_files.<locals>.<listcomp>watch_files)rR   send)r   filesr   r   r   rs      s    zReloaderProxy.watch_filesc             C   s   | j d d S )N)reload)rR   rt   )r   r   r   r   trigger_reload   s    zReloaderProxy.trigger_reloadN)r7   r8   r9   r   rs   rw   r   r   r   r   rq      s   rq   c             C   s   dd }|  | d S )Nc             S   s   | d krt   d S )N)r   )packetr   r   r   handle_packet   s    z)watch_control_pipe.<locals>.handle_packet)ra   )rR   ry   r   r   r   watch_control_pipe   s    rz   c             C   s   |d krg }|d kri }t | ttdr:ttjtj dt_t|at	tj
}d|_|  t| }zVy||| W nB tk
r   y|t d  W n tk
r   Y nX  Y nX W d y|  |  |  W n tk
r   Y nX X d S )NSIGHUPT   )rz   hasattrsignalr{   SIG_IGNrF   dont_write_bytecoderq   rm   r	   rs   daemonrd   r   BaseExceptionr/   exc_inforj   r   r   rk   )rX   rR   r[   r\   Zpollerfuncr   r   r   worker_main   s6    

r   )N)NN)r(   r~   rF   r@   r   r   r&    r   compatr   r   r   Z
interfacesr   utilsr   Threadr	   r   r   r    objectrN   rm   ro   rp   rq   rz   r   r   r   r   r   <module>   s*   =	
C