diff --git a/src/noworkflow/now/models/dataflow_model.py b/src/noworkflow/now/models/dataflow_model.py index 71d69df8..0bb6504b 100644 --- a/src/noworkflow/now/models/dataflow_model.py +++ b/src/noworkflow/now/models/dataflow_model.py @@ -23,8 +23,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 +38,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 +62,17 @@ 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: + 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/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..c1b76ba1 --- /dev/null +++ b/src/noworkflow/tests/dependency/test_dataflow_model.py @@ -0,0 +1,26 @@ +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() + trial_ref = trial.id + + trial = Trial(trial_ref) + dot = trial.dot + + del trial + gc.collect() + + text = dot.export_text() + + self.assertIn("digraph", text)