diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 0000000..0bf6637 --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,3 @@ +Release type: patch + +Fix #31 - Series breaks on draft articles diff --git a/pelican/plugins/series/conftest.py b/pelican/plugins/series/conftest.py index 7a1322f..d4642eb 100644 --- a/pelican/plugins/series/conftest.py +++ b/pelican/plugins/series/conftest.py @@ -50,3 +50,6 @@ def _create_generator(tmp_path): articles_with_index_over_10 = create_generator( "test_data/articles_with_index_over_10", lambda x: x.series["index"] ) +articles_with_draft = create_generator( + "test_data/articles_with_draft", attrgetter("date") +) diff --git a/pelican/plugins/series/series.py b/pelican/plugins/series/series.py index 6bc6edc..980ebcb 100644 --- a/pelican/plugins/series/series.py +++ b/pelican/plugins/series/series.py @@ -58,11 +58,15 @@ def aggregate_series(generator): # and collects the 'series' metadata, if present. # The 'series_index' metadata is also stored, if specified translations = defaultdict(dict) - more = [] - for article in generator.articles: - for trans in article.translations: - more.append(trans) - for article in generator.articles + more: + all_articles = ( + generator.articles + + generator.translations + + getattr(generator, "drafts", []) + + getattr(generator, "drafts_translations", []) + + getattr(generator, "hidden_articles", []) + + getattr(generator, "hidden_translations", []) + ) + for article in all_articles: if "series" in article.metadata: article_entry = { "index": int(article.metadata.get("series_index", 0)), diff --git a/pelican/plugins/series/test_articles_with_draft.py b/pelican/plugins/series/test_articles_with_draft.py new file mode 100644 index 0000000..2a60340 --- /dev/null +++ b/pelican/plugins/series/test_articles_with_draft.py @@ -0,0 +1,46 @@ +def test_draft_article_gets_series_metadata(articles_with_draft): + generator, _ = articles_with_draft + + # The draft should be in generator.drafts, not generator.articles + assert len(generator.drafts) == 1 + draft = generator.drafts[0] + + # The draft's series attribute should be a dict, not a raw string + assert isinstance(draft.series, dict), ( + f"Draft article's series is {type(draft.series).__name__}, " + "expected dict with series metadata" + ) + assert draft.series["name"] == "test_series" + + +def test_draft_is_included_in_series_ordering(articles_with_draft): + generator, _ = articles_with_draft + draft = generator.drafts[0] + + # The series should contain all 3 articles (2 published + 1 draft) + assert len(draft.series["all"]) == 3 + + +def test_published_articles_see_draft_in_series(articles_with_draft): + _, articles = articles_with_draft + + # Published articles should also have all 3 in their series + for article in articles: + assert len(article.series["all"]) == 3 + + +def test_draft_series_navigation(articles_with_draft): + generator, _ = articles_with_draft + draft = generator.drafts[0] + + # Draft is article 2 (by date), so it should have previous and next + assert draft.series["index"] == 2 + assert draft.series["previous"] is not None + assert draft.series["next"] is not None + + +def test_draft_not_in_context_series(articles_with_draft): + generator, _ = articles_with_draft + + # Context series exists + assert "test_series" in generator.context["series"] diff --git a/pelican/plugins/series/test_data/articles_with_draft/series_article_1.md b/pelican/plugins/series/test_data/articles_with_draft/series_article_1.md new file mode 100644 index 0000000..d7acf3b --- /dev/null +++ b/pelican/plugins/series/test_data/articles_with_draft/series_article_1.md @@ -0,0 +1,8 @@ +Title: Post number 1 +Date: 2021-02-01 13:00:00 +Category: test +Tags: foo, bar, foobar +Summary: I have a lot to test +Series: test_series + +Content 1 diff --git a/pelican/plugins/series/test_data/articles_with_draft/series_article_2.md b/pelican/plugins/series/test_data/articles_with_draft/series_article_2.md new file mode 100644 index 0000000..484597d --- /dev/null +++ b/pelican/plugins/series/test_data/articles_with_draft/series_article_2.md @@ -0,0 +1,9 @@ +Title: Post number 2 +Date: 2021-02-02 13:00:00 +Category: test +Tags: foo, bar, foobar +Summary: I have a lot to test +Series: test_series +Status: draft + +Content 2 diff --git a/pelican/plugins/series/test_data/articles_with_draft/series_article_3.md b/pelican/plugins/series/test_data/articles_with_draft/series_article_3.md new file mode 100644 index 0000000..4ef4638 --- /dev/null +++ b/pelican/plugins/series/test_data/articles_with_draft/series_article_3.md @@ -0,0 +1,8 @@ +Title: Post number 3 +Date: 2021-02-03 13:00:00 +Category: test +Tags: foo, bar, foobar +Summary: I have a lot to test +Series: test_series + +Content 3