From db2a4550e50d397616a5cef1a35d893b0c0ee418 Mon Sep 17 00:00:00 2001 From: Mike Farah Date: Tue, 22 Jul 2025 11:25:02 +1000 Subject: [PATCH] Fixed tests --- .../operators/anchor-and-alias-operators.md | 650 ++++-------------- .../headers/anchor-and-alias-operators.md | 8 +- pkg/yqlib/operator_anchors_aliases.go | 9 +- pkg/yqlib/operator_anchors_aliases_test.go | 183 ++--- 4 files changed, 250 insertions(+), 600 deletions(-) diff --git a/pkg/yqlib/doc/operators/anchor-and-alias-operators.md b/pkg/yqlib/doc/operators/anchor-and-alias-operators.md index b1953b88..0a745236 100644 --- a/pkg/yqlib/doc/operators/anchor-and-alias-operators.md +++ b/pkg/yqlib/doc/operators/anchor-and-alias-operators.md @@ -42,68 +42,6 @@ y: 2 r: 10 ``` -## Merge multiple maps -see https://yaml.org/type/merge.html - -Given a sample.yml file of: -```yaml -- &CENTER - x: 1 - y: 2 -- &LEFT - x: 0 - y: 2 -- &BIG - r: 10 -- &SMALL - r: 1 -- !!merge <<: - - *CENTER - - *BIG -``` -then -```bash -yq '.[4] | explode(.)' sample.yml -``` -will output -```yaml -r: 10 -x: 1 -y: 2 -``` - -## Override -see https://yaml.org/type/merge.html - -Given a sample.yml file of: -```yaml -- &CENTER - x: 1 - y: 2 -- &LEFT - x: 0 - y: 2 -- &BIG - r: 10 -- &SMALL - r: 1 -- !!merge <<: - - *BIG - - *LEFT - - *SMALL - x: 1 -``` -then -```bash -yq '.[4] | explode(.)' sample.yml -``` -will output -```yaml -r: 10 -x: 1 -y: 2 -``` - ## Get anchor Given a sample.yml file of: ```yaml @@ -341,53 +279,66 @@ foobar: thing: foobar_thing ``` -## FIXED: Explode with merge anchors -See the foobarList.b property is still foobarList_b. Set `--yaml-fix-merge-anchor-to-spec=true` to get this correct merge behaviour. Flag will default to true in late 2025 +## Merge multiple maps +see https://yaml.org/type/merge.html Given a sample.yml file of: ```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing +- &CENTER + x: 1 + y: 2 +- &LEFT + x: 0 + y: 2 +- &BIG + r: 10 +- &SMALL + r: 1 +- !!merge <<: + - *CENTER + - *BIG ``` then ```bash -yq 'explode(.)' sample.yml +yq '.[4] | explode(.)' sample.yml ``` will output ```yaml -foo: - a: foo_a - thing: foo_thing - c: foo_c -bar: - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - a: foo_a - thing: foo_thing - c: foobarList_c -foobar: - c: foobar_c - a: foo_a - thing: foobar_thing +r: 10 +x: 1 +y: 2 +``` + +## Override +see https://yaml.org/type/merge.html + +Given a sample.yml file of: +```yaml +- &CENTER + x: 1 + y: 2 +- &LEFT + x: 0 + y: 2 +- &BIG + r: 10 +- &SMALL + r: 1 +- !!merge <<: + - *BIG + - *LEFT + - *SMALL + x: 1 +``` +then +```bash +yq '.[4] | explode(.)' sample.yml +``` +will output +```yaml +r: 10 +x: 1 +y: 2 ``` ## FIXED: Explode with merge anchors @@ -439,53 +390,66 @@ foobar: thing: foobar_thing ``` -## FIXED: Explode with merge anchors -See the foobarList.b property is still foobarList_b. Set `--yaml-fix-merge-anchor-to-spec=true` to get this correct merge behaviour. Flag will default to true in late 2025 +## Merge multiple maps +see https://yaml.org/type/merge.html Given a sample.yml file of: ```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing +- &CENTER + x: 1 + y: 2 +- &LEFT + x: 0 + y: 2 +- &BIG + r: 10 +- &SMALL + r: 1 +- !!merge <<: + - *CENTER + - *BIG ``` then ```bash -yq 'explode(.)' sample.yml +yq '.[4] | explode(.)' sample.yml ``` will output ```yaml -foo: - a: foo_a - thing: foo_thing - c: foo_c -bar: - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - a: foo_a - thing: foo_thing - c: foobarList_c -foobar: - c: foobar_c - a: foo_a - thing: foobar_thing +x: 1 +y: 2 +r: 10 +``` + +## Override +see https://yaml.org/type/merge.html + +Given a sample.yml file of: +```yaml +- &CENTER + x: 1 + y: 2 +- &LEFT + x: 0 + y: 2 +- &BIG + r: 10 +- &SMALL + r: 1 +- !!merge <<: + - *BIG + - *LEFT + - *SMALL + x: 1 +``` +then +```bash +yq '.[4] | explode(.)' sample.yml +``` +will output +```yaml +r: 10 +y: 2 +x: 1 ``` ## FIXED: Explode with merge anchors @@ -537,395 +501,65 @@ foobar: thing: foobar_thing ``` -## FIXED: Explode with merge anchors -See the foobarList.b property is still foobarList_b. Set `--yaml-fix-merge-anchor-to-spec=true` to get this correct merge behaviour. Flag will default to true in late 2025 +## Merge multiple maps +see https://yaml.org/type/merge.html Given a sample.yml file of: ```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing +- &CENTER + x: 1 + y: 2 +- &LEFT + x: 0 + y: 2 +- &BIG + r: 10 +- &SMALL + r: 1 +- !!merge <<: + - *CENTER + - *BIG ``` then ```bash -yq 'explode(.)' sample.yml +yq '.[4] | explode(.)' sample.yml ``` will output ```yaml -foo: - a: foo_a - thing: foo_thing - c: foo_c -bar: - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - a: foo_a - thing: foo_thing - c: foobarList_c -foobar: - c: foobar_c - a: foo_a - thing: foobar_thing +x: 1 +y: 2 +r: 10 ``` -## FIXED: Explode with merge anchors -See the foobarList.b property is still foobarList_b. Set `--yaml-fix-merge-anchor-to-spec=true` to get this correct merge behaviour. Flag will default to true in late 2025 +## Override +see https://yaml.org/type/merge.html Given a sample.yml file of: ```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing +- &CENTER + x: 1 + y: 2 +- &LEFT + x: 0 + y: 2 +- &BIG + r: 10 +- &SMALL + r: 1 +- !!merge <<: + - *BIG + - *LEFT + - *SMALL + x: 1 ``` then ```bash -yq 'explode(.)' sample.yml +yq '.[4] | explode(.)' sample.yml ``` will output ```yaml -foo: - a: foo_a - thing: foo_thing - c: foo_c -bar: - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - a: foo_a - thing: foo_thing - c: foobarList_c -foobar: - c: foobar_c - a: foo_a - thing: foobar_thing -``` - -## FIXED: Explode with merge anchors -See the foobarList.b property is still foobarList_b. Set `--yaml-fix-merge-anchor-to-spec=true` to get this correct merge behaviour. Flag will default to true in late 2025 - -Given a sample.yml file of: -```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing -``` -then -```bash -yq 'explode(.)' sample.yml -``` -will output -```yaml -foo: - a: foo_a - thing: foo_thing - c: foo_c -bar: - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - a: foo_a - thing: foo_thing - c: foobarList_c -foobar: - c: foobar_c - a: foo_a - thing: foobar_thing -``` - -## FIXED: Explode with merge anchors -See the foobarList.b property is still foobarList_b. Set `--yaml-fix-merge-anchor-to-spec=true` to get this correct merge behaviour. Flag will default to true in late 2025 - -Given a sample.yml file of: -```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing -``` -then -```bash -yq 'explode(.)' sample.yml -``` -will output -```yaml -foo: - a: foo_a - thing: foo_thing - c: foo_c -bar: - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - a: foo_a - thing: foo_thing - c: foobarList_c -foobar: - c: foobar_c - a: foo_a - thing: foobar_thing -``` - -## FIXED: Explode with merge anchors -See the foobarList.b property is still foobarList_b. Set `--yaml-fix-merge-anchor-to-spec=true` to get this correct merge behaviour. Flag will default to true in late 2025 - -Given a sample.yml file of: -```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing -``` -then -```bash -yq 'explode(.)' sample.yml -``` -will output -```yaml -foo: - a: foo_a - thing: foo_thing - c: foo_c -bar: - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - a: foo_a - thing: foo_thing - c: foobarList_c -foobar: - c: foobar_c - a: foo_a - thing: foobar_thing -``` - -## FIXED: Explode with merge anchors -See the foobarList.b property is still foobarList_b. Set `--yaml-fix-merge-anchor-to-spec=true` to get this correct merge behaviour. Flag will default to true in late 2025 - -Given a sample.yml file of: -```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing -``` -then -```bash -yq 'explode(.)' sample.yml -``` -will output -```yaml -foo: - a: foo_a - thing: foo_thing - c: foo_c -bar: - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - a: foo_a - thing: foo_thing - c: foobarList_c -foobar: - c: foobar_c - a: foo_a - thing: foobar_thing -``` - -## FIXED: Explode with merge anchors -See the foobarList.b property is still foobarList_b. Set `--yaml-fix-merge-anchor-to-spec=true` to get this correct merge behaviour. Flag will default to true in late 2025 - -Given a sample.yml file of: -```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing -``` -then -```bash -yq 'explode(.)' sample.yml -``` -will output -```yaml -foo: - a: foo_a - thing: foo_thing - c: foo_c -bar: - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - a: foo_a - thing: foo_thing - c: foobarList_c -foobar: - c: foobar_c - a: foo_a - thing: foobar_thing -``` - -## FIXED: Explode with merge anchors -See the foobarList.b property is still foobarList_b. Set `--yaml-fix-merge-anchor-to-spec=true` to get this correct merge behaviour. Flag will default to true in late 2025 - -Given a sample.yml file of: -```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing -``` -then -```bash -yq 'explode(.)' sample.yml -``` -will output -```yaml -foo: - a: foo_a - thing: foo_thing - c: foo_c -bar: - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - a: foo_a - thing: foo_thing - c: foobarList_c -foobar: - c: foobar_c - a: foo_a - thing: foobar_thing +r: 10 +y: 2 +x: 1 ``` diff --git a/pkg/yqlib/doc/operators/headers/anchor-and-alias-operators.md b/pkg/yqlib/doc/operators/headers/anchor-and-alias-operators.md index 1e95a223..658eb579 100644 --- a/pkg/yqlib/doc/operators/headers/anchor-and-alias-operators.md +++ b/pkg/yqlib/doc/operators/headers/anchor-and-alias-operators.md @@ -8,7 +8,11 @@ Use the `alias` and `anchor` operators to read and write yaml aliases and anchor ## NOTE --yaml-fix-merge-anchor-to-spec flag `yq` doesn't merge anchors `<<:` to spec, in some circumstances it incorrectly overrides existing keys when the spec documents not to do that. -To minimise disruption while still fixing the issue, a flag has been added to toggle this behaviour. This will first default to false; and log warnings to users. Then it will default to true (and still allow users to specify false if needed) +To minimise disruption while still fixing the issue, a flag has been added to toggle this behaviour. This will first default to false; and log warnings to users. Then it will default to true (and still allow users to specify false if needed). -See examples of the flag difference below. +This flag also enables advanced merging, like inline maps, as well as fixes to ensure when exploding a particular path, neighbours are not affect ed. + +Long story short, you should be setting this flag to true. + +See examples of the flag differences below. diff --git a/pkg/yqlib/operator_anchors_aliases.go b/pkg/yqlib/operator_anchors_aliases.go index 720c6384..8dd4f84f 100644 --- a/pkg/yqlib/operator_anchors_aliases.go +++ b/pkg/yqlib/operator_anchors_aliases.go @@ -147,18 +147,15 @@ func fixedReconstructAliasedMap(node *CandidateNode) error { keyNode := node.Content[index] valueNode := node.Content[index+1] if keyNode.Tag != "!!merge" { - // copy to ensure exploding doesn't modify the original node - keyNodeCopy := keyNode.Copy() - valueNodeCopy := valueNode.Copy() // always add in plain nodes // explode both the key and value nodes - if err := explodeNode(keyNodeCopy, Context{}); err != nil { + if err := explodeNode(keyNode, Context{}); err != nil { return err } - if err := explodeNode(valueNodeCopy, Context{}); err != nil { + if err := explodeNode(valueNode, Context{}); err != nil { return err } - newContent = append(newContent, keyNodeCopy, valueNodeCopy) + newContent = append(newContent, keyNode, valueNode) } else { sequence := valueNode if sequence.Kind == AliasNode { diff --git a/pkg/yqlib/operator_anchors_aliases_test.go b/pkg/yqlib/operator_anchors_aliases_test.go index 51deea27..59c8fb8a 100644 --- a/pkg/yqlib/operator_anchors_aliases_test.go +++ b/pkg/yqlib/operator_anchors_aliases_test.go @@ -64,8 +64,8 @@ bar: foobarList: b: bar_b thing: foo_thing - a: foo_a c: foobarList_c + a: foo_a foobar: c: foo_c a: foo_a @@ -136,6 +136,87 @@ var fixedAnchorOperatorScenarios = []expressionScenario{ "D0, P[foobar], (!!map)::{c: foobar_c, a: foo_a, thing: foobar_thing}\n", }, }, + { + description: "Merge multiple maps", + subdescription: "see https://yaml.org/type/merge.html", + document: specDocument + "- << : [ *CENTER, *BIG ]\n", + expression: ".[4] | explode(.)", + expected: []string{"D0, P[4], (!!map)::x: 1\ny: 2\nr: 10\n"}, + }, + { + description: "Override", + subdescription: "see https://yaml.org/type/merge.html", + document: specDocument + "- << : [ *BIG, *LEFT, *SMALL ]\n x: 1\n", + expression: ".[4] | explode(.)", + expected: []string{"D0, P[4], (!!map)::r: 10\ny: 2\nx: 1\n"}, + }, + { + skipDoc: true, + description: "Exploding inline merge anchor", + subdescription: "`<<` map must be exploded, otherwise `c: *b` will become invalid", + document: `{a: {b: &b 42}, <<: {c: *b}}`, + expression: `explode(.) | sort_keys(.)`, + expected: []string{ + "D0, P[], (!!map)::{a: {b: 42}, c: 42}\n", + }, + }, + { + skipDoc: true, + description: "Exploding inline merge anchor in sequence", + subdescription: "`<<` map must be exploded, otherwise `c: *b` will become invalid", + document: `{a: {b: &b 42}, <<: [{c: *b}]}`, + expression: `explode(.) | sort_keys(.)`, + expected: []string{ + "D0, P[], (!!map)::{a: {b: 42}, c: 42}\n", + }, + }, + { + skipDoc: true, + description: "Exploding merge anchor should not explode neighbors", + subdescription: "b must not be exploded, as `r: *a` will become invalid", + document: `{b: &b {a: &a 42}, r: *a, c: {<<: *b}}`, + expression: `explode(.c)`, + expected: []string{ + "D0, P[], (!!map)::{b: &b {a: &a 42}, r: *a, c: {a: 42}}\n", + }, + }, + { + skipDoc: true, + description: "Exploding sequence merge anchor should not explode neighbors", + subdescription: "b must not be exploded, as `r: *a` will become invalid", + document: `{b: &b {a: &a 42}, r: *a, c: {<<: [*b]}}`, + expression: `explode(.c)`, + expected: []string{ + "D0, P[], (!!map)::{b: &b {a: &a 42}, r: *a, c: {a: 42}}\n", + }, + }, + { + skipDoc: true, + description: "Merge anchor with inline map", + document: `{<<: {a: 42}}`, + expression: `explode(.)`, + expected: []string{ + "D0, P[], (!!map)::{a: 42}\n", + }, + }, + { + skipDoc: true, + description: "Merge anchor with sequence with inline map", + document: `{<<: [{a: 42}]}`, + expression: `explode(.)`, + expected: []string{ + "D0, P[], (!!map)::{a: 42}\n", + }, + }, + { + skipDoc: true, + description: "Merge anchor with aliased sequence with inline map", + document: `{s: &s [{a: 42}], m: {<<: *s}}`, + expression: `.m | explode(.)`, + expected: []string{ + "D0, P[m], (!!map)::{a: 42}\n", + }, + }, } var badAnchorOperatorScenarios = []expressionScenario{ @@ -159,7 +240,7 @@ var badAnchorOperatorScenarios = []expressionScenario{ expression: `.foo* | explode(.) | (. style="flow")`, expected: []string{ "D0, P[foo], (!!map)::{a: foo_a, thing: foo_thing, c: foo_c}\n", - "D0, P[foobarList], (!!map)::{b: bar_b, thing: foo_thing, a: foo_a, c: foobarList_c}\n", + "D0, P[foobarList], (!!map)::{b: bar_b, thing: foo_thing, c: foobarList_c, a: foo_a}\n", "D0, P[foobar], (!!map)::{c: foo_c, a: foo_a, thing: foobar_thing}\n", }, }, @@ -169,10 +250,24 @@ var badAnchorOperatorScenarios = []expressionScenario{ expression: `.foo* | explode(explode(.)) | (. style="flow")`, expected: []string{ "D0, P[foo], (!!map)::{a: foo_a, thing: foo_thing, c: foo_c}\n", - "D0, P[foobarList], (!!map)::{b: bar_b, thing: foo_thing, a: foo_a, c: foobarList_c}\n", + "D0, P[foobarList], (!!map)::{b: bar_b, thing: foo_thing, c: foobarList_c, a: foo_a}\n", "D0, P[foobar], (!!map)::{c: foo_c, a: foo_a, thing: foobar_thing}\n", }, }, + { + description: "Merge multiple maps", + subdescription: "see https://yaml.org/type/merge.html", + document: specDocument + "- << : [ *CENTER, *BIG ]\n", + expression: ".[4] | explode(.)", + expected: []string{"D0, P[4], (!!map)::r: 10\nx: 1\ny: 2\n"}, // correct data, but wrong key order + }, + { + description: "Override", + subdescription: "see https://yaml.org/type/merge.html", + document: specDocument + "- << : [ *BIG, *LEFT, *SMALL ]\n x: 1\n", + expression: ".[4] | explode(.)", + expected: []string{"D0, P[4], (!!map)::r: 10\nx: 1\ny: 2\n"}, + }, } var anchorOperatorScenarios = []expressionScenario{ @@ -197,20 +292,7 @@ var anchorOperatorScenarios = []expressionScenario{ expression: ".[4] | explode(.)", expected: []string{expectedSpecResult}, }, - { - description: "Merge multiple maps", - subdescription: "see https://yaml.org/type/merge.html", - document: specDocument + "- << : [ *CENTER, *BIG ]\n", - expression: ".[4] | explode(.)", - expected: []string{"D0, P[4], (!!map)::x: 1\ny: 2\nr: 10\n"}, - }, - { - description: "Override", - subdescription: "see https://yaml.org/type/merge.html", - document: specDocument + "- << : [ *BIG, *LEFT, *SMALL ]\n x: 1\n", - expression: ".[4] | explode(.)", - expected: []string{"D0, P[4], (!!map)::r: 10\ny: 2\nx: 1\n"}, - }, + { description: "Get anchor", document: `a: &billyBob cat`, @@ -386,73 +468,6 @@ var anchorOperatorScenarios = []expressionScenario{ expression: `.thingOne |= (explode(.) | sort_keys(.)) * {"value": false}`, expected: []string{expectedUpdatedArrayRef}, }, - { - skipDoc: true, - description: "Merge anchor with inline map", - document: `{<<: {a: 42}}`, - expression: `explode(.)`, - expected: []string{ - "D0, P[], (!!map)::{a: 42}\n", - }, - }, - { - skipDoc: true, - description: "Merge anchor with sequence with inline map", - document: `{<<: [{a: 42}]}`, - expression: `explode(.)`, - expected: []string{ - "D0, P[], (!!map)::{a: 42}\n", - }, - }, - { - skipDoc: true, - description: "Merge anchor with aliased sequence with inline map", - document: `{s: &s [{a: 42}], m: {<<: *s}}`, - expression: `.m | explode(.)`, - expected: []string{ - "D0, P[m], (!!map)::{a: 42}\n", - }, - }, - { - skipDoc: true, - description: "Exploding merge anchor should not explode neighbors", - subdescription: "b must not be exploded, as `r: *a` will become invalid", - document: `{b: &b {a: &a 42}, r: *a, c: {<<: *b}}`, - expression: `explode(.c)`, - expected: []string{ - "D0, P[], (!!map)::{b: &b {a: &a 42}, r: *a, c: {a: 42}}\n", - }, - }, - { - skipDoc: true, - description: "Exploding sequence merge anchor should not explode neighbors", - subdescription: "b must not be exploded, as `r: *a` will become invalid", - document: `{b: &b {a: &a 42}, r: *a, c: {<<: [*b]}}`, - expression: `explode(.c)`, - expected: []string{ - "D0, P[], (!!map)::{b: &b {a: &a 42}, r: *a, c: {a: 42}}\n", - }, - }, - { - skipDoc: true, - description: "Exploding inline merge anchor", - subdescription: "`<<` map must be exploded, otherwise `c: *b` will become invalid", - document: `{a: {b: &b 42}, <<: {c: *b}}`, - expression: `explode(.) | sort_keys(.)`, - expected: []string{ - "D0, P[], (!!map)::{a: {b: 42}, c: 42}\n", - }, - }, - { - skipDoc: true, - description: "Exploding inline merge anchor in sequence", - subdescription: "`<<` map must be exploded, otherwise `c: *b` will become invalid", - document: `{a: {b: &b 42}, <<: [{c: *b}]}`, - expression: `explode(.) | sort_keys(.)`, - expected: []string{ - "D0, P[], (!!map)::{a: {b: 42}, c: 42}\n", - }, - }, { skipDoc: true, description: "Duplicate keys",