From 274892125d7b8211bb7024696885767409dc6a59 Mon Sep 17 00:00:00 2001 From: burnettk Date: Tue, 30 May 2023 12:21:50 -0400 Subject: [PATCH 1/2] remove useless comments matching filenames --- .../bin/python_comment_cleanup.sh | 41 +++++++++++++++++++ .../src/spiffworkflow_backend/__init__.py | 1 - .../spiffworkflow_backend/config/default.py | 1 - .../helpers/api_version.py | 1 - .../helpers/db_helper.py | 1 - .../src/spiffworkflow_backend/interfaces.py | 1 - .../spiffworkflow_backend/models/__init__.py | 1 - .../src/spiffworkflow_backend/models/db.py | 1 - .../src/spiffworkflow_backend/models/group.py | 1 - .../models/human_task.py | 1 - .../models/human_task_user.py | 1 - .../models/message_instance.py | 1 - .../spiffworkflow_backend/models/principal.py | 1 - .../models/process_group.py | 1 - .../models/process_instance.py | 1 - .../models/process_instance_file_data.py | 1 - .../models/process_instance_queue.py | 1 - .../models/process_model.py | 1 - .../models/refresh_token.py | 1 - .../models/secret_model.py | 1 - .../src/spiffworkflow_backend/models/task.py | 1 - .../src/spiffworkflow_backend/models/user.py | 1 - .../spiffworkflow_backend/routes/__init__.py | 1 - .../routes/openid_blueprint/__init__.py | 1 - .../src/spiffworkflow_backend/routes/user.py | 1 - .../routes/users_controller.py | 1 - .../delete_process_instances_with_criteria.py | 1 - .../scripts/fact_service.py | 1 - .../scripts/get_data_sizes.py | 1 - .../scripts/get_encoded_file_data.py | 1 - .../spiffworkflow_backend/scripts/get_env.py | 1 - .../scripts/get_localtime.py | 1 - .../scripts/get_secret.py | 1 - .../scripts/markdown_file_download_link.py | 1 - .../spiffworkflow_backend/scripts/script.py | 1 - .../services/acceptance_test_fixtures.py | 1 - .../services/assertion_service.py | 1 - .../services/background_processing_service.py | 1 - .../services/custom_parser.py | 1 - .../services/data_setup_service.py | 1 - .../services/email_service.py | 1 - .../services/file_system_service.py | 1 - .../services/git_service.py | 1 - .../services/logging_service.py | 1 - .../services/message_service.py | 1 - .../services/process_instance_processor.py | 1 - .../process_instance_report_service.py | 1 - .../services/process_instance_service.py | 1 - .../services/process_model_service.py | 1 - .../services/secret_service.py | 1 - .../services/spec_file_service.py | 1 - .../services/user_service.py | 1 - .../services/workflow_service.py | 1 - .../tests/spiffworkflow_backend/__init__.py | 1 - .../helpers/base_test.py | 1 - .../helpers/example_data.py | 1 - .../integration/__init__.py | 1 - .../integration/test_authentication.py | 1 - .../integration/test_authorization.py | 1 - .../integration/test_logging_service.py | 1 - .../integration/test_nested_groups.py | 1 - .../integration/test_secret_service.py | 1 - .../integration/test_user_blueprint.py | 1 - .../integration/test_users_controller.py | 1 - .../unit/test_acceptance_test_fixtures.py | 1 - .../spiffworkflow_backend/unit/test_file.py | 1 - .../unit/test_message_instance.py | 1 - .../unit/test_process_instance_processor.py | 1 - .../test_process_instance_queue_service.py | 1 - .../test_process_instance_report_service.py | 1 - .../unit/test_process_model_service.py | 1 - .../unit/test_various_bpmn_constructs.py | 1 - .../unit/test_workflow_service.py | 1 - 73 files changed, 41 insertions(+), 72 deletions(-) create mode 100755 spiffworkflow-backend/bin/python_comment_cleanup.sh diff --git a/spiffworkflow-backend/bin/python_comment_cleanup.sh b/spiffworkflow-backend/bin/python_comment_cleanup.sh new file mode 100755 index 00000000..94a0f694 --- /dev/null +++ b/spiffworkflow-backend/bin/python_comment_cleanup.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +function error_handler() { + >&2 echo "Exited with BAD EXIT CODE '${2}' in ${0} script at line: ${1}." + exit "$2" +} +trap 'error_handler ${LINENO} $?' ERR +set -o errtrace -o errexit -o nounset -o pipefail + +# Function to check if a string matches the file name pattern +matches_filename_pattern() { + local file_name="$1" + local comment_line="$2" + + # Remove file extension and capitalize the first letter + local expected_comment=$(basename "$file_name" .py) + + expected_comment_with_first_letter_capitalized="${expected_comment^}" + + if grep -Eq "\"\"\"${expected_comment}\.\"\"\"" <<< "$comment_line"; then + return 0 + else + if grep -Eq "\"\"\"${expected_comment_with_first_letter_capitalized}\.\"\"\"" <<< "$comment_line"; then + return 0 + else + return 1 + fi + fi +} + +# Process each Python file in the "src" and "tests" directories +for file in $(find src tests -type f -name '*.py'); do + # Read the first line of the file + read -r first_line < "$file" + + # Check if the first line matches the expected comment pattern + if matches_filename_pattern "$file" "$first_line"; then + # Remove the comment from the file + hot_sed -i '1d' "$file" + fi +done diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/__init__.py b/spiffworkflow-backend/src/spiffworkflow_backend/__init__.py index e0d7cacf..5ea32a4e 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/__init__.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/__init__.py @@ -1,4 +1,3 @@ -"""__init__.""" import base64 import faulthandler import json diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py b/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py index 59bb742d..cc44f62b 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py @@ -1,4 +1,3 @@ -"""Default.""" import re from os import environ diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/helpers/api_version.py b/spiffworkflow-backend/src/spiffworkflow_backend/helpers/api_version.py index 607b6c16..5935aa87 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/helpers/api_version.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/helpers/api_version.py @@ -1,2 +1 @@ -"""Api_version.""" V1_API_PATH_PREFIX = "/v1.0" diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/helpers/db_helper.py b/spiffworkflow-backend/src/spiffworkflow_backend/helpers/db_helper.py index ac21ebab..db556cb0 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/helpers/db_helper.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/helpers/db_helper.py @@ -1,4 +1,3 @@ -"""Db_helper.""" import time import sqlalchemy diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/interfaces.py b/spiffworkflow-backend/src/spiffworkflow_backend/interfaces.py index 6f0d5c56..6bfc5e06 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/interfaces.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/interfaces.py @@ -1,4 +1,3 @@ -"""Interfaces.""" from typing import TYPE_CHECKING from typing import NewType from typing import TypedDict diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/__init__.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/__init__.py index f520b09d..e69de29b 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/__init__.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/__init__.py @@ -1 +0,0 @@ -"""__init__.""" diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/db.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/db.py index a91ab83e..67a2df80 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/db.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/db.py @@ -1,4 +1,3 @@ -"""Db.""" from __future__ import annotations import enum diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/group.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/group.py index 79f6934e..1fd41580 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/group.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/group.py @@ -1,4 +1,3 @@ -"""Group.""" from __future__ import annotations from typing import TYPE_CHECKING diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/human_task.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/human_task.py index 71dc778f..a7e70b71 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/human_task.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/human_task.py @@ -1,4 +1,3 @@ -"""Human_task.""" from __future__ import annotations from dataclasses import dataclass diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/human_task_user.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/human_task_user.py index 83ac34c6..58acffe3 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/human_task_user.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/human_task_user.py @@ -1,4 +1,3 @@ -"""Human_task_user.""" from __future__ import annotations from dataclasses import dataclass diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/message_instance.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/message_instance.py index 5eef8324..203c02e6 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/message_instance.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/message_instance.py @@ -1,4 +1,3 @@ -"""Message_instance.""" import enum from dataclasses import dataclass from typing import TYPE_CHECKING diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/principal.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/principal.py index 87801289..82dd1457 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/principal.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/principal.py @@ -1,4 +1,3 @@ -"""Principal.""" from dataclasses import dataclass from sqlalchemy import ForeignKey diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_group.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_group.py index d3748e58..fa0aa3e7 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_group.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_group.py @@ -1,4 +1,3 @@ -"""Process_group.""" from __future__ import annotations import dataclasses diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py index 50dc2f1b..782db23c 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py @@ -1,4 +1,3 @@ -"""Process_instance.""" from __future__ import annotations from typing import Any diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance_file_data.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance_file_data.py index 90c072e8..e2d0fcb4 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance_file_data.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance_file_data.py @@ -1,4 +1,3 @@ -"""Process_instance_file_data.""" from dataclasses import dataclass from sqlalchemy import ForeignKey diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance_queue.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance_queue.py index d37ce9a6..11b41293 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance_queue.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance_queue.py @@ -1,4 +1,3 @@ -"""Process_instance_queue.""" from dataclasses import dataclass from sqlalchemy import ForeignKey diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_model.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_model.py index a5a6a924..f0ce47cd 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_model.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_model.py @@ -1,4 +1,3 @@ -"""Process_model.""" from __future__ import annotations import enum diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/refresh_token.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/refresh_token.py index 326ecabd..b2ac40aa 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/refresh_token.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/refresh_token.py @@ -1,4 +1,3 @@ -"""Refresh_token.""" from dataclasses import dataclass from sqlalchemy import ForeignKey diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/secret_model.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/secret_model.py index 9ecfe534..927c084b 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/secret_model.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/secret_model.py @@ -1,4 +1,3 @@ -"""Secret_model.""" from dataclasses import dataclass from marshmallow import Schema diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/task.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/task.py index 23a3b729..618c677f 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/task.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/task.py @@ -1,4 +1,3 @@ -"""Task.""" import enum from dataclasses import dataclass from typing import TYPE_CHECKING diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/user.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/user.py index 7474993e..a3ed4200 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/user.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/user.py @@ -1,4 +1,3 @@ -"""User.""" from __future__ import annotations from dataclasses import dataclass diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/__init__.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/__init__.py index f520b09d..e69de29b 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/__init__.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/__init__.py @@ -1 +0,0 @@ -"""__init__.""" diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/openid_blueprint/__init__.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/openid_blueprint/__init__.py index f520b09d..e69de29b 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/openid_blueprint/__init__.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/openid_blueprint/__init__.py @@ -1 +0,0 @@ -"""__init__.""" diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/user.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/user.py index 521f92af..3e451882 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/user.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/user.py @@ -1,4 +1,3 @@ -"""User.""" import ast import base64 import json diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/users_controller.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/users_controller.py index b772aa33..d0592931 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/users_controller.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/users_controller.py @@ -1,4 +1,3 @@ -"""Users_controller.""" from typing import Any import flask diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/delete_process_instances_with_criteria.py b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/delete_process_instances_with_criteria.py index 823d67c3..83cb4697 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/delete_process_instances_with_criteria.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/delete_process_instances_with_criteria.py @@ -1,4 +1,3 @@ -"""Delete_process_instances_with_criteria.""" from time import time from typing import Any diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/fact_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/fact_service.py index 3bf8c1d5..02277983 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/fact_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/fact_service.py @@ -1,4 +1,3 @@ -"""Fact_service.""" from typing import Any from spiffworkflow_backend.models.script_attributes_context import ScriptAttributesContext diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_data_sizes.py b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_data_sizes.py index 7199613a..c21f7961 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_data_sizes.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_data_sizes.py @@ -1,4 +1,3 @@ -"""Get_data_sizes.""" from typing import Any from spiffworkflow_backend.models.script_attributes_context import ScriptAttributesContext diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_encoded_file_data.py b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_encoded_file_data.py index 21cc71b0..d5ee4db8 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_encoded_file_data.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_encoded_file_data.py @@ -1,4 +1,3 @@ -"""Get_encoded_file_data.""" import base64 from typing import Any diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_env.py b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_env.py index 7015239e..954a8388 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_env.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_env.py @@ -1,4 +1,3 @@ -"""Get_env.""" from typing import Any from spiffworkflow_backend.models.script_attributes_context import ScriptAttributesContext diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_localtime.py b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_localtime.py index 80edf59a..7a189187 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_localtime.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_localtime.py @@ -1,4 +1,3 @@ -"""Get_localtime.""" from datetime import datetime from typing import Any diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_secret.py b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_secret.py index ed85d258..c5b87f0c 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_secret.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/get_secret.py @@ -1,4 +1,3 @@ -"""Get_secret.""" from typing import Any from spiffworkflow_backend.models.script_attributes_context import ScriptAttributesContext diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/markdown_file_download_link.py b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/markdown_file_download_link.py index e470ced5..18b27b13 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/markdown_file_download_link.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/markdown_file_download_link.py @@ -1,4 +1,3 @@ -"""Markdown_file_download_link.""" from typing import Any from flask import current_app diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/script.py b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/script.py index 3f3a94bb..5992bff0 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/script.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/script.py @@ -1,4 +1,3 @@ -"""Script.""" from __future__ import annotations import importlib diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/acceptance_test_fixtures.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/acceptance_test_fixtures.py index 7c9cfb79..c91177e9 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/acceptance_test_fixtures.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/acceptance_test_fixtures.py @@ -1,4 +1,3 @@ -"""Acceptance_test_fixtures.""" import time from flask import current_app diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/assertion_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/assertion_service.py index 27a1564e..76d50de0 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/assertion_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/assertion_service.py @@ -1,4 +1,3 @@ -"""Assertion_service.""" import contextlib from collections.abc import Generator diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/background_processing_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/background_processing_service.py index 58e8c2e4..d5922158 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/background_processing_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/background_processing_service.py @@ -1,4 +1,3 @@ -"""Background_processing_service.""" import flask from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus from spiffworkflow_backend.services.message_service import MessageService diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/custom_parser.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/custom_parser.py index b632b1cf..a65482f7 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/custom_parser.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/custom_parser.py @@ -1,4 +1,3 @@ -"""Custom_parser.""" from SpiffWorkflow.dmn.parser.BpmnDmnParser import BpmnDmnParser # type: ignore from SpiffWorkflow.spiff.parser.process import SpiffBpmnParser # type: ignore from spiffworkflow_backend.specs.start_event import StartEvent diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/data_setup_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/data_setup_service.py index bcd5e238..09aee73d 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/data_setup_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/data_setup_service.py @@ -1,4 +1,3 @@ -"""Data_setup_service.""" from flask import current_app from spiffworkflow_backend.models.db import db from spiffworkflow_backend.services.process_model_service import ProcessModelService diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/email_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/email_service.py index 89eb7efa..7108dc58 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/email_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/email_service.py @@ -1,4 +1,3 @@ -"""Email_service.""" from flask import current_app from flask_mail import Message # type: ignore diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/file_system_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/file_system_service.py index 8d2a9135..16f0875e 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/file_system_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/file_system_service.py @@ -1,4 +1,3 @@ -"""File_system_service.""" import os from collections.abc import Generator from contextlib import contextmanager diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/git_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/git_service.py index d2dba332..d173eefb 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/git_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/git_service.py @@ -1,4 +1,3 @@ -"""Git_service.""" import os import re import shutil diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/logging_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/logging_service.py index 3c8845c3..182eb0a4 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/logging_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/logging_service.py @@ -1,4 +1,3 @@ -"""Logging_service.""" import json import logging import re diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/message_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/message_service.py index 70948042..ce7240f5 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/message_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/message_service.py @@ -1,4 +1,3 @@ -"""Message_service.""" from spiffworkflow_backend.models.db import db from spiffworkflow_backend.models.message_instance import MessageInstanceModel diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py index 06156baa..cd0ddaad 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py @@ -1,4 +1,3 @@ -"""Process_instance_processor.""" # TODO: clean up this service for a clear distinction between it and the process_instance_service # where this points to the pi service import decimal diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_report_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_report_service.py index a6d78caa..f64a4d32 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_report_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_report_service.py @@ -1,4 +1,3 @@ -"""Process_instance_report_service.""" import copy import re from collections.abc import Generator diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py index d9a81e16..4a8606ca 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py @@ -1,4 +1,3 @@ -"""Process_instance_service.""" import base64 import hashlib import time diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py index 37a9433c..6cdcaa83 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py @@ -1,4 +1,3 @@ -"""Process_model_service.""" import json import os import shutil diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/secret_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/secret_service.py index bac2cb23..da0f5c36 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/secret_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/secret_service.py @@ -1,4 +1,3 @@ -"""Secret_service.""" from flask import current_app from spiffworkflow_backend.exceptions.api_error import ApiError diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py index 6086161b..c311ce30 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py @@ -1,4 +1,3 @@ -"""Spec_file_service.""" import os import shutil from datetime import datetime diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/user_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/user_service.py index 848e7ee1..ffc7519b 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/user_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/user_service.py @@ -1,4 +1,3 @@ -"""User_service.""" from typing import Any from flask import current_app diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_service.py index 5b8a9714..5668226d 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_service.py @@ -1,4 +1,3 @@ -"""workflow_service.""" from datetime import datetime from SpiffWorkflow.bpmn.workflow import BpmnWorkflow # type: ignore diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/__init__.py b/spiffworkflow-backend/tests/spiffworkflow_backend/__init__.py index f520b09d..e69de29b 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/__init__.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/__init__.py @@ -1 +0,0 @@ -"""__init__.""" diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/base_test.py b/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/base_test.py index 2fb346fe..faec5c1b 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/base_test.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/base_test.py @@ -1,4 +1,3 @@ -"""Base_test.""" import io import json import os diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/example_data.py b/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/example_data.py index 4941a2d3..c0ce8af7 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/example_data.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/example_data.py @@ -1,4 +1,3 @@ -"""Example_data.""" import glob import os diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/__init__.py b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/__init__.py index f520b09d..e69de29b 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/__init__.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/__init__.py @@ -1 +0,0 @@ -"""__init__.""" diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_authentication.py b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_authentication.py index 7fddd735..fde21c7b 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_authentication.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_authentication.py @@ -1,4 +1,3 @@ -"""Test_authentication.""" import ast import base64 diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_authorization.py b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_authorization.py index 51eae72e..7f211a67 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_authorization.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_authorization.py @@ -1,4 +1,3 @@ -"""Test_authorization.""" from tests.spiffworkflow_backend.helpers.base_test import BaseTest diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_logging_service.py b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_logging_service.py index 44c1fbf1..04874d51 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_logging_service.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_logging_service.py @@ -1,4 +1,3 @@ -"""Test_logging_service.""" from uuid import UUID from flask.app import Flask diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_nested_groups.py b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_nested_groups.py index 001d4b12..177db5d7 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_nested_groups.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_nested_groups.py @@ -1,4 +1,3 @@ -"""Test_nested_groups.""" import json from flask.app import Flask diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_secret_service.py b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_secret_service.py index 14b2f046..47e3afe2 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_secret_service.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_secret_service.py @@ -1,4 +1,3 @@ -"""Test_secret_service.""" import json import pytest diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_user_blueprint.py b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_user_blueprint.py index ce142f1c..2aad2f40 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_user_blueprint.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_user_blueprint.py @@ -1,4 +1,3 @@ -"""Test_user_blueprint.""" # TODO: fix these tests for new authing system # """Test User Blueprint.""" # import json diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_users_controller.py b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_users_controller.py index 588e43e1..a3186c20 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_users_controller.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_users_controller.py @@ -1,4 +1,3 @@ -"""Test_users_controller.""" from flask.app import Flask from flask.testing import FlaskClient from spiffworkflow_backend.models.user import UserModel diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_acceptance_test_fixtures.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_acceptance_test_fixtures.py index 94bf70d1..04dd29f9 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_acceptance_test_fixtures.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_acceptance_test_fixtures.py @@ -1,4 +1,3 @@ -"""Test_acceptance_test_fixtures.""" import os from flask.app import Flask diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_file.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_file.py index c8b350f4..f4696631 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_file.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_file.py @@ -1,4 +1,3 @@ -"""Test_file.""" from datetime import datetime from spiffworkflow_backend.models.file import File diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_message_instance.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_message_instance.py index 3d512b91..c4967588 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_message_instance.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_message_instance.py @@ -1,4 +1,3 @@ -"""Test_message_instance.""" import pytest from flask import Flask from flask.testing import FlaskClient diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py index d3d14d5f..0487c755 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py @@ -1,4 +1,3 @@ -"""Test_process_instance_processor.""" from uuid import UUID import pytest diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_queue_service.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_queue_service.py index ec5e8dca..61a434e7 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_queue_service.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_queue_service.py @@ -1,4 +1,3 @@ -"""Test_process_instance_queue_service.""" import time from contextlib import suppress diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_report_service.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_report_service.py index b1aca344..737b1614 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_report_service.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_report_service.py @@ -1,4 +1,3 @@ -"""Test_process_instance_report_service.""" import pytest from flask import Flask from flask.testing import FlaskClient diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_model_service.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_model_service.py index f7f29b88..62613438 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_model_service.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_model_service.py @@ -1,4 +1,3 @@ -"""Test_process_model_service.""" from flask import Flask from spiffworkflow_backend.services.process_model_service import ProcessModelService diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_various_bpmn_constructs.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_various_bpmn_constructs.py index 077c8904..0011a7cd 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_various_bpmn_constructs.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_various_bpmn_constructs.py @@ -1,4 +1,3 @@ -"""Test_various_bpmn_constructs.""" from flask.app import Flask from flask.testing import FlaskClient from spiffworkflow_backend.services.process_instance_processor import ProcessInstanceProcessor diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_workflow_service.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_workflow_service.py index 10bcd95d..3428c60c 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_workflow_service.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_workflow_service.py @@ -1,4 +1,3 @@ -"""Test_workflow_service.""" from collections.abc import Generator from datetime import datetime from datetime import timedelta From 1486edbf9719a2f220833542f5fdc9b062993d49 Mon Sep 17 00:00:00 2001 From: jbirddog <100367399+jbirddog@users.noreply.github.com> Date: Tue, 30 May 2023 13:51:37 -0400 Subject: [PATCH 2/2] Cycle Timer Start Event Support (#285) --- .../migrations/versions/e4b6bbf83a3e_.py | 42 +++++++++++ .../load_database_models.py | 3 + .../models/process_model_cycle.py | 19 +++++ .../services/email_service.py | 1 - .../services/message_service.py | 1 - .../services/process_instance_service.py | 73 +++++++++++++++++-- .../services/secret_service.py | 1 - .../services/workflow_service.py | 30 +++----- .../specs/start_event.py | 34 ++++++--- .../unit/test_workflow_service.py | 8 +- 10 files changed, 167 insertions(+), 45 deletions(-) create mode 100644 spiffworkflow-backend/migrations/versions/e4b6bbf83a3e_.py create mode 100644 spiffworkflow-backend/src/spiffworkflow_backend/models/process_model_cycle.py diff --git a/spiffworkflow-backend/migrations/versions/e4b6bbf83a3e_.py b/spiffworkflow-backend/migrations/versions/e4b6bbf83a3e_.py new file mode 100644 index 00000000..82cb312d --- /dev/null +++ b/spiffworkflow-backend/migrations/versions/e4b6bbf83a3e_.py @@ -0,0 +1,42 @@ +"""empty message + +Revision ID: e4b6bbf83a3e +Revises: 6aa02463da9c +Create Date: 2023-05-30 10:17:10.595965 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = 'e4b6bbf83a3e' +down_revision = '6aa02463da9c' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('process_model_cycle', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('process_model_identifier', sa.String(length=255), nullable=False), + sa.Column('cycle_count', sa.Integer(), nullable=True), + sa.Column('duration_in_seconds', sa.Integer(), nullable=True), + sa.Column('current_cycle', sa.Integer(), nullable=True), + sa.Column('updated_at_in_seconds', sa.Integer(), nullable=True), + sa.Column('created_at_in_seconds', sa.Integer(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + with op.batch_alter_table('process_model_cycle', schema=None) as batch_op: + batch_op.create_index(batch_op.f('ix_process_model_cycle_process_model_identifier'), ['process_model_identifier'], unique=False) + + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('process_model_cycle', schema=None) as batch_op: + batch_op.drop_index(batch_op.f('ix_process_model_cycle_process_model_identifier')) + + op.drop_table('process_model_cycle') + # ### end Alembic commands ### diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/load_database_models.py b/spiffworkflow-backend/src/spiffworkflow_backend/load_database_models.py index ed542761..22e570e1 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/load_database_models.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/load_database_models.py @@ -76,5 +76,8 @@ from spiffworkflow_backend.models.process_instance_queue import ( from spiffworkflow_backend.models.active_user import ( ActiveUserModel, ) # noqa: F401 +from spiffworkflow_backend.models.process_model_cycle import ( + ProcessModelCycleModel, +) # noqa: F401 add_listeners() diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_model_cycle.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_model_cycle.py new file mode 100644 index 00000000..bc745590 --- /dev/null +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_model_cycle.py @@ -0,0 +1,19 @@ +from dataclasses import dataclass + +from spiffworkflow_backend.models.db import SpiffworkflowBaseDBModel +from spiffworkflow_backend.models.db import db + + +@dataclass +class ProcessModelCycleModel(SpiffworkflowBaseDBModel): + """ProcessInstanceQueueModel.""" + + __tablename__ = "process_model_cycle" + + id: int = db.Column(db.Integer, primary_key=True) + process_model_identifier: str = db.Column(db.String(255), nullable=False, index=True) + cycle_count: int = db.Column(db.Integer) + duration_in_seconds: int = db.Column(db.Integer) + current_cycle: int = db.Column(db.Integer) + updated_at_in_seconds: int = db.Column(db.Integer) + created_at_in_seconds: int = db.Column(db.Integer) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/email_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/email_service.py index 7108dc58..0d6da09e 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/email_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/email_service.py @@ -1,4 +1,3 @@ - from flask import current_app from flask_mail import Message # type: ignore diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/message_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/message_service.py index ce7240f5..d26aa8b0 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/message_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/message_service.py @@ -1,4 +1,3 @@ - from spiffworkflow_backend.models.db import db from spiffworkflow_backend.models.message_instance import MessageInstanceModel from spiffworkflow_backend.models.message_instance import MessageStatuses diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py index 4a8606ca..f342f5f0 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py @@ -21,6 +21,7 @@ from spiffworkflow_backend.models.process_instance import ProcessInstanceModel from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus from spiffworkflow_backend.models.process_instance_file_data import ProcessInstanceFileDataModel from spiffworkflow_backend.models.process_model import ProcessModelInfo +from spiffworkflow_backend.models.process_model_cycle import ProcessModelCycleModel from spiffworkflow_backend.models.task import Task from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.services.authorization_service import AuthorizationService @@ -33,6 +34,7 @@ from spiffworkflow_backend.services.process_instance_queue_service import Proces from spiffworkflow_backend.services.process_instance_queue_service import ProcessInstanceQueueService from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.workflow_service import WorkflowService +from spiffworkflow_backend.specs.start_event import StartConfiguration class ProcessInstanceService: @@ -42,22 +44,27 @@ class ProcessInstanceService: TASK_STATE_LOCKED = "locked" @staticmethod - def calculate_start_delay_in_seconds(process_instance_model: ProcessInstanceModel) -> int: + def next_start_event_configuration(process_instance_model: ProcessInstanceModel) -> StartConfiguration: try: processor = ProcessInstanceProcessor(process_instance_model) - delay_in_seconds = WorkflowService.calculate_run_at_delay_in_seconds( + start_configuration = WorkflowService.next_start_event_configuration( processor.bpmn_process_instance, datetime.now(timezone.utc) ) except Exception: - delay_in_seconds = 0 - return delay_in_seconds + start_configuration = None + + if start_configuration is None: + start_configuration = (0, 0, 0) + + return start_configuration @classmethod def create_process_instance( cls, process_model: ProcessModelInfo, user: UserModel, - ) -> ProcessInstanceModel: + start_configuration: StartConfiguration | None = None, + ) -> tuple[ProcessInstanceModel, StartConfiguration]: """Get_process_instance_from_spec.""" db.session.commit() try: @@ -75,10 +82,13 @@ class ProcessInstanceService: ) db.session.add(process_instance_model) db.session.commit() - delay_in_seconds = cls.calculate_start_delay_in_seconds(process_instance_model) + + if start_configuration is None: + start_configuration = cls.next_start_event_configuration(process_instance_model) + _, delay_in_seconds, _ = start_configuration run_at_in_seconds = round(time.time()) + delay_in_seconds ProcessInstanceQueueService.enqueue_new_process_instance(process_instance_model, run_at_in_seconds) - return process_instance_model + return (process_instance_model, start_configuration) @classmethod def create_process_instance_from_process_model_identifier( @@ -88,7 +98,52 @@ class ProcessInstanceService: ) -> ProcessInstanceModel: """Create_process_instance_from_process_model_identifier.""" process_model = ProcessModelService.get_process_model(process_model_identifier) - return cls.create_process_instance(process_model, user) + process_instance_model, (cycle_count, _, duration_in_seconds) = cls.create_process_instance( + process_model, user + ) + cls.register_process_model_cycles(process_model_identifier, cycle_count, duration_in_seconds) + return process_instance_model + + @classmethod + def register_process_model_cycles( + cls, process_model_identifier: str, cycle_count: int, duration_in_seconds: int + ) -> None: + # clean up old cycle record if it exists. event if the given cycle_count is 0 the previous version + # of the model could have included a cycle timer start event + cycles = ProcessModelCycleModel.query.filter( + ProcessModelCycleModel.process_model_identifier == process_model_identifier, + ).all() + + for cycle in cycles: + db.session.delete(cycle) + + if cycle_count != 0: + cycle = ProcessModelCycleModel( + process_model_identifier=process_model_identifier, + cycle_count=cycle_count, + duration_in_seconds=duration_in_seconds, + current_cycle=0, + ) + db.session.add(cycle) + + db.session.commit() + + @classmethod + def schedule_next_process_model_cycle(cls, process_instance_model: ProcessInstanceModel) -> None: + cycle = ProcessModelCycleModel.query.filter( + ProcessModelCycleModel.process_model_identifier == process_instance_model.process_model_identifier + ).first() + + if cycle is None or cycle.cycle_count == 0: + return + + if cycle.cycle_count == -1 or cycle.current_cycle < cycle.cycle_count: + process_model = ProcessModelService.get_process_model(process_instance_model.process_model_identifier) + start_configuration = (cycle.cycle_count, cycle.duration_in_seconds, cycle.duration_in_seconds) + cls.create_process_instance(process_model, process_instance_model.process_initiator, start_configuration) + cycle.current_cycle += 1 + db.session.add(cycle) + db.session.commit() @classmethod def waiting_event_can_be_skipped(cls, waiting_event: dict[str, Any], now_in_utc: datetime) -> bool: @@ -155,6 +210,8 @@ class ProcessInstanceService: cls.run_process_instance_with_processor( process_instance, status_value=status_value, execution_strategy_name=execution_strategy_name ) + if process_instance.status == "complete": + cls.schedule_next_process_model_cycle(process_instance) except ProcessInstanceIsAlreadyLockedError: continue except Exception as e: diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/secret_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/secret_service.py index da0f5c36..6edeb364 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/secret_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/secret_service.py @@ -1,4 +1,3 @@ - from flask import current_app from spiffworkflow_backend.exceptions.api_error import ApiError from spiffworkflow_backend.models.db import db diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_service.py index 5668226d..83acc4e2 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_service.py @@ -3,6 +3,7 @@ from datetime import datetime from SpiffWorkflow.bpmn.workflow import BpmnWorkflow # type: ignore from SpiffWorkflow.task import Task as SpiffTask # type: ignore from SpiffWorkflow.task import TaskState +from spiffworkflow_backend.specs.start_event import StartConfiguration from spiffworkflow_backend.specs.start_event import StartEvent @@ -14,24 +15,13 @@ class WorkflowService: return [t for t in workflow.get_tasks(TaskState.FUTURE) if isinstance(t.task_spec, StartEvent)] @classmethod - def next_start_event_delay_in_seconds(cls, workflow: BpmnWorkflow, now_in_utc: datetime) -> int: + def next_start_event_configuration(cls, workflow: BpmnWorkflow, now_in_utc: datetime) -> StartConfiguration | None: start_events = cls.future_start_events(workflow) - start_delays: list[int] = [] - for start_event in start_events: - start_delay = start_event.task_spec.start_delay_in_seconds(start_event, now_in_utc) - start_delays.append(start_delay) - start_delays.sort() - return start_delays[0] if len(start_delays) > 0 else 0 - - @classmethod - def calculate_run_at_delay_in_seconds(cls, workflow: BpmnWorkflow, now_in_utc: datetime) -> int: - # TODO: for now we are using the first start time because I am not sure how multiple - # start events should work. I think the right answer is to take the earliest start - # time and have later start events stay FUTURE/WAITING?, then we need to be able - # to respect the other start events when enqueue'ing. - # - # TODO: this method should also expand to include other FUTURE/WAITING timers when - # enqueue'ing so that we don't have to check timers every 10 or whatever seconds - # right now we assume that this is being called to create a process - - return cls.next_start_event_delay_in_seconds(workflow, now_in_utc) + configurations = list( + map( + lambda start_event: start_event.task_spec.configuration(start_event, now_in_utc), # type: ignore + start_events, + ) + ) + configurations.sort(key=lambda configuration: configuration[1]) # type: ignore + return configurations[0] if len(configurations) > 0 else None diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/specs/start_event.py b/spiffworkflow-backend/src/spiffworkflow_backend/specs/start_event.py index 56e238f3..5cb929e4 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/specs/start_event.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/specs/start_event.py @@ -13,8 +13,11 @@ from SpiffWorkflow.bpmn.specs.event_definitions import TimerEventDefinition from SpiffWorkflow.spiff.parser.event_parsers import SpiffStartEventParser # type: ignore from SpiffWorkflow.task import Task as SpiffTask # type: ignore +StartConfiguration = tuple[int, int, int] # TODO: cylce timers and repeat counts? + + class StartEvent(DefaultStartEvent): # type: ignore def __init__(self, wf_spec, bpmn_id, event_definition, **kwargs): # type: ignore if isinstance(event_definition, TimerEventDefinition): @@ -33,27 +36,36 @@ class StartEvent(DefaultStartEvent): # type: ignore def register_parser_class(parser_config: dict[str, Any]) -> None: parser_config[full_tag("startEvent")] = (SpiffStartEventParser, StartEvent) - def start_delay_in_seconds(self, my_task: SpiffTask, now_in_utc: datetime) -> int: - script_engine = my_task.workflow.script_engine - evaluated_expression = None - parsed_duration = None - - if isinstance(self.timer_definition, TimerEventDefinition) and script_engine is not None: - evaluated_expression = script_engine.evaluate(my_task, self.timer_definition.expression) + def configuration(self, my_task: SpiffTask, now_in_utc: datetime) -> StartConfiguration: + evaluated_expression = self.evaluated_timer_expression(my_task) + cycles = 0 + start_delay_in_seconds = 0 + duration = 0 if evaluated_expression is not None: if isinstance(self.timer_definition, TimeDateEventDefinition): parsed_duration = TimerEventDefinition.parse_time_or_duration(evaluated_expression) time_delta = parsed_duration - now_in_utc - return time_delta.seconds # type: ignore + start_delay_in_seconds = time_delta.seconds elif isinstance(self.timer_definition, DurationTimerEventDefinition): parsed_duration = TimerEventDefinition.parse_iso_duration(evaluated_expression) time_delta = TimerEventDefinition.get_timedelta_from_start(parsed_duration, now_in_utc) - return time_delta.seconds # type: ignore + start_delay_in_seconds = time_delta.seconds elif isinstance(self.timer_definition, CycleTimerEventDefinition): - return 0 + cycles, start, cycle_duration = TimerEventDefinition.parse_iso_recurring_interval(evaluated_expression) + time_delta = start - now_in_utc + cycle_duration + start_delay_in_seconds = time_delta.seconds + duration = cycle_duration.seconds - return 0 + return (cycles, start_delay_in_seconds, duration) + + def evaluated_timer_expression(self, my_task: SpiffTask) -> Any: + script_engine = my_task.workflow.script_engine + evaluated_expression = None + + if isinstance(self.timer_definition, TimerEventDefinition) and script_engine is not None: + evaluated_expression = script_engine.evaluate(my_task, self.timer_definition.expression) + return evaluated_expression class StartEventConverter(EventConverter): # type: ignore diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_workflow_service.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_workflow_service.py index 3428c60c..26537d92 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_workflow_service.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_workflow_service.py @@ -84,7 +84,7 @@ class TestWorkflowService(BaseTest): """, "no_tasks", ) - delay = WorkflowService.calculate_run_at_delay_in_seconds(workflow, now_in_utc) + _, delay, _ = WorkflowService.next_start_event_configuration(workflow, now_in_utc) # type: ignore assert delay == 0 def test_run_at_delay_is_30_for_30_second_duration_start_timer_event(self, now_in_utc: datetime) -> None: @@ -105,7 +105,7 @@ class TestWorkflowService(BaseTest): """, "Process_aldvgey", ) - delay = WorkflowService.calculate_run_at_delay_in_seconds(workflow, now_in_utc) + _, delay, _ = WorkflowService.next_start_event_configuration(workflow, now_in_utc) # type: ignore assert delay == 30 def test_run_at_delay_is_300_if_5_mins_before_date_start_timer_event( @@ -128,5 +128,7 @@ class TestWorkflowService(BaseTest): """, "Process_aldvgey", ) - delay = WorkflowService.calculate_run_at_delay_in_seconds(workflow, example_start_datetime_minus_5_mins_in_utc) + _, delay, _ = WorkflowService.next_start_event_configuration( + workflow, example_start_datetime_minus_5_mins_in_utc + ) # type: ignore assert delay == 300