Skip to content

Commit 1bff0cd

Browse files
committed
ConcurrentWidgetMixin: Cancel task on input change
1 parent 774c4be commit 1bff0cd

File tree

8 files changed

+41
-30
lines changed

8 files changed

+41
-30
lines changed

Orange/widgets/tests/base.py

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -563,9 +563,10 @@ def test_setup_graph(self, timeout=DEFAULT_TIMEOUT):
563563
properly set/updated"""
564564
self.send_signal(self.widget.Inputs.data, self.data)
565565

566-
if self.widget.isBlocking():
567-
spy = QSignalSpy(self.widget.blockingStateChanged)
568-
self.assertTrue(spy.wait(timeout))
566+
self.assertTrue(
567+
self.signal_manager.wait_for_finished(self.widget, timeout),
568+
f"Did not finish in the specified {timeout}ms timeout"
569+
)
569570

570571
self.assertIsNotNone(self.widget.graph.scatterplot_item)
571572

@@ -657,11 +658,10 @@ def test_plot_once(self, timeout=DEFAULT_TIMEOUT):
657658

658659
def test_subset_data_color(self, timeout=DEFAULT_TIMEOUT):
659660
self.send_signal(self.widget.Inputs.data, self.data)
660-
661-
if self.widget.isBlocking():
662-
spy = QSignalSpy(self.widget.blockingStateChanged)
663-
self.assertTrue(spy.wait(timeout))
664-
661+
self.assertTrue(
662+
self.signal_manager.wait_for_finished(self.widget, timeout),
663+
f"Did not finish in the specified {timeout}ms timeout"
664+
)
665665
self.send_signal(self.widget.Inputs.data_subset, self.data[:10])
666666
subset = [brush.color().name() == "#46befa" for brush in
667667
self.widget.graph.scatterplot_item.data['brush'][:10]]
@@ -723,18 +723,20 @@ def test_invalidated_embedding(self, timeout=DEFAULT_TIMEOUT):
723723

724724
def test_saved_selection(self, timeout=DEFAULT_TIMEOUT):
725725
self.send_signal(self.widget.Inputs.data, self.data)
726-
if self.widget.isBlocking():
727-
spy = QSignalSpy(self.widget.blockingStateChanged)
728-
self.assertTrue(spy.wait(timeout))
726+
self.assertTrue(
727+
self.signal_manager.wait_for_finished(self.widget, timeout),
728+
f"Did not finish in the specified {timeout}ms timeout"
729+
)
729730

730731
self.widget.graph.select_by_indices(list(range(0, len(self.data), 10)))
731732
settings = self.widget.settingsHandler.pack_data(self.widget)
732733
w = self.create_widget(self.widget.__class__, stored_settings=settings)
733734

734735
self.send_signal(self.widget.Inputs.data, self.data, widget=w)
735-
if w.isBlocking():
736-
spy = QSignalSpy(w.blockingStateChanged)
737-
self.assertTrue(spy.wait(timeout))
736+
self.assertTrue(
737+
self.signal_manager.wait_for_finished(w, timeout),
738+
f"Did not finish in the specified {timeout}ms timeout"
739+
)
738740

739741
self.assertEqual(np.sum(w.graph.selection), 15)
740742
np.testing.assert_equal(self.widget.graph.selection, w.graph.selection)
@@ -770,9 +772,10 @@ def test_in_out_summary(self, timeout=DEFAULT_TIMEOUT):
770772
self.assertEqual(info._StateInfo__output_summary.brief, "")
771773

772774
self.send_signal(self.widget.Inputs.data, self.data)
773-
if self.widget.isBlocking():
774-
spy = QSignalSpy(self.widget.blockingStateChanged)
775-
self.assertTrue(spy.wait(timeout))
775+
self.assertTrue(
776+
self.signal_manager.wait_for_finished(self.widget, timeout),
777+
f"Did not finish in the specified {timeout}ms timeout"
778+
)
776779
ind = self._select_data()
777780
self.assertEqual(info._StateInfo__input_summary.brief,
778781
str(len(self.data)))

Orange/widgets/unsupervised/tests/test_owmds.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,14 @@ def tearDown(self):
4949
self.widget.onDeleteWidget()
5050
super().tearDown()
5151

52-
def test_plot_once(self, timeout=5000):
52+
def test_plot_once(self): # pylint: disable=arguments-differ
5353
"""Test if data is plotted only once but committed on every input change"""
5454
table = Table("heart_disease")
5555
self.widget.setup_plot = Mock()
5656
self.widget.commit = self.widget.unconditional_commit = Mock()
5757
self.send_signal(self.widget.Inputs.data, table)
5858
self.widget.commit.reset_mock()
59-
self.wait_until_stop_blocking()
59+
self.wait_until_finished()
6060
self.widget.setup_plot.assert_called_once()
6161
self.widget.commit.assert_called_once()
6262

Orange/widgets/unsupervised/tests/test_owtsne.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ def test_normalize_data(self):
149149
with patch("Orange.preprocess.preprocess.Normalize", wraps=Normalize) as normalize:
150150
self.send_signal(self.widget.Inputs.data, self.data)
151151
self.assertTrue(self.widget.controls.normalize.isEnabled())
152-
self.wait_until_stop_blocking()
152+
self.wait_until_finished()
153153
normalize.assert_called_once()
154154

155155
# Disable checkbox
@@ -158,7 +158,7 @@ def test_normalize_data(self):
158158
with patch("Orange.preprocess.preprocess.Normalize", wraps=Normalize) as normalize:
159159
self.send_signal(self.widget.Inputs.data, self.data)
160160
self.assertTrue(self.widget.controls.normalize.isEnabled())
161-
self.wait_until_stop_blocking()
161+
self.wait_until_finished()
162162
normalize.assert_not_called()
163163

164164
# Normalization shouldn't work on sparse data
@@ -169,7 +169,7 @@ def test_normalize_data(self):
169169
with patch("Orange.preprocess.preprocess.Normalize", wraps=Normalize) as normalize:
170170
self.send_signal(self.widget.Inputs.data, sparse_data)
171171
self.assertFalse(self.widget.controls.normalize.isEnabled())
172-
self.wait_until_stop_blocking()
172+
self.wait_until_finished()
173173
normalize.assert_not_called()
174174

175175
@patch("Orange.projection.manifold.TSNEModel.optimize")
@@ -192,7 +192,7 @@ def _check_exaggeration(call, exaggeration):
192192
self.wait_until_stop_blocking()
193193
self.widget.controls.exaggeration.setValue(1)
194194
self.widget.run_button.clicked.emit() # run with exaggeration 1
195-
self.wait_until_stop_blocking()
195+
self.wait_until_finished()
196196
_check_exaggeration(optimize, 1)
197197

198198
# Reset and clear state
@@ -205,7 +205,7 @@ def _check_exaggeration(call, exaggeration):
205205
self.wait_until_stop_blocking()
206206
self.widget.controls.exaggeration.setValue(3)
207207
self.widget.run_button.clicked.emit() # run with exaggeration 1
208-
self.wait_until_stop_blocking()
208+
self.wait_until_finished()
209209
_check_exaggeration(optimize, 3)
210210

211211
def test_plot_once(self):
@@ -221,7 +221,7 @@ def test_plot_once(self):
221221
# when the result was available.
222222
self.widget.setup_plot.reset_mock()
223223
self.widget.commit.reset_mock()
224-
self.wait_until_stop_blocking()
224+
self.wait_until_finished()
225225

226226
self.widget.setup_plot.assert_called_once()
227227
self.widget.commit.assert_called_once()
@@ -295,7 +295,7 @@ def test_invalidation_flow(self):
295295
# set global structure "on" (after the embedding is computed)
296296
w.controls.multiscale.setChecked(False)
297297
self.send_signal(w.Inputs.data, self.data)
298-
self.wait_until_stop_blocking()
298+
self.wait_until_finished()
299299
self.assertFalse(self.widget.Information.modified.is_shown())
300300
# All the embedding components should computed
301301
self.assertIsNotNone(w.pca_projection)

Orange/widgets/utils/concurrent.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -560,12 +560,12 @@ class ConcurrentWidgetMixin(ConcurrentMixin):
560560
"""
561561
def __set_state_ready(self):
562562
self.progressBarFinished()
563-
self.setBlocking(False)
563+
self.setInvalidated(False)
564564
self.setStatusMessage("")
565565

