44# ########## Libraries #############
55# ##################################
66
7+ # for class autoref typing
8+ from __future__ import annotations
79
810# standard
911from collections .abc import MutableMapping
1012from dataclasses import dataclass , field
1113from datetime import datetime
12- from email .utils import format_datetime
1314from pathlib import Path
14- from typing import Any , Literal , Optional
15+ from typing import Any
1516
1617# 3rd party
1718from mkdocs .structure .pages import Page
2829class MkdocsPageSubset :
2930 """Minimal subset of a Mkdocs Page with only necessary attributes for plugin needs."""
3031
32+ abs_src_path : str
3133 dest_uri : str
3234 src_uri : str
33- title : Optional [ str ] = None
34- meta : Optional [ MutableMapping [str , Any ]] = None
35+ title : str | None = None
36+ meta : MutableMapping [str , Any ] | None = None
3537
3638 @classmethod
37- def from_page (cls , page : Page ) -> " MkdocsPageSubset" :
39+ def from_page (cls , page : Page ) -> MkdocsPageSubset :
3840 """Create a PageSubset from a Mkdocs page.
3941
4042 Args:
4143 page: MkDocs Page object
4244 """
4345 return cls (
46+ abs_src_path = page .file .abs_src_path ,
4447 meta = page .meta ,
4548 title = page .title ,
4649 src_uri = page .file .src_uri ,
@@ -52,34 +55,40 @@ def from_page(cls, page: Page) -> "MkdocsPageSubset":
5255class PageInformation :
5356 """Object describing a page information gathered from Mkdocs and used as feed's item."""
5457
55- abs_path : Optional [Path ] = None
56- categories : Optional [list ] = None
57- authors : Optional [tuple ] = None
58- created : Optional [datetime ] = None
59- description : Optional [str ] = None
60- guid : Optional [str ] = None
61- image : Optional [str ] = None
62- title : Optional [str ] = None
63- updated : Optional [datetime ] = None
64- url_comments : Optional [str ] = None
65- url_full : Optional [str ] = None
66- _mkdocs_page_ref : Optional [MkdocsPageSubset ] = field (
58+ abs_path : Path | None = None
59+ categories : list | None = None
60+ authors : tuple | None = None
61+ comments_url : str | None = None
62+ created : datetime | None = None
63+ description : str | None = None
64+ guid : str | None = None
65+ image : tuple [str , str , int ] | None = None
66+ link : str | None = None
67+ pub_date : str | None = None
68+ pub_date_3339 : str | None = None
69+ title : str | None = None
70+ updated : datetime | None = None
71+ # private
72+ _mkdocs_page_ref : MkdocsPageSubset | None = field (
6773 default = None , repr = False , compare = False
6874 )
6975
70- def as_rss_item (self , date_type : Literal ["created" , "updated" ]) -> dict :
71- """Return the object as a dictionary formatted for RSS item."""
72- pub_date : datetime = getattr (self , date_type )
76+ def as_rss_item (self ) -> dict :
77+ """Return the object as a dictionary formatted for RSS item.
78+
79+ Returns:
80+ page as RSS item dict
81+ """
7382 return {
7483 "authors" : self .authors ,
7584 "categories" : self .categories ,
76- "comments_url" : self .url_comments ,
85+ "comments_url" : self .comments_url ,
7786 "description" : self .description ,
7887 "guid" : self .guid ,
7988 "image" : self .image ,
80- "link" : self .url_full ,
81- "pubDate " : format_datetime ( dt = pub_date ) ,
82- "pubDate3339 " : pub_date . isoformat ( "T" ) ,
89+ "link" : self .link ,
90+ "pub_date " : self . pub_date ,
91+ "pubd_date_3339 " : self . pub_date_3339 ,
8392 "title" : self .title ,
8493 }
8594
@@ -88,18 +97,18 @@ def as_rss_item(self, date_type: Literal["created", "updated"]) -> dict:
8897class RssFeedBase :
8998 """Object describing a feed."""
9099
91- author : Optional [ str ] = None
92- buildDate : Optional [ str ] = None
93- copyright : Optional [ str ] = None
94- description : Optional [ str ] = None
100+ author : str | None = None
101+ buildDate : str | None = None
102+ copyright : str | None = None
103+ description : str | None = None
95104 entries : list [PageInformation ] = field (default_factory = list )
96105 generator : str = f"{ __title__ } - v{ __version__ } "
97- html_url : Optional [ str ] = None
98- json_url : Optional [ str ] = None
99- language : Optional [ str ] = None
100- logo_url : Optional [ str ] = None
101- pubDate : Optional [ str ] = None
102- repo_url : Optional [ str ] = None
103- rss_url : Optional [ str ] = None
104- title : Optional [ str ] = None
105- ttl : Optional [ int ] = None
106+ html_url : str | None = None
107+ json_url : str | None = None
108+ language : str | None = None
109+ logo_url : str | None = None
110+ pubDate : str | None = None
111+ repo_url : str | None = None
112+ rss_url : str | None = None
113+ title : str | None = None
114+ ttl : int | None = None
0 commit comments