o
    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 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
matplotlibr   )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   T/var/www/html/scripts/venv/lib/python3.10/site-packages/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   
r8   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rRtd
| d| d qAd|voZd|v }|rb|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    zPlugin `z!` wants to provide non-existent `z`. Ignoring.r   r   N)ospathdirname__file__r   joinr8   warningswarnplugin_meta_datasplitr   printappendplugin_providesbasenameplugin_module_name)	pdconfig_filesr3   r5   r6   r:   valid_providesr   need_to_add_collectionr   r   r   _scan_pluginsg   s,   
rS   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addrL   )loadedactive_pluginsplugin_funcr-   funcdr   r   r   r      s   r   c              	      s   | t vrtd|  dt |  }t|dkr d|  d}t||dd  du r1|d \}}n$t  z fdd	|D d }W n tyT   td
  d|  d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 (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   rV   r-   r   r   r=      s    zcall_plugin.<locals>.<listcomp>zCould not find the plugin "z" for .)r   
ValueErrorlenr)   pop_load
IndexError)r'   argskwargsplugin_funcsmsgrT   r]   r   r_   r   r      s    r   c                    s   |du r	t  }n|t  vrtd  d| d|dkr#|dg}n|g}t  |D ](}|t vr:td| 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.

    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   nrV   r5   r   r   r=          zuse_plugin.<locals>.<listcomp>c                    s    g | ]\}}| kr||fqS r   r   rl   rn   r   r   r=     ro   )r   r"   rL   r)   rd   )r5   r'   kfuncsr   rn   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
   
rv   c                 C   s   | t ddv r	dS | tvrtd|  dt|  }td| |gd}t|  }|D ]2}|dkr3t| nt||sDtd|  d	| d
 q(t| }t	||}| |f|vrZ|
| |f q(dS )zLoad the given plugin.

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

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

    T)rZ   Nrj   z not found.zskimage.io._plugins.)fromlistr   z does not provide z as advertised.  Ignoring.)r   rN   ra   
__import__rL   rv   rr   rJ   r   rs   rK   )r-   modnameplugin_moduler:   r   storer]   r   r   r   rd     s*   


rd   c                 C   s*   zt |  W S  ty   td|  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 "")rH   KeyErrorra   r_   r   r   r   r   3  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_namerV   r   r   r   r=   S  r>   z plugin_order.<locals>.<listcomp>r   )r   r]   r   r   r   r	   G  s   
r	   )Fr.   )__doc__os.pathrA   rF   configparserr   r   
collectionr   __all__r   rL   rN   rH   r!   r   r&   r    r
   r8   rS   r   r   r   r   rv   rd   r   r	   r   r   r   r   <module>   s>    

&7$