33import itertools
44import warnings
55
6- import pkg_resources
7-
86from .common import BACKEND_ENTRYPOINTS , BackendEntrypoint
97
10- STANDARD_BACKENDS_ORDER = ["netcdf4" , "h5netcdf" , "scipy" ]
8+ try :
9+ from importlib .metadata import Distribution
10+ except ImportError :
11+ # if the fallback library is missing, we are doomed.
12+ from importlib_metadata import Distribution # type: ignore[no-redef]
1113
1214
13- def remove_duplicates ( pkg_entrypoints ):
15+ STANDARD_BACKENDS_ORDER = [ "netcdf4" , "h5netcdf" , "scipy" ]
1416
17+
18+ def remove_duplicates (entrypoints ):
1519 # sort and group entrypoints by name
16- pkg_entrypoints = sorted (pkg_entrypoints , key = lambda ep : ep .name )
17- pkg_entrypoints_grouped = itertools .groupby (pkg_entrypoints , key = lambda ep : ep .name )
20+ entrypoints = sorted (entrypoints , key = lambda ep : ep .name )
21+ entrypoints_grouped = itertools .groupby (entrypoints , key = lambda ep : ep .name )
1822 # check if there are multiple entrypoints for the same name
19- unique_pkg_entrypoints = []
20- for name , matches in pkg_entrypoints_grouped :
23+ unique_entrypoints = []
24+ for name , matches in entrypoints_grouped :
2125 matches = list (matches )
22- unique_pkg_entrypoints .append (matches [0 ])
26+ unique_entrypoints .append (matches [0 ])
2327 matches_len = len (matches )
2428 if matches_len > 1 :
2529 selected_module_name = matches [0 ].module_name
@@ -29,7 +33,7 @@ def remove_duplicates(pkg_entrypoints):
2933 f"\n { all_module_names } .\n It will be used: { selected_module_name } ." ,
3034 RuntimeWarning ,
3135 )
32- return unique_pkg_entrypoints
36+ return unique_entrypoints
3337
3438
3539def detect_parameters (open_dataset ):
@@ -50,12 +54,12 @@ def detect_parameters(open_dataset):
5054 return tuple (parameters_list )
5155
5256
53- def backends_dict_from_pkg (pkg_entrypoints ):
57+ def backends_dict_from_pkg (entrypoints ):
5458 backend_entrypoints = {}
55- for pkg_ep in pkg_entrypoints :
56- name = pkg_ep .name
59+ for entrypoint in entrypoints :
60+ name = entrypoint .name
5761 try :
58- backend = pkg_ep .load ()
62+ backend = entrypoint .load ()
5963 backend_entrypoints [name ] = backend
6064 except Exception as ex :
6165 warnings .warn (f"Engine { name !r} loading failed:\n { ex } " , RuntimeWarning )
@@ -80,13 +84,13 @@ def sort_backends(backend_entrypoints):
8084 return ordered_backends_entrypoints
8185
8286
83- def build_engines (pkg_entrypoints ):
87+ def build_engines (entrypoints ):
8488 backend_entrypoints = {}
8589 for backend_name , backend in BACKEND_ENTRYPOINTS .items ():
8690 if backend .available :
8791 backend_entrypoints [backend_name ] = backend
88- pkg_entrypoints = remove_duplicates (pkg_entrypoints )
89- external_backend_entrypoints = backends_dict_from_pkg (pkg_entrypoints )
92+ entrypoints = remove_duplicates (entrypoints )
93+ external_backend_entrypoints = backends_dict_from_pkg (entrypoints )
9094 backend_entrypoints .update (external_backend_entrypoints )
9195 backend_entrypoints = sort_backends (backend_entrypoints )
9296 set_missing_parameters (backend_entrypoints )
@@ -95,8 +99,12 @@ def build_engines(pkg_entrypoints):
9599
96100@functools .lru_cache (maxsize = 1 )
97101def list_engines ():
98- pkg_entrypoints = pkg_resources .iter_entry_points ("xarray.backends" )
99- return build_engines (pkg_entrypoints )
102+ entrypoints = (
103+ entry_point
104+ for entry_point in Distribution .from_name ("xarray" ).entry_points
105+ if entry_point .module == "xarray.backends"
106+ )
107+ return build_engines (entrypoints )
100108
101109
102110def guess_engine (store_spec ):
0 commit comments