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.
This commit is contained in:
aakash
2025-10-06 13:47:16 -07:00
parent d2432b45f6
commit fe904ec992
3 changed files with 103 additions and 108 deletions

View File

@@ -19,19 +19,18 @@ from pathlib import Path
sys.path.append(str(Path(__file__).parent.parent)) sys.path.append(str(Path(__file__).parent.parent))
async def demo_slack_mcp(): async def demo_slack_mcp():
"""Demonstrate Slack MCP integration.""" """Demonstrate Slack MCP integration."""
print("=" * 60) print("=" * 60)
print("🔥 Slack MCP RAG Demo") print("🔥 Slack MCP RAG Demo")
print("=" * 60) print("=" * 60)
print("\n1. Testing Slack MCP server connection...") print("\n1. Testing Slack MCP server connection...")
# This would typically use a real MCP server command # This would typically use a real MCP server command
# For demo purposes, we show what the command would look like # For demo purposes, we show what the command would look like
# slack_app = SlackMCPRAG() # Would be used for actual testing # slack_app = SlackMCPRAG() # Would be used for actual testing
# Simulate command line arguments for testing # Simulate command line arguments for testing
class MockArgs: class MockArgs:
mcp_server = "slack-mcp-server" # This would be the actual MCP server command 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 no_concatenate_conversations = False
max_messages_per_channel = 50 max_messages_per_channel = 50
test_connection = True test_connection = True
print(f"MCP Server Command: {MockArgs.mcp_server}") print(f"MCP Server Command: {MockArgs.mcp_server}")
print(f"Workspace: {MockArgs.workspace_name}") print(f"Workspace: {MockArgs.workspace_name}")
print(f"Channels: {', '.join(MockArgs.channels)}") print(f"Channels: {', '.join(MockArgs.channels)}")
# In a real scenario, you would run: # In a real scenario, you would run:
# success = await slack_app.test_mcp_connection(MockArgs) # success = await slack_app.test_mcp_connection(MockArgs)
print("\n📝 Example usage:") print("\n📝 Example usage:")
print("python -m apps.slack_rag \\") print("python -m apps.slack_rag \\")
print(" --mcp-server 'slack-mcp-server' \\") print(" --mcp-server 'slack-mcp-server' \\")
print(" --workspace-name 'my-team' \\") print(" --workspace-name 'my-team' \\")
print(" --channels general dev-team \\") print(" --channels general dev-team \\")
print(" --test-connection") print(" --test-connection")
print("\n🔍 After indexing, you could query:") print("\n🔍 After indexing, you could query:")
print("- 'What did the team discuss about the project deadline?'") print("- 'What did the team discuss about the project deadline?'")
print("- 'Find messages about the new feature launch'") print("- 'Find messages about the new feature launch'")
@@ -66,11 +65,11 @@ async def demo_twitter_mcp():
print("\n" + "=" * 60) print("\n" + "=" * 60)
print("🐦 Twitter MCP RAG Demo") print("🐦 Twitter MCP RAG Demo")
print("=" * 60) print("=" * 60)
print("\n1. Testing Twitter MCP server connection...") print("\n1. Testing Twitter MCP server connection...")
# twitter_app = TwitterMCPRAG() # Would be used for actual testing # twitter_app = TwitterMCPRAG() # Would be used for actual testing
class MockArgs: class MockArgs:
mcp_server = "twitter-mcp-server" mcp_server = "twitter-mcp-server"
username = None # Fetch all bookmarks username = None # Fetch all bookmarks
@@ -78,18 +77,18 @@ async def demo_twitter_mcp():
no_tweet_content = False no_tweet_content = False
no_metadata = False no_metadata = False
test_connection = True test_connection = True
print(f"MCP Server Command: {MockArgs.mcp_server}") print(f"MCP Server Command: {MockArgs.mcp_server}")
print(f"Max Bookmarks: {MockArgs.max_bookmarks}") print(f"Max Bookmarks: {MockArgs.max_bookmarks}")
print(f"Include Content: {not MockArgs.no_tweet_content}") print(f"Include Content: {not MockArgs.no_tweet_content}")
print(f"Include Metadata: {not MockArgs.no_metadata}") print(f"Include Metadata: {not MockArgs.no_metadata}")
print("\n📝 Example usage:") print("\n📝 Example usage:")
print("python -m apps.twitter_rag \\") print("python -m apps.twitter_rag \\")
print(" --mcp-server 'twitter-mcp-server' \\") print(" --mcp-server 'twitter-mcp-server' \\")
print(" --max-bookmarks 1000 \\") print(" --max-bookmarks 1000 \\")
print(" --test-connection") print(" --test-connection")
print("\n🔍 After indexing, you could query:") print("\n🔍 After indexing, you could query:")
print("- 'What AI articles did I bookmark last month?'") print("- 'What AI articles did I bookmark last month?'")
print("- 'Find tweets about machine learning techniques'") print("- 'Find tweets about machine learning techniques'")
@@ -101,32 +100,32 @@ async def show_mcp_server_setup():
print("\n" + "=" * 60) print("\n" + "=" * 60)
print("⚙️ MCP Server Setup Guide") print("⚙️ MCP Server Setup Guide")
print("=" * 60) print("=" * 60)
print("\n🔧 Setting up Slack MCP Server:") print("\n🔧 Setting up Slack MCP Server:")
print("1. Install a Slack MCP server (example commands):") print("1. Install a Slack MCP server (example commands):")
print(" npm install -g slack-mcp-server") print(" npm install -g slack-mcp-server")
print(" # OR") print(" # OR")
print(" pip install slack-mcp-server") print(" pip install slack-mcp-server")
print("\n2. Configure Slack credentials:") print("\n2. Configure Slack credentials:")
print(" export SLACK_BOT_TOKEN='xoxb-your-bot-token'") print(" export SLACK_BOT_TOKEN='xoxb-your-bot-token'")
print(" export SLACK_APP_TOKEN='xapp-your-app-token'") print(" export SLACK_APP_TOKEN='xapp-your-app-token'")
print("\n3. Test the server:") print("\n3. Test the server:")
print(" slack-mcp-server --help") print(" slack-mcp-server --help")
print("\n🔧 Setting up Twitter MCP Server:") print("\n🔧 Setting up Twitter MCP Server:")
print("1. Install a Twitter MCP server:") print("1. Install a Twitter MCP server:")
print(" npm install -g twitter-mcp-server") print(" npm install -g twitter-mcp-server")
print(" # OR") print(" # OR")
print(" pip install twitter-mcp-server") print(" pip install twitter-mcp-server")
print("\n2. Configure Twitter API credentials:") print("\n2. Configure Twitter API credentials:")
print(" export TWITTER_API_KEY='your-api-key'") print(" export TWITTER_API_KEY='your-api-key'")
print(" export TWITTER_API_SECRET='your-api-secret'") print(" export TWITTER_API_SECRET='your-api-secret'")
print(" export TWITTER_ACCESS_TOKEN='your-access-token'") print(" export TWITTER_ACCESS_TOKEN='your-access-token'")
print(" export TWITTER_ACCESS_TOKEN_SECRET='your-access-token-secret'") print(" export TWITTER_ACCESS_TOKEN_SECRET='your-access-token-secret'")
print("\n3. Test the server:") print("\n3. Test the server:")
print(" twitter-mcp-server --help") print(" twitter-mcp-server --help")
@@ -136,7 +135,7 @@ async def show_integration_benefits():
print("\n" + "=" * 60) print("\n" + "=" * 60)
print("🌟 Benefits of MCP Integration") print("🌟 Benefits of MCP Integration")
print("=" * 60) print("=" * 60)
benefits = [ benefits = [
("🔄 Live Data Access", "Fetch real-time data from platforms without manual exports"), ("🔄 Live Data Access", "Fetch real-time data from platforms without manual exports"),
("🔌 Standardized Protocol", "Use any MCP-compatible server with minimal code changes"), ("🔌 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.)"), ("📊 Rich Metadata", "Access full platform metadata (timestamps, engagement, etc.)"),
("⚡ Efficient Processing", "Stream data directly into LEANN without intermediate files"), ("⚡ Efficient Processing", "Stream data directly into LEANN without intermediate files"),
] ]
for title, description in benefits: for title, description in benefits:
print(f"\n{title}") print(f"\n{title}")
print(f" {description}") print(f" {description}")
@@ -155,12 +154,12 @@ async def main():
"""Main demo function.""" """Main demo function."""
print("🎯 LEANN MCP Integration Examples") print("🎯 LEANN MCP Integration Examples")
print("This demo shows how to integrate LEANN with MCP servers for various platforms.") print("This demo shows how to integrate LEANN with MCP servers for various platforms.")
await demo_slack_mcp() await demo_slack_mcp()
await demo_twitter_mcp() await demo_twitter_mcp()
await show_mcp_server_setup() await show_mcp_server_setup()
await show_integration_benefits() await show_integration_benefits()
print("\n" + "=" * 60) print("\n" + "=" * 60)
print("✨ Next Steps") print("✨ Next Steps")
print("=" * 60) print("=" * 60)
@@ -168,7 +167,7 @@ async def main():
print("2. Test connections using --test-connection flag") print("2. Test connections using --test-connection flag")
print("3. Run indexing to build your RAG knowledge base") print("3. Run indexing to build your RAG knowledge base")
print("4. Start querying your personal data!") print("4. Start querying your personal data!")
print("\n📚 For more information:") print("\n📚 For more information:")
print("- Check the README for detailed setup instructions") print("- Check the README for detailed setup instructions")
print("- Look at the apps/slack_rag.py and apps/twitter_rag.py for implementation details") print("- Look at the apps/slack_rag.py and apps/twitter_rag.py for implementation details")

