Ejemplo n.º 1
0
        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)));
        }
Ejemplo n.º 2
0
        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;
                }
            }
        }
Ejemplo n.º 3
0
        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();
        }
Ejemplo n.º 4
0
        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;
            }
        }
Ejemplo n.º 5
0
        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());
        }
Ejemplo n.º 6
0
        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);
            }
        }
Ejemplo n.º 7
0
        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();
        }