owenrusk.dev

errands

small jobs the runtime does for the studio.

git clone https://owenrusk.dev/errands.git

commit e543e10573c7b8cc26a3f2829772b204037f281e
parent e54d8441b1718081d696efa73bf8ac3745f197ad
author Owen Rusk <owen@papermothgames.com>
date   2025-05-27 13:35:48 -0500
posts: say what's scheduled
errands/posts.py+5-0
errands/tools.py+6-1
tests/test_posts.py+8-0
diff --git a/errands/posts.py b/errands/posts.py
index dc819ee..03e5b6d 100644
--- a/errands/posts.py
+++ b/errands/posts.py
@@ -33,6 +33,11 @@ def due(now: datetime, site: Path) -> list[Path]:
     return ready
 
 
+def scheduled(site: Path | None = None) -> list[dict]:
+    site = site or settings.SITE
+    return [{"post": path.stem, "at": str(when(path))} for path in sorted((site / "scheduled").glob("*.md"))]
+
+
 def publish_due(now: datetime | None = None, site: Path | None = None, run=subprocess.run) -> list[str]:
     now = now or datetime.now().astimezone()
     site = site or settings.SITE
diff --git a/errands/tools.py b/errands/tools.py
index 03ccc38..e85b535 100644
--- a/errands/tools.py
+++ b/errands/tools.py
@@ -2,7 +2,7 @@
 import json
 from typing import Callable
 
-from . import hosting, mail
+from . import hosting, mail, posts
 
 TOOLS: dict[str, Callable] = {}
 
@@ -30,6 +30,11 @@ def mail_send(to: str, subject: str, body: str) -> str:
     return mail.send(mail.compose(to, subject, body))
 
 
+@tool
+def posts_scheduled() -> list[dict]:
+    return posts.scheduled()
+
+
 @tool
 def hosting_balance() -> str:
     return f"{hosting.balance():.2f}"
diff --git a/tests/test_posts.py b/tests/test_posts.py
index 45e243f..1b338ee 100644
--- a/tests/test_posts.py
+++ b/tests/test_posts.py
@@ -43,6 +43,14 @@ class PublishTest(unittest.TestCase):
         now = datetime(2024, 11, 21, 12, 0, tzinfo=CENTRAL)
         self.assertEqual(posts.publish_due(now, self.site, self.record), ["test-post"])
 
+    def test_scheduled(self):
+        post(self.site, "test-post", "2024-11-20T09:00:00-06:00")
+        post(self.site, "draft", None)
+        self.assertEqual(
+            posts.scheduled(self.site),
+            [{"post": "draft", "at": "None"}, {"post": "test-post", "at": "2024-11-20 09:00:00-06:00"}],
+        )
+
     def test_no_date_never_goes_out(self):
         post(self.site, "draft", None)
         now = datetime(2030, 1, 1, tzinfo=CENTRAL)