Skip to content

Commit aeeb7ca

Browse files
authored
Merge pull request #4617 from aturanjanin/owconcatenate
[ENH] Concatenate: data info displayed in the status bar
2 parents cd1a337 + 1298170 commit aeeb7ca

File tree

2 files changed

+70
-4
lines changed

2 files changed

+70
-4
lines changed

Orange/widgets/data/owconcatenate.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
from Orange.widgets.utils.annotated_data import add_columns
2424
from Orange.widgets.utils.sql import check_sql_input
2525
from Orange.widgets.utils.widgetpreview import WidgetPreview
26+
from Orange.widgets.utils.state_summary import format_summary_details, \
27+
format_multiple_summaries
2628
from Orange.widgets.widget import Input, Output, Msg
2729

2830

@@ -135,6 +137,9 @@ def __init__(self):
135137
gui.comboBox(ibox, self, "source_column_role", items=self.id_roles,
136138
callback=self._source_changed))
137139

140+
self.info.set_input_summary(self.info.NoInput)
141+
self.info.set_output_summary(self.info.NoOutput)
142+
138143
ibox.layout().addLayout(form)
139144
mleft, mtop, mright, _ = ibox.layout().getContentsMargins()
140145
ibox.layout().setContentsMargins(mleft, mtop, mright, 4)
@@ -159,8 +164,25 @@ def set_more_data(self, data=None, sig_id=None):
159164
elif sig_id in self.more_data:
160165
del self.more_data[sig_id]
161166

167+
def _set_input_summary(self):
168+
more_data = list(self.more_data.values()) if self.more_data else [None]
169+
n_primary = len(self.primary_data) if self.primary_data else 0
170+
n_more_data = [len(data) if data else 0 for data in more_data]
171+
172+
summary, details, kwargs = self.info.NoInput, "", {}
173+
if self.primary_data or self.more_data:
174+
summary = f"{self.info.format_number(n_primary)}, " \
175+
+ ", ".join(self.info.format_number(i) for i in n_more_data)
176+
details = format_multiple_summaries(
177+
[("Primary data", self.primary_data)]
178+
+ [("", data) for data in more_data]
179+
)
180+
kwargs = {"format": Qt.RichText}
181+
self.info.set_input_summary(summary, details, **kwargs)
182+
162183
def handleNewSignals(self):
163184
self.mergebox.setDisabled(self.primary_data is not None)
185+
self._set_input_summary()
164186
if self.incompatible_types():
165187
self.Error.bow_concatenation()
166188
else:
@@ -211,9 +233,10 @@ def apply(self):
211233
source_ids = np.array(list(flatten(
212234
[i] * len(table) for i, table in enumerate(tables)))).reshape((-1, 1))
213235
data[:, source_var] = source_ids
214-
236+
self.info.set_output_summary(len(data), format_summary_details(data))
215237
else:
216238
data = None
239+
self.info.set_output_summary(self.info.NoOutput)
217240

218241
self.Outputs.data.send(data)
219242

Orange/widgets/data/tests/test_owconcatenate.py

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# Test methods with long descriptive names can omit docstrings
2-
# pylint: disable=missing-docstring
3-
# pylint: disable=abstract-method
2+
# pylint: disable=missing-docstring, abstract-method, protected-access
43
import unittest
54
from unittest.mock import patch
65

@@ -11,7 +10,8 @@
1110
)
1211
from Orange.preprocess.transformation import Identity
1312
from Orange.widgets.data.owconcatenate import OWConcatenate
14-
13+
from Orange.widgets.utils.state_summary import format_summary_details, \
14+
format_multiple_summaries
1515
from Orange.widgets.tests.base import WidgetTest
1616

1717

@@ -378,6 +378,49 @@ def test_different_number_decimals(self):
378378
x = out_dom.attributes[0]
379379
self.assertEqual(x.number_of_decimals, 4)
380380

381+
def test_summary(self):
382+
"""Check if the status bar is updated when data is received"""
383+
info = self.widget.info
384+
no_input, no_output = "No data on input", "No data on output"
385+
386+
self.send_signal(self.widget.Inputs.primary_data, self.iris)
387+
data_list = [("Primary data", self.iris), ("", None)]
388+
summary, details = "150, 0", format_multiple_summaries(data_list)
389+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
390+
self.assertEqual(info._StateInfo__input_summary.details, details)
391+
output = self.get_output(self.widget.Outputs.data)
392+
summary, details = f"{len(output)}", format_summary_details(output)
393+
self.assertEqual(info._StateInfo__output_summary.brief, summary)
394+
self.assertEqual(info._StateInfo__output_summary.details, details)
395+
396+
self.send_signal(self.widget.Inputs.additional_data, self.titanic, 0)
397+
data_list = [("Primary data", self.iris), ("", self.titanic)]
398+
summary, details = "150, 2201", format_multiple_summaries(data_list)
399+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
400+
self.assertEqual(info._StateInfo__input_summary.details, details)
401+
output = self.get_output(self.widget.Outputs.data)
402+
summary, details = f"{len(output)}", format_summary_details(output)
403+
self.assertEqual(info._StateInfo__output_summary.brief, summary)
404+
self.assertEqual(info._StateInfo__output_summary.details, details)
405+
406+
self.send_signal(self.widget.Inputs.primary_data, None)
407+
self.send_signal(self.widget.Inputs.additional_data, self.iris, 1)
408+
data_list = [("Primary data", None), ("", self.titanic), ("", self.iris)]
409+
summary, details = "0, 2201, 150", format_multiple_summaries(data_list)
410+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
411+
self.assertEqual(info._StateInfo__input_summary.details, details)
412+
output = self.get_output(self.widget.Outputs.data)
413+
summary, details = f"{len(output)}", format_summary_details(output)
414+
self.assertEqual(info._StateInfo__output_summary.brief, summary)
415+
self.assertEqual(info._StateInfo__output_summary.details, details)
416+
417+
self.send_signal(self.widget.Inputs.additional_data, None, 0)
418+
self.send_signal(self.widget.Inputs.additional_data, None, 1)
419+
self.assertEqual(info._StateInfo__input_summary.brief, "")
420+
self.assertEqual(info._StateInfo__input_summary.details, no_input)
421+
self.assertEqual(info._StateInfo__output_summary.brief, "")
422+
self.assertEqual(info._StateInfo__output_summary.details, no_output)
423+
381424

382425
if __name__ == "__main__":
383426
unittest.main()

0 commit comments

Comments
 (0)