edda-framework 0.15.0__py3-none-any.whl → 0.15.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- edda/viewer_app.py +147 -0
- {edda_framework-0.15.0.dist-info → edda_framework-0.15.1.dist-info}/METADATA +1 -1
- {edda_framework-0.15.0.dist-info → edda_framework-0.15.1.dist-info}/RECORD +6 -5
- edda_framework-0.15.1.dist-info/entry_points.txt +2 -0
- edda_framework-0.15.0.dist-info/entry_points.txt +0 -2
- {edda_framework-0.15.0.dist-info → edda_framework-0.15.1.dist-info}/WHEEL +0 -0
- {edda_framework-0.15.0.dist-info → edda_framework-0.15.1.dist-info}/licenses/LICENSE +0 -0
edda/viewer_app.py
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Edda Workflow Viewer - Interactive web interface for workflow visualization.
|
|
3
|
+
|
|
4
|
+
This application provides an interactive web interface to visualize
|
|
5
|
+
workflow instances with clickable Mermaid diagrams.
|
|
6
|
+
|
|
7
|
+
Installation:
|
|
8
|
+
# Install Edda core only (viewer command available but won't run)
|
|
9
|
+
pip install edda-framework
|
|
10
|
+
|
|
11
|
+
# Install with viewer dependencies (recommended)
|
|
12
|
+
uv sync --extra viewer
|
|
13
|
+
# or
|
|
14
|
+
pip install edda-framework[viewer]
|
|
15
|
+
|
|
16
|
+
Usage:
|
|
17
|
+
# View existing workflows (no module imports)
|
|
18
|
+
uv run edda-viewer
|
|
19
|
+
|
|
20
|
+
# Import demo_app workflows
|
|
21
|
+
uv run edda-viewer --import-module demo_app
|
|
22
|
+
|
|
23
|
+
# Import custom workflows
|
|
24
|
+
uv run edda-viewer -m my_workflows
|
|
25
|
+
|
|
26
|
+
# Multiple modules
|
|
27
|
+
uv run edda-viewer -m demo_app -m my_workflows
|
|
28
|
+
|
|
29
|
+
# Custom database and port
|
|
30
|
+
uv run edda-viewer --db my.db --port 9000 -m my_workflows
|
|
31
|
+
|
|
32
|
+
# Using Just (project root)
|
|
33
|
+
just viewer # No modules
|
|
34
|
+
just viewer-demo # With demo_app
|
|
35
|
+
just viewer demo.db 8080 "-m demo_app" # Custom
|
|
36
|
+
|
|
37
|
+
Alternative (direct script execution):
|
|
38
|
+
# Run the viewer script directly
|
|
39
|
+
uv run python viewer_app.py -m demo_app
|
|
40
|
+
|
|
41
|
+
# Or with auto-reload for development
|
|
42
|
+
nicegui viewer_app.py --reload
|
|
43
|
+
|
|
44
|
+
Then open http://localhost:<port> in your browser.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
import argparse
|
|
48
|
+
import os
|
|
49
|
+
import sys
|
|
50
|
+
|
|
51
|
+
from edda import EddaApp
|
|
52
|
+
from edda.viewer_ui import start_viewer
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def parse_args() -> argparse.Namespace:
|
|
56
|
+
"""Parse command line arguments."""
|
|
57
|
+
parser = argparse.ArgumentParser(
|
|
58
|
+
description="Edda Workflow Viewer - Interactive web interface for workflow visualization",
|
|
59
|
+
epilog="Example: edda-viewer --db my.db --port 9000 -m demo_app -m my_workflows",
|
|
60
|
+
)
|
|
61
|
+
parser.add_argument(
|
|
62
|
+
"--db",
|
|
63
|
+
"-d",
|
|
64
|
+
type=str,
|
|
65
|
+
default="demo.db",
|
|
66
|
+
help="Database file path (default: demo.db)",
|
|
67
|
+
)
|
|
68
|
+
parser.add_argument(
|
|
69
|
+
"--port",
|
|
70
|
+
"-p",
|
|
71
|
+
type=int,
|
|
72
|
+
default=8080,
|
|
73
|
+
help="Port number for the web server (default: 8080)",
|
|
74
|
+
)
|
|
75
|
+
parser.add_argument(
|
|
76
|
+
"--import-module",
|
|
77
|
+
"-m",
|
|
78
|
+
type=str,
|
|
79
|
+
action="append",
|
|
80
|
+
dest="import_modules",
|
|
81
|
+
help="Python module to import (can be specified multiple times). "
|
|
82
|
+
"Workflows decorated with @workflow in these modules will be available in the viewer. "
|
|
83
|
+
"Example: --import-module demo_app",
|
|
84
|
+
)
|
|
85
|
+
return parser.parse_args()
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def main() -> None:
|
|
89
|
+
"""Main entry point for the Edda Viewer CLI."""
|
|
90
|
+
# Step 1: Check if nicegui is installed
|
|
91
|
+
try:
|
|
92
|
+
import nicegui # type: ignore[import-not-found] # noqa: F401
|
|
93
|
+
except ImportError:
|
|
94
|
+
print("Error: Viewer dependencies are not installed.", file=sys.stderr)
|
|
95
|
+
print("", file=sys.stderr)
|
|
96
|
+
print("Please install viewer dependencies with one of:", file=sys.stderr)
|
|
97
|
+
print(" uv sync --extra viewer", file=sys.stderr)
|
|
98
|
+
print(" uv pip install edda-framework[viewer]", file=sys.stderr)
|
|
99
|
+
print(" pip install edda-framework[viewer]", file=sys.stderr)
|
|
100
|
+
sys.exit(1)
|
|
101
|
+
|
|
102
|
+
# Step 2: Parse arguments
|
|
103
|
+
args = parse_args()
|
|
104
|
+
|
|
105
|
+
# Step 3: Import specified modules
|
|
106
|
+
if args.import_modules:
|
|
107
|
+
print("Importing modules...")
|
|
108
|
+
for module_name in args.import_modules:
|
|
109
|
+
try:
|
|
110
|
+
__import__(module_name)
|
|
111
|
+
print(f" ✓ Imported: {module_name}")
|
|
112
|
+
except ImportError as e:
|
|
113
|
+
print(
|
|
114
|
+
f" ✗ Warning: Could not import module '{module_name}': {e}",
|
|
115
|
+
file=sys.stderr,
|
|
116
|
+
)
|
|
117
|
+
print(" Continuing without this module...", file=sys.stderr)
|
|
118
|
+
print()
|
|
119
|
+
|
|
120
|
+
# Step 4: Determine database URL (prioritize environment variable)
|
|
121
|
+
db_url = os.getenv("EDDA_DB_URL")
|
|
122
|
+
if db_url is None:
|
|
123
|
+
# Fallback to --db option (SQLite)
|
|
124
|
+
db_url = f"sqlite:///{args.db}"
|
|
125
|
+
db_display = args.db
|
|
126
|
+
else:
|
|
127
|
+
# Hide password in display
|
|
128
|
+
db_display = db_url.split("@")[-1] if "@" in db_url else db_url
|
|
129
|
+
|
|
130
|
+
# Create Edda app (for database access only)
|
|
131
|
+
edda_app = EddaApp(
|
|
132
|
+
service_name="viewer",
|
|
133
|
+
db_url=db_url,
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
# Step 5: Start the viewer (storage will be initialized on startup)
|
|
137
|
+
print("Starting Edda Viewer...")
|
|
138
|
+
print(f" Database: {db_display}")
|
|
139
|
+
print(f" Port: {args.port}")
|
|
140
|
+
print(f" URL: http://localhost:{args.port}")
|
|
141
|
+
print()
|
|
142
|
+
|
|
143
|
+
start_viewer(edda_app, port=args.port)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
if __name__ == "__main__":
|
|
147
|
+
main()
|
|
@@ -10,6 +10,7 @@ edda/locking.py,sha256=ZMdzGO4u3h8m3kDysmkDpAkJNvQQADbILPsmo52EQis,12716
|
|
|
10
10
|
edda/pydantic_utils.py,sha256=dGVPNrrttDeq1k233PopCtjORYjZitsgASPfPnO6R10,9056
|
|
11
11
|
edda/replay.py,sha256=IQGByw9mlTpRulyUgsHJSPsZUULmM2YqFcm2WeB4jtw,43227
|
|
12
12
|
edda/retry.py,sha256=t4_E1skrhotA1XWHTLbKi-DOgCMasOUnhI9OT-O_eCE,6843
|
|
13
|
+
edda/viewer_app.py,sha256=gsvZaa4DQJyOmZC5ynxrDlAJW1lzfoG7t9c__XpWw5Q,4531
|
|
13
14
|
edda/workflow.py,sha256=hfBZM0JrtK0IkvZSrva0VmYVyvKCdiJ5FWFmIVENfrM,8807
|
|
14
15
|
edda/wsgi.py,sha256=1pGE5fhHpcsYnDR8S3NEFKWUs5P0JK4roTAzX9BsIj0,2391
|
|
15
16
|
edda/integrations/__init__.py,sha256=F_CaTvlDEbldfOpPKq_U9ve1E573tS6XzqXnOtyHcXI,33
|
|
@@ -56,8 +57,8 @@ edda/visualizer/mermaid_generator.py,sha256=XWa2egoOTNDfJEjPcwoxwQmblUqXf7YInWFj
|
|
|
56
57
|
edda/migrations/mysql/20251217000000_initial_schema.sql,sha256=LpINasESRhadOeqABwDk4JZ0OZ4_zQw_opnhIR4Xe9U,12367
|
|
57
58
|
edda/migrations/postgresql/20251217000000_initial_schema.sql,sha256=hCaGMWeptpzpnsjfNKVsMYuwPRe__fK9E0VZpClAumQ,11732
|
|
58
59
|
edda/migrations/sqlite/20251217000000_initial_schema.sql,sha256=Wq9gCnQ0K9SOt0PY_8f1MG4va8rLVWIIcf2lnRzSK5g,11906
|
|
59
|
-
edda_framework-0.15.
|
|
60
|
-
edda_framework-0.15.
|
|
61
|
-
edda_framework-0.15.
|
|
62
|
-
edda_framework-0.15.
|
|
63
|
-
edda_framework-0.15.
|
|
60
|
+
edda_framework-0.15.1.dist-info/METADATA,sha256=XPF_Y5pnbx93FmhLIr05vmdzw7G1aqK-q-hkk8XKcBA,38074
|
|
61
|
+
edda_framework-0.15.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
62
|
+
edda_framework-0.15.1.dist-info/entry_points.txt,sha256=Cidn1ATgyQTJVFtn6FVu5u_rhyD4XGTmsCGukFFfzEs,53
|
|
63
|
+
edda_framework-0.15.1.dist-info/licenses/LICENSE,sha256=udxb-V7_cYKTHqW7lNm48rxJ-Zpf0WAY_PyGDK9BPCo,1069
|
|
64
|
+
edda_framework-0.15.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|