Skip to main content
Glama

Mnemosyne MCP

by MumuTW
ast_parsing_poc.py8.71 kB
""" Tree-sitter AST 解析 POC 測試 - 簡化版 基於專家建議的 Tree-sitter S-expression 查詢功能驗證,使用 Mock 實作進行概念驗證。 """ import asyncio from typing import List, Tuple class MockTreeSitterNode: """Tree-sitter Node 的 Mock 實作""" def __init__(self, text: str, type_name: str, line: int = 1): self._text = text self._type = type_name self._line = line @property def text(self) -> bytes: return self._text.encode("utf-8") @property def type(self) -> str: return self._type @property def start_point(self) -> Tuple[int, int]: return (self._line, 0) class MockTreeSitterQuery: """Tree-sitter Query 的 Mock 實作""" def __init__(self, query_text: str): self.query_text = query_text def captures(self, root_node) -> List[Tuple[MockTreeSitterNode, str]]: """模擬查詢捕獲""" results = [] if "function_definition" in self.query_text: # 模擬函數定義捕獲 results.extend( [ ( MockTreeSitterNode("connect_to_database", "identifier", 2), "function_name", ), (MockTreeSitterNode("get_user", "identifier", 6), "method_name"), (MockTreeSitterNode("update_user", "identifier", 9), "method_name"), ( MockTreeSitterNode("process_data", "identifier", 12), "function_name", ), ] ) if "import_statement" in self.query_text: # 模擬導入語句捕獲 results.extend( [ (MockTreeSitterNode("os", "dotted_name", 1), "import_name"), (MockTreeSitterNode("sys", "dotted_name", 2), "import_name"), (MockTreeSitterNode("typing", "dotted_name", 3), "module_name"), (MockTreeSitterNode("List", "dotted_name", 3), "imported_name"), (MockTreeSitterNode("Dict", "dotted_name", 3), "imported_name"), ] ) if "class_definition" in self.query_text: # 模擬類定義捕獲 results.extend( [ (MockTreeSitterNode("UserService", "identifier", 5), "class_name"), ( MockTreeSitterNode("DatabaseManager", "identifier", 15), "class_name", ), ] ) if "call" in self.query_text and "eval" in self.query_text: # 模擬危險函數調用捕獲 results.extend( [ (MockTreeSitterNode("eval", "identifier", 8), "function_name"), (MockTreeSitterNode("exec", "identifier", 11), "function_name"), ] ) return results async def test_function_extraction(): """函數提取測試""" print("🔍 測試函數提取...") _code = """ def connect_to_database(host, port): '''建立資料庫連線''' return Database(host, port) class UserService: def get_user(self, user_id): return self.db.query(user_id) def update_user(self, user_id, data): return self.db.update(user_id, data) def process_data(data): return data.strip().lower() """ # S-expression 查詢語句 query_text = """ (function_definition name: (identifier) @function_name parameters: (parameters) @params body: (block) @body ) (class_definition name: (identifier) @class_name body: (block (function_definition name: (identifier) @method_name ) @method ) ) """ query = MockTreeSitterQuery(query_text) captures = query.captures(None) # Mock 不需要實際的根節點 # 提取結果 functions = [] methods = [] classes = [] for node, capture_name in captures: text = node.text.decode() if capture_name == "function_name": functions.append(text) elif capture_name == "method_name": methods.append(text) elif capture_name == "class_name": classes.append(text) print("📊 提取結果:") print(f" - 函數: {functions}") print(f" - 方法: {methods}") print(f" - 類別: {classes}") # 驗證結果 expected_functions = ["connect_to_database", "process_data"] expected_methods = ["get_user", "update_user"] functions_found = any(f in functions for f in expected_functions) methods_found = any(m in methods for m in expected_methods) if functions_found and methods_found: print("✅ 函數和方法提取成功") return True else: print("⚠️ 部分提取結果不符合預期") return False async def test_import_analysis(): """導入分析測試""" print("📦 測試導入分析...") _code = """ import os import sys from typing import List, Dict, Optional from src.database import Database, Connection """ query_text = """ (import_statement name: (dotted_name) @import_name ) (import_from_statement module_name: (dotted_name) @module_name name: (import_list (dotted_name) @imported_name ) ) """ query = MockTreeSitterQuery(query_text) captures = query.captures(None) imports = [] modules = [] imported_names = [] for node, capture_name in captures: text = node.text.decode() if capture_name == "import_name": imports.append(text) elif capture_name == "module_name": modules.append(text) elif capture_name == "imported_name": imported_names.append(text) print("📊 導入分析結果:") print(f" - 直接導入: {imports}") print(f" - 模組: {modules}") print(f" - 導入名稱: {imported_names}") # 驗證結果 expected_imports = ["os", "sys"] expected_names = ["List", "Dict"] imports_found = any(i in imports for i in expected_imports) names_found = any(n in imported_names for n in expected_names) if imports_found and names_found: print("✅ 導入分析成功") return True else: print("⚠️ 導入分析結果不完整") return False async def test_constraint_pattern_matching(): """約束模式匹配測試""" print("🎯 測試約束模式匹配...") _code = """ def dangerous_function(): # 危險的 eval 調用 result = eval("1 + 1") # 危險的 exec 調用 exec("print('hello')") # 安全的調用 safe_result = int("123") return safe_result """ # 查詢危險函數調用 query_text = """ (call function: (identifier) @function_name (#match? @function_name "^(eval|exec|compile)$") ) """ query = MockTreeSitterQuery(query_text) captures = query.captures(None) dangerous_calls = [] for node, capture_name in captures: text = node.text.decode() dangerous_calls.append((capture_name, text)) print("📊 危險函數檢測結果:") print(f" - 發現危險調用: {dangerous_calls}") if len(dangerous_calls) > 0: print("✅ 成功檢測到危險函數調用") return True else: print("⚠️ 未檢測到預期的危險調用") return False async def run_ast_parsing_poc(): """運行 AST 解析 POC 測試""" print("🚀 開始 Tree-sitter AST 解析 POC 測試") print("=" * 50) print("🔧 使用 Mock Tree-sitter 進行 POC 測試") tests = [ test_function_extraction, test_import_analysis, test_constraint_pattern_matching, ] results = [] for test in tests: try: result = await test() results.append(result) print() except Exception as e: print(f"❌ 測試失敗: {e}") results.append(False) # 總結 passed = sum(results) total = len(results) print("=" * 50) print(f"📊 POC 測試總結: {passed}/{total} 通過") if passed == total: print("🎉 所有測試通過!Tree-sitter AST 解析 POC 成功") print("💡 建議: 在實際實作中使用 tree-sitter-python 和 S-expression 查詢") else: print("⚠️ 部分測試失敗,需要進一步調查") return passed == total if __name__ == "__main__": result = asyncio.run(run_ast_parsing_poc()) exit(0 if result else 1)

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/MumuTW/Mnemosyne-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server