View File

@@ -13,96 +13,96 @@ from pathlib import Path
sys.path.append(str(Path(__file__).parent.parent)) sys.path.append(str(Path(__file__).parent.parent))
from apps.slack_data.slack_mcp_reader import SlackMCPReader 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.slack_rag import SlackMCPRAG
from apps.twitter_data.twitter_mcp_reader import TwitterMCPReader
from apps.twitter_rag import TwitterMCPRAG from apps.twitter_rag import TwitterMCPRAG
def test_slack_reader_initialization(): def test_slack_reader_initialization():
"""Test that SlackMCPReader can be initialized with various parameters.""" """Test that SlackMCPReader can be initialized with various parameters."""
print("Testing SlackMCPReader initialization...") print("Testing SlackMCPReader initialization...")
# Test basic initialization # Test basic initialization
reader = SlackMCPReader("slack-mcp-server") reader = SlackMCPReader("slack-mcp-server")
assert reader.mcp_server_command == "slack-mcp-server" assert reader.mcp_server_command == "slack-mcp-server"
assert reader.concatenate_conversations assert reader.concatenate_conversations
assert reader.max_messages_per_conversation == 100 assert reader.max_messages_per_conversation == 100
# Test with custom parameters # Test with custom parameters
reader = SlackMCPReader( reader = SlackMCPReader(
"custom-slack-server", "custom-slack-server",
workspace_name="test-workspace", workspace_name="test-workspace",
concatenate_conversations=False, concatenate_conversations=False,
max_messages_per_conversation=50 max_messages_per_conversation=50,
) )
assert reader.workspace_name == "test-workspace" assert reader.workspace_name == "test-workspace"
assert not reader.concatenate_conversations assert not reader.concatenate_conversations
assert reader.max_messages_per_conversation == 50 assert reader.max_messages_per_conversation == 50
print("✅ SlackMCPReader initialization tests passed") print("✅ SlackMCPReader initialization tests passed")
def test_twitter_reader_initialization(): def test_twitter_reader_initialization():
"""Test that TwitterMCPReader can be initialized with various parameters.""" """Test that TwitterMCPReader can be initialized with various parameters."""
print("Testing TwitterMCPReader initialization...") print("Testing TwitterMCPReader initialization...")
# Test basic initialization # Test basic initialization
reader = TwitterMCPReader("twitter-mcp-server") reader = TwitterMCPReader("twitter-mcp-server")
assert reader.mcp_server_command == "twitter-mcp-server" assert reader.mcp_server_command == "twitter-mcp-server"
assert reader.include_tweet_content assert reader.include_tweet_content
assert reader.include_metadata assert reader.include_metadata
assert reader.max_bookmarks == 1000 assert reader.max_bookmarks == 1000
# Test with custom parameters # Test with custom parameters
reader = TwitterMCPReader( reader = TwitterMCPReader(
"custom-twitter-server", "custom-twitter-server",
username="testuser", username="testuser",
include_tweet_content=False, include_tweet_content=False,
include_metadata=False, include_metadata=False,
max_bookmarks=500 max_bookmarks=500,
) )
assert reader.username == "testuser" assert reader.username == "testuser"
assert not reader.include_tweet_content assert not reader.include_tweet_content
assert not reader.include_metadata assert not reader.include_metadata
assert reader.max_bookmarks == 500 assert reader.max_bookmarks == 500
print("✅ TwitterMCPReader initialization tests passed") print("✅ TwitterMCPReader initialization tests passed")
def test_slack_message_formatting(): def test_slack_message_formatting():
"""Test Slack message formatting functionality.""" """Test Slack message formatting functionality."""
print("Testing Slack message formatting...") print("Testing Slack message formatting...")
reader = SlackMCPReader("slack-mcp-server") reader = SlackMCPReader("slack-mcp-server")
# Test basic message formatting # Test basic message formatting
message = { message = {
"text": "Hello, world!", "text": "Hello, world!",
"user": "john_doe", "user": "john_doe",
"channel": "general", "channel": "general",
"ts": "1234567890.123456" "ts": "1234567890.123456",
} }
formatted = reader._format_message(message) formatted = reader._format_message(message)
assert "Channel: #general" in formatted assert "Channel: #general" in formatted
assert "User: john_doe" in formatted assert "User: john_doe" in formatted
assert "Message: Hello, world!" in formatted assert "Message: Hello, world!" in formatted
assert "Time:" in formatted assert "Time:" in formatted
# Test with missing fields # Test with missing fields
message = {"text": "Simple message"} message = {"text": "Simple message"}
formatted = reader._format_message(message) formatted = reader._format_message(message)
assert "Message: Simple message" in formatted assert "Message: Simple message" in formatted
print("✅ Slack message formatting tests passed") print("✅ Slack message formatting tests passed")
def test_twitter_bookmark_formatting(): def test_twitter_bookmark_formatting():
"""Test Twitter bookmark formatting functionality.""" """Test Twitter bookmark formatting functionality."""
print("Testing Twitter bookmark formatting...") print("Testing Twitter bookmark formatting...")
reader = TwitterMCPReader("twitter-mcp-server") reader = TwitterMCPReader("twitter-mcp-server")
# Test basic bookmark formatting # Test basic bookmark formatting
bookmark = { bookmark = {
"text": "This is a great article about AI!", "text": "This is a great article about AI!",
@@ -110,9 +110,9 @@ def test_twitter_bookmark_formatting():
"created_at": "2024-01-01T12:00:00Z", "created_at": "2024-01-01T12:00:00Z",
"url": "https://twitter.com/ai_researcher/status/123456789", "url": "https://twitter.com/ai_researcher/status/123456789",
"likes": 42, "likes": 42,
"retweets": 15 "retweets": 15,
} }
formatted = reader._format_bookmark(bookmark) formatted = reader._format_bookmark(bookmark)
assert "=== Twitter Bookmark ===" in formatted assert "=== Twitter Bookmark ===" in formatted
assert "Author: @ai_researcher" 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 "URL: https://twitter.com" in formatted
assert "Likes: 42" in formatted assert "Likes: 42" in formatted
assert "Retweets: 15" in formatted assert "Retweets: 15" in formatted
# Test with minimal data # Test with minimal data
bookmark = {"text": "Simple tweet"} bookmark = {"text": "Simple tweet"}
formatted = reader._format_bookmark(bookmark) formatted = reader._format_bookmark(bookmark)
assert "=== Twitter Bookmark ===" in formatted assert "=== Twitter Bookmark ===" in formatted
assert "Simple tweet" in formatted assert "Simple tweet" in formatted
print("✅ Twitter bookmark formatting tests passed") print("✅ Twitter bookmark formatting tests passed")
def test_slack_rag_initialization(): def test_slack_rag_initialization():
"""Test that SlackMCPRAG can be initialized.""" """Test that SlackMCPRAG can be initialized."""
print("Testing SlackMCPRAG initialization...") print("Testing SlackMCPRAG initialization...")
app = SlackMCPRAG() app = SlackMCPRAG()
assert app.default_index_name == "slack_messages" assert app.default_index_name == "slack_messages"
assert hasattr(app, 'parser') assert hasattr(app, "parser")
print("✅ SlackMCPRAG initialization tests passed") print("✅ SlackMCPRAG initialization tests passed")
def test_twitter_rag_initialization(): def test_twitter_rag_initialization():
"""Test that TwitterMCPRAG can be initialized.""" """Test that TwitterMCPRAG can be initialized."""
print("Testing TwitterMCPRAG initialization...") print("Testing TwitterMCPRAG initialization...")
app = TwitterMCPRAG() app = TwitterMCPRAG()
assert app.default_index_name == "twitter_bookmarks" assert app.default_index_name == "twitter_bookmarks"
assert hasattr(app, 'parser') assert hasattr(app, "parser")
print("✅ TwitterMCPRAG initialization tests passed") print("✅ TwitterMCPRAG initialization tests passed")
def test_concatenated_content_creation(): def test_concatenated_content_creation():
"""Test creation of concatenated content from multiple messages.""" """Test creation of concatenated content from multiple messages."""
print("Testing concatenated content creation...") print("Testing concatenated content creation...")
reader = SlackMCPReader("slack-mcp-server", workspace_name="test-workspace") reader = SlackMCPReader("slack-mcp-server", workspace_name="test-workspace")
messages = [ messages = [
{"text": "First message", "user": "alice", "ts": "1000"}, {"text": "First message", "user": "alice", "ts": "1000"},
{"text": "Second message", "user": "bob", "ts": "2000"}, {"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") content = reader._create_concatenated_content(messages, "general")
assert "Slack Channel: #general" in content assert "Slack Channel: #general" in content
assert "Message Count: 3" in content assert "Message Count: 3" in content
assert "Workspace: test-workspace" in content assert "Workspace: test-workspace" in content
assert "First message" in content assert "First message" in content
assert "Second message" in content assert "Second message" in content
assert "Third message" in content assert "Third message" in content
print("✅ Concatenated content creation tests passed") print("✅ Concatenated content creation tests passed")
@@ -181,7 +181,7 @@ def main():
"""Run all tests.""" """Run all tests."""
print("🧪 Running MCP Integration Tests") print("🧪 Running MCP Integration Tests")
print("=" * 50) print("=" * 50)
try: try:
test_slack_reader_initialization() test_slack_reader_initialization()
test_twitter_reader_initialization() test_twitter_reader_initialization()
@@ -190,7 +190,7 @@ def main():
test_slack_rag_initialization() test_slack_rag_initialization()
test_twitter_rag_initialization() test_twitter_rag_initialization()
test_concatenated_content_creation() test_concatenated_content_creation()
print("\n" + "=" * 50) print("\n" + "=" * 50)
print("🎉 All tests passed! MCP integration is working correctly.") print("🎉 All tests passed! MCP integration is working correctly.")
print("\nNext steps:") print("\nNext steps:")
@@ -198,7 +198,7 @@ def main():
print("2. Configure API credentials") print("2. Configure API credentials")
print("3. Test with --test-connection flag") print("3. Test with --test-connection flag")
print("4. Start indexing your live data!") print("4. Start indexing your live data!")
except Exception as e: except Exception as e:
print(f"\n❌ Test failed: {e}") print(f"\n❌ Test failed: {e}")
sys.exit(1) sys.exit(1)

View File

@@ -6,8 +6,8 @@ This script tests the basic functionality of the MCP readers
without requiring LEANN core dependencies. without requiring LEANN core dependencies.
""" """
import sys
import json import json
import sys
from pathlib import Path from pathlib import Path
# Add the parent directory to the path so we can import from apps # 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(): def test_slack_reader_basic():
"""Test basic SlackMCPReader functionality without async operations.""" """Test basic SlackMCPReader functionality without async operations."""
print("Testing SlackMCPReader basic functionality...") print("Testing SlackMCPReader basic functionality...")
# Import and test initialization # Import and test initialization
from apps.slack_data.slack_mcp_reader import SlackMCPReader from apps.slack_data.slack_mcp_reader import SlackMCPReader
reader = SlackMCPReader("slack-mcp-server") reader = SlackMCPReader("slack-mcp-server")
assert reader.mcp_server_command == "slack-mcp-server" assert reader.mcp_server_command == "slack-mcp-server"
assert reader.concatenate_conversations assert reader.concatenate_conversations
# Test message formatting # Test message formatting
message = { message = {
"text": "Hello team! How's the project going?", "text": "Hello team! How's the project going?",
"user": "john_doe", "user": "john_doe",
"channel": "general", "channel": "general",
"ts": "1234567890.123456" "ts": "1234567890.123456",
} }
formatted = reader._format_message(message) formatted = reader._format_message(message)
assert "Channel: #general" in formatted assert "Channel: #general" in formatted
assert "User: john_doe" in formatted assert "User: john_doe" in formatted
assert "Message: Hello team!" in formatted assert "Message: Hello team!" in formatted
# Test concatenated content creation # Test concatenated content creation
messages = [ messages = [
{"text": "First message", "user": "alice", "ts": "1000"}, {"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") content = reader._create_concatenated_content(messages, "dev-team")
assert "Slack Channel: #dev-team" in content assert "Slack Channel: #dev-team" in content
assert "Message Count: 2" in content assert "Message Count: 2" in content
assert "First message" in content assert "First message" in content
assert "Second message" in content assert "Second message" in content
print("✅ SlackMCPReader basic tests passed") print("✅ SlackMCPReader basic tests passed")
def test_twitter_reader_basic(): def test_twitter_reader_basic():
"""Test basic TwitterMCPReader functionality.""" """Test basic TwitterMCPReader functionality."""
print("Testing TwitterMCPReader basic functionality...") print("Testing TwitterMCPReader basic functionality...")
from apps.twitter_data.twitter_mcp_reader import TwitterMCPReader from apps.twitter_data.twitter_mcp_reader import TwitterMCPReader
reader = TwitterMCPReader("twitter-mcp-server") reader = TwitterMCPReader("twitter-mcp-server")
assert reader.mcp_server_command == "twitter-mcp-server" assert reader.mcp_server_command == "twitter-mcp-server"
assert reader.include_tweet_content assert reader.include_tweet_content
assert reader.max_bookmarks == 1000 assert reader.max_bookmarks == 1000
# Test bookmark formatting # Test bookmark formatting
bookmark = { bookmark = {
"text": "Amazing article about the future of AI! Must read for everyone interested in tech.", "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, "retweets": 42,
"replies": 23, "replies": 23,
"hashtags": ["AI", "tech", "future"], "hashtags": ["AI", "tech", "future"],
"mentions": ["@openai", "@anthropic"] "mentions": ["@openai", "@anthropic"],
} }
formatted = reader._format_bookmark(bookmark) formatted = reader._format_bookmark(bookmark)
assert "=== Twitter Bookmark ===" in formatted assert "=== Twitter Bookmark ===" in formatted
assert "Author: @tech_guru" in formatted assert "Author: @tech_guru" in formatted
@@ -85,21 +85,21 @@ def test_twitter_reader_basic():
assert "Retweets: 42" in formatted assert "Retweets: 42" in formatted
assert "Hashtags: AI, tech, future" in formatted assert "Hashtags: AI, tech, future" in formatted
assert "Mentions: @openai, @anthropic" in formatted assert "Mentions: @openai, @anthropic" in formatted
# Test with minimal data # Test with minimal data
simple_bookmark = {"text": "Short tweet", "author": "user123"} simple_bookmark = {"text": "Short tweet", "author": "user123"}
formatted_simple = reader._format_bookmark(simple_bookmark) formatted_simple = reader._format_bookmark(simple_bookmark)
assert "=== Twitter Bookmark ===" in formatted_simple assert "=== Twitter Bookmark ===" in formatted_simple
assert "Short tweet" in formatted_simple assert "Short tweet" in formatted_simple
assert "Author: @user123" in formatted_simple assert "Author: @user123" in formatted_simple
print("✅ TwitterMCPReader basic tests passed") print("✅ TwitterMCPReader basic tests passed")
def test_mcp_request_format(): def test_mcp_request_format():
"""Test MCP request formatting.""" """Test MCP request formatting."""
print("Testing MCP request formatting...") print("Testing MCP request formatting...")
# Test initialization request format # Test initialization request format
init_request = { init_request = {
"jsonrpc": "2.0", "jsonrpc": "2.0",
@@ -108,77 +108,72 @@ def test_mcp_request_format():
"params": { "params": {
"protocolVersion": "2024-11-05", "protocolVersion": "2024-11-05",
"capabilities": {}, "capabilities": {},
"clientInfo": {"name": "leann-slack-reader", "version": "1.0.0"} "clientInfo": {"name": "leann-slack-reader", "version": "1.0.0"},
} },
} }
# Verify it's valid JSON # Verify it's valid JSON
json_str = json.dumps(init_request) json_str = json.dumps(init_request)
parsed = json.loads(json_str) parsed = json.loads(json_str)
assert parsed["jsonrpc"] == "2.0" assert parsed["jsonrpc"] == "2.0"
assert parsed["method"] == "initialize" assert parsed["method"] == "initialize"
assert parsed["params"]["protocolVersion"] == "2024-11-05" assert parsed["params"]["protocolVersion"] == "2024-11-05"
# Test tools/list request # Test tools/list request
list_request = { list_request = {"jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {}}
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list",
"params": {}
}
json_str = json.dumps(list_request) json_str = json.dumps(list_request)
parsed = json.loads(json_str) parsed = json.loads(json_str)
assert parsed["method"] == "tools/list" assert parsed["method"] == "tools/list"
print("✅ MCP request formatting tests passed") print("✅ MCP request formatting tests passed")
def test_data_processing(): def test_data_processing():
"""Test data processing capabilities.""" """Test data processing capabilities."""
print("Testing data processing capabilities...") print("Testing data processing capabilities...")
from apps.slack_data.slack_mcp_reader import SlackMCPReader from apps.slack_data.slack_mcp_reader import SlackMCPReader
from apps.twitter_data.twitter_mcp_reader import TwitterMCPReader from apps.twitter_data.twitter_mcp_reader import TwitterMCPReader
# Test Slack message processing with various formats # Test Slack message processing with various formats
slack_reader = SlackMCPReader("test-server") slack_reader = SlackMCPReader("test-server")
messages_with_timestamps = [ messages_with_timestamps = [
{"text": "Meeting in 5 minutes", "user": "alice", "ts": "1000.123"}, {"text": "Meeting in 5 minutes", "user": "alice", "ts": "1000.123"},
{"text": "On my way!", "user": "bob", "ts": "1001.456"}, {"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") content = slack_reader._create_concatenated_content(messages_with_timestamps, "meetings")
assert "Meeting in 5 minutes" in content assert "Meeting in 5 minutes" in content
assert "On my way!" in content assert "On my way!" in content
assert "Starting now" in content assert "Starting now" in content
# Test Twitter bookmark processing with engagement data # Test Twitter bookmark processing with engagement data
twitter_reader = TwitterMCPReader("test-server", include_metadata=True) twitter_reader = TwitterMCPReader("test-server", include_metadata=True)
high_engagement_bookmark = { high_engagement_bookmark = {
"text": "Thread about startup lessons learned 🧵", "text": "Thread about startup lessons learned 🧵",
"author": "startup_founder", "author": "startup_founder",
"likes": 1250, "likes": 1250,
"retweets": 340, "retweets": 340,
"replies": 89 "replies": 89,
} }
formatted = twitter_reader._format_bookmark(high_engagement_bookmark) formatted = twitter_reader._format_bookmark(high_engagement_bookmark)
assert "Thread about startup lessons learned" in formatted assert "Thread about startup lessons learned" in formatted
assert "Likes: 1250" in formatted assert "Likes: 1250" in formatted
assert "Retweets: 340" in formatted assert "Retweets: 340" in formatted
assert "Replies: 89" in formatted assert "Replies: 89" in formatted
# Test with metadata disabled # Test with metadata disabled
twitter_reader_no_meta = TwitterMCPReader("test-server", include_metadata=False) twitter_reader_no_meta = TwitterMCPReader("test-server", include_metadata=False)
formatted_no_meta = twitter_reader_no_meta._format_bookmark(high_engagement_bookmark) formatted_no_meta = twitter_reader_no_meta._format_bookmark(high_engagement_bookmark)
assert "Thread about startup lessons learned" in formatted_no_meta assert "Thread about startup lessons learned" in formatted_no_meta
assert "Likes:" not in formatted_no_meta assert "Likes:" not in formatted_no_meta
assert "Retweets:" not in formatted_no_meta assert "Retweets:" not in formatted_no_meta
print("✅ Data processing tests passed") print("✅ Data processing tests passed")
@@ -188,35 +183,36 @@ def main():
print("=" * 60) print("=" * 60)
print("Testing core functionality without LEANN dependencies...") print("Testing core functionality without LEANN dependencies...")
print() print()
try: try:
test_slack_reader_basic() test_slack_reader_basic()
test_twitter_reader_basic() test_twitter_reader_basic()
test_mcp_request_format() test_mcp_request_format()
test_data_processing() test_data_processing()
print("\n" + "=" * 60) print("\n" + "=" * 60)
print("🎉 All standalone tests passed!") print("🎉 All standalone tests passed!")
print("\n✨ MCP Integration Summary:") print("\n✨ MCP Integration Summary:")
print("- SlackMCPReader: Ready for Slack message processing") 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("- MCP Protocol: Properly formatted JSON-RPC requests")
print("- Data Processing: Handles various message/bookmark formats") print("- Data Processing: Handles various message/bookmark formats")
print("\n🚀 Next Steps:") print("\n🚀 Next Steps:")
print("1. Install MCP servers: npm install -g slack-mcp-server twitter-mcp-server") print("1. Install MCP servers: npm install -g slack-mcp-server twitter-mcp-server")
print("2. Configure API credentials for Slack and Twitter") print("2. Configure API credentials for Slack and Twitter")
print("3. Test connections: python -m apps.slack_rag --test-connection") print("3. Test connections: python -m apps.slack_rag --test-connection")
print("4. Start indexing live data from your platforms!") print("4. Start indexing live data from your platforms!")
print("\n📖 Documentation:") print("\n📖 Documentation:")
print("- Check README.md for detailed setup instructions") print("- Check README.md for detailed setup instructions")
print("- Run examples/mcp_integration_demo.py for usage examples") print("- Run examples/mcp_integration_demo.py for usage examples")
print("- Explore apps/slack_rag.py and apps/twitter_rag.py for implementation details") print("- Explore apps/slack_rag.py and apps/twitter_rag.py for implementation details")
except Exception as e: except Exception as e:
print(f"\n❌ Test failed: {e}") print(f"\n❌ Test failed: {e}")
import traceback import traceback
traceback.print_exc() traceback.print_exc()
sys.exit(1) sys.exit(1)