Skip to content

Commit fdae924

Browse files
committed
#156 Add dataclasses for data specification
1 parent 4981c0c commit fdae924

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

xarray_dataclasses/specs.py

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
1+
__all__ = ["DataSpec", "DataOptions"]
2+
3+
14
# standard library
2-
from dataclasses import dataclass
3-
from typing import Any, Dict, Hashable, Optional, Type
5+
from dataclasses import dataclass, field
6+
from typing import Any, Dict, Generic, Hashable, Optional, Type, TypeVar
47

58

69
# dependencies
710
from typing_extensions import Literal, TypeAlias
811

912

1013
# submodules
11-
from .typing import Dims, DataClass, AnyDType
14+
from .typing import AnyDType, AnyXarray, DataClass, Dims
1215

1316

1417
# type hints
1518
AnySpec: TypeAlias = "ArraySpec | ScalarSpec"
19+
TReturn = TypeVar("TReturn", AnyXarray, None)
1620

1721

1822
# runtime classes
@@ -56,7 +60,7 @@ class ScalarSpec:
5660
"""Data type of the scalar."""
5761

5862

59-
class Specs(Dict[str, AnySpec]):
63+
class SpecDict(Dict[str, AnySpec]):
6064
"""Dictionary of any specifications."""
6165

6266
@property
@@ -78,3 +82,22 @@ def of_data(self) -> Dict[str, ArraySpec]:
7882
def of_name(self) -> Dict[str, ScalarSpec]:
7983
"""Limit to name specifications."""
8084
return {k: v for k, v in self.items() if v.role == "name"}
85+
86+
87+
@dataclass(frozen=True)
88+
class DataOptions(Generic[TReturn]):
89+
"""Options for xarray data creation."""
90+
91+
factory: Type[TReturn]
92+
"""Factory for xarray data creation."""
93+
94+
95+
@dataclass(frozen=True)
96+
class DataSpec:
97+
"""Data specification of an xarray dataclass."""
98+
99+
specs: SpecDict = field(default_factory=SpecDict)
100+
"""Dictionary of any specifications."""
101+
102+
options: DataOptions[Any] = DataOptions(type(None))
103+
"""Options for xarray data creation."""

xarray_dataclasses/typing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
AnyArray: TypeAlias = "np.ndarray[Any, Any]"
6565
AnyDType: TypeAlias = "np.dtype[Any]"
6666
AnyField: TypeAlias = "Field[Any]"
67-
AnyXarray = Union[xr.DataArray, xr.Dataset]
67+
AnyXarray: TypeAlias = "xr.DataArray | xr.Dataset"
6868
Dims = Tuple[str, ...]
6969
Order = Literal["C", "F"]
7070
Shape = Union[Sequence[int], int]

0 commit comments

Comments
 (0)