Files
LiquidCode.Tester/src/LiquidCode.Tester.Worker/Services/PythonCompilationService.cs

75 lines
2.8 KiB
C#

using LiquidCode.Tester.Worker.Models;
namespace LiquidCode.Tester.Worker.Services;
public class PythonCompilationService : ICompilationService
{
private readonly ILogger<PythonCompilationService> _logger;
private readonly IConfiguration _configuration;
public PythonCompilationService(ILogger<PythonCompilationService> logger, IConfiguration configuration)
{
_logger = logger;
_configuration = configuration;
}
public async Task<CompilationResult> CompileAsync(string sourceCode, string workingDirectory, string? version = null)
{
var sourceFilePath = Path.Combine(workingDirectory, "solution.py");
_logger.LogInformation("Preparing Python code in {WorkingDirectory} with version {Version}", workingDirectory, version ?? "latest");
try
{
await File.WriteAllTextAsync(sourceFilePath, sourceCode);
// Resolve version-specific executable (for execution service)
var executable = ResolveVersion(version);
_logger.LogDebug("Using Python executable: {Executable}", executable);
_logger.LogInformation("Python code prepared successfully (no compilation needed)");
return new CompilationResult
{
Success = true,
ExecutablePath = sourceFilePath,
CompilerOutput = $"Python is an interpreted language - no compilation needed (using {executable})"
};
}
catch (Exception ex)
{
_logger.LogError(ex, "Error preparing Python code");
return new CompilationResult
{
Success = false,
ErrorMessage = $"Error preparing code: {ex.Message}"
};
}
}
private string ResolveVersion(string? version)
{
// If version is null or "latest", use default configuration
if (string.IsNullOrEmpty(version) || version.Equals("latest", StringComparison.OrdinalIgnoreCase))
{
var executable = _configuration["Python:Executable"] ?? "python3";
return executable;
}
// Try to find version-specific configuration
var versionKey = $"Python:Versions:{version}";
var versionExecutable = _configuration[$"{versionKey}:Executable"];
if (!string.IsNullOrEmpty(versionExecutable))
{
_logger.LogInformation("Using Python version {Version} configuration", version);
return versionExecutable;
}
// Version not found, use default and log warning
_logger.LogWarning("Python version {Version} not found in configuration, using default", version);
var defaultExecutable = _configuration["Python:Executable"] ?? "python3";
return defaultExecutable;
}
}