Hello community,

here is the log from the commit of package python-orange-widget-base for 
openSUSE:Factory checked in at 2020-02-05 19:44:07
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-orange-widget-base (Old)
 and      /work/SRC/openSUSE:Factory/.python-orange-widget-base.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-orange-widget-base"

Wed Feb  5 19:44:07 2020 rev:2 rq:770296 version:4.3.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-orange-widget-base/python-orange-widget-base.changes
      2019-12-12 23:19:12.886207821 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-orange-widget-base.new.26092/python-orange-widget-base.changes
   2020-02-05 19:44:51.851358050 +0100
@@ -1,0 +2,10 @@
+Wed Feb  5 14:08:28 UTC 2020 - Todd R <[email protected]>
+
+- Update to 4.3.0
+  * stateinfo: add auto format for numbers
+  * gui.checkBox: Show specific state when disabled
+  * gui.comboBox: Fix stored label
+  * widgetsscheme: Reorder pending signals to match
+  * Context: Add __eq__ and __hash__
+
+-------------------------------------------------------------------

Old:
----
  orange-widget-base-4.2.0.tar.gz

New:
----
  orange-widget-base-4.3.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-orange-widget-base.spec ++++++
--- /var/tmp/diff_new_pack.msbVVT/_old  2020-02-05 19:44:52.775358490 +0100
+++ /var/tmp/diff_new_pack.msbVVT/_new  2020-02-05 19:44:52.775358490 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-orange-widget-base
 #
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -12,22 +12,23 @@
 # license that conforms to the Open Source Definition (Version 1.9)
 # published by the Open Source Initiative.
 
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
+#
 
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 %define         skip_python2 1
 Name:           python-orange-widget-base
-Version:        4.2.0
+Version:        4.3.0
 Release:        0
-License:        GPL-3.0+
 Summary:        Base Widget for Orange Canvas
-Url:            http://orange.biolab.si/
+License:        GPL-3.0-or-later
 Group:          Development/Languages/Python
+URL:            https://github.com/biolab/orange-widget-base/
 Source:         
https://files.pythonhosted.org/packages/source/o/orange-widget-base/orange-widget-base-%{version}.tar.gz
-BuildRequires:  python-rpm-macros
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  fdupes
+BuildRequires:  python-rpm-macros
 Requires:       python-AnyQt
 Requires:       python-matplotlib
 Requires:       python-orange-canvas-core >= 0.1.8

++++++ orange-widget-base-4.2.0.tar.gz -> orange-widget-base-4.3.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orange-widget-base-4.2.0/PKG-INFO 
new/orange-widget-base-4.3.0/PKG-INFO
--- old/orange-widget-base-4.2.0/PKG-INFO       2019-11-19 14:46:30.000000000 
+0100
+++ new/orange-widget-base-4.3.0/PKG-INFO       2019-12-16 09:45:58.000000000 
+0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: orange-widget-base
-Version: 4.2.0
+Version: 4.3.0
 Summary: Base Widget for Orange Canvas
 Home-page: http://orange.biolab.si/
 Author: Bioinformatics Laboratory, FRI UL
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orange-widget-base-4.2.0/orange_widget_base.egg-info/PKG-INFO 
new/orange-widget-base-4.3.0/orange_widget_base.egg-info/PKG-INFO
--- old/orange-widget-base-4.2.0/orange_widget_base.egg-info/PKG-INFO   
2019-11-19 14:46:29.000000000 +0100
+++ new/orange-widget-base-4.3.0/orange_widget_base.egg-info/PKG-INFO   
2019-12-16 09:45:58.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: orange-widget-base
-Version: 4.2.0
+Version: 4.3.0
 Summary: Base Widget for Orange Canvas
 Home-page: http://orange.biolab.si/
 Author: Bioinformatics Laboratory, FRI UL
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orange-widget-base-4.2.0/orangewidget/gui.py 
new/orange-widget-base-4.3.0/orangewidget/gui.py
--- old/orange-widget-base-4.2.0/orangewidget/gui.py    2019-11-08 
16:39:45.000000000 +0100
+++ new/orange-widget-base-4.3.0/orangewidget/gui.py    2019-12-11 
15:23:26.000000000 +0100
@@ -702,9 +702,42 @@
                 decimals=decimals, spinType=float, **misc)
 
 
