
    d                    `   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZmZ d dlmZmZ d dlmZ e
r0d dlZd dlmZ ej        dk    rd d	lmZ nee         Zd d
lmZ d dlmZ 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             Z"d0d!Z#d1d%Z$d2d(Z%dS )3    )annotationsN)entry_points)TYPE_CHECKINGAnyCallable)BACKEND_ENTRYPOINTSBackendEntrypoint)module_available)
EntryPoint   
   )EntryPoints)BufferedIOBase)AbstractDataStore)netcdf4h5netcdfscipyentrypointsr   returnlist[EntryPoint]c                z   t          | d           }t          j        |d           }g }|D ]\  }}t          t	          |                    }|                    |d                    t          |          }|dk    r;d |D             }|d         }	t          j        d| d| d	| d
|	 d	t                     |S )Nc                    | j         S Nnameeps    7lib/python3.11/site-packages/xarray/backends/plugins.py<lambda>z#remove_duplicates.<locals>.<lambda>   s    BG     )keyc                    | j         S r   r   r   s    r   r    z#remove_duplicates.<locals>.<lambda>    s    rw r!   r      c                N    g | ]"}|j                             d           d         #S ):r   )valuesplit).0es     r   
<listcomp>z%remove_duplicates.<locals>.<listcomp>)   s+    GGG!c 2 21 5GGGr!   zFound z! entrypoints for the engine name z:
 z.
 The entrypoint z will be used.)
sorted	itertoolsgroupbylistsetappendlenwarningswarnRuntimeWarning)
r   entrypoints_sortedentrypoints_groupedunique_entrypointsr   _matchesmatchesmatches_lenall_module_namesselected_module_names
             r   remove_duplicatesr>      s   1C1CDDD#+,>DVDVWWW-  hs8}}%%!!'!*---'ll??GGwGGG#3A#6 MG G Gt G G&G G"6G G G 	   r!   open_datasetr   tuple[str, ...]c                <   t          j        |           }|j        }g }|                                D ]\\  }}|j        t           j        j        t           j        j        fv rt          d| d          |dk    r|	                    |           ]t          |          S )NzAll the parameters in zB signature should be explicit. *args and **kwargs is not supportedself)inspect	signature
parametersitemskind	ParameterVAR_KEYWORDVAR_POSITIONAL	TypeErrorr1   tuple)r?   rD   rE   parameters_listr   params         r   detect_parametersrO   4   s    !,//I%JO!'')) 
) 
)e:),
 
 
 6 6 6 6   6>>""4(((!!!r!   "dict[str, type[BackendEntrypoint]]c                    i }| D ]Z}|j         }	 |                                }|||<   $# t          $ r*}t          j        d|d| t
                     Y d }~Sd }~ww xY w|S )NzEngine z loading failed:
)r   load	Exceptionr3   r4   r5   )r   backend_entrypoints
entrypointr   backendexs         r   backends_dict_from_pkgrX   F   s     ! T T
	T oo''G(/%% 	T 	T 	TMBDBBbBBNSSSSSSSS	Ts   )
A AArT   Nonec                ~    |                                  D ]'\  }}|j        |j        }t          |          |_        (d S r   )rF   open_dataset_parametersr?   rO   )rT   _rV   r?   s       r   set_missing_parametersr]   T   sS     *//11 N N
7*2"/L.?.M.MG+N Nr!   c                     i }t           D ]0}                     |d                                |          ||<   1|                     fdt	                     D                        |S )Nc                "    i | ]}||         S  r`   )r)   r   rT   s     r   
<dictcomp>z!sort_backends.<locals>.<dictcomp>e   s!    QQQT"4(QQQr!   )STANDARD_BACKENDS_ORDERgetpopupdater,   )rT   ordered_backends_entrypointsbe_names   `  r   sort_backendsrh   ]   s     $& * U U""7D11=4G4K4KG4T4T(1 ''QQQQV<O5P5PQQQ   ('r!   dict[str, BackendEntrypoint]c                H   i }t          j                    D ]\  }\  }}|t          |          r|||<   t          |           }t	          |          }|                    |           t          |          }t          |           d |                                D             S )Nc                *    i | ]\  }}| |            S r`   r`   )r)   r   rV   s      r   ra   z!build_engines.<locals>.<dictcomp>t   s$    MMMgD''))MMMr!   )r   rF   r
   r>   rX   re   rh   r]   )r   rT   backend_namemodule_namerV   entrypoints_uniqueexternal_backend_entrypointss          r   build_enginesrp   j   s    >@0C0I0K0K 8 8,,{G"2;"?"?07-*;77#9:L#M#M ;<<<'(;<<.///MM1D1J1J1L1LMMMMr!   r$   )maxsizec                     t           j        dk    rt          d          } n"t                                          dg           } t	          |           S )a  
    Return a dictionary of available engines and their BackendEntrypoint objects.

    Returns
    -------
    dictionary

    Notes
    -----
    This function lives in the backends namespace (``engs=xr.backends.list_engines()``).
    If available, more information is available about each backend via ``engs["eng_name"]``.

    # New selection mechanism introduced with Python 3.10. See GH6514.
    r   zxarray.backends)group)sysversion_infor   rc   rp   )r   s    r   list_enginesrv   w   sM      7"""):;;;"nn(():B??%%%r!   c                 8    t                                            dS )z:Refreshes the backend engines based on installed packages.N)rv   cache_clearr`   r!   r   refresh_enginesry      s    r!   
store_spec;str | os.PathLike[Any] | BufferedIOBase | AbstractDataStorestr | type[BackendEntrypoint]c                R   t                      }|                                D ]V\  }}	 |                    |           r|c S  # t          $ r  t          $ r  t          j        |dt                     Y Sw xY wg }t          j                    D ]j\  }\  }}	  |            }|                    |           r|	                    |           ># t          $ r  t          j        |dt                     Y gw xY wd |D             }|s|rd| d}n	d}nd| d}t          |          )Nz fails while guessingc                    g | ]
}|d k    |S )storer`   )r)   ks     r   r+   z guess_engine.<locals>.<listcomp>   s    <<<qqG|||||r!   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:
https://docs.xarray.dev/en/stable/getting-started-guide/installing.html
https://docs.xarray.dev/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:
https://docs.xarray.dev/en/stable/getting-started-guide/installing.html
https://docs.xarray.dev/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:
https://docs.xarray.dev/en/stable/user-guide/io.html 
https://docs.xarray.dev/en/stable/getting-started-guide/installing.html)rv   rF   guess_can_openPermissionErrorrS   r3   r4   r5   r   r1   
ValueError)	rz   enginesenginerV   compatible_enginesr\   backend_clsinstalled_engines	error_msgs	            r   guess_enginer      s    nnG"==?? N N	N%%j11  	 	 	 	N 	N 	NMV<<<nMMMMM	N $7$=$?$? N N  K	N!kmmG%%j11 2"))&111 	N 	N 	NMV<<<nMMMMM	N =<G<<< 
 	G-G G G IB IV+V V V 	 Y

s#   A1A76A74C'C76C7r   r	   c                8   t          | t                    r=t                      }| |vr"t          d|  dt	          |                     ||          }nGt          | t
                    r t          | t                    r |             }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strrv   r   r/   type
issubclassr	   rK   )r   r   rV   s      r   get_backendr      s    &# 
..  OvOOWOO   &/	FD	!	! 
j9J&K&K 
&((;28; ;
 
 	

 Nr!   )r   r   r   r   )r?   r   r   r@   )r   r   r   rP   )rT   rP   r   rY   )rT   rP   r   rP   )r   r   r   ri   )r   ri   )r   rY   )rz   r{   r   r|   )r   r|   r   r	   )&
__future__r   	functoolsrC   r-   rt   r3   importlib.metadatar   typingr   r   r   xarray.backends.commonr   r	   xarray.core.utilsr
   osr   ru   r   r/   ior   r   rb   r>   rO   rX   r]   rh   rp   	lru_cacherv   ry   r   r   r`   r!   r   <module>r      s   " " " " " "          



  + + + + + + / / / / / / / / / / I I I I I I I I . . . . . . 
9III------
7""2222222:&!!!!!!888888:::    ." " " "$   N N N N
( 
( 
( 
(
N 
N 
N 
N Q& & &  &,   
2  2  2  2 j     r!   