refactor: replace loadProjectFromContent with compose.LoadProjectFromContent

This commit is contained in:
Pasha Sviderski
2025-11-20 16:03:47 +10:00
parent 57205e1149
commit 6a1cd7bf87
3 changed files with 29 additions and 61 deletions
+12 -1
View File
@@ -1,8 +1,11 @@
package compose package compose
import ( import (
"context"
"os"
"testing" "testing"
composecli "github.com/compose-spec/compose-go/v2/cli"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
@@ -178,7 +181,15 @@ services:
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
project, err := loadProjectFromContent(t, tt.composeYAML) // Get current working directory for relative path resolution to testdata directory.
wd, err := os.Getwd()
require.NoError(t, err)
project, err := LoadProjectFromContent(
context.Background(),
tt.composeYAML,
composecli.WithWorkingDirectory(wd),
)
if tt.wantErr != "" { if tt.wantErr != "" {
require.ErrorContains(t, err, tt.wantErr) require.ErrorContains(t, err, tt.wantErr)
+4 -3
View File
@@ -1,6 +1,7 @@
package compose package compose
import ( import (
"context"
"net/netip" "net/netip"
"testing" "testing"
@@ -301,7 +302,7 @@ services:
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
t.Parallel() t.Parallel()
project, err := loadProjectFromContent(t, tt.content) project, err := LoadProjectFromContent(context.Background(), tt.content)
if tt.wantErr != "" { if tt.wantErr != "" {
require.Error(t, err) require.Error(t, err)
assert.Contains(t, err.Error(), tt.wantErr) assert.Contains(t, err.Error(), tt.wantErr)
@@ -375,7 +376,7 @@ services:
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
t.Parallel() t.Parallel()
project, err := loadProjectFromContent(t, tt.content) project, err := LoadProjectFromContent(context.Background(), tt.content)
require.NoError(t, err) require.NoError(t, err)
service, err := project.GetService("web") service, err := project.GetService("web")
@@ -402,7 +403,7 @@ services:
- "9090:9090/tcp@host" - "9090:9090/tcp@host"
` `
project, err := loadProjectFromContent(t, content) project, err := LoadProjectFromContent(context.Background(), content)
require.NoError(t, err) require.NoError(t, err)
service, err := project.GetService("web") service, err := project.GetService("web")
+13 -57
View File
@@ -3,13 +3,13 @@ package compose
import ( import (
"context" "context"
"net/netip" "net/netip"
"os"
"path/filepath" "path/filepath"
"slices" "slices"
"strings" "strings"
"testing" "testing"
"github.com/compose-spec/compose-go/v2/loader" composecli "github.com/compose-spec/compose-go/v2/cli"
"github.com/compose-spec/compose-go/v2/types"
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/mount"
"github.com/docker/go-units" "github.com/docker/go-units"
@@ -20,58 +20,6 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
// loadProjectFromContent loads a compose project from YAML content.
// Keep the implementation in sync with LoadProject.
// TODO(lhf): remove and replace with compose.LoadProjectFromContent
func loadProjectFromContent(t *testing.T, content string) (*types.Project, error) {
t.Helper()
ctx := context.Background()
configDetails := types.ConfigDetails{
ConfigFiles: []types.ConfigFile{
{
Filename: "docker-compose.yml",
Content: []byte(content),
},
},
}
project, err := loader.LoadWithContext(ctx, configDetails, func(o *loader.Options) {
o.SetProjectName("test", true)
// Register our custom extensions
if o.KnownExtensions == nil {
o.KnownExtensions = map[string]any{}
}
o.KnownExtensions[CaddyExtensionKey] = Caddy{}
o.KnownExtensions[PortsExtensionKey] = PortsSource{}
o.KnownExtensions[MachinesExtensionKey] = MachinesSource{}
})
if err != nil {
return nil, err
}
removeProjectPrefixFromNames(project)
// Apply extension transformations since we're not using LoadProject.
if project, err = transformServicesCaddyExtension(project); err != nil {
return nil, err
}
if project, err = transformServicesPortsExtension(project); err != nil {
return nil, err
}
// Validate extension combinations after all transformations.
if err = validateServicesExtensions(project); err != nil {
return nil, err
}
// Process image templates in services to expand Go template expressions using git repo state.
if project, err = ProcessImageTemplates(project); err != nil {
return nil, err
}
return project, nil
}
func TestServiceSpecFromCompose(t *testing.T) { func TestServiceSpecFromCompose(t *testing.T) {
t.Parallel() t.Parallel()
@@ -432,7 +380,15 @@ services:
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
project, err := loadProjectFromContent(t, tt.composeYAML) // Get current working directory for relative path resolution to testdata directory.
wd, err := os.Getwd()
require.NoError(t, err)
project, err := LoadProjectFromContent(
context.Background(),
tt.composeYAML,
composecli.WithWorkingDirectory(wd),
)
require.NoError(t, err) require.NoError(t, err)
spec, err := ServiceSpecFromCompose(project, "web") spec, err := ServiceSpecFromCompose(project, "web")
@@ -618,7 +574,7 @@ services:
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
project, err := loadProjectFromContent(t, tt.composeYAML) project, err := LoadProjectFromContent(context.Background(), tt.composeYAML)
require.NoError(t, err) require.NoError(t, err)
spec, err := ServiceSpecFromCompose(project, "ai") spec, err := ServiceSpecFromCompose(project, "ai")
@@ -766,7 +722,7 @@ services:
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
project, err := loadProjectFromContent(t, tt.composeYAML) project, err := LoadProjectFromContent(context.Background(), tt.composeYAML)
if tt.expectError { if tt.expectError {
assert.Error(t, err) assert.Error(t, err)