Skip to content

Commit 1eae827

Browse files
committed
Make sure warnings are issues
1 parent fd2fdb1 commit 1eae827

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed

yt/data_objects/tests/test_add_field.py

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logging
12
from functools import partial
23

34
import numpy as np
@@ -8,6 +9,7 @@
89
from yt import derived_field
910
from yt.fields import local_fields
1011
from yt.testing import fake_random_ds
12+
from yt.utilities.logger import ytLogger
1113

1214

1315
def test_add_field_lambda():
@@ -187,3 +189,100 @@ def test_add_field_quick():
187189
np.testing.assert_allclose(
188190
ds.r["gas", "one_over_density"], 1 / ds.r["gas", "density"]
189191
)
192+
193+
194+
def test_add_field_quick_syntax2():
195+
fields = ("density", "temperature")
196+
units = ("g/cm**3", "K")
197+
ds = fake_random_ds(16, fields=fields, units=units)
198+
199+
# Left multiplication
200+
ds.fields.gas.density_two = ds.fields.gas.density * 2
201+
np.testing.assert_allclose(ds.r["gas", "density_two"], ds.r["gas", "density"] * 2)
202+
ds.fields.gas.density_two2 = ds.fields.gas.density + ds.fields.gas.density
203+
np.testing.assert_allclose(ds.r["gas", "density_two2"], ds.r["gas", "density"] * 2)
204+
205+
# Right multiplication
206+
ds.fields.gas.two_density = 2 * ds.fields.gas.density
207+
np.testing.assert_allclose(ds.r["gas", "two_density"], ds.r["gas", "density"] * 2)
208+
209+
# Left division
210+
ds.fields.gas.half_density = ds.fields.gas.density / 2
211+
np.testing.assert_allclose(ds.r["gas", "half_density"], ds.r["gas", "density"] / 2)
212+
ds.fields.gas.density_over_temperature = (
213+
ds.fields.gas.density / ds.fields.gas.temperature
214+
)
215+
np.testing.assert_allclose(
216+
ds.r["gas", "density_over_temperature"],
217+
ds.r["gas", "density"] / ds.r["gas", "temperature"],
218+
)
219+
220+
# Right division
221+
ds.fields.gas.one_over_density = 1 / ds.fields.gas.density
222+
np.testing.assert_allclose(
223+
ds.r["gas", "one_over_density"], 1 / ds.r["gas", "density"]
224+
)
225+
226+
# Subtraction
227+
ds.fields.gas.neg_density = -ds.fields.gas.density
228+
np.testing.assert_allclose(ds.r["gas", "neg_density"], -ds.r["gas", "density"])
229+
ds.fields.gas.density_minus_twice_density = (
230+
ds.fields.gas.density - 2 * ds.fields.gas.density
231+
)
232+
np.testing.assert_allclose(
233+
ds.r["gas", "density_minus_twice_density"],
234+
-ds.r["gas", "density"],
235+
)
236+
237+
# Complex expression
238+
ds.fields.gas.kbT_per_V = (
239+
ds.fields.gas.temperature * ds.units.kb / ds.fields.gas.volume
240+
)
241+
np.testing.assert_allclose(
242+
ds.r["gas", "kbT_per_V"],
243+
ds.r["gas", "temperature"] * ds.units.kb / ds.r["gas", "volume"],
244+
)
245+
246+
247+
@pytest.fixture()
248+
def capturable_logger(caplog):
249+
"""
250+
This set the minimal conditions to make pytest's caplog fixture usable.
251+
"""
252+
253+
propagate = ytLogger.propagate
254+
ytLogger.propagate = True
255+
256+
with caplog.at_level(logging.WARNING, "yt"):
257+
yield
258+
259+
ytLogger.propagate = propagate
260+
261+
262+
@pytest.mark.usefixtures("capturable_logger")
263+
def test_add_field_quick_syntax_warnings(caplog):
264+
# Make sure we get a warning when overriding
265+
# an existing field with a different function
266+
ds = fake_random_ds(16)
267+
268+
warn_str = "Field ('gas', 'density2') already exists. To override use `force_override=True`"
269+
# First time, no warning
270+
ds.add_field(("gas", "density2"), ds.fields.gas.density * 2)
271+
assert warn_str not in caplog.text
272+
273+
# Second time, warning
274+
caplog.clear()
275+
ds.add_field(("gas", "density2"), ds.fields.gas.density * 2)
276+
assert warn_str in caplog.text
277+
278+
warn_str = "Field ('gas', 'density3') already exists. To override use `force_override=True`"
279+
# Third time, new definition, no warning
280+
caplog.clear()
281+
ds.fields.gas.density3 = ds.fields.gas.density * 3
282+
assert warn_str not in caplog.text
283+
caplog.clear()
284+
285+
# Fourth time: new definition, warning!
286+
caplog.clear()
287+
ds.fields.gas.density3 = ds.fields.gas.density * 3
288+
assert warn_str in caplog.text

yt/fields/field_type_container.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,12 @@ def __getattr__(self, attr):
9292
return self.__getattribute__(attr)
9393
return ds.field_info[ft, attr]
9494

95+
def __setattr__(self, attr, value):
96+
if isinstance(value, DerivedField):
97+
self.ds.add_field((self.field_type, attr), value)
98+
else:
99+
super().__setattr__(attr, value)
100+
95101
def __dir__(self):
96102
return [n for t, n in self.ds.field_info if t == self.field_type]
97103

0 commit comments

Comments
 (0)