From da54697d4620bf04ad1f982f8013179d98b19916 Mon Sep 17 00:00:00 2001 From: Albert Vaca Cintora Date: Mon, 9 May 2022 15:09:51 +0200 Subject: [PATCH] Exclude keys bound to env from AllKeys/AllSettings unless env var is set --- viper.go | 20 +++++++++++--------- viper_test.go | 3 +++ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/viper.go b/viper.go index bab5774..7c95d17 100644 --- a/viper.go +++ b/viper.go @@ -339,6 +339,16 @@ func (v *Viper) getEnv(key string) (string, bool) { return val, ok && (v.allowEmptyEnv || val != "") } +func (v *Viper) getAllEnvBoundAndSet() map[string]interface{} { + tgt := map[string]interface{}{} + for key, value := range v.env { + if _, ok := v.getEnv(v.mergeWithEnvPrefix(key)); ok { + tgt[key] = value + } + } + return tgt +} + // ConfigFileUsed returns the file used to populate the config registry. func ConfigFileUsed() string { return v.ConfigFileUsed() } func (v *Viper) ConfigFileUsed() string { return v.configFile } @@ -1571,14 +1581,6 @@ func castToMapStringInterface( return tgt } -func castMapStringSliceToMapInterface(src map[string][]string) map[string]interface{} { - tgt := map[string]interface{}{} - for k, v := range src { - tgt[k] = v - } - return tgt -} - func castMapStringToMapInterface(src map[string]string) map[string]interface{} { tgt := map[string]interface{}{} for k, v := range src { @@ -1745,7 +1747,7 @@ func (v *Viper) AllKeys() []string { m = v.flattenAndMergeMap(m, castMapStringToMapInterface(v.aliases), "") m = v.flattenAndMergeMap(m, v.override, "") m = v.mergeFlatMap(m, castMapFlagToMapInterface(v.pflags)) - m = v.mergeFlatMap(m, castMapStringSliceToMapInterface(v.env)) + m = v.mergeFlatMap(m, v.getAllEnvBoundAndSet()) m = v.flattenAndMergeMap(m, v.config, "") m = v.flattenAndMergeMap(m, v.kvstore, "") m = v.flattenAndMergeMap(m, v.defaults, "") diff --git a/viper_test.go b/viper_test.go index 64aa766..d85adee 100644 --- a/viper_test.go +++ b/viper_test.go @@ -1832,6 +1832,7 @@ empty_dict: {} initConfig(v, "yaml", yamlWithEnvVars) v.SetKnown("is_known") v.SetDefault("has_default", true) + v.BindEnv("is_bound") // AllKeys includes empty keys keys := v.AllKeys() @@ -1841,6 +1842,7 @@ empty_dict: {} assert.Contains(t, keys, "empty_dict") assert.NotContains(t, keys, "is_known") assert.Contains(t, keys, "has_default") + assert.NotContains(t, keys, "is_bound") // AllSettings includes empty keys vars := v.AllSettings() @@ -1850,4 +1852,5 @@ empty_dict: {} assert.Contains(t, vars, "empty_dict") assert.NotContains(t, vars, "is_known") assert.Contains(t, vars, "has_default") + assert.NotContains(t, vars, "is_bound") }