AtsPythonCodeGenerator.cs (112)
95WriteLine("# aspire.py - Capability-based Aspire SDK");
96WriteLine("# GENERATED CODE - DO NOT EDIT");
97WriteLine();
98WriteLine("from __future__ import annotations");
99WriteLine();
100WriteLine("import os");
101WriteLine("import sys");
102WriteLine("from dataclasses import dataclass");
103WriteLine("from enum import Enum");
104WriteLine("from typing import Any, Callable, Dict, List");
105WriteLine();
106WriteLine("from transport import AspireClient, Handle, CapabilityError, register_callback, register_handle_wrapper, register_cancellation");
107WriteLine("from base import AspireDict, AspireList, ReferenceExpression, ref_expr, HandleWrapperBase, ResourceBuilderBase, serialize_value");
108WriteLine();
118WriteLine("# ============================================================================");
119WriteLine("# Enums");
120WriteLine("# ============================================================================");
121WriteLine();
131WriteLine($"class {enumName}(str, Enum):");
136WriteLine($" {memberName} = \"{member}\"");
138WriteLine();
149WriteLine("# ============================================================================");
150WriteLine("# DTOs");
151WriteLine("# ============================================================================");
152WriteLine();
157WriteLine("@dataclass");
158WriteLine($"class {dtoName}:");
161WriteLine(" pass");
162WriteLine();
173WriteLine($" {propertyName}: {propertyType}{optionalSuffix}{defaultValue}");
176WriteLine();
177WriteLine(" def to_dict(self) -> Dict[str, Any]:");
178WriteLine(" return {");
183WriteLine($" \"{property.Name}\": serialize_value(self.{propertyName}),");
185WriteLine(" }");
186WriteLine();
199WriteLine("# ============================================================================");
200WriteLine("# Handle Wrappers");
201WriteLine("# ============================================================================");
202WriteLine();
207WriteLine($"class {handleType.ClassName}({baseClass}):");
208WriteLine(" def __init__(self, handle: Handle, client: AspireClient):");
209WriteLine(" super().__init__(handle, client)");
210WriteLine();
221WriteLine(" pass");
224WriteLine();
250WriteLine($" def {methodName}({signature}) -> {returnType}:");
253WriteLine($" \"\"\"{capability.Description}\"\"\"");
257WriteLine($" args: Dict[str, Any] = {{ \"{targetParamName}\": serialize_value(self._handle) }}");
265WriteLine($" {parameterName}_id = register_callback({parameterName}) if {parameterName} is not None else None");
266WriteLine($" if {parameterName}_id is not None:");
267WriteLine($" args[\"{parameter.Name}\"] = {parameterName}_id");
273WriteLine($" {parameterName}_id = register_cancellation({parameterName}, self._client) if {parameterName} is not None else None");
274WriteLine($" if {parameterName}_id is not None:");
275WriteLine($" args[\"{parameter.Name}\"] = {parameterName}_id");
281WriteLine($" if {parameterName} is not None:");
282WriteLine($" args[\"{parameter.Name}\"] = serialize_value({parameterName})");
286WriteLine($" args[\"{parameter.Name}\"] = serialize_value({parameterName})");
292WriteLine($" self._client.invoke_capability(\"{capability.CapabilityId}\", args)");
293WriteLine(" return None");
297WriteLine($" return self._client.invoke_capability(\"{capability.CapabilityId}\", args)");
299WriteLine();
333WriteLine($" @property");
334WriteLine($" def {methodName}(self) -> {typeHint}:");
337WriteLine($" \"\"\"{capability.Description}\"\"\"");
339WriteLine($" if not hasattr(self, '_{methodName}'):");
340WriteLine($" self._{methodName} = {wrapperType}(");
341WriteLine($" self._handle,");
342WriteLine($" self._client,");
343WriteLine($" \"{capability.CapabilityId}\"");
344WriteLine($" )");
345WriteLine($" return self._{methodName}");
346WriteLine();
353WriteLine("# ============================================================================");
354WriteLine("# Handle wrapper registrations");
355WriteLine("# ============================================================================");
356WriteLine();
360WriteLine($"register_handle_wrapper(\"{handleType.TypeId}\", lambda handle, client: {handleType.ClassName}(handle, client))");
366WriteLine($"register_handle_wrapper(\"{typeId}\", lambda handle, client: {wrapperType}(handle, client))");
369WriteLine();
378WriteLine("# ============================================================================");
379WriteLine("# Connection Helpers");
380WriteLine("# ============================================================================");
381WriteLine();
382WriteLine("def connect() -> AspireClient:");
383WriteLine(" socket_path = os.environ.get(\"REMOTE_APP_HOST_SOCKET_PATH\")");
384WriteLine(" if not socket_path:");
385WriteLine(" raise RuntimeError(\"REMOTE_APP_HOST_SOCKET_PATH environment variable not set. Run this application using `aspire run`.\")");
386WriteLine(" client = AspireClient(socket_path)");
387WriteLine(" client.connect()");
388WriteLine(" client.on_disconnect(lambda: sys.exit(1))");
389WriteLine(" return client");
390WriteLine();
391WriteLine($"def create_builder(options: Any | None = None) -> {builderClassName}:");
392WriteLine(" client = connect()");
393WriteLine(" resolved_options: Dict[str, Any] = {}");
394WriteLine(" if options is not None:");
395WriteLine(" if hasattr(options, \"to_dict\"):");
396WriteLine(" resolved_options.update(options.to_dict())");
397WriteLine(" elif isinstance(options, dict):");
398WriteLine(" resolved_options.update(options)");
399WriteLine(" resolved_options.setdefault(\"Args\", sys.argv[1:])");
400WriteLine(" resolved_options.setdefault(\"ProjectDirectory\", os.environ.get(\"ASPIRE_PROJECT_DIRECTORY\", os.getcwd()))");
401WriteLine(" result = client.invoke_capability(\"Aspire.Hosting/createBuilderWithOptions\", {\"options\": resolved_options})");
402WriteLine(" return result");
403WriteLine();
404WriteLine("# Re-export commonly used types");
405WriteLine("CapabilityError = CapabilityError");
406WriteLine("Handle = Handle");
407WriteLine("ReferenceExpression = ReferenceExpression");
408WriteLine("ref_expr = ref_expr");
409WriteLine();