From 4ff92075639d6a672fdab3ff7f06d29c4d514d9f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ga=C3=ABtan=20Blond?= <gaetan@blond.tf>
Date: Sun, 20 Feb 2022 21:25:39 +0100
Subject: [PATCH] Added base script

---
 notify-updates.py        | 104 +++++++++++++++++++++++++++++++++++++++
 updates_notifier/main.py |   0
 2 files changed, 104 insertions(+)
 create mode 100644 notify-updates.py
 delete mode 100644 updates_notifier/main.py

diff --git a/notify-updates.py b/notify-updates.py
new file mode 100644
index 0000000..acacdb3
--- /dev/null
+++ b/notify-updates.py
@@ -0,0 +1,104 @@
+#!/usr/bin/env python3
+
+import logging
+import sqlite3
+import sys
+from typing import IO, List
+
+import click
+import yaml
+
+from updates_notifier import EntriesDatabase, Entry
+from updates_notifier.fetchers import create_fetchers_from_dict
+from updates_notifier.fetchers.project_fetcher import ProjectFetcher
+
+logger = logging.getLogger("notify-updates")
+
+
+def _insert_entries(entries_db: EntriesDatabase, entries: List[Entry]) -> None:
+    with entries_db:
+        for entry in entries:
+            entries_db.insert(entry)
+
+
+def _get_new_updates(
+    entries_db: EntriesDatabase, fetchers: List[ProjectFetcher]
+) -> List[Entry]:
+    entries: List[Entry] = []
+    for fetcher in fetchers:
+        entries.extend(fetcher.fetch_entries())
+
+    return list(filter(lambda e: not entries_db.contains(e), entries))
+
+
+def _print_updates(entries: List[Entry]) -> None:
+    nb_updates = len(entries)
+    if nb_updates > 0:
+        logger.info("%s new updates detected.", nb_updates)
+    else:
+        logger.info("No new updates detected.")
+
+    for entry in entries:
+        logger.debug(
+            f"New update: id={entry.feed_id} name='{entry.name}' version='{entry.version}', url='{entry.url}'"
+        )
+
+
+@click.command()
+@click.option(
+    "--dry-run",
+    "-d",
+    is_flag=True,
+    default=False,
+    help="Search for new updates, but no db updates or notifications",
+)
+@click.option("--verbose", "-v", is_flag=True, help="Toggle debug output")
+@click.argument("feeds_cfg", type=click.File(mode="r"))
+@click.argument("db_path", type=click.Path(dir_okay=False))
+def main(feeds_cfg: IO[str], db_path: str, dry_run: str, verbose: bool) -> None:
+    """
+    FEEDS_CFG:  Path to the YAML file containing the feeds' parameters
+    DB_PATH: Path to the SQLite3 database file
+    """
+    if verbose:
+        logging_level = logging.DEBUG
+        logging.getLogger("urllib3").setLevel(logging.WARNING)
+    else:
+        logging_level = logging.INFO
+    logging.basicConfig(
+        format="%(asctime)s %(levelname)s:%(name)s:%(funcName)s:%(message)s",
+        level=logging_level,
+    )
+
+    try:
+        feeders_dict = yaml.safe_load(feeds_cfg)
+    except yaml.error.YAMLError as err:
+        logger.error("Could not parse YAML feeds configuration:%s", str(err))
+        sys.exit(1)
+
+    try:
+        entries_db = EntriesDatabase(db_path)
+    except sqlite3.Error as err:
+        logger.error(
+            "Could not load or create SQLite3 database at path %s: %s",
+            db_path,
+            str(err),
+        )
+        sys.exit(1)
+
+    try:
+        fetchers = create_fetchers_from_dict(feeders_dict)
+    except RuntimeError as err:
+        logger.error("Could not create fetchers:%s", str(err))
+        sys.exit(1)
+
+    entries = _get_new_updates(entries_db, fetchers)
+
+    _print_updates(entries)
+
+    if not dry_run:
+        _insert_entries(entries_db, entries)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/updates_notifier/main.py b/updates_notifier/main.py
deleted file mode 100644
index e69de29..0000000
-- 
GitLab