Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions mkdocs_rss_plugin/templates/default.xsl
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,8 @@ a:hover {
</p>
<div class="meta">

<xsl:if test="author">
By <xsl:value-of select="author"/>
<xsl:if test="managingEditor">
By <xsl:value-of select="managingEditor"/>
</xsl:if>

<xsl:if test="pubDate">
Expand Down Expand Up @@ -162,8 +162,8 @@ a:hover {
</h2>

<div class="meta">
<xsl:if test="author">
Par <xsl:value-of select="author"/>
<xsl:if test="dc:creator">
By <xsl:value-of select="dc:creator"/>
</xsl:if>
<xsl:if test="pubDate">
— <xsl:value-of select="pubDate"/>
Expand Down
4 changes: 2 additions & 2 deletions mkdocs_rss_plugin/templates/rss.xml.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@
{% for item in feed.entries %}
<item>
<title>{{ item.title|e }}</title>
{# Authors loop #}
{# Authors loop - use dc:creator for names (RSS <author> requires email) #}
{% if item.authors is not none %}
{% for author in item.authors %}
<author>{{ author }}</author>
<dc:creator>{{ author }}</dc:creator>
{% endfor %}
{% endif %}
{# Categories loop #}
Expand Down
97 changes: 97 additions & 0 deletions tests/test_dc_creator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
#! python3 # noqa: E265

"""Test that item authors use <dc:creator> instead of <author>.

RSS 2.0 spec requires <author> to be an email address.
Human-readable names should use <dc:creator>.

Usage from the repo root folder:

python -m unittest tests.test_dc_creator

"""

# #############################################################################
# ########## Libraries #############
# ##################################

# Standard library
import logging
import tempfile
from pathlib import Path
from traceback import format_exception
from xml.etree import ElementTree

# test suite
from tests.base import BaseTest

# -- Globals --
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

OUTPUT_RSS_FEED_CREATED = "feed_rss_created.xml"

# #############################################################################
# ########## Classes ###############
# ##################################


class TestDcCreator(BaseTest):
"""Test that <dc:creator> is used instead of <author> for item authors."""

def test_dc_creator_instead_of_author(self):
"""Verify that item authors use <dc:creator> instead of <author>.

RSS 2.0 spec requires <author> to be an email address.
Human-readable names should use <dc:creator>.
"""
with tempfile.TemporaryDirectory() as tmpdirname:
cli_result = self.build_docs_setup(
testproject_path="docs",
mkdocs_yml_filepath=Path("tests/fixtures/mkdocs_complete.yml"),
output_path=tmpdirname,
strict=True,
)

if cli_result.exception is not None:
e = cli_result.exception
logger.debug(format_exception(type(e), e, e.__traceback__))

self.assertEqual(cli_result.exit_code, 0)
self.assertIsNone(cli_result.exception)

# Parse the raw XML to check element names
rss_path = Path(tmpdirname) / OUTPUT_RSS_FEED_CREATED
tree = ElementTree.parse(rss_path)
root = tree.getroot()

# RSS namespace
ns = {
"rss": "http://www.w3.org/2005/Atom",
"dc": "http://purl.org/dc/elements/1.1/",
}

# Find all item elements
items = root.findall(".//item")
self.assertGreater(len(items), 0, "Expected at least one item in feed")

for item in items:
# Check that <author> is NOT used for item authors
author_elem = item.find("author")
self.assertIsNone(
author_elem,
"Found <author> element in item. RSS 2.0 requires <author> to be "
"an email address. Use <dc:creator> for human-readable names.",
)

# Check that <dc:creator> IS used when authors are present
# The page_with_meta.md has authors, so at least one item should have dc:creator
dc_creators = item.findall("dc:creator", ns)
# Items with authors should have dc:creator elements
# Items without authors may not have any
if item.find("title").text == "Page With Explicit Metadata":
self.assertGreater(
len(dc_creators),
0,
"Expected <dc:creator> elements for item with authors.",
)