From b0cc615aae1d3f76eb936efd3fd6a25ec82f39a6 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Sat, 14 Mar 2020 23:32:29 +0100 Subject: [PATCH] Move MdYamlDoc loading to its own class --- lib/core/md_yaml_doc_loader.dart | 29 +++++++++++++++++++++++ lib/core/note.dart | 11 +++++---- test/md_yaml_doc_loader_test.dart | 38 +++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 lib/core/md_yaml_doc_loader.dart create mode 100644 test/md_yaml_doc_loader_test.dart diff --git a/lib/core/md_yaml_doc_loader.dart b/lib/core/md_yaml_doc_loader.dart new file mode 100644 index 00000000..9480062b --- /dev/null +++ b/lib/core/md_yaml_doc_loader.dart @@ -0,0 +1,29 @@ +import 'dart:io'; + +import 'package:gitjournal/core/md_yaml_doc.dart'; +import 'package:gitjournal/core/md_yaml_doc_codec.dart'; + +class MdYamlDocLoader { + static final _serializer = MarkdownYAMLCodec(); + + Future loadDoc(String filePath) async { + // FIXME: What about parse errors? + + final file = File(filePath); + if (!file.existsSync()) { + throw MdYamlDocNotFoundException(filePath); + } + + final fileData = await file.readAsString(); + var doc = _serializer.decode(fileData); + return doc; + } +} + +class MdYamlDocNotFoundException implements Exception { + final String filePath; + MdYamlDocNotFoundException(this.filePath); + + @override + String toString() => "MdYamlDocNotFoundException: $filePath"; +} diff --git a/lib/core/note.dart b/lib/core/note.dart index 50d80935..04626ad3 100644 --- a/lib/core/note.dart +++ b/lib/core/note.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:fimber/fimber.dart'; +import 'package:gitjournal/core/md_yaml_doc_loader.dart'; import 'package:gitjournal/core/note_notifier.dart'; import 'package:gitjournal/settings.dart'; import 'package:gitjournal/utils/markdown.dart'; @@ -37,6 +38,8 @@ class Note with NotesNotifier { String _summary; + static final _mdYamlDocLoader = MdYamlDocLoader(); + Note(this.parent, this._filePath); Note.newNote(this.parent) { @@ -149,16 +152,14 @@ class Note with NotesNotifier { Fimber.d("Note modified: $_filePath"); } - if (!file.existsSync()) { + try { + data = await _mdYamlDocLoader.loadDoc(_filePath); + } on MdYamlDocNotFoundException catch (_) { _loadState = NoteLoadState.NotExists; _notifyModified(); return _loadState; } - // FIXME: This could throw an exception! - final string = await file.readAsString(); - data = _serializer.decode(string); - fileLastModified = file.lastModifiedSync(); _loadState = NoteLoadState.Loaded; diff --git a/test/md_yaml_doc_loader_test.dart b/test/md_yaml_doc_loader_test.dart new file mode 100644 index 00000000..9ab50dd6 --- /dev/null +++ b/test/md_yaml_doc_loader_test.dart @@ -0,0 +1,38 @@ +import 'dart:io'; + +import 'package:gitjournal/core/md_yaml_doc_loader.dart'; +import 'package:path/path.dart' as p; +import 'package:test/test.dart'; + +void main() { + group('MdYamlDocLoader', () { + Directory tempDir; + String filePath; + var contents = """--- +type: Journal +foo: bar +--- + +Alright."""; + + setUpAll(() async { + tempDir = await Directory.systemTemp.createTemp('__doc_loader_test__'); + filePath = p.join(tempDir.path, "doc0"); + await File(filePath).writeAsString(contents); + }); + + tearDownAll(() async { + tempDir.deleteSync(recursive: true); + }); + + test('Should load one doc', () async { + var loader = MdYamlDocLoader(); + var doc = await loader.loadDoc(filePath); + + expect(doc.body, "Alright."); + expect(doc.props["type"], "Journal"); + expect(doc.props["foo"], "bar"); + expect(doc.props.length, 2); + }); + }); +}