Add CI code and logic to validate flows
This commit is contained in:
170
lib/examples/visualize_example.py
Normal file
170
lib/examples/visualize_example.py
Normal file
@@ -0,0 +1,170 @@
|
||||
"""
|
||||
Example script demonstrating how to use the n8n_utils visualization.
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# Add the lib directory to the path so we can import n8n_utils
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
from n8n_utils.visualization import visualize_workflow
|
||||
|
||||
def create_sample_workflow():
|
||||
"""Create a sample n8n workflow for demonstration."""
|
||||
return {
|
||||
"name": "Sample Workflow",
|
||||
"nodes": [
|
||||
{
|
||||
"id": "1",
|
||||
"name": "Start",
|
||||
"type": "n8n-nodes-base.start",
|
||||
"typeVersion": 1,
|
||||
"position": [250, 300],
|
||||
"parameters": {}
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"name": "HTTP Request",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 1,
|
||||
"position": [450, 200],
|
||||
"parameters": {
|
||||
"url": "https://api.example.com/data",
|
||||
"method": "GET"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "3",
|
||||
"name": "Process Data",
|
||||
"type": "n8n-nodes-base.function",
|
||||
"typeVersion": 1,
|
||||
"position": [650, 300],
|
||||
"parameters": {
|
||||
"functionCode": "// Process the data here\nreturn items;"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "4",
|
||||
"name": "Condition",
|
||||
"type": "n8n-nodes-base.if",
|
||||
"typeVersion": 1,
|
||||
"position": [850, 300],
|
||||
"parameters": {
|
||||
"conditions": {
|
||||
"string": [
|
||||
{
|
||||
"value1": "={{ $json.someField }}",
|
||||
"operation": "exists"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "5",
|
||||
"name": "Send Email",
|
||||
"type": "n8n-nodes-base.emailSend",
|
||||
"typeVersion": 1,
|
||||
"position": [1050, 200],
|
||||
"parameters": {
|
||||
"to": "user@example.com",
|
||||
"subject": "Processing Complete",
|
||||
"text": "The data has been processed successfully."
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "6",
|
||||
"name": "Log Error",
|
||||
"type": "n8n-nodes-base.function",
|
||||
"typeVersion": 1,
|
||||
"position": [1050, 400],
|
||||
"parameters": {
|
||||
"functionCode": "console.log('Error processing data:', items);\nreturn items;"
|
||||
}
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"1": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "2",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"2": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "3",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"3": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "4",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"4": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "5",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"4-1": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "6",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def main():
|
||||
"""Run the example."""
|
||||
# Create output directory if it doesn't exist
|
||||
output_dir = Path(__file__).parent / "output"
|
||||
output_dir.mkdir(exist_ok=True)
|
||||
|
||||
# Create a sample workflow
|
||||
workflow = create_sample_workflow()
|
||||
|
||||
# Save the workflow as JSON
|
||||
workflow_file = output_dir / "sample_workflow.json"
|
||||
with open(workflow_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(workflow, f, indent=2)
|
||||
|
||||
print(f"Created sample workflow at: {workflow_file}")
|
||||
|
||||
# Visualize the workflow
|
||||
output_image = output_dir / "workflow_visualization.png"
|
||||
from n8n_utils.visualization.visualizer import visualize_workflow
|
||||
visualize_workflow(workflow, output_file=str(output_image), show=True)
|
||||
print(f"Workflow visualization saved to: {output_image}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user