566566
def __set_state_busy(self):
567567
self.progressBarInit()
568-
self.setBlocking(True)
568+
self.setInvalidated(True)
569569

570570
def start(self, task: Callable, *args, **kwargs):
571571
self.__set_state_ready()

Orange/widgets/utils/tests/concurrent_example.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ def on_done(self, result: Result):
9999
self.run_button.setText("Start")
100100
self.commit()
101101

102+
def on_exception(self, ex: Exception):
103+
raise ex
104+
102105
# OWDataProjectionWidget
103106
def set_data(self, data: Table):
104107
super().set_data(data)

Orange/widgets/utils/tests/test_concurrent_example.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def test_button_no_data(self):
3333
def test_button_with_data(self):
3434
self.send_signal(self.widget.Inputs.data, self.data)
3535
self.assertEqual(self.widget.run_button.text(), "Stop")
36-
self.wait_until_stop_blocking()
36+
self.wait_until_finished()
3737
self.assertEqual(self.widget.run_button.text(), "Start")
3838

3939
def test_button_toggle(self):

Orange/widgets/visualize/owfreeviz.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ def on_exception(self, ex: Exception):
229229
# OWAnchorProjectionWidget
230230
def set_data(self, data):
231231
super().set_data(data)
232+
self.graph.set_sample_size(None)
232233
if self._invalidated:
233234
self.init_projection()
234235

Orange/widgets/visualize/tests/test_owfreeviz.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def test_optimization_finish(self):
7171
output1 = self.get_output(self.widget.Outputs.components)
7272
self.widget.run_button.click()
7373
self.assertEqual(self.widget.run_button.text(), "Stop")
74-
self.wait_until_stop_blocking()
74+
self.wait_until_finished()
7575
self.assertEqual(self.widget.run_button.text(), "Start")
7676
output2 = self.get_output(self.widget.Outputs.components)
7777
self.assertTrue((output1.X != output2.X).any())
@@ -163,3 +163,7 @@ def test_run_do_not_modify_model_inplace(self):
163163
self.assertIsNot(self.projection.proj, result.projection.proj)
164164
self.assertTrue((self.projection.components_.T !=
165165
result.projection.components_.T).any())
166+
167+
168+
if __name__ == "__main__":
169+
unittest.main()

0 commit comments

Comments
 (0)