Cluster/tests/test_logging_demo.py
2025-07-17 17:04:56 +08:00

203 lines
7.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
Demo script to test the logging functionality in the pipeline editor.
This simulates adding nodes and shows the terminal logging output.
"""
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
# Set up Qt environment
os.environ['QT_QPA_PLATFORM'] = 'offscreen'
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QTimer
# Create Qt application
app = QApplication(sys.argv)
# Mock the pipeline editor to test logging without full UI
from core.pipeline import get_pipeline_summary
from core.nodes.model_node import ModelNode
from core.nodes.input_node import InputNode
from core.nodes.output_node import OutputNode
from core.nodes.preprocess_node import PreprocessNode
from core.nodes.postprocess_node import PostprocessNode
class MockPipelineEditor:
"""Mock pipeline editor to test logging functionality."""
def __init__(self):
self.nodes = []
self.previous_stage_count = 0
print("🚀 Pipeline Editor initialized")
self.analyze_pipeline()
def add_node(self, node_type):
"""Add a node and trigger analysis."""
if node_type == 'input':
node = InputNode()
print("🔄 Adding Input Node via toolbar...")
elif node_type == 'model':
node = ModelNode()
print("🔄 Adding Model Node via toolbar...")
elif node_type == 'output':
node = OutputNode()
print("🔄 Adding Output Node via toolbar...")
elif node_type == 'preprocess':
node = PreprocessNode()
print("🔄 Adding Preprocess Node via toolbar...")
elif node_type == 'postprocess':
node = PostprocessNode()
print("🔄 Adding Postprocess Node via toolbar...")
self.nodes.append(node)
print(f" Node added: {node.NODE_NAME}")
self.analyze_pipeline()
def remove_last_node(self):
"""Remove the last node and trigger analysis."""
if self.nodes:
node = self.nodes.pop()
print(f" Node removed: {node.NODE_NAME}")
self.analyze_pipeline()
def clear_pipeline(self):
"""Clear all nodes."""
print("🗑️ Clearing entire pipeline...")
self.nodes.clear()
self.analyze_pipeline()
def analyze_pipeline(self):
"""Analyze the pipeline and show logging."""
# Create a mock node graph
class MockGraph:
def __init__(self, nodes):
self._nodes = nodes
def all_nodes(self):
return self._nodes
graph = MockGraph(self.nodes)
try:
# Get pipeline summary
summary = get_pipeline_summary(graph)
current_stage_count = summary['stage_count']
# Print detailed pipeline analysis
self.print_pipeline_analysis(summary, current_stage_count)
# Update previous count for next comparison
self.previous_stage_count = current_stage_count
except Exception as e:
print(f"❌ Pipeline analysis error: {str(e)}")
def print_pipeline_analysis(self, summary, current_stage_count):
"""Print detailed pipeline analysis to terminal."""
# Check if stage count changed
if current_stage_count != self.previous_stage_count:
if self.previous_stage_count == 0:
print(f"🎯 Initial stage count: {current_stage_count}")
else:
change = current_stage_count - self.previous_stage_count
if change > 0:
print(f"📈 Stage count increased: {self.previous_stage_count}{current_stage_count} (+{change})")
else:
print(f"📉 Stage count decreased: {self.previous_stage_count}{current_stage_count} ({change})")
# Print current pipeline status
print(f"📊 Current Pipeline Status:")
print(f" • Stages: {current_stage_count}")
print(f" • Total Nodes: {summary['total_nodes']}")
print(f" • Model Nodes: {summary['model_nodes']}")
print(f" • Input Nodes: {summary['input_nodes']}")
print(f" • Output Nodes: {summary['output_nodes']}")
print(f" • Preprocess Nodes: {summary['preprocess_nodes']}")
print(f" • Postprocess Nodes: {summary['postprocess_nodes']}")
print(f" • Valid: {'' if summary['valid'] else ''}")
if not summary['valid'] and summary.get('error'):
print(f" • Error: {summary['error']}")
# Print stage details if available
if summary.get('stages'):
print(f"📋 Stage Details:")
for i, stage in enumerate(summary['stages'], 1):
model_name = stage['model_config'].get('node_name', 'Unknown Model')
preprocess_count = len(stage['preprocess_configs'])
postprocess_count = len(stage['postprocess_configs'])
stage_info = f" Stage {i}: {model_name}"
if preprocess_count > 0:
stage_info += f" (with {preprocess_count} preprocess)"
if postprocess_count > 0:
stage_info += f" (with {postprocess_count} postprocess)"
print(stage_info)
print("" * 50) # Separator line
def demo_logging():
"""Demonstrate the logging functionality."""
print("=" * 60)
print("🔊 PIPELINE LOGGING DEMO")
print("=" * 60)
# Create mock editor
editor = MockPipelineEditor()
# Demo sequence: Build a pipeline step by step
print("\n1. Adding Input Node:")
editor.add_node('input')
print("\n2. Adding Model Node (creates first stage):")
editor.add_node('model')
print("\n3. Adding Output Node:")
editor.add_node('output')
print("\n4. Adding Preprocess Node:")
editor.add_node('preprocess')
print("\n5. Adding second Model Node (creates second stage):")
editor.add_node('model')
print("\n6. Adding Postprocess Node:")
editor.add_node('postprocess')
print("\n7. Adding third Model Node (creates third stage):")
editor.add_node('model')
print("\n8. Removing a Model Node (decreases stages):")
editor.remove_last_node()
print("\n9. Clearing entire pipeline:")
editor.clear_pipeline()
print("\n" + "=" * 60)
print("🎉 DEMO COMPLETED")
print("=" * 60)
print("\nAs you can see, the terminal logs show:")
print("• When nodes are added/removed")
print("• Stage count changes (increases/decreases)")
print("• Current pipeline status with detailed breakdown")
print("• Validation status and errors")
print("• Individual stage details")
def main():
"""Run the logging demo."""
try:
demo_logging()
except Exception as e:
print(f"❌ Demo failed: {e}")
import traceback
traceback.print_exc()
if __name__ == '__main__':
main()