Skip to content

Commit 74cad17

Browse files
committed
STAC-22599: Add --display-name to sts stackpack scaffold command
1 parent 8615b67 commit 74cad17

5 files changed

Lines changed: 98 additions & 7 deletions

File tree

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,5 @@ result
2121
.gocache/
2222
release-notes.md
2323
release-notes.json
24+
25+
CLAUDE.*.md

cmd/stackpack/stackpack_scaffold.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ import (
1313
)
1414

1515
const (
16-
defaultTemplateGitHubRepo = "stackvista/stac-22599" // Default path in GitHub repo for templates
17-
defaultTemplateGitHubRef = "main" // Default branch for GitHub templates
18-
defaultTemplateGitHubPath = "templates" // Default path in GitHub repo for templates
19-
defaultTemplateName = "generic" // Default template name to use
16+
defaultTemplateGitHubRepo = "StackVista/stackpack-templates" // Default path in GitHub repo for templates
17+
defaultTemplateGitHubRef = "main" // Default branch for GitHub templates
18+
defaultTemplateGitHubPath = "templates" // Default path in GitHub repo for templates
19+
defaultTemplateName = "generic" // Default template name to use
2020
)
2121

2222
type ScaffoldArgs struct {
@@ -31,6 +31,7 @@ type ScaffoldArgs struct {
3131
// Common flags
3232
DestinationDir string
3333
Name string
34+
DisplayName string
3435
TemplateName string
3536
Force bool
3637
}
@@ -68,6 +69,7 @@ sts stackpack scaffold --template-github-repo stackvista/my-templates --name my-
6869
// Common flags
6970
cmd.Flags().StringVar(&args.DestinationDir, "destination-dir", "", "Target directory where scaffolded files will be created. If not specified, uses current working directory")
7071
cmd.Flags().StringVar(&args.Name, "name", "", "Name of the stackpack (required)")
72+
cmd.Flags().StringVar(&args.DisplayName, "display-name", "", "Name that's displayed on both the StackPack listing page and on the title of the StackPack page. If not provided, the value of --name will be used")
7173
cmd.Flags().StringVar(&args.TemplateName, "template-name", defaultTemplateName, fmt.Sprintf("Name of the template subdirectory to use (default: %s)", defaultTemplateName))
7274
cmd.Flags().BoolVar(&args.Force, "force", false, "Overwrite existing files without prompting")
7375

@@ -110,8 +112,13 @@ func RunStackpackScaffoldCommand(args *ScaffoldArgs) func(cli *di.Deps, cmd *cob
110112
}
111113

112114
// Create template context
115+
displayName := args.DisplayName
116+
if displayName == "" {
117+
displayName = args.Name
118+
}
113119
context := scaffold.TemplateContext{
114120
Name: args.Name,
121+
DisplayName: displayName,
115122
TemplateName: args.TemplateName,
116123
}
117124

cmd/stackpack/stackpack_scaffold_test.go

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,9 +419,10 @@ func TestStackpackScaffoldCommand_TemplateContextPassedCorrectly(t *testing.T) {
419419
err = os.MkdirAll(customTemplateDir, 0755)
420420
require.NoError(t, err)
421421

422-
// Create a test template file with both Name and TemplateName variables
422+
// Create a test template file with Name, DisplayName, and TemplateName variables
423423
templateFile := filepath.Join(customTemplateDir, "config.yaml")
424424
templateContent := `name: <<.Name>>
425+
display_name: <<.DisplayName>>
425426
template: <<.TemplateName>>
426427
`
427428
err = os.WriteFile(templateFile, []byte(templateContent), 0644)
@@ -450,6 +451,7 @@ template: <<.TemplateName>>
450451
require.NoError(t, err)
451452

452453
expectedContent := `name: my-awesome-stackpack
454+
display_name: my-awesome-stackpack
453455
template: custom-template
454456
`
455457
assert.Equal(t, expectedContent, string(content))
@@ -546,6 +548,85 @@ func TestDisplayNextSteps(t *testing.T) {
546548
assert.Contains(t, allOutput, "Build your stackpack")
547549
}
548550

551+
func TestStackpackScaffoldCommand_DisplayNameFallback(t *testing.T) {
552+
// Create temporary directories for testing
553+
tempDir, err := os.MkdirTemp("", "stackpack-scaffold-displayname-test-*")
554+
require.NoError(t, err)
555+
defer os.RemoveAll(tempDir)
556+
557+
// Create a mock template structure
558+
templateDir := filepath.Join(tempDir, "templates")
559+
customTemplateDir := filepath.Join(templateDir, "custom-template")
560+
err = os.MkdirAll(customTemplateDir, 0755)
561+
require.NoError(t, err)
562+
563+
// Create a test template file with DisplayName variable
564+
templateFile := filepath.Join(customTemplateDir, "test-displayname.yaml")
565+
templateContent := `name: <<.Name>>
566+
display_name: <<.DisplayName>>
567+
`
568+
err = os.WriteFile(templateFile, []byte(templateContent), 0644)
569+
require.NoError(t, err)
570+
571+
// Create destination directory
572+
destDir := filepath.Join(tempDir, "destination")
573+
err = os.MkdirAll(destDir, 0755)
574+
require.NoError(t, err)
575+
576+
tests := []struct {
577+
name string
578+
args []string
579+
expectedDisplayName string
580+
description string
581+
}{
582+
{
583+
name: "with display-name flag provided",
584+
args: []string{
585+
"--name", "my-stackpack",
586+
"--display-name", "My Awesome StackPack",
587+
"--template-local-dir", templateDir,
588+
"--template-name", "custom-template",
589+
"--destination-dir", destDir,
590+
},
591+
expectedDisplayName: "My Awesome StackPack",
592+
description: "Should use provided display name",
593+
},
594+
{
595+
name: "without display-name flag - should fallback to name",
596+
args: []string{
597+
"--name", "my-stackpack-fallback",
598+
"--template-local-dir", templateDir,
599+
"--template-name", "custom-template",
600+
"--destination-dir", destDir,
601+
},
602+
expectedDisplayName: "my-stackpack-fallback",
603+
description: "Should fallback to name when display-name not provided",
604+
},
605+
}
606+
607+
for _, tt := range tests {
608+
t.Run(tt.name, func(t *testing.T) {
609+
cli, cmd := setupStackpackScaffoldCmd(t)
610+
611+
_, err := di.ExecuteCommandWithContext(&cli.Deps, cmd, tt.args...)
612+
defer removeStackPack()
613+
require.NoError(t, err, tt.description)
614+
615+
// Verify the template variables were substituted correctly
616+
createdFile := filepath.Join(destDir, "test-displayname.yaml")
617+
content, err := os.ReadFile(createdFile)
618+
require.NoError(t, err)
619+
620+
// Check that DisplayName was correctly used
621+
assert.Contains(t, string(content), "display_name: "+tt.expectedDisplayName, tt.description)
622+
623+
// Clean up for next test iteration
624+
_ = os.RemoveAll(destDir)
625+
_ = os.MkdirAll(destDir, 0755)
626+
})
627+
}
628+
}
629+
549630
func removeStackPack() {
550631
_ = os.RemoveAll("src")
551632
_ = os.Remove("version.sbt")

pkg/scaffold/scaffolder.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const (
1818
// TemplateContext holds the variables for template rendering
1919
type TemplateContext struct {
2020
Name string // Stackpack name (e.g. "my-stackpack")
21+
DisplayName string // Display name for the stackpack
2122
TemplateName string // Template name used for scaffolding
2223
}
2324

pkg/scaffold/scaffolder_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func (m *MockPrinter) PrintWarn(message string) {
5555

5656
func TestNewScaffolder(t *testing.T) {
5757
mockSource := &MockTemplateSource{stringResult: "mock-source"}
58-
context := TemplateContext{Name: "test-name", TemplateName: "test-template"}
58+
context := TemplateContext{Name: "test-name", DisplayName: "test-name", TemplateName: "test-template"}
5959
mockPrinter := &MockPrinter{}
6060

6161
scaffolder := NewScaffolder(mockSource, "/test/dest", context, true, mockPrinter, false)
@@ -87,7 +87,7 @@ func TestScaffolder_validateArgs(t *testing.T) {
8787
}{
8888
{
8989
name: "valid args",
90-
context: TemplateContext{Name: "test-name", TemplateName: "test-template"},
90+
context: TemplateContext{Name: "test-name", DisplayName: "test-name", TemplateName: "test-template"},
9191
sourceErr: nil,
9292
wantErr: false,
9393
},

0 commit comments

Comments
 (0)