|
80 | 80 |
|
81 | 81 | """ |
82 | 82 |
|
83 | | -__Conventions__ = "CF-1.11" |
84 | 83 | __date__ = "2025-01-28" |
85 | 84 | __version__ = "3.16.3" |
86 | 85 |
|
|
95 | 94 | "packaging", |
96 | 95 | "scipy", |
97 | 96 | ) |
98 | | - |
99 | 97 | x = ", ".join(_requires) |
100 | 98 | _error0 = f"cf v{__version__} requires the modules {x}. " |
101 | 99 |
|
| 100 | +import importlib.util |
| 101 | +from platform import python_version |
| 102 | + |
| 103 | +_found_esmpy = bool(importlib.util.find_spec("esmpy")) |
| 104 | + |
102 | 105 | try: |
103 | | - import cfdm |
| 106 | + import packaging |
| 107 | + from packaging.version import Version |
104 | 108 | except ImportError as error1: |
105 | 109 | raise ImportError(_error0 + str(error1)) |
| 110 | +else: |
| 111 | + _minimum_vn = "20.0" |
| 112 | + if Version(packaging.__version__) < Version(_minimum_vn): |
| 113 | + raise RuntimeError( |
| 114 | + f"Bad packaging version: cf requires packaging>={_minimum_vn}. " |
| 115 | + f"Got {packaging.__version__} at {packaging.__file__}" |
| 116 | + ) |
106 | 117 |
|
107 | | -__cf_version__ = cfdm.core.__cf_version__ |
108 | | - |
109 | | -from packaging.version import Version |
110 | | -import importlib.util |
111 | | -import platform |
112 | | - |
113 | | -# ESMF renamed its Python module to `esmpy` at ESMF version 8.4.0. Allow |
114 | | -# either for now for backwards compatibility. |
115 | | -_found_esmpy = bool( |
116 | | - importlib.util.find_spec("esmpy") or importlib.util.find_spec("ESMF") |
117 | | -) |
| 118 | +try: |
| 119 | + import cfdm |
| 120 | +except ImportError as error1: |
| 121 | + raise ImportError(_error0 + str(error1)) |
| 122 | +else: |
| 123 | + # Check the version of cfdm |
| 124 | + _minimum_vn = "1.12.0.0" |
| 125 | + _maximum_vn = "1.12.1.0" |
| 126 | + _cfdm_version = Version(cfdm.__version__) |
| 127 | + if ( |
| 128 | + _cfdm_version < Version(_minimum_vn) or |
| 129 | + _cfdm_version >= Version(_maximum_vn) |
| 130 | + ): |
| 131 | + raise RuntimeError( |
| 132 | + "Bad cfdm version: cf requires " |
| 133 | + f"{_minimum_vn}<=cfdm<{_maximum_vn}. " |
| 134 | + f"Got {cfdm.__version__} at {cfdm.__file__}" |
| 135 | + ) |
| 136 | + |
| 137 | +__cf_version__ = cfdm.__cf_version__ |
| 138 | +__Conventions__ = f"CF-{__cf_version__}" |
118 | 139 |
|
119 | 140 | try: |
120 | 141 | import netCDF4 |
121 | 142 | except ImportError as error1: |
122 | 143 | raise ImportError(_error0 + str(error1)) |
| 144 | +else: |
| 145 | + _minimum_vn = "1.7.2" |
| 146 | + if Version(netCDF4.__version__) < Version(_minimum_vn): |
| 147 | + raise RuntimeError( |
| 148 | + f"Bad netCDF4 version: cf requires netCDF4>={_minimum_vn}. " |
| 149 | + f"Got {netCDF4.__version__} at {netCDF4.__file__}" |
| 150 | + ) |
123 | 151 |
|
124 | 152 | try: |
125 | 153 | import numpy as np |
126 | 154 | except ImportError as error1: |
127 | 155 | raise ImportError(_error0 + str(error1)) |
| 156 | +else: |
| 157 | + _minimum_vn = "2.0.0" |
| 158 | + if Version(np.__version__) < Version(_minimum_vn): |
| 159 | + raise ValueError( |
| 160 | + f"Bad numpy version: cf requires numpy>={_minimum_vn} " |
| 161 | + f"Got {np.__version__} at {np.__file__}" |
| 162 | + ) |
128 | 163 |
|
129 | 164 | try: |
130 | 165 | import cftime |
131 | 166 | except ImportError as error1: |
132 | 167 | raise ImportError(_error0 + str(error1)) |
| 168 | +else: |
| 169 | + _minimum_vn = "1.6.4" |
| 170 | + if Version(cftime.__version__) < Version(_minimum_vn): |
| 171 | + raise RuntimeError( |
| 172 | + f"Bad cftime version: cf requires cftime>={_minimum_vn}. " |
| 173 | + f"Got {cftime.__version__} at {cftime.__file__}" |
| 174 | + ) |
133 | 175 |
|
134 | 176 | try: |
135 | 177 | import cfunits |
136 | 178 | except ImportError as error1: |
137 | 179 | raise ImportError(_error0 + str(error1)) |
| 180 | +else: |
| 181 | + _minimum_vn = "3.3.7" |
| 182 | + if Version(cfunits.__version__) < Version(_minimum_vn): |
| 183 | + raise RuntimeError( |
| 184 | + f"Bad cfunits version: cf requires cfunits>={_minimum_vn}. " |
| 185 | + f"Got {cfunits.__version__} at {cfunits.__file__}" |
| 186 | + ) |
138 | 187 |
|
139 | 188 | try: |
140 | 189 | import psutil |
141 | 190 | except ImportError as error1: |
142 | 191 | raise ImportError(_error0 + str(error1)) |
| 192 | +else: |
| 193 | + _minimum_vn = "0.6.0" |
| 194 | + if Version(psutil.__version__) < Version(_minimum_vn): |
| 195 | + raise RuntimeError( |
| 196 | + f"Bad psutil version: cf requires psutil>={_minimum_vn}. " |
| 197 | + f"Got {psutil.__version__} at {psutil.__file__}" |
| 198 | + ) |
143 | 199 |
|
144 | 200 | try: |
145 | 201 | import dask |
146 | 202 | except ImportError as error1: |
147 | 203 | raise ImportError(_error0 + str(error1)) |
148 | | - |
149 | | -try: |
150 | | - import packaging |
151 | | -except ImportError as error1: |
152 | | - raise ImportError(_error0 + str(error1)) |
| 204 | +else: |
| 205 | + _minimum_vn = "2024.6.1" |
| 206 | + _maximum_vn = "2024.7.1" |
| 207 | + if ( |
| 208 | + Version(dask.__version__) < Version(_minimum_vn) or |
| 209 | + Version(dask.__version__) > Version(_maximum_vn) |
| 210 | + ): |
| 211 | + raise ValueError( |
| 212 | + "Bad dask version: cf requires " |
| 213 | + f"{_minimum_vn}<=dask<={_maximum_vn}. " |
| 214 | + f"Got {dask.__version__} at {dask.__file__}" |
| 215 | + ) |
153 | 216 |
|
154 | 217 | try: |
155 | 218 | import scipy |
156 | 219 | except ImportError as error1: |
157 | 220 | raise ImportError(_error0 + str(error1)) |
158 | | - |
159 | | -# Check the version of packaging |
160 | | -_minimum_vn = "20.0" |
161 | | -if Version(packaging.__version__) < Version(_minimum_vn): |
162 | | - raise RuntimeError( |
163 | | - f"Bad packaging version: cf requires packaging>={_minimum_vn}. " |
164 | | - f"Got {packaging.__version__} at {packaging.__file__}" |
165 | | - ) |
166 | | - |
167 | | -# Check the version of psutil |
168 | | -_minimum_vn = "0.6.0" |
169 | | -if Version(psutil.__version__) < Version(_minimum_vn): |
170 | | - raise RuntimeError( |
171 | | - f"Bad psutil version: cf requires psutil>={_minimum_vn}. " |
172 | | - f"Got {psutil.__version__} at {psutil.__file__}" |
173 | | - ) |
174 | | - |
175 | | -# Check the version of netCDF4 |
176 | | -_minimum_vn = "1.6.5" |
177 | | -if Version(netCDF4.__version__) < Version(_minimum_vn): |
178 | | - raise RuntimeError( |
179 | | - f"Bad netCDF4 version: cf requires netCDF4>={_minimum_vn}. " |
180 | | - f"Got {netCDF4.__version__} at {netCDF4.__file__}" |
181 | | - ) |
182 | | - |
183 | | -# Check the version of cftime |
184 | | -_minimum_vn = "1.6.2" |
185 | | -if Version(cftime.__version__) < Version(_minimum_vn): |
186 | | - raise RuntimeError( |
187 | | - f"Bad cftime version: cf requires cftime>={_minimum_vn}. " |
188 | | - f"Got {cftime.__version__} at {cftime.__file__}" |
189 | | - ) |
190 | | - |
191 | | -# Check the version of numpy |
192 | | -_minimum_vn = "1.22" |
193 | | -_maximum_vn = "2.0" |
194 | | -if not Version(_minimum_vn) <= Version(np.__version__) < Version(_maximum_vn): |
195 | | - raise ValueError( |
196 | | - "Bad numpy version: cf requires _minimum_vn}<=numpy<{_maximum_vn}. " |
197 | | - f"Got {np.__version__} at {np.__file__}" |
198 | | - ) |
199 | | - |
200 | | -# Check the version of cfunits |
201 | | -_minimum_vn = "3.3.7" |
202 | | -if Version(cfunits.__version__) < Version(_minimum_vn): |
203 | | - raise RuntimeError( |
204 | | - f"Bad cfunits version: cf requires cfunits>={_minimum_vn}. " |
205 | | - f"Got {cfunits.__version__} at {cfunits.__file__}" |
206 | | - ) |
207 | | - |
208 | | -# Check the version of cfdm |
209 | | -_minimum_vn = "1.12.0.0" |
210 | | -_maximum_vn = "1.12.1.0" |
211 | | -_cfdm_version = Version(cfdm.__version__) |
212 | | -if not Version(_minimum_vn) <= _cfdm_version < Version(_maximum_vn): |
213 | | - raise RuntimeError( |
214 | | - f"Bad cfdm version: cf requires {_minimum_vn}<=cfdm<{_maximum_vn}. " |
215 | | - f"Got {cfdm.__version__} at {cfdm.__file__}" |
216 | | - ) |
217 | | - |
218 | | -# Check the version of dask |
219 | | - |
220 | | -_minimum_vn = "2024.6.1" |
221 | | -_maximum_vn = "2024.7.1" |
222 | | -if ( |
223 | | - not Version(_minimum_vn) |
224 | | - <= Version(dask.__version__) |
225 | | - <= Version(_maximum_vn) |
226 | | -): |
| 221 | +else: |
| 222 | + _minimum_vn = "1.10.0" |
| 223 | + if Version(scipy.__version__) < Version(_minimum_vn): |
| 224 | + raise RuntimeError( |
| 225 | + f"Bad scipy version: cf requires scipy>={_minimum_vn}. " |
| 226 | + f"Got {scipy.__version__} at {scipy.__file__}" |
| 227 | + ) |
| 228 | + |
| 229 | +_minimum_vn = "3.9.0" |
| 230 | +if Version(python_version()) < Version(_minimum_vn): |
227 | 231 | raise ValueError( |
228 | | - "Bad dask version: cf requires {_minimum_vn}<=dask<={_maximum_vn}. " |
229 | | - f"Got {dask.__version__} at {dask.__file__}" |
230 | | - ) |
231 | | - |
232 | | -# Check the version of Python |
233 | | -_minimum_vn = "3.8.0" |
234 | | -if Version(platform.python_version()) < Version(_minimum_vn): |
235 | | - raise ValueError( |
236 | | - f"Bad python version: cf requires python version {_minimum_vn} " |
237 | | - f"or later. Got {platform.python_version()}" |
238 | | - ) |
239 | | - |
240 | | -# Check the version of scipy |
241 | | -_minimum_vn = "1.10.0" |
242 | | -if Version(scipy.__version__) < Version(_minimum_vn): |
243 | | - raise RuntimeError( |
244 | | - f"Bad scipy version: cf requires scipy>={_minimum_vn}. " |
245 | | - f"Got {scipy.__version__} at {scipy.__file__}" |
| 232 | + f"Bad python version: cf requires python>={_minimum_vn}. " |
| 233 | + f"Got {python_version()}" |
246 | 234 | ) |
247 | 235 |
|
248 | 236 | del _minimum_vn, _maximum_vn |
|
0 commit comments