From 619aa99e35d51e5e69f4dbac03c0c83df29a6e62 Mon Sep 17 00:00:00 2001 From: Kumi Date: Fri, 25 Aug 2023 07:37:43 +0200 Subject: [PATCH] Making trackbert a proper package Adding .gitlab-ci.yml --- .gitlab-ci.yml | 28 +++++++++++++++ README.md | 9 +++-- pyproject.toml | 32 ++++++++++++++++++ requirements.txt | 4 --- {classes => src/trackbert}/__init__.py | 0 trackbert.py => src/trackbert/__main__.py | 10 +++--- .../assets}/parcel-delivery-icon.txt | 0 .../assets}/parcel-delivery-icon.webp | Bin .../trackbert/classes}/__init__.py | 0 .../trackbert/classes}/database.py | 0 {classes => src/trackbert/classes}/tracker.py | 6 ++-- src/trackbert/trackers/__init__.py | 0 {trackers => src/trackbert/trackers}/base.py | 3 +- .../trackbert/trackers}/keydelivery.py | 5 ++- .../trackbert/trackers}/postat.py | 5 ++- 15 files changed, 81 insertions(+), 21 deletions(-) create mode 100644 .gitlab-ci.yml create mode 100644 pyproject.toml delete mode 100644 requirements.txt rename {classes => src/trackbert}/__init__.py (100%) rename trackbert.py => src/trackbert/__main__.py (95%) rename {assets => src/trackbert/assets}/parcel-delivery-icon.txt (100%) rename {assets => src/trackbert/assets}/parcel-delivery-icon.webp (100%) rename {trackers => src/trackbert/classes}/__init__.py (100%) rename {classes => src/trackbert/classes}/database.py (100%) rename {classes => src/trackbert/classes}/tracker.py (97%) create mode 100644 src/trackbert/trackers/__init__.py rename {trackers => src/trackbert/trackers}/base.py (93%) rename {trackers => src/trackbert/trackers}/keydelivery.py (92%) rename {trackers => src/trackbert/trackers}/postat.py (91%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..094719f --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,28 @@ +image: python:3.10 + +stages: +# - test + - publish + +before_script: + - python -V + - python -m venv venv + - source venv/bin/activate + - pip install -U pip + - pip install . +# - echo "[KeyDelivery]" > config.ini +# - echo "key = ${KEYDELIVERY_KEY}" >> config.ini +# - echo "secret = ${KEYDELIVERY_SECRET}" >> config.ini + +#test: +# stage: test +# script: python -m unittest test.py + +publish: + stage: publish + script: + - pip install -U hatchling twine build + - python -m build . + - python -m twine upload --username __token__ --password ${PYPI_TOKEN} dist/* + only: + - tags \ No newline at end of file diff --git a/README.md b/README.md index d9edc00..10b62e9 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,16 @@ # Trackbert -A simple Python script for tracking shipments through [KeyDelivery](https://kd100.com). +A simple Python script for tracking shipments, primarily through [KeyDelivery](https://kd100.com). If your system provides `notify-send`, you will get a desktop notification when the status of your shipment changes. Status information is stored in a SQLite database. +## Currently supported tracking providers + +- [KeyDelivery](https://kd100.com) (paid, provides tracking for most carriers) +- [Austrian Post](https://www.post.at) + ## Requirements The script was developed and tested on Arch Linux using Python 3.11. The "Never" type hint is used, so I suppose it will not work on older Python versions. It should work on any Linux distribution. You can technically run it on Windows and macOS as well, but you will not get desktop notifications. @@ -19,7 +24,7 @@ git clone https://kumig.it/kumitterer/trackbert.git cd trackbert python -m venv venv source venv/bin/activate -pip install -r requirements.txt +pip install . ``` Then copy `config.dist.ini` to `config.ini` and fill in your KeyDelivery API details, which you can find in your [KeyDelivery API management](https://app.kd100.com/api-management). You can find your API key in your KeyDelivery account settings. diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..159fc80 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,32 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "trackbert" +version = "0.1.0" +authors = [ + { name="Kumi Mitterer", email="trackbert@kumi.email" }, +] +description = "Python application tracking your shipments" +readme = "README.md" +license = { file="LICENSE" } +requires-python = ">=3.10" +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", +] +dependencies = [ + "pykeydelivery", + "postat", + "sqlalchemy", + "python-dateutil", +] + +[project.urls] +"Homepage" = "https://kumig.it/kumitterer/trackbert" +"Bug Tracker" = "https://kumig.it/kumitterer/trackbert/issues" + +[project.scripts] +trackbert = "trackbert.__main__:main" \ No newline at end of file diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index cd51db8..0000000 --- a/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -pykeydelivery -postat -sqlalchemy -python-dateutil \ No newline at end of file diff --git a/classes/__init__.py b/src/trackbert/__init__.py similarity index 100% rename from classes/__init__.py rename to src/trackbert/__init__.py diff --git a/trackbert.py b/src/trackbert/__main__.py similarity index 95% rename from trackbert.py rename to src/trackbert/__main__.py index 74b2f33..38513db 100644 --- a/trackbert.py +++ b/src/trackbert/__main__.py @@ -8,11 +8,10 @@ import logging import asyncio from typing import Tuple, Never, Optional -from classes.database import Database -from classes.tracker import Tracker +from .classes.database import Database +from .classes.tracker import Tracker - -if __name__ == "__main__": +def main(): parser = argparse.ArgumentParser() parser.add_argument("--tracking-number", "-n", type=str, required=False) parser.add_argument("--carrier", "-c", type=str, required=False) @@ -76,3 +75,6 @@ if __name__ == "__main__": tracker = Tracker() asyncio.run(tracker.start_async()) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/assets/parcel-delivery-icon.txt b/src/trackbert/assets/parcel-delivery-icon.txt similarity index 100% rename from assets/parcel-delivery-icon.txt rename to src/trackbert/assets/parcel-delivery-icon.txt diff --git a/assets/parcel-delivery-icon.webp b/src/trackbert/assets/parcel-delivery-icon.webp similarity index 100% rename from assets/parcel-delivery-icon.webp rename to src/trackbert/assets/parcel-delivery-icon.webp diff --git a/trackers/__init__.py b/src/trackbert/classes/__init__.py similarity index 100% rename from trackers/__init__.py rename to src/trackbert/classes/__init__.py diff --git a/classes/database.py b/src/trackbert/classes/database.py similarity index 100% rename from classes/database.py rename to src/trackbert/classes/database.py diff --git a/classes/tracker.py b/src/trackbert/classes/tracker.py similarity index 97% rename from classes/tracker.py rename to src/trackbert/classes/tracker.py index 39edd0f..c1ebb8c 100644 --- a/classes/tracker.py +++ b/src/trackbert/classes/tracker.py @@ -7,7 +7,7 @@ from pathlib import Path from typing import Optional, Tuple, Never from .database import Database -from trackers.base import BaseTracker +from ..trackers.base import BaseTracker from pykeydelivery import KeyDelivery @@ -36,14 +36,14 @@ class Tracker: logging.debug(f"Found API {api.stem}") - module = importlib.import_module(f"trackers.{api.stem}") + module = importlib.import_module(f"trackbert.trackers.{api.stem}") if "tracker" in module.__dict__: tracker = module.tracker logging.debug(f"Found tracker {api.stem}") try: - carriers = tracker.supported_carriers() api = tracker() + carriers = api.supported_carriers() for carrier, priority in carriers: self.apis.append((carrier, priority, api)) diff --git a/src/trackbert/trackers/__init__.py b/src/trackbert/trackers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/trackers/base.py b/src/trackbert/trackers/base.py similarity index 93% rename from trackers/base.py rename to src/trackbert/trackers/base.py index b99db1b..e48d1bb 100644 --- a/trackers/base.py +++ b/src/trackbert/trackers/base.py @@ -5,8 +5,7 @@ class BaseTracker: def get_status(self, tracking_number, carrier): raise NotImplementedError() - @staticmethod - def supported_carriers(): + def supported_carriers(self): """Defines the carriers supported by this tracker. Returns: diff --git a/trackers/keydelivery.py b/src/trackbert/trackers/keydelivery.py similarity index 92% rename from trackers/keydelivery.py rename to src/trackbert/trackers/keydelivery.py index 2233102..5588b8a 100644 --- a/trackers/keydelivery.py +++ b/src/trackbert/trackers/keydelivery.py @@ -1,5 +1,5 @@ from .base import BaseTracker -from classes.database import Event +from ..classes.database import Event from pykeydelivery import KeyDelivery as KeyDeliveryAPI @@ -34,8 +34,7 @@ class KeyDelivery(BaseTracker): raw_event=json.dumps(event), ) - @staticmethod - def supported_carriers(): + def supported_carriers(self): return [ ("*", 1), ] diff --git a/trackers/postat.py b/src/trackbert/trackers/postat.py similarity index 91% rename from trackers/postat.py rename to src/trackbert/trackers/postat.py index 6ac69f3..8fe104f 100644 --- a/trackers/postat.py +++ b/src/trackbert/trackers/postat.py @@ -1,5 +1,5 @@ from .base import BaseTracker -from classes.database import Event +from ..classes.database import Event import json @@ -28,8 +28,7 @@ class PostAT(BaseTracker): raw_event=json.dumps(event), ) - @staticmethod - def supported_carriers(): + def supported_carriers(self): return [ ("austrian_post", 100), ]