Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 18 additions & 6 deletions src/noworkflow/now/models/dataflow_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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"""
Expand All @@ -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")
2 changes: 1 addition & 1 deletion src/noworkflow/now/models/dependency_graph/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"):
Expand Down
2 changes: 2 additions & 0 deletions src/noworkflow/tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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):
Expand Down
2 changes: 2 additions & 0 deletions src/noworkflow/tests/dependency/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__ = [
Expand All @@ -19,4 +20,5 @@
"TestActivationClusterizer",
"TestProspectiveClusterizer",
"TestClusterizerConfig",
"TestDataflowModel"
]
26 changes: 26 additions & 0 deletions src/noworkflow/tests/dependency/test_dataflow_model.py
Original file line number Diff line number Diff line change
@@ -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)