Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix error thrown when inserting keys #80

Merged
merged 5 commits into from
May 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
## 2.2.2-wip

- Suppress warnings previously printed to `stdout` when parsing YAML internally.
- Fix error thrown when inserting duplicate keys to different maps in the same
list.
([#69](https://github.com/dart-lang/yaml_edit/issues/69))

## 2.2.1

Expand Down
5 changes: 5 additions & 0 deletions lib/src/utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,11 @@ bool isFlowYamlCollectionNode(Object value) =>
int getMapInsertionIndex(YamlMap map, Object newKey) {
final keys = map.nodes.keys.map((k) => k.toString()).toList();

// We can't deduce ordering if list is empty, so then we just we just append
if (keys.length <= 1) {
return map.length;
}

for (var i = 1; i < keys.length; i++) {
if (keys[i].compareTo(keys[i - 1]) < 0) {
return map.length;
Expand Down
8 changes: 4 additions & 4 deletions test/editor_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ void main() {

expect(yamlEditor.edits, [
SourceEdit(5, 5, " YAML Ain't Markup Language"),
SourceEdit(0, 0, 'XML: Extensible Markup Language\n'),
SourceEdit(32, 32, '')
SourceEdit(32, 0, '\nXML: Extensible Markup Language\n'),
SourceEdit(0, 33, '')
]);
});

Expand All @@ -48,8 +48,8 @@ void main() {
expect(firstEdits, [SourceEdit(5, 5, " YAML Ain't Markup Language")]);
expect(yamlEditor.edits, [
SourceEdit(5, 5, " YAML Ain't Markup Language"),
SourceEdit(0, 0, 'XML: Extensible Markup Language\n'),
SourceEdit(32, 32, '')
SourceEdit(32, 0, '\nXML: Extensible Markup Language\n'),
SourceEdit(0, 33, '')
]);
});
});
Expand Down
22 changes: 13 additions & 9 deletions test/random_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,10 @@ void main() {
const modificationsPerRound = 1000;

for (var i = 0; i < roundsOfTesting; i++) {
test('testing with randomly generated modifications: test $i', () {
final editor = YamlEditor('''
test(
'testing with randomly generated modifications: test $i',
() {
final editor = YamlEditor('''
name: yaml_edit
description: A library for YAML manipulation with comment and whitespace preservation.
version: 0.0.1-dev
Expand All @@ -42,13 +44,15 @@ dev_dependencies:
test: ^1.14.4
''');

for (var j = 0; j < modificationsPerRound; j++) {
expect(
() => generator.performNextModification(editor),
returnsNormally,
);
}
});
for (var j = 0; j < modificationsPerRound; j++) {
expect(
() => generator.performNextModification(editor),
returnsNormally,
);
}
},
skip: 'Remove once issue #85 is fixed',
);
}
}

Expand Down
7 changes: 7 additions & 0 deletions test/testdata/input/ignore_key_order.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
IGNORES KEY ORDER
---
Z: 1
D: 2
F: 3
---
- [update, ['A'], 4]
6 changes: 6 additions & 0 deletions test/testdata/input/respect_key_order.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
RESPECTS THE KEY ORDER
---
A: first
C: third
---
- [update, [B], second]
28 changes: 14 additions & 14 deletions test/testdata/output/allowed_characters_in_keys.golden
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
test: test
---
"a!\"#$%&'()*+,-.\/09:;<=>?@AZ[\\]^_`az{|}~": safe
test: test
---
?foo: safe question mark
"a!\"#$%&'()*+,-.\/09:;<=>?@AZ[\\]^_`az{|}~": safe
test: test
---
:foo: safe colon
?foo: safe question mark
"a!\"#$%&'()*+,-.\/09:;<=>?@AZ[\\]^_`az{|}~": safe
test: test
---
-foo: safe dash
:foo: safe colon
?foo: safe question mark
"a!\"#$%&'()*+,-.\/09:;<=>?@AZ[\\]^_`az{|}~": safe
test: test
?foo: safe question mark
---
-foo: safe dash
:foo: safe colon
test: test
"a!\"#$%&'()*+,-.\/09:;<=>?@AZ[\\]^_`az{|}~": safe
?foo: safe question mark
:foo: safe colon
---
test: test
"a!\"#$%&'()*+,-.\/09:;<=>?@AZ[\\]^_`az{|}~": safe
?foo: safe question mark
:foo: safe colon
-foo: safe dash
---
test: test
"a!\"#$%&'()*+,-.\/09:;<=>?@AZ[\\]^_`az{|}~": safe
?foo: safe question mark
:foo: safe colon
-foo: safe dash
this is#not: a comment
8 changes: 8 additions & 0 deletions test/testdata/output/ignore_key_order.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Z: 1
D: 2
F: 3
---
Z: 1
D: 2
F: 3
A: 4
6 changes: 6 additions & 0 deletions test/testdata/output/respect_key_order.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
A: first
C: third
---
A: first
B: second
C: third
45 changes: 42 additions & 3 deletions test/update_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -715,9 +715,12 @@ c: 3
doc.update(['XML'], 'Extensible Markup Language');

expect(
doc.toString(),
equals('{XML: Extensible Markup Language, '
"YAML: YAML Ain't Markup Language}"));
doc.toString(),
equals(
"{YAML: YAML Ain't Markup Language, "
'XML: Extensible Markup Language}',
),
);
expectYamlBuilderValue(doc, {
'XML': 'Extensible Markup Language',
'YAML': "YAML Ain't Markup Language",
Expand Down Expand Up @@ -876,6 +879,42 @@ d: 4
'a': {'key': {}}
});
});

test('adds and preserves key order (ascending)', () {
final doc = YamlEditor('''
a: 1
b: 2
c: 3


''');

doc.update(['d'], 4);
expect(doc.toString(), equals('''
a: 1
b: 2
c: 3
d: 4


'''));
});

test('adds at the end when no key order is present', () {
final doc = YamlEditor('''
a: 1
c: 2
b: 3
''');

doc.update(['d'], 4);
expect(doc.toString(), equals('''
a: 1
c: 2
b: 3
d: 4
'''));
});
kekavc24 marked this conversation as resolved.
Show resolved Hide resolved
});

group('empty starting document', () {
Expand Down