Skip to content

Commit 31a7eb2

Browse files
committed
review: add installation step && update error message
1 parent f9d23ca commit 31a7eb2

File tree

4 files changed

+58
-25
lines changed

4 files changed

+58
-25
lines changed

cmd/create.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,24 @@ func (c CreateCmd) Create(ctx context.Context, ci CreateInput) error {
4646
return fmt.Errorf("failed to copy template files: %w", err)
4747
}
4848

49-
if err := create.InstallDependencies(appPath, ci.Language); err != nil {
50-
spinner.Fail("Failed to install dependencies")
51-
return fmt.Errorf("failed to install dependencies: %w", err)
49+
ok, _ := create.InstallDependencies(appPath, ci.Language)
50+
if !ok {
51+
pterm.Warning.Println("Failed to install dependencies. Please install them manually:")
52+
switch ci.Language {
53+
case create.LanguageTypeScript:
54+
pterm.Println(fmt.Sprintf(" cd %s", ci.Name))
55+
pterm.Println(" npm install")
56+
case create.LanguagePython:
57+
pterm.Println(fmt.Sprintf(" cd %s", ci.Name))
58+
pterm.Println(" uv venv && source .venv/bin/activate && uv sync")
59+
}
60+
pterm.Println()
61+
} else {
62+
spinner.Success(fmt.Sprintf("✔ %s environment set up successfully", ci.Language))
5263
}
5364

54-
spinner.Success(fmt.Sprintf("✔ %s environment set up successfully", ci.Language))
65+
pterm.Success.Println("🎉 Kernel app created successfully!")
66+
pterm.Println()
5567

5668
nextSteps := fmt.Sprintf(`Next steps:
5769
brew install onkernel/tap/kernel
@@ -61,8 +73,6 @@ func (c CreateCmd) Create(ctx context.Context, ci CreateInput) error {
6173
kernel invoke ts-basic get-page-title --payload '{"url": "https://www.google.com"}'
6274
`, ci.Name)
6375

64-
pterm.Success.Println("🎉 Kernel app created successfully!")
65-
pterm.Println()
6676
pterm.FgYellow.Println(nextSteps)
6777

6878
return nil

cmd/create_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,42 @@ func validatePythonTemplate(t *testing.T, appPath string, checkDependencies bool
218218
}
219219
}
220220

221+
// TestCreateCommand_DependencyInstallationFails tests that the app is still created
222+
// even when dependency installation fails, with appropriate warning message
223+
func TestCreateCommand_DependencyInstallationFails(t *testing.T) {
224+
tmpDir := t.TempDir()
225+
appName := "test-app"
226+
227+
orgDir, err := os.Getwd()
228+
require.NoError(t, err)
229+
230+
err = os.Chdir(tmpDir)
231+
require.NoError(t, err)
232+
233+
t.Cleanup(func() {
234+
os.Chdir(orgDir)
235+
})
236+
237+
// Override the install command to use a command that will fail
238+
originalInstallCommands := create.InstallCommands
239+
create.InstallCommands = map[string]string{
240+
create.LanguageTypeScript: "exit 1", // Command that always fails
241+
}
242+
243+
// Restore original install commands after test
244+
t.Cleanup(func() {
245+
create.InstallCommands = originalInstallCommands
246+
})
247+
248+
// Create the app - should succeed even though dependency installation fails
249+
c := CreateCmd{}
250+
err = c.Create(context.Background(), CreateInput{
251+
Name: appName,
252+
Language: create.LanguageTypeScript,
253+
Template: "sample-app",
254+
})
255+
}
256+
221257
func getTemplateInfo() []struct {
222258
name string
223259
language string

pkg/create/dependencies.go

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@ package create
33
import (
44
"fmt"
55
"os/exec"
6-
"path/filepath"
76

87
"github.com/pterm/pterm"
98
)
109

1110
// InstallDependencies sets up project dependencies based on language
12-
func InstallDependencies(appPath string, language string) error {
11+
func InstallDependencies(appPath string, language string) (bool, error) {
1312
installCommand, ok := InstallCommands[language]
1413
if !ok {
15-
return fmt.Errorf("unsupported language: %s", language)
14+
return false, fmt.Errorf("unsupported language: %s", language)
1615
}
1716

1817
spinner, _ := pterm.DefaultSpinner.Start(fmt.Sprintf("Setting up %s environment...", language))
@@ -21,22 +20,10 @@ func InstallDependencies(appPath string, language string) error {
2120
cmd.Dir = appPath
2221

2322
if err := cmd.Run(); err != nil {
24-
spinner.Fail(fmt.Sprintf("Failed to set up %s environment", language))
25-
pterm.Error.Printf("Error: %v\n", err)
26-
27-
pterm.FgYellow.Println("\nPlease install dependencies manually:")
28-
switch language {
29-
case LanguageTypeScript:
30-
pterm.Println(fmt.Sprintf(" cd %s", filepath.Base(appPath)))
31-
pterm.Println(" npm install")
32-
case LanguagePython:
33-
pterm.Println(fmt.Sprintf(" cd %s", filepath.Base(appPath)))
34-
pterm.Println(" uv venv && source .venv/bin/activate && uv sync")
35-
}
36-
37-
return nil
23+
spinner.Stop()
24+
return false, nil
3825
}
3926

4027
spinner.Success(fmt.Sprintf("%s environment set up successfully", language))
41-
return nil
28+
return true, nil
4229
}

pkg/create/types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const (
1616

1717
var InstallCommands = map[string]string{
1818
LanguageTypeScript: "npm install",
19-
LanguagePython: "uv venv",
19+
LanguagePython: "uv venv && source .venv/bin/activate && uv sync",
2020
}
2121

2222
// SupportedLanguages returns a list of all supported languages

0 commit comments

Comments
 (0)