Skip to content

Commit 76eab30

Browse files
authored
setup of the project (#8)
* add a pyproject.toml file * move the metadata from setup.py to setup.cfg * dedent the metadata * move install_requires to the options section * black * use xarray's flake8 configuration * make flake8 ignore the imported-but-unused variables * more flake8 * black * fix the creation of distribution archives * specify the numpy and xarray versions as minimum
1 parent 7b3c4b1 commit 76eab30

File tree

8 files changed

+213
-153
lines changed

8 files changed

+213
-153
lines changed

pintxarray/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
from .accessors import PintDataArrayAccessor, PintDatasetAccessor
1+
from .accessors import PintDataArrayAccessor, PintDatasetAccessor # noqa

pintxarray/accessors.py

Lines changed: 96 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# TODO is it possible to import pint-xarray from within xarray if pint is present?
2-
from xarray import (register_dataarray_accessor, register_dataset_accessor,
3-
DataArray, Dataset, Variable)
2+
from xarray import (
3+
register_dataarray_accessor,
4+
register_dataset_accessor,
5+
DataArray,
6+
Dataset,
7+
Variable,
8+
)
49
from xarray.core.npcompat import IS_NEP18_ACTIVE
510

611
import numpy as np
@@ -11,8 +16,9 @@
1116

1217

1318
if not hasattr(Quantity, "__array_function__"):
14-
raise ImportError("Imported version of pint does not implement "
15-
"__array_function__")
19+
raise ImportError(
20+
"Imported version of pint does not implement " "__array_function__"
21+
)
1622

1723
if not IS_NEP18_ACTIVE:
1824
raise ImportError("NUMPY_EXPERIMENTAL_ARRAY_FUNCTION is not enabled")
@@ -34,26 +40,27 @@ def _array_attach_units(data, unit, convert_from=None):
3440

3541
if isinstance(data, Quantity):
3642
if not convert_from:
37-
raise ValueError(f"Cannot attach unit {unit} to quantity: data "
38-
f"already has units {data.units}")
43+
raise ValueError(
44+
f"Cannot attach unit {unit} to quantity: data "
45+
f"already has units {data.units}"
46+
)
3947
elif isinstance(convert_from, Unit):
4048
data = data.magnitude
4149
elif convert_from is True: # intentionally accept exactly true
4250
if data.check(unit):
4351
convert_from = data.units
4452
data = data.magnitude
4553
else:
46-
raise ValueError("Cannot convert quantity from {data.units} "
47-
"to {unit}")
54+
raise ValueError(
55+
"Cannot convert quantity from {data.units} " "to {unit}"
56+
)
4857
else:
4958
raise ValueError("Cannot convert from invalid unit {convert_from}")
5059

5160
# to make sure we also encounter the case of "equal if converted"
5261
if convert_from is not None:
5362
quantity = (data * convert_from).to(
54-
unit
55-
if isinstance(unit, Unit)
56-
else unit.dimensionless
63+
unit if isinstance(unit, Unit) else unit.dimensionless
5764
)
5865
else:
5966
try:
@@ -67,6 +74,7 @@ def _array_attach_units(data, unit, convert_from=None):
6774

6875
return quantity
6976

77+
7078
def _get_registry(unit_registry, registry_kwargs):
7179
if unit_registry is None:
7280
if registry_kwargs is None:
@@ -76,10 +84,11 @@ def _get_registry(unit_registry, registry_kwargs):
7684
unit_registry = pint.UnitRegistry(**registry_kwargs)
7785
return unit_registry
7886

87+
7988
def _decide_units(units, registry, attrs):
8089
if units is None:
8190
# TODO option to read and decode units according to CF conventions (see MetPy)?
82-
attr_units = attrs['units']
91+
attr_units = attrs["units"]
8392
units = registry.parse_expression(attr_units)
8493
elif isinstance(units, Unit):
8594
# TODO do we have to check what happens if someone passes a Unit instance
@@ -90,16 +99,16 @@ def _decide_units(units, registry, attrs):
9099
units = registry.Unit(units)
91100
return units
92101

102+
93103
def _quantify_variable(var, units):
94104
new_data = _array_attach_units(var.data, units, convert_from=None)
95-
new_var = Variable(dims=var.dims, data=new_data,
96-
attrs=var.attrs)
105+
new_var = Variable(dims=var.dims, data=new_data, attrs=var.attrs)
97106
return new_var
98107

108+
99109
def _dequantify_variable(var):
100-
new_var = Variable(dims=var.dims, data=var.data.magnitude,
101-
attrs=var.attrs)
102-
new_var.attrs['units'] = str(var.data.units)
110+
new_var = Variable(dims=var.dims, data=var.data.magnitude, attrs=var.attrs)
111+
new_var.attrs["units"] = str(var.data.units)
103112
return new_var
104113

105114

@@ -152,8 +161,10 @@ def quantify(self, units=None, unit_registry=None, registry_kwargs=None):
152161
# TODO should also quantify coordinates (once explicit indexes ready)
153162

154163
if isinstance(self.da.data, Quantity):
155-
raise ValueError(f"Cannot attach unit {units} to quantity: data "
156-
f"already has units {self.da.data.units}")
164+
raise ValueError(
165+
f"Cannot attach unit {units} to quantity: data "
166+
f"already has units {self.da.data.units}"
167+
)
157168

158169
registry = _get_registry(unit_registry, registry_kwargs)
159170

@@ -162,8 +173,9 @@ def quantify(self, units=None, unit_registry=None, registry_kwargs=None):
162173
quantity = _array_attach_units(self.da.data, units, convert_from=None)
163174

164175
# TODO should we (temporarily) remove the attrs here so that they don't become inconsistent?
165-
return DataArray(dims=self.da.dims, data=quantity,
166-
coords=self.da.coords, attrs=self.da.attrs)
176+
return DataArray(
177+
dims=self.da.dims, data=quantity, coords=self.da.coords, attrs=self.da.attrs
178+
)
167179

168180
def dequantify(self):
169181
"""
@@ -179,13 +191,18 @@ def dequantify(self):
179191
"""
180192

181193
if not isinstance(self.da.data, Quantity):
182-
raise ValueError("Cannot remove units from data that does not have"
183-
" units")
194+
raise ValueError(
195+
"Cannot remove units from data that does not have" " units"
196+
)
184197

185198
# TODO also dequantify coords (once explicit indexes ready)
186-
da = DataArray(dims=self.da.dims, data=self.da.pint.magnitude,
187-
coords=self.da.coords, attrs=self.da.attrs)
188-
da.attrs['units'] = str(self.da.data.units)
199+
da = DataArray(
200+
dims=self.da.dims,
201+
data=self.da.pint.magnitude,
202+
coords=self.da.coords,
203+
attrs=self.da.attrs,
204+
)
205+
da.attrs["units"] = str(self.da.data.units)
189206
return da
190207

191208
@property
@@ -199,8 +216,9 @@ def units(self):
199216
@units.setter
200217
def units(self, units):
201218
quantity = _array_attach_units(self.da.data, units)
202-
self.da = DataArray(dim=self.da.dims, data=quantity,
203-
coords=self.da.coords, attrs=self.da.attrs)
219+
self.da = DataArray(
220+
dim=self.da.dims, data=quantity, coords=self.da.coords, attrs=self.da.attrs
221+
)
204222

205223
@property
206224
def dimensionality(self):
@@ -217,25 +235,38 @@ def registry(self, _):
217235

218236
def to(self, units):
219237
quantity = self.da.data.to(units)
220-
return DataArray(dim=self.da.dims, data=quantity,
221-
coords=self.da.coords, attrs=self.da.attrs,
222-
encoding=self.da.encoding)
238+
return DataArray(
239+
dim=self.da.dims,
240+
data=quantity,
241+
coords=self.da.coords,
242+
attrs=self.da.attrs,
243+
encoding=self.da.encoding,
244+
)
223245

224246
def to_base_units(self):
225247
quantity = self.da.data.to_base_units()
226-
return DataArray(dim=self.da.dims, data=quantity,
227-
coords=self.da.coords, attrs=self.da.attrs,
228-
encoding=self.da.encoding)
248+
return DataArray(
249+
dim=self.da.dims,
250+
data=quantity,
251+
coords=self.da.coords,
252+
attrs=self.da.attrs,
253+
encoding=self.da.encoding,
254+
)
229255

230256
# TODO integrate with the uncertainties package here...?
231257
def plus_minus(self, value, error, relative=False):
232258
quantity = self.da.data.plus_minus(value, error, relative)
233-
return DataArray(dim=self.da.dims, data=quantity,
234-
coords=self.da.coords, attrs=self.da.attrs,
235-
encoding=self.da.encoding)
259+
return DataArray(
260+
dim=self.da.dims,
261+
data=quantity,
262+
coords=self.da.coords,
263+
attrs=self.da.attrs,
264+
encoding=self.da.encoding,
265+
)
236266

237-
def sel(self, indexers=None, method=None, tolerance=None, drop=False,
238-
**indexers_kwargs):
267+
def sel(
268+
self, indexers=None, method=None, tolerance=None, drop=False, **indexers_kwargs
269+
):
239270
...
240271

241272
@property
@@ -250,6 +281,7 @@ class PintDatasetAccessor:
250281
251282
Methods and attributes can be accessed through the `.pint` attribute.
252283
"""
284+
253285
def __init__(self, ds):
254286
self.ds = ds
255287

@@ -284,44 +316,50 @@ def quantify(self, units=None, unit_registry=None, registry_kwargs=None):
284316

285317
for var in self.ds.data_vars:
286318
if isinstance(self.ds[var].data, Quantity):
287-
raise ValueError(f"Cannot attach unit to quantity: data "
288-
f"variable {var} already has units "
289-
f"{self.ds[var].data.units}")
319+
raise ValueError(
320+
f"Cannot attach unit to quantity: data "
321+
f"variable {var} already has units "
322+
f"{self.ds[var].data.units}"
323+
)
290324

291325
registry = _get_registry(unit_registry, registry_kwargs)
292326

293327
if units is None:
294328
units = {name: None for name in self.ds}
295329

296-
units = {name: _decide_units(units.get(name, None), registry, var.attrs)
297-
for name, var in self.ds.data_vars.items()}
330+
units = {
331+
name: _decide_units(units.get(name, None), registry, var.attrs)
332+
for name, var in self.ds.data_vars.items()
333+
}
298334

299-
quantified_vars = {name: _quantify_variable(var, units[name])
300-
for name, var in self.ds.data_vars.items()}
335+
quantified_vars = {
336+
name: _quantify_variable(var, units[name])
337+
for name, var in self.ds.data_vars.items()
338+
}
301339

302340
# TODO should also quantify coordinates (once explicit indexes ready)
303341
# TODO should we (temporarily) remove the attrs here so that they don't become inconsistent?
304-
return Dataset(data_vars=quantified_vars, coords=self.ds.coords,
305-
attrs=self.ds.attrs)
342+
return Dataset(
343+
data_vars=quantified_vars, coords=self.ds.coords, attrs=self.ds.attrs
344+
)
306345

307346
def dequantify(self):
308-
dequantified_vars = {name: da.pint.to_base_units()
309-
for name, da in self.ds.items()}
310-
return Dataset(dequantified_vars, coords=self.ds.coords,
311-
attrs=self.ds.attrs)
347+
dequantified_vars = {
348+
name: da.pint.to_base_units() for name, da in self.ds.items()
349+
}
350+
return Dataset(dequantified_vars, coords=self.ds.coords, attrs=self.ds.attrs)
312351

313352
def to_base_units(self):
314-
base_vars = {name: da.pint.to_base_units()
315-
for name, da in self.ds.items()}
316-
return Dataset(base_vars, coords=self.ds.coords,
317-
attrs=self.ds.attrs)
353+
base_vars = {name: da.pint.to_base_units() for name, da in self.ds.items()}
354+
return Dataset(base_vars, coords=self.ds.coords, attrs=self.ds.attrs)
318355

319356
# TODO unsure if the upstream capability exists in pint for this yet.
320357
def to_system(self, system):
321358
raise NotImplementedError
322359

323-
def sel(self, indexers=None, method=None, tolerance=None, drop=False,
324-
**indexers_kwargs):
360+
def sel(
361+
self, indexers=None, method=None, tolerance=None, drop=False, **indexers_kwargs
362+
):
325363
...
326364

327365
@property

0 commit comments

Comments
 (0)