0.1.8
Loading...
Searching...
No Matches
__main__.py
Go to the documentation of this file.
1"""
2Plugin status and discovery command-line interface for PyHelios.
3
4This module provides command-line tools for checking plugin availability,
5system compatibility, and generating configuration recommendations.
6
7Usage:
8 python -m pyhelios.plugins status
9 python -m pyhelios.plugins discover
10 python -m pyhelios.plugins info <plugin_name>
11 python -m pyhelios.plugins validate <plugin_list>
12"""
13
14import sys
15import argparse
16from pathlib import Path
17
18# Add pyhelios to path for imports
19sys.path.insert(0, str(Path(__file__).parent.parent.parent))
20
21from pyhelios.plugins import print_plugin_status, get_plugin_info
22from pyhelios.plugins.registry import get_plugin_registry
23from pyhelios.config.plugin_metadata import PLUGIN_METADATA, get_all_plugin_names, get_platform_compatible_plugins
24from pyhelios.config.dependency_resolver import PluginDependencyResolver
25
26
27def cmd_status(args):
28 """Show comprehensive plugin status."""
30
31
32def cmd_discover(args):
33 """Discover and recommend optimal plugin configuration."""
34 print("PyHelios Plugin Discovery")
35 print("=" * 25)
36
37 resolver = PluginDependencyResolver()
38
39 # Check system capabilities
40 print("System Analysis:")
41 print("-" * 15)
42
43 # Platform compatibility
44 compatible_plugins = get_platform_compatible_plugins()
45 all_plugins = get_all_plugin_names()
46 platform_compatibility = len(compatible_plugins) / len(all_plugins) * 100
47 print(f"Platform compatibility: {platform_compatibility:.1f}% ({len(compatible_plugins)}/{len(all_plugins)} plugins)")
48
49 # GPU availability
50 gpu_available = resolver._check_cuda()
51 print(f"GPU/CUDA support: {'✓ Available' if gpu_available else '✗ Not available'}")
52
53 # System dependencies
54 system_deps = resolver._check_system_dependencies(compatible_plugins)
55 available_deps = sum(1 for available in system_deps.values() if available)
56 total_deps = len(system_deps)
57 if total_deps > 0:
58 dep_percentage = available_deps / total_deps * 100
59 print(f"System dependencies: {dep_percentage:.1f}% available ({available_deps}/{total_deps})")
60
61 print()
62
63 # Recommend configuration
64 print("Recommendations:")
65 print("-" * 15)
66
67 if gpu_available:
68 print("✓ GPU detected - GPU-accelerated workflows are possible")
69 print(" Recommended for: Ray tracing, radiation modeling, high-performance simulations")
70 recommended_plugins = ["weberpenntree", "canopygenerator", "solarposition", "radiation", "visualizer", "energybalance"]
71 else:
72 print("• No GPU detected - Using CPU-based workflows")
73 print(" Recommended for: General plant modeling, visualization, basic simulations")
74 recommended_plugins = ["weberpenntree", "canopygenerator", "solarposition", "visualizer", "energybalance"]
75
76 # Filter by platform compatibility
77 recommended_plugins = [p for p in recommended_plugins if p in compatible_plugins]
78 validation = resolver.validate_configuration(recommended_plugins)
79
80 print(f"\nRecommended plugins ({len(recommended_plugins)}):")
81 for plugin in recommended_plugins:
82 if plugin in validation['platform_compatible']:
83 print(f" ✓ {plugin}")
84 else:
85 print(f" ⚠ {plugin} (may have compatibility issues)")
86
87 # Show build command
88 print(f"\nSuggested build command:")
89 plugin_list = ",".join(recommended_plugins)
90 print(f" build_scripts/build_helios --plugins {plugin_list}")
91
92 # Show potential issues
93 if validation['platform_incompatible']:
94 print(f"\n⚠ Platform compatibility issues:")
95 for plugin in validation['platform_incompatible']:
96 print(f" - {plugin}")
97
98 missing_system_deps = [dep for dep, available in system_deps.items() if not available]
99 if missing_system_deps:
100 print(f"\n⚠ Missing system dependencies:")
101 for dep in missing_system_deps:
102 print(f" - {dep}")
103
104
105def cmd_info(args):
106 """Show detailed information about a specific plugin."""
107 plugin_name = args.plugin_name
108
109 if plugin_name not in PLUGIN_METADATA:
110 print(f"❌ Unknown plugin: {plugin_name}")
111 print(f"Available plugins: {', '.join(sorted(get_all_plugin_names()))}")
112 return 1
113
114 info = get_plugin_info(plugin_name)
115 metadata = PLUGIN_METADATA[plugin_name]
116
117 print(f"Plugin Information: {plugin_name}")
118 print("=" * (20 + len(plugin_name)))
119
120 print(f"Description: {metadata.description}")
121 print(f"GPU Required: {'Yes' if metadata.gpu_required else 'No'}")
122 print(f"Optional: {'Yes' if metadata.optional else 'No (core plugin)'}")
123 print(f"Supported Platforms: {', '.join(metadata.platforms)}")
124
125 if metadata.system_dependencies:
126 print(f"System Dependencies: {', '.join(metadata.system_dependencies)}")
127
128 if metadata.plugin_dependencies:
129 print(f"Plugin Dependencies: {', '.join(metadata.plugin_dependencies)}")
130
131
132 # Runtime availability
133 print(f"\nRuntime Status:")
134 if 'error' in info:
135 print(f"❌ Error: {info['error']}")
136 else:
137 print(f"Available: {'✓ Yes' if info['available'] else '✗ No'}")
138
139 if info.get('validation'):
140 validation = info['validation']
141 print(f"Validation: {'✓ Valid' if validation['valid'] else '✗ Invalid'}")
142 if not validation['valid']:
143 print(f" Reason: {validation['reason']}")
144
145 if validation['missing_dependencies']:
146 print(f" Missing dependencies: {', '.join(validation['missing_dependencies'])}")
147
148
149 return 0
150
151
152def cmd_validate(args):
153 """Validate a list of plugins."""
154 if args.plugins:
155 plugins = args.plugins
156 else:
157 # Read from stdin or prompt
158 plugins_input = input("Enter plugins (comma-separated): ").strip()
159 plugins = [p.strip() for p in plugins_input.split(',') if p.strip()]
160
161 if not plugins:
162 print("❌ No plugins specified")
163 return 1
164
165 print(f"Validating plugins: {', '.join(plugins)}")
166 print("=" * 40)
167
168 resolver = PluginDependencyResolver()
169 validation = resolver.validate_configuration(plugins)
170
171 print(f"Total requested: {len(plugins)}")
172 print(f"Valid plugins: {len(validation['valid_plugins'])}")
173 print(f"Invalid plugins: {len(validation['invalid_plugins'])}")
174 print(f"Platform compatible: {len(validation['platform_compatible'])}")
175 print(f"Platform incompatible: {len(validation['platform_incompatible'])}")
176
177 if validation['invalid_plugins']:
178 print(f"\n❌ Invalid plugins:")
179 for plugin in validation['invalid_plugins']:
180 print(f" - {plugin}")
181
182 if validation['platform_incompatible']:
183 print(f"\n⚠ Platform incompatible:")
184 for plugin in validation['platform_incompatible']:
185 print(f" - {plugin}")
186
187 if validation['system_dependencies']:
188 print(f"\nSystem Dependencies:")
189 for dep, available in validation['system_dependencies'].items():
190 status = "✓" if available else "✗"
191 print(f" {status} {dep}")
192
193 print(f"\nGPU required: {'Yes' if validation['gpu_required'] else 'No'}")
194
195 # Provide suggestions
196 if validation['invalid_plugins'] or validation['platform_incompatible']:
197 print(f"\n💡 Suggestions:")
198 print(f" - Use only valid, platform-compatible plugins")
199 print(f" - Check available plugins: python -m pyhelios.plugins status")
200 print(f" - Use specific plugin selection: build_scripts/build_helios --plugins plugin1,plugin2")
201 return 1
202 else:
203 print(f"\n✅ Configuration is valid")
204 return 0
205
206
207
208
209def main():
210 """Main entry point for plugin command-line interface."""
211 parser = argparse.ArgumentParser(
212 description="PyHelios plugin status and discovery tools",
213 formatter_class=argparse.RawDescriptionHelpFormatter,
214 epilog="""
215Commands:
216 status Show comprehensive plugin status
217 discover Analyze system and recommend optimal configuration
218 info Show detailed information about a specific plugin
219 validate Validate a list of plugins for compatibility
220
221Examples:
222 python -m pyhelios.plugins status
223 python -m pyhelios.plugins discover
224 python -m pyhelios.plugins info radiation
225 python -m pyhelios.plugins validate --plugins radiation,visualizer
226 """
227 )
228
229 subparsers = parser.add_subparsers(dest='command', help='Available commands')
230
231 # Status command
232 status_parser = subparsers.add_parser('status', help='Show plugin status')
233 status_parser.set_defaults(func=cmd_status)
234
235 # Discover command
236 discover_parser = subparsers.add_parser('discover', help='Discover optimal configuration')
237 discover_parser.set_defaults(func=cmd_discover)
238
239 # Info command
240 info_parser = subparsers.add_parser('info', help='Show plugin information')
241 info_parser.add_argument('plugin_name', help='Name of the plugin')
242 info_parser.set_defaults(func=cmd_info)
243
244 # Validate command
245 validate_parser = subparsers.add_parser('validate', help='Validate plugin configuration')
246 validate_parser.add_argument('--plugins', nargs='*', help='Plugin names to validate')
247 validate_parser.set_defaults(func=cmd_validate)
248
249
250 args = parser.parse_args()
251
252 if not args.command:
253 parser.print_help()
254 return 1
255
256 try:
257 return args.func(args)
258 except KeyboardInterrupt:
259 print("\nOperation cancelled by user")
260 return 130
261 except Exception as e:
262 print(f"❌ Error: {e}")
263 return 1
264
265
266if __name__ == '__main__':
267 sys.exit(main())
cmd_discover(args)
Discover and recommend optimal plugin configuration.
Definition __main__.py:33
cmd_validate(args)
Validate a list of plugins.
Definition __main__.py:153
main()
Main entry point for plugin command-line interface.
Definition __main__.py:210
cmd_info(args)
Show detailed information about a specific plugin.
Definition __main__.py:106
cmd_status(args)
Show comprehensive plugin status.
Definition __main__.py:28
print_plugin_status()
Print current plugin status for debugging.
Definition __init__.py:51
get_plugin_info()
Get information about loaded plugins and libraries.
Definition __init__.py:44