a
    
d(                     @   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)ZimageioZ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   b/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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|  q6d 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       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   sH   |D ]>}|t vrqzt|| d W  qDW q tttfy@   Y q0 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    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    
r1   c            	      C   s   t jt} tt j| dd}|D ]}t|\}}d|vrPtd| d q$|t	|< dd |d 
dD }d	d |D }|D ]"}|tvrtd
| d| d qd|vod|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.
    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   r   z!_scan_plugins.<locals>.<listcomp>,c                 S   s   g | ]}|t v r|qS r   r   r   r   r   r   r5   u   r   zPlugin `z!` wants to provide non-existent `z`. Ignoring.r   r   N)ospathdirname__file__r   joinr1   warningswarnplugin_meta_datasplitr   printappendplugin_providesbasenameplugin_module_name)	pdconfig_filesr,   r.   r/   r2   Zvalid_providesr   Zneed_to_add_collectionr   r   r   _scan_pluginsg   s(    
rH   Fc                 C   s`   t  }t D ]}|D ]\}}|| qqi }tD ]&}| rD||v 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   r5      s   
z*find_available_plugins.<locals>.<listcomp>)setr   valuesaddrC   )loadedZactive_pluginsZ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 rb|d \}}nLt  z fdd	|D d }W n( ty   td
  d|  dY n0 ||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   rK   r'   r   r   r5      r   zcall_plugin.<locals>.<listcomp>zCould not find the plugin "z" for .)r   
ValueErrorlenr%   pop_load
IndexError)r#   argskwargsZplugin_funcsmsgrI   rP   r   rR   r   r      s    r   c                    s   |du rt  }n:|t  vr4td  d| d|dkrF|dg}n|g}t  |D ]P}|t v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   nrK   r.   r   r   r5     r   zuse_plugin.<locals>.<listcomp>c                    s    g | ]\}}| kr||fqS r   r   r^   r`   r   r   r5     r   )r   r!   rC   r%   rW   )r.   r#   kfuncsr   r`   r   r      s     

r   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   rP   r   r   r   #_inject_imread_collection_if_needed  s    
rg   c                 C   s   | t ddv rdS | tv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|vrR|
| |f qRdS )zLoad the given plugin.

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

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

    T)rO   Nr\   z not found.zskimage.io._plugins.)fromlistr   z does not provide z as advertised.  Ignoring.)r   rE   rT   
__import__rC   rg   rc   rA   r   rd   rB   )r'   modnameZplugin_moduler2   r   storerP   r   r   r   rW     s&    


rW   c                 C   s2   z
t |  W S  ty,   td|  dY n0 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?   KeyErrorrT   rR   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   Zplugin_namerK   r   r   r   r5   S  r   z plugin_order.<locals>.<listcomp>r   )r   rP   r   r   r   r	   G  s    
r	   )F)N)__doc__os.pathr8   r=   configparserr   r   Z
collectionr   __all__r   rC   rE   r?   r    r   r"   r   r
   r1   rH   r   r   r   r   rg   rW   r   r	   r   r   r   r   <module>   s<   
&
7$