Skip to content

Commit 5949dde

Browse files
authored
fix(CLI): Fix creating projects from CLI with spaces in their name (SCD-52) (#1042)
1 parent 08f1eac commit 5949dde

File tree

3 files changed

+98
-4
lines changed

3 files changed

+98
-4
lines changed

clients/cli/cmd/internal/init.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ func (cmd *InitCommand) newProject() error {
221221
}
222222

223223
for {
224-
err := prompt.P("Enter the name of the new project:", &params.Name)
224+
err := prompt.Line("Enter the name of the new project:", &params.Name)
225225
if err == nil {
226226
break
227227
}

clients/cli/cmd/internal/prompt/prompt.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package prompt
33
import (
44
"bufio"
55
"fmt"
6-
"io"
76
"os"
7+
"strings"
88
)
99

1010
var stdin = bufio.NewReader(os.Stdin)
@@ -26,11 +26,27 @@ func P(msg string, args ...interface{}) error {
2626
return err
2727
}
2828

29+
// Line prints msg, then reads a line of user input. The input line is then cleaned of whitespace and assigned to val.
30+
func Line(msg string, val *string) error {
31+
fmt.Print(msg + " ")
32+
33+
line, err := stdin.ReadString('\n')
34+
if err != nil {
35+
return err
36+
}
37+
38+
*val = strings.TrimSpace(line)
39+
if *val == "" {
40+
return fmt.Errorf("empty input")
41+
}
42+
return nil
43+
}
44+
2945
// WithDefault prints msg, then parses a line of user input into
3046
func WithDefault(msg string, arg *string, defaultValue string) error {
31-
err := P(msg+" "+fmt.Sprintf("[default %v]", defaultValue), arg)
47+
err := Line(msg+" "+fmt.Sprintf("[default %v]", defaultValue), arg)
3248

33-
if err == io.EOF {
49+
if err != nil {
3450
*arg = defaultValue
3551
return nil
3652
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package prompt
2+
3+
import (
4+
"bufio"
5+
"strings"
6+
"testing"
7+
)
8+
9+
func TestLine(t *testing.T) {
10+
input := " My Project Name \n"
11+
reader := bufio.NewReader(strings.NewReader(input))
12+
oldStdin := stdin
13+
defer func() { stdin = oldStdin }()
14+
stdin = reader
15+
16+
var result string
17+
err := Line("Prompt:", &result)
18+
if err != nil {
19+
t.Errorf("Line returned error: %v", err)
20+
}
21+
22+
expected := "My Project Name"
23+
if result != expected {
24+
t.Errorf("Expected '%s', got '%s'", expected, result)
25+
}
26+
}
27+
28+
func TestLine_Empty(t *testing.T) {
29+
input := "\n"
30+
reader := bufio.NewReader(strings.NewReader(input))
31+
oldStdin := stdin
32+
defer func() { stdin = oldStdin }()
33+
stdin = reader
34+
35+
var result string
36+
err := Line("Prompt:", &result)
37+
if err == nil {
38+
t.Error("Line expected error for empty input, got nil")
39+
}
40+
}
41+
42+
func TestWithDefault_Default(t *testing.T) {
43+
input := "\n"
44+
reader := bufio.NewReader(strings.NewReader(input))
45+
oldStdin := stdin
46+
defer func() { stdin = oldStdin }()
47+
stdin = reader
48+
49+
var result string
50+
err := WithDefault("Prompt:", &result, "default")
51+
if err != nil {
52+
t.Errorf("WithDefault returned error: %v", err)
53+
}
54+
55+
expected := "default"
56+
if result != expected {
57+
t.Errorf("Expected '%s', got '%s'", expected, result)
58+
}
59+
}
60+
61+
func TestWithDefault_Input(t *testing.T) {
62+
input := "user input\n"
63+
reader := bufio.NewReader(strings.NewReader(input))
64+
oldStdin := stdin
65+
defer func() { stdin = oldStdin }()
66+
stdin = reader
67+
68+
var result string
69+
err := WithDefault("Prompt:", &result, "default")
70+
if err != nil {
71+
t.Errorf("WithDefault returned error: %v", err)
72+
}
73+
74+
expected := "user input"
75+
if result != expected {
76+
t.Errorf("Expected '%s', got '%s'", expected, result)
77+
}
78+
}

0 commit comments

Comments
 (0)