o
    :ήc2)                     @   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 g dZ	da
i Zi Zi Zg d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_plugins)imageiopil
matplotlibqtr   )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   @/tmp/pip-target-vg8gfxp4/lib/python/skimage/io/manage_plugins.py_clear_plugins/   s   
r   c                  C   sN   g d} | D ]	}t |td  qdd t D }|D ]	}t |t|  qd S )N)r   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)io_typesp_typeplugin_typesr   r   r   _load_preferred_plugins>   s   r'   c                 C   sD   |D ]}|t vr	qz
t|| d W  d S  tttfy   Y qw d S )N)kind)r   r   ImportErrorRuntimeErrorOSError)plugin_type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   
r
   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   
r9   c            	      C   s   t jt} tt j| dd}|D ]]}t|\}}d|vr(td| d q|t	|< dd |d 
dD }d	d |D }|D ]}|tvrOtd
||f  qAd|voWd|v }|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.
    _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       z!_scan_plugins.<locals>.<listcomp>,c                 S   s   g | ]}|t v r|qS r   r   r   r   r   r   r>   u   s    z9Plugin `%s` wants to provide non-existent `%s`. Ignoring.r   r   N)ospathdirname__file__r   joinr9   warningswarnplugin_meta_datasplitr   printappendplugin_providesbasenameplugin_module_name)	pdconfig_filesr4   r6   r7   r;   valid_providesr   need_to_add_collectionr   r   r   _scan_pluginsg   s0   
rT   Fc                 C   s`   t  }t D ]}|D ]	\}}|| qqi }tD ]}| r"||v r-dd t| D ||< q|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   r>      s    
z*find_available_plugins.<locals>.<listcomp>)setr   valuesaddrM   )loadedactive_pluginsplugin_funcr.   funcdr   r   r   r      s   r   c                    s   | t vr
td|  t |  }t|dkrd}t||  |dd  du r-|d \}}n!t  z fdd|D d }W n tyM   td | f w ||i |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 (%s) requested.r   zNo suitable plugin registered for %s.

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   rW   r.   r   r   r>      s    zcall_plugin.<locals>.<listcomp>z&Could not find the plugin "%s" for %s.)r   
ValueErrorlenr*   pop_load
IndexError)r(   argskwargsplugin_funcsmsgrU   r^   r   r`   r   r      s$   r   c                    s   |du r	t  }n|t  vrtd |f |dkr |dg}n|g}t  |D ]&}|t vr5td| t | } fdd|D  fdd|D  }|t |< q)d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.

    Nz Plugin %s does not support `%s`.r   r   z$'%s' is not a known plugin function.c                    s    g | ]\}}| kr||fqS r   r   r   nrW   r6   r   r   r>          zuse_plugin.<locals>.<listcomp>c                    s    g | ]\}}| kr||fqS r   r   rj   rl   r   r   r>     rm   )r   r#   rM   r*   rd   )r6   r(   kfuncsr   rl   r   r      s&   


r   c                 C   s>   t | dst | drt| d}t|}t| d| dS dS dS )z9Add `imread_collection` to module if not already present.r   r   N)hasattrgetattrr   setattr)moduler   r^   r   r   r   #_inject_imread_collection_if_needed
  s
   
rt   c                 C   s   | t ddv r	dS | tvrtd|  t|  }td| |gd}t|  }|D ]/}|dkr1t| nt||s?td| |f  q&t| }t	||}| |f|vrU|
| |f q&dS )	zLoad the given plugin.

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

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

    T)r[   NzPlugin %s not found.zskimage.io._plugins.)fromlistr   z7Plugin %s does not provide %s as advertised.  Ignoring.)r   rO   ra   
__import__rM   rt   rp   rK   r   rq   rL   )r.   modnameplugin_moduler;   r   storer^   r   r   r   rd     s.   


rd   c                 C   s&   zt |  W S  ty   td|  w )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 "%s")rI   KeyErrorra   r`   r   r   r   r   7  s
   
r   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   plugin_namerW   r   r   r   r>   W  r?   z plugin_order.<locals>.<listcomp>r   )r   r^   r   r   r   r	   K  s   
r	   )Fr/   )__doc__os.pathrB   rG   configparserr   r   
collectionr   __all__r   rM   rO   rI   r"   r   r'   r!   r
   r9   rT   r   r   r   r   rt   rd   r   r	   r   r   r   r   <module>   s>     

'8%