diff --git a/src/zona/builder.py b/src/zona/builder.py index 703bc2d..549abbd 100644 --- a/src/zona/builder.py +++ b/src/zona/builder.py @@ -1,5 +1,5 @@ import shutil -from datetime import date, datetime +from datetime import date from pathlib import Path from feedgen.feed import FeedGenerator @@ -101,9 +101,11 @@ class ZonaBuilder: items.append(item) self.items = items - def generate_feed(self) -> str: + def generate_feed(self) -> bytes: post_list = self._get_post_list() config = self.config.feed + if config.link.endswith("/"): + config.link = config.link[:-2] fg = FeedGenerator() fg.id(config.link) fg.title(config.title) @@ -112,7 +114,11 @@ class ZonaBuilder: "email": config.author.email, } fg.author(author) - fg.link(href=config.link, rel="self") + fg.link( + href=f"{config.link}/{config.path}", + rel="self", + type="application/rss+xml", + ) fg.language(config.language) fg.description(config.description) @@ -120,14 +126,18 @@ class ZonaBuilder: assert post.metadata fe = fg.add_entry() # pyright: ignore[reportUnknownVariableType] fe.id(f"{config.link}{util.normalize_url(post.url)}") # pyright: ignore[reportUnknownMemberType] + fe.link( # pyright: ignore[reportUnknownMemberType] + href=f"{config.link}{util.normalize_url(post.url)}" + ) fe.title(post.metadata.title) # pyright: ignore[reportUnknownMemberType] fe.author(author) # pyright: ignore[reportUnknownMemberType] - fe.description(post.metadata.description) # pyright: ignore[reportUnknownMemberType] + desc = post.metadata.description + fe.description(desc) # pyright: ignore[reportUnknownMemberType] date = post.metadata.date - # ISSUE: lack of timezone causes an error, need to add TZ config option - dt = datetime.combine(date, datetime.min.time()) - fe.pubDate(dt) # pyright: ignore[reportUnknownMemberType] - return fg.rss_str(pretty=True) # pyright: ignore[reportUnknownVariableType] + fe.pubDate(date) # pyright: ignore[reportUnknownMemberType] + out: bytes = fg.rss_str(pretty=True) # pyright: ignore[reportUnknownVariableType] + assert isinstance(out, bytes) + return out def _get_post_list(self) -> list[Item]: assert self.items @@ -218,4 +228,4 @@ class ZonaBuilder: logger.debug("Building...") self._build() self.fresh = False - # print(self.generate_feed()) + print(self.generate_feed().decode()) diff --git a/src/zona/config.py b/src/zona/config.py index 712158d..84844c7 100644 --- a/src/zona/config.py +++ b/src/zona/config.py @@ -1,7 +1,7 @@ from __future__ import annotations from dataclasses import dataclass, field -from datetime import tzinfo +from datetime import datetime, tzinfo from pathlib import Path from typing import Any from zoneinfo import ZoneInfo @@ -10,7 +10,6 @@ import yaml from dacite import Config as DaciteConfig from dacite import from_dict -from zona import util from zona.log import get_logger logger = get_logger() @@ -32,9 +31,17 @@ def find_config(start: Path | None = None) -> Path | None: SitemapConfig = dict[str, str] +@dataclass +class PostDefaultsConfig: + description: str = "A blog post" + + @dataclass class BlogConfig: dir: str = "blog" + defaults: PostDefaultsConfig = field( + default_factory=PostDefaultsConfig + ) @dataclass @@ -86,7 +93,7 @@ class AuthorConfig: class FeedConfig: enabled: bool = True timezone: tzinfo = field(default_factory=lambda: ZoneInfo("UTC")) - path: str = "feed.xml" + path: str = "rss.xml" link: str = "https://example.com" title: str = "Zona Website" description: str = "My zona website." diff --git a/src/zona/metadata.py b/src/zona/metadata.py index 9f0ada6..4551117 100644 --- a/src/zona/metadata.py +++ b/src/zona/metadata.py @@ -17,7 +17,7 @@ from zona.config import ZonaConfig class Metadata: title: str date: datetime - description: str | None + description: str show_title: bool = True show_date: bool = True show_nav: bool = True @@ -70,6 +70,7 @@ def parse_metadata( defaults = { "title": zona.util.filename_to_title(path), "date": datetime.fromtimestamp(path.stat().st_ctime), + "description": config.blog.defaults.description, } meta = {**defaults, **raw_meta} meta["date"] = parse_date(meta.get("date"), config.feed.timezone)