From 8f3d7dfcc060d8ddda6004da8e9117a3c8012a56 Mon Sep 17 00:00:00 2001 From: teknium1 Date: Sat, 14 Mar 2026 09:32:05 -0700 Subject: [PATCH] fix: defer discord adapter annotations Prevent gateway.platforms.discord from crashing at import time when discord.py is unavailable. Python 3.11 eagerly evaluates annotations, so using discord.Interaction and similar annotations caused an AttributeError after the optional import fallback set discord=None. Add postponed annotation evaluation and a regression test covering import without discord installed. --- gateway/platforms/discord.py | 2 ++ tests/gateway/test_discord_imports.py | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 tests/gateway/test_discord_imports.py diff --git a/gateway/platforms/discord.py b/gateway/platforms/discord.py index 0d23407bf..332d83f52 100644 --- a/gateway/platforms/discord.py +++ b/gateway/platforms/discord.py @@ -1,3 +1,5 @@ +from __future__ import annotations + """ Discord platform adapter. diff --git a/tests/gateway/test_discord_imports.py b/tests/gateway/test_discord_imports.py new file mode 100644 index 000000000..bbda79c9e --- /dev/null +++ b/tests/gateway/test_discord_imports.py @@ -0,0 +1,23 @@ +"""Import-safety tests for the Discord gateway adapter.""" + +import builtins +import importlib +import sys + + +class TestDiscordImportSafety: + def test_module_imports_even_when_discord_dependency_is_missing(self, monkeypatch): + original_import = builtins.__import__ + + def fake_import(name, globals=None, locals=None, fromlist=(), level=0): + if name == "discord" or name.startswith("discord."): + raise ImportError("discord unavailable for test") + return original_import(name, globals, locals, fromlist, level) + + monkeypatch.delitem(sys.modules, "gateway.platforms.discord", raising=False) + monkeypatch.setattr(builtins, "__import__", fake_import) + + module = importlib.import_module("gateway.platforms.discord") + + assert module.DISCORD_AVAILABLE is False + assert module.discord is None