diff --git a/.github/workflows/run-traits-tests.yml b/.github/workflows/run-traits-tests.yml index ecccb2a5f..35bd438e8 100644 --- a/.github/workflows/run-traits-tests.yml +++ b/.github/workflows/run-traits-tests.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] - python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] runs-on: ${{ matrix.os }} diff --git a/.github/workflows/test-from-pypi.yml b/.github/workflows/test-from-pypi.yml index fe0d4c60a..f62d0e3b4 100644 --- a/.github/workflows/test-from-pypi.yml +++ b/.github/workflows/test-from-pypi.yml @@ -10,7 +10,7 @@ jobs: test-pypi-sdist: strategy: matrix: - python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] platform: - os: ubuntu-latest architecture: x64 @@ -44,7 +44,7 @@ jobs: test-pypi-wheel: strategy: matrix: - python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] platform: - os: ubuntu-latest architecture: x64 diff --git a/CHANGES.rst b/CHANGES.rst index 3dbd57b99..6b17ab17c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,24 @@ Traits CHANGELOG ================ +Release 7.0.2 +------------- + +Released: 2025-01-24 + +This is a bugfix release of the Traits package that fixes an interoperability +issue with Pyface (a regression since Traits 6.4.3). + +Fixes +~~~~~ +* Make ``traits.trait_notifiers.ui_handler`` public again, since + Pyface relies on importing it directly. (#1827) + +Build +~~~~~ +* Include Python 3.13 in all test workflows. (#1826) + + Release 7.0.1 ------------- diff --git a/setup.py b/setup.py index 6cdca078f..8028c4eae 100644 --- a/setup.py +++ b/setup.py @@ -20,7 +20,7 @@ # into the package source. MAJOR = 7 MINOR = 0 -MICRO = 1 +MICRO = 2 PRERELEASE = "" IS_RELEASED = True diff --git a/traits/trait_notifiers.py b/traits/trait_notifiers.py index ab7143d9e..3a8a94b2f 100644 --- a/traits/trait_notifiers.py +++ b/traits/trait_notifiers.py @@ -29,31 +29,33 @@ # The currently active handler for notifications that must be run on the UI # thread, or None if no handler has been set. -_ui_handler = None +# Note: the Pyface library current accesses the `ui_handler` attribute +# directly, so we can't make it private yet. +ui_handler = None def get_ui_handler(): """ Return the current user interface thread handler. """ - return _ui_handler + return ui_handler def set_ui_handler(handler): """ Sets up the user interface thread handler. """ - global _ui_handler + global ui_handler - _ui_handler = handler + ui_handler = handler def ui_dispatch(handler, *args, **kw): if threading.current_thread() == threading.main_thread(): handler(*args, **kw) - elif _ui_handler is None: + elif ui_handler is None: raise RuntimeError("no UI handler registered for dispatch='ui'") else: - _ui_handler(handler, *args, **kw) + ui_handler(handler, *args, **kw) class NotificationExceptionHandlerState(object): @@ -616,10 +618,10 @@ class FastUITraitChangeNotifyWrapper(TraitChangeNotifyWrapper): def dispatch(self, handler, *args): if threading.current_thread() == threading.main_thread(): handler(*args) - elif _ui_handler is None: + elif ui_handler is None: raise RuntimeError("no UI handler registered for dispatch='ui'") else: - _ui_handler(handler, *args) + ui_handler(handler, *args) class NewTraitChangeNotifyWrapper(TraitChangeNotifyWrapper):