+class CheckBoxWithDisabledState(QtWidgets.QCheckBox):
+    def __init__(self, label, parent, disabledState):
+        super().__init__(label, parent)
+        self.disabledState = disabledState
+        # self.trueState is always stored as Qt.Checked, Qt.PartiallyChecked
+        # or Qt.Unchecked, even if the button is two-state, because in
+        # setCheckState, which is used for setting it, "true" would result
+        # in partially checked.
+        self.trueState = self.checkState()
+
+    def changeEvent(self, event):
+        super().changeEvent(event)
+        if event.type() == event.EnabledChange:
+            self._updateChecked()
+
+    def setCheckState(self, state):
+        self.trueState = state
+        self._updateChecked()
+
+    def setChecked(self, state):
+        self._storeTrueState(state)
+        self._updateChecked()
+
+    def _updateChecked(self):
+        if self.isEnabled():
+            super().setCheckState(self.trueState)
+        else:
+            super().setCheckState(self.disabledState)
+
+    def _storeTrueState(self, state):
+        self.trueState = Qt.Checked if state else Qt.Unchecked
+
+
 def checkBox(widget, master, value, label, box=None,
              callback=None, getwidget=False, id_=None, labelWidth=None,
-             disables=None, **misc):
+             disables=None, stateWhenDisabled=None, **misc):
     """
     A simple checkbox.
 
@@ -732,6 +765,9 @@
     :param disables: a list of widgets that are disabled if the check box is
         unchecked
     :type disables: list or QWidget or None
+    :param stateWhenDisabled: the shown state of the checkbox when it is
+        disabled (default: None, unaffected)
+    :type stateWhenDisabled: bool or Qt.CheckState or None
     :return: constructed check box; if is is placed within a box, the box is
         return in the attribute `box`
     :rtype: QCheckBox
@@ -740,7 +776,11 @@
         b = hBox(widget, box, addToLayout=False)
     else:
         b = widget
-    cbox = QtWidgets.QCheckBox(label, b)
+    if stateWhenDisabled is not None:
+        cbox = CheckBoxWithDisabledState(label, b, stateWhenDisabled)
+        cbox.clicked.connect(cbox._storeTrueState)
+    else:
+        cbox = QtWidgets.QCheckBox(label, b)
 
     if labelWidth:
         cbox.setFixedSize(labelWidth, cbox.sizeHint().height())
@@ -1413,7 +1453,7 @@
     if box or label:
         hb = widgetBox(widget, box, orientation, addToLayout=False)
         if label is not None:
-            widgetLabel(hb, label, labelWidth)
+            widget_label = widgetLabel(hb, label, labelWidth)
     else:
         hb = widget
 
@@ -1427,7 +1467,7 @@
         combo.setMinimumContentsLength(contentsLength)
 
     combo.box = hb
-    combo.label = label
+    combo.label = widget_label
     for item in items:
         if isinstance(item, (tuple, list)):
             combo.addItem(*item)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orange-widget-base-4.2.0/orangewidget/settings.py 
new/orange-widget-base-4.3.0/orangewidget/settings.py
--- old/orange-widget-base-4.2.0/orangewidget/settings.py       2019-10-23 
09:28:29.000000000 +0200
+++ new/orange-widget-base-4.3.0/orangewidget/settings.py       2019-12-11 
15:23:26.000000000 +0100
@@ -693,7 +693,7 @@
 
 
 class Context:
-    """Class for data thad defines context and
+    """Class for data that defines context and
     values that should be applied to widget if given context
     is encountered."""
     def __init__(self, **argkw):
@@ -701,12 +701,12 @@
         self.values = {}
         self.__dict__.update(argkw)
 
-    def __getstate__(self):
-        state = dict(self.__dict__)
-        for nc in getattr(self, "no_copy", []):
-            if nc in state:
-                del state[nc]
-        return state
+    def __eq__(self, other):
+        self_state = self.__dict__.copy()
+        del self_state["time"]
+        other_state = other.__dict__.copy()
+        del other_state["time"]
+        return self_state == other_state
 
 
 class ContextHandler(SettingsHandler):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orange-widget-base-4.2.0/orangewidget/tests/test_context_handler.py 
