a
    İa~                     @   s   d dl Z d dlZd dlZd dlZddlmZmZ zd dlmZ W n e	y^   d dl
mZ Y n0 g dZdd Zdd	 Zd
d Zdd Zdd Zdd Ze jdddd Zdd Zdd ZdS )    N   )BACKEND_ENTRYPOINTSBackendEntrypoint)entry_points)Znetcdf4Zh5netcdfZscipyc                 C   s   t | dd d} tj| dd d}g }|D ]l\}}t|}||d  t|}|dkr*|d j}dd |D }td	| d
| d| d| d	t	 q*|S )Nc                 S   s   | j S NnameZep r
   6lib/python3.9/site-packages/xarray/backends/plugins.py<lambda>       z#remove_duplicates.<locals>.<lambda>)keyc                 S   s   | j S r   r   r	   r
   r
   r   r      r   r   r   c                 S   s   g | ]
}|j qS r
   )module_name).0er
   r
   r   
<listcomp>   r   z%remove_duplicates.<locals>.<listcomp>zFound z! entrypoints for the engine name z:
 z.
 It will be used: .)
sorted	itertoolsgroupbylistappendlenr   warningswarnRuntimeWarning)entrypointsZentrypoints_groupedZunique_entrypointsr   matchesZmatches_lenZselected_module_nameZall_module_namesr
   r
   r   remove_duplicates   s&    
r   c                 C   sf   t | }|j}g }| D ]@\}}|jt jjt jjfv rJtd| d|dkr|	| qt
|S )NzAll the parameters in zB signature should be explicit. *args and **kwargs is not supportedself)inspect	signature
parametersitemskindZ	ParameterZVAR_KEYWORDZVAR_POSITIONAL	TypeErrorr   tuple)open_datasetr"   r#   Zparameters_listr   Zparamr
   r
   r   detect_parameters'   s    

r)   c                 C   sj   i }| D ]\}|j }z| }|||< W q tyb } z$td|d| t W Y d }~qd }~0 0 q|S )NzEngine z loading failed:
)r   load	Exceptionr   r   r   )r   backend_entrypointsZ
entrypointr   backendexr
   r
   r   backends_dict_from_pkg9   s    0r/   c                 C   s0   |   D ]"\}}|jd u r|j}t||_qd S r   )r$   Zopen_dataset_parametersr(   r)   )r,   r   r-   r(   r
   r
   r   set_missing_parametersE   s    
r0   c                    sL   i }t D ]"} |d d ur |||< q| fddt D  |S )Nc                    s   i | ]}| | qS r
   r
   )r   r   r,   r
   r   
<dictcomp>R   r   z!sort_backends.<locals>.<dictcomp>)STANDARD_BACKENDS_ORDERgetpopupdater   )r,   Zordered_backends_entrypointsZbe_namer
   r1   r   sort_backendsL   s    r7   c                 C   s`   i }t  D ]\}}|jr|||< qt| } t| }|| t|}t| dd | D S )Nc                 S   s   i | ]\}}|| qS r
   r
   )r   r   r-   r
   r
   r   r2   a   r   z!build_engines.<locals>.<dictcomp>)r   r$   Z	availabler   r/   r6   r7   r0   )r   r,   Zbackend_namer-   Zexternal_backend_entrypointsr
   r
   r   build_enginesW   s    

r8   )maxsizec                  C   s   t  dd} t| S )Nzxarray.backendsr
   )r   r4   r8   )r   r
   r
   r   list_enginesd   s    r:   c              	   C   s   t  }| D ]F\}}z|| r,|W   S W q tyR   t|dt Y q0 qg }t D ]L\}}z| }|| r|| W qb ty   t|dt Y qb0 qbdd |D }|s|rd| d}qd}nd| d}t	|d S )	Nz fails while guessingc                 S   s   g | ]}|d kr|qS )storer
   )r   kr
   r
   r   r   }   r   z guess_engine.<locals>.<listcomp>zHdid not find a match in any of xarray's currently installed IO backends a  . Consider explicitly selecting one of the installed engines via the ``engine`` parameter, or installing additional IO dependencies, see:
http://xarray.pydata.org/en/stable/getting-started-guide/installing.html
http://xarray.pydata.org/en/stable/user-guide/io.htmla  xarray is unable to open this file because it has no currently installed IO backends. Xarray's read/write support requires installing optional IO dependencies, see:
http://xarray.pydata.org/en/stable/getting-started-guide/installing.html
http://xarray.pydata.org/en/stable/user-guide/iozIfound the following matches with the input file in xarray's IO backends: z. But their dependencies may not be installed, see:
http://xarray.pydata.org/en/stable/user-guide/io.html 
http://xarray.pydata.org/en/stable/getting-started-guide/installing.html)
r:   r$   Zguess_can_openr+   r   r   r   r   r   
ValueError)Z
store_specenginesenginer-   Zcompatible_enginesZbackend_clsZinstalled_enginesZ	error_msgr
   r
   r   guess_enginej   s:    


	r@   c                 C   sh   t | tr:t }| |vr0td|  dt| ||  }n*t | trVt| trV|  }ntd|  |S )z3Select open_dataset method based on current engine.zunrecognized engine z must be one of: zLengine must be a string or a subclass of xarray.backends.BackendEntrypoint: )	
isinstancestrr:   r=   r   type
issubclassr   r&   )r?   r>   r-   r
   r
   r   get_backend   s    

rE   )	functoolsr!   r   r   commonr   r   importlib.metadatar   ImportErrorZimportlib_metadatar3   r   r)   r/   r0   r7   r8   	lru_cacher:   r@   rE   r
   r
   r
   r   <module>   s&   

1