U
    ?h(                     @   s   d 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d	d
dddgZ	da
i Zi Zi ZdddgdgdgdZdd Ze  dd Zdd Zdd Zdd Zdd Ze  d'ddZe Zdd Zd(d dZd!d" Zd#d$ Zd%d	 Zd&d
 ZdS ))aA  Handle image reading, writing and plotting plugins.

To improve performance, plugins are only loaded as needed. As a result, there
can be multiple states for a given plugin:

    available: Defined in an *ini file located in `skimage.io._plugins`.
        See also `skimage.io.available_plugins`.
    partial definition: Specified in an *ini file, but not defined in the
        corresponding plugin module. This will raise an error when loaded.
    available but not on this system: Defined in `skimage.io._plugins`, but
        a dependent library (e.g. Qt, PIL) is not available on your system.
        This will raise an error when loaded.
    loaded: The real availability is determined when it's explicitly loaded,
        either because it's one of the default plugins, or because it's
        loaded explicitly by the user.

    N)ConfigParser)glob   )imread_collection_wrapper
use_plugincall_pluginplugin_infoplugin_orderreset_pluginsfind_available_pluginsavailable_pluginsZimageioZpilZ
matplotlib)allimshowimshow_collectionc                   C   s   g g g g g g da dS )zMClear the plugin state to the default, i.e., where no plugins are loaded
    )imreadimsaver   imread_collectionr   	_app_showNplugin_store r   r   K/var/www/html/venv/lib/python3.8/site-packages/skimage/io/manage_plugins.py_clear_plugins/   s    r   c                  C   sT   dddddg} | D ]}t |td  qdd t D }|D ]}t |t|  q<d S )	Nr   r   r   r   r   r   c                 s   s   | ]}|d kr|V  qdS )r   Nr   .0pr   r   r   	<genexpr>E   s      z*_load_preferred_plugins.<locals>.<genexpr>)_set_pluginpreferred_pluginskeys)Zio_typesZp_typeZplugin_typesr   r   r   _load_preferred_plugins>   s    r    c                 C   sJ   |D ]@}|t krqzt|| d W  qFW q tttfk
rB   Y qX qd S )N)kind)r   r   ImportErrorRuntimeErrorOSError)Zplugin_typeZplugin_listpluginr   r   r   r   J   s    
r   c                   C   s   t   t  d S )N)r   r    r   r   r   r   r
   U   s    c                 C   sH   t  }||  | d }i }||D ]}|||||< q*||fS )z>Return plugin name and meta-data dict from plugin config file.r   )r   readsectionsoptionsget)filenameparsername	meta_dataoptr   r   r   _parse_config_fileZ   s    
r/   c            	      C   s   t jt} tt j| dd}|D ]}t|\}}d|krPtd| d q$|t	|< dd |d 
dD }d	d |D }|D ]"}|tkrtd
| d| d qd|kod|k}|r|d |t|< t j|dd t|< q$dS )z]Scan the plugins directory for .ini files and parse them
    to gather plugin meta-data.
    Z_pluginsz*.iniprovideszfile z6 not recognized as a scikit-image io plugin, skipping.c                 S   s   g | ]}|  qS r   )strip)r   sr   r   r   
