Skip to content

Commit

Permalink
chore: cruft update
Browse files Browse the repository at this point in the history
  • Loading branch information
lyz-code committed Jun 13, 2022
1 parent 2c356bd commit f32f2d1
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 55 deletions.
73 changes: 36 additions & 37 deletions src/mkdocs_newsletter/model.py
Expand Up @@ -5,10 +5,10 @@
from datetime import datetime, timedelta
from enum import Enum
from pathlib import Path
from typing import Any, Dict, List, Optional
from typing import List, Optional

from dateutil import tz
from pydantic import BaseModel, Field, HttpUrl, root_validator
from pydantic import BaseModel, Field, HttpUrl


class Change(BaseModel):
Expand Down Expand Up @@ -70,45 +70,44 @@ class Newsletter(BaseModel):
"""Represents a newsletter."""

file_: Path
date: datetime
type_: NewsletterType
basename: str

@root_validator(pre=True)
@classmethod
def set_attributes(cls, values: Dict[str, Any]) -> Dict[str, Any]:
"""Set the class attributes.

* basename: basename of the file.
* type_: Set the type of the newsletter.
* date: Set the datetime associated to the file name.
"""
basename = os.path.splitext(values["file_"].name)[0]
values["basename"] = basename

if re.match(r"\d{4}$", basename):
values["type_"] = "yearly"
values["date"] = datetime(int(basename), 1, 1, tzinfo=tz.tzlocal())
elif re.match(r"\d{4}_\d{2}$", basename):
values["type_"] = "monthly"
year = int(basename.split("_")[0])
month = int(basename.split("_")[1])
values["date"] = datetime(year, month, 1, tzinfo=tz.tzlocal())
elif re.match(r"\d{4}_w\d{2}$", basename):
values["type_"] = "weekly"
year = int(basename.split("_")[0])
week = int(basename.split("w")[1])
@property
def basename(self) -> str:
"""Return the basename of the Newsletter."""
return os.path.splitext(self.file_.name)[0]

@property
def type_(self) -> str:
"""Return the type of the Newsletter."""
if re.match(r"\d{4}$", self.basename):
return "yearly"
if re.match(r"\d{4}_\d{2}$", self.basename):
return "monthly"
if re.match(r"\d{4}_w\d{2}$", self.basename):
return "weekly"
if re.match(r"\d{4}_\d{2}_\d{2}$", self.basename):
return "daily"
raise ValueError("Can't extract type from file path")

