From 28ada1e5b0d3edf3d0402f2d425044ee9faaffc1 Mon Sep 17 00:00:00 2001 From: Dotan Nahum Date: Wed, 27 May 2015 18:15:02 +0300 Subject: [PATCH 1/5] Nested keys properly recurse on map[interface{}]interface{} --- viper.go | 2 ++ viper_test.go | 20 +++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/viper.go b/viper.go index 799983f..d95ca28 100644 --- a/viper.go +++ b/viper.go @@ -343,6 +343,8 @@ func (v *Viper) searchMap(source map[string]interface{}, path []string) interfac if next, ok := source[path[0]]; ok { switch next.(type) { + case map[interface{}]interface{}: + return v.searchMap(cast.ToStringMap(next), path[1:]) case map[string]interface{}: // Type assertion is safe here since it is only reached // if the type of `next` is the same as the type being asserted diff --git a/viper_test.go b/viper_test.go index 7ad0245..8d7d152 100644 --- a/viper_test.go +++ b/viper_test.go @@ -27,6 +27,8 @@ hobbies: clothing: jacket: leather trousers: denim + pants: + size: large age: 35 eyes : brown beard: true @@ -164,7 +166,7 @@ func TestMarshalling(t *testing.T) { assert.False(t, InConfig("state")) assert.Equal(t, "steve", Get("name")) assert.Equal(t, []interface{}{"skateboarding", "snowboarding", "go"}, Get("hobbies")) - assert.Equal(t, map[interface{}]interface{}{"jacket": "leather", "trousers": "denim"}, Get("clothing")) + assert.Equal(t, map[interface{}]interface{}{"jacket": "leather", "trousers": "denim", "pants": map[interface{}]interface{}{"size": "large"}}, Get("clothing")) assert.Equal(t, 35, Get("age")) } @@ -304,7 +306,7 @@ func TestAllKeys(t *testing.T) { ks := sort.StringSlice{"title", "newkey", "owner", "name", "beard", "ppu", "batters", "hobbies", "clothing", "age", "hacker", "id", "type", "eyes", "p_id", "p_ppu", "p_batters.batter.type", "p_type", "p_name"} dob, _ := time.Parse(time.RFC3339, "1979-05-27T07:32:00Z") - all := map[string]interface{}{"owner": map[string]interface{}{"organization": "MongoDB", "Bio": "MongoDB Chief Developer Advocate & Hacker at Large", "dob": dob}, "title": "TOML Example", "ppu": 0.55, "eyes": "brown", "clothing": map[interface{}]interface{}{"trousers": "denim", "jacket": "leather"}, "id": "0001", "batters": map[string]interface{}{"batter": []interface{}{map[string]interface{}{"type": "Regular"}, map[string]interface{}{"type": "Chocolate"}, map[string]interface{}{"type": "Blueberry"}, map[string]interface{}{"type": "Devil's Food"}}}, "hacker": true, "beard": true, "hobbies": []interface{}{"skateboarding", "snowboarding", "go"}, "age": 35, "type": "donut", "newkey": "remote", "name": "Cake", "p_id": "0001", "p_ppu": "0.55", "p_name": "Cake", "p_batters.batter.type": "Regular", "p_type": "donut"} + all := map[string]interface{}{"owner": map[string]interface{}{"organization": "MongoDB", "Bio": "MongoDB Chief Developer Advocate & Hacker at Large", "dob": dob}, "title": "TOML Example", "ppu": 0.55, "eyes": "brown", "clothing": map[interface{}]interface{}{"trousers": "denim", "jacket": "leather", "pants": map[interface{}]interface{}{"size": "large"}}, "id": "0001", "batters": map[string]interface{}{"batter": []interface{}{map[string]interface{}{"type": "Regular"}, map[string]interface{}{"type": "Chocolate"}, map[string]interface{}{"type": "Blueberry"}, map[string]interface{}{"type": "Devil's Food"}}}, "hacker": true, "beard": true, "hobbies": []interface{}{"skateboarding", "snowboarding", "go"}, "age": 35, "type": "donut", "newkey": "remote", "name": "Cake", "p_id": "0001", "p_ppu": "0.55", "p_name": "Cake", "p_batters.batter.type": "Regular", "p_type": "donut"} var allkeys sort.StringSlice allkeys = AllKeys() @@ -524,11 +526,15 @@ func TestFindsNestedKeys(t *testing.T) { "clothing": map[interface{}]interface{}{ "jacket": "leather", "trousers": "denim", + "pants": map[interface{}]interface{}{ + "size": "large", + }, }, - "clothing.jacket": "leather", - "clothing.trousers": "denim", - "owner.dob": dob, - "beard": true, + "clothing.jacket": "leather", + "clothing.pants.size": "large", + "clothing.trousers": "denim", + "owner.dob": dob, + "beard": true, } for key, expectedValue := range expected { @@ -548,6 +554,6 @@ func TestReadBufConfig(t *testing.T) { assert.False(t, v.InConfig("state")) assert.Equal(t, "steve", v.Get("name")) assert.Equal(t, []interface{}{"skateboarding", "snowboarding", "go"}, v.Get("hobbies")) - assert.Equal(t, map[interface{}]interface{}{"jacket": "leather", "trousers": "denim"}, v.Get("clothing")) + assert.Equal(t, map[interface{}]interface{}{"jacket": "leather", "trousers": "denim", "pants": map[interface{}]interface{}{"size": "large"}}, v.Get("clothing")) assert.Equal(t, 35, v.Get("age")) } From 12f7ec6566254ef4259f8cca4aabeef8c7d6a0b8 Mon Sep 17 00:00:00 2001 From: Vlad Didenko Date: Mon, 15 Jun 2015 09:31:24 -0500 Subject: [PATCH 2/5] Fixes #87 --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a578cbf..ae1f68e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ language: go go: - - 1.2 - 1.3 - release - tip From ca00a9b4f78a0bf982b54e8a5689fa6a142ce0f9 Mon Sep 17 00:00:00 2001 From: chalupaul Date: Wed, 27 May 2015 15:50:32 -0500 Subject: [PATCH 3/5] The AddSecureRemoteProvider function didn't add secretKeyring to the remoteProvider struct. --- viper.go | 1 + 1 file changed, 1 insertion(+) diff --git a/viper.go b/viper.go index d95ca28..2b651f8 100644 --- a/viper.go +++ b/viper.go @@ -286,6 +286,7 @@ func (v *Viper) AddRemoteProvider(provider, endpoint, path string) error { endpoint: endpoint, provider: provider, path: path, + secretKeyring: secretkeyring, } if !v.providerPathExists(rp) { v.remoteProviders = append(v.remoteProviders, rp) From 8e930a9714cfb3eeb1a4dadb446facaebecd755b Mon Sep 17 00:00:00 2001 From: Kiril Zvezdarov Date: Sun, 21 Jun 2015 19:13:01 -0400 Subject: [PATCH 4/5] Revert "The AddSecureRemoteProvider function didn't add secretKeyring to the remoteProvider struct." This reverts commit ca00a9b4f78a0bf982b54e8a5689fa6a142ce0f9. --- viper.go | 1 - 1 file changed, 1 deletion(-) diff --git a/viper.go b/viper.go index 2b651f8..d95ca28 100644 --- a/viper.go +++ b/viper.go @@ -286,7 +286,6 @@ func (v *Viper) AddRemoteProvider(provider, endpoint, path string) error { endpoint: endpoint, provider: provider, path: path, - secretKeyring: secretkeyring, } if !v.providerPathExists(rp) { v.remoteProviders = append(v.remoteProviders, rp) From db7ff930a189b98d602179d9001d33345f42b8c7 Mon Sep 17 00:00:00 2001 From: Kiril Zvezdarov Date: Sun, 21 Jun 2015 19:19:00 -0400 Subject: [PATCH 5/5] AddSecureRemoteProvider adds the secret keyring to the default provider struct --- viper.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/viper.go b/viper.go index d95ca28..3db9cd2 100644 --- a/viper.go +++ b/viper.go @@ -315,9 +315,10 @@ func (v *Viper) AddSecureRemoteProvider(provider, endpoint, path, secretkeyring if provider != "" && endpoint != "" { jww.INFO.Printf("adding %s:%s to remote provider list", provider, endpoint) rp := &defaultRemoteProvider{ - endpoint: endpoint, - provider: provider, - path: path, + endpoint: endpoint, + provider: provider, + path: path, + secretKeyring: secretkeyring, } if !v.providerPathExists(rp) { v.remoteProviders = append(v.remoteProviders, rp)