8
8
9
9
from .common import BACKEND_ENTRYPOINTS
10
10
11
+ STANDARD_BACKENDS_ORDER = ["netcdf4" , "h5netcdf" , "scipy" ]
11
12
12
- def remove_duplicates (backend_entrypoints ):
13
+
14
+ def remove_duplicates (pkg_entrypoints ):
13
15
14
16
# sort and group entrypoints by name
15
- backend_entrypoints = sorted (backend_entrypoints , key = lambda ep : ep .name )
16
- backend_entrypoints_grouped = itertools .groupby (
17
- backend_entrypoints , key = lambda ep : ep .name
18
- )
17
+ pkg_entrypoints = sorted (pkg_entrypoints , key = lambda ep : ep .name )
18
+ pkg_entrypoints_grouped = itertools .groupby (pkg_entrypoints , key = lambda ep : ep .name )
19
19
# check if there are multiple entrypoints for the same name
20
- unique_backend_entrypoints = []
21
- for name , matches in backend_entrypoints_grouped :
20
+ unique_pkg_entrypoints = []
21
+ for name , matches in pkg_entrypoints_grouped :
22
22
matches = list (matches )
23
- unique_backend_entrypoints .append (matches [0 ])
23
+ unique_pkg_entrypoints .append (matches [0 ])
24
24
matches_len = len (matches )
25
25
if matches_len > 1 :
26
26
selected_module_name = matches [0 ].module_name
@@ -30,7 +30,7 @@ def remove_duplicates(backend_entrypoints):
30
30
f"\n { all_module_names } .\n It will be used: { selected_module_name } ." ,
31
31
RuntimeWarning ,
32
32
)
33
- return unique_backend_entrypoints
33
+ return unique_pkg_entrypoints
34
34
35
35
36
36
def detect_parameters (open_dataset ):
@@ -51,13 +51,13 @@ def detect_parameters(open_dataset):
51
51
return tuple (parameters_list )
52
52
53
53
54
- def create_engines_dict ( backend_entrypoints ):
55
- engines = {}
56
- for backend_ep in backend_entrypoints :
57
- name = backend_ep .name
58
- backend = backend_ep .load ()
59
- engines [name ] = backend
60
- return engines
54
+ def backends_dict_from_pkg ( pkg_entrypoints ):
55
+ backend_entrypoints = {}
56
+ for pkg_ep in pkg_entrypoints :
57
+ name = pkg_ep .name
58
+ backend = pkg_ep .load ()
59
+ backend_entrypoints [name ] = backend
60
+ return backend_entrypoints
61
61
62
62
63
63
def set_missing_parameters (backend_entrypoints ):
@@ -67,11 +67,23 @@ def set_missing_parameters(backend_entrypoints):
67
67
backend .open_dataset_parameters = detect_parameters (open_dataset )
68
68
69
69
70
- def build_engines (entrypoints ):
70
+ def sort_backends (backend_entrypoints ):
71
+ ordered_backends_entrypoints = {}
72
+ for be_name in STANDARD_BACKENDS_ORDER :
73
+ if backend_entrypoints .get (be_name , None ) is not None :
74
+ ordered_backends_entrypoints [be_name ] = backend_entrypoints .pop (be_name )
75
+ ordered_backends_entrypoints .update (
76
+ {name : backend_entrypoints [name ] for name in sorted (backend_entrypoints )}
77
+ )
78
+ return ordered_backends_entrypoints
79
+
80
+
81
+ def build_engines (pkg_entrypoints ):
71
82
backend_entrypoints = BACKEND_ENTRYPOINTS .copy ()
72
- pkg_entrypoints = remove_duplicates (entrypoints )
73
- external_backend_entrypoints = create_engines_dict (pkg_entrypoints )
83
+ pkg_entrypoints = remove_duplicates (pkg_entrypoints )
84
+ external_backend_entrypoints = backends_dict_from_pkg (pkg_entrypoints )
74
85
backend_entrypoints .update (external_backend_entrypoints )
86
+ backend_entrypoints = sort_backends (backend_entrypoints )
75
87
set_missing_parameters (backend_entrypoints )
76
88
engines = {}
77
89
for name , backend in backend_entrypoints .items ():
@@ -81,8 +93,8 @@ def build_engines(entrypoints):
81
93
82
94
@functools .lru_cache (maxsize = 1 )
83
95
def list_engines ():
84
- entrypoints = pkg_resources .iter_entry_points ("xarray.backends" )
85
- return build_engines (entrypoints )
96
+ pkg_entrypoints = pkg_resources .iter_entry_points ("xarray.backends" )
97
+ return build_engines (pkg_entrypoints )
86
98
87
99
88
100
def guess_engine (store_spec ):
0 commit comments