@property
def date(self) -> datetime:
"""Return the date of the Newsletter."""
if re.match(r"\d{4}$", self.basename):
return datetime(int(self.basename), 1, 1, tzinfo=tz.tzlocal())
if re.match(r"\d{4}_\d{2}$", self.basename):
year = int(self.basename.split("_")[0])
month = int(self.basename.split("_")[1])
return datetime(year, month, 1, tzinfo=tz.tzlocal())
if re.match(r"\d{4}_w\d{2}$", self.basename):
year = int(self.basename.split("_")[0])
week = int(self.basename.split("w")[1])
first_day = datetime(year, 1, 1, tzinfo=tz.tzlocal())
values["date"] = first_day + timedelta(
days=7 * (week - 1) - first_day.weekday()
)
elif re.match(r"\d{4}_\d{2}_\d{2}$", basename):
values["type_"] = "daily"
values["date"] = datetime.strptime(basename, "%Y_%m_%d").replace(
return first_day + timedelta(days=7 * (week - 1) - first_day.weekday())
if re.match(r"\d{4}_\d{2}_\d{2}$", self.basename):
return datetime.strptime(self.basename, "%Y_%m_%d").replace(
tzinfo=tz.tzlocal()
)

return values
raise ValueError("Can't extract date from file path")

def __lt__(self, other: "Newsletter") -> bool:
"""Assert if an object is smaller than us.
Expand Down
26 changes: 14 additions & 12 deletions src/mkdocs_newsletter/services/newsletter.py
Expand Up @@ -6,6 +6,7 @@
import os
import re
from contextlib import suppress
from pathlib import Path
from typing import Callable, List, Optional, Tuple

from dateutil import tz
Expand Down Expand Up @@ -79,18 +80,19 @@ def _list_newsletters(newsletter_dir: str) -> Newsletters:
Newsletters object.
"""
newsletters = Newsletters()
for file_ in os.scandir(newsletter_dir):
if file_.name == "0_newsletter_index.md":
continue
newsletter = Newsletter(file_=file_)
if newsletter.type_ == "yearly":
newsletters.yearly.append(newsletter)
elif newsletter.type_ == "monthly":
newsletters.monthly.append(newsletter)
elif newsletter.type_ == "weekly":
newsletters.weekly.append(newsletter)
elif newsletter.type_ == "daily":
newsletters.daily.append(newsletter)
with os.scandir(newsletter_dir) as files:
for file_ in files:
if file_.name == "0_newsletter_index.md":
continue
newsletter = Newsletter(file_=Path(file_.path))
if newsletter.type_ == "yearly":
newsletters.yearly.append(newsletter)
elif newsletter.type_ == "monthly":
newsletters.monthly.append(newsletter)
elif newsletter.type_ == "weekly":
newsletters.weekly.append(newsletter)
elif newsletter.type_ == "daily":
newsletters.daily.append(newsletter)
newsletters.sort()

return newsletters
Expand Down
8 changes: 4 additions & 4 deletions src/mkdocs_newsletter/services/rss.py
Expand Up @@ -70,9 +70,9 @@ def build_rss_feed(config: Config, working_dir: str, type_: str) -> Feed:
ttl=TTL[type_],
generator=f"mkdocs-newsletter - v{__version__}",
title=config.get("site_name", None),
link=site_url,
rss_link=f"{site_url}/{type_}.xml",
logo=logo_url,
link=site_url, # type: ignore
rss_link=f"{site_url}/{type_}.xml", # type: ignore
logo=logo_url, # type: ignore
description=config.get("site_description", None),
author=author,
published=published,
Expand Down Expand Up @@ -137,7 +137,7 @@ def _build_rss_entries(

entry = FeedEntry(
title=title,
link=f"{site_url}/newsletter/{newsletter.basename}/",
link=f"{site_url}/newsletter/{newsletter.basename}/", # type: ignore
published=published,
description=description,
author=author,
Expand Down
24 changes: 22 additions & 2 deletions tests/unit/test_model.py
Expand Up @@ -3,6 +3,7 @@
from datetime import datetime
from pathlib import Path

import pytest
from dateutil import tz

from mkdocs_newsletter.model import (
Expand Down Expand Up @@ -84,17 +85,36 @@ def test_feedentry_can_order_objects() -> None: # noqa: AAA01
greater = FeedEntry(
published=datetime(2021, 1, 1),
title="Greater",
link="https://test.com",
link="https://test.com", # type: ignore
description="",
)
smaller = FeedEntry(
published=datetime(2020, 1, 1),
title="Smaller",
link="https://test.com",
link="https://test.com", # type: ignore
description="",
)

assert greater > smaller
# SIM204, C0113: We don't want to simplify to important > unimportant because we
# want to test the __lt__ method
assert not greater < smaller # noqa: C0113, SIM204


@pytest.mark.parametrize(
("property_", "message"),
[
("type_", "Can't extract type from file path"),
("date", "Can't extract date from file path"),
],
)
def test_newsletter_handles_wrong_path(property_: str, message: str) -> None:
"""
Given: A Newsletter with a path that doesn't have a date.
When: calling the type_ and date methods
Then: Errors are raised
"""
newsletter = Newsletter(file_=Path("wrong_path.md"))

with pytest.raises(ValueError, match=message):
getattr(newsletter, property_)

0 comments on commit f32f2d1

Please sign in to comment.