Preserve parsed key order in maps (#57)
Preserve key order in YamlMap when parsing YAML.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2694286..bc0cb78 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 2.2.0
+
+* POSSIBLY BREAKING CHANGE: Make `YamlMap` preserve parsed key order.
+ This is breaking because some programs may rely on the
+ `HashMap` sort order.
+
## 2.1.16
* Fixed deprecated API usage in README.
diff --git a/lib/src/equality.dart b/lib/src/equality.dart
index 66b8196..299dfe8 100644
--- a/lib/src/equality.dart
+++ b/lib/src/equality.dart
@@ -10,7 +10,7 @@
/// Returns a [Map] that compares its keys based on [deepEquals].
Map<K, V> deepEqualsMap<K, V>() =>
- HashMap(equals: deepEquals, hashCode: deepHashCode);
+ LinkedHashMap(equals: deepEquals, hashCode: deepHashCode);
/// Returns whether two objects are structurally equivalent.
///
diff --git a/pubspec.yaml b/pubspec.yaml
index 0548bef..6d056da 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: yaml
-version: 2.1.16
+version: 2.2.0
description: A parser for YAML, a human-friendly data serialization standard
author: Dart Team <misc@dartlang.org>
diff --git a/test/yaml_test.dart b/test/yaml_test.dart
index 27b2025..dcc506a 100644
--- a/test/yaml_test.dart
+++ b/test/yaml_test.dart
@@ -1806,4 +1806,33 @@
Also floats: [ .inf, -.Inf, +.INF, .NAN ]''');
});
});
+
+ test('preserves key order', () {
+ const keys = ['a', 'b', 'c', 'd', 'e', 'f'];
+ int sanityCheckCount = 0;
+ for (List<String> permutation in _generatePermutations(keys)) {
+ final yaml = permutation.map((key) => '$key: value').join('\n');
+ expect(loadYaml(yaml).keys.toList(), permutation);
+ sanityCheckCount++;
+ }
+ final expectedPermutationCount =
+ List.generate(keys.length, (i) => i + 1).reduce((n, i) => n * i);
+ expect(sanityCheckCount, expectedPermutationCount);
+ });
+}
+
+Iterable<List<String>> _generatePermutations(List<String> keys) sync* {
+ if (keys.length <= 1) {
+ yield keys;
+ return;
+ }
+ for (int i = 0; i < keys.length; i++) {
+ final first = keys[i];
+ final rest = <String>[]
+ ..addAll(keys.sublist(0, i))
+ ..addAll(keys.sublist(i + 1));
+ for (List<String> subPermutation in _generatePermutations(rest)) {
+ yield <String>[first]..addAll(subPermutation);
+ }
+ }
}