Skip to content

Commit

Permalink
OWApplyDomain: data info displayed in the status bar
Browse files Browse the repository at this point in the history
  • Loading branch information
aturanjanin committed Apr 2, 2020
1 parent bd2f7ec commit b27f346
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 1 deletion.
24 changes: 24 additions & 0 deletions Orange/widgets/data/owtransform.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
from typing import Optional

from AnyQt.QtCore import Qt

from Orange.data import Table, Domain
from Orange.widgets import gui
from Orange.widgets.report.report import describe_data
from Orange.widgets.utils.sql import check_sql_input
from Orange.widgets.utils.widgetpreview import WidgetPreview
from Orange.widgets.utils.state_summary import format_multiple_summaries, \
format_summary_details
from Orange.widgets.widget import OWWidget, Input, Output, Msg


Expand All @@ -31,6 +35,7 @@ class Error(OWWidget.Error):
def __init__(self):
super().__init__()
self.data = None # type: Optional[Table]
self.template_data = None # type: Optional[Table]
self.template_domain = None # type: Optional[Domain]
self.transformed_info = describe_data(None) # type: OrderedDict

Expand All @@ -41,6 +46,9 @@ def __init__(self):
self.set_input_label_text()
self.set_template_label_text()

self.info.set_input_summary(self.info.NoInput)
self.info.set_output_summary(self.info.NoOutput)

def set_input_label_text(self):
text = "No data on input."
if self.data:
Expand Down Expand Up @@ -75,8 +83,21 @@ def set_data(self, data):
@check_sql_input
def set_template_data(self, data):
self.template_domain = data and data.domain
self.template_data = data

def handleNewSignals(self):
summary, details, kwargs = self.info.NoInput, "", {}
if self.data or self.template_data:
n_data = len(self.data) if self.data else 0
n_template = len(self.template_data) if self.template_data else 0
summary = f"{self.info.format_number(n_data)}, " \
f"{self.info.format_number(n_template)}"
kwargs = {"format": Qt.RichText}
details = format_multiple_summaries([
("Data", self.data),
("Template data", self.template_data)
])
self.info.set_input_summary(summary, details, **kwargs)
self.apply()

def apply(self):
Expand All @@ -89,6 +110,9 @@ def apply(self):
self.Error.error(ex)

data = transformed_data
summary = len(data) if data else self.info.NoOutput
details = format_summary_details(data) if data else ""
self.info.set_output_summary(summary, details)
self.transformed_info = describe_data(data)
self.Outputs.transformed_data.send(data)
self.set_template_label_text()
Expand Down
30 changes: 29 additions & 1 deletion Orange/widgets/data/tests/test_owtransform.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Test methods with long descriptive names can omit docstrings
# pylint: disable=missing-docstring
# pylint: disable=missing-docstring, protected-access
from unittest.mock import Mock

from numpy import testing as npt
Expand All @@ -9,6 +9,8 @@
from Orange.widgets.data.owtransform import OWTransform
from Orange.widgets.tests.base import WidgetTest
from Orange.widgets.unsupervised.owpca import OWPCA
from Orange.widgets.utils.state_summary import format_summary_details, \
format_multiple_summaries


class TestOWTransform(WidgetTest):
Expand All @@ -19,6 +21,8 @@ def setUp(self):

def test_output(self):
# send data and template data
info = self.widget.info
no_input, no_output = "No data on input", "No data on output"
self.send_signal(self.widget.Inputs.data, self.data[::15])
self.send_signal(self.widget.Inputs.template_data, self.disc_data)
output = self.get_output(self.widget.Outputs.transformed_data)
Expand All @@ -29,6 +33,14 @@ def test_output(self):
self.widget.template_label.text())
self.assertEqual("Output data includes 4 features.",
self.widget.output_label.text())
data_list = [("Data", self.data[::15]), ("Template data", self.disc_data)]
summary, details = "10, 150", format_multiple_summaries(data_list)
self.assertEqual(info._StateInfo__input_summary.brief, summary)
self.assertEqual(info._StateInfo__input_summary.details, details)
summary, details = "10", format_summary_details(output)
self.assertEqual(info._StateInfo__output_summary.brief, summary)
self.assertEqual(info._StateInfo__output_summary.details, details)


# remove template data
self.send_signal(self.widget.Inputs.template_data, None)
Expand All @@ -39,6 +51,12 @@ def test_output(self):
self.assertEqual("No template data on input.",
self.widget.template_label.text())
self.assertEqual("", self.widget.output_label.text())
data_list = [("Data", self.data[::15]), ("Template data", None)]
summary, details = "10, 0", format_multiple_summaries(data_list)
self.assertEqual(info._StateInfo__input_summary.brief, summary)
self.assertEqual(info._StateInfo__input_summary.details, details)
self.assertEqual(info._StateInfo__output_summary.brief, "")
self.assertEqual(info._StateInfo__output_summary.details, no_output)

# send template data
self.send_signal(self.widget.Inputs.template_data, self.disc_data)
Expand All @@ -59,13 +77,23 @@ def test_output(self):
self.assertEqual("Template data includes 4 features.",
self.widget.template_label.text())
self.assertEqual("", self.widget.output_label.text())
data_list = [("Data", None), ("Template data", self.disc_data)]
summary, details = "0, 150", format_multiple_summaries(data_list)
self.assertEqual(info._StateInfo__input_summary.brief, summary)
self.assertEqual(info._StateInfo__input_summary.details, details)
self.assertEqual(info._StateInfo__output_summary.brief, "")
self.assertEqual(info._StateInfo__output_summary.details, no_output)

# remove template data
self.send_signal(self.widget.Inputs.template_data, None)
self.assertEqual("No data on input.", self.widget.input_label.text())
self.assertEqual("No template data on input.",
self.widget.template_label.text())
self.assertEqual("", self.widget.output_label.text())
self.assertEqual(info._StateInfo__input_summary.brief, "")
self.assertEqual(info._StateInfo__input_summary.details, no_input)
self.assertEqual(info._StateInfo__output_summary.brief, "")
self.assertEqual(info._StateInfo__output_summary.details, no_output)

def assertTableEqual(self, table1, table2):
self.assertIs(table1.domain, table2.domain)
Expand Down

0 comments on commit b27f346

Please sign in to comment.