Skip to content

Commit

Permalink
Refactored IsSet to examine keys
Browse files Browse the repository at this point in the history
This patch refactors the IsSet function to examine the keys in order
to see if a key is set instead of simply checking if a value is nil.
This change is necessary due to the fact that default values via
flag bindings will result in the old logic always being true for
the IsSet function due to a type's default value such as 0 for an
integer or an empty string for a string. While a type's default
value may be preferable when getting the value for a key, it
results in a false positive when determining if a key is actually
set. This change enables users to detect whether a key is set by
only returning a flag's value if it has changed.
  • Loading branch information
akutz authored and spf13 committed Dec 11, 2015
1 parent ce08532 commit e3bc06f
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
17 changes: 15 additions & 2 deletions viper.go
Original file line number Diff line number Diff line change
Expand Up @@ -742,8 +742,21 @@ func (v *Viper) find(key string) interface{} {
// Check to see if the key has been set in any of the data locations
func IsSet(key string) bool { return v.IsSet(key) }
func (v *Viper) IsSet(key string) bool {
t := v.Get(key)
return t != nil
path := strings.Split(key, v.keyDelim)

lcaseKey := strings.ToLower(key)
val := v.find(lcaseKey)

if val == nil {
source := v.find(strings.ToLower(path[0]))
if source != nil {
if reflect.TypeOf(source).Kind() == reflect.Map {
val = v.searchMap(cast.ToStringMap(source), path[1:])
}
}
}

return val != nil
}

// Have Viper check ENV variables for all
Expand Down
11 changes: 11 additions & 0 deletions viper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -611,6 +611,17 @@ func TestReadBufConfig(t *testing.T) {
assert.Equal(t, 35, v.Get("age"))
}

func TestIsSet(t *testing.T) {
v := New()
v.SetConfigType("yaml")
v.ReadConfig(bytes.NewBuffer(yamlExample))
assert.True(t, v.IsSet("clothing.jacket"))
assert.False(t, v.IsSet("clothing.jackets"))
assert.False(t, v.IsSet("helloworld"))
v.Set("helloworld", "fubar")
assert.True(t, v.IsSet("helloworld"))
}

func TestDirsSearch(t *testing.T) {

root, config, cleanup := initDirs(t)
Expand Down

0 comments on commit e3bc06f

Please sign in to comment.