Skip to content

Commit 27ba074

Browse files
authored
Merge branch 'main' into ale-set-icon
2 parents febaece + a6658e3 commit 27ba074

7 files changed

Lines changed: 111 additions & 65 deletions

File tree

cmd/feedback/feedback.go

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,8 @@ const (
6868

6969
// Supported survey names
7070
const (
71-
SlackCLIFeedback = "slack-cli"
72-
SlackPlatformFeedback = "slack-platform"
73-
SlackPlatformFeedbackDeprecated = "platform-improvements" // DEPRECATED(semver:major)
71+
SlackCLIFeedback = "slack-cli"
72+
SlackPlatformFeedback = "slack-platform"
7473
)
7574

7675
type SurveyConfigInterface interface {
@@ -241,12 +240,6 @@ func runFeedbackCommand(ctx context.Context, clients *shared.ClientFactory, cmd
241240
return nil
242241
}
243242

244-
// DEPRECATED(semver:major): Support the deprecated survey name for backwards compatibility
245-
if surveyNameFlag == SlackPlatformFeedbackDeprecated {
246-
surveyNameFlag = SlackPlatformFeedback
247-
clients.IO.PrintWarning(ctx, "DEPRECATED: The '--name %s' flag is deprecated; use '--name %s' instead", SlackPlatformFeedbackDeprecated, SlackPlatformFeedback)
248-
}
249-
250243
surveyNames, surveyPromptOptions := initSurveyOpts(ctx, clients, SurveyStore)
251244

252245
if _, ok := SurveyStore[surveyNameFlag]; !ok && surveyNameFlag != "" {

cmd/feedback/feedback_test.go

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -263,17 +263,6 @@ func TestShowSurveyMessages(t *testing.T) {
263263

264264
func Test_Feedback_FeedbackCommand(t *testing.T) {
265265
testutil.TableTestCommand(t, testutil.CommandTests{
266-
// DEPRECATED(semver:major): Support the deprecated survey name for backwards compatibility
267-
"supports deprecated --name platform-improvements": {
268-
CmdArgs: []string{"--name", "platform-improvements"},
269-
Setup: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock, cf *shared.ClientFactory) {
270-
setupFeedbackCommandMocks(t, ctx, cm, cf)
271-
},
272-
ExpectedOutputs: []string{
273-
"feedback@slack.com",
274-
"https://docs.slack.dev/developer-support",
275-
},
276-
},
277266
"supports --name slack-cli": {
278267
CmdArgs: []string{"--name", "slack-cli"},
279268
Setup: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock, cf *shared.ClientFactory) {

cmd/project/create_samples.go

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ func promptSampleSelection(ctx context.Context, clients *shared.ClientFactory, s
4343
iostreams.SelectPromptConfig{
4444
Flags: []*pflag.Flag{
4545
clients.Config.Flags.Lookup("language"),
46-
clients.Config.Flags.Lookup("template"), // Skip filtering with a template
4746
},
4847
Required: false,
4948
},
@@ -69,25 +68,19 @@ func promptSampleSelection(ctx context.Context, clients *shared.ClientFactory, s
6968
selectOptions[i] = r.Name
7069
}
7170

72-
var selectedTemplate string
7371
selection, err = clients.IO.SelectPrompt(ctx, "Select a sample to build upon:", selectOptions, iostreams.SelectPromptConfig{
7472
Description: func(value string, index int) string {
7573
return sortedRepos[index].Description
7674
},
77-
Flag: clients.Config.Flags.Lookup("template"),
7875
Help: fmt.Sprintf("Guided tutorials can be found at %s", style.LinkText("https://docs.slack.dev/samples")),
7976
PageSize: 4, // Supports standard terminal height (24 rows)
8077
Required: true,
8178
Template: embedPromptSamplesTmpl,
8279
})
8380
if err != nil {
8481
return "", err
85-
} else if selection.Flag {
86-
selectedTemplate = selection.Option
87-
} else if selection.Prompt {
88-
selectedTemplate = sortedRepos[selection.Index].FullName
8982
}
90-
return selectedTemplate, nil
83+
return sortedRepos[selection.Index].FullName, nil
9184
}
9285

9386
// filterRepos returns a list of samples matching the provided project type

cmd/project/samples.go

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ import (
2828
)
2929

3030
// Flags
31-
var samplesTemplateURLFlag string
32-
var samplesGitBranchFlag string
3331
var samplesListFlag bool
3432
var samplesLanguageFlag string
3533

@@ -56,13 +54,6 @@ func NewSamplesCommand(clients *shared.ClientFactory) *cobra.Command {
5654
},
5755
}
5856

59-
// DEPRECATED(semver:major): Prefer the create command when repository details are known
60-
cmd.Flags().StringVarP(&samplesGitBranchFlag, "branch", "b", "", "name of git branch to checkout")
61-
cmd.Flag("branch").Hidden = true
62-
// DEPRECATED(semver:major): Prefer the create command when repository details are known
63-
cmd.Flags().StringVarP(&samplesTemplateURLFlag, "template", "t", "", "template URL for your app")
64-
cmd.Flag("template").Hidden = true
65-
6657
cmd.Flags().StringVar(&samplesLanguageFlag, "language", "", "runtime for the app framework\n ex: \"deno\", \"node\", \"python\"")
6758
cmd.Flags().BoolVar(&samplesListFlag, "list", false, "prints samples without interactivity")
6859

@@ -73,11 +64,6 @@ func NewSamplesCommand(clients *shared.ClientFactory) *cobra.Command {
7364
func runSamplesCommand(clients *shared.ClientFactory, cmd *cobra.Command, args []string) error {
7465
ctx := cmd.Context()
7566

76-
// DEPRECATED(semver:major): Prefer the create command when repository details are known
77-
if cmd.Flag("branch").Changed || cmd.Flag("template").Changed {
78-
clients.IO.PrintWarning(ctx, "DEPRECATED: The `--branch` and `--template` flags are deprecated for the `samples` command; use the `create` command instead")
79-
}
80-
8167
sampler := api.NewHTTPClient(api.HTTPClientOptions{
8268
TotalTimeOut: 60 * time.Second,
8369
})
@@ -100,16 +86,11 @@ func runSamplesCommand(clients *shared.ClientFactory, cmd *cobra.Command, args [
10086
// Instantiate the `create` command to call it using programmatically set flags
10187
createCmd := NewCreateCommand(clients)
10288

103-
// Prepare template and branch flags with selected or provided repo values
89+
// Prepare the template flag with the selected repo value
10490
if err := createCmd.Flag("template").Value.Set(selectedSample); err != nil {
10591
return err
10692
}
10793
createCmd.Flag("template").Changed = true
108-
if err := createCmd.Flag("branch").Value.Set(samplesGitBranchFlag); err != nil {
109-
return err
110-
}
111-
createCmd.Flag("branch").Changed = cmd.Flag("branch").Changed
112-
11394
// If preferred directory name is passed in as an argument to the `create`
11495
// command first, honor that preference and use it to create the project
11596
createCmd.SetArgs(args)

cmd/project/samples_test.go

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ import (
2525
"github.com/spf13/cobra"
2626
"github.com/stretchr/testify/assert"
2727
"github.com/stretchr/testify/mock"
28-
"github.com/stretchr/testify/require"
2928
)
3029

3130
func TestSamplesCommand(t *testing.T) {
31+
var capturedArgs createPkg.CreateArgs
3232
testutil.TableTestCommand(t, testutil.CommandTests{
3333
"creates a template from a trusted sample": {
3434
CmdArgs: []string{"my-sample-app"},
@@ -72,29 +72,16 @@ func TestSamplesCommand(t *testing.T) {
7272
nil,
7373
)
7474
CreateFunc = func(ctx context.Context, clients *shared.ClientFactory, createArgs createPkg.CreateArgs) (appDirPath string, err error) {
75+
capturedArgs = createArgs
7576
return createArgs.AppName, nil
7677
}
7778
},
7879
ExpectedOutputs: []string{
7980
"cd my-sample-app/",
8081
},
8182
ExpectedAsserts: func(t *testing.T, ctx context.Context, cm *shared.ClientsMock) {
82-
for _, call := range cm.IO.Calls {
83-
switch call.Method {
84-
case "SelectPrompt":
85-
args := call.Arguments
86-
opts := args.Get(3).(iostreams.SelectPromptConfig)
87-
flag := opts.Flag
88-
switch args.String(1) {
89-
case "Select a sample to build upon:":
90-
require.Equal(t, "template", flag.Name)
91-
assert.Equal(t, "", flag.Value.String())
92-
case "Select a template to build from:":
93-
require.Equal(t, "template", flag.Name)
94-
assert.Equal(t, "slack-samples/deno-starter-template", flag.Value.String())
95-
}
96-
}
97-
}
83+
assert.Equal(t, "my-sample-app", capturedArgs.AppName)
84+
assert.Equal(t, "slack-samples/deno-starter-template", capturedArgs.Template.GetTemplatePath())
9885
},
9986
},
10087
"lists available samples matching a language": {

internal/iostreams/prompts.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,18 +192,30 @@ func errInteractivityFlags(cfg PromptConfig) error {
192192
// ConfirmPrompt prompts the user for a "yes" or "no" (true or false) value for
193193
// the message
194194
func (io *IOStreams) ConfirmPrompt(ctx context.Context, message string, defaultValue bool) (bool, error) {
195+
if !io.IsTTY() {
196+
return false, errInteractivityFlags(ConfirmPromptConfig{})
197+
}
195198
return confirmForm(io, ctx, message, defaultValue)
196199
}
197200

198201
// InputPrompt prompts the user for a string value for the message, which can
199202
// optionally be made required
200203
func (io *IOStreams) InputPrompt(ctx context.Context, message string, cfg InputPromptConfig) (string, error) {
204+
if !io.IsTTY() {
205+
if cfg.IsRequired() {
206+
return "", errInteractivityFlags(cfg)
207+
}
208+
return "", nil
209+
}
201210
return inputForm(io, ctx, message, cfg)
202211
}
203212

204213
// MultiSelectPrompt prompts the user to select multiple values in a list and
205214
// returns the selected values
206215
func (io *IOStreams) MultiSelectPrompt(ctx context.Context, message string, options []string) ([]string, error) {
216+
if !io.IsTTY() {
217+
return nil, errInteractivityFlags(MultiSelectPromptConfig{})
218+
}
207219
return multiSelectForm(io, ctx, message, options)
208220
}
209221

internal/iostreams/prompts_test.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,97 @@ func TestPasswordPrompt(t *testing.T) {
273273
}
274274
}
275275

276+
func TestConfirmPrompt(t *testing.T) {
277+
tests := map[string]struct {
278+
expectedError string
279+
}{
280+
"error if non-TTY": {
281+
expectedError: slackerror.ErrPrompt,
282+
},
283+
}
284+
for name, tc := range tests {
285+
t.Run(name, func(t *testing.T) {
286+
ctx := slackcontext.MockContext(t.Context())
287+
288+
fsMock := slackdeps.NewFsMock()
289+
osMock := slackdeps.NewOsMock()
290+
osMock.On("Stdout").Return(&slackdeps.FileMock{FileInfo: &slackdeps.FileInfoNamedPipe{}})
291+
cfg := config.NewConfig(fsMock, osMock)
292+
io := NewIOStreams(cfg, fsMock, osMock)
293+
294+
_, err := io.ConfirmPrompt(ctx, "Continue?", false)
295+
296+
assert.Error(t, err)
297+
assert.Equal(t, tc.expectedError, slackerror.ToSlackError(err).Code)
298+
})
299+
}
300+
}
301+
302+
func TestInputPrompt(t *testing.T) {
303+
tests := map[string]struct {
304+
required bool
305+
expectedError string
306+
expectedValue string
307+
}{
308+
"error if non-TTY and required": {
309+
required: true,
310+
expectedError: slackerror.ErrPrompt,
311+
},
312+
"no error if non-TTY and optional": {
313+
required: false,
314+
expectedValue: "",
315+
},
316+
}
317+
for name, tc := range tests {
318+
t.Run(name, func(t *testing.T) {
319+
ctx := slackcontext.MockContext(t.Context())
320+
321+
fsMock := slackdeps.NewFsMock()
322+
osMock := slackdeps.NewOsMock()
323+
osMock.On("Stdout").Return(&slackdeps.FileMock{FileInfo: &slackdeps.FileInfoNamedPipe{}})
324+
cfg := config.NewConfig(fsMock, osMock)
325+
io := NewIOStreams(cfg, fsMock, osMock)
326+
327+
value, err := io.InputPrompt(ctx, "Enter name", InputPromptConfig{
328+
Required: tc.required,
329+
})
330+
331+
if err != nil {
332+
assert.Equal(t, tc.expectedError, slackerror.ToSlackError(err).Code)
333+
} else {
334+
assert.NoError(t, err)
335+
assert.Equal(t, tc.expectedValue, value)
336+
}
337+
})
338+
}
339+
}
340+
341+
func TestMultiSelectPrompt(t *testing.T) {
342+
tests := map[string]struct {
343+
expectedError string
344+
}{
345+
"error if non-TTY": {
346+
expectedError: slackerror.ErrPrompt,
347+
},
348+
}
349+
for name, tc := range tests {
350+
t.Run(name, func(t *testing.T) {
351+
ctx := slackcontext.MockContext(t.Context())
352+
353+
fsMock := slackdeps.NewFsMock()
354+
osMock := slackdeps.NewOsMock()
355+
osMock.On("Stdout").Return(&slackdeps.FileMock{FileInfo: &slackdeps.FileInfoNamedPipe{}})
356+
cfg := config.NewConfig(fsMock, osMock)
357+
io := NewIOStreams(cfg, fsMock, osMock)
358+
359+
_, err := io.MultiSelectPrompt(ctx, "Pick items", []string{"a", "b"})
360+
361+
assert.Error(t, err)
362+
assert.Equal(t, tc.expectedError, slackerror.ToSlackError(err).Code)
363+
})
364+
}
365+
}
366+
276367
func TestSelectPrompt(t *testing.T) {
277368
tests := map[string]struct {
278369
flagValue string

0 commit comments

Comments
 (0)