new/orange-widget-base-4.3.0/orangewidget/tests/test_context_handler.py
--- old/orange-widget-base-4.2.0/orangewidget/tests/test_context_handler.py     
2019-06-19 09:33:10.000000000 +0200
+++ new/orange-widget-base-4.3.0/orangewidget/tests/test_context_handler.py     
2019-12-11 15:23:26.000000000 +0100
@@ -247,3 +247,14 @@
         self.assertIn("param2=2", output)
         self.assertIn("param1=3", output)
         self.assertIn("param2=4", output)
+
+
+class TestContext(TestCase):
+    def test_context_eq(self):
+        context1 = Context(x=12, y=["a", "list"], time=3.14)
+        context2 = Context(x=12, y=["a", "list"], time=2.71)
+        context3 = Context(x=13, y=["a", "list"], time=2.71)
+        self.assertTrue(context1 == context2)
+        self.assertFalse(context2 == context3)
+
+        self.assertRaises(TypeError, hash, context1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orange-widget-base-4.2.0/orangewidget/tests/test_gui.py 
new/orange-widget-base-4.3.0/orangewidget/tests/test_gui.py
--- old/orange-widget-base-4.2.0/orangewidget/tests/test_gui.py 2019-10-23 
09:28:29.000000000 +0200
+++ new/orange-widget-base-4.3.0/orangewidget/tests/test_gui.py 2019-12-11 
15:23:26.000000000 +0100
@@ -74,3 +74,131 @@
         # notification should not be called again
         with self.assertRaises(TimeoutError):
             self.process_events(lambda: len(call.call_args_list) > 1, 
timeout=1000)
+
+
+class TestCheckBoxWithDisabledState(GuiTest):
+    def test_check_checkbox_disable_false(self):
+        widget = OWBaseWidget()
+        widget.some_option = False
+        cb = gui.checkBox(widget, widget, "some_option", "foo",
+                          stateWhenDisabled=False)
+        self.assertFalse(cb.isChecked())
+        cb.setEnabled(False)
+        self.assertFalse(cb.isChecked())
+        widget.some_option = True
+        self.assertFalse(cb.isChecked())
+        cb.setEnabled(True)
+        self.assertTrue(cb.isChecked())
+        widget.some_option = False
+        self.assertFalse(cb.isChecked())
+
+        cb.setDisabled(True)
+        self.assertFalse(cb.isChecked())
+        widget.some_option = True
+        self.assertFalse(cb.isChecked())
+        cb.setDisabled(False)
+        self.assertTrue(cb.isChecked())
+        widget.some_option = False
+        self.assertFalse(cb.isChecked())
+
+    def test_check_checkbox_disable_true(self):
+        widget = OWBaseWidget()
+        widget.some_option = False
+        cb = gui.checkBox(widget, widget, "some_option", "foo",
+                          stateWhenDisabled=True)
+        self.assertFalse(cb.isChecked())
+        cb.setEnabled(False)
+        self.assertTrue(cb.isChecked())
+        widget.some_option = True
+        self.assertTrue(cb.isChecked())
+        cb.setEnabled(True)
+        self.assertTrue(cb.isChecked())
+        widget.some_option = False
+        self.assertFalse(cb.isChecked())
+
+        cb.setDisabled(True)
+        self.assertTrue(cb.isChecked())
+        widget.some_option = True
+        self.assertTrue(cb.isChecked())
+        cb.setDisabled(False)
+        self.assertTrue(cb.isChecked())
+        widget.some_option = False
+        self.assertFalse(cb.isChecked())
+
+    def test_clicks(self):
+        widget = OWBaseWidget()
+        widget.some_option = False
+        cb = gui.checkBox(widget, widget, "some_option", "foo",
+                          stateWhenDisabled=False)
+        cb.clicked.emit(True)
+        cb.setEnabled(False)
+        cb.setEnabled(True)
+        self.assertTrue(cb.isChecked())
+
+    def test_set_checked(self):
+        widget = OWBaseWidget()
+
+        widget.some_option = False
+        cb = gui.checkBox(widget, widget, "some_option", "foo",
+                          stateWhenDisabled=False)
+        self.assertFalse(cb.isChecked())
+        cb.setEnabled(False)
+        cb.setChecked(True)
+        self.assertFalse(cb.isChecked())
+        cb.setEnabled(True)
+        self.assertTrue(cb.isChecked())
+
+        widget.some_option = True
+        cb = gui.checkBox(widget, widget, "some_option", "foo",
+                          stateWhenDisabled=True)
+        self.assertTrue(cb.isChecked())
+        cb.setEnabled(False)
+        cb.setChecked(False)
+        self.assertTrue(cb.isChecked())
+        cb.setEnabled(True)
+        self.assertFalse(cb.isChecked())
+
+    def test_set_check_state(self):
+        widget = OWBaseWidget()
+
+        widget.some_option = 0
+        cb = gui.checkBox(widget, widget, "some_option", "foo",
+                          stateWhenDisabled=Qt.Unchecked)
+        cb.setCheckState(Qt.Unchecked)
+        cb.setEnabled(False)
+        self.assertEqual(cb.checkState(), Qt.Unchecked)
+
+        cb.setCheckState(Qt.PartiallyChecked)
+        self.assertEqual(cb.checkState(), Qt.Unchecked)
+        cb.setEnabled(True)
+        self.assertEqual(cb.checkState(), Qt.PartiallyChecked)
+        cb.setEnabled(False)
+        self.assertEqual(cb.checkState(), Qt.Unchecked)
+
+        cb.setCheckState(Qt.Checked)
+        self.assertEqual(cb.checkState(), Qt.Unchecked)
+        cb.setEnabled(True)
+        self.assertEqual(cb.checkState(), Qt.Checked)
+        cb.setEnabled(False)
+        self.assertEqual(cb.checkState(), Qt.Unchecked)
+
+        widget.some_option = 2
+        cb = gui.checkBox(widget, widget, "some_option", "foo",
+                          stateWhenDisabled=Qt.PartiallyChecked)
+        cb.setCheckState(Qt.Unchecked)
+        cb.setEnabled(False)
+        self.assertEqual(cb.checkState(), Qt.PartiallyChecked)
+
+        cb.setCheckState(Qt.Unchecked)
+        self.assertEqual(cb.checkState(), Qt.PartiallyChecked)
+        cb.setEnabled(True)
+        self.assertEqual(cb.checkState(), Qt.Unchecked)
+        cb.setEnabled(False)
+        self.assertEqual(cb.checkState(), Qt.PartiallyChecked)
+
+        cb.setCheckState(Qt.Checked)
+        self.assertEqual(cb.checkState(), Qt.PartiallyChecked)
+        cb.setEnabled(True)
+        self.assertEqual(cb.checkState(), Qt.Checked)
+        cb.setEnabled(False)
+        self.assertEqual(cb.checkState(), Qt.PartiallyChecked)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orange-widget-base-4.2.0/orangewidget/tests/test_widget.py 
new/orange-widget-base-4.3.0/orangewidget/tests/test_widget.py
--- old/orange-widget-base-4.2.0/orangewidget/tests/test_widget.py      
2019-11-08 16:39:45.000000000 +0100
+++ new/orange-widget-base-4.3.0/orangewidget/tests/test_widget.py      
2019-12-11 15:23:26.000000000 +0100
@@ -13,7 +13,7 @@
 from orangewidget.gui import OWComponent
 from orangewidget.settings import Setting, SettingProvider
 from orangewidget.tests.base import WidgetTest
-from orangewidget.widget import OWBaseWidget, Msg
+from orangewidget.widget import OWBaseWidget, Msg, StateInfo
 from orangewidget.utils.messagewidget import MessagesWidget
 
 
@@ -430,6 +430,13 @@
         self.assertEqual(inmsg.summarize().text, "Foo")
         self.assertFalse(inmsg.summarize().icon.isNull())
 
+        info.set_input_summary(12_345)
+        info.set_output_summary(1234)
+
+        self.assertEqual(inmsg.summarize().text, "12.3k")
+        self.assertEqual(inmsg.summarize().informativeText, "12345")
+        self.assertEqual(outmsg.summarize().text, "1234")
+
         info.set_input_summary("Foo", "A foo that bars",)
 
         info.set_input_summary(None)
@@ -455,3 +462,16 @@
 
         with self.assertRaises(TypeError):
             info.set_output_summary(info.NoOutput, "a")
+
+        with self.assertRaises(TypeError):
+            info.set_output_summary(1234, "a")
+
+    def test_format_number(self):
+        self.assertEqual(StateInfo.format_number(9999), "9999")
+        self.assertEqual(StateInfo.format_number(12_345), "12.3k")
+        self.assertEqual(StateInfo.format_number(12_000), "12k")
+        self.assertEqual(StateInfo.format_number(123_456), "123k")
+        self.assertEqual(StateInfo.format_number(99_999), "100k")
+        self.assertEqual(StateInfo.format_number(1_234_567), "1.23M")
+        self.assertEqual(StateInfo.format_number(999_999), "1M")
+        self.assertEqual(StateInfo.format_number(1_000_000), "1M")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orange-widget-base-4.2.0/orangewidget/version.py 
new/orange-widget-base-4.3.0/orangewidget/version.py
--- old/orange-widget-base-4.2.0/orangewidget/version.py        2019-11-19 
14:46:29.000000000 +0100
+++ new/orange-widget-base-4.3.0/orangewidget/version.py        2019-12-16 
09:45:58.000000000 +0100
@@ -1,8 +1,8 @@
 # THIS FILE IS GENERATED FROM ORANGE-WIDGET-BASE SETUP.PY
-short_version = '4.2.0'
-version = '4.2.0'
-full_version = '4.2.0'
-git_revision = 'e9fc6abee0b62aaa78149d4bfbf8d3758f3ed8d8'
+short_version = '4.3.0'
+version = '4.3.0'
+full_version = '4.3.0'
+git_revision = '9bfc975eba10070c05cc3513c0d8eb9b496c2d10'
 release = True
 
 if not release:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orange-widget-base-4.2.0/orangewidget/widget.py 
new/orange-widget-base-4.3.0/orangewidget/widget.py
--- old/orange-widget-base-4.2.0/orangewidget/widget.py 2019-11-08 
16:39:45.000000000 +0100
+++ new/orange-widget-base-4.3.0/orangewidget/widget.py 2019-12-11 
15:23:26.000000000 +0100
@@ -4,6 +4,7 @@
 import warnings
 import textwrap
 from operator import attrgetter
+from math import log10
 
 from typing import Optional, Union
 
@@ -1377,6 +1378,9 @@
 Dynamic = Dynamic
 
 
+metric_suffix = ['', 'k', 'M', 'G', 'T', 'P']
+
+
 class StateInfo(QObject):
     """
     A namespace for OWBaseWidget's detailed input/output/state summary 
reporting.
@@ -1511,7 +1515,7 @@
 
     def set_input_summary(self, summary, details="", icon=QIcon(),
                           format=Qt.PlainText):
-        # type: (Union[StateInfo.Summary, str, None], str, QIcon, 
Qt.TextFormat) -> None
+        # type: (Union[StateInfo.Summary, str, int, None], str, QIcon, 
Qt.TextFormat) -> None
         """
         Set the input summary description.
 
@@ -1525,12 +1529,13 @@
         ----
         `set_input_summary(None)` clears/resets the current summary. Use
         `set_input_summary(StateInfo.NoInput)` to indicate no input state.
+        `set_input_summary(int)` to have automatically formatted summary
 
         Parameters
         ----------
-        summary : Union[Optional[StateInfo.Message], str]
-            A populated `StateInfo.Message` instance or
-            a short text description (should not exceed 16 characters).
+        summary : Union[Optional[StateInfo.Message], str, int]
+            A populated `StateInfo.Message` instance or a short text
+            description (should not exceed 16 characters) or an integer.
         details : str
             A detailed description (only applicable if summary is a string).
         icon : QIcon
@@ -1557,6 +1562,11 @@
             summary = StateInfo.Summary(summary, details, icon, format=format)
             if summary.icon.isNull():
                 summary = summary.updated(icon=summary.default_icon("input"))
+        elif isinstance(summary, int):
+            assert_single_arg()
+            formatted_summary = self.format_number(summary)
+            summary = StateInfo.Summary(formatted_summary, str(summary),
+                                        
StateInfo.Summary.default_icon("input"))
         else:
             raise TypeError("'None', 'str' or 'Message' instance expected, "
                             "got '{}'" .format(type(summary).__name__))
@@ -1567,7 +1577,7 @@
 
     def set_output_summary(self, summary, details="", icon=QIcon(),
                            format=Qt.PlainText):
-        # type: (Union[StateInfo.Summary, str, None], str, QIcon, 
Qt.TextFormat) -> None
+        # type: (Union[StateInfo.Summary, str, int, None], str, QIcon, 
Qt.TextFormat) -> None
         """
         Set the output summary description.
 
@@ -1575,12 +1585,13 @@
         ----
         `set_output_summary(None)` clears/resets the current summary. Use
         `set_output_summary(StateInfo.NoOutput)` to indicate no output state.
+        `set_output_summary(int)` to have automatically formatted summary
 
         Parameters
         ----------
-        summary : Union[StateInfo.Summary, str, None]
+        summary : Union[StateInfo.Summary, str, int, None]
             A populated `StateInfo.Summary` instance or a short text
-            description (should not exceed 16 characters).
+            description (should not exceed 16 characters) or an integer.
         details : str
             A detailed description (only applicable if `summary` is a string).
         icon : QIcon
@@ -1606,6 +1617,11 @@
             summary = StateInfo.Summary(summary, details, icon, format=format)
             if summary.icon.isNull():
                 summary = summary.updated(icon=summary.default_icon("output"))
+        elif isinstance(summary, int):
+            assert_single_arg()
+            formatted_summary = self.format_number(summary)
+            summary = StateInfo.Summary(formatted_summary, str(summary),
+                                        
StateInfo.Summary.default_icon("output"))
         else:
             raise TypeError("'None', 'str' or 'Message' instance expected, "
                             "got '{}'" .format(type(summary).__name__))
@@ -1614,5 +1630,23 @@
             self.__output_summary = summary
             self.output_summary_changed.emit(summary)
 
+    @staticmethod
+    def format_number(n: int) -> str:
+        """
+        Format integers larger then 9999 with metric suffix and at most 3 
digits.
+
+        Example:
+            >>> StateInfo.format_number(12_345)
+            '12.3k'
+        """
+        if n < 10_000:
+            return str(n)
+        mag = int(log10(n) // 3)
+        n = n / 10 ** (mag * 3)
+        if n >= 999.5:
+            # rounding to higher order
+            n = 1
+            mag += 1
+        return f"{n:.3g}{metric_suffix[mag]}"
 
 # pylint: disable=too-many-lines
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orange-widget-base-4.2.0/orangewidget/workflow/widgetsscheme.py 
new/orange-widget-base-4.3.0/orangewidget/workflow/widgetsscheme.py
--- old/orange-widget-base-4.2.0/orangewidget/workflow/widgetsscheme.py 
2019-11-08 16:39:45.000000000 +0100
+++ new/orange-widget-base-4.3.0/orangewidget/workflow/widgetsscheme.py 
2019-12-11 15:23:26.000000000 +0100
@@ -773,9 +773,23 @@
 
         Deliver input signals to an OWBaseWidget instance.
         """
