From dc831b430be6c1effd4b0c7e5652cef43dd85f88 Mon Sep 17 00:00:00 2001 From: Clarth Date: Fri, 13 Nov 2026 20:26:05 -0500 Subject: [PATCH] Restructure project to flat layout and update run instructions Move modules from fluxer_admin_alerts/ to the repository root, switch to absolute imports, fix PROJECT_ROOT resolution, and update README commands and notifier paths. --- README.md | 14 ++++---------- fluxer_admin_alerts/__init__.py => __init__.py | 0 fluxer_admin_alerts/__main__.py => __main__.py | 4 ++-- fluxer_admin_alerts/config.py => config.py | 2 +- fluxer_admin_alerts/engine.py => engine.py | 4 ++-- fluxer_admin_alerts/fluxer_api.py => fluxer_api.py | 2 +- .../notifiers => notifiers}/__init__.py | 2 +- .../notifiers => notifiers}/base.py | 0 .../notifiers => notifiers}/fluxer.py | 0 fluxer_admin_alerts/runner.py => runner.py | 12 ++++++------ fluxer_admin_alerts/sources.py => sources.py | 4 ++-- fluxer_admin_alerts/state.py => state.py | 0 12 files changed, 19 insertions(+), 25 deletions(-) rename fluxer_admin_alerts/__init__.py => __init__.py (100%) rename fluxer_admin_alerts/__main__.py => __main__.py (93%) rename fluxer_admin_alerts/config.py => config.py (98%) rename fluxer_admin_alerts/engine.py => engine.py (97%) rename fluxer_admin_alerts/fluxer_api.py => fluxer_api.py (98%) rename {fluxer_admin_alerts/notifiers => notifiers}/__init__.py (94%) rename {fluxer_admin_alerts/notifiers => notifiers}/base.py (100%) rename {fluxer_admin_alerts/notifiers => notifiers}/fluxer.py (100%) rename fluxer_admin_alerts/runner.py => runner.py (91%) rename fluxer_admin_alerts/sources.py => sources.py (98%) rename fluxer_admin_alerts/state.py => state.py (100%) diff --git a/README.md b/README.md index f1e8f38..d0be837 100644 --- a/README.md +++ b/README.md @@ -40,12 +40,6 @@ cp config.example.toml config.toml Then edit `.env` and `config.toml` (see below). -To run the tests: - -```sh -python -m unittest discover -s tests -``` - ## Configure There are two config files. Both are ignored by git, so your values stay on your machine. @@ -89,13 +83,13 @@ Give the key only what it needs. Remove a source from `config.toml` and drop its Check what would be sent, without sending anything or saving state: ```sh -.venv/bin/python -m fluxer_admin_alerts --dry-run +.venv/bin/python __main__.py --dry-run ``` Run for real: ```sh -.venv/bin/python -m fluxer_admin_alerts +.venv/bin/python __main__.py ``` Use `-v` for debug logging. Exit code `0` means success, `1` means at least one source or notifier failed, and `2` means the config is wrong. @@ -105,7 +99,7 @@ Use `-v` for debug logging. Exit code `0` means success, `1` means at least one Edit your crontab with `crontab -e` and add a line to run every hour: ```cron -0 * * * * cd /path/to/fluxer-admin-alerts && .venv/bin/python -m fluxer_admin_alerts >> alerts.log 2>&1 +0 * * * * cd /path/to/fluxer-admin-alerts && .venv/bin/python __main__.py >> alerts.log 2>&1 ``` Replace `/path/to/fluxer-admin-alerts` with the folder you cloned into. `alerts.log` is ignored by git. @@ -120,7 +114,7 @@ Replace `/path/to/fluxer-admin-alerts` with the folder you cloned into. `alerts. ## Adding a notifier -Notifiers live in `fluxer_admin_alerts/notifiers/`. A notifier subclasses `Notifier`, implements `send(messages)`, raises `NotifierError` on failure, and is registered in `notifiers/__init__.py`. Then add its name to `KNOWN_NOTIFIERS` in `config.py` and read any settings it needs from `.env`. +Notifiers live in `notifiers/`. A notifier subclasses `Notifier`, implements `send(messages)`, raises `NotifierError` on failure, and is registered in `notifiers/__init__.py`. Then add its name to `KNOWN_NOTIFIERS` in `config.py` and read any settings it needs from `.env`. ## License diff --git a/fluxer_admin_alerts/__init__.py b/__init__.py similarity index 100% rename from fluxer_admin_alerts/__init__.py rename to __init__.py diff --git a/fluxer_admin_alerts/__main__.py b/__main__.py similarity index 93% rename from fluxer_admin_alerts/__main__.py rename to __main__.py index 63382b8..d74b004 100644 --- a/fluxer_admin_alerts/__main__.py +++ b/__main__.py @@ -5,8 +5,8 @@ import logging import sys from pathlib import Path -from .config import PROJECT_ROOT, ConfigError, load_settings -from .runner import run +from config import PROJECT_ROOT, ConfigError, load_settings +from runner import run def main(argv: list[str] | None = None) -> int: diff --git a/fluxer_admin_alerts/config.py b/config.py similarity index 98% rename from fluxer_admin_alerts/config.py rename to config.py index e086f09..348aac6 100644 --- a/fluxer_admin_alerts/config.py +++ b/config.py @@ -8,7 +8,7 @@ from pathlib import Path from dotenv import load_dotenv -PROJECT_ROOT = Path(__file__).resolve().parent.parent +PROJECT_ROOT = Path(__file__).resolve().parent KNOWN_NOTIFIERS = ("fluxer",) diff --git a/fluxer_admin_alerts/engine.py b/engine.py similarity index 97% rename from fluxer_admin_alerts/engine.py rename to engine.py index 31194d9..0b990c3 100644 --- a/fluxer_admin_alerts/engine.py +++ b/engine.py @@ -3,8 +3,8 @@ from __future__ import annotations from dataclasses import dataclass, field, replace from datetime import datetime, timedelta -from .sources import Item -from .state import AlertRecord +from sources import Item +from state import AlertRecord @dataclass(frozen=True) diff --git a/fluxer_admin_alerts/fluxer_api.py b/fluxer_api.py similarity index 98% rename from fluxer_admin_alerts/fluxer_api.py rename to fluxer_api.py index 52f5eb0..f08faf3 100644 --- a/fluxer_admin_alerts/fluxer_api.py +++ b/fluxer_api.py @@ -4,7 +4,7 @@ from typing import Any import requests -from . import __version__ +__version__ = "0.1.0" USER_AGENT = f"fluxer-admin-alerts/{__version__}" diff --git a/fluxer_admin_alerts/notifiers/__init__.py b/notifiers/__init__.py similarity index 94% rename from fluxer_admin_alerts/notifiers/__init__.py rename to notifiers/__init__.py index 72b8b61..e20cff9 100644 --- a/fluxer_admin_alerts/notifiers/__init__.py +++ b/notifiers/__init__.py @@ -1,6 +1,6 @@ from __future__ import annotations -from ..config import Settings +from config import Settings from .base import Message, Notifier, NotifierError from .fluxer import FluxerWebhookNotifier diff --git a/fluxer_admin_alerts/notifiers/base.py b/notifiers/base.py similarity index 100% rename from fluxer_admin_alerts/notifiers/base.py rename to notifiers/base.py diff --git a/fluxer_admin_alerts/notifiers/fluxer.py b/notifiers/fluxer.py similarity index 100% rename from fluxer_admin_alerts/notifiers/fluxer.py rename to notifiers/fluxer.py diff --git a/fluxer_admin_alerts/runner.py b/runner.py similarity index 91% rename from fluxer_admin_alerts/runner.py rename to runner.py index 3d515f3..6d72253 100644 --- a/fluxer_admin_alerts/runner.py +++ b/runner.py @@ -3,12 +3,12 @@ from __future__ import annotations import logging from datetime import datetime, timezone -from .config import Settings -from .engine import Notice, decide -from .fluxer_api import FluxerAPI, FluxerAPIError -from .notifiers import NotifierError, Message, build_notifiers -from .sources import SOURCES, Item -from .state import StateStore +from config import Settings +from engine import Notice, decide +from fluxer_api import FluxerAPI, FluxerAPIError +from notifiers import NotifierError, Message, build_notifiers +from sources import SOURCES, Item +from state import StateStore log = logging.getLogger(__name__) diff --git a/fluxer_admin_alerts/sources.py b/sources.py similarity index 98% rename from fluxer_admin_alerts/sources.py rename to sources.py index 7b0dc15..a58c84b 100644 --- a/fluxer_admin_alerts/sources.py +++ b/sources.py @@ -5,8 +5,8 @@ from dataclasses import dataclass from datetime import datetime, timedelta, timezone from typing import Any -from .config import SourceSettings -from .fluxer_api import FluxerAPI +from config import SourceSettings +from fluxer_api import FluxerAPI PAGE_SIZE = 200 MAX_PAGES = 50 diff --git a/fluxer_admin_alerts/state.py b/state.py similarity index 100% rename from fluxer_admin_alerts/state.py rename to state.py