Fixed bug in adding to empty map values, when it is followed by other content. (#63)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9ea9c51..e5c2d3f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## v1.0.2
+
+- Throws an error if the final YAML after edit is not parsable.
+- Fixed bug in adding to empty map values, when it is followed by other content.
+
## v1.0.1
- Updated behavior surrounding list and map removal.
diff --git a/lib/src/editor.dart b/lib/src/editor.dart
index 9e16598..730261e 100644
--- a/lib/src/editor.dart
+++ b/lib/src/editor.dart
@@ -576,19 +576,24 @@
ArgumentError.checkNotNull(path, 'path');
final expectedTree = _deepModify(_contents, path, [], expectedNode);
+ final initialYaml = _yaml;
_yaml = edit.apply(_yaml);
- _initialize();
+
+ try {
+ _initialize();
+ } on YamlException {
+ throw createAssertionError(
+ 'Failed to produce valid YAML after modification.',
+ initialYaml,
+ _yaml);
+ }
final actualTree = loadYamlNode(_yaml);
if (!deepEquals(actualTree, expectedTree)) {
- throw AssertionError('''
-Modification did not result in expected result!
-
-Obtained:
-$actualTree
-
-Expected:
-$expectedTree''');
+ throw createAssertionError(
+ 'Modification did not result in expected result.',
+ initialYaml,
+ _yaml);
}
_contents = actualTree;
diff --git a/lib/src/errors.dart b/lib/src/errors.dart
index 83241cc..871d40a 100644
--- a/lib/src/errors.dart
+++ b/lib/src/errors.dart
@@ -76,3 +76,36 @@
'by this library.\n\n'
'${anchor.span.message('The alias was first defined here.')}');
}
+
+/// Error thrown when an assertion about the YAML fails. Extends
+/// [AssertionError] to override the [toString] method for pretty printing.
+class _YamlAssertionError extends AssertionError {
+ _YamlAssertionError(message) : super(message);
+
+ @override
+ String toString() {
+ if (message != null) {
+ return 'Assertion failed: ${message}';
+ }
+ return 'Assertion failed';
+ }
+}
+
+/// Throws an [AssertionError] with the given [message], and format
+/// [oldYaml] and [newYaml] for information.
+@alwaysThrows
+Error createAssertionError(String message, String oldYaml, String newYaml) {
+ return _YamlAssertionError('''
+(package:yaml_edit) $message
+
+# YAML before edit:
+> ${oldYaml.replaceAll('\n', '\n> ')}
+
+# YAML after edit:
+> ${newYaml.replaceAll('\n', '\n> ')}
+
+Please file an issue at:
+'''
+ 'https://github.com/google/dart-neats/issues/new?labels=pkg%3Ayaml_edit'
+ '%2C+pending-triage&template=yaml_edit.md\n');
+}
diff --git a/lib/src/map_mutations.dart b/lib/src/map_mutations.dart
index b3c3cf8..1a3d1f3 100644
--- a/lib/src/map_mutations.dart
+++ b/lib/src/map_mutations.dart
@@ -172,7 +172,7 @@
/// `package:yaml` parses empty nodes in a way where the start/end of the
/// empty value node is the end of the key node, so we have to adjust for
/// this.
- if (end < start) end = start + 1;
+ if (end < start) end = start;
return SourceEdit(start, end - start, ' ' + valueAsString);
}
diff --git a/pubspec.yaml b/pubspec.yaml
index f143892..11923e3 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: yaml_edit
-version: 1.0.1
+version: 1.0.2
description: A library for YAML manipulation with comment and whitespace preservation.
homepage: https://github.com/google/dart-neats/tree/master/yaml_edit
repository: https://github.com/google/dart-neats.git
diff --git a/test/testdata/output/pubspec.golden b/test/testdata/output/pubspec.golden
index 7cd5b25..b5e5ea0 100644
--- a/test/testdata/output/pubspec.golden
+++ b/test/testdata/output/pubspec.golden
@@ -113,3 +113,4 @@
dev_dependencies:
test: ^1.14.4
+
diff --git a/test/update_test.dart b/test/update_test.dart
index bee48b6..23b0023 100644
--- a/test/update_test.dart
+++ b/test/update_test.dart
@@ -104,7 +104,7 @@
});
test('empty value', () {
- final doc = YamlEditor('YAML: ');
+ final doc = YamlEditor('YAML:');
doc.update(['YAML'], 'test');
expect(doc.toString(), equals('YAML: test'));
@@ -112,7 +112,7 @@
});
test('empty value (2)', () {
- final doc = YamlEditor('YAML : ');
+ final doc = YamlEditor('YAML :');
doc.update(['YAML'], 'test');
expect(doc.toString(), equals('YAML : test'));
@@ -257,6 +257,36 @@
'''));
});
+ test('nested (8)', () {
+ final doc = YamlEditor('''
+a:
+b: false
+''');
+ doc.update(['a'], {'retry': '3.0.1'});
+
+ expect(doc.toString(), equals('''
+a:
+ retry: 3.0.1
+b: false
+'''));
+ });
+
+ test('nested (9)', () {
+ final doc = YamlEditor('''
+# comment
+a: # comment
+# comment
+''');
+ doc.update(['a'], {'retry': '3.0.1'});
+
+ expect(doc.toString(), equals('''
+# comment
+a:
+ retry: 3.0.1 # comment
+# comment
+'''));
+ });
+
test('nested scalar -> flow list', () {
final doc = YamlEditor('''
a: 1