public JournalFrontMatter(IEnumerable <string> tags, ReadmeExpression readmeExpression) { Tags = tags?.Distinct().OrderBy(x => x).ToList(); readmeExpression ??= ReadmeExpression.Empty(); Readme = readmeExpression.FormattedExpirationDate; ReadmeDate = readmeExpression.ExpirationDate; }
public void EmptyExpression_ReturnsNullProperties_Always() { var exp = ReadmeExpression.Empty(); exp.ExpirationDate.Should().BeNull(); exp.FormattedExpirationDate.Should().BeNull(); }
public void CreateCompiledEntry(ICollection <IJournalEntry> entries, bool overwrite) { if (entries == null || !entries.Any()) { throw new ArgumentException("No entries were provided. At least one entry must be provided.", nameof(entries)); } var convertedEntries = entries.Select(x => new JournalEntryFile(x.GetReader())).OrderBy(x => x.EntryDate).ToList(); var range = new DateRange(convertedEntries.First().EntryDate, convertedEntries.Last().EntryDate); var journalWriter = _readerWriterFactory.CreateWriter(); var entryFilePath = journalWriter.GetCompiledJournalEntryFilePath(range); if (journalWriter.EntryExists(entryFilePath) && !overwrite) { throw new JournalEntryAlreadyExistsException(entryFilePath); } var aggregatedTags = convertedEntries.SelectMany(x => x.Tags).Distinct(); var content = string.Join(Environment.NewLine, convertedEntries.Select(x => x.Body)); var frontMatter = new JournalFrontMatter(aggregatedTags, ReadmeExpression.Empty()); journalWriter.CreateCompiled(frontMatter, entryFilePath, content); _systemProcess.Start(entryFilePath); }
/// <summary> /// Creates a single journal entry comprised of all entries found which match the specified criteria. /// </summary> /// <param name="range">The date range to search for entries. Dates are inclusive. Null values assume all entries are desired.</param> /// <param name="tags">Filters entries by tag. Null values assumes all tags are desired.</param> /// <param name="tagOperator">Indicates whether all tags must be matched, or if any tag can be matched.</param> /// <param name="overwrite">True to overwrite an existing compiled entry with the same name. Otherwise, an exception is thrown.</param> public void CreateCompiledEntry(DateRange range, string[] tags, TagOperator tagOperator, bool overwrite) { List <JournalEntryFile> entries; var hasTags = tags != null && tags.Length > 0; if (hasTags) { if (tagOperator == TagOperator.All) { entries = CreateIndex <JournalEntryFile>(range, tags) .SelectMany(x => x.Entries) .OrderBy(x => x) .Distinct() .ToList(); } else { entries = CreateIndex <JournalEntryFile>(range) .Where(x => tags.Contains(x.Tag)) .SelectMany(x => x.Entries) .OrderBy(x => x) .Distinct() .ToList(); } } else { entries = CreateIndex <JournalEntryFile>(range) .SelectMany(x => x.Entries) .OrderBy(x => x) .Distinct() .ToList(); } if (entries.Count == 0) { throw new InvalidOperationException("No journal entries found matching the specified criteria. Please change your criteria and try again."); } range ??= new DateRange(entries.First().EntryDate, entries.Last().EntryDate); var journalWriter = _readerWriterFactory.CreateWriter(); var entryFilePath = journalWriter.GetCompiledJournalEntryFilePath(range); if (journalWriter.EntryExists(entryFilePath) && !overwrite) { throw new JournalEntryAlreadyExistsException(entryFilePath); } var aggregatedTags = entries.SelectMany(x => x.Tags).Distinct(); var content = string.Join(Environment.NewLine, entries.Select(x => x.Body)); var frontMatter = new JournalFrontMatter(aggregatedTags, ReadmeExpression.Empty()); journalWriter.CreateCompiled(frontMatter, entryFilePath, content); _systemProcess.Start(entryFilePath); }
public void This_DoesNotThrowExceptions_WhenTagsAndReadmeParserAreNull() { IEnumerable <string> tags = null; ReadmeExpression readmeExpression = null; var frontMatter = new JournalFrontMatter(tags, readmeExpression); frontMatter.Tags.Should().BeNull(); frontMatter.Readme.Should().BeNull(); frontMatter.ReadmeDate.Should().BeNull(); frontMatter.IsEmpty().Should().BeTrue(); }
public string ToString(bool asFrontMatter) { var target = IsEmpty() ? new JournalFrontMatter(new[] { "(untagged)" }, ReadmeExpression.Empty()) : this; var serializer = new SerializerBuilder().ConfigureDefaultValuesHandling(DefaultValuesHandling.OmitDefaults).Build(); var yaml = serializer.Serialize(target).Replace("- ", " - ").Trim(); return(asFrontMatter ? $"{BlockIndicator}{Environment.NewLine}{yaml}{Environment.NewLine}{BlockIndicator}{Environment.NewLine}" : yaml); }