summaryrefslogtreecommitdiff
path: root/data
diff options
context:
space:
mode:
authorDave Henderson <dhenderson@gmail.com>2019-04-06 09:04:01 -0400
committerDave Henderson <dhenderson@gmail.com>2019-04-06 09:19:30 -0400
commit6ee72aa0651bc0e6a5bce2c9ee5bd5c7fcd82558 (patch)
tree02ea9039aaa3e9d1cb2e64cd0bac09aa7cd2aad7 /data
parente840d960599e434f61683013ea6528cc3e07d269 (diff)
Fixing merge behaviour for booleans
Signed-off-by: Dave Henderson <dhenderson@gmail.com>
Diffstat (limited to 'data')
-rw-r--r--data/datasource_merge.go13
-rw-r--r--data/datasource_merge_test.go78
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))
+}