Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Improves YAML list merging behavior to preserve within-file duplicates while simplifying the
matching logic. This makes the behavior more predictable and intuitive.
Changes
1. Preserve Within-File Duplicates (Order-Independent)
Previously,
deduplicate=Truewould remove ALL duplicate list items globally, includingduplicates within a single file.
New behavior: If ANY file contains duplicates in a list, that entire list is concatenated
(no merging) to preserve all duplicates. This ensures:
Example:
Before: 1 device (file1 duplicates lost)
After: 3 devices (all preserved, no merging)
2. Relaxed Matching Logic
Previously, dict items would NOT merge if both sides had unique primitive keys not present in
the other. This prevented useful scenarios like combining complementary configuration data.
New behavior: Items merge when all shared primitive keys have matching values — unique
keys present on only one side don't prevent merging and are combined in the result. At least
one primitive key must be shared for matching to occur.
Example:
Before: 2 separate items (both have unique keys)
After: 1 merged item {name: switch1, vlan: 100, port: eth0}
Implementation Details
_extract_primitives()helper to extract non-dict/non-list key-value pairs from a dict_has_duplicates_in_list()with inverted index ((key, value)→[indices]) instead of O(n²) pairwise comparison_merge_list_items_indexed()using inverted index for batch list merging inmerge_dict()_items_would_merge()andmerge_list_item()unchanged for public API compatibilitymerge_dict()to check both source and destination lists for duplicates before mergingBreaking Changes
Duplicate preservation: Lists containing duplicates in ANY file will now be concatenated
instead of merged, preserving all within-file duplicates. This may result in more items than
before if you have duplicates and previously relied on cross-file merging.
Relaxed matching: Items now merge when all shared primitive keys match, even if each side
also has unique keys not present in the other. Complementary configuration data will be combined
instead of kept separate. Items that previously stayed separate may now merge.
Testing