go-build/pkg/sdk/generators/python.go
Virgil 7aa4e5486d chore(ax): finish v0.8.0 polish pass
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-26 17:41:53 +00:00

82 lines
2.5 KiB
Go

package generators
import (
"context"
"dappco.re/go/core/build/internal/ax"
coreio "dappco.re/go/core/io"
coreerr "dappco.re/go/core/log"
)
// PythonGenerator generates Python SDKs from OpenAPI specs.
// Usage example: declare a value of type generators.PythonGenerator in integrating code.
type PythonGenerator struct{}
// NewPythonGenerator creates a new Python generator.
// Usage example: call generators.NewPythonGenerator(...) from integrating code.
func NewPythonGenerator() *PythonGenerator {
return &PythonGenerator{}
}
// Language returns the generator's target language identifier.
// Usage example: call value.Language(...) from integrating code.
func (g *PythonGenerator) Language() string {
return "python"
}
// Available checks if generator dependencies are installed.
// Usage example: call value.Available(...) from integrating code.
func (g *PythonGenerator) Available() bool {
_, err := ax.LookPath("openapi-python-client")
return err == nil
}
// Install returns instructions for installing the generator.
// Usage example: call value.Install(...) from integrating code.
func (g *PythonGenerator) Install() string {
return "pip install openapi-python-client"
}
// Generate creates SDK from OpenAPI spec.
// Usage example: call value.Generate(...) from integrating code.
func (g *PythonGenerator) Generate(ctx context.Context, opts Options) error {
if err := coreio.Local.EnsureDir(opts.OutputDir); err != nil {
return coreerr.E("python.Generate", "failed to create output dir", err)
}
if g.Available() {
return g.generateNative(ctx, opts)
}
if !dockerRuntimeAvailable() {
return coreerr.E("python.Generate", "Docker is required for fallback generation but not available", nil)
}
return g.generateDocker(ctx, opts)
}
func (g *PythonGenerator) generateNative(ctx context.Context, opts Options) error {
parentDir := ax.Dir(opts.OutputDir)
return ax.ExecDir(ctx, parentDir, "openapi-python-client", "generate",
"--path", opts.SpecPath,
"--output-path", opts.OutputDir,
)
}
func (g *PythonGenerator) generateDocker(ctx context.Context, opts Options) error {
specDir := ax.Dir(opts.SpecPath)
specName := ax.Base(opts.SpecPath)
args := []string{"run", "--rm"}
args = append(args, dockerUserArgs()...)
args = append(args,
"-v", specDir+":/spec",
"-v", opts.OutputDir+":/out",
"openapitools/openapi-generator-cli", "generate",
"-i", "/spec/"+specName,
"-g", "python",
"-o", "/out",
"--additional-properties=packageName="+opts.PackageName,
)
return ax.Exec(ctx, "docker", args...)
}