Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace on_trait_change with observe #285

Merged
merged 10 commits into from
Apr 1, 2021
7 changes: 4 additions & 3 deletions apptools/logger/plugin/logger_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
List,
Property,
Undefined,
on_trait_change,
observe,
)

root_logger = logging.getLogger()
Expand Down Expand Up @@ -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 _use_updated_preferences_level(self, event):
new = event.new
if (
new is not None
and new is not Undefined
Expand Down
6 changes: 3 additions & 3 deletions apptools/logger/plugin/view/logger_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)

Expand Down
6 changes: 3 additions & 3 deletions apptools/preferences/preference_binding.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 #####################################

Expand Down Expand Up @@ -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)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks like we don't have a good place to unhook this listener

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah I noticed this as well... not sure what the best thing to do is


# Listen for the preference value being changed.
components = self.preference_path.split(".")
Expand Down
19 changes: 10 additions & 9 deletions apptools/preferences/tests/test_preference_binding.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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!
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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")
Expand Down
31 changes: 16 additions & 15 deletions apptools/preferences/tests/test_preferences_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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()
Expand Down
16 changes: 7 additions & 9 deletions apptools/preferences/ui/widget_editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down Expand Up @@ -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.on_trait_change(self._on_page_changed, "selected_page")

def dispose(self):
""" Dispose of the editor. """

Expand All @@ -58,14 +55,15 @@ def update_editor(self):
# Private interface.
###########################################################################

def _on_page_changed(self, obj, trait_name, old, new):
@observe("object:selected_page")
def _handle_change_to_selected_page(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):
Expand Down
6 changes: 3 additions & 3 deletions apptools/scripting/recorder_with_ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions docs/releases/upcoming/285.feature.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
start replacing on_trait_change with observe (#285)