3
3
import itertools
4
4
import warnings
5
5
6
- import pkg_resources
7
-
8
6
from .common import BACKEND_ENTRYPOINTS , BackendEntrypoint
9
7
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]
11
13
12
14
13
- def remove_duplicates ( pkg_entrypoints ):
15
+ STANDARD_BACKENDS_ORDER = [ "netcdf4" , "h5netcdf" , "scipy" ]
14
16
17
+
18
+ def remove_duplicates (entrypoints ):
15
19
# 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 )
18
22
# 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 :
21
25
matches = list (matches )
22
- unique_pkg_entrypoints .append (matches [0 ])
26
+ unique_entrypoints .append (matches [0 ])
23
27
matches_len = len (matches )
24
28
if matches_len > 1 :
25
29
selected_module_name = matches [0 ].module_name
@@ -29,7 +33,7 @@ def remove_duplicates(pkg_entrypoints):
29
33
f"\n { all_module_names } .\n It will be used: { selected_module_name } ." ,
30
34
RuntimeWarning ,
31
35
)
32
- return unique_pkg_entrypoints
36
+ return unique_entrypoints
33
37
34
38
35
39
def detect_parameters (open_dataset ):
@@ -50,12 +54,12 @@ def detect_parameters(open_dataset):
50
54
return tuple (parameters_list )
51
55
52
56
53
- def backends_dict_from_pkg (pkg_entrypoints ):
57
+ def backends_dict_from_pkg (entrypoints ):
54
58
backend_entrypoints = {}
55
- for pkg_ep in pkg_entrypoints :
56
- name = pkg_ep .name
59
+ for entrypoint in entrypoints :
60
+ name = entrypoint .name
57
61
try :
58
- backend = pkg_ep .load ()
62
+ backend = entrypoint .load ()
59
63
backend_entrypoints [name ] = backend
60
64
except Exception as ex :
61
65
warnings .warn (f"Engine { name !r} loading failed:\n { ex } " , RuntimeWarning )
@@ -80,13 +84,13 @@ def sort_backends(backend_entrypoints):
80
84
return ordered_backends_entrypoints
81
85
82
86
83
- def build_engines (pkg_entrypoints ):
87
+ def build_engines (entrypoints ):
84
88
backend_entrypoints = {}
85
89
for backend_name , backend in BACKEND_ENTRYPOINTS .items ():
86
90
if backend .available :
87
91
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 )
90
94
backend_entrypoints .update (external_backend_entrypoints )
91
95
backend_entrypoints = sort_backends (backend_entrypoints )
92
96
set_missing_parameters (backend_entrypoints )
@@ -95,8 +99,12 @@ def build_engines(pkg_entrypoints):
95
99
96
100
@functools .lru_cache (maxsize = 1 )
97
101
def 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 )
100
108
101
109
102
110
def guess_engine (store_spec ):
0 commit comments