public void This_CanParse_AllValidDateFormats(string readmeValue, string expectedResult) { // TODO: Eventually, perhaps, this will need to be adjust to allow for non-American formats. var journalDate = LocalDate.FromDateTime(DateTime.Parse("4-25-2019")); var parser = new ReadmeParser(readmeValue, journalDate); parser.FormattedExpirationDate.Should().BeEquivalentTo(expectedResult); parser.ExpirationDate.Should().Be(LocalDate.FromDateTime(DateTime.Parse(expectedResult))); }
public JournalFrontMatter(string yamlFrontMatter, LocalDate?journalEntryDate) { yamlFrontMatter = yamlFrontMatter.Trim(); var yamlLines = yamlFrontMatter.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList(); var originalLineCount = yamlLines.Count; if (yamlLines[0] == BlockIndicator) { yamlLines.RemoveAt(0); } var lastIndex = yamlLines.Count - 1; if (yamlLines[lastIndex] == BlockIndicator) { yamlLines.RemoveAt(lastIndex); } if (originalLineCount != yamlLines.Count) { yamlFrontMatter = string.Join(Environment.NewLine, yamlLines); } using (var reader = new System.IO.StringReader(yamlFrontMatter)) { var yamlStream = new YamlStream(); yamlStream.Load(reader); var keys = yamlStream.Documents[0].RootNode.AllNodes .Where(x => x.NodeType == YamlNodeType.Mapping) .Cast <YamlMappingNode>() .SelectMany(x => x.Children.Keys) .Cast <YamlScalarNode>() .ToList(); var tagsKey = keys.FirstOrDefault(k => k.Value.ToLowerInvariant() == "tags"); var readMeKey = keys.FirstOrDefault(k => k.Value.ToLowerInvariant() == "readme"); if (tagsKey != null) { var node = yamlStream.Documents[0].RootNode[tagsKey]; if (node.NodeType == YamlNodeType.Sequence) { var tags = (YamlSequenceNode)node; Tags = tags.Select(x => x.ToString()).Distinct().OrderBy(x => x).ToList(); } } if (readMeKey != null && journalEntryDate != null) { var readme = (YamlScalarNode)yamlStream.Documents[0].RootNode[readMeKey]; var parser = new ReadmeParser(readme.Value, journalEntryDate.Value); Readme = parser.FrontMatterValue; ReadmeDate = parser.ExpirationDate; } } }
public void This_DoesNotThrowExceptions_WhenTagsAndReadmeParserAreNull() { IEnumerable <string> tags = null; ReadmeParser readmeParser = null; var frontMatter = new JournalFrontMatter(tags, readmeParser); frontMatter.Tags.Should().BeNull(); frontMatter.Readme.Should().BeNull(); frontMatter.ReadmeDate.Should().BeNull(); frontMatter.IsEmpty().Should().BeTrue(); }
public JournalFrontMatter(IEnumerable <string> tags, ReadmeParser readmeParser = null) { Tags = tags?.Distinct().OrderBy(x => x).ToList(); if (readmeParser == null) { Readme = null; ReadmeDate = null; } else { Readme = readmeParser.FrontMatterValue; ReadmeDate = readmeParser.ExpirationDate; } }
public void AppendEntryContent(LocalDate entryDate, string[] body, string heading, string[] tags, string readme, out IEnumerable <string> warnings) { var journalWriter = _readerWriterFactory.CreateWriter(); var entryFilePath = journalWriter.GetJournalEntryFilePath(entryDate); IJournalFrontMatter frontMatter; JournalEntryBody journalBody; var readmeParser = new ReadmeParser(readme); if (journalWriter.EntryExists(entryFilePath)) { var journalReader = _readerWriterFactory.CreateReader(entryFilePath); frontMatter = journalReader.FrontMatter; frontMatter.AppendTags(tags); journalBody = new JournalEntryBody(journalReader.RawBody); warnings = readmeParser.IsValid ? new List <string> { "This journal entry already has a Readme date applied. Readme dates cannot be overwritten using this method. " + "If you want to edit the Readme date, open the entry and either change it manually, or delete it entirely and run this " + "method again." } : new List <string>(); } else { warnings = new List <string>(); var readmeExpression = readmeParser.ToExpression(entryDate); frontMatter = new JournalFrontMatter(tags, readmeExpression); journalBody = new JournalEntryBody(); } if (body != null && body.Any()) { if (string.IsNullOrEmpty(heading)) { journalBody.AddOrAppendToDefaultHeader(entryDate, body); } else { journalBody.AddOrAppendToCustomHeader(heading, body); } } journalWriter.Create(entryFilePath, frontMatter, journalBody.ToString()); }
public void Add(IJournalReader reader) { if (string.IsNullOrEmpty(reader.FrontMatter.Readme)) { return; } var parser = new ReadmeParser(reader.FrontMatter.Readme, reader.EntryDate); if (_includeFuture && parser.ExpirationDate > Today.Date() || // Include readme's which expire after today, if requested. parser.ExpirationDate <= Today.Date() && parser.ExpirationDate >= _earliestDate) // Include readme's between earliestDate and today. { var readme = new ReadmeJournalEntry(reader); _readMeEntries.Add(readme); } }
public void CreateNewEntry(LocalDate entryDate, string[] tags, string readme) { var journalWriter = _readerWriterFactory.CreateWriter(); var entryFilePath = journalWriter.GetJournalEntryFilePath(entryDate); if (journalWriter.EntryExists(entryFilePath)) { throw new JournalEntryAlreadyExistsException(entryFilePath); } var readmeExpression = new ReadmeParser(readme).ToExpression(entryDate); var frontMatter = new JournalFrontMatter(tags, readmeExpression); var header = $"# {entryDate}"; journalWriter.Create(entryFilePath, frontMatter, header); _systemProcess.Start(entryFilePath); }
public void This_IsNotValid_WhenReadmeFormatIsInvalid(string invalidReadme) { var parser = new ReadmeParser(invalidReadme); parser.IsValid.Should().BeFalse(); }