Fix: find() looks into "overrides" first

overrides (elements added with Set()) should have highest priority,
checked first (was after PFlags).

From README.md:
> Viper uses the following precedence order. Each item takes precedence
> over the item below it:
> • explicit call to Set
> • flag
> • env
> • config
> • key/value store
> • default

+ fix TestBindPFlags() to use a new Viper instance (otherwise, "port" was
  defined in an earlier test function with Set() and took precedence)
This commit is contained in:
Benoit Masson 2016-09-27 15:46:53 +02:00
parent a60edc6a52
commit 86fffbd28c
2 changed files with 14 additions and 5 deletions

View file

@ -759,7 +759,13 @@ func (v *Viper) find(key string) interface{} {
// if the requested key is an alias, then return the proper key
key = v.realKey(key)
// PFlag Override first
// Set() override first
val, exists = v.override[key]
if exists {
return val
}
// PFlag override next
flag, exists := v.pflags[key]
if exists && flag.HasChanged() {
switch flag.ValueType() {
@ -787,7 +793,6 @@ func (v *Viper) find(key string) interface{} {
return val
}
}
envkey, exists := v.env[key]
if exists {
if val = v.getEnv(envkey); val != "" {
@ -795,12 +800,13 @@ func (v *Viper) find(key string) interface{} {
}
}
// Config file next
val, exists = v.config[key]
if exists {
return val
}
// Test for nested config parameter
// test for nested config parameter
if strings.Contains(key, v.keyDelim) {
path := strings.Split(key, v.keyDelim)
@ -815,11 +821,13 @@ func (v *Viper) find(key string) interface{} {
}
}
// K/V store next
val, exists = v.kvstore[key]
if exists {
return val
}
// Default as last chance
val, exists = v.defaults[key]
if exists {
return val

View file

@ -479,6 +479,7 @@ func TestUnmarshal(t *testing.T) {
}
func TestBindPFlags(t *testing.T) {
v := New() // create independent Viper object
flagSet := pflag.NewFlagSet("test", pflag.ContinueOnError)
var testValues = map[string]*string{
@ -497,7 +498,7 @@ func TestBindPFlags(t *testing.T) {
testValues[name] = flagSet.String(name, "", "test")
}
err := BindPFlags(flagSet)
err := v.BindPFlags(flagSet)
if err != nil {
t.Fatalf("error binding flag set, %v", err)
}
@ -508,7 +509,7 @@ func TestBindPFlags(t *testing.T) {
})
for name, expected := range mutatedTestValues {
assert.Equal(t, expected, Get(name))
assert.Equal(t, expected, v.Get(name))
}
}