-        widget = self.scheme().widget_for_node(node)
-        if widget is not None:
-            self.process_signals_for_widget(node, widget, signals)
+        scheme = self.scheme()
+        assert scheme is not None
+        widget = scheme.widget_for_node(node)
+        if widget is None:
+            return
+        # `signals` are in the order they were 'enqueued' for delivery.
+        # Reorder them to match the order of links in the model.
+        _order = {
+            l: i for i, l in enumerate(scheme.find_links(sink_node=node))
+        }
+
+        def order(signal: Signal) -> int:
+            # if link is not in the workflow we are processing the final
+            # 'reset' (None) delivery for a removed connection.
+            return _order.get(signal.link, -1)
+        signals = sorted(signals, key=order)
+        self.process_signals_for_widget(node, widget, signals)
 
     def compress_signals(self, signals):
         """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orange-widget-base-4.2.0/setup.py 
new/orange-widget-base-4.3.0/setup.py
--- old/orange-widget-base-4.2.0/setup.py       2019-11-19 14:26:45.000000000 
+0100
+++ new/orange-widget-base-4.3.0/setup.py       2019-12-16 09:43:13.000000000 
+0100
@@ -5,7 +5,7 @@
 from setuptools import setup, find_packages, Command
 
 NAME = 'orange-widget-base'
-VERSION = '4.2.0'
+VERSION = '4.3.0'
 ISRELEASED = True
 # full version identifier including a git revision identifier for development
 # build/releases (this is filled/updated in `write_version_py`)


Reply via email to