This library makes it possible to introspect dataset and aggregate nodes when it is instructed.
Note
The following examples with be expressed in YAML for convenience's sake:
!aggr-scalar will refer to Scalar python function
!aggr-map will refer to Map python object
!aggr-seq will refer for Sequence python object
This yaml document has duplicate keys:
foo: !aggr-scalar first
foo: !aggr-scalar second
bar: !aggr-map {first: foo}
bar: !aggr-map {second: bar}
baz: !aggr-scalar 42
but tagged values instruct Salt that overlapping values they can be merged together:
foo: !aggr-seq [first, second]
bar: !aggr-map {first: foo, second: bar}
baz: !aggr-seq [42]
For example, this yaml document still has duplicate keys, but does not instruct aggregation:
foo: first
foo: second
bar: {first: foo}
bar: {second: bar}
baz: 42
So the late found values prevail:
foo: second
bar: {second: bar}
baz: 42
Aggregation is permitted between tagged objects that share the same type. If not, the default merge strategy prevails.
For example, these examples:
foo: {first: value}
foo: !aggr-map {second: value}
bar: !aggr-map {first: value}
bar: 42
baz: !aggr-seq [42]
baz: [fail]
qux: 42
qux: !aggr-scalar fail
are interpreted like this:
foo: !aggr-map{second: value}
bar: 42
baz: [fail]
qux: !aggr-seq [fail]
TODO: write this part
Aggregation base.
Map aggregation.
Dictionary that remembers insertion order
Create a new ordered dictionary with keys from iterable and values set to value.
Move an existing element to the end (or beginning if last is false).
Raise KeyError if the element does not exist.
If the key is not found, return the default if given; otherwise, raise a KeyError.
Remove and return a (key, value) pair from the dictionary.
Pairs are returned in LIFO order if last is true or FIFO order if false.
Insert key with a value of default if key is not in the dictionary.
Return the value for key if key is in the dictionary, else default.
If E is present and has a .keys() method, then does: for k in E: D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]
Shortcut for Sequence creation
>>> Scalar('foo') == Sequence(['foo'])
True
Sequence aggregation.
Merge obj_b into obj_a.
>>> aggregate('first', 'second', True) == ['first', 'second']
True
Describe which levels are allowed to do deep merging.
level can be:
all levels are True
all levels are False
only the first levels are True, the others are False
it describes which levels are True, it can be:
a list of bool and int values
a string of 0 and 1 characters
Convert obj into an Aggregate instance