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 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()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edda-framework
3
- Version: 0.15.0
3
+ Version: 0.15.1
4
4
  Summary: Lightweight Durable Execution Framework
5
5
  Project-URL: Homepage, https://github.com/i2y/edda
6
6
  Project-URL: Documentation, https://github.com/i2y/edda#readme
@@ -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.0.dist-info/METADATA,sha256=d7VXuP5MWTx0WvL4KzwmZVl0AUtTJzTxaLWL7Q0Ou8Q,38074
60
- edda_framework-0.15.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
61
- edda_framework-0.15.0.dist-info/entry_points.txt,sha256=dPH47s6UoJgUZxHoeSMqZsQkLaSE-SGLi-gh88k2WrU,48
62
- edda_framework-0.15.0.dist-info/licenses/LICENSE,sha256=udxb-V7_cYKTHqW7lNm48rxJ-Zpf0WAY_PyGDK9BPCo,1069
63
- edda_framework-0.15.0.dist-info/RECORD,,
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,,
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ edda-viewer = edda.viewer_app:main
@@ -1,2 +0,0 @@
1
- [console_scripts]
2
- edda-viewer = viewer_app:main