mirror of https://github.com/databricks/cli.git
deterministic order for walk, fixes tests
This commit is contained in:
parent
09975a02ef
commit
6302e58965
|
@ -30,17 +30,6 @@ func TestRootLoad(t *testing.T) {
|
||||||
assert.Equal(t, "basic", root.Bundle.Name)
|
assert.Equal(t, "basic", root.Bundle.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDuplicateIdOnMergeReturnsErrorForJobAndJob(t *testing.T) {
|
|
||||||
root, diags := Load("./testdata/duplicate_resource_name_in_subconfiguration_job_and_job/databricks.yml")
|
|
||||||
require.NoError(t, diags.Error())
|
|
||||||
|
|
||||||
other, diags := Load("./testdata/duplicate_resource_name_in_subconfiguration_job_and_job/resources.yml")
|
|
||||||
require.NoError(t, diags.Error())
|
|
||||||
|
|
||||||
err := root.Merge(other)
|
|
||||||
assert.ErrorContains(t, err, "multiple resources named foo (job at ./testdata/duplicate_resource_name_in_subconfiguration_job_and_job/databricks.yml:10:7, job at ./testdata/duplicate_resource_name_in_subconfiguration_job_and_job/resources.yml:4:7)")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestInitializeVariables(t *testing.T) {
|
func TestInitializeVariables(t *testing.T) {
|
||||||
fooDefault := "abc"
|
fooDefault := "abc"
|
||||||
root := &Root{
|
root := &Root{
|
||||||
|
|
|
@ -20,7 +20,7 @@ func TestValidateUniqueResourceIdentifiers(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "duplicate_resource_names_in_root_job_and_experiment",
|
name: "duplicate_resource_names_in_root_job_and_experiment",
|
||||||
errorMsg: "multiple resources named foo (jobs.foo at validate/duplicate_resource_names_in_root_job_and_experiment/databricks.yml:10:7, experiments.foo at validate/duplicate_resource_names_in_root_job_and_experiment/databricks.yml:18:7)",
|
errorMsg: "multiple resources named foo (experiments.foo at validate/duplicate_resource_names_in_root_job_and_experiment/databricks.yml:18:7, jobs.foo at validate/duplicate_resource_names_in_root_job_and_experiment/databricks.yml:10:7)",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "duplicate_resource_name_in_subconfiguration",
|
name: "duplicate_resource_name_in_subconfiguration",
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"maps"
|
"maps"
|
||||||
"slices"
|
"slices"
|
||||||
|
"sort"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Pair represents a single key-value pair in a Mapping.
|
// Pair represents a single key-value pair in a Mapping.
|
||||||
|
@ -51,6 +52,17 @@ func (m Mapping) Pairs() []Pair {
|
||||||
return m.pairs
|
return m.pairs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SortedPairs returns all the key-value pairs in the Mapping, sorted by key in
|
||||||
|
// lexicographic order.
|
||||||
|
func (m Mapping) SortedPairs() []Pair {
|
||||||
|
pairs := make([]Pair, len(m.pairs))
|
||||||
|
copy(pairs, m.pairs)
|
||||||
|
sort.Slice(pairs, func(i, j int) bool {
|
||||||
|
return pairs[i].Key.MustString() < pairs[j].Key.MustString()
|
||||||
|
})
|
||||||
|
return pairs
|
||||||
|
}
|
||||||
|
|
||||||
// Len returns the number of key-value pairs in the Mapping.
|
// Len returns the number of key-value pairs in the Mapping.
|
||||||
func (m Mapping) Len() int {
|
func (m Mapping) Len() int {
|
||||||
return len(m.pairs)
|
return len(m.pairs)
|
||||||
|
|
|
@ -35,7 +35,9 @@ func walk(v Value, p Path, fn func(p Path, v Value) (Value, error)) (Value, erro
|
||||||
case KindMap:
|
case KindMap:
|
||||||
m := v.MustMap()
|
m := v.MustMap()
|
||||||
out := newMappingWithSize(m.Len())
|
out := newMappingWithSize(m.Len())
|
||||||
for _, pair := range m.Pairs() {
|
|
||||||
|
// Iterate over the pairs in sorted order to ensure a deterministic order.
|
||||||
|
for _, pair := range m.SortedPairs() {
|
||||||
pk := pair.Key
|
pk := pair.Key
|
||||||
pv := pair.Value
|
pv := pair.Value
|
||||||
nv, err := walk(pv, append(p, Key(pk.MustString())), fn)
|
nv, err := walk(pv, append(p, Key(pk.MustString())), fn)
|
||||||
|
|
Loading…
Reference in New Issue