From 34302bbeac14aac4d6b2d3d23b472b8e6a547e6f Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Tue, 30 Mar 2021 15:51:43 -0500 Subject: [PATCH 01/10] update logger/plugin/logger_service.py --- apptools/logger/plugin/logger_service.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apptools/logger/plugin/logger_service.py b/apptools/logger/plugin/logger_service.py index 81e0aee4..c016e8ba 100644 --- a/apptools/logger/plugin/logger_service.py +++ b/apptools/logger/plugin/logger_service.py @@ -23,7 +23,7 @@ List, Property, Undefined, - on_trait_change, + observe, ) root_logger = logging.getLogger() @@ -170,8 +170,9 @@ def _get_mail_files(self): "apptools.logger.plugin.mail_files" ) - @on_trait_change("preferences.level_") - def _level_changed(self, new): + @observe("preferences.level_") + def _level_changed(self, event): + new = event.new if ( new is not None and new is not Undefined From 4b2ecd50675b7a5ad23e57af700e5c235ebc3fce Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Tue, 30 Mar 2021 15:52:54 -0500 Subject: [PATCH 02/10] update logger/plugin/view/logger_view.py --- apptools/logger/plugin/view/logger_view.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apptools/logger/plugin/view/logger_view.py b/apptools/logger/plugin/view/logger_view.py index ef1d27f9..18dca391 100644 --- a/apptools/logger/plugin/view/logger_view.py +++ b/apptools/logger/plugin/view/logger_view.py @@ -22,7 +22,7 @@ Property, Str, cached_property, - on_trait_change, + observe, ) from traitsui.api import View, Group, Item, CodeEditor, TabularEditor, spring from traitsui.tabular_adapter import TabularAdapter @@ -144,8 +144,8 @@ def update(self, force=False): # Private interface ########################################################################### - @on_trait_change("service.preferences.level_") - def _update_log_records(self): + @observe("service.preferences.level_") + def _update_log_records(self, event): self.service.handler._view = self self.update(force=True) From 8d111f6c46e45fe0bdc74351bfae67d8d02d95d3 Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Tue, 30 Mar 2021 15:54:14 -0500 Subject: [PATCH 03/10] update preferences/preference_binding.py --- apptools/preferences/preference_binding.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apptools/preferences/preference_binding.py b/apptools/preferences/preference_binding.py index e07692c6..dacaffae 100644 --- a/apptools/preferences/preference_binding.py +++ b/apptools/preferences/preference_binding.py @@ -69,10 +69,10 @@ def _preferences_default(self): #### Trait change handlers ################################################ - def _on_trait_changed(self, obj, trait_name, old, new): + def _on_trait_changed(self, event): """ Dynamic trait change handler. """ - self.preferences.set(self.preference_path, new) + self.preferences.set(self.preference_path, event.new) #### Other observer pattern listeners ##################################### @@ -121,7 +121,7 @@ def _initialize(self): """ Wire-up trait change handlers etc. """ # Listen for the object's trait being changed. - self.obj.on_trait_change(self._on_trait_changed, self.trait_name) + self.obj.observe(self._on_trait_changed, self.trait_name) # Listen for the preference value being changed. components = self.preference_path.split(".") From f56e19095905c2d4cea7714c06675c9819e9241a Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Tue, 30 Mar 2021 16:01:54 -0500 Subject: [PATCH 04/10] update preferences/tests/test_preference_binding.py --- .../tests/test_preference_binding.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/apptools/preferences/tests/test_preference_binding.py b/apptools/preferences/tests/test_preference_binding.py index adc27514..9808cbc2 100644 --- a/apptools/preferences/tests/test_preference_binding.py +++ b/apptools/preferences/tests/test_preference_binding.py @@ -24,19 +24,20 @@ from apptools.preferences.api import bind_preference from apptools.preferences.api import set_default_preferences from traits.api import Bool, HasTraits, Int, Float, Str +from traits.observation.api import match # This module's package. PKG = "apptools.preferences.tests" -def listener(obj, trait_name, old, new): +def listener(event): """ A useful trait change handler for testing! """ - listener.obj = obj - listener.trait_name = trait_name - listener.old = old - listener.new = new + listener.obj = event.object + listener.trait_name = event.name + listener.old = event.old + listener.new = event.new class PreferenceBindingTestCase(unittest.TestCase): @@ -77,7 +78,7 @@ class AcmeUI(HasTraits): visible = Bool acme_ui = AcmeUI() - acme_ui.on_trait_change(listener) + acme_ui.observe(listener, match(lambda n, t: True)) # Make some bindings. bind_preference(acme_ui, "bgcolor", "acme.ui.bgcolor") @@ -228,7 +229,7 @@ class AcmeUI(HasTraits): visible = Bool acme_ui = AcmeUI() - acme_ui.on_trait_change(listener) + acme_ui.observe(listener, match(lambda n, t: True)) # Create an empty preferences node and use that in some of the # bindings! @@ -267,7 +268,7 @@ def _width_changed(self, trait_name, old, new): self.ratio = 3.0 acme_ui = AcmeUI() - acme_ui.on_trait_change(listener) + acme_ui.observe(listener, match(lambda n, t: True)) # Make some bindings. bind_preference(acme_ui, "bgcolor", "acme.ui.bgcolor") @@ -304,7 +305,7 @@ class AcmeUI(HasTraits): color = Str acme_ui = AcmeUI() - acme_ui.on_trait_change(listener) + acme_ui.observe(listener, match(lambda n, t: True)) # Make some bindings. bind_preference(acme_ui, "color", "acme.ui.bgcolor") From b547353aaca864b6c6b1386be07594739142b035 Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Tue, 30 Mar 2021 16:04:13 -0500 Subject: [PATCH 05/10] update preferences/tests/test_preferences_helper.py --- .../tests/test_preferences_helper.py | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/apptools/preferences/tests/test_preferences_helper.py b/apptools/preferences/tests/test_preferences_helper.py index e89c71f0..1f92545c 100644 --- a/apptools/preferences/tests/test_preferences_helper.py +++ b/apptools/preferences/tests/test_preferences_helper.py @@ -27,22 +27,23 @@ Any, Bool, HasTraits, Int, Float, List, Str, push_exception_handler, pop_exception_handler, ) +from traits.observation.api import match -def width_listener(obj, trait_name, old, new): +def width_listener(event): - width_listener.obj = obj - width_listener.trait_name = trait_name - width_listener.old = old - width_listener.new = new + width_listener.obj = event.object + width_listener.trait_name = event.name + width_listener.old = event.old + width_listener.new = event.new -def bgcolor_listener(obj, trait_name, old, new): +def bgcolor_listener(event): - bgcolor_listener.obj = obj - bgcolor_listener.trait_name = trait_name - bgcolor_listener.old = old - bgcolor_listener.new = new + bgcolor_listener.obj = event.object + bgcolor_listener.trait_name = event.name + bgcolor_listener.old = event.old + bgcolor_listener.new = event.new # This module's package. @@ -105,7 +106,7 @@ class AcmeUIPreferencesHelper(PreferencesHelper): names = List(Str) helper = AcmeUIPreferencesHelper() - helper.on_trait_change(bgcolor_listener) + helper.observe(bgcolor_listener, match(lambda n, t: True)) # Make sure the helper was initialized properly. self.assertEqual("blue", helper.bgcolor) @@ -157,7 +158,7 @@ class AcmeUIPreferencesHelper(PreferencesHelper): names = List(Str) helper = AcmeUIPreferencesHelper(preferences_path="acme.ui") - helper.on_trait_change(bgcolor_listener) + helper.observe(bgcolor_listener, match(lambda n, t: True)) # Make sure the helper was initialized properly. self.assertEqual("blue", helper.bgcolor) @@ -344,7 +345,7 @@ class Widget(HasTraits): background_color = Str w = Widget() - w.on_trait_change(bgcolor_listener) + w.observe(bgcolor_listener, match(lambda n, t: True)) p = self.preferences p.load(self.example) @@ -480,8 +481,8 @@ class AcmeUIPreferencesHelper(PreferencesHelper): helper = AcmeUIPreferencesHelper() # We only listen to some of the traits so the testing is easier. - helper.on_trait_change(width_listener, ["width"]) - helper.on_trait_change(bgcolor_listener, ["bgcolor"]) + helper.observe(width_listener, ["width"]) + helper.observe(bgcolor_listener, ["bgcolor"]) # Create a new preference node. p1 = Preferences() From 52f0bdf6b79707ff0cfcd0a3acc965762e50a5ea Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Tue, 30 Mar 2021 16:05:21 -0500 Subject: [PATCH 06/10] update preferences/ui/widget_editor.py --- apptools/preferences/ui/widget_editor.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apptools/preferences/ui/widget_editor.py b/apptools/preferences/ui/widget_editor.py index 6e6e3f71..0db6a973 100644 --- a/apptools/preferences/ui/widget_editor.py +++ b/apptools/preferences/ui/widget_editor.py @@ -41,7 +41,7 @@ def init(self, parent): self.control = page.create_control(parent) # Listen for the page being changed. - self.object.on_trait_change(self._on_page_changed, "selected_page") + self.object.observe(self._on_page_changed, "selected_page") def dispose(self): """ Dispose of the editor. """ @@ -58,14 +58,14 @@ def update_editor(self): # Private interface. ########################################################################### - def _on_page_changed(self, obj, trait_name, old, new): + def _on_page_changed(self, event): """ Dynamic trait change handler. """ - if old is not None: - old.destroy_control() + if event.old is not None: + event.old.destroy_control() - if new is not None: - self.control = new.create_control(self.parent) + if event.new is not None: + self.control = event.new.create_control(self.parent) class WidgetEditor(EditorFactory): From b3dc8a20991f2e8045845ff5c67fd129c5d4f61a Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Tue, 30 Mar 2021 16:06:32 -0500 Subject: [PATCH 07/10] update scripting/recorder_with_ui.py --- apptools/scripting/recorder_with_ui.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apptools/scripting/recorder_with_ui.py b/apptools/scripting/recorder_with_ui.py index 15f13002..94105b2a 100644 --- a/apptools/scripting/recorder_with_ui.py +++ b/apptools/scripting/recorder_with_ui.py @@ -11,7 +11,7 @@ A Recorder subclass that presents a simple user interface. """ -from traits.api import Code, Button, Int, on_trait_change, Any +from traits.api import Code, Button, Int, observe, Any from traitsui.api import View, Item, Group, HGroup, CodeEditor, spring, Handler from .recorder import Recorder @@ -88,8 +88,8 @@ def on_ui_close(self): ###################################################################### # Non-public interface. ###################################################################### - @on_trait_change("lines[]") - def _update_code(self): + @observe("lines.items") + def _update_code(self, event): self.code = self.get_code() self.current_line = len(self.lines) + 1 From b708922fbd1cbb3cd64b0a1c260b901ff44bb570 Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Wed, 31 Mar 2021 15:07:24 -0500 Subject: [PATCH 08/10] suggested renamings --- apptools/logger/plugin/logger_service.py | 2 +- apptools/preferences/ui/widget_editor.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apptools/logger/plugin/logger_service.py b/apptools/logger/plugin/logger_service.py index c016e8ba..236b15a5 100644 --- a/apptools/logger/plugin/logger_service.py +++ b/apptools/logger/plugin/logger_service.py @@ -171,7 +171,7 @@ def _get_mail_files(self): ) @observe("preferences.level_") - def _level_changed(self, event): + def _use_updated_preferences_level(self, event): new = event.new if ( new is not None diff --git a/apptools/preferences/ui/widget_editor.py b/apptools/preferences/ui/widget_editor.py index 0db6a973..dc3bd638 100644 --- a/apptools/preferences/ui/widget_editor.py +++ b/apptools/preferences/ui/widget_editor.py @@ -41,7 +41,7 @@ def init(self, parent): self.control = page.create_control(parent) # Listen for the page being changed. - self.object.observe(self._on_page_changed, "selected_page") + self.object.observe(self._handle_change_to_selected_page, "selected_page") def dispose(self): """ Dispose of the editor. """ @@ -58,7 +58,7 @@ def update_editor(self): # Private interface. ########################################################################### - def _on_page_changed(self, event): + def _handle_change_to_selected_page(self, event): """ Dynamic trait change handler. """ if event.old is not None: From 3c0abee7128da0db170d3fab85d3203723f3a6ed Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Wed, 31 Mar 2021 15:11:17 -0500 Subject: [PATCH 09/10] use decorator instead of hooking up dynamically --- apptools/preferences/ui/widget_editor.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apptools/preferences/ui/widget_editor.py b/apptools/preferences/ui/widget_editor.py index dc3bd638..2066da3a 100644 --- a/apptools/preferences/ui/widget_editor.py +++ b/apptools/preferences/ui/widget_editor.py @@ -11,7 +11,7 @@ # Enthought library imports. -from traits.api import Any +from traits.api import Any, observe from traitsui.api import EditorFactory from traitsui.toolkit import toolkit_object Editor = toolkit_object('editor:Editor') @@ -40,9 +40,6 @@ def init(self, parent): # Create the editor's control. self.control = page.create_control(parent) - # Listen for the page being changed. - self.object.observe(self._handle_change_to_selected_page, "selected_page") - def dispose(self): """ Dispose of the editor. """ @@ -58,6 +55,7 @@ def update_editor(self): # Private interface. ########################################################################### + @observe("object:selected_page") def _handle_change_to_selected_page(self, event): """ Dynamic trait change handler. """ From 400b9e1900844fde37329866ad11f9c676d2887a Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Thu, 1 Apr 2021 14:46:35 -0500 Subject: [PATCH 10/10] add news fragment --- docs/releases/upcoming/285.feature.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/releases/upcoming/285.feature.rst diff --git a/docs/releases/upcoming/285.feature.rst b/docs/releases/upcoming/285.feature.rst new file mode 100644 index 00000000..43a1cf1f --- /dev/null +++ b/docs/releases/upcoming/285.feature.rst @@ -0,0 +1 @@ +start replacing on_trait_change with observe (#285) \ No newline at end of file