1
0
Fork 0
forked from github/pelican

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`.
This commit is contained in:
Tim Wienk 2017-03-11 13:38:54 +01:00
commit 4917b8618a
2 changed files with 39 additions and 1 deletions

View file

@ -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

View file

@ -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<date>\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<date>\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<date>\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<date>\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(