Skip to content

Commit 9ada937

Browse files
authored
Merge branch 'main' into chore-bump-golang
2 parents e868165 + 35e1743 commit 9ada937

134 files changed

Lines changed: 4641 additions & 2431 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/CLAUDE.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ make lint # Run golangci-lint
3131
golangci-lint --version # Verify linter version
3232
```
3333

34+
### Formatting
35+
36+
Always run `gofmt -w` on changed Go files after making edits to ensure proper formatting.
37+
3438
### Other Commands
3539

3640
```bash

cmd/app/add.go

Lines changed: 4 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,10 @@ package app
1616

1717
import (
1818
"context"
19-
"fmt"
2019

2120
"github.com/slackapi/slack-cli/internal/app"
2221
"github.com/slackapi/slack-cli/internal/cmdutil"
2322
"github.com/slackapi/slack-cli/internal/config"
24-
"github.com/slackapi/slack-cli/internal/experiment"
25-
"github.com/slackapi/slack-cli/internal/logger"
2623
"github.com/slackapi/slack-cli/internal/pkg/apps"
2724
"github.com/slackapi/slack-cli/internal/prompts"
2825
"github.com/slackapi/slack-cli/internal/shared"
@@ -85,9 +82,6 @@ func preRunAddCommand(ctx context.Context, clients *shared.ClientFactory, cmd *c
8582
if err != nil {
8683
return err
8784
}
88-
if !clients.Config.WithExperimentOn(experiment.BoltFrameworks) {
89-
return nil
90-
}
9185
clients.Config.SetFlags(cmd)
9286
return nil
9387
}
@@ -186,11 +180,8 @@ func RunAddCommand(ctx context.Context, clients *shared.ClientFactory, selection
186180

187181
clients.Config.ManifestEnv = app.SetManifestEnvTeamVars(clients.Config.ManifestEnv, selection.App.TeamDomain, selection.App.IsDev)
188182

189-
// Set up event logger
190-
log := newAddLogger(clients, selection.Auth.TeamDomain)
191-
192183
// Install dev app or prod app to a workspace
193-
installedApp, installState, err := appInstall(ctx, clients, log, selection, orgGrantWorkspaceID)
184+
installedApp, installState, err := appInstall(ctx, clients, selection, orgGrantWorkspaceID)
194185
if err != nil {
195186
return ctx, installState, types.App{}, err // pass the installState because some callers may use it to handle the error
196187
}
@@ -201,74 +192,19 @@ func RunAddCommand(ctx context.Context, clients *shared.ClientFactory, selection
201192
return ctx, installState, installedApp, nil
202193
}
203194

204-
// newAddLogger creates a logger instance to receive event notifications
205-
func newAddLogger(clients *shared.ClientFactory, envName string) *logger.Logger {
206-
return logger.New(
207-
// OnEvent
208-
func(event *logger.LogEvent) {
209-
teamName := event.DataToString("teamName")
210-
appName := event.DataToString("appName")
211-
switch event.Name {
212-
case "app_install_manifest":
213-
// Ignore this event and format manifest outputs in create/update events
214-
case "app_install_manifest_create":
215-
_, _ = clients.IO.WriteOut().Write([]byte(style.Sectionf(style.TextSection{
216-
Emoji: "books",
217-
Text: "App Manifest",
218-
Secondary: []string{
219-
fmt.Sprintf(`Creating app manifest for "%s" in "%s"`, appName, teamName),
220-
},
221-
})))
222-
case "app_install_manifest_update":
223-
_, _ = clients.IO.WriteOut().Write([]byte("\n" + style.Sectionf(style.TextSection{
224-
Emoji: "books",
225-
Text: "App Manifest",
226-
Secondary: []string{
227-
fmt.Sprintf(`Updated app manifest for "%s" in "%s"`, appName, teamName),
228-
},
229-
})))
230-
case "app_install_start":
231-
_, _ = clients.IO.WriteOut().Write([]byte("\n" + style.Sectionf(style.TextSection{
232-
Emoji: "house",
233-
Text: "App Install",
234-
Secondary: []string{
235-
fmt.Sprintf(`Installing "%s" app to "%s"`, appName, teamName),
236-
},
237-
})))
238-
case "app_install_icon_success":
239-
iconPath := event.DataToString("iconPath")
240-
_, _ = clients.IO.WriteOut().Write([]byte(
241-
style.SectionSecondaryf("Updated app icon: %s", iconPath),
242-
))
243-
case "app_install_icon_error":
244-
iconError := event.DataToString("iconError")
245-
_, _ = clients.IO.WriteOut().Write([]byte(
246-
style.SectionSecondaryf("Error updating app icon: %s", iconError),
247-
))
248-
case "app_install_complete":
249-
_, _ = clients.IO.WriteOut().Write([]byte(
250-
style.SectionSecondaryf("Finished in %s", event.DataToString("installTime")),
251-
))
252-
default:
253-
// Ignore the event
254-
}
255-
},
256-
)
257-
}
258-
259195
// printAddSuccess will print a list of the environments
260196
func printAddSuccess(clients *shared.ClientFactory, cmd *cobra.Command, appInstance types.App) error {
261197
return runListCommand(cmd, clients)
262198
}
263199

264200
// appInstall will install an app to a team. It supports both local and deployed app types.
265-
func appInstall(ctx context.Context, clients *shared.ClientFactory, log *logger.Logger, selection *prompts.SelectedApp, orgGrantWorkspaceID string) (types.App, types.InstallState, error) {
201+
func appInstall(ctx context.Context, clients *shared.ClientFactory, selection *prompts.SelectedApp, orgGrantWorkspaceID string) (types.App, types.InstallState, error) {
266202
if selection != nil && selection.App.IsDev {
267203
// Install local dev app to a team
268-
installedApp, _, installState, err := appInstallDevAppFunc(ctx, clients, "", log, selection.Auth, selection.App)
204+
installedApp, _, installState, err := appInstallDevAppFunc(ctx, clients, "", selection.Auth, selection.App)
269205
return installedApp, installState, err
270206
} else {
271-
installState, installedApp, err := appInstallProdAppFunc(ctx, clients, log, selection.Auth, selection.App, orgGrantWorkspaceID)
207+
installState, installedApp, err := appInstallProdAppFunc(ctx, clients, selection.Auth, selection.App, orgGrantWorkspaceID)
272208
return installedApp, installState, err
273209
}
274210
}

cmd/app/add_test.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
"github.com/slackapi/slack-cli/internal/cache"
2424
"github.com/slackapi/slack-cli/internal/cmdutil"
2525
"github.com/slackapi/slack-cli/internal/config"
26-
"github.com/slackapi/slack-cli/internal/experiment"
2726
"github.com/slackapi/slack-cli/internal/iostreams"
2827
"github.com/slackapi/slack-cli/internal/prompts"
2928
"github.com/slackapi/slack-cli/internal/shared"
@@ -85,25 +84,21 @@ func TestAppAddCommandPreRun(t *testing.T) {
8584
cf.SDKConfig.WorkingDirectory = "."
8685
},
8786
},
88-
"proceeds if manifest.source is local with the bolt experiment": {
87+
"proceeds if manifest.source is local": {
8988
ExpectedError: nil,
9089
Setup: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock, cf *shared.ClientFactory) {
9190
cf.SDKConfig.WorkingDirectory = "."
9291
cm.AddDefaultMocks()
93-
cm.Config.ExperimentsFlag = append(cm.Config.ExperimentsFlag, string(experiment.BoltFrameworks))
94-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
9592
mockProjectConfig := config.NewProjectConfigMock()
9693
mockProjectConfig.On("GetManifestSource", mock.Anything).Return(config.ManifestSourceLocal, nil)
9794
cm.Config.ProjectConfig = mockProjectConfig
9895
},
9996
},
100-
"proceeds if manifest.source is remote with the bolt experiment": {
97+
"proceeds if manifest.source is remote": {
10198
ExpectedError: nil,
10299
Setup: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock, cf *shared.ClientFactory) {
103100
cf.SDKConfig.WorkingDirectory = "."
104101
cm.AddDefaultMocks()
105-
cm.Config.ExperimentsFlag = append(cm.Config.ExperimentsFlag, string(experiment.BoltFrameworks))
106-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
107102
mockProjectConfig := config.NewProjectConfigMock()
108103
mockProjectConfig.On("GetManifestSource", mock.Anything).Return(config.ManifestSourceRemote, nil)
109104
cm.Config.ProjectConfig = mockProjectConfig
@@ -207,6 +202,7 @@ func TestAppAddCommand(t *testing.T) {
207202
mockProjectCache.On("SetManifestHash", mock.Anything, mock.Anything, mock.Anything).
208203
Return(nil)
209204
mockProjectConfig := config.NewProjectConfigMock()
205+
mockProjectConfig.On("GetManifestSource", mock.Anything).Return(config.ManifestSourceLocal, nil)
210206
mockProjectConfig.On("Cache").Return(mockProjectCache)
211207
cm.Config.ProjectConfig = mockProjectConfig
212208
},
@@ -279,6 +275,7 @@ func TestAppAddCommand(t *testing.T) {
279275
mockProjectCache.On("SetManifestHash", mock.Anything, mock.Anything, mock.Anything).
280276
Return(nil)
281277
mockProjectConfig := config.NewProjectConfigMock()
278+
mockProjectConfig.On("GetManifestSource", mock.Anything).Return(config.ManifestSourceLocal, nil)
282279
mockProjectConfig.On("Cache").Return(mockProjectCache)
283280
cm.Config.ProjectConfig = mockProjectConfig
284281
},
@@ -343,7 +340,7 @@ func TestAppAddCommand(t *testing.T) {
343340
nil,
344341
)
345342

346-
// Mock existing and updated cache
343+
// Mock existing and updated cache - hashes must match for update to proceed
347344
cm.API.On(
348345
"ExportAppManifest",
349346
mock.Anything,
@@ -357,10 +354,11 @@ func TestAppAddCommand(t *testing.T) {
357354
mockProjectCache.On("GetManifestHash", mock.Anything, mock.Anything).
358355
Return(cache.Hash("b4b4"), nil)
359356
mockProjectCache.On("NewManifestHash", mock.Anything, mock.Anything).
360-
Return(cache.Hash("xoxo"), nil)
357+
Return(cache.Hash("b4b4"), nil) // matching hash allows update to proceed
361358
mockProjectCache.On("SetManifestHash", mock.Anything, mock.Anything, mock.Anything).
362359
Return(nil)
363360
mockProjectConfig := config.NewProjectConfigMock()
361+
mockProjectConfig.On("GetManifestSource", mock.Anything).Return(config.ManifestSourceLocal, nil)
364362
mockProjectConfig.On("Cache").Return(mockProjectCache)
365363
cm.Config.ProjectConfig = mockProjectConfig
366364
},
@@ -428,6 +426,7 @@ func TestAppAddCommand(t *testing.T) {
428426
mockProjectCache.On("SetManifestHash", mock.Anything, mock.Anything, mock.Anything).
429427
Return(nil)
430428
mockProjectConfig := config.NewProjectConfigMock()
429+
mockProjectConfig.On("GetManifestSource", mock.Anything).Return(config.ManifestSourceLocal, nil)
431430
mockProjectConfig.On("Cache").Return(mockProjectCache)
432431
cm.Config.ProjectConfig = mockProjectConfig
433432
},
@@ -515,6 +514,7 @@ func TestAppAddCommand(t *testing.T) {
515514
mockProjectCache.On("SetManifestHash", mock.Anything, mock.Anything, mock.Anything).
516515
Return(nil)
517516
mockProjectConfig := config.NewProjectConfigMock()
517+
mockProjectConfig.On("GetManifestSource", mock.Anything).Return(config.ManifestSourceLocal, nil)
518518
mockProjectConfig.On("Cache").Return(mockProjectCache)
519519
cm.Config.ProjectConfig = mockProjectConfig
520520
},
@@ -599,6 +599,7 @@ func TestAppAddCommand(t *testing.T) {
599599
mockProjectCache.On("SetManifestHash", mock.Anything, mock.Anything, mock.Anything).
600600
Return(nil)
601601
mockProjectConfig := config.NewProjectConfigMock()
602+
mockProjectConfig.On("GetManifestSource", mock.Anything).Return(config.ManifestSourceLocal, nil)
602603
mockProjectConfig.On("Cache").Return(mockProjectCache)
603604
cm.Config.ProjectConfig = mockProjectConfig
604605
},
@@ -685,6 +686,7 @@ func TestAppAddCommand(t *testing.T) {
685686
mockProjectCache.On("SetManifestHash", mock.Anything, mock.Anything, mock.Anything).
686687
Return(nil)
687688
mockProjectConfig := config.NewProjectConfigMock()
689+
mockProjectConfig.On("GetManifestSource", mock.Anything).Return(config.ManifestSourceLocal, nil)
688690
mockProjectConfig.On("Cache").Return(mockProjectCache)
689691
cm.Config.ProjectConfig = mockProjectConfig
690692
},
@@ -760,6 +762,7 @@ func TestAppAddCommand(t *testing.T) {
760762
mockProjectCache.On("SetManifestHash", mock.Anything, mock.Anything, mock.Anything).
761763
Return(nil)
762764
mockProjectConfig := config.NewProjectConfigMock()
765+
mockProjectConfig.On("GetManifestSource", mock.Anything).Return(config.ManifestSourceLocal, nil)
763766
mockProjectConfig.On("Cache").Return(mockProjectCache)
764767
cm.Config.ProjectConfig = mockProjectConfig
765768
},
@@ -816,6 +819,7 @@ func TestAppAddCommand(t *testing.T) {
816819
mockProjectCache.On("SetManifestHash", mock.Anything, mock.Anything, mock.Anything).
817820
Return(nil)
818821
mockProjectConfig := config.NewProjectConfigMock()
822+
mockProjectConfig.On("GetManifestSource", mock.Anything).Return(config.ManifestSourceLocal, nil)
819823
mockProjectConfig.On("Cache").Return(mockProjectCache)
820824
cm.Config.ProjectConfig = mockProjectConfig
821825
},
@@ -872,6 +876,7 @@ func TestAppAddCommand(t *testing.T) {
872876
mockProjectCache.On("SetManifestHash", mock.Anything, mock.Anything, mock.Anything).
873877
Return(nil)
874878
mockProjectConfig := config.NewProjectConfigMock()
879+
mockProjectConfig.On("GetManifestSource", mock.Anything).Return(config.ManifestSourceLocal, nil)
875880
mockProjectConfig.On("Cache").Return(mockProjectCache)
876881
cm.Config.ProjectConfig = mockProjectConfig
877882
},

cmd/app/delete.go

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020

2121
"github.com/slackapi/slack-cli/internal/cmdutil"
2222
"github.com/slackapi/slack-cli/internal/iostreams"
23-
"github.com/slackapi/slack-cli/internal/logger"
2423
"github.com/slackapi/slack-cli/internal/pkg/apps"
2524
"github.com/slackapi/slack-cli/internal/prompts"
2625
"github.com/slackapi/slack-cli/internal/shared"
@@ -99,30 +98,14 @@ func RunDeleteCommand(ctx context.Context, clients *shared.ClientFactory, cmd *c
9998
}
10099
}
101100

102-
// Set up event logger and execute the command
103-
log := newDeleteLogger(clients, cmd, team)
104-
log.Data["appID"] = selection.App.AppID
105-
env, err := apps.Delete(ctx, clients, log, team, selection.App, selection.Auth)
106-
107-
return env, err
108-
}
101+
// Execute the command
102+
env, teamName, err := apps.Delete(ctx, clients, team, selection.App, selection.Auth)
103+
if err != nil {
104+
return env, err
105+
}
106+
printDeleteApp(ctx, clients, selection.App.AppID, teamName)
109107

110-
// newDeleteLogger creates a logger instance to receive event notifications
111-
func newDeleteLogger(clients *shared.ClientFactory, cmd *cobra.Command, envName string) *logger.Logger {
112-
ctx := cmd.Context()
113-
return logger.New(
114-
// OnEvent
115-
func(event *logger.LogEvent) {
116-
appID := event.DataToString("appID")
117-
teamName := event.DataToString("teamName")
118-
switch event.Name {
119-
case "on_apps_delete_app_success":
120-
printDeleteApp(ctx, clients, appID, teamName)
121-
default:
122-
// Ignore the event
123-
}
124-
},
125-
)
108+
return env, nil
126109
}
127110

128111
func confirmDeletion(ctx context.Context, IO iostreams.IOStreamer, app prompts.SelectedApp) (bool, error) {

0 commit comments

Comments
 (0)