AtsPythonCodeGenerator.cs (112)
94WriteLine("# aspire.py - Capability-based Aspire SDK");
95WriteLine("# GENERATED CODE - DO NOT EDIT");
96WriteLine();
97WriteLine("from __future__ import annotations");
98WriteLine();
99WriteLine("import os");
100WriteLine("import sys");
101WriteLine("from dataclasses import dataclass");
102WriteLine("from enum import Enum");
103WriteLine("from typing import Any, Callable, Dict, List");
104WriteLine();
105WriteLine("from transport import AspireClient, Handle, CapabilityError, register_callback, register_handle_wrapper, register_cancellation");
106WriteLine("from base import AspireDict, AspireList, ReferenceExpression, ref_expr, HandleWrapperBase, ResourceBuilderBase, serialize_value");
107WriteLine();
117WriteLine("# ============================================================================");
118WriteLine("# Enums");
119WriteLine("# ============================================================================");
120WriteLine();
130WriteLine($"class {enumName}(str, Enum):");
135WriteLine($" {memberName} = \"{member}\"");
137WriteLine();
148WriteLine("# ============================================================================");
149WriteLine("# DTOs");
150WriteLine("# ============================================================================");
151WriteLine();
156WriteLine("@dataclass");
157WriteLine($"class {dtoName}:");
160WriteLine(" pass");
161WriteLine();
172WriteLine($" {propertyName}: {propertyType}{optionalSuffix}{defaultValue}");
175WriteLine();
176WriteLine(" def to_dict(self) -> Dict[str, Any]:");
177WriteLine(" return {");
182WriteLine($" \"{property.Name}\": serialize_value(self.{propertyName}),");
184WriteLine(" }");
185WriteLine();
198WriteLine("# ============================================================================");
199WriteLine("# Handle Wrappers");
200WriteLine("# ============================================================================");
201WriteLine();
206WriteLine($"class {handleType.ClassName}({baseClass}):");
207WriteLine(" def __init__(self, handle: Handle, client: AspireClient):");
208WriteLine(" super().__init__(handle, client)");
209WriteLine();
220WriteLine(" pass");
223WriteLine();
249WriteLine($" def {methodName}({signature}) -> {returnType}:");
252WriteLine($" \"\"\"{capability.Description}\"\"\"");
256WriteLine($" args: Dict[str, Any] = {{ \"{targetParamName}\": serialize_value(self._handle) }}");
264WriteLine($" {parameterName}_id = register_callback({parameterName}) if {parameterName} is not None else None");
265WriteLine($" if {parameterName}_id is not None:");
266WriteLine($" args[\"{parameter.Name}\"] = {parameterName}_id");
272WriteLine($" {parameterName}_id = register_cancellation({parameterName}, self._client) if {parameterName} is not None else None");
273WriteLine($" if {parameterName}_id is not None:");
274WriteLine($" args[\"{parameter.Name}\"] = {parameterName}_id");
280WriteLine($" if {parameterName} is not None:");
281WriteLine($" args[\"{parameter.Name}\"] = serialize_value({parameterName})");
285WriteLine($" args[\"{parameter.Name}\"] = serialize_value({parameterName})");
291WriteLine($" self._client.invoke_capability(\"{capability.CapabilityId}\", args)");
292WriteLine(" return None");
296WriteLine($" return self._client.invoke_capability(\"{capability.CapabilityId}\", args)");
298WriteLine();
332WriteLine($" @property");
333WriteLine($" def {methodName}(self) -> {typeHint}:");
336WriteLine($" \"\"\"{capability.Description}\"\"\"");
338WriteLine($" if not hasattr(self, '_{methodName}'):");
339WriteLine($" self._{methodName} = {wrapperType}(");
340WriteLine($" self._handle,");
341WriteLine($" self._client,");
342WriteLine($" \"{capability.CapabilityId}\"");
343WriteLine($" )");
344WriteLine($" return self._{methodName}");
345WriteLine();
352WriteLine("# ============================================================================");
353WriteLine("# Handle wrapper registrations");
354WriteLine("# ============================================================================");
355WriteLine();
359WriteLine($"register_handle_wrapper(\"{handleType.TypeId}\", lambda handle, client: {handleType.ClassName}(handle, client))");
365WriteLine($"register_handle_wrapper(\"{typeId}\", lambda handle, client: {wrapperType}(handle, client))");
368WriteLine();
377WriteLine("# ============================================================================");
378WriteLine("# Connection Helpers");
379WriteLine("# ============================================================================");
380WriteLine();
381WriteLine("def connect() -> AspireClient:");
382WriteLine(" socket_path = os.environ.get(\"REMOTE_APP_HOST_SOCKET_PATH\")");
383WriteLine(" if not socket_path:");
384WriteLine(" raise RuntimeError(\"REMOTE_APP_HOST_SOCKET_PATH environment variable not set. Run this application using `aspire run`.\")");
385WriteLine(" client = AspireClient(socket_path)");
386WriteLine(" client.connect()");
387WriteLine(" client.on_disconnect(lambda: sys.exit(1))");
388WriteLine(" return client");
389WriteLine();
390WriteLine($"def create_builder(options: Any | None = None) -> {builderClassName}:");
391WriteLine(" client = connect()");
392WriteLine(" resolved_options: Dict[str, Any] = {}");
393WriteLine(" if options is not None:");
394WriteLine(" if hasattr(options, \"to_dict\"):");
395WriteLine(" resolved_options.update(options.to_dict())");
396WriteLine(" elif isinstance(options, dict):");
397WriteLine(" resolved_options.update(options)");
398WriteLine(" resolved_options.setdefault(\"Args\", sys.argv[1:])");
399WriteLine(" resolved_options.setdefault(\"ProjectDirectory\", os.environ.get(\"ASPIRE_PROJECT_DIRECTORY\", os.getcwd()))");
400WriteLine(" result = client.invoke_capability(\"Aspire.Hosting/createBuilderWithOptions\", {\"options\": resolved_options})");
401WriteLine(" return result");
402WriteLine();
403WriteLine("# Re-export commonly used types");
404WriteLine("CapabilityError = CapabilityError");
405WriteLine("Handle = Handle");
406WriteLine("ReferenceExpression = ReferenceExpression");
407WriteLine("ref_expr = ref_expr");
408WriteLine();