From daea2aaa5a9722ef6afe3430f5a3b0edfa3464e4 Mon Sep 17 00:00:00 2001 From: Roy Razon Date: Tue, 16 Jan 2018 17:03:31 +0200 Subject: [PATCH] Creation of Sub now copies parent properties and sets envPrefix --- viper.go | 19 +++++++++++++++++-- viper_test.go | 16 ++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/viper.go b/viper.go index ad8a037..960f13d 100644 --- a/viper.go +++ b/viper.go @@ -204,6 +204,13 @@ func New() *Viper { return v } +func newFrom(from *Viper) *Viper { + v := *new(Viper) + v = *from // shallow clone + + return &v +} + // Intended for testing, will reset all to default settings. // In the public interface for the viper package so applications // can use it in their testing as well. @@ -647,11 +654,19 @@ func (v *Viper) Get(key string) interface{} { return val } +func (v *Viper) prefixOfSub(key string) string { + if v.envPrefix == "" { + return key + } else { + return v.envPrefix + "." + key + } +} + // Sub returns new Viper instance representing a sub tree of this instance. // Sub is case-insensitive for a key. func Sub(key string) *Viper { return v.Sub(key) } func (v *Viper) Sub(key string) *Viper { - subv := New() + subv := newFrom(v) data := v.Get(key) if data == nil { return nil @@ -659,6 +674,7 @@ func (v *Viper) Sub(key string) *Viper { if reflect.TypeOf(data).Kind() == reflect.Map { subv.config = cast.ToStringMap(data) + subv.envPrefix = v.prefixOfSub(key) return subv } return nil @@ -882,7 +898,6 @@ func (v *Viper) BindEnv(input ...string) error { // Viper will check to see if an alias exists first. // Note: this assumes a lower-cased key given. func (v *Viper) find(lcaseKey string) interface{} { - var ( val interface{} exists bool diff --git a/viper_test.go b/viper_test.go index c93480e..d98180e 100644 --- a/viper_test.go +++ b/viper_test.go @@ -848,6 +848,22 @@ func TestSub(t *testing.T) { assert.Equal(t, (*Viper)(nil), subv) } +func TestSubEnv(t *testing.T) { + v := New() + v.SetConfigType("yaml") + v.ReadConfig(bytes.NewBuffer(yamlExample)) + v.AutomaticEnv() + v.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) + + assert.Equal(t, "leather", v.GetString("clothing.jacket")) + subv := v.Sub("clothing") + assert.Equal(t, "leather", subv.GetString("jacket")) + + os.Setenv("CLOTHING_JACKET", "13") + assert.Equal(t, "13", v.GetString("clothing.jacket")) + assert.Equal(t, "13", subv.GetString("jacket")) +} + var hclWriteExpected = []byte(`"foos" = { "foo" = { "key" = 1