σ
P'^c           @@  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 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 d d l m Z d d l m Z y d d l Z e j Z  Wn e! k
 r:d Z e# Z  n Xd d d d d d d d g Z$ e e%  Z& d e j' f d     YZ( d d  Z) d e# f d     YZ* d e* f d     YZ+ d e* f d     YZ, d e  f d     YZ- d   Z. i e, d  6e- d! 6e+ d" 6Z/ e/ e j0 j1 d#  p!e.   Z2 d e f d$     YZ3 d S(%   sr   
    celery.worker.autoreload
    ~~~~~~~~~~~~~~~~~~~~~~~~

    This module implements automatic module reloading
i    (   t   absolute_importN(   t   defaultdict(   t   Event(   t   eventio(   t   ensure_bytes(   t	   bootsteps(   t   items(   t   ignore_errno(   t   module_file(   t
   get_logger(   t   bgThreadi   (   t   Poolt   WorkerComponentt   Autoreloadert   Monitort   BaseMonitort   StatMonitort   KQueueMonitort   InotifyMonitort	   file_hashc           B@  s;   e  Z d  Z e Z e f Z d d  Z d   Z	 d   Z
 RS(   R   c         K@  s   | |  _  | _ d  | _ d  S(   N(   t   enabledt
   autoreloadt   Nonet   autoreloader(   t   selft   wR   t   kwargs(    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyt   __init__3   s    c         C@  s,   |  j  | j |  | _ | j s( | j Sd  S(   N(   t   instantiatet   autoreloader_clsR   t   use_eventloopR   (   R   R   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyt   create7   s    c         C@  s*   | j  j |  | j j | j  j  d  S(   N(   R   t   register_with_event_loopt   on_closet   addt   on_event_loop_close(   R   R   t   hub(    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR    ;   s    N(   t   __name__t
   __module__t   labelt   Truet   conditionalR   t   requiresR   R   R   R    (    (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR   .   s   		t   md5c         @  sg   t  j |  } t |  d  =   x3 t   f d   d  D] } | j t |   q: WWd  QX| j   S(   Nt   rbc           @  s     j  d  S(   Ni   i   i   (   t   read(    (   t   f(    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyt   <lambda>C   t    R0   (   t   hashlibt   newt   opent   itert   updateR   t   digest(   t   filenamet	   algorithmt   hobjt   chunk(    (   R.   s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR   @   s
    c           B@  s>   e  Z d d d  d  Z d   Z d   Z d   Z d   Z RS(   g      ΰ?c         C@  s@   | |  _  | |  _ | |  _ t t  |  _ | p6 t   |  _ d  S(   N(   t   filest   intervalt
   _on_changeR   t   intt   modify_timesR   t   shutdown_event(   R   R;   t	   on_changeR@   R<   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR   J   s
    			c         C@  s   t  d   d  S(   Ns   Subclass responsibility(   t   NotImplementedError(   R   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyt   startR   s    c         C@  s   d  S(   N(    (   R   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyt   stopU   s    c         C@  s   |  j  r |  j  |  Sd  S(   N(   R=   (   R   t   modified(    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRA   X   s    	c         C@  s   d  S(   N(    (   R   R$   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR#   \   s    N(   R%   R&   R   R   RC   RD   RA   R#   (    (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR   H   s
   			c           B@  sJ   e  Z d  Z d   Z d   Z d   Z d   Z d   Z e d    Z	 RS(   s6   File change monitor based on the ``stat`` system call.c         @  s     f d     j  D S(   Nc         3@  s$   |  ] } |   j  |  f Vq d  S(   N(   t   _mtime(   t   .0R.   (   R   (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pys	   <genexpr>d   s    (   R;   (   R   (    (   R   s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyt   _mtimesc   s    c         C@  s   | d  k	 o |  j | | k S(   N(   R   R?   (   R   R.   t   mt(    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyt   _maybe_modifiedf   s    c         C@  s   | j  d |  j  d  S(   Ng       @(   t   call_repeatedlyt   find_changes(   R   R$   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR    i   s    c         @  sU   |  j    t   f d   |  j   D  } | rQ |  j |  |  j j |  n  d  S(   Nc         3@  s0   |  ]& \ } }   | |  r | | f Vq d  S(   N(    (   RG   R.   RI   (   t   maybe_modified(    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pys	   <genexpr>n   s    	(   RJ   t   dictRH   RA   R?   R5   (   R   RE   (    (   RM   s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRL   l   s
    	"c         C@  s4   x- |  j  j   s/ |  j   t j |  j  q Wd  S(   N(   R@   t   is_setRL   t   timet   sleepR<   (   R   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRC   t   s    
c         C@  s,   y t  j |   j SWn t k
 r' n Xd  S(   N(   t   ost   statt   st_mtimet	   Exception(   t   path(    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRF   y   s    (
   R%   R&   t   __doc__RH   RJ   R    RL   RC   t   staticmethodRF   (    (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR   `   s   					c           B@  sV   e  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 RS(	   s;   File change monitor based on BSD kernel event notificationsc         O@  sB   t  t |   j | |   t d   |  j D  |  _ i  |  _ d  S(   Nc         s@  s   |  ] } | d  f Vq d  S(   N(   R   (   RG   R.   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pys	   <genexpr>   s    (   t   superR   R   RN   R;   t   filemapt   fdmap(   R   t   argsR   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR      s    c         C@  sc   t  j d  k	 r_ t  j   |  _ |  j |  j  |  j |  j _ | j |  j j |  j j	 d  n  d  S(   Ni    (
   R   t   kqueueR   t   _kqueuet   _kqt
   add_eventst   handle_eventt   on_file_changet
   add_readert   poll(   R   R$   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR       s
    c         C@  s   |  j  |  j  d  S(   N(   t   closeR_   (   R   R$   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR#      s    c         C@  sR   xK |  j  D]@ } t j | t j  |  j  | <} | |  j | <| j |  q
 Wd  S(   N(   RZ   RR   R3   t   O_RDONLYR[   t
   watch_file(   R   t   pollerR.   t   fd(    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR`      s     c         C@  s.   |  j  g  | D] } |  j | j ^ q  d  S(   N(   RA   R[   t   ident(   R   t   eventst   e(    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRa      s    c         C@  sX   t  j   |  _ |  j |  j  |  j |  j _ x# |  j j   sS |  j j d  q1 Wd  S(   Ni   (   R   Rd   Rh   R`   Ra   Rb   R@   RO   (   R   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRC      s
    c         C@  sz   xY t  |  j  D]H \ } } | d  k	 r | j |  t d   t j |  Wd  QXq q W|  j j   |  j j   d  S(   Nt   EBADF(	   R   RZ   R   t
   unregisterR   RR   Re   t   clearR[   (   R   Rh   R.   Ri   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRe   £   s    c         C@  s!   |  j  |  j  |  j j    d  S(   N(   Re   Rh   (   R   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRD   ¬   s    (   R%   R&   RW   R   R    R#   R`   Ra   RC   Re   RD   (    (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR      s   								c           B@  sl   e  Z d  Z d
 d  Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z e Z Z d	   Z RS(   s=   File change monitor based on Linux kernel `inotify` subsystemc         K@  s4   t  s t  | |  _ | |  _ d  |  _ d  |  _ d  S(   N(   t	   pyinotifyt   AssertionErrort   _modulesR=   R   t   _wmt	   _notifier(   R   t   modulesRA   R   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR   ΄   s
    			c         C@  s*   |  j    | j |  j j   |  j  d  S(   N(   t   create_notifierRc   Rs   t   get_fdt   on_readable(   R   R$   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR    »   s    
c         C@  s   d  S(   N(    (   R   R$   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR#   Ώ   s    c         C@  s   |  j  j   |  j  j   d  S(   N(   Rt   t   read_eventst   process_events(   R   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRx   Β   s    c         C@  sh   t  j   |  _ t  j |  j |   |  _ |  j j } t  j t  j B} x |  j D] } | | |  qM Wd  S(   N(	   Rp   t   WatchManagerRs   t   NotifierRt   t	   add_watcht	   IN_MODIFYt	   IN_ATTRIBRr   (   R   R}   t   flagst   m(    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRv   Ζ   s    c         C@  sL   z |  j    |  j j   Wd  |  j rG |  j j   d  |  _ |  _ n  Xd  S(   N(   Rv   Rt   t   loopRs   Re   R   (   R   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRC   Ξ   s    
	c         C@  s   d  S(   N(    (   R   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRD   Ψ   s    c         C@  s   |  j  | j g  d  S(   N(   RA   RV   (   R   t   event(    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyt   process_Ϋ   s    c         C@  s   |  j  r |  j  |  Sd  S(   N(   R=   (   R   RE   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRA   ΰ   s    	N(   R%   R&   RW   R   R   R    R#   Rx   Rv   RC   RD   R   t   process_IN_ATTRIBt   process_IN_MODIFYRA   (    (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR   ±   s   					
		
c           C@  sF   t  t d  r" t j d  k	 r" d St j j d  r> t r> d Sd Sd  S(   NR]   t   linuxt   inotifyRS   (	   t   hasattrt   selectR   R]   R   t   syst   platformt
   startswithRp   (    (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyt   default_implementationε   s
    R]   R   RS   t   CELERYD_FSNOTIFYc           B@  sk   e  Z d  Z e Z d
 d
 d  Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z d   Z d	   Z RS(   s3   Tracks changes in modules and fires reload commandsc         K@  sq   t  t |   j   | |  _ |  j j } | d  k r@ | j j n | |  _ | |  _	 d  |  _
 d  |  _ i  |  _ d  S(   N(   RY   R   R   t
   controllert   appR   t   loadert   task_modulesRu   t   optionst   _monitort   _hashest   file_to_module(   R   R   Ru   t   monitor_clsR   R   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR   ψ   s    	!			c         C@  s   |  j  } | j t d   |  j D   |  j | |  j d |  j |  j |  _ t g  | D] } | t	 |  f ^ qZ  |  _
 d  S(   Nc         s@  s(   |  ] } t  t j |  | f Vq d  S(   N(   R   R   Ru   (   RG   R   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pys	   <genexpr>  s    R@   (   R   R5   RN   Ru   R   RA   t   _is_shutdownR   R   R   R   (   R   R;   R.   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyt   on_init  s    		c         C@  s0   |  j  d  k r |  j   n  |  j  j |  d  S(   N(   R   R   R   R    (   R   R$   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR      s    c         C@  s&   |  j  d  k	 r" |  j  j |  n  d  S(   N(   R   R   R#   (   R   R$   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR#     s    c         C@  s1   |  j    t d d   |  j j   Wd  QXd  S(   Nt   EINTRt   EAGAIN(   R   R   R   RC   (   R   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyt   body  s    
c         C@  sI   t  j j |  rE t |  } | |  j | k rE | |  j | <t Sn  t S(   N(   RR   RV   t   existsR   R   R(   t   False(   R   R.   R6   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRJ     s    c         C@  sr   g  | D] } |  j  |  r | ^ q } | rn g  | D] } |  j | ^ q5 } t j d |  |  j |  n  d  S(   Ns   Detected modified modules: %r(   RJ   R   t   loggert   infot   _reload(   R   R;   R.   RE   t   modulet   names(    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRA   "  s
    ( c         C@  s   |  j  j | d t d  S(   Nt   reload(   R   R₯   R(   (   R   Ru   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR’   )  s    c         C@  s   |  j  r |  j  j   n  d  S(   N(   R   RD   (   R   (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyRD   ,  s    	N(   R%   R&   RW   R   R   R   R   R    R#   R   RJ   RA   R’   RD   (    (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyR   τ   s   
	
						(4   RW   t
   __future__R    R1   RR   R   R   RP   t   collectionsR   t	   threadingR   t   kombu.utilsR   t   kombu.utils.encodingR   t   celeryR   t   celery.fiveR   t   celery.platformsR   t   celery.utils.importsR   t   celery.utils.logR	   t   celery.utils.threadsR
   t
   componentsR   Rp   t   ProcessEventt   _ProcessEventt   ImportErrorR   t   objectt   __all__R%   R    t   StartStopStepR   R   R   R   R   R   R   t   implementationst   environt   getR   R   (    (    (    s:   /tmp/pip-unpacked-wheel-gV1wwp/celery/worker/autoreload.pyt   <module>   sN   
!04	

