mirror of https://github.com/helm/helm
Merge pull request #4070 from adamreese/dev-v3-arg-validation
ref(cmd): refactor argument validationpull/4071/head
commit
9b6f674b38
@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2018 The Kubernetes Authors All rights reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package require
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NoArgs returns an error if any args are included.
|
||||||
|
func NoArgs(cmd *cobra.Command, args []string) error {
|
||||||
|
if len(args) > 0 {
|
||||||
|
return errors.Errorf(
|
||||||
|
"%q accepts no arguments\n\nUsage: %s",
|
||||||
|
cmd.CommandPath(),
|
||||||
|
cmd.UseLine(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExactArgs returns an error if there are not exactly n args.
|
||||||
|
func ExactArgs(n int) cobra.PositionalArgs {
|
||||||
|
return func(cmd *cobra.Command, args []string) error {
|
||||||
|
if len(args) != n {
|
||||||
|
return errors.Errorf(
|
||||||
|
"%q requires %d %s\n\nUsage: %s",
|
||||||
|
cmd.CommandPath(),
|
||||||
|
n,
|
||||||
|
pluralize("argument", n),
|
||||||
|
cmd.UseLine(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MaximumNArgs returns an error if there are more than N args.
|
||||||
|
func MaximumNArgs(n int) cobra.PositionalArgs {
|
||||||
|
return func(cmd *cobra.Command, args []string) error {
|
||||||
|
if len(args) > n {
|
||||||
|
return errors.Errorf(
|
||||||
|
"%q accepts at most %d %s\n\nUsage: %s",
|
||||||
|
cmd.CommandPath(),
|
||||||
|
n,
|
||||||
|
pluralize("argument", n),
|
||||||
|
cmd.UseLine(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MinimumNArgs returns an error if there is not at least N args.
|
||||||
|
func MinimumNArgs(n int) cobra.PositionalArgs {
|
||||||
|
return func(cmd *cobra.Command, args []string) error {
|
||||||
|
if len(args) < n {
|
||||||
|
return errors.Errorf(
|
||||||
|
"%q requires at least %d %s\n\nUsage: %s",
|
||||||
|
cmd.CommandPath(),
|
||||||
|
n,
|
||||||
|
pluralize("argument", n),
|
||||||
|
cmd.UseLine(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func pluralize(word string, n int) string {
|
||||||
|
if n == 1 {
|
||||||
|
return word
|
||||||
|
}
|
||||||
|
return word + "s"
|
||||||
|
}
|
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2018 The Kubernetes Authors All rights reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package require
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestArgs(t *testing.T) {
|
||||||
|
runTestCases(t, []testCase{{
|
||||||
|
validateFunc: NoArgs,
|
||||||
|
}, {
|
||||||
|
args: []string{"one"},
|
||||||
|
validateFunc: NoArgs,
|
||||||
|
wantError: `"root" accepts no arguments`,
|
||||||
|
}, {
|
||||||
|
args: []string{"one"},
|
||||||
|
validateFunc: ExactArgs(1),
|
||||||
|
}, {
|
||||||
|
validateFunc: ExactArgs(1),
|
||||||
|
wantError: `"root" requires 1 argument`,
|
||||||
|
}, {
|
||||||
|
validateFunc: ExactArgs(2),
|
||||||
|
wantError: `"root" requires 2 arguments`,
|
||||||
|
}, {
|
||||||
|
args: []string{"one"},
|
||||||
|
validateFunc: MaximumNArgs(1),
|
||||||
|
}, {
|
||||||
|
args: []string{"one", "two"},
|
||||||
|
validateFunc: MaximumNArgs(1),
|
||||||
|
wantError: `"root" accepts at most 1 argument`,
|
||||||
|
}, {
|
||||||
|
validateFunc: MinimumNArgs(1),
|
||||||
|
wantError: `"root" requires at least 1 argument`,
|
||||||
|
}, {
|
||||||
|
args: []string{"one", "two"},
|
||||||
|
validateFunc: MinimumNArgs(1),
|
||||||
|
}})
|
||||||
|
}
|
||||||
|
|
||||||
|
type testCase struct {
|
||||||
|
args []string
|
||||||
|
validateFunc cobra.PositionalArgs
|
||||||
|
wantError string
|
||||||
|
}
|
||||||
|
|
||||||
|
func runTestCases(t *testing.T, testCases []testCase) {
|
||||||
|
for i, tc := range testCases {
|
||||||
|
t.Run(fmt.Sprint(i), func(t *testing.T) {
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Use: "root",
|
||||||
|
Run: func(*cobra.Command, []string) {},
|
||||||
|
Args: tc.validateFunc,
|
||||||
|
}
|
||||||
|
cmd.SetArgs(tc.args)
|
||||||
|
cmd.SetOutput(ioutil.Discard)
|
||||||
|
|
||||||
|
err := cmd.Execute()
|
||||||
|
if tc.wantError == "" {
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unexpected error, got '%v'", err)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !strings.Contains(err.Error(), tc.wantError) {
|
||||||
|
t.Fatalf("unexpected error \n\nWANT:\n%q\n\nGOT:\n%q\n", tc.wantError, err)
|
||||||
|
}
|
||||||
|
if !strings.Contains(err.Error(), "Usage:") {
|
||||||
|
t.Fatalf("unexpected error: want Usage string\n\nGOT:\n%q\n", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -1 +1,3 @@
|
|||||||
Error: command 'delete' requires a release name
|
Error: "helm delete" requires at least 1 argument
|
||||||
|
|
||||||
|
Usage: helm delete RELEASE_NAME [...] [flags]
|
||||||
|
@ -1 +1,3 @@
|
|||||||
Error: release name is required
|
Error: "helm get hooks" requires 1 argument
|
||||||
|
|
||||||
|
Usage: helm get hooks RELEASE_NAME [flags]
|
||||||
|
@ -1 +1,3 @@
|
|||||||
Error: release name is required
|
Error: "helm get manifest" requires 1 argument
|
||||||
|
|
||||||
|
Usage: helm get manifest RELEASE_NAME [flags]
|
||||||
|
@ -1 +1,3 @@
|
|||||||
Error: release name is required
|
Error: "helm get" requires 1 argument
|
||||||
|
|
||||||
|
Usage: helm get RELEASE_NAME [flags]
|
||||||
|
@ -1 +1,3 @@
|
|||||||
Error: release name is required
|
Error: "helm get values" requires 1 argument
|
||||||
|
|
||||||
|
Usage: helm get values RELEASE_NAME [flags]
|
||||||
|
@ -1 +1,3 @@
|
|||||||
Error: this command needs 1 argument: chart name
|
Error: "helm install" requires 1 argument
|
||||||
|
|
||||||
|
Usage: helm install [CHART] [flags]
|
||||||
|
@ -1 +1,3 @@
|
|||||||
Error: this command needs 2 arguments: release name, revision number
|
Error: "helm rollback" requires 2 arguments
|
||||||
|
|
||||||
|
Usage: helm rollback [RELEASE] [REVISION] [flags]
|
||||||
|
@ -1 +1,3 @@
|
|||||||
Error: this command needs 2 arguments: release name, chart path
|
Error: "helm upgrade" requires 2 arguments
|
||||||
|
|
||||||
|
Usage: helm upgrade [RELEASE] [CHART] [flags]
|
||||||
|
Loading…
Reference in new issue