From 56ac25827e5ee9dbda592e0c8d843bf6cee7b7e4 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Sun, 26 Jan 2025 11:21:20 +0100 Subject: [PATCH 01/16] Update plomlib (for Jinja autoescaping). --- plomlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plomlib b/plomlib index e7202fc..dee7c0f 160000 --- a/plomlib +++ b/plomlib @@ -1 +1 @@ -Subproject commit e7202fcfd78c6a60bd90da789a68c8ec4baf7b1a +Subproject commit dee7c0f6218e6bdd07b477dc5d9e4b5540ffcf4a -- 2.30.2 From 4ef493064365f7a4bfc84edc4c69f9c91b390a66 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Sat, 8 Feb 2025 20:32:41 +0100 Subject: [PATCH 02/16] Adapt to packaging/installation pattern established with ytplom. --- .gitmodules | 2 +- install.sh | 13 +++++++++++++ scripts/pre-commit | 5 +---- .pylintrc => src/.pylintrc | 0 {migrations => src/migrations}/0_init.sql | 0 .../migrations}/1_add_Todo_comment.sql | 0 .../migrations}/2_add_Todo_effort.sql | 0 .../3_add_Todo_and_Process_calendarize.sql | 0 ...4_create_Process_blockers_Todo_blockers.sql | 0 .../5_create_process_step_suppressions.sql | 0 .../6_add_Day_days_since_millennium.sql | 0 .../migrations}/7_redo_Day_id.sql | 0 {migrations => src/migrations}/init_7.sql | 0 plomlib => src/plomlib | 0 {plomtask => src/plomtask}/__init__.py | 0 {plomtask => src/plomtask}/conditions.py | 0 {plomtask => src/plomtask}/dating.py | 0 {plomtask => src/plomtask}/days.py | 0 {plomtask => src/plomtask}/db.py | 0 {plomtask => src/plomtask}/exceptions.py | 0 {plomtask => src/plomtask}/http.py | 0 {plomtask => src/plomtask}/misc.py | 0 {plomtask => src/plomtask}/processes.py | 0 {plomtask => src/plomtask}/todos.py | 0 .../plomtask}/versioned_attributes.py | 0 requirements.txt => src/requirements.txt | 0 run.py => src/run.py | 16 ++++++++++++---- {templates => src/templates}/_base.html | 0 {templates => src/templates}/_macros.html | 0 {templates => src/templates}/calendar.html | 0 {templates => src/templates}/calendar_txt.html | 0 {templates => src/templates}/condition.html | 0 .../templates}/condition_descriptions.html | 0 .../templates}/condition_titles.html | 0 {templates => src/templates}/conditions.html | 0 {templates => src/templates}/day.html | 0 {templates => src/templates}/msg.html | 0 {templates => src/templates}/process.html | 0 .../templates}/process_descriptions.html | 0 .../templates}/process_efforts.html | 0 .../templates}/process_titles.html | 0 {templates => src/templates}/processes.html | 0 {templates => src/templates}/todo.html | 0 {templates => src/templates}/todos.html | 0 {tests => src/tests}/__init__.py | 0 {tests => src/tests}/conditions.py | 0 {tests => src/tests}/days.py | 0 {tests => src/tests}/misc.py | 0 {tests => src/tests}/processes.py | 0 {tests => src/tests}/todos.py | 0 {tests => src/tests}/utils.py | 0 taskplom | 18 ++++++++++++++++++ 52 files changed, 45 insertions(+), 9 deletions(-) create mode 100755 install.sh rename .pylintrc => src/.pylintrc (100%) rename {migrations => src/migrations}/0_init.sql (100%) rename {migrations => src/migrations}/1_add_Todo_comment.sql (100%) rename {migrations => src/migrations}/2_add_Todo_effort.sql (100%) rename {migrations => src/migrations}/3_add_Todo_and_Process_calendarize.sql (100%) rename {migrations => src/migrations}/4_create_Process_blockers_Todo_blockers.sql (100%) rename {migrations => src/migrations}/5_create_process_step_suppressions.sql (100%) rename {migrations => src/migrations}/6_add_Day_days_since_millennium.sql (100%) rename {migrations => src/migrations}/7_redo_Day_id.sql (100%) rename {migrations => src/migrations}/init_7.sql (100%) rename plomlib => src/plomlib (100%) rename {plomtask => src/plomtask}/__init__.py (100%) rename {plomtask => src/plomtask}/conditions.py (100%) rename {plomtask => src/plomtask}/dating.py (100%) rename {plomtask => src/plomtask}/days.py (100%) rename {plomtask => src/plomtask}/db.py (100%) rename {plomtask => src/plomtask}/exceptions.py (100%) rename {plomtask => src/plomtask}/http.py (100%) rename {plomtask => src/plomtask}/misc.py (100%) rename {plomtask => src/plomtask}/processes.py (100%) rename {plomtask => src/plomtask}/todos.py (100%) rename {plomtask => src/plomtask}/versioned_attributes.py (100%) rename requirements.txt => src/requirements.txt (100%) rename run.py => src/run.py (81%) rename {templates => src/templates}/_base.html (100%) rename {templates => src/templates}/_macros.html (100%) rename {templates => src/templates}/calendar.html (100%) rename {templates => src/templates}/calendar_txt.html (100%) rename {templates => src/templates}/condition.html (100%) rename {templates => src/templates}/condition_descriptions.html (100%) rename {templates => src/templates}/condition_titles.html (100%) rename {templates => src/templates}/conditions.html (100%) rename {templates => src/templates}/day.html (100%) rename {templates => src/templates}/msg.html (100%) rename {templates => src/templates}/process.html (100%) rename {templates => src/templates}/process_descriptions.html (100%) rename {templates => src/templates}/process_efforts.html (100%) rename {templates => src/templates}/process_titles.html (100%) rename {templates => src/templates}/processes.html (100%) rename {templates => src/templates}/todo.html (100%) rename {templates => src/templates}/todos.html (100%) rename {tests => src/tests}/__init__.py (100%) rename {tests => src/tests}/conditions.py (100%) rename {tests => src/tests}/days.py (100%) rename {tests => src/tests}/misc.py (100%) rename {tests => src/tests}/processes.py (100%) rename {tests => src/tests}/todos.py (100%) rename {tests => src/tests}/utils.py (100%) create mode 100755 taskplom diff --git a/.gitmodules b/.gitmodules index 42cf7f3..4c97e95 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "plomlib"] - path = plomlib + path = src/plomlib url = https://plomlompom.com/repos/clone/plomlib diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..a28e15f --- /dev/null +++ b/install.sh @@ -0,0 +1,13 @@ +#!/usr/bin/sh +set -e + +PATH_APP_SHARE=~/.local/share/taskplom +PATH_LOCAL_BIN=~/.local/bin +NAME_EXECUTABLE=taskplom + +mkdir -p "${PATH_APP_SHARE}" "${PATH_LOCAL_BIN}" + +cp -r ./src/* "${PATH_APP_SHARE}/" +cp "${NAME_EXECUTABLE}" "${PATH_LOCAL_BIN}/" + +echo "Installed executable to ${PATH_LOCAL_BIN}/${NAME_EXECUTABLE}, app files to ${PATH_APP_SHARE}." diff --git a/scripts/pre-commit b/scripts/pre-commit index 0dd4d45..21ad816 100755 --- a/scripts/pre-commit +++ b/scripts/pre-commit @@ -1,5 +1,5 @@ #!/bin/sh -set -e +cd src for dir in $(echo '.' 'plomtask' 'tests'); do echo "Running mypy on ${dir}/ …." python3 -m mypy ${dir}/*.py @@ -10,7 +10,4 @@ for dir in $(echo '.' 'plomtask' 'tests'); do done echo "Running unittest-parallel on tests/." unittest-parallel -t . -s tests/ -p '*.py' -set +e rm test_db:* -set -e -exit 0 diff --git a/.pylintrc b/src/.pylintrc similarity index 100% rename from .pylintrc rename to src/.pylintrc diff --git a/migrations/0_init.sql b/src/migrations/0_init.sql similarity index 100% rename from migrations/0_init.sql rename to src/migrations/0_init.sql diff --git a/migrations/1_add_Todo_comment.sql b/src/migrations/1_add_Todo_comment.sql similarity index 100% rename from migrations/1_add_Todo_comment.sql rename to src/migrations/1_add_Todo_comment.sql diff --git a/migrations/2_add_Todo_effort.sql b/src/migrations/2_add_Todo_effort.sql similarity index 100% rename from migrations/2_add_Todo_effort.sql rename to src/migrations/2_add_Todo_effort.sql diff --git a/migrations/3_add_Todo_and_Process_calendarize.sql b/src/migrations/3_add_Todo_and_Process_calendarize.sql similarity index 100% rename from migrations/3_add_Todo_and_Process_calendarize.sql rename to src/migrations/3_add_Todo_and_Process_calendarize.sql diff --git a/migrations/4_create_Process_blockers_Todo_blockers.sql b/src/migrations/4_create_Process_blockers_Todo_blockers.sql similarity index 100% rename from migrations/4_create_Process_blockers_Todo_blockers.sql rename to src/migrations/4_create_Process_blockers_Todo_blockers.sql diff --git a/migrations/5_create_process_step_suppressions.sql b/src/migrations/5_create_process_step_suppressions.sql similarity index 100% rename from migrations/5_create_process_step_suppressions.sql rename to src/migrations/5_create_process_step_suppressions.sql diff --git a/migrations/6_add_Day_days_since_millennium.sql b/src/migrations/6_add_Day_days_since_millennium.sql similarity index 100% rename from migrations/6_add_Day_days_since_millennium.sql rename to src/migrations/6_add_Day_days_since_millennium.sql diff --git a/migrations/7_redo_Day_id.sql b/src/migrations/7_redo_Day_id.sql similarity index 100% rename from migrations/7_redo_Day_id.sql rename to src/migrations/7_redo_Day_id.sql diff --git a/migrations/init_7.sql b/src/migrations/init_7.sql similarity index 100% rename from migrations/init_7.sql rename to src/migrations/init_7.sql diff --git a/plomlib b/src/plomlib similarity index 100% rename from plomlib rename to src/plomlib diff --git a/plomtask/__init__.py b/src/plomtask/__init__.py similarity index 100% rename from plomtask/__init__.py rename to src/plomtask/__init__.py diff --git a/plomtask/conditions.py b/src/plomtask/conditions.py similarity index 100% rename from plomtask/conditions.py rename to src/plomtask/conditions.py diff --git a/plomtask/dating.py b/src/plomtask/dating.py similarity index 100% rename from plomtask/dating.py rename to src/plomtask/dating.py diff --git a/plomtask/days.py b/src/plomtask/days.py similarity index 100% rename from plomtask/days.py rename to src/plomtask/days.py diff --git a/plomtask/db.py b/src/plomtask/db.py similarity index 100% rename from plomtask/db.py rename to src/plomtask/db.py diff --git a/plomtask/exceptions.py b/src/plomtask/exceptions.py similarity index 100% rename from plomtask/exceptions.py rename to src/plomtask/exceptions.py diff --git a/plomtask/http.py b/src/plomtask/http.py similarity index 100% rename from plomtask/http.py rename to src/plomtask/http.py diff --git a/plomtask/misc.py b/src/plomtask/misc.py similarity index 100% rename from plomtask/misc.py rename to src/plomtask/misc.py diff --git a/plomtask/processes.py b/src/plomtask/processes.py similarity index 100% rename from plomtask/processes.py rename to src/plomtask/processes.py diff --git a/plomtask/todos.py b/src/plomtask/todos.py similarity index 100% rename from plomtask/todos.py rename to src/plomtask/todos.py diff --git a/plomtask/versioned_attributes.py b/src/plomtask/versioned_attributes.py similarity index 100% rename from plomtask/versioned_attributes.py rename to src/plomtask/versioned_attributes.py diff --git a/requirements.txt b/src/requirements.txt similarity index 100% rename from requirements.txt rename to src/requirements.txt diff --git a/run.py b/src/run.py similarity index 81% rename from run.py rename to src/run.py index 0d50d25..3e45ad8 100755 --- a/run.py +++ b/src/run.py @@ -1,12 +1,20 @@ #!/usr/bin/env python3 """Call this to start the application.""" + +# included libs from sys import exit as sys_exit from os import environ from pathlib import Path -from plomtask.exceptions import HandledException -from plomtask.http import TaskHandler, TaskServer -from plomtask.db import DatabaseFile -from plomlib.db import PlomDbException +# might need module installation(s) +try: + from plomtask.exceptions import HandledException + from plomtask.http import TaskHandler, TaskServer + from plomtask.db import DatabaseFile + from plomlib.db import PlomDbException +except ModuleNotFoundError as e: + print('FAIL: Missing module(s), please run with "install_deps" argument.') + print(e) + sys_exit(1) PLOMTASK_DB_PATH = environ.get('PLOMTASK_DB_PATH') HTTP_PORT = 8082 diff --git a/templates/_base.html b/src/templates/_base.html similarity index 100% rename from templates/_base.html rename to src/templates/_base.html diff --git a/templates/_macros.html b/src/templates/_macros.html similarity index 100% rename from templates/_macros.html rename to src/templates/_macros.html diff --git a/templates/calendar.html b/src/templates/calendar.html similarity index 100% rename from templates/calendar.html rename to src/templates/calendar.html diff --git a/templates/calendar_txt.html b/src/templates/calendar_txt.html similarity index 100% rename from templates/calendar_txt.html rename to src/templates/calendar_txt.html diff --git a/templates/condition.html b/src/templates/condition.html similarity index 100% rename from templates/condition.html rename to src/templates/condition.html diff --git a/templates/condition_descriptions.html b/src/templates/condition_descriptions.html similarity index 100% rename from templates/condition_descriptions.html rename to src/templates/condition_descriptions.html diff --git a/templates/condition_titles.html b/src/templates/condition_titles.html similarity index 100% rename from templates/condition_titles.html rename to src/templates/condition_titles.html diff --git a/templates/conditions.html b/src/templates/conditions.html similarity index 100% rename from templates/conditions.html rename to src/templates/conditions.html diff --git a/templates/day.html b/src/templates/day.html similarity index 100% rename from templates/day.html rename to src/templates/day.html diff --git a/templates/msg.html b/src/templates/msg.html similarity index 100% rename from templates/msg.html rename to src/templates/msg.html diff --git a/templates/process.html b/src/templates/process.html similarity index 100% rename from templates/process.html rename to src/templates/process.html diff --git a/templates/process_descriptions.html b/src/templates/process_descriptions.html similarity index 100% rename from templates/process_descriptions.html rename to src/templates/process_descriptions.html diff --git a/templates/process_efforts.html b/src/templates/process_efforts.html similarity index 100% rename from templates/process_efforts.html rename to src/templates/process_efforts.html diff --git a/templates/process_titles.html b/src/templates/process_titles.html similarity index 100% rename from templates/process_titles.html rename to src/templates/process_titles.html diff --git a/templates/processes.html b/src/templates/processes.html similarity index 100% rename from templates/processes.html rename to src/templates/processes.html diff --git a/templates/todo.html b/src/templates/todo.html similarity index 100% rename from templates/todo.html rename to src/templates/todo.html diff --git a/templates/todos.html b/src/templates/todos.html similarity index 100% rename from templates/todos.html rename to src/templates/todos.html diff --git a/tests/__init__.py b/src/tests/__init__.py similarity index 100% rename from tests/__init__.py rename to src/tests/__init__.py diff --git a/tests/conditions.py b/src/tests/conditions.py similarity index 100% rename from tests/conditions.py rename to src/tests/conditions.py diff --git a/tests/days.py b/src/tests/days.py similarity index 100% rename from tests/days.py rename to src/tests/days.py diff --git a/tests/misc.py b/src/tests/misc.py similarity index 100% rename from tests/misc.py rename to src/tests/misc.py diff --git a/tests/processes.py b/src/tests/processes.py similarity index 100% rename from tests/processes.py rename to src/tests/processes.py diff --git a/tests/todos.py b/src/tests/todos.py similarity index 100% rename from tests/todos.py rename to src/tests/todos.py diff --git a/tests/utils.py b/src/tests/utils.py similarity index 100% rename from tests/utils.py rename to src/tests/utils.py diff --git a/taskplom b/taskplom new file mode 100755 index 0000000..4bc1be6 --- /dev/null +++ b/taskplom @@ -0,0 +1,18 @@ +#!/usr/bin/sh +set -e + +PATH_APP_SHARE=~/.local/share/taskplom +PATH_VENV="${PATH_APP_SHARE}/venv" + +python3 -m venv "${PATH_VENV}" +. "${PATH_VENV}/bin/activate" + +if [ "$1" = "install_deps" ]; then + echo "Checking dependencies." + pip3 install -r "${PATH_APP_SHARE}/requirements.txt" + exit 0 +fi + +export PYTHONPATH="${PATH_APP_SHARE}:${PYTHONPATH}" +cd "${PATH_APP_SHARE}" +./run.py $@ -- 2.30.2 From 1e7129b4d10d40651536e9ea6fadf65e8b7e3164 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Mon, 10 Feb 2025 13:55:11 +0100 Subject: [PATCH 03/16] Use /tmp/ for test db files. --- src/tests/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tests/utils.py b/src/tests/utils.py index 4882ab3..a321806 100644 --- a/src/tests/utils.py +++ b/src/tests/utils.py @@ -13,6 +13,7 @@ from urllib.parse import urlencode from uuid import uuid4 from os import remove as remove_file from pprint import pprint +from tempfile import gettempdir from plomtask.db import DatabaseFile, DatabaseConnection from plomtask.http import TaskHandler, TaskServer from plomtask.processes import Process, ProcessStep @@ -196,7 +197,7 @@ class TestCaseWithDB(TestCaseAugmented): Process.empty_cache() ProcessStep.empty_cache() Todo.empty_cache() - db_path = Path(f'test_db:{uuid4()}') + db_path = Path(gettempdir()).joinpath(f'test_db:{uuid4()}') DatabaseFile.create(db_path) self.db_file = DatabaseFile(db_path) self.db_conn = DatabaseConnection(self.db_file) -- 2.30.2 From 16b22d8892b742c7d3ede39f5b47c5ae7abf4023 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Mon, 10 Feb 2025 14:57:18 +0100 Subject: [PATCH 04/16] Move tests directory out of src/. --- .mypy.ini | 2 ++ src/.pylintrc => .pylintrc | 2 +- scripts/pre-commit | 16 +++++------ {src/tests => tests}/__init__.py | 0 {src/tests => tests}/conditions.py | 0 {src/tests => tests}/days.py | 0 {src/tests => tests}/misc.py | 0 {src/tests => tests}/processes.py | 0 {src/tests => tests}/todos.py | 0 {src/tests => tests}/utils.py | 45 ++++++++++++++++++++---------- 10 files changed, 40 insertions(+), 25 deletions(-) create mode 100644 .mypy.ini rename src/.pylintrc => .pylintrc (55%) rename {src/tests => tests}/__init__.py (100%) rename {src/tests => tests}/conditions.py (100%) rename {src/tests => tests}/days.py (100%) rename {src/tests => tests}/misc.py (100%) rename {src/tests => tests}/processes.py (100%) rename {src/tests => tests}/todos.py (100%) rename {src/tests => tests}/utils.py (97%) diff --git a/.mypy.ini b/.mypy.ini new file mode 100644 index 0000000..e4f7658 --- /dev/null +++ b/.mypy.ini @@ -0,0 +1,2 @@ +[mypy] +mypy_path = $MYPY_CONFIG_FILE_DIR/src diff --git a/src/.pylintrc b/.pylintrc similarity index 55% rename from src/.pylintrc rename to .pylintrc index 50133a0..45bc14d 100644 --- a/src/.pylintrc +++ b/.pylintrc @@ -1,3 +1,3 @@ [BASIC] -init-hook='import sys; sys.path.append(".")' +init-hook='import sys; sys.path[0:0] = ["src"]' good-names-rgxs=(.*_)?(GET|POST)(_.+)?,,test_[A-Z]+ diff --git a/scripts/pre-commit b/scripts/pre-commit index 21ad816..414cb51 100755 --- a/scripts/pre-commit +++ b/scripts/pre-commit @@ -1,13 +1,11 @@ #!/bin/sh -cd src -for dir in $(echo '.' 'plomtask' 'tests'); do - echo "Running mypy on ${dir}/ …." - python3 -m mypy ${dir}/*.py - echo "Running flake8 on ${dir}/ …" - python3 -m flake8 ${dir}/*.py - echo "Running pylint on ${dir}/ …" - python3 -m pylint ${dir}/*.py +DIRS='src src/plomtask tests' +TOOLS='flake8 pylint mypy' +for dir in $DIRS; do + for tool in $TOOLS; do + echo "Running ${tool} on ${dir}/ …." + python3 -m ${tool} ${dir}/*.py + done done echo "Running unittest-parallel on tests/." unittest-parallel -t . -s tests/ -p '*.py' -rm test_db:* diff --git a/src/tests/__init__.py b/tests/__init__.py similarity index 100% rename from src/tests/__init__.py rename to tests/__init__.py diff --git a/src/tests/conditions.py b/tests/conditions.py similarity index 100% rename from src/tests/conditions.py rename to tests/conditions.py diff --git a/src/tests/days.py b/tests/days.py similarity index 100% rename from src/tests/days.py rename to tests/days.py diff --git a/src/tests/misc.py b/tests/misc.py similarity index 100% rename from src/tests/misc.py rename to tests/misc.py diff --git a/src/tests/processes.py b/tests/processes.py similarity index 100% rename from src/tests/processes.py rename to tests/processes.py diff --git a/src/tests/todos.py b/tests/todos.py similarity index 100% rename from src/tests/todos.py rename to tests/todos.py diff --git a/src/tests/utils.py b/tests/utils.py similarity index 97% rename from src/tests/utils.py rename to tests/utils.py index a321806..071ad1f 100644 --- a/src/tests/utils.py +++ b/tests/utils.py @@ -1,27 +1,42 @@ """Shared test utilities.""" # pylint: disable=too-many-lines + +# included from __future__ import annotations from datetime import datetime, date as dt_date, timedelta -from unittest import TestCase -from typing import Mapping, Any, Callable -from threading import Thread -from pathlib import Path from http.client import HTTPConnection -from time import sleep from json import loads as json_loads, dumps as json_dumps -from urllib.parse import urlencode -from uuid import uuid4 from os import remove as remove_file +from pathlib import Path from pprint import pprint +from sys import path as sys_path from tempfile import gettempdir -from plomtask.db import DatabaseFile, DatabaseConnection -from plomtask.http import TaskHandler, TaskServer -from plomtask.processes import Process, ProcessStep -from plomtask.conditions import Condition -from plomtask.days import Day -from plomtask.todos import Todo -from plomtask.versioned_attributes import VersionedAttribute, TIMESTAMP_FMT -from plomtask.exceptions import NotFoundException, HandledException +from threading import Thread +from time import sleep +from typing import Mapping, Any, Callable +from unittest import TestCase +from urllib.parse import urlencode +from uuid import uuid4 + +# ourselves; since we're outside repo's ./src, tell Python to look in there +NAME_SRC_DIR = 'src' +sys_path[0:0] = [NAME_SRC_DIR] +# pylint: disable=wrong-import-position +from plomtask.db import DatabaseFile, DatabaseConnection # noqa: E402 +from plomtask.http import TaskHandler, TaskServer # noqa: E402 +from plomtask.processes import Process, ProcessStep # noqa: E402 +from plomtask.conditions import Condition # noqa: E402 +from plomtask.days import Day # noqa: E402 +from plomtask.todos import Todo # noqa: E402 +from plomtask.versioned_attributes import ( # noqa: E402 + VersionedAttribute, TIMESTAMP_FMT) +from plomtask.exceptions import ( # noqa: E402 + NotFoundException, HandledException) + + +# to look for schema file in ./src/migrations rather than ./migrations +DatabaseFile.path_schema = Path(NAME_SRC_DIR + ).joinpath(DatabaseFile.path_schema) _VERSIONED_VALS: dict[str, -- 2.30.2 From 6ca3f8fe5def2bad613da4fdfcf3e770420dc2a7 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Mon, 10 Feb 2025 16:21:21 +0100 Subject: [PATCH 05/16] Replace direct cloning of submodule into src/ by specific links into it. --- .gitmodules | 2 +- install.sh | 2 +- src/plomlib => plomlib | 0 src/plomlib/db.py | 1 + src/plomlib/web.py | 1 + 5 files changed, 4 insertions(+), 2 deletions(-) rename src/plomlib => plomlib (100%) create mode 120000 src/plomlib/db.py create mode 120000 src/plomlib/web.py diff --git a/.gitmodules b/.gitmodules index 4c97e95..42cf7f3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "plomlib"] - path = src/plomlib + path = plomlib url = https://plomlompom.com/repos/clone/plomlib diff --git a/install.sh b/install.sh index a28e15f..babdd30 100755 --- a/install.sh +++ b/install.sh @@ -7,7 +7,7 @@ NAME_EXECUTABLE=taskplom mkdir -p "${PATH_APP_SHARE}" "${PATH_LOCAL_BIN}" -cp -r ./src/* "${PATH_APP_SHARE}/" +cp -rL ./src/* "${PATH_APP_SHARE}/" cp "${NAME_EXECUTABLE}" "${PATH_LOCAL_BIN}/" echo "Installed executable to ${PATH_LOCAL_BIN}/${NAME_EXECUTABLE}, app files to ${PATH_APP_SHARE}." diff --git a/src/plomlib b/plomlib similarity index 100% rename from src/plomlib rename to plomlib diff --git a/src/plomlib/db.py b/src/plomlib/db.py new file mode 120000 index 0000000..45c41b7 --- /dev/null +++ b/src/plomlib/db.py @@ -0,0 +1 @@ +../../plomlib/db.py \ No newline at end of file diff --git a/src/plomlib/web.py b/src/plomlib/web.py new file mode 120000 index 0000000..d0c30d8 --- /dev/null +++ b/src/plomlib/web.py @@ -0,0 +1 @@ +../../plomlib/web.py \ No newline at end of file -- 2.30.2 From c0830e1b1e3f4a610e95ea97478e62c94996a943 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Mon, 10 Feb 2025 16:22:26 +0100 Subject: [PATCH 06/16] Disallow commit without at least passing unit tests. --- scripts/pre-commit | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/pre-commit b/scripts/pre-commit index 414cb51..532f2dd 100755 --- a/scripts/pre-commit +++ b/scripts/pre-commit @@ -8,4 +8,5 @@ for dir in $DIRS; do done done echo "Running unittest-parallel on tests/." +set -e unittest-parallel -t . -s tests/ -p '*.py' -- 2.30.2 From daaa76a70f2680bfcab47f2cda2b085239864daa Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Mon, 10 Feb 2025 16:31:05 +0100 Subject: [PATCH 07/16] Adapt plomlib links to its new directory structure. --- plomlib | 2 +- src/plomlib/db.py | 2 +- src/plomlib/web.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plomlib b/plomlib index dee7c0f..0b4baee 160000 --- a/plomlib +++ b/plomlib @@ -1 +1 @@ -Subproject commit dee7c0f6218e6bdd07b477dc5d9e4b5540ffcf4a +Subproject commit 0b4baee83e05737b24360e395393a87658feeee2 diff --git a/src/plomlib/db.py b/src/plomlib/db.py index 45c41b7..4846071 120000 --- a/src/plomlib/db.py +++ b/src/plomlib/db.py @@ -1 +1 @@ -../../plomlib/db.py \ No newline at end of file +../../plomlib/py/db.py \ No newline at end of file diff --git a/src/plomlib/web.py b/src/plomlib/web.py index d0c30d8..ed1ec7a 120000 --- a/src/plomlib/web.py +++ b/src/plomlib/web.py @@ -1 +1 @@ -../../plomlib/web.py \ No newline at end of file +../../plomlib/py/web.py \ No newline at end of file -- 2.30.2 From f2a1a5eafe2191ccdb8b4c64589f5fa7210a6bc5 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Mon, 10 Feb 2025 16:59:38 +0100 Subject: [PATCH 08/16] Outsource install and startup code to plomlib. --- install.sh | 13 +------------ plomlib | 2 +- taskplom | 18 ------------------ 3 files changed, 2 insertions(+), 31 deletions(-) delete mode 100755 taskplom diff --git a/install.sh b/install.sh index babdd30..fefb821 100755 --- a/install.sh +++ b/install.sh @@ -1,13 +1,2 @@ #!/usr/bin/sh -set -e - -PATH_APP_SHARE=~/.local/share/taskplom -PATH_LOCAL_BIN=~/.local/bin -NAME_EXECUTABLE=taskplom - -mkdir -p "${PATH_APP_SHARE}" "${PATH_LOCAL_BIN}" - -cp -rL ./src/* "${PATH_APP_SHARE}/" -cp "${NAME_EXECUTABLE}" "${PATH_LOCAL_BIN}/" - -echo "Installed executable to ${PATH_LOCAL_BIN}/${NAME_EXECUTABLE}, app files to ${PATH_APP_SHARE}." +./plomlib/sh/install.sh taskplom diff --git a/plomlib b/plomlib index 0b4baee..0bf9480 160000 --- a/plomlib +++ b/plomlib @@ -1 +1 @@ -Subproject commit 0b4baee83e05737b24360e395393a87658feeee2 +Subproject commit 0bf94804e718fb4d41995dbfe9c6dc3315d366f2 diff --git a/taskplom b/taskplom deleted file mode 100755 index 4bc1be6..0000000 --- a/taskplom +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/sh -set -e - -PATH_APP_SHARE=~/.local/share/taskplom -PATH_VENV="${PATH_APP_SHARE}/venv" - -python3 -m venv "${PATH_VENV}" -. "${PATH_VENV}/bin/activate" - -if [ "$1" = "install_deps" ]; then - echo "Checking dependencies." - pip3 install -r "${PATH_APP_SHARE}/requirements.txt" - exit 0 -fi - -export PYTHONPATH="${PATH_APP_SHARE}:${PYTHONPATH}" -cd "${PATH_APP_SHARE}" -./run.py $@ -- 2.30.2 From 653f9f84f9e4db55ee99a3d86a0f7e1aa21f23e0 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Mon, 10 Feb 2025 17:05:04 +0100 Subject: [PATCH 09/16] Retrieve bugfixing plomlib commit. --- plomlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plomlib b/plomlib index 0bf9480..922a559 160000 --- a/plomlib +++ b/plomlib @@ -1 +1 @@ -Subproject commit 0bf94804e718fb4d41995dbfe9c6dc3315d366f2 +Subproject commit 922a5599778859f950c78b516d8bdb478830ebe9 -- 2.30.2 From 8b561c230dbd5bf248878308f98ecefc210b25a1 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Mon, 10 Feb 2025 21:35:00 +0100 Subject: [PATCH 10/16] Improve ModuleNotFoundError message. --- src/run.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/run.py b/src/run.py index 3e45ad8..6958bb3 100755 --- a/src/run.py +++ b/src/run.py @@ -1,21 +1,21 @@ #!/usr/bin/env python3 -"""Call this to start the application.""" +"""Task/todo manager.""" -# included libs -from sys import exit as sys_exit +# standard libs from os import environ from pathlib import Path -# might need module installation(s) +from sys import exit as sys_exit +# non-standard libs try: + from plomlib.db import PlomDbException from plomtask.exceptions import HandledException from plomtask.http import TaskHandler, TaskServer from plomtask.db import DatabaseFile - from plomlib.db import PlomDbException except ModuleNotFoundError as e: - print('FAIL: Missing module(s), please run with "install_deps" argument.') - print(e) + print(f"Missing dependency: {e}. Please run with 'install_deps' argument.") sys_exit(1) + PLOMTASK_DB_PATH = environ.get('PLOMTASK_DB_PATH') HTTP_PORT = 8082 DB_CREATION_ASK = 'Database file not found. Create? Y/n\n' -- 2.30.2 From 3fc74baf5f49d4af1313211985f2c8487296554c Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Tue, 18 Feb 2025 12:28:02 +0100 Subject: [PATCH 11/16] Update plomlib. --- plomlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plomlib b/plomlib index 922a559..f2dc66a 160000 --- a/plomlib +++ b/plomlib @@ -1 +1 @@ -Subproject commit 922a5599778859f950c78b516d8bdb478830ebe9 +Subproject commit f2dc66a2d4f1e8823246d1621b424e44ec423897 -- 2.30.2 From b451b68475a6ea8c8bd9140b36cc734a9425d1d7 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Tue, 18 Feb 2025 13:34:36 +0100 Subject: [PATCH 12/16] Adapt to plomlib update. --- src/plomtask/db.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plomtask/db.py b/src/plomtask/db.py index cc138ad..113a95b 100644 --- a/src/plomtask/db.py +++ b/src/plomtask/db.py @@ -80,6 +80,7 @@ class DatabaseFile(PlomDbFile): class DatabaseConnection(PlomDbConn): """A single connection to the database.""" + db_file_class = DatabaseFile def close(self) -> None: """Shortcut to sqlite3.Connection.close().""" -- 2.30.2 From 0be448a0021323fb47734b1c1be27da1ec854e49 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Thu, 13 Mar 2025 14:47:22 +0100 Subject: [PATCH 13/16] Finish plomtask to taskplom renaming internally. --- scripts/pre-commit | 2 +- src/run.py | 6 +++--- src/{plomtask => taskplom}/__init__.py | 0 src/{plomtask => taskplom}/conditions.py | 6 +++--- src/{plomtask => taskplom}/dating.py | 2 +- src/{plomtask => taskplom}/days.py | 6 +++--- src/{plomtask => taskplom}/db.py | 2 +- src/{plomtask => taskplom}/exceptions.py | 0 src/{plomtask => taskplom}/http.py | 16 ++++++++-------- src/{plomtask => taskplom}/misc.py | 0 src/{plomtask => taskplom}/processes.py | 10 +++++----- src/{plomtask => taskplom}/todos.py | 14 +++++++------- .../versioned_attributes.py | 4 ++-- tests/conditions.py | 2 +- tests/days.py | 8 ++++---- tests/misc.py | 4 ++-- tests/processes.py | 4 ++-- tests/todos.py | 6 +++--- tests/utils.py | 16 ++++++++-------- 19 files changed, 54 insertions(+), 54 deletions(-) rename src/{plomtask => taskplom}/__init__.py (100%) rename src/{plomtask => taskplom}/conditions.py (94%) rename src/{plomtask => taskplom}/dating.py (95%) rename src/{plomtask => taskplom}/days.py (96%) rename src/{plomtask => taskplom}/db.py (99%) rename src/{plomtask => taskplom}/exceptions.py (100%) rename src/{plomtask => taskplom}/http.py (98%) rename src/{plomtask => taskplom}/misc.py (100%) rename src/{plomtask => taskplom}/processes.py (97%) rename src/{plomtask => taskplom}/todos.py (97%) rename src/{plomtask => taskplom}/versioned_attributes.py (97%) diff --git a/scripts/pre-commit b/scripts/pre-commit index 532f2dd..3707445 100755 --- a/scripts/pre-commit +++ b/scripts/pre-commit @@ -1,5 +1,5 @@ #!/bin/sh -DIRS='src src/plomtask tests' +DIRS='src src/taskplom tests' TOOLS='flake8 pylint mypy' for dir in $DIRS; do for tool in $TOOLS; do diff --git a/src/run.py b/src/run.py index 6958bb3..9442c0a 100755 --- a/src/run.py +++ b/src/run.py @@ -8,9 +8,9 @@ from sys import exit as sys_exit # non-standard libs try: from plomlib.db import PlomDbException - from plomtask.exceptions import HandledException - from plomtask.http import TaskHandler, TaskServer - from plomtask.db import DatabaseFile + from taskplom.exceptions import HandledException + from taskplom.http import TaskHandler, TaskServer + from taskplom.db import DatabaseFile except ModuleNotFoundError as e: print(f"Missing dependency: {e}. Please run with 'install_deps' argument.") sys_exit(1) diff --git a/src/plomtask/__init__.py b/src/taskplom/__init__.py similarity index 100% rename from src/plomtask/__init__.py rename to src/taskplom/__init__.py diff --git a/src/plomtask/conditions.py b/src/taskplom/conditions.py similarity index 94% rename from src/plomtask/conditions.py rename to src/taskplom/conditions.py index 2240baf..456b99a 100644 --- a/src/plomtask/conditions.py +++ b/src/taskplom/conditions.py @@ -1,8 +1,8 @@ """Non-doable elements of ProcessStep/Todo chains.""" from __future__ import annotations -from plomtask.db import DatabaseConnection, BaseModel -from plomtask.versioned_attributes import VersionedAttribute -from plomtask.exceptions import HandledException +from taskplom.db import DatabaseConnection, BaseModel +from taskplom.versioned_attributes import VersionedAttribute +from taskplom.exceptions import HandledException class Condition(BaseModel): diff --git a/src/plomtask/dating.py b/src/taskplom/dating.py similarity index 95% rename from src/plomtask/dating.py rename to src/taskplom/dating.py index 73e0489..4ea9d5a 100644 --- a/src/plomtask/dating.py +++ b/src/taskplom/dating.py @@ -1,6 +1,6 @@ """Various utilities for handling dates.""" from datetime import date as dt_date, timedelta -from plomtask.exceptions import BadFormatException +from taskplom.exceptions import BadFormatException def dt_date_from_str(date_str: str) -> dt_date: diff --git a/src/plomtask/days.py b/src/taskplom/days.py similarity index 96% rename from src/plomtask/days.py rename to src/taskplom/days.py index ebd16f1..89eaa2c 100644 --- a/src/plomtask/days.py +++ b/src/taskplom/days.py @@ -3,9 +3,9 @@ from __future__ import annotations from typing import Any, Self from sqlite3 import Row from datetime import date as dt_date, timedelta -from plomtask.db import DatabaseConnection, BaseModel -from plomtask.todos import Todo -from plomtask.dating import dt_date_from_days_n, days_n_from_dt_date +from taskplom.db import DatabaseConnection, BaseModel +from taskplom.todos import Todo +from taskplom.dating import dt_date_from_days_n, days_n_from_dt_date class Day(BaseModel): diff --git a/src/plomtask/db.py b/src/taskplom/db.py similarity index 99% rename from src/plomtask/db.py rename to src/taskplom/db.py index 113a95b..1a0f07b 100644 --- a/src/plomtask/db.py +++ b/src/taskplom/db.py @@ -5,7 +5,7 @@ from os import listdir from pathlib import Path from sqlite3 import Row from typing import cast, Any, Self, Callable -from plomtask.exceptions import (HandledException, NotFoundException, +from taskplom.exceptions import (HandledException, NotFoundException, BadFormatException) from plomlib.db import ( PlomDbConn, PlomDbFile, PlomDbMigration, TypePlomDbMigration) diff --git a/src/plomtask/exceptions.py b/src/taskplom/exceptions.py similarity index 100% rename from src/plomtask/exceptions.py rename to src/taskplom/exceptions.py diff --git a/src/plomtask/http.py b/src/taskplom/http.py similarity index 98% rename from src/plomtask/http.py rename to src/taskplom/http.py index 3d969cf..c2522d6 100644 --- a/src/plomtask/http.py +++ b/src/taskplom/http.py @@ -6,16 +6,16 @@ from typing import Any, Callable from base64 import b64encode, b64decode from binascii import Error as binascii_Exception from json import dumps as json_dumps -from plomtask.dating import ( +from taskplom.dating import ( days_n_from_dt_date, dt_date_from_str, date_in_n_days) -from plomtask.days import Day -from plomtask.exceptions import (HandledException, BadFormatException, +from taskplom.days import Day +from taskplom.exceptions import (HandledException, BadFormatException, NotFoundException) -from plomtask.db import DatabaseConnection, DatabaseFile, BaseModel -from plomtask.processes import Process, ProcessStep, ProcessStepsNode -from plomtask.conditions import Condition -from plomtask.todos import Todo, TodoOrProcStepNode -from plomtask.misc import DictableNode +from taskplom.db import DatabaseConnection, DatabaseFile, BaseModel +from taskplom.processes import Process, ProcessStep, ProcessStepsNode +from taskplom.conditions import Condition +from taskplom.todos import Todo, TodoOrProcStepNode +from taskplom.misc import DictableNode from plomlib.web import PlomHttpServer, PlomHttpHandler, PlomQueryMap TEMPLATES_DIR = Path('templates') diff --git a/src/plomtask/misc.py b/src/taskplom/misc.py similarity index 100% rename from src/plomtask/misc.py rename to src/taskplom/misc.py diff --git a/src/plomtask/processes.py b/src/taskplom/processes.py similarity index 97% rename from src/plomtask/processes.py rename to src/taskplom/processes.py index e23e97d..9a63fff 100644 --- a/src/plomtask/processes.py +++ b/src/taskplom/processes.py @@ -2,11 +2,11 @@ from __future__ import annotations from typing import Set, Self, Any from sqlite3 import Row -from plomtask.misc import DictableNode -from plomtask.db import DatabaseConnection, BaseModel -from plomtask.versioned_attributes import VersionedAttribute -from plomtask.conditions import Condition, ConditionsRelations -from plomtask.exceptions import (NotFoundException, BadFormatException, +from taskplom.misc import DictableNode +from taskplom.db import DatabaseConnection, BaseModel +from taskplom.versioned_attributes import VersionedAttribute +from taskplom.conditions import Condition, ConditionsRelations +from taskplom.exceptions import (NotFoundException, BadFormatException, HandledException) diff --git a/src/plomtask/todos.py b/src/taskplom/todos.py similarity index 97% rename from src/plomtask/todos.py rename to src/taskplom/todos.py index 2be57d4..275115f 100644 --- a/src/plomtask/todos.py +++ b/src/taskplom/todos.py @@ -3,14 +3,14 @@ from __future__ import annotations from datetime import date as dt_date from typing import Any, Self, Set from sqlite3 import Row -from plomtask.misc import DictableNode -from plomtask.db import DatabaseConnection, BaseModel -from plomtask.processes import Process, ProcessStepsNode -from plomtask.versioned_attributes import VersionedAttribute -from plomtask.conditions import Condition, ConditionsRelations -from plomtask.exceptions import (NotFoundException, BadFormatException, +from taskplom.misc import DictableNode +from taskplom.db import DatabaseConnection, BaseModel +from taskplom.processes import Process, ProcessStepsNode +from taskplom.versioned_attributes import VersionedAttribute +from taskplom.conditions import Condition, ConditionsRelations +from taskplom.exceptions import (NotFoundException, BadFormatException, HandledException) -from plomtask.dating import ( +from taskplom.dating import ( days_n_from_dt_date, dt_date_from_str, dt_date_from_days_n) diff --git a/src/plomtask/versioned_attributes.py b/src/taskplom/versioned_attributes.py similarity index 97% rename from src/plomtask/versioned_attributes.py rename to src/taskplom/versioned_attributes.py index f5e17f3..b57a83b 100644 --- a/src/plomtask/versioned_attributes.py +++ b/src/taskplom/versioned_attributes.py @@ -3,8 +3,8 @@ from datetime import datetime from typing import Any from sqlite3 import Row from time import sleep -from plomtask.db import DatabaseConnection -from plomtask.exceptions import (HandledException, BadFormatException, +from taskplom.db import DatabaseConnection +from taskplom.exceptions import (HandledException, BadFormatException, NotFoundException) TIMESTAMP_FMT = '%Y-%m-%d %H:%M:%S.%f' diff --git a/tests/conditions.py b/tests/conditions.py index b35dc6e..e5306a2 100644 --- a/tests/conditions.py +++ b/tests/conditions.py @@ -2,7 +2,7 @@ from typing import Any from tests.utils import (TestCaseSansDB, TestCaseWithDB, TestCaseWithServer, Expected) -from plomtask.conditions import Condition +from taskplom.conditions import Condition class TestsSansDB(TestCaseSansDB): diff --git a/tests/days.py b/tests/days.py index e5a241f..fa08f91 100644 --- a/tests/days.py +++ b/tests/days.py @@ -3,10 +3,10 @@ from datetime import date as dt_date, datetime, timedelta from typing import Any from tests.utils import (TestCaseSansDB, TestCaseWithDB, TestCaseWithServer, Expected, date_and_day_id, dt_date_from_day_id) -from plomtask.dating import date_in_n_days as tested_date_in_n_days -from plomtask.days import Day +from taskplom.dating import date_in_n_days as tested_date_in_n_days +from taskplom.days import Day -# Simply the ISO format for dates as used in plomtask.dating, but for testing +# Simply the ISO format for dates as used in taskplom.dating, but for testing # purposes we state our expectations here independently and explicitly TESTING_DATE_FORMAT = '%Y-%m-%d' @@ -15,7 +15,7 @@ def _testing_date_in_n_days(n: int) -> str: """Return in ISO format / TEST_DATE_FORMAT date from today + n days. As with TESTING_DATE_FORMAT, we assume this equal the original's code - at plomtask.dating.date_in_n_days, but want to state our expectations + at taskplom.dating.date_in_n_days, but want to state our expectations explicitly to rule out importing issues from the original. """ date = dt_date.today() + timedelta(days=n) diff --git a/tests/misc.py b/tests/misc.py index c26e83d..86b818d 100644 --- a/tests/misc.py +++ b/tests/misc.py @@ -2,8 +2,8 @@ from typing import Callable from unittest import TestCase from tests.utils import TestCaseWithServer -from plomtask.http import InputsParser -from plomtask.exceptions import BadFormatException +from taskplom.http import InputsParser +from taskplom.exceptions import BadFormatException class TestsSansServer(TestCase): diff --git a/tests/processes.py b/tests/processes.py index a762ebe..6b17189 100644 --- a/tests/processes.py +++ b/tests/processes.py @@ -2,8 +2,8 @@ from typing import Any from tests.utils import (TestCaseSansDB, TestCaseWithDB, TestCaseWithServer, Expected) -from plomtask.processes import Process, ProcessStep -from plomtask.exceptions import NotFoundException +from taskplom.processes import Process, ProcessStep +from taskplom.exceptions import NotFoundException class TestsSansDB(TestCaseSansDB): diff --git a/tests/todos.py b/tests/todos.py index 759bc12..ef77b81 100644 --- a/tests/todos.py +++ b/tests/todos.py @@ -3,9 +3,9 @@ from typing import Any from datetime import date as dt_date, timedelta from tests.utils import (TestCaseSansDB, TestCaseWithDB, TestCaseWithServer, Expected, date_and_day_id) -from plomtask.todos import Todo -from plomtask.processes import Process -from plomtask.exceptions import BadFormatException, HandledException +from taskplom.todos import Todo +from taskplom.processes import Process +from taskplom.exceptions import BadFormatException, HandledException class TestsWithDB(TestCaseWithDB, TestCaseSansDB): diff --git a/tests/utils.py b/tests/utils.py index 071ad1f..55a53c9 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -22,15 +22,15 @@ from uuid import uuid4 NAME_SRC_DIR = 'src' sys_path[0:0] = [NAME_SRC_DIR] # pylint: disable=wrong-import-position -from plomtask.db import DatabaseFile, DatabaseConnection # noqa: E402 -from plomtask.http import TaskHandler, TaskServer # noqa: E402 -from plomtask.processes import Process, ProcessStep # noqa: E402 -from plomtask.conditions import Condition # noqa: E402 -from plomtask.days import Day # noqa: E402 -from plomtask.todos import Todo # noqa: E402 -from plomtask.versioned_attributes import ( # noqa: E402 +from taskplom.db import DatabaseFile, DatabaseConnection # noqa: E402 +from taskplom.http import TaskHandler, TaskServer # noqa: E402 +from taskplom.processes import Process, ProcessStep # noqa: E402 +from taskplom.conditions import Condition # noqa: E402 +from taskplom.days import Day # noqa: E402 +from taskplom.todos import Todo # noqa: E402 +from taskplom.versioned_attributes import ( # noqa: E402 VersionedAttribute, TIMESTAMP_FMT) -from plomtask.exceptions import ( # noqa: E402 +from taskplom.exceptions import ( # noqa: E402 NotFoundException, HandledException) -- 2.30.2 From fd307176264bca976c3ab5f39d7b1879c5d8f1f6 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Mon, 17 Mar 2025 09:36:20 +0100 Subject: [PATCH 14/16] Re-write linting script and its dependencies to use lintplom. --- .mypy.ini | 2 -- .pylintrc | 3 --- scripts/pre-commit | 24 ++++++++++++++++-------- src/.pylintrc | 2 ++ tests/.mypy.ini | 2 ++ tests/.pylintrc | 3 +++ tests/requirements.txt | 1 + 7 files changed, 24 insertions(+), 13 deletions(-) delete mode 100644 .mypy.ini delete mode 100644 .pylintrc create mode 100644 src/.pylintrc create mode 100644 tests/.mypy.ini create mode 100644 tests/.pylintrc create mode 120000 tests/requirements.txt diff --git a/.mypy.ini b/.mypy.ini deleted file mode 100644 index e4f7658..0000000 --- a/.mypy.ini +++ /dev/null @@ -1,2 +0,0 @@ -[mypy] -mypy_path = $MYPY_CONFIG_FILE_DIR/src diff --git a/.pylintrc b/.pylintrc deleted file mode 100644 index 45bc14d..0000000 --- a/.pylintrc +++ /dev/null @@ -1,3 +0,0 @@ -[BASIC] -init-hook='import sys; sys.path[0:0] = ["src"]' -good-names-rgxs=(.*_)?(GET|POST)(_.+)?,,test_[A-Z]+ diff --git a/scripts/pre-commit b/scripts/pre-commit index 3707445..a8c4fd4 100755 --- a/scripts/pre-commit +++ b/scripts/pre-commit @@ -1,12 +1,20 @@ #!/bin/sh +set -e + +echo "===[ Running linters on source directories. ]===" DIRS='src src/taskplom tests' -TOOLS='flake8 pylint mypy' -for dir in $DIRS; do - for tool in $TOOLS; do - echo "Running ${tool} on ${dir}/ …." - python3 -m ${tool} ${dir}/*.py - done +DIRS=tests +for DIR in $DIRS; do + lintplom "${DIR}" done -echo "Running unittest-parallel on tests/." -set -e + +echo "\n\n===[ Running unittest-parallel on tests/. ]===" +DIR_VENV=/tmp/taskplom_venv_unittest_parallel +if [ ! -d "${DIR_VENV}" ]; then + mkdir "${DIR_VENV}" + python3 -m venv "${DIR_VENV}" +fi +. "${DIR_VENV}/bin/activate" +pip3 install unittest-parallel +pip3 install -r tests/requirements.txt unittest-parallel -t . -s tests/ -p '*.py' diff --git a/src/.pylintrc b/src/.pylintrc new file mode 100644 index 0000000..86d4879 --- /dev/null +++ b/src/.pylintrc @@ -0,0 +1,2 @@ +[BASIC] +good-names-rgxs=(.*_)?(GET|POST)(_.+)? diff --git a/tests/.mypy.ini b/tests/.mypy.ini new file mode 100644 index 0000000..bf0df38 --- /dev/null +++ b/tests/.mypy.ini @@ -0,0 +1,2 @@ +[mypy] +mypy_path = $MYPY_CONFIG_FILE_DIR/../src diff --git a/tests/.pylintrc b/tests/.pylintrc new file mode 100644 index 0000000..c18ad05 --- /dev/null +++ b/tests/.pylintrc @@ -0,0 +1,3 @@ +[BASIC] +init-hook='import sys; sys.path[0:0] = ["../src"]' +good-names-rgxs=(.*_)?(GET|POST)(_.+)?,test_[A-Z]+ diff --git a/tests/requirements.txt b/tests/requirements.txt new file mode 120000 index 0000000..86715e6 --- /dev/null +++ b/tests/requirements.txt @@ -0,0 +1 @@ +../src/requirements.txt \ No newline at end of file -- 2.30.2 From 44375ef99cbda36553e660f82efbfae98bc152bc Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Mon, 17 Mar 2025 09:39:06 +0100 Subject: [PATCH 15/16] Fix pre-commit script ignoring most source files for linting. --- scripts/pre-commit | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/pre-commit b/scripts/pre-commit index a8c4fd4..a311f84 100755 --- a/scripts/pre-commit +++ b/scripts/pre-commit @@ -3,7 +3,6 @@ set -e echo "===[ Running linters on source directories. ]===" DIRS='src src/taskplom tests' -DIRS=tests for DIR in $DIRS; do lintplom "${DIR}" done -- 2.30.2 From 913135894d76566c74cd5815d84999fd72624738 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Wed, 24 Sep 2025 14:36:35 +0200 Subject: [PATCH 16/16] Standardize dependency-check into plomlib's dependency_hint. --- plomlib | 2 +- src/plomlib/setup.py | 1 + src/run.py | 5 ++--- 3 files changed, 4 insertions(+), 4 deletions(-) create mode 120000 src/plomlib/setup.py diff --git a/plomlib b/plomlib index f2dc66a..7aa63ce 160000 --- a/plomlib +++ b/plomlib @@ -1 +1 @@ -Subproject commit f2dc66a2d4f1e8823246d1621b424e44ec423897 +Subproject commit 7aa63ce21db697ce663b56e345fe0c09969556a4 diff --git a/src/plomlib/setup.py b/src/plomlib/setup.py new file mode 120000 index 0000000..4a26f80 --- /dev/null +++ b/src/plomlib/setup.py @@ -0,0 +1 @@ +../../plomlib/py/setup.py \ No newline at end of file diff --git a/src/run.py b/src/run.py index 9442c0a..ef7c6f1 100755 --- a/src/run.py +++ b/src/run.py @@ -4,16 +4,15 @@ # standard libs from os import environ from pathlib import Path -from sys import exit as sys_exit # non-standard libs +from plomlib.setup import dependency_hint try: from plomlib.db import PlomDbException from taskplom.exceptions import HandledException from taskplom.http import TaskHandler, TaskServer from taskplom.db import DatabaseFile except ModuleNotFoundError as e: - print(f"Missing dependency: {e}. Please run with 'install_deps' argument.") - sys_exit(1) + dependency_hint(e) PLOMTASK_DB_PATH = environ.get('PLOMTASK_DB_PATH') -- 2.30.2