From 5d39dec94ea3e5836c5ad407483205bc86aec1ed Mon Sep 17 00:00:00 2001 From: Eridani Date: Fri, 20 Mar 2026 18:11:58 +0800 Subject: [PATCH 1/2] fix(api): avoid OpenSearch import collision with local events package --- api/events/__init__.py | 22 +++++++++++++++++++ .../unit_tests/events/test_events_compat.py | 16 ++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 api/tests/unit_tests/events/test_events_compat.py diff --git a/api/events/__init__.py b/api/events/__init__.py index e69de29bb2..744c833bdf 100644 --- a/api/events/__init__.py +++ b/api/events/__init__.py @@ -0,0 +1,22 @@ +class _EventHook: + def __init__(self): + self._handlers = [] + + def __iadd__(self, handler): + self._handlers.append(handler) + return self + + def __isub__(self, handler): + self._handlers.remove(handler) + return self + + def __call__(self, *args, **kwargs): + for handler in list(self._handlers): + handler(*args, **kwargs) + + +class Events: + def __getattr__(self, name): + hook = _EventHook() + setattr(self, name, hook) + return hook diff --git a/api/tests/unit_tests/events/test_events_compat.py b/api/tests/unit_tests/events/test_events_compat.py new file mode 100644 index 0000000000..a247b05f78 --- /dev/null +++ b/api/tests/unit_tests/events/test_events_compat.py @@ -0,0 +1,16 @@ +def test_local_events_exports_compat_events_class(): + import events + + evt = events.Events() + called = [] + + evt.request_start += lambda *args, **kwargs: called.append((args, kwargs)) + evt.request_start("GET", "/_search") + + assert len(called) == 1 + + +def test_opensearch_import_works_with_local_events_package(): + from opensearchpy import OpenSearch + + assert OpenSearch is not None From 4db6ba1a154a0aa4a91623e771c3036d98fdaddf Mon Sep 17 00:00:00 2001 From: Eridani Date: Sat, 21 Mar 2026 10:31:34 +0800 Subject: [PATCH 2/2] fix(api): make event handler removal more robust --- api/events/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/api/events/__init__.py b/api/events/__init__.py index 744c833bdf..69d9e42f4d 100644 --- a/api/events/__init__.py +++ b/api/events/__init__.py @@ -7,7 +7,10 @@ class _EventHook: return self def __isub__(self, handler): - self._handlers.remove(handler) + try: + self._handlers.remove(handler) + except ValueError: + pass return self def __call__(self, *args, **kwargs):