From 44d53cb3d675e785e1e281af488f5d07ff726ebb Mon Sep 17 00:00:00 2001 From: Martin Lange <martin.lange@ufz.de> Date: Tue, 29 Nov 2022 14:55:36 +0100 Subject: [PATCH] fix copying of xarray data in connector, add tests --- src/finam/tools/connect_helper.py | 2 +- tests/core/test_schedule.py | 112 ++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 1 deletion(-) diff --git a/src/finam/tools/connect_helper.py b/src/finam/tools/connect_helper.py index 477192ab..9a690680 100644 --- a/src/finam/tools/connect_helper.py +++ b/src/finam/tools/connect_helper.py @@ -529,7 +529,7 @@ class ConnectHelper(Loggable): data_1 = assign_time(data, time) out.push_data(data_1, time) data_2 = assign_time(data, info_time) - out.push_data(copy.copy(data_2), info_time) + out.push_data(data_2.copy(), info_time) else: out.push_data(data, time) out.push_data(copy.copy(data), info_time) diff --git a/tests/core/test_schedule.py b/tests/core/test_schedule.py index d81dab5d..b71a8fda 100644 --- a/tests/core/test_schedule.py +++ b/tests/core/test_schedule.py @@ -897,6 +897,118 @@ class TestComposition(unittest.TestCase): self.assertEqual([1, 8, 13], updates["A"]) self.assertEqual([1, 4, 7, 10], updates["B"]) + def test_starting_time_numpy(self): + start_1 = datetime(2000, 1, 2) + start_2 = datetime(2000, 1, 8) + + updates = {"A": [], "B": []} + + def lambda_generator(t): + return t.day + + def lambda_component(inp, t): + return {"Out": np.asarray(1) * fm.UNITS("")} + + def lambda_debugger(name, data, t): + updates[name].append(t.day) + + module1 = CallbackGenerator( + callbacks={"Out": (lambda_generator, fm.Info(time=None, grid=fm.NoGrid()))}, + start=start_2, + step=timedelta(days=5), + ) + module2 = CallbackComponent( + inputs={ + "In": fm.Info(time=None, grid=fm.NoGrid()), + }, + outputs={ + "Out": fm.Info(time=None, grid=fm.NoGrid()), + }, + callback=lambda_component, + start=start_1, + step=timedelta(days=3), + ) + module3 = DebugPushConsumer( + inputs={ + "A": fm.Info(time=None, grid=None), + "B": fm.Info(time=None, grid=None), + }, + callbacks={ + "A": lambda_debugger, + "B": lambda_debugger, + }, + ) + + composition = Composition([module1, module2, module3]) + composition.initialize() + + module1.outputs["Out"] >> Scale(1.0) >> module2.inputs["In"] + module1.outputs["Out"] >> Scale(1.0) >> module3.inputs["A"] + module2.outputs["Out"] >> Scale(1.0) >> module3.inputs["B"] + + composition.connect(datetime(2000, 1, 1)) + + composition.run(end_time=datetime(2000, 1, 10)) + + self.assertEqual([1, 8, 13], updates["A"]) + self.assertEqual([1, 2, 5, 8, 11], updates["B"]) + + def test_starting_time_xarray(self): + start_1 = datetime(2000, 1, 2) + start_2 = datetime(2000, 1, 8) + + updates = {"A": [], "B": []} + + def lambda_generator(t): + return t.day + + def lambda_component(inp, t): + return {"Out": fm.data.assign_time(inp["In"], t)} + + def lambda_debugger(name, data, t): + updates[name].append(t.day) + + module1 = CallbackGenerator( + callbacks={"Out": (lambda_generator, fm.Info(time=None, grid=fm.NoGrid()))}, + start=start_2, + step=timedelta(days=5), + ) + module2 = CallbackComponent( + inputs={ + "In": fm.Info(time=None, grid=fm.NoGrid()), + }, + outputs={ + "Out": fm.Info(time=None, grid=fm.NoGrid()), + }, + callback=lambda_component, + start=start_1, + step=timedelta(days=3), + ) + module3 = DebugPushConsumer( + inputs={ + "A": fm.Info(time=None, grid=None), + "B": fm.Info(time=None, grid=None), + }, + callbacks={ + "A": lambda_debugger, + "B": lambda_debugger, + }, + ) + + composition = Composition([module1, module2, module3]) + composition.initialize() + + module1.outputs["Out"] >> Scale(1.0) >> module2.inputs["In"] + module1.outputs["Out"] >> Scale(1.0) >> module3.inputs["A"] + module2.outputs["Out"] >> Scale(1.0) >> module3.inputs["B"] + + composition.connect(datetime(2000, 1, 1)) + + composition.run(end_time=datetime(2000, 1, 10)) + + self.assertEqual([1, 8, 13], updates["A"]) + self.assertEqual([1, 2, 5, 8, 11], updates["B"]) + if __name__ == "__main__": unittest.main() -- GitLab