Skip to content

Commit 8f085cc

Browse files
committed
Check type hints in tests
1 parent c7712f0 commit 8f085cc

36 files changed

+872
-906
lines changed

Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
SHELL := /bin/bash
2+
13
LIB = mikeio
24

35
check: lint typecheck test
@@ -15,7 +17,7 @@ test:
1517
pytest
1618

1719
typecheck:
18-
mypy $(LIB)/
20+
mypy $(LIB)/ tests/test_{dataarray,dataset,generic,dfs0,dfs1,dfs2,dfs3,dfsu2dh}.py
1921

2022
coverage:
2123
pytest --cov-report html --cov=$(LIB) tests/

mikeio/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def read(
3434
filename: str | Path,
3535
*,
3636
items: str | int | Sequence[str | int] | None = None,
37-
time: int | str | slice | None = None,
37+
time: int | str | slice | Sequence[int] | None = None,
3838
keepdims: bool = False,
3939
**kwargs: Any,
4040
) -> Dataset:
@@ -126,6 +126,7 @@ def read(
126126
return dfs.read(items=items, time=time, keepdims=keepdims, **kwargs)
127127

128128

129+
# TODO Mesh doesn't comply with the interface of dfs files
129130
def open(
130131
filename: str | Path, **kwargs: Any
131132
) -> Dfs0 | Dfs1 | Dfs2 | Dfs3 | Dfsu2DH | Dfsu2DV | Dfsu3D | DfsuSpectral | Mesh:

mikeio/dataset/_dataarray.py

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
if TYPE_CHECKING:
3232
from ._dataset import Dataset
3333
import xarray
34+
from numpy.typing import ArrayLike
3435

3536

3637
from ..spatial import (
@@ -174,7 +175,7 @@ class DataArray:
174175

175176
def __init__(
176177
self,
177-
data: np.ndarray,
178+
data: ArrayLike,
178179
*,
179180
time: pd.DatetimeIndex | str | None = None,
180181
name: str | None = None,
@@ -186,8 +187,7 @@ def __init__(
186187
dims: Sequence[str] | None = None,
187188
dt: float = 1.0,
188189
) -> None:
189-
# TODO: add optional validation validate=True
190-
self._values = self._parse_data(data)
190+
self._values = np.asarray(data)
191191
self.time: pd.DatetimeIndex = self._parse_time(time)
192192
self._dt = dt
193193

@@ -202,15 +202,6 @@ def __init__(
202202
self._set_spectral_attributes(geometry)
203203
self.plot = self._get_plotter_by_geometry()
204204

205-
@staticmethod
206-
def _parse_data(data: Any) -> Any: # np.ndarray | float:
207-
if not hasattr(data, "shape"):
208-
try:
209-
data = np.array(data, dtype=float)
210-
except ValueError:
211-
raise ValueError("Data must be convertible to a numpy array")
212-
return data
213-
214205
def _parse_dims(
215206
self, dims: Sequence[str] | None, geometry: GeometryType
216207
) -> tuple[str, ...]:
@@ -1581,7 +1572,7 @@ def nanmin(self, axis: int | str = 0, **kwargs: Any) -> "DataArray":
15811572
"""
15821573
return self.aggregate(axis=axis, func=np.nanmin, **kwargs)
15831574

1584-
def nanmean(self, axis: int | str = 0, **kwargs: Any) -> "DataArray":
1575+
def nanmean(self, axis: int | str | None = 0, **kwargs: Any) -> "DataArray":
15851576
"""Mean value along an axis (NaN removed).
15861577
15871578
Parameters
@@ -1626,7 +1617,10 @@ def nanstd(self, axis: int | str = 0, **kwargs: Any) -> "DataArray":
16261617
return self.aggregate(axis=axis, func=np.nanstd, **kwargs)
16271618

16281619
def aggregate(
1629-
self, axis: int | str = 0, func: Callable[..., Any] = np.nanmean, **kwargs: Any
1620+
self,
1621+
axis: int | str | None = 0,
1622+
func: Callable[..., Any] = np.nanmean,
1623+
**kwargs: Any,
16301624
) -> "DataArray":
16311625
"""Aggregate along an axis.
16321626
@@ -2088,7 +2082,6 @@ def _time_by_agg_axis(
20882082

20892083
return time
20902084

2091-
20922085
@staticmethod
20932086
def _is_boolean_mask(x: Any) -> bool:
20942087
if hasattr(x, "dtype"): # isinstance(x, (np.ndarray, DataArray)):

mikeio/dataset/_dataset.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949

5050
from ._dataarray import IndexType
5151

52+
5253
def _to_safe_name(name: str) -> str:
5354
tmp = re.sub("[^0-9a-zA-Z]", "_", name)
5455
return re.sub("_+", "_", tmp) # Collapse multiple underscores
@@ -545,7 +546,10 @@ def squeeze(self) -> "Dataset":
545546
return Dataset(data=res, validate=False)
546547

547548
def create_data_array(
548-
self, data: NDArray[np.floating], item: ItemInfo | None = None
549+
self,
550+
data: NDArray[np.floating],
551+
item: ItemInfo | None = None,
552+
name: str | None = None,
549553
) -> DataArray:
550554
"""Create a new DataArray with the same time and geometry as the dataset.
551555
@@ -560,7 +564,12 @@ def create_data_array(
560564
561565
"""
562566
return DataArray(
563-
data=data, time=self.time, geometry=self.geometry, zn=self._zn, item=item
567+
data=data,
568+
time=self.time,
569+
geometry=self.geometry,
570+
zn=self._zn,
571+
item=item,
572+
name=name,
564573
)
565574

566575
# TODO: delete this?
@@ -715,6 +724,9 @@ def _del_name_attr(self, name: str) -> None:
715724
@overload
716725
def __getitem__(self, key: Hashable | int) -> DataArray: ...
717726

727+
@overload
728+
def __getitem__(self, key: slice) -> Dataset: ...
729+
718730
@overload
719731
def __getitem__(self, key: Iterable[Hashable]) -> "Dataset": ...
720732

@@ -1744,7 +1756,7 @@ def func(x, axis, keepdims): # type: ignore
17441756

17451757
return self.aggregate(axis=axis, func=func, **kwargs)
17461758

1747-
def nanmax(self, axis: int | str = 0, **kwargs: Any) -> "Dataset":
1759+
def nanmax(self, axis: int | str | None = 0, **kwargs: Any) -> "Dataset":
17481760
"""Max value along an axis (NaN removed).
17491761
17501762
Parameters
@@ -1766,7 +1778,7 @@ def nanmax(self, axis: int | str = 0, **kwargs: Any) -> "Dataset":
17661778
"""
17671779
return self.aggregate(axis=axis, func=np.nanmax, **kwargs)
17681780

1769-
def nanmin(self, axis: int | str = 0, **kwargs: Any) -> "Dataset":
1781+
def nanmin(self, axis: int | str | None = 0, **kwargs: Any) -> "Dataset":
17701782
"""Min value along an axis (NaN removed).
17711783
17721784
Parameters

mikeio/dfs/_dfs.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import annotations
22
from pathlib import Path
33
import warnings
4-
from abc import abstractmethod
54
from dataclasses import dataclass
65
from datetime import datetime
76
from typing import Any, Sequence
@@ -444,12 +443,6 @@ def is_geo(self) -> bool:
444443
"""Are coordinates geographical (LONG/LAT)?"""
445444
return self._projstr == "LONG/LAT"
446445

447-
@property
448-
@abstractmethod
449-
def shape(self) -> tuple[int, ...]:
450-
"""Shape of the data array."""
451-
pass
452-
453446
def _validate_no_orientation_in_geo(self) -> None:
454447
if self.is_geo and abs(self._orientation) > 1e-6:
455448
raise ValueError("Orientation is not supported for LONG/LAT coordinates")

mikeio/dfs/_dfs0.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ def _to_dfs_datatype(dtype: Any = None) -> DfsSimpleType:
253253
raise TypeError("Dfs files only support float or double")
254254

255255
def to_dataframe(
256-
self, unit_in_name: bool = False, round_time: str = "ms"
256+
self, unit_in_name: bool = False, round_time: str | bool = "ms"
257257
) -> pd.DataFrame:
258258
"""Read data from the dfs0 file and return a Pandas DataFrame.
259259
@@ -346,7 +346,7 @@ def time(self) -> pd.DatetimeIndex:
346346
@staticmethod
347347
def from_dataframe(
348348
df: pd.DataFrame,
349-
filename: str,
349+
filename: str | Path,
350350
itemtype: EUMType | None = None,
351351
unit: EUMUnit | None = None,
352352
items: Sequence[ItemInfo] | None = None,
@@ -369,7 +369,7 @@ def series_to_dfs0(
369369

370370
def dataframe_to_dfs0(
371371
self: pd.DataFrame,
372-
filename: str,
372+
filename: str | Path,
373373
itemtype: EUMType | None = None,
374374
unit: EUMUnit | None = None,
375375
items: Sequence[ItemInfo] | None = None,

mikeio/dfsu/_dfsu.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,9 @@ def read(
298298
items: str | int | Sequence[str | int] | None = None,
299299
time: int | str | slice | Sequence[int] | None = None,
300300
elements: Sequence[int] | np.ndarray | None = None,
301-
area: tuple[float, float, float, float] | None = None,
301+
area: tuple[float, float, float, float]
302+
| Sequence[tuple[float, float]]
303+
| None = None,
302304
x: float | Sequence[float] | None = None,
303305
y: float | Sequence[float] | None = None,
304306
keepdims: bool = False,

mikeio/eum/_eum.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1440,8 +1440,8 @@ class ItemInfo:
14401440
def __init__(
14411441
self,
14421442
name: str | EUMType | None = None,
1443-
itemtype: EUMType | EUMUnit | None = None,
1444-
unit: EUMUnit | None = None,
1443+
itemtype: EUMType | EUMUnit | int | None = None,
1444+
unit: EUMUnit | int | None = None,
14451445
data_value_type: Literal[
14461446
"Instantaneous", "Accumulated", "StepAccumulated", "MeanStepBackward"
14471447
] = "Instantaneous",

mikeio/generic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -823,7 +823,7 @@ def quantile(
823823
outfilename: str | pathlib.Path,
824824
q: float | Sequence[float],
825825
*,
826-
items: Sequence[int | str] | None = None,
826+
items: Sequence[int | str] | int | str | None = None,
827827
skipna: bool = True,
828828
buffer_size: float = 1.0e9,
829829
) -> None:

mikeio/spatial/_grid_geometry.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
if TYPE_CHECKING:
2222
from matplotlib.axes import Axes
2323
from ..spatial import GeometryFM2D
24+
from numpy.typing import ArrayLike
2425

2526

2627
def _check_equidistant(x: np.ndarray) -> None:
@@ -116,7 +117,7 @@ class Grid1D(_Geometry):
116117

117118
def __init__(
118119
self,
119-
x: np.ndarray | None = None,
120+
x: ArrayLike | None = None,
120121
*,
121122
x0: float = 0.0,
122123
dx: float | None = None,
@@ -465,11 +466,11 @@ class Grid2D(_Geometry):
465466
def __init__(
466467
self,
467468
*,
468-
x: np.ndarray | None = None,
469+
x: ArrayLike | None = None,
469470
x0: float = 0.0,
470471
dx: float | None = None,
471472
nx: int | None = None,
472-
y: np.ndarray | None = None,
473+
y: ArrayLike | None = None,
473474
y0: float = 0.0,
474475
dy: float | None = None,
475476
ny: int | None = None,

0 commit comments

Comments
 (0)