From a5c97373baa3b8e10176416421eb88145bb5f70a Mon Sep 17 00:00:00 2001 From: Alec Thomas Date: Wed, 13 Jun 2018 08:40:41 +1000 Subject: [PATCH] Remove automatic envar naming resolver. --- README.md | 1 + resolver.go | 23 ----------------------- resolver_test.go | 28 +++++++--------------------- 3 files changed, 8 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 408da2d..e96c6fb 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,7 @@ Both can coexist with standard Tag parsing. | -----------------------| ------------------------------------------- | | `cmd` | If present, struct is a command. | | `arg` | If present, field is an argument. | +| `env:"X"` | Specify envar to use for default value. | `type:"X"` | Specify named Mapper to use. | | `help:"X"` | Help text. | | `placeholder:"X"` | Placeholder text. | diff --git a/resolver.go b/resolver.go index 1627b91..c2495fe 100755 --- a/resolver.go +++ b/resolver.go @@ -61,17 +61,6 @@ func jsonDecodeValue(sep rune, value interface{}) (string, error) { return "", fmt.Errorf("unsupported JSON value %v (of type %T)", value, value) } -// PerFlagEnvResolver automatically determines environment variables based on the name of each flag, transformed to -// uppercase and underscored, e.g. `my-flag` -> `MY_FLAG`. -// -// The environment variable key can be overridden with the `env:""` tag. -func PerFlagEnvResolver(prefix string) ResolverFunc { - return func(context *Context, parent *Path, flag *Flag) (string, error) { - v, _ := os.LookupEnv(envString(prefix, flag)) - return v, nil - } -} - // EnvResolver resolves flag values using the `env:""` tag. It ignores flags without this tag. // // This resolver is installed by default. @@ -84,15 +73,3 @@ func EnvResolver() ResolverFunc { return v, nil } } - -func envString(prefix string, flag *Flag) string { - if env, ok := flag.Tag.Get("env"); ok { - return env - } - - env := strings.ToUpper(flag.Name) - env = strings.Replace(env, "-", "_", -1) - env = prefix + env - - return env -} diff --git a/resolver_test.go b/resolver_test.go index 9ba6831..8e6c5ef 100755 --- a/resolver_test.go +++ b/resolver_test.go @@ -26,14 +26,14 @@ func tempEnv(env envMap) func() { func newEnvParser(t *testing.T, cli interface{}, env envMap) (*Kong, func()) { t.Helper() restoreEnv := tempEnv(env) - parser := mustNew(t, cli, Resolver(PerFlagEnvResolver("KONG_"))) + parser := mustNew(t, cli) return parser, restoreEnv } func TestEnvResolverFlagBasic(t *testing.T) { var cli struct { - String string - Slice []int + String string `env:"KONG_STRING"` + Slice []int `env:"KONG_SLICE"` } parser, unsetEnvs := newEnvParser(t, &cli, envMap{ "KONG_STRING": "bye", @@ -49,7 +49,7 @@ func TestEnvResolverFlagBasic(t *testing.T) { func TestEnvResolverFlagOverride(t *testing.T) { var cli struct { - Flag string + Flag string `env:"KONG_FLAG"` } parser, restoreEnv := newEnvParser(t, &cli, envMap{"KONG_FLAG": "bye"}) defer restoreEnv() @@ -64,13 +64,13 @@ func TestEnvResolverOnlyPopulateUsedBranches(t *testing.T) { var cli struct { UnvisitedArg struct { UnvisitedArg string `arg` - Int int + Int int `env:"KONG_INT"` } `arg` UnvisitedCmd struct { - Int int + Int int `env:"KONG_INT"` } `cmd` Visited struct { - Int int + Int int `env:"KONG_INT"` } `cmd` } parser, restoreEnv := newEnvParser(t, &cli, envMap{"KONG_INT": "512"}) @@ -166,11 +166,8 @@ func TestResolversWithMappers(t *testing.T) { restoreEnv := tempEnv(envMap{"KONG_MOO": "meow"}) defer restoreEnv() - r := PerFlagEnvResolver("KONG_") - parser := mustNew(t, &cli, NamedMapper("upper", testUppercaseMapper{}), - Resolver(r), ) _, err := parser.Parse([]string{}) require.NoError(t, err) @@ -235,14 +232,3 @@ func TestResolverSatisfiesRequired(t *testing.T) { require.NoError(t, err) require.Equal(t, 1, cli.Int) } - -func TestEnvResolver(t *testing.T) { - var cli struct { - Int int `env:"SOME_ENVAR"` - } - restoreEnv := tempEnv(envMap{"SOME_ENVAR": "12"}) - defer restoreEnv() - _, err := mustNew(t, &cli, Resolver(EnvResolver())).Parse(nil) - require.NoError(t, err) - require.Equal(t, 12, cli.Int) -}