From 4917b8618aa71221f640bbf749cee7944eba32f3 Mon Sep 17 00:00:00 2001 From: Tim Wienk Date: Sat, 11 Mar 2017 13:38:54 +0100 Subject: [PATCH] Fix setting None metadata from FILENAME_METADATA matches. This is relevant when using optional items in the expression. E.g. if an optional captured group is not matched, the result of `match.groupdict()` contains the captured group with value `None`. --- pelican/readers.py | 2 +- pelican/tests/test_readers.py | 38 +++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/pelican/readers.py b/pelican/readers.py index e899838a..a620a1e8 100644 --- a/pelican/readers.py +++ b/pelican/readers.py @@ -672,7 +672,7 @@ def parse_path_metadata(source_path, settings=None, process=None): # .items() for py3k compat. for k, v in match.groupdict().items(): k = k.lower() # metadata must be lowercase - if k not in metadata: + if v is not None and k not in metadata: if process: v = process(k, v) metadata[k] = v diff --git a/pelican/tests/test_readers.py b/pelican/tests/test_readers.py index ac0f81dc..0d22bf44 100644 --- a/pelican/tests/test_readers.py +++ b/pelican/tests/test_readers.py @@ -166,6 +166,25 @@ class RstReaderTest(ReaderTest): } self.assertDictHasSubset(page.metadata, expected) + def test_article_with_optional_filename_metadata(self): + page = self.read_file( + path='2012-11-29_rst_w_filename_meta#foo-bar.rst', + FILENAME_METADATA='(?P\d{4}-\d{2}-\d{2})?') + expected = { + 'date': SafeDatetime(2012, 11, 29), + 'reader': 'rst', + } + self.assertDictHasSubset(page.metadata, expected) + + page = self.read_file( + path='article.rst', + FILENAME_METADATA='(?P\d{4}-\d{2}-\d{2})?') + expected = { + 'reader': 'rst', + } + self.assertDictHasSubset(page.metadata, expected) + self.assertNotIn('date', page.metadata, 'Date should not be set.') + def test_article_metadata_key_lowercase(self): # Keys of metadata should be lowercase. reader = readers.RstReader(settings=get_settings()) @@ -561,6 +580,25 @@ class MdReaderTest(ReaderTest): } self.assertDictHasSubset(page.metadata, expected) + def test_article_with_optional_filename_metadata(self): + page = self.read_file( + path='2012-11-30_md_w_filename_meta#foo-bar.md', + FILENAME_METADATA='(?P\d{4}-\d{2}-\d{2})?') + expected = { + 'date': SafeDatetime(2012, 11, 30), + 'reader': 'markdown', + } + self.assertDictHasSubset(page.metadata, expected) + + page = self.read_file( + path='empty.md', + FILENAME_METADATA='(?P\d{4}-\d{2}-\d{2})?') + expected = { + 'reader': 'markdown', + } + self.assertDictHasSubset(page.metadata, expected) + self.assertNotIn('date', page.metadata, 'Date should not be set.') + def test_duplicate_tags_or_authors_are_removed(self): reader = readers.MarkdownReader(settings=get_settings()) content, metadata = reader.read(