<listcomp>t   s     z!_scan_plugins.<locals>.<listcomp>,c                 S   s   g | ]}|t kr|qS r   r   r   r   r   r   r3   u   s      zPlugin `z!` wants to provide non-existent `z`. Ignoring.r   r   N)ospathdirname__file__r   joinr/   warningswarnplugin_meta_datasplitr   printappendplugin_providesbasenameplugin_module_name)	pdconfig_filesr*   r,   r-   r0   Zvalid_providesr   Zneed_to_add_collectionr   r   r   _scan_pluginsg   s(    
rF   Fc                 C   s`   t  }t D ]}|D ]\}}|| qqi }tD ]&}| rD||kr4dd t| D ||< q4|S )a1  List available plugins.

    Parameters
    ----------
    loaded : bool
        If True, show only those plugins currently loaded.  By default,
        all plugins are shown.

    Returns
    -------
    p : dict
        Dictionary with plugin names as keys and exposed functions as
        values.

    c                 S   s   g | ]}| d s|qS )_)
startswith)r   fr   r   r   r3      s    
z*find_available_plugins.<locals>.<listcomp>)setr   valuesaddrA   )loadedZactive_pluginsZplugin_funcr%   funcdr   r   r   r      s    c              	      s   | t krtd|  dt |  }t|dkr@d|  d}t||dd  dkrb|d \}}nNt  z fdd	|D d }W n* tk
r   td
  d|  dY nX |||S )a  Find the appropriate plugin of 'kind' and execute it.

    Parameters
    ----------
    kind : {'imshow', 'imsave', 'imread', 'imread_collection'}
        Function to look up.
    plugin : str, optional
        Plugin to load.  Defaults to None, in which case the first
        matching plugin is used.
    *args, **kwargs : arguments and keyword arguments
        Passed to the plugin function.

    zInvalid function (z) requested.r   z"No suitable plugin registered for z.

You may load I/O plugins with the `skimage.io.use_plugin` command.  A list of all available plugins are shown in the `skimage.io` docstring.r%   Nc                    s   g | ]\}}| kr|qS r   r   )r   r   rI   r%   r   r   r3      s      zcall_plugin.<locals>.<listcomp>zCould not find the plugin "z" for .)r   
ValueErrorlenr#   pop_load
IndexError)r!   argskwargsZplugin_funcsmsgrG   rN   r   rP   r   r      s    c                    s   |dkrt  }n:|t  kr4td  d| d|dkrF|dg}n|g}t  |D ]P}|t krttd| dt | } fd	d
|D  fdd
|D  }|t |< qXdS )aS  Set the default plugin for a specified operation.  The plugin
    will be loaded if it hasn't been already.

    Parameters
    ----------
    name : str
        Name of plugin.
    kind : {'imsave', 'imread', 'imshow', 'imread_collection', 'imshow_collection'}, optional
        Set the plugin for this function.  By default,
        the plugin is set for all functions.

    See Also
    --------
    available_plugins : List of available plugins

    Examples
    --------
    To use Matplotlib as the default image reader, you would write:

    >>> from skimage import io
    >>> io.use_plugin('matplotlib', 'imread')

    To see a list of available plugins run ``io.available_plugins``. Note that
    this lists plugins that are defined, but the full list may not be usable
    if your system does not have the required libraries installed.

    NPlugin z does not support `z`.r   r   'z!' is not a known plugin function.c                    s    g | ]\}}| kr||fqS r   r   r   nrI   r,   r   r   r3     s      zuse_plugin.<locals>.<listcomp>c                    s    g | ]\}}| kr||fqS r   r   r\   r^   r   r   r3     s      )r   r   rA   r#   rU   )r,   r!   kfuncsr   r^   r   r      s     

c                 C   s6   t | ds2t | dr2t| d}t|}t| d| dS )z9Add `imread_collection` to module if not already present.r   r   N)hasattrgetattrr   setattr)moduler   rN   r   r   r   #_inject_imread_collection_if_needed  s    
re   c                 C   s   | t ddkrdS | tkr,td|  dnt|  }td| |gd}t|  }|D ]d}|dkrht| n"t||std|  d	| d
 qRt| }t	||}| |f|krR|
| |f qRdS )zLoad the given plugin.

    Parameters
    ----------
    plugin : str
        Name of plugin to load.

    See Also
    --------
    plugins : List of available plugins

    T)rM   NrZ   z not found.zskimage.io._plugins.)fromlistr   z does not provide z as advertised.  Ignoring.)r   rC   rR   
__import__rA   re   ra   r?   r   rb   r@   )r%   modnameZplugin_moduler0   r   storerN   r   r   r   rU     s&    


rU   c                 C   s4   z
t |  W S  tk
r.   td|  dY nX dS )zReturn plugin meta-data.

    Parameters
    ----------
    plugin : str
        Name of plugin.

    Returns
    -------
    m : dict
        Meta data as specified in plugin ``.ini``.

    zNo information on plugin ""N)r=   KeyErrorrR   rP   r   r   r   r   3  s    
c                  C   s(   i } t D ]}dd t | D | |< q| S )zReturn the currently preferred plugin order.

    Returns
    -------
    p : dict
        Dictionary of preferred plugin order, with function name as key and
        plugins (in order of preference) as value.

    c                 S   s   g | ]\}}|qS r   r   )r   Zplugin_namerI   r   r   r   r3   S  s     z plugin_order.<locals>.<listcomp>r   )r   rN   r   r   r   r	   G  s    
)F)N)__doc__os.pathr6   r;   configparserr   r   Z
collectionr   __all__r   rA   rC   r=   r   r   r    r   r
   r/   rF   r   r   r   r   re   rU   r   r	   r   r   r   r   <module>   sD     
&
7$