Skip to content

Commit 04b510b

Browse files
authored
#7 Merge pull request from astropenguin/astropenguin/issue5
Add operator module
2 parents 5967833 + 5376ff2 commit 04b510b

File tree

12 files changed

+524
-132
lines changed

12 files changed

+524
-132
lines changed

CITATION.cff

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ message: "If you use this software, please cite it as below."
33

44
title: "xarray-units"
55
abstract: "xarray extension for handling units"
6-
version: 0.1.0
7-
date-released: 2023-12-11
6+
version: 0.2.0
7+
date-released: 2023-12-18
88
license: "MIT"
9-
doi: ""
9+
doi: "10.5281/zenodo.10354517"
1010
url: "https://github.com/astropenguin/xarray-units/"
1111
authors:
1212
- given-names: "Akio"

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,15 @@
11
# xarray-units
2+
3+
[![Release](https://img.shields.io/pypi/v/xarray-units?label=Release&color=cornflowerblue&style=flat-square)](https://pypi.org/project/xarray-units/)
4+
[![Python](https://img.shields.io/pypi/pyversions/xarray-units?label=Python&color=cornflowerblue&style=flat-square)](https://pypi.org/project/xarray-units/)
5+
[![Downloads](https://img.shields.io/pypi/dm/xarray-units?label=Downloads&color=cornflowerblue&style=flat-square)](https://pepy.tech/project/xarray-units)
6+
[![DOI](https://img.shields.io/badge/DOI-10.5281/zenodo.10354517-cornflowerblue?style=flat-square)](https://doi.org/10.5281/zenodo.10354517)
7+
[![Tests](https://img.shields.io/github/actions/workflow/status/astropenguin/xarray-units/tests.yaml?label=Tests&style=flat-square)](https://github.com/astropenguin/xarray-units/actions)
8+
29
xarray extension for handling units
10+
11+
## Installation
12+
13+
```shell
14+
pip install xarray-units==0.2.0
15+
```

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "xarray-units"
3-
version = "0.1.0"
3+
version = "0.2.0"
44
description = "xarray extension for handling units"
55
authors = ["Akio Taniguchi <taniguchi@a.phys.nagoya-u.ac.jp>"]
66
documentation = "https://astropenguin.github.io/xarray-units/"

tests/test_operator.py

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
# standard library
2+
from typing import Any
3+
4+
5+
# dependencies
6+
from astropy.units import Quantity
7+
from pytest import mark, raises
8+
from xarray import DataArray
9+
from xarray.testing import assert_identical # type: ignore
10+
from xarray_units import operator as opr
11+
from xarray_units.operator import Operator, take
12+
from xarray_units.quantity import set
13+
from xarray_units.utils import UnitsApplicationError
14+
15+
16+
# test data
17+
km = set(DataArray([1, 2, 3]), "km")
18+
mm = set(DataArray([1, 2, 3]) * 1e6, "mm")
19+
sc_1 = 2
20+
sc_2 = Quantity(2000, "m")
21+
22+
23+
data_take: list[tuple[DataArray, Operator, Any, Any]] = [
24+
(km, "mul", sc_1, set(DataArray([2, 4, 6]), "km")),
25+
(km, "mul", sc_2, set(DataArray([2, 4, 6]) * 1e3, "km m")),
26+
(km, "mul", mm, set(DataArray([1, 4, 9]) * 1e6, "km mm")),
27+
(mm, "mul", km, set(DataArray([1, 4, 9]) * 1e6, "km mm")),
28+
#
29+
(km, "pow", sc_1, set(DataArray([1, 4, 9]), "km2")),
30+
(km, "pow", sc_2, UnitsApplicationError),
31+
(km, "pow", mm, UnitsApplicationError),
32+
(mm, "pow", km, UnitsApplicationError),
33+
#
34+
(km, "matmul", sc_1, UnitsApplicationError),
35+
(km, "matmul", sc_2, UnitsApplicationError),
36+
(km, "matmul", mm, set(DataArray(14) * 1e6, "km mm")),
37+
(mm, "matmul", km, set(DataArray(14) * 1e6, "km mm")),
38+
#
39+
(km, "truediv", sc_1, set(DataArray([0.5, 1, 1.5]), "km")),
40+
(km, "truediv", sc_2, set(DataArray([0.5, 1.0, 1.5]) * 1e-3, "km m-1")),
41+
(km, "truediv", mm, set(DataArray([1, 1, 1]) * 1e-6, "km mm-1")),
42+
(mm, "truediv", km, set(DataArray([1, 1, 1]) * 1e6, "mm km-1")),
43+
#
44+
(km, "add", sc_1, UnitsApplicationError),
45+
(km, "add", sc_2, set(DataArray([3, 4, 5]), "km")),
46+
(km, "add", mm, set(DataArray([2, 4, 6]), "km")),
47+
(mm, "add", km, set(DataArray([2, 4, 6]) * 1e6, "mm")),
48+
#
49+
(km, "sub", sc_1, UnitsApplicationError),
50+
(km, "sub", sc_2, set(DataArray([-1, 0, 1]), "km")),
51+
(km, "sub", mm, set(DataArray([0, 0, 0]), "km")),
52+
(mm, "sub", km, set(DataArray([0, 0, 0]), "mm")),
53+
#
54+
(km, "floordiv", sc_1, UnitsApplicationError),
55+
(km, "floordiv", sc_2, set(DataArray([0, 1, 1]), "1")),
56+
(km, "floordiv", mm, set(DataArray([1, 1, 1]), "1")),
57+
(mm, "floordiv", km, set(DataArray([1, 1, 1]), "1")),
58+
#
59+
(km, "mod", sc_1, UnitsApplicationError),
60+
(km, "mod", sc_2, set(DataArray([1, 0, 1]), "km")),
61+
(km, "mod", mm, set(DataArray([0, 0, 0]), "km")),
62+
(mm, "mod", km, set(DataArray([0, 0, 0]), "mm")),
63+
#
64+
(km, "lt", sc_1, UnitsApplicationError),
65+
(km, "lt", sc_2, DataArray([True, False, False])),
66+
(km, "lt", mm, DataArray([False, False, False])),
67+
(mm, "lt", km, DataArray([False, False, False])),
68+
#
69+
(km, "le", sc_1, UnitsApplicationError),
70+
(km, "le", sc_2, DataArray([True, True, False])),
71+
(km, "le", mm, DataArray([True, True, True])),
72+
(mm, "le", km, DataArray([True, True, True])),
73+
#
74+
(km, "eq", sc_1, UnitsApplicationError),
75+
(km, "eq", sc_2, DataArray([False, True, False])),
76+
(km, "eq", mm, DataArray([True, True, True])),
77+
(mm, "eq", km, DataArray([True, True, True])),
78+
#
79+
(km, "ne", sc_1, UnitsApplicationError),
80+
(km, "ne", sc_2, DataArray([True, False, True])),
81+
(km, "ne", mm, DataArray([False, False, False])),
82+
(mm, "ne", km, DataArray([False, False, False])),
83+
#
84+
(km, "ge", sc_1, UnitsApplicationError),
85+
(km, "ge", sc_2, DataArray([False, True, True])),
86+
(km, "ge", mm, DataArray([True, True, True])),
87+
(mm, "ge", km, DataArray([True, True, True])),
88+
#
89+
(km, "gt", sc_1, UnitsApplicationError),
90+
(km, "gt", sc_2, DataArray([False, False, True])),
91+
(km, "gt", mm, DataArray([False, False, False])),
92+
(mm, "gt", km, DataArray([False, False, False])),
93+
]
94+
95+
96+
@mark.parametrize("left, operator, right, expected", data_take)
97+
def test_take(
98+
left: DataArray,
99+
operator: Operator,
100+
right: Any,
101+
expected: Any,
102+
) -> None:
103+
if expected is UnitsApplicationError:
104+
with raises(expected):
105+
take(left, operator, right)
106+
else:
107+
assert_identical(take(left, operator, right), expected)
108+
109+
110+
@mark.parametrize("left, operator, right, expected", data_take)
111+
def test_take_alias(
112+
left: DataArray,
113+
operator: Operator,
114+
right: Any,
115+
expected: DataArray,
116+
) -> None:
117+
if expected is UnitsApplicationError:
118+
with raises(expected):
119+
getattr(opr, operator)(left, right)
120+
else:
121+
assert_identical(getattr(opr, operator)(left, right), expected)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from astropy.constants import c # type: ignore
44
from astropy.units import spectral # type: ignore
55
from xarray.testing import assert_identical # type: ignore
6-
from xarray_units.methods import apply, decompose, like, set, to
6+
from xarray_units.quantity import apply, decompose, like, set, to
77

88

99
# test datasets

tests/test_utils.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# standard library
2+
from typing import Any
3+
4+
5+
# dependencies
6+
from astropy.units import Unit
7+
from pytest import mark, raises
8+
from xarray import DataArray
9+
from xarray_units.utils import UnitsNotValidError, units_of
10+
11+
12+
# test data
13+
data_units_of: list[tuple[Any, Any]] = [
14+
(1, None),
15+
(Unit("m"), None),
16+
(1 * Unit("m"), Unit("m")),
17+
(DataArray(1), None),
18+
(DataArray(1, attrs={"units": "m"}), Unit("m")),
19+
(DataArray(1, attrs={"units": "m, s"}), UnitsNotValidError),
20+
(DataArray(1, attrs={"units": "spam"}), UnitsNotValidError),
21+
]
22+
23+
24+
@mark.parametrize("obj, expected", data_units_of)
25+
def test_units_of(obj: Any, expected: Any) -> None:
26+
if expected is UnitsNotValidError:
27+
with raises(expected):
28+
assert units_of(obj)
29+
else:
30+
assert units_of(obj) == expected

xarray_units/__init__.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
__all__ = ["exceptions", "methods"]
2-
__version__ = "0.1.0"
1+
__all__ = ["operator", "quantity", "utils"]
2+
__version__ = "0.2.0"
33

44

55
# submodules
6-
from . import exceptions
7-
from . import methods
6+
from . import operator
7+
from . import quantity
8+
from . import utils

xarray_units/exceptions.py

Lines changed: 0 additions & 37 deletions
This file was deleted.

0 commit comments

Comments
 (0)