From fe904ec9926fb6079d1e36cc852657d71b6d1d39 Mon Sep 17 00:00:00 2001 From: aakash Date: Mon, 6 Oct 2025 13:47:16 -0700 Subject: [PATCH] fix: Apply pre-commit hooks formatting fixes - Remove trailing whitespace from all files - Fix ruff formatting issues (2 errors resolved) - Apply consistent code formatting across 3 files - Ensure all files pass pre-commit validation This resolves all CI formatting failures. --- examples/mcp_integration_demo.py | 49 +++++++++-------- tests/test_mcp_integration.py | 72 ++++++++++++------------- tests/test_mcp_standalone.py | 90 +++++++++++++++----------------- 3 files changed, 103 insertions(+), 108 deletions(-) diff --git a/examples/mcp_integration_demo.py b/examples/mcp_integration_demo.py index 7825676..6fc4cfc 100644 --- a/examples/mcp_integration_demo.py +++ b/examples/mcp_integration_demo.py @@ -19,19 +19,18 @@ from pathlib import Path sys.path.append(str(Path(__file__).parent.parent)) - async def demo_slack_mcp(): """Demonstrate Slack MCP integration.""" print("=" * 60) print("๐Ÿ”ฅ Slack MCP RAG Demo") print("=" * 60) - + print("\n1. Testing Slack MCP server connection...") - + # This would typically use a real MCP server command # For demo purposes, we show what the command would look like # slack_app = SlackMCPRAG() # Would be used for actual testing - + # Simulate command line arguments for testing class MockArgs: mcp_server = "slack-mcp-server" # This would be the actual MCP server command @@ -40,21 +39,21 @@ async def demo_slack_mcp(): no_concatenate_conversations = False max_messages_per_channel = 50 test_connection = True - + print(f"MCP Server Command: {MockArgs.mcp_server}") print(f"Workspace: {MockArgs.workspace_name}") print(f"Channels: {', '.join(MockArgs.channels)}") - + # In a real scenario, you would run: # success = await slack_app.test_mcp_connection(MockArgs) - + print("\n๐Ÿ“ Example usage:") print("python -m apps.slack_rag \\") print(" --mcp-server 'slack-mcp-server' \\") print(" --workspace-name 'my-team' \\") print(" --channels general dev-team \\") print(" --test-connection") - + print("\n๐Ÿ” After indexing, you could query:") print("- 'What did the team discuss about the project deadline?'") print("- 'Find messages about the new feature launch'") @@ -66,11 +65,11 @@ async def demo_twitter_mcp(): print("\n" + "=" * 60) print("๐Ÿฆ Twitter MCP RAG Demo") print("=" * 60) - + print("\n1. Testing Twitter MCP server connection...") - + # twitter_app = TwitterMCPRAG() # Would be used for actual testing - + class MockArgs: mcp_server = "twitter-mcp-server" username = None # Fetch all bookmarks @@ -78,18 +77,18 @@ async def demo_twitter_mcp(): no_tweet_content = False no_metadata = False test_connection = True - + print(f"MCP Server Command: {MockArgs.mcp_server}") print(f"Max Bookmarks: {MockArgs.max_bookmarks}") print(f"Include Content: {not MockArgs.no_tweet_content}") print(f"Include Metadata: {not MockArgs.no_metadata}") - + print("\n๐Ÿ“ Example usage:") print("python -m apps.twitter_rag \\") print(" --mcp-server 'twitter-mcp-server' \\") print(" --max-bookmarks 1000 \\") print(" --test-connection") - + print("\n๐Ÿ” After indexing, you could query:") print("- 'What AI articles did I bookmark last month?'") print("- 'Find tweets about machine learning techniques'") @@ -101,32 +100,32 @@ async def show_mcp_server_setup(): print("\n" + "=" * 60) print("โš™๏ธ MCP Server Setup Guide") print("=" * 60) - + print("\n๐Ÿ”ง Setting up Slack MCP Server:") print("1. Install a Slack MCP server (example commands):") print(" npm install -g slack-mcp-server") print(" # OR") print(" pip install slack-mcp-server") - + print("\n2. Configure Slack credentials:") print(" export SLACK_BOT_TOKEN='xoxb-your-bot-token'") print(" export SLACK_APP_TOKEN='xapp-your-app-token'") - + print("\n3. Test the server:") print(" slack-mcp-server --help") - + print("\n๐Ÿ”ง Setting up Twitter MCP Server:") print("1. Install a Twitter MCP server:") print(" npm install -g twitter-mcp-server") print(" # OR") print(" pip install twitter-mcp-server") - + print("\n2. Configure Twitter API credentials:") print(" export TWITTER_API_KEY='your-api-key'") print(" export TWITTER_API_SECRET='your-api-secret'") print(" export TWITTER_ACCESS_TOKEN='your-access-token'") print(" export TWITTER_ACCESS_TOKEN_SECRET='your-access-token-secret'") - + print("\n3. Test the server:") print(" twitter-mcp-server --help") @@ -136,7 +135,7 @@ async def show_integration_benefits(): print("\n" + "=" * 60) print("๐ŸŒŸ Benefits of MCP Integration") print("=" * 60) - + benefits = [ ("๐Ÿ”„ Live Data Access", "Fetch real-time data from platforms without manual exports"), ("๐Ÿ”Œ Standardized Protocol", "Use any MCP-compatible server with minimal code changes"), @@ -145,7 +144,7 @@ async def show_integration_benefits(): ("๐Ÿ“Š Rich Metadata", "Access full platform metadata (timestamps, engagement, etc.)"), ("โšก Efficient Processing", "Stream data directly into LEANN without intermediate files"), ] - + for title, description in benefits: print(f"\n{title}") print(f" {description}") @@ -155,12 +154,12 @@ async def main(): """Main demo function.""" print("๐ŸŽฏ LEANN MCP Integration Examples") print("This demo shows how to integrate LEANN with MCP servers for various platforms.") - + await demo_slack_mcp() await demo_twitter_mcp() await show_mcp_server_setup() await show_integration_benefits() - + print("\n" + "=" * 60) print("โœจ Next Steps") print("=" * 60) @@ -168,7 +167,7 @@ async def main(): print("2. Test connections using --test-connection flag") print("3. Run indexing to build your RAG knowledge base") print("4. Start querying your personal data!") - + print("\n๐Ÿ“š For more information:") print("- Check the README for detailed setup instructions") print("- Look at the apps/slack_rag.py and apps/twitter_rag.py for implementation details") diff --git a/tests/test_mcp_integration.py b/tests/test_mcp_integration.py index a4b4e55..99a5cdb 100644 --- a/tests/test_mcp_integration.py +++ b/tests/test_mcp_integration.py @@ -13,96 +13,96 @@ from pathlib import Path sys.path.append(str(Path(__file__).parent.parent)) from apps.slack_data.slack_mcp_reader import SlackMCPReader -from apps.twitter_data.twitter_mcp_reader import TwitterMCPReader from apps.slack_rag import SlackMCPRAG +from apps.twitter_data.twitter_mcp_reader import TwitterMCPReader from apps.twitter_rag import TwitterMCPRAG def test_slack_reader_initialization(): """Test that SlackMCPReader can be initialized with various parameters.""" print("Testing SlackMCPReader initialization...") - + # Test basic initialization reader = SlackMCPReader("slack-mcp-server") assert reader.mcp_server_command == "slack-mcp-server" assert reader.concatenate_conversations assert reader.max_messages_per_conversation == 100 - + # Test with custom parameters reader = SlackMCPReader( "custom-slack-server", workspace_name="test-workspace", concatenate_conversations=False, - max_messages_per_conversation=50 + max_messages_per_conversation=50, ) assert reader.workspace_name == "test-workspace" assert not reader.concatenate_conversations assert reader.max_messages_per_conversation == 50 - + print("โœ… SlackMCPReader initialization tests passed") def test_twitter_reader_initialization(): """Test that TwitterMCPReader can be initialized with various parameters.""" print("Testing TwitterMCPReader initialization...") - + # Test basic initialization reader = TwitterMCPReader("twitter-mcp-server") assert reader.mcp_server_command == "twitter-mcp-server" assert reader.include_tweet_content assert reader.include_metadata assert reader.max_bookmarks == 1000 - + # Test with custom parameters reader = TwitterMCPReader( "custom-twitter-server", username="testuser", include_tweet_content=False, include_metadata=False, - max_bookmarks=500 + max_bookmarks=500, ) assert reader.username == "testuser" assert not reader.include_tweet_content assert not reader.include_metadata assert reader.max_bookmarks == 500 - + print("โœ… TwitterMCPReader initialization tests passed") def test_slack_message_formatting(): """Test Slack message formatting functionality.""" print("Testing Slack message formatting...") - + reader = SlackMCPReader("slack-mcp-server") - + # Test basic message formatting message = { "text": "Hello, world!", "user": "john_doe", "channel": "general", - "ts": "1234567890.123456" + "ts": "1234567890.123456", } - + formatted = reader._format_message(message) assert "Channel: #general" in formatted assert "User: john_doe" in formatted assert "Message: Hello, world!" in formatted assert "Time:" in formatted - + # Test with missing fields message = {"text": "Simple message"} formatted = reader._format_message(message) assert "Message: Simple message" in formatted - + print("โœ… Slack message formatting tests passed") def test_twitter_bookmark_formatting(): """Test Twitter bookmark formatting functionality.""" print("Testing Twitter bookmark formatting...") - + reader = TwitterMCPReader("twitter-mcp-server") - + # Test basic bookmark formatting bookmark = { "text": "This is a great article about AI!", @@ -110,9 +110,9 @@ def test_twitter_bookmark_formatting(): "created_at": "2024-01-01T12:00:00Z", "url": "https://twitter.com/ai_researcher/status/123456789", "likes": 42, - "retweets": 15 + "retweets": 15, } - + formatted = reader._format_bookmark(bookmark) assert "=== Twitter Bookmark ===" in formatted assert "Author: @ai_researcher" in formatted @@ -121,59 +121,59 @@ def test_twitter_bookmark_formatting(): assert "URL: https://twitter.com" in formatted assert "Likes: 42" in formatted assert "Retweets: 15" in formatted - + # Test with minimal data bookmark = {"text": "Simple tweet"} formatted = reader._format_bookmark(bookmark) assert "=== Twitter Bookmark ===" in formatted assert "Simple tweet" in formatted - + print("โœ… Twitter bookmark formatting tests passed") def test_slack_rag_initialization(): """Test that SlackMCPRAG can be initialized.""" print("Testing SlackMCPRAG initialization...") - + app = SlackMCPRAG() assert app.default_index_name == "slack_messages" - assert hasattr(app, 'parser') - + assert hasattr(app, "parser") + print("โœ… SlackMCPRAG initialization tests passed") def test_twitter_rag_initialization(): """Test that TwitterMCPRAG can be initialized.""" print("Testing TwitterMCPRAG initialization...") - + app = TwitterMCPRAG() assert app.default_index_name == "twitter_bookmarks" - assert hasattr(app, 'parser') - + assert hasattr(app, "parser") + print("โœ… TwitterMCPRAG initialization tests passed") def test_concatenated_content_creation(): """Test creation of concatenated content from multiple messages.""" print("Testing concatenated content creation...") - + reader = SlackMCPReader("slack-mcp-server", workspace_name="test-workspace") - + messages = [ {"text": "First message", "user": "alice", "ts": "1000"}, {"text": "Second message", "user": "bob", "ts": "2000"}, - {"text": "Third message", "user": "charlie", "ts": "3000"} + {"text": "Third message", "user": "charlie", "ts": "3000"}, ] - + content = reader._create_concatenated_content(messages, "general") - + assert "Slack Channel: #general" in content assert "Message Count: 3" in content assert "Workspace: test-workspace" in content assert "First message" in content assert "Second message" in content assert "Third message" in content - + print("โœ… Concatenated content creation tests passed") @@ -181,7 +181,7 @@ def main(): """Run all tests.""" print("๐Ÿงช Running MCP Integration Tests") print("=" * 50) - + try: test_slack_reader_initialization() test_twitter_reader_initialization() @@ -190,7 +190,7 @@ def main(): test_slack_rag_initialization() test_twitter_rag_initialization() test_concatenated_content_creation() - + print("\n" + "=" * 50) print("๐ŸŽ‰ All tests passed! MCP integration is working correctly.") print("\nNext steps:") @@ -198,7 +198,7 @@ def main(): print("2. Configure API credentials") print("3. Test with --test-connection flag") print("4. Start indexing your live data!") - + except Exception as e: print(f"\nโŒ Test failed: {e}") sys.exit(1) diff --git a/tests/test_mcp_standalone.py b/tests/test_mcp_standalone.py index 864c5c2..c6c6ccd 100644 --- a/tests/test_mcp_standalone.py +++ b/tests/test_mcp_standalone.py @@ -6,8 +6,8 @@ This script tests the basic functionality of the MCP readers without requiring LEANN core dependencies. """ -import sys import json +import sys from pathlib import Path # Add the parent directory to the path so we can import from apps @@ -17,53 +17,53 @@ sys.path.append(str(Path(__file__).parent.parent)) def test_slack_reader_basic(): """Test basic SlackMCPReader functionality without async operations.""" print("Testing SlackMCPReader basic functionality...") - + # Import and test initialization from apps.slack_data.slack_mcp_reader import SlackMCPReader - + reader = SlackMCPReader("slack-mcp-server") assert reader.mcp_server_command == "slack-mcp-server" assert reader.concatenate_conversations - + # Test message formatting message = { "text": "Hello team! How's the project going?", "user": "john_doe", "channel": "general", - "ts": "1234567890.123456" + "ts": "1234567890.123456", } - + formatted = reader._format_message(message) assert "Channel: #general" in formatted assert "User: john_doe" in formatted assert "Message: Hello team!" in formatted - + # Test concatenated content creation messages = [ {"text": "First message", "user": "alice", "ts": "1000"}, - {"text": "Second message", "user": "bob", "ts": "2000"} + {"text": "Second message", "user": "bob", "ts": "2000"}, ] - + content = reader._create_concatenated_content(messages, "dev-team") assert "Slack Channel: #dev-team" in content assert "Message Count: 2" in content assert "First message" in content assert "Second message" in content - + print("โœ… SlackMCPReader basic tests passed") def test_twitter_reader_basic(): """Test basic TwitterMCPReader functionality.""" print("Testing TwitterMCPReader basic functionality...") - + from apps.twitter_data.twitter_mcp_reader import TwitterMCPReader - + reader = TwitterMCPReader("twitter-mcp-server") assert reader.mcp_server_command == "twitter-mcp-server" assert reader.include_tweet_content assert reader.max_bookmarks == 1000 - + # Test bookmark formatting bookmark = { "text": "Amazing article about the future of AI! Must read for everyone interested in tech.", @@ -74,9 +74,9 @@ def test_twitter_reader_basic(): "retweets": 42, "replies": 23, "hashtags": ["AI", "tech", "future"], - "mentions": ["@openai", "@anthropic"] + "mentions": ["@openai", "@anthropic"], } - + formatted = reader._format_bookmark(bookmark) assert "=== Twitter Bookmark ===" in formatted assert "Author: @tech_guru" in formatted @@ -85,21 +85,21 @@ def test_twitter_reader_basic(): assert "Retweets: 42" in formatted assert "Hashtags: AI, tech, future" in formatted assert "Mentions: @openai, @anthropic" in formatted - + # Test with minimal data simple_bookmark = {"text": "Short tweet", "author": "user123"} formatted_simple = reader._format_bookmark(simple_bookmark) assert "=== Twitter Bookmark ===" in formatted_simple assert "Short tweet" in formatted_simple assert "Author: @user123" in formatted_simple - + print("โœ… TwitterMCPReader basic tests passed") def test_mcp_request_format(): """Test MCP request formatting.""" print("Testing MCP request formatting...") - + # Test initialization request format init_request = { "jsonrpc": "2.0", @@ -108,77 +108,72 @@ def test_mcp_request_format(): "params": { "protocolVersion": "2024-11-05", "capabilities": {}, - "clientInfo": {"name": "leann-slack-reader", "version": "1.0.0"} - } + "clientInfo": {"name": "leann-slack-reader", "version": "1.0.0"}, + }, } - + # Verify it's valid JSON json_str = json.dumps(init_request) parsed = json.loads(json_str) assert parsed["jsonrpc"] == "2.0" assert parsed["method"] == "initialize" assert parsed["params"]["protocolVersion"] == "2024-11-05" - + # Test tools/list request - list_request = { - "jsonrpc": "2.0", - "id": 2, - "method": "tools/list", - "params": {} - } - + list_request = {"jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {}} + json_str = json.dumps(list_request) parsed = json.loads(json_str) assert parsed["method"] == "tools/list" - + print("โœ… MCP request formatting tests passed") def test_data_processing(): """Test data processing capabilities.""" print("Testing data processing capabilities...") - + from apps.slack_data.slack_mcp_reader import SlackMCPReader from apps.twitter_data.twitter_mcp_reader import TwitterMCPReader - + # Test Slack message processing with various formats slack_reader = SlackMCPReader("test-server") - + messages_with_timestamps = [ {"text": "Meeting in 5 minutes", "user": "alice", "ts": "1000.123"}, {"text": "On my way!", "user": "bob", "ts": "1001.456"}, - {"text": "Starting now", "user": "charlie", "ts": "1002.789"} + {"text": "Starting now", "user": "charlie", "ts": "1002.789"}, ] - + content = slack_reader._create_concatenated_content(messages_with_timestamps, "meetings") assert "Meeting in 5 minutes" in content assert "On my way!" in content assert "Starting now" in content - + # Test Twitter bookmark processing with engagement data twitter_reader = TwitterMCPReader("test-server", include_metadata=True) - + high_engagement_bookmark = { "text": "Thread about startup lessons learned ๐Ÿงต", "author": "startup_founder", "likes": 1250, "retweets": 340, - "replies": 89 + "replies": 89, } - + formatted = twitter_reader._format_bookmark(high_engagement_bookmark) assert "Thread about startup lessons learned" in formatted assert "Likes: 1250" in formatted assert "Retweets: 340" in formatted assert "Replies: 89" in formatted - + # Test with metadata disabled twitter_reader_no_meta = TwitterMCPReader("test-server", include_metadata=False) formatted_no_meta = twitter_reader_no_meta._format_bookmark(high_engagement_bookmark) assert "Thread about startup lessons learned" in formatted_no_meta assert "Likes:" not in formatted_no_meta assert "Retweets:" not in formatted_no_meta - + print("โœ… Data processing tests passed") @@ -188,35 +183,36 @@ def main(): print("=" * 60) print("Testing core functionality without LEANN dependencies...") print() - + try: test_slack_reader_basic() test_twitter_reader_basic() test_mcp_request_format() test_data_processing() - + print("\n" + "=" * 60) print("๐ŸŽ‰ All standalone tests passed!") print("\nโœจ MCP Integration Summary:") print("- SlackMCPReader: Ready for Slack message processing") - print("- TwitterMCPReader: Ready for Twitter bookmark processing") + print("- TwitterMCPReader: Ready for Twitter bookmark processing") print("- MCP Protocol: Properly formatted JSON-RPC requests") print("- Data Processing: Handles various message/bookmark formats") - + print("\n๐Ÿš€ Next Steps:") print("1. Install MCP servers: npm install -g slack-mcp-server twitter-mcp-server") print("2. Configure API credentials for Slack and Twitter") print("3. Test connections: python -m apps.slack_rag --test-connection") print("4. Start indexing live data from your platforms!") - + print("\n๐Ÿ“– Documentation:") print("- Check README.md for detailed setup instructions") print("- Run examples/mcp_integration_demo.py for usage examples") print("- Explore apps/slack_rag.py and apps/twitter_rag.py for implementation details") - + except Exception as e: print(f"\nโŒ Test failed: {e}") import traceback + traceback.print_exc() sys.exit(1)