diff options
| author | Dave Henderson <dhenderson@gmail.com> | 2019-04-06 09:04:01 -0400 |
|---|---|---|
| committer | Dave Henderson <dhenderson@gmail.com> | 2019-04-06 09:19:30 -0400 |
| commit | 6ee72aa0651bc0e6a5bce2c9ee5bd5c7fcd82558 (patch) | |
| tree | 02ea9039aaa3e9d1cb2e64cd0bac09aa7cd2aad7 /data | |
| parent | e840d960599e434f61683013ea6528cc3e07d269 (diff) | |
Fixing merge behaviour for booleans
Signed-off-by: Dave Henderson <dhenderson@gmail.com>
Diffstat (limited to 'data')
| -rw-r--r-- | data/datasource_merge.go | 13 | ||||
| -rw-r--r-- | data/datasource_merge_test.go | 78 |
2 files changed, 74 insertions, 17 deletions
diff --git a/data/datasource_merge.go b/data/datasource_merge.go index 3913e641..90ca96c6 100644 --- a/data/datasource_merge.go +++ b/data/datasource_merge.go @@ -3,7 +3,7 @@ package data import ( "strings" - "github.com/imdario/mergo" + "github.com/hairyhenderson/gomplate/coll" "github.com/pkg/errors" ) @@ -63,14 +63,13 @@ func (d *Data) readMerge(source *Source, args ...string) ([]byte, error) { return b, nil } -func mergeData(data []map[string]interface{}) ([]byte, error) { +func mergeData(data []map[string]interface{}) (out []byte, err error) { dst := data[0] data = data[1:] - for _, datum := range data { - err := mergo.Merge(&dst, datum) - if err != nil { - return nil, errors.Wrap(err, "failed to merge datasources") - } + + dst, err = coll.Merge(dst, data...) + if err != nil { + return nil, err } s, err := ToYAML(dst) diff --git a/data/datasource_merge_test.go b/data/datasource_merge_test.go index 0cd86574..b08148d5 100644 --- a/data/datasource_merge_test.go +++ b/data/datasource_merge_test.go @@ -10,23 +10,23 @@ import ( ) func TestReadMerge(t *testing.T) { - jsonContent := []byte(`{"hello": "world"}`) - yamlContent := []byte("hello: earth\ngoodnight: moon\n") - arrayContent := []byte(`["hello", "world"]`) + jsonContent := `{"hello": "world"}` + yamlContent := "hello: earth\ngoodnight: moon\n" + arrayContent := `["hello", "world"]` - mergedContent := []byte("goodnight: moon\nhello: world\n") + mergedContent := "goodnight: moon\nhello: world\n" fs := afero.NewMemMapFs() _ = fs.Mkdir("/tmp", 0777) f, _ := fs.Create("/tmp/jsonfile.json") - _, _ = f.Write(jsonContent) + _, _ = f.WriteString(jsonContent) f, _ = fs.Create("/tmp/array.json") - _, _ = f.Write(arrayContent) + _, _ = f.WriteString(arrayContent) f, _ = fs.Create("/tmp/yamlfile.yaml") - _, _ = f.Write(yamlContent) + _, _ = f.WriteString(yamlContent) f, _ = fs.Create("/tmp/textfile.txt") - _, _ = f.Write([]byte(`plain text...`)) + _, _ = f.WriteString(`plain text...`) source := &Source{Alias: "foo", URL: mustParseURL("merge:file:///tmp/jsonfile.json|file:///tmp/yamlfile.yaml")} source.fs = fs @@ -44,12 +44,12 @@ func TestReadMerge(t *testing.T) { actual, err := d.readMerge(source) assert.NoError(t, err) - assert.Equal(t, mergedContent, actual) + assert.Equal(t, mergedContent, string(actual)) source.URL = mustParseURL("merge:bar|baz") actual, err = d.readMerge(source) assert.NoError(t, err) - assert.Equal(t, mergedContent, actual) + assert.Equal(t, mergedContent, string(actual)) source.URL = mustParseURL("merge:file:///tmp/jsonfile.json") _, err = d.readMerge(source) @@ -71,3 +71,61 @@ func TestReadMerge(t *testing.T) { _, err = d.readMerge(source) assert.Error(t, err) } + +func TestMergeData(t *testing.T) { + def := map[string]interface{}{ + "f": true, + "t": false, + "z": "def", + } + out, err := mergeData([]map[string]interface{}{def}) + assert.NoError(t, err) + assert.Equal(t, "f: true\nt: false\nz: def\n", string(out)) + + over := map[string]interface{}{ + "f": false, + "t": true, + "z": "over", + } + out, err = mergeData([]map[string]interface{}{over, def}) + assert.NoError(t, err) + assert.Equal(t, "f: false\nt: true\nz: over\n", string(out)) + + over = map[string]interface{}{ + "f": false, + "t": true, + "z": "over", + "m": map[string]interface{}{ + "a": "aaa", + }, + } + out, err = mergeData([]map[string]interface{}{over, def}) + assert.NoError(t, err) + assert.Equal(t, "f: false\nm:\n a: aaa\nt: true\nz: over\n", string(out)) + + uber := map[string]interface{}{ + "z": "über", + } + out, err = mergeData([]map[string]interface{}{uber, over, def}) + assert.NoError(t, err) + assert.Equal(t, "f: false\nm:\n a: aaa\nt: true\nz: über\n", string(out)) + + uber = map[string]interface{}{ + "m": "notamap", + "z": map[string]interface{}{ + "b": "bbb", + }, + } + out, err = mergeData([]map[string]interface{}{uber, over, def}) + assert.NoError(t, err) + assert.Equal(t, "f: false\nm: notamap\nt: true\nz:\n b: bbb\n", string(out)) + + uber = map[string]interface{}{ + "m": map[string]interface{}{ + "b": "bbb", + }, + } + out, err = mergeData([]map[string]interface{}{uber, over, def}) + assert.NoError(t, err) + assert.Equal(t, "f: false\nm:\n a: aaa\n b: bbb\nt: true\nz: over\n", string(out)) +} |
