From caa3cf245186ab0f6fb33e63a7dd838d834da12e Mon Sep 17 00:00:00 2001 From: Pinapelz Date: Thu, 12 Mar 2026 13:56:30 -0700 Subject: refactor: move to common NewsSource interface cleanup imports by defining initaliazers modules and decorator remove legacy scrapers remove single factory for sega games (sites don't change that much) --- scrapers/__init__.py | 0 scrapers/base.py | 8 ++++++++ scrapers/registry.py | 22 ++++++++++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 scrapers/__init__.py create mode 100644 scrapers/base.py create mode 100644 scrapers/registry.py (limited to 'scrapers') diff --git a/scrapers/__init__.py b/scrapers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scrapers/base.py b/scrapers/base.py new file mode 100644 index 0000000..8d9839f --- /dev/null +++ b/scrapers/base.py @@ -0,0 +1,8 @@ +from abc import ABC, abstractmethod + + +class NewsSource(ABC): + + @abstractmethod + def fetch(self, version=None) -> list[dict]: + pass diff --git a/scrapers/registry.py b/scrapers/registry.py new file mode 100644 index 0000000..6d9bde6 --- /dev/null +++ b/scrapers/registry.py @@ -0,0 +1,22 @@ +from __future__ import annotations +from typing import Optional, TYPE_CHECKING + +if TYPE_CHECKING: + from scrapers.base import NewsSource + +_registry: dict[str, type["NewsSource"]] = {} + + +def register(url_key: str): + def decorator(cls): + _registry[url_key] = cls + return cls + return decorator + + +def get_source(url_key: str) -> Optional[type["NewsSource"]]: + return _registry.get(url_key) + + +def get_all() -> dict[str, type["NewsSource"]]: + return dict(_registry) -- cgit v1.2.3