
"[jX                  @   sc   d  Z  d d l Z d d l Z d d l Z d d l m Z e j d  Z Gd d   d e  Z	 d S)z.
utils.plugins - Plugin loading functionality
    N)SourceFileLoaderz\* depends: (.+)c               @   sI   e  Z d  Z d Z d d   Z d d   Z d d d  Z d	 d
   Z d S)PluginLoaderz
    The plugin loader
    Generates a dependency graph and returns a list of loaded modules
    when load_all() is called.
    c             C   sO   d |  _  i  |  _ t j t j d  d  } x | D] } |  j |  q4 Wd S)z? Initializes the PluginLoader by generating a dependency graph z	./pluginsz*.pyN)	directorygraphfnmatchfilteroslistdirparseDepends)selffilesf r   /opt/Infobot/utils/plugins.py__init__   s
    		zPluginLoader.__init__c             C   s   t  t j j |  j |   t } xB | D]: } t j |  } | r( | j d  j d  |  j	 | <q( W| |  j	 k r | d k r g  |  j	 | <Wd  QRXd  S)N   z, z__init__.py)
openr   pathjoinr   
DEPENDS_REsearchgroupsplitr   )r   r   Zfobjlinematchr   r   r   r
      s    !#zPluginLoader.parseDependsNc             C   sK   | d  k r  d | d  d  } t  | t j j |  j |   j   } | S)Nzplugins.   )r   r   r   r   r   load_module)r   Zplugin_filenamenamepluginr   r   r   load_plugin%   s    'zPluginLoader.load_pluginc             C   s   g  } |  j  d d d x |  j r t t d d   |  j j     } x | j   D]| \ } } | j |  j  |   |  j | =xM |  j j   D]< \ } } y | j | d  d   Wq t k
 r Yq Xq WqV Wq W| S)Nz__init__.pyr   pluginsc             S   s	   |  d S)Nr   r   )xr   r   r   <lambda>/   s    z'PluginLoader.load_all.<locals>.<lambda>r   r   )r    r   dictr   itemsappendremove
ValueError)r   r!   Zsatisfied_pluginsZsatisfied_plugin_r   Zdepsr   r   r   load_all+   s    $
zPluginLoader.load_all)__name__
__module____qualname____doc__r   r
   r    r*   r   r   r   r   r      s
   
r   )
r.   rer   r   importlib.machineryr   compiler   objectr   r   r   r   r   <module>   s   