From 898567ca470a62f898de3fb08b6efb6d4ef821b0 Mon Sep 17 00:00:00 2001 From: Felipe Coutinho Date: Thu, 13 Aug 2026 17:34:52 -0300 Subject: [PATCH 1/2] Fix issue --- src/noworkflow/now/models/dataflow_model.py | 24 ++++++++++++++----- .../now/models/dependency_graph/config.py | 2 +- src/noworkflow/tests/__init__.py | 2 ++ src/noworkflow/tests/dependency/__init__.py | 2 ++ .../tests/dependency/test_dataflow_model.py | 23 ++++++++++++++++++ 5 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 src/noworkflow/tests/dependency/test_dataflow_model.py diff --git a/src/noworkflow/now/models/dataflow_model.py b/src/noworkflow/now/models/dataflow_model.py index 71d69df8..42921a2f 100644 --- a/src/noworkflow/now/models/dataflow_model.py +++ b/src/noworkflow/now/models/dataflow_model.py @@ -10,6 +10,7 @@ from ..persistence.models.base import Model +from ..persistence.models.trial import Trial from .dependency_graph.dot_visitor import DotVisitor from .dependency_graph.search_visitor import SearchEvaluationVisitor @@ -23,8 +24,10 @@ class DataflowModel(Model): def __init__(self, trial=None, activation=None): super(DataflowModel, self).__init__() self.trial = None + self.trial_ref = None if trial is not None: self.trial = weakref.proxy(trial) + self.trial_ref = trial.id self.activation = None if activation is not None: self.activation = activation @@ -36,12 +39,8 @@ def __init__(self, trial=None, activation=None): def _load_trial_and_activation(self): """Load trial or activation from trial/activation attributes""" - if self.activation is None and self.trial is None: - raise ValueError("Either activation or trial should be defined") - elif self.activation is not None: - self.trial = weakref.proxy(self.activation.trial) - elif self.trial is not None: - self.activation = self.trial.initial_activation + self.trial = self._get_trial() + self.activation = self.trial.initial_activation def export_text(self): """Export facts from trial as text""" @@ -64,3 +63,16 @@ def _ipython_display_(self): "dot", "--format {}".format(self.format), self.export_text() ) display(obj) + + def _get_trial(self): + if self.trial is not None: + try: + self.trial.id # just verifies the proxy is alive + return self.trial + except ReferenceError: + pass + + if self.trial_ref is not None: + return Trial(self.trial_ref) + + raise ValueError("Either activation or trial should be defined") diff --git a/src/noworkflow/now/models/dependency_graph/config.py b/src/noworkflow/now/models/dependency_graph/config.py index 40cf37f7..174c5c64 100644 --- a/src/noworkflow/now/models/dependency_graph/config.py +++ b/src/noworkflow/now/models/dependency_graph/config.py @@ -43,7 +43,7 @@ def __init__(self): self.hide_not_code = False self.hide_func = False self.max_depth = float("inf") - self.mode = "simulation" + self.mode = "coarseGrain" @classmethod def create_arguments(cls, add_arg, mode="coarseGrain"): diff --git a/src/noworkflow/tests/__init__.py b/src/noworkflow/tests/__init__.py index 52ffea34..55db4c30 100644 --- a/src/noworkflow/tests/__init__.py +++ b/src/noworkflow/tests/__init__.py @@ -29,6 +29,7 @@ from .dependency import TestClusterizer, TestClusterizerConfig from .dependency import TestProspectiveClusterizer from .dependency import TestActivationClusterizer, TestDependencyClusterizer +from .dependency import TestDataflowModel from .cross_version_test import TestCrossVersion from ..now.persistence.models import ORDER @@ -76,6 +77,7 @@ dataflow.addTests(loader.loadTestsFromTestCase(TestActivationClusterizer)) dataflow.addTests(loader.loadTestsFromTestCase(TestProspectiveClusterizer)) dataflow.addTests(loader.loadTestsFromTestCase(TestClusterizerConfig)) +dataflow.addTests(loader.loadTestsFromTestCase(TestDataflowModel)) def load_tests(loader, tests, pattern): diff --git a/src/noworkflow/tests/dependency/__init__.py b/src/noworkflow/tests/dependency/__init__.py index d9c2dfbe..1428d6d0 100644 --- a/src/noworkflow/tests/dependency/__init__.py +++ b/src/noworkflow/tests/dependency/__init__.py @@ -11,6 +11,7 @@ from .test_dependency_clusterizer import TestDependencyClusterizer from .test_activation_clusterizer import TestActivationClusterizer from .test_prospective_clusterizer import TestProspectiveClusterizer +from .test_dataflow_model import TestDataflowModel from .test_clusterizer_config import TestClusterizerConfig __all__ = [ @@ -19,4 +20,5 @@ "TestActivationClusterizer", "TestProspectiveClusterizer", "TestClusterizerConfig", + "TestDataflowModel" ] diff --git a/src/noworkflow/tests/dependency/test_dataflow_model.py b/src/noworkflow/tests/dependency/test_dataflow_model.py new file mode 100644 index 00000000..b058bf9e --- /dev/null +++ b/src/noworkflow/tests/dependency/test_dataflow_model.py @@ -0,0 +1,23 @@ +import gc + +from ...now.persistence.models import Trial +from ..collection_testcase import CollectionTestCase + + +class TestDataflowModel(CollectionTestCase): + def test_export_text_reloads_trial_after_weakref_dies(self): + self.script("# script.py\n" + "x = 1\n" + "y = x + 2\n" + "print(y)\n") + self.clean_execution() + + trial = Trial() + dot = trial.dot + + del trial + gc.collect() + + text = dot.export_text() + + self.assertIn("digraph", text) From 560f059380114c93b6d51d7c0d539292b68d7c3b Mon Sep 17 00:00:00 2001 From: Felipe Coutinho Date: Thu, 13 Aug 2026 17:43:26 -0300 Subject: [PATCH 2/2] Fix tests --- src/noworkflow/now/models/dataflow_model.py | 2 +- src/noworkflow/tests/dependency/test_dataflow_model.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/noworkflow/now/models/dataflow_model.py b/src/noworkflow/now/models/dataflow_model.py index 42921a2f..0bb6504b 100644 --- a/src/noworkflow/now/models/dataflow_model.py +++ b/src/noworkflow/now/models/dataflow_model.py @@ -10,7 +10,6 @@ from ..persistence.models.base import Model -from ..persistence.models.trial import Trial from .dependency_graph.dot_visitor import DotVisitor from .dependency_graph.search_visitor import SearchEvaluationVisitor @@ -73,6 +72,7 @@ def _get_trial(self): pass if self.trial_ref is not None: + from ..persistence.models.trial import Trial return Trial(self.trial_ref) raise ValueError("Either activation or trial should be defined") diff --git a/src/noworkflow/tests/dependency/test_dataflow_model.py b/src/noworkflow/tests/dependency/test_dataflow_model.py index b058bf9e..c1b76ba1 100644 --- a/src/noworkflow/tests/dependency/test_dataflow_model.py +++ b/src/noworkflow/tests/dependency/test_dataflow_model.py @@ -13,6 +13,9 @@ def test_export_text_reloads_trial_after_weakref_dies(self): self.clean_execution() trial = Trial() + trial_ref = trial.id + + trial = Trial(trial_ref) dot = trial.dot del trial