mirror of
https://github.com/spf13/viper
synced 2025-05-06 20:27:17 +00:00
Allow environment variables to be set to empty string
This commit is contained in:
parent
b5e8006cbe
commit
f1c29ce273
2 changed files with 22 additions and 7 deletions
14
viper.go
14
viper.go
|
@ -334,14 +334,14 @@ func (v *Viper) mergeWithEnvPrefix(in string) string {
|
|||
// rewriting keys many things, Ex: Get('someKey') -> some_key
|
||||
// (camel case to snake case for JSON keys perhaps)
|
||||
|
||||
// getEnv is a wrapper around os.Getenv which replaces characters in the original
|
||||
// getEnv is a wrapper around os.LookupEnv which replaces characters in the original
|
||||
// key. This allows env vars which have different keys than the config object
|
||||
// keys.
|
||||
func (v *Viper) getEnv(key string) string {
|
||||
func (v *Viper) getEnv(key string) (string, bool) {
|
||||
if v.envKeyReplacer != nil {
|
||||
key = v.envKeyReplacer.Replace(key)
|
||||
}
|
||||
return os.Getenv(key)
|
||||
return os.LookupEnv(key)
|
||||
}
|
||||
|
||||
// ConfigFileUsed returns the file used to populate the config registry.
|
||||
|
@ -568,10 +568,10 @@ func (v *Viper) isPathShadowedInFlatMap(path []string, mi interface{}) string {
|
|||
// "foo.bar.baz" in a lower-priority map
|
||||
func (v *Viper) isPathShadowedInAutoEnv(path []string) string {
|
||||
var parentKey string
|
||||
var val string
|
||||
var ok bool
|
||||
for i := 1; i < len(path); i++ {
|
||||
parentKey = strings.Join(path[0:i], v.keyDelim)
|
||||
if val = v.getEnv(v.mergeWithEnvPrefix(parentKey)); val != "" {
|
||||
if _, ok = v.getEnv(v.mergeWithEnvPrefix(parentKey)); ok {
|
||||
return parentKey
|
||||
}
|
||||
}
|
||||
|
@ -934,7 +934,7 @@ func (v *Viper) find(lcaseKey string) interface{} {
|
|||
if v.automaticEnvApplied {
|
||||
// even if it hasn't been registered, if automaticEnv is used,
|
||||
// check any Get request
|
||||
if val = v.getEnv(v.mergeWithEnvPrefix(lcaseKey)); val != "" {
|
||||
if val, ok := v.getEnv(v.mergeWithEnvPrefix(lcaseKey)); ok {
|
||||
return val
|
||||
}
|
||||
if nested && v.isPathShadowedInAutoEnv(path) != "" {
|
||||
|
@ -943,7 +943,7 @@ func (v *Viper) find(lcaseKey string) interface{} {
|
|||
}
|
||||
envkey, exists := v.env[lcaseKey]
|
||||
if exists {
|
||||
if val = v.getEnv(envkey); val != "" {
|
||||
if val, ok := v.getEnv(envkey); ok {
|
||||
return val
|
||||
}
|
||||
}
|
||||
|
|
|
@ -375,10 +375,17 @@ func TestEnv(t *testing.T) {
|
|||
assert.Equal(t, "apple", Get("f"))
|
||||
assert.Equal(t, "Cake", Get("name"))
|
||||
|
||||
os.Setenv("FOOD", "")
|
||||
|
||||
assert.Equal(t, "", Get("f"))
|
||||
|
||||
AutomaticEnv()
|
||||
|
||||
assert.Equal(t, "crunk", Get("name"))
|
||||
|
||||
os.Setenv("NAME", "")
|
||||
|
||||
assert.Equal(t, "", Get("name"))
|
||||
}
|
||||
|
||||
func TestEnvPrefix(t *testing.T) {
|
||||
|
@ -396,9 +403,17 @@ func TestEnvPrefix(t *testing.T) {
|
|||
assert.Equal(t, "apple", Get("f"))
|
||||
assert.Equal(t, "Cake", Get("name"))
|
||||
|
||||
os.Setenv("FOO_ID", "")
|
||||
|
||||
assert.Equal(t, "", Get("id"))
|
||||
|
||||
AutomaticEnv()
|
||||
|
||||
assert.Equal(t, "crunk", Get("name"))
|
||||
|
||||
os.Setenv("FOO_NAME", "")
|
||||
|
||||
assert.Equal(t, "", Get("name"))
|
||||
}
|
||||
|
||||
func TestAutoEnv(t *testing.T) {
|
||||
|
|
Loading…
Add table
Reference in a new issue