From e80b7aeda18898da46c63ccb1ada609b9405e8cb Mon Sep 17 00:00:00 2001 From: kshitijk4poor <82637225+kshitijk4poor@users.noreply.github.com> Date: Mon, 3 Aug 2026 17:20:20 +0530 Subject: [PATCH] fix(feishu): test SDK globals by None-ness, not globals() membership MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The no-SDK fallback guards check '"Name" in globals()' — correct on main where a failed module-level import leaves those names undefined, but the deferred-import port pre-binds every SDK name to None, so the guard was always true and the fallback paths called .builder() on None (AttributeError) wherever lark_oapi isn't installed. Local runs passed because lark IS installed here; CI's default env has no feishu extra. Rewrote all 14 guards to 'is not None', which is correct under both conditions. Verified by simulating CI with a lark-blocking meta_path hook: 74 passed, 18 skipped (the skipUnless set), zero failures. --- plugins/platforms/feishu/adapter.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/plugins/platforms/feishu/adapter.py b/plugins/platforms/feishu/adapter.py index 68875d998628a..8c50942042c29 100644 --- a/plugins/platforms/feishu/adapter.py +++ b/plugins/platforms/feishu/adapter.py @@ -5051,19 +5051,19 @@ class FeishuAdapter(BasePlatformAdapter): @staticmethod def _build_get_chat_request(chat_id: str) -> Any: - if "GetChatRequest" in globals(): + if GetChatRequest is not None: return GetChatRequest.builder().chat_id(chat_id).build() return SimpleNamespace(chat_id=chat_id) @staticmethod def _build_get_message_request(message_id: str) -> Any: - if "GetMessageRequest" in globals(): + if GetMessageRequest is not None: return GetMessageRequest.builder().message_id(message_id).build() return SimpleNamespace(message_id=message_id) @staticmethod def _build_message_resource_request(*, message_id: str, file_key: str, resource_type: str) -> Any: - if "GetMessageResourceRequest" in globals(): + if GetMessageResourceRequest is not None: return ( GetMessageResourceRequest.builder() .message_id(message_id) @@ -5075,7 +5075,7 @@ class FeishuAdapter(BasePlatformAdapter): @staticmethod def _build_get_application_request(*, app_id: str, lang: str) -> Any: - if "GetApplicationRequest" in globals(): + if GetApplicationRequest is not None: return ( GetApplicationRequest.builder() .app_id(app_id) @@ -5086,7 +5086,7 @@ class FeishuAdapter(BasePlatformAdapter): @staticmethod def _build_reply_message_body(*, content: str, msg_type: str, reply_in_thread: bool, uuid_value: str) -> Any: - if "ReplyMessageRequestBody" in globals(): + if ReplyMessageRequestBody is not None: return ( ReplyMessageRequestBody.builder() .content(content) @@ -5104,7 +5104,7 @@ class FeishuAdapter(BasePlatformAdapter): @staticmethod def _build_reply_message_request(message_id: str, request_body: Any) -> Any: - if "ReplyMessageRequest" in globals(): + if ReplyMessageRequest is not None: return ( ReplyMessageRequest.builder() .message_id(message_id) @@ -5115,7 +5115,7 @@ class FeishuAdapter(BasePlatformAdapter): @staticmethod def _build_update_message_body(*, msg_type: str, content: str) -> Any: - if "UpdateMessageRequestBody" in globals(): + if UpdateMessageRequestBody is not None: return ( UpdateMessageRequestBody.builder() .msg_type(msg_type) @@ -5126,7 +5126,7 @@ class FeishuAdapter(BasePlatformAdapter): @staticmethod def _build_update_message_request(message_id: str, request_body: Any) -> Any: - if "UpdateMessageRequest" in globals(): + if UpdateMessageRequest is not None: return ( UpdateMessageRequest.builder() .message_id(message_id) @@ -5137,7 +5137,7 @@ class FeishuAdapter(BasePlatformAdapter): @staticmethod def _build_create_message_body(*, receive_id: str, msg_type: str, content: str, uuid_value: str) -> Any: - if "CreateMessageRequestBody" in globals(): + if CreateMessageRequestBody is not None: return ( CreateMessageRequestBody.builder() .receive_id(receive_id) @@ -5155,7 +5155,7 @@ class FeishuAdapter(BasePlatformAdapter): @staticmethod def _build_create_message_request(receive_id_type: str, request_body: Any) -> Any: - if "CreateMessageRequest" in globals(): + if CreateMessageRequest is not None: return ( CreateMessageRequest.builder() .receive_id_type(receive_id_type) @@ -5166,7 +5166,7 @@ class FeishuAdapter(BasePlatformAdapter): @staticmethod def _build_image_upload_body(*, image_type: str, image: Any) -> Any: - if "CreateImageRequestBody" in globals(): + if CreateImageRequestBody is not None: return ( CreateImageRequestBody.builder() .image_type(image_type) @@ -5177,13 +5177,13 @@ class FeishuAdapter(BasePlatformAdapter): @staticmethod def _build_image_upload_request(request_body: Any) -> Any: - if "CreateImageRequest" in globals(): + if CreateImageRequest is not None: return CreateImageRequest.builder().request_body(request_body).build() return SimpleNamespace(request_body=request_body) @staticmethod def _build_file_upload_body(*, file_type: str, file_name: str, file: Any, duration: int = 0) -> Any: - if "CreateFileRequestBody" in globals(): + if CreateFileRequestBody is not None: builder = ( CreateFileRequestBody.builder() .file_type(file_type) @@ -5197,7 +5197,7 @@ class FeishuAdapter(BasePlatformAdapter): @staticmethod def _build_file_upload_request(request_body: Any) -> Any: - if "CreateFileRequest" in globals(): + if CreateFileRequest is not None: return CreateFileRequest.builder().request_body(request_body).build() return SimpleNamespace(request_body=request_body)