Refactored IsSet to examine keys - viper - [fork] go viper port for 9front
(HTM) git clone git@git.drkhsh.at/viper.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit e3bc06f20c7a60e8042d3f8741551ce606d31c40
(DIR) parent ce08532bfdded310e8ac7dfd0c490f29a7c27c98
(HTM) Author: akutz <sakutz@gmail.com>
Date: Sun, 29 Nov 2015 17:16:21 -0600
Refactored IsSet to examine keys
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.
Diffstat:
M viper.go | 17 +++++++++++++++--
M viper_test.go | 11 +++++++++++
2 files changed, 26 insertions(+), 2 deletions(-)
---
(DIR) diff --git a/viper.go b/viper.go
@@ -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
(DIR) diff --git a/viper_test.go b/viper_test.go
@@ -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)