feat: add PostingStrategy ABC and PostResult dataclass
This commit is contained in:
parent
e158787b59
commit
2dd88285a2
6 changed files with 49 additions and 0 deletions
0
app/services/platforms/__init__.py
Normal file
0
app/services/platforms/__init__.py
Normal file
37
app/services/platforms/base.py
Normal file
37
app/services/platforms/base.py
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
from __future__ import annotations
|
||||
|
||||
from abc import ABC, abstractmethod
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
|
||||
@dataclass
|
||||
class PostResult:
|
||||
url: str
|
||||
metadata: dict | None = field(default=None)
|
||||
|
||||
|
||||
class PostingStrategy(ABC):
|
||||
"""Base class for all posting output types.
|
||||
|
||||
Subclasses must set class attribute `campaign_type` matching the value
|
||||
stored in campaigns.type.
|
||||
"""
|
||||
|
||||
campaign_type: str # e.g. "reddit_post", "reddit_comment", "blog_post"
|
||||
|
||||
@abstractmethod
|
||||
def execute(
|
||||
self,
|
||||
*,
|
||||
target: str,
|
||||
title: str,
|
||||
body: str,
|
||||
flair: str | None = None,
|
||||
extra: dict | None = None,
|
||||
) -> PostResult:
|
||||
"""Execute the post. Raise on failure. Return PostResult on success."""
|
||||
...
|
||||
|
||||
def supports_dupe_guard(self) -> bool:
|
||||
"""Return False to skip the weekly-dupe-guard check for this type."""
|
||||
return True
|
||||
0
tests/__init__.py
Normal file
0
tests/__init__.py
Normal file
0
tests/services/__init__.py
Normal file
0
tests/services/__init__.py
Normal file
0
tests/services/platforms/__init__.py
Normal file
0
tests/services/platforms/__init__.py
Normal file
12
tests/services/platforms/test_base.py
Normal file
12
tests/services/platforms/test_base.py
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
from app.services.platforms.base import PostResult
|
||||
|
||||
|
||||
def test_post_result_requires_url():
|
||||
r = PostResult(url="https://reddit.com/r/test/comments/abc")
|
||||
assert r.url == "https://reddit.com/r/test/comments/abc"
|
||||
assert r.metadata is None
|
||||
|
||||
|
||||
def test_post_result_accepts_metadata():
|
||||
r = PostResult(url="https://example.com", metadata={"id": "abc123"})
|
||||
assert r.metadata == {"id": "abc123"}
|
||||
Loading…
Reference in a new issue