From b48d53fa2ad85bb0522e34d4abbc4e71cdcf5e73 Mon Sep 17 00:00:00 2001 From: Evie Litherland-Smith Date: Sun, 26 May 2024 10:35:21 +0100 Subject: [PATCH] Add README content, add example/demo script Fix setting license in pyproject.toml correctly Point to main script in pyproject to run CLI --- README.md | 39 +++++++++++++++++++ pyproject.toml | 6 ++- src/nix_background_upgrade/main.py | 17 ++++++++ src/nix_background_upgrade/nix-snowflake.png | Bin 0 -> 13456 bytes src/nix_background_upgrade/notification.py | 16 ++++++++ 5 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 src/nix_background_upgrade/main.py create mode 100755 src/nix_background_upgrade/nix-snowflake.png create mode 100644 src/nix_background_upgrade/notification.py diff --git a/README.md b/README.md index e69de29..a2a0f4e 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,39 @@ +# Nix Background Upgrade +Upgrade NixOS system (and/or home-manager) in the background, with notification support. + +**Early stages of development, subject to change and likely not working at the current stage.** + +## Install +Clone the repository and install with pip (or preferred Python packaging system): + +```bash +git clone https://git.xenia.me.uk/pixelifytica/nix-background-upgrade.git +python3 -m pip install ./nix-background-upgrade +``` + +### For development +Project uses [Poetry](https://python-poetry.org/ "Poetry: Python packaging and dependency management tool") to manage dependencies. + +Install Poetry (see [documentation](https://python-poetry.org/docs/#installation) for more details), for example using `pipx`: + +```bash +pipx install poetry +``` + +Then install project using `poetry`: + +```bash +poetry install +``` + +Python code is formatted using [black](https://pypi.org/project/black/ "The uncompromising code formatter") and [isort](https://pypi.org/project/isort/ "A Python utility / library to sort Python imports"). + +#### `pre-commit` +[pre-commit](https://pre-commit.com/ "A framework for managing and maintaining multi-language pre-commit hooks") is used to ensure formatting of new/changed files. Install pre-commit hooks with: + +```bash +pre-commit install --install-hooks +``` + +### Nix Flake +Project provides a Nix `flake.nix` to get up and running quickly. diff --git a/pyproject.toml b/pyproject.toml index 325b1f6..5dfc48e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,9 +4,13 @@ version = "0.1.0" description = "Upgrade NixOS system (and/or home-manager) in the background, with notification support" authors = ["Evie Litherland-Smith "] readme = "README.md" -license = "LICENSE" +license = "MIT" +repository = "https://git.xenia.me.uk/pixelifytica/nix-background-upgrade" packages = [{include = "nix_background_upgrade", from = "src"}] +[tool.poetry.scripts] +nbu = 'nix_background_upgrade.main:main' + [tool.poetry.dependencies] python = "^3.9" notify-py = "^0.3.0" diff --git a/src/nix_background_upgrade/main.py b/src/nix_background_upgrade/main.py new file mode 100644 index 0000000..0ccf2e6 --- /dev/null +++ b/src/nix_background_upgrade/main.py @@ -0,0 +1,17 @@ +from .notification import create_notification + + +def main(*args, **kwargs) -> None: + """ + Sends a test notification to check everything is working + + :returns: None + """ + notification = create_notification() + notification.message = "This is a test notification" + notification.send() + return + + +if __name__ == "__main__": + main() diff --git a/src/nix_background_upgrade/nix-snowflake.png b/src/nix_background_upgrade/nix-snowflake.png new file mode 100755 index 0000000000000000000000000000000000000000..04a04bce885e1a6fa3deeb2000e0235681a4fd7b GIT binary patch literal 13456 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 Notify: + """ + Create notification class + + :returns: Notify class with custom defaults + """ + return Notify( + default_notification_title="Nix Background Update", + default_notification_message="Message from Nix process", + default_notification_icon=Path(__file__).parent / "./nix-snowflake.png", + )