From 59dcd3035d5929a70fdf3ed812436f11ddd485f4 Mon Sep 17 00:00:00 2001 From: -LAN- Date: Sun, 27 Apr 2025 17:23:51 +0800 Subject: [PATCH] refactor: Refactors repository imports structure Moves repository-related modules to a more organized 'core.workflow.repository' directory structure to improve maintainability and clarity. Updates import paths across various modules to reflect the new repository organization. Renames and relocates repository files for better consistency. Ensures all tests and modules correctly reference the updated paths. Signed-off-by: -LAN- --- api/core/app/apps/advanced_chat/app_generator.py | 4 ++-- .../app/apps/advanced_chat/generate_task_pipeline.py | 2 +- api/core/app/apps/workflow/app_generator.py | 4 ++-- api/core/app/apps/workflow/generate_task_pipeline.py | 2 +- api/core/app/task_pipeline/workflow_cycle_manage.py | 2 +- api/core/ops/langfuse_trace/langfuse_trace.py | 2 +- api/core/ops/langsmith_trace/langsmith_trace.py | 2 +- api/core/ops/opik_trace/opik_trace.py | 2 +- api/{ => core}/repositories/__init__.py | 2 +- api/{ => core}/repositories/repository_registry.py | 4 ++-- .../repositories/workflow_node_execution/__init__.py | 2 +- .../workflow_node_execution/sqlalchemy_repository.py | 2 +- api/core/{ => workflow}/repository/__init__.py | 4 ++-- .../{ => workflow}/repository/repository_factory.py | 2 +- .../repository/workflow_node_execution_repository.py | 0 api/extensions/ext_repositories.py | 2 +- api/services/workflow_run_service.py | 4 ++-- api/services/workflow_service.py | 2 +- api/tasks/remove_app_and_related_data_task.py | 2 +- .../test_sqlalchemy_repository.py | 12 ++++++------ 20 files changed, 29 insertions(+), 29 deletions(-) rename api/{ => core}/repositories/__init__.py (72%) rename api/{ => core}/repositories/repository_registry.py (95%) rename api/{ => core}/repositories/workflow_node_execution/__init__.py (51%) rename api/{ => core}/repositories/workflow_node_execution/sqlalchemy_repository.py (98%) rename api/core/{ => workflow}/repository/__init__.py (61%) rename api/core/{ => workflow}/repository/repository_factory.py (97%) rename api/core/{ => workflow}/repository/workflow_node_execution_repository.py (100%) diff --git a/api/core/app/apps/advanced_chat/app_generator.py b/api/core/app/apps/advanced_chat/app_generator.py index 6079b51daa..fd0d7fafbd 100644 --- a/api/core/app/apps/advanced_chat/app_generator.py +++ b/api/core/app/apps/advanced_chat/app_generator.py @@ -25,8 +25,8 @@ from core.app.entities.task_entities import ChatbotAppBlockingResponse, ChatbotA from core.model_runtime.errors.invoke import InvokeAuthorizationError from core.ops.ops_trace_manager import TraceQueueManager from core.prompt.utils.get_thread_messages_length import get_thread_messages_length -from core.repository import RepositoryFactory -from core.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository +from core.workflow.repository import RepositoryFactory +from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from extensions.ext_database import db from factories import file_factory from models.account import Account diff --git a/api/core/app/apps/advanced_chat/generate_task_pipeline.py b/api/core/app/apps/advanced_chat/generate_task_pipeline.py index 43ccaea9c0..1f4db54a9c 100644 --- a/api/core/app/apps/advanced_chat/generate_task_pipeline.py +++ b/api/core/app/apps/advanced_chat/generate_task_pipeline.py @@ -62,10 +62,10 @@ from core.app.task_pipeline.workflow_cycle_manage import WorkflowCycleManage from core.model_runtime.entities.llm_entities import LLMUsage from core.model_runtime.utils.encoders import jsonable_encoder from core.ops.ops_trace_manager import TraceQueueManager -from core.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from core.workflow.enums import SystemVariableKey from core.workflow.graph_engine.entities.graph_runtime_state import GraphRuntimeState from core.workflow.nodes import NodeType +from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from events.message_event import message_was_created from extensions.ext_database import db from models import Conversation, EndUser, Message, MessageFile diff --git a/api/core/app/apps/workflow/app_generator.py b/api/core/app/apps/workflow/app_generator.py index 6be3a7331d..9c3d78a338 100644 --- a/api/core/app/apps/workflow/app_generator.py +++ b/api/core/app/apps/workflow/app_generator.py @@ -23,8 +23,8 @@ from core.app.entities.app_invoke_entities import InvokeFrom, WorkflowAppGenerat from core.app.entities.task_entities import WorkflowAppBlockingResponse, WorkflowAppStreamResponse from core.model_runtime.errors.invoke import InvokeAuthorizationError from core.ops.ops_trace_manager import TraceQueueManager -from core.repository import RepositoryFactory -from core.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository +from core.workflow.repository import RepositoryFactory +from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from extensions.ext_database import db from factories import file_factory from models import Account, App, EndUser, Workflow diff --git a/api/core/app/apps/workflow/generate_task_pipeline.py b/api/core/app/apps/workflow/generate_task_pipeline.py index 68131a7463..67cad9c998 100644 --- a/api/core/app/apps/workflow/generate_task_pipeline.py +++ b/api/core/app/apps/workflow/generate_task_pipeline.py @@ -54,8 +54,8 @@ from core.app.entities.task_entities import ( from core.app.task_pipeline.based_generate_task_pipeline import BasedGenerateTaskPipeline from core.app.task_pipeline.workflow_cycle_manage import WorkflowCycleManage from core.ops.ops_trace_manager import TraceQueueManager -from core.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from core.workflow.enums import SystemVariableKey +from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from extensions.ext_database import db from models.account import Account from models.enums import CreatedByRole diff --git a/api/core/app/task_pipeline/workflow_cycle_manage.py b/api/core/app/task_pipeline/workflow_cycle_manage.py index 38e7c9eb12..d720eff73d 100644 --- a/api/core/app/task_pipeline/workflow_cycle_manage.py +++ b/api/core/app/task_pipeline/workflow_cycle_manage.py @@ -49,12 +49,12 @@ from core.file import FILE_MODEL_IDENTITY, File from core.model_runtime.utils.encoders import jsonable_encoder from core.ops.entities.trace_entity import TraceTaskName from core.ops.ops_trace_manager import TraceQueueManager, TraceTask -from core.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from core.tools.tool_manager import ToolManager from core.workflow.entities.node_entities import NodeRunMetadataKey from core.workflow.enums import SystemVariableKey from core.workflow.nodes import NodeType from core.workflow.nodes.tool.entities import ToolNodeData +from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from core.workflow.workflow_entry import WorkflowEntry from models.account import Account from models.enums import CreatedByRole, WorkflowRunTriggeredFrom diff --git a/api/core/ops/langfuse_trace/langfuse_trace.py b/api/core/ops/langfuse_trace/langfuse_trace.py index fa78b7b8e9..b229d244f7 100644 --- a/api/core/ops/langfuse_trace/langfuse_trace.py +++ b/api/core/ops/langfuse_trace/langfuse_trace.py @@ -29,7 +29,7 @@ from core.ops.langfuse_trace.entities.langfuse_trace_entity import ( UnitEnum, ) from core.ops.utils import filter_none_values -from core.repository.repository_factory import RepositoryFactory +from core.workflow.repository.repository_factory import RepositoryFactory from extensions.ext_database import db from models.model import EndUser diff --git a/api/core/ops/langsmith_trace/langsmith_trace.py b/api/core/ops/langsmith_trace/langsmith_trace.py index 85a0eafdc1..78a51ff36e 100644 --- a/api/core/ops/langsmith_trace/langsmith_trace.py +++ b/api/core/ops/langsmith_trace/langsmith_trace.py @@ -28,7 +28,7 @@ from core.ops.langsmith_trace.entities.langsmith_trace_entity import ( LangSmithRunUpdateModel, ) from core.ops.utils import filter_none_values, generate_dotted_order -from core.repository.repository_factory import RepositoryFactory +from core.workflow.repository.repository_factory import RepositoryFactory from extensions.ext_database import db from models.model import EndUser, MessageFile diff --git a/api/core/ops/opik_trace/opik_trace.py b/api/core/ops/opik_trace/opik_trace.py index 923b9a24ed..a14b5afb8e 100644 --- a/api/core/ops/opik_trace/opik_trace.py +++ b/api/core/ops/opik_trace/opik_trace.py @@ -22,7 +22,7 @@ from core.ops.entities.trace_entity import ( TraceTaskName, WorkflowTraceInfo, ) -from core.repository.repository_factory import RepositoryFactory +from core.workflow.repository.repository_factory import RepositoryFactory from extensions.ext_database import db from models.model import EndUser, MessageFile diff --git a/api/repositories/__init__.py b/api/core/repositories/__init__.py similarity index 72% rename from api/repositories/__init__.py rename to api/core/repositories/__init__.py index 4cc339688b..5c70d50cde 100644 --- a/api/repositories/__init__.py +++ b/api/core/repositories/__init__.py @@ -2,5 +2,5 @@ Repository implementations for data access. This package contains concrete implementations of the repository interfaces -defined in the core.repository package. +defined in the core.workflow.repository package. """ diff --git a/api/repositories/repository_registry.py b/api/core/repositories/repository_registry.py similarity index 95% rename from api/repositories/repository_registry.py rename to api/core/repositories/repository_registry.py index aa0a208d8e..b66f3ba8e6 100644 --- a/api/repositories/repository_registry.py +++ b/api/core/repositories/repository_registry.py @@ -11,9 +11,9 @@ from typing import Any from sqlalchemy.orm import sessionmaker from configs import dify_config -from core.repository.repository_factory import RepositoryFactory +from core.repositories.workflow_node_execution import SQLAlchemyWorkflowNodeExecutionRepository +from core.workflow.repository.repository_factory import RepositoryFactory from extensions.ext_database import db -from repositories.workflow_node_execution import SQLAlchemyWorkflowNodeExecutionRepository logger = logging.getLogger(__name__) diff --git a/api/repositories/workflow_node_execution/__init__.py b/api/core/repositories/workflow_node_execution/__init__.py similarity index 51% rename from api/repositories/workflow_node_execution/__init__.py rename to api/core/repositories/workflow_node_execution/__init__.py index eed827bd05..76e8282b7d 100644 --- a/api/repositories/workflow_node_execution/__init__.py +++ b/api/core/repositories/workflow_node_execution/__init__.py @@ -2,7 +2,7 @@ WorkflowNodeExecution repository implementations. """ -from repositories.workflow_node_execution.sqlalchemy_repository import SQLAlchemyWorkflowNodeExecutionRepository +from core.repositories.workflow_node_execution.sqlalchemy_repository import SQLAlchemyWorkflowNodeExecutionRepository __all__ = [ "SQLAlchemyWorkflowNodeExecutionRepository", diff --git a/api/repositories/workflow_node_execution/sqlalchemy_repository.py b/api/core/repositories/workflow_node_execution/sqlalchemy_repository.py similarity index 98% rename from api/repositories/workflow_node_execution/sqlalchemy_repository.py rename to api/core/repositories/workflow_node_execution/sqlalchemy_repository.py index e0ad384be6..b1d37163a4 100644 --- a/api/repositories/workflow_node_execution/sqlalchemy_repository.py +++ b/api/core/repositories/workflow_node_execution/sqlalchemy_repository.py @@ -10,7 +10,7 @@ from sqlalchemy import UnaryExpression, asc, delete, desc, select from sqlalchemy.engine import Engine from sqlalchemy.orm import sessionmaker -from core.repository.workflow_node_execution_repository import OrderConfig +from core.workflow.repository.workflow_node_execution_repository import OrderConfig from models.workflow import WorkflowNodeExecution, WorkflowNodeExecutionStatus, WorkflowNodeExecutionTriggeredFrom logger = logging.getLogger(__name__) diff --git a/api/core/repository/__init__.py b/api/core/workflow/repository/__init__.py similarity index 61% rename from api/core/repository/__init__.py rename to api/core/workflow/repository/__init__.py index 253df1251d..d91506e72f 100644 --- a/api/core/repository/__init__.py +++ b/api/core/workflow/repository/__init__.py @@ -6,8 +6,8 @@ for accessing and manipulating data, regardless of the underlying storage mechanism. """ -from core.repository.repository_factory import RepositoryFactory -from core.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository +from core.workflow.repository.repository_factory import RepositoryFactory +from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository __all__ = [ "RepositoryFactory", diff --git a/api/core/repository/repository_factory.py b/api/core/workflow/repository/repository_factory.py similarity index 97% rename from api/core/repository/repository_factory.py rename to api/core/workflow/repository/repository_factory.py index 7da7e49055..45d6f5d842 100644 --- a/api/core/repository/repository_factory.py +++ b/api/core/workflow/repository/repository_factory.py @@ -8,7 +8,7 @@ It does not contain any implementation details or dependencies on specific repos from collections.abc import Callable, Mapping from typing import Any, Literal, Optional, cast -from core.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository +from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository # Type for factory functions - takes a dict of parameters and returns any repository type RepositoryFactoryFunc = Callable[[Mapping[str, Any]], Any] diff --git a/api/core/repository/workflow_node_execution_repository.py b/api/core/workflow/repository/workflow_node_execution_repository.py similarity index 100% rename from api/core/repository/workflow_node_execution_repository.py rename to api/core/workflow/repository/workflow_node_execution_repository.py diff --git a/api/extensions/ext_repositories.py b/api/extensions/ext_repositories.py index 27d8408ec1..b8cfea121b 100644 --- a/api/extensions/ext_repositories.py +++ b/api/extensions/ext_repositories.py @@ -4,8 +4,8 @@ Extension for initializing repositories. This extension registers repository implementations with the RepositoryFactory. """ +from core.repositories.repository_registry import register_repositories from dify_app import DifyApp -from repositories.repository_registry import register_repositories def init_app(_app: DifyApp) -> None: diff --git a/api/services/workflow_run_service.py b/api/services/workflow_run_service.py index 8b7213eefb..f7c4f500a8 100644 --- a/api/services/workflow_run_service.py +++ b/api/services/workflow_run_service.py @@ -2,8 +2,8 @@ import threading from typing import Optional import contexts -from core.repository import RepositoryFactory -from core.repository.workflow_node_execution_repository import OrderConfig +from core.workflow.repository import RepositoryFactory +from core.workflow.repository.workflow_node_execution_repository import OrderConfig from extensions.ext_database import db from libs.infinite_scroll_pagination import InfiniteScrollPagination from models.enums import WorkflowRunTriggeredFrom diff --git a/api/services/workflow_service.py b/api/services/workflow_service.py index 63e3791147..ebe65e5d5f 100644 --- a/api/services/workflow_service.py +++ b/api/services/workflow_service.py @@ -11,7 +11,6 @@ from sqlalchemy.orm import Session from core.app.apps.advanced_chat.app_config_manager import AdvancedChatAppConfigManager from core.app.apps.workflow.app_config_manager import WorkflowAppConfigManager from core.model_runtime.utils.encoders import jsonable_encoder -from core.repository import RepositoryFactory from core.variables import Variable from core.workflow.entities.node_entities import NodeRunResult from core.workflow.errors import WorkflowNodeRunFailedError @@ -22,6 +21,7 @@ from core.workflow.nodes.enums import ErrorStrategy from core.workflow.nodes.event import RunCompletedEvent from core.workflow.nodes.event.types import NodeEvent from core.workflow.nodes.node_mapping import LATEST_VERSION, NODE_TYPE_CLASSES_MAPPING +from core.workflow.repository import RepositoryFactory from core.workflow.workflow_entry import WorkflowEntry from events.app_event import app_draft_workflow_was_synced, app_published_workflow_was_updated from extensions.ext_database import db diff --git a/api/tasks/remove_app_and_related_data_task.py b/api/tasks/remove_app_and_related_data_task.py index cd8981abf6..dedf1c5334 100644 --- a/api/tasks/remove_app_and_related_data_task.py +++ b/api/tasks/remove_app_and_related_data_task.py @@ -7,7 +7,7 @@ from celery import shared_task # type: ignore from sqlalchemy import delete from sqlalchemy.exc import SQLAlchemyError -from core.repository import RepositoryFactory +from core.workflow.repository import RepositoryFactory from extensions.ext_database import db from models.dataset import AppDatasetJoin from models.model import ( diff --git a/api/tests/unit_tests/repositories/workflow_node_execution/test_sqlalchemy_repository.py b/api/tests/unit_tests/repositories/workflow_node_execution/test_sqlalchemy_repository.py index 36847f8a13..c16b453cba 100644 --- a/api/tests/unit_tests/repositories/workflow_node_execution/test_sqlalchemy_repository.py +++ b/api/tests/unit_tests/repositories/workflow_node_execution/test_sqlalchemy_repository.py @@ -8,9 +8,9 @@ import pytest from pytest_mock import MockerFixture from sqlalchemy.orm import Session, sessionmaker -from core.repository.workflow_node_execution_repository import OrderConfig +from core.repositories.workflow_node_execution.sqlalchemy_repository import SQLAlchemyWorkflowNodeExecutionRepository +from core.workflow.repository.workflow_node_execution_repository import OrderConfig from models.workflow import WorkflowNodeExecution -from repositories.workflow_node_execution.sqlalchemy_repository import SQLAlchemyWorkflowNodeExecutionRepository @pytest.fixture @@ -80,7 +80,7 @@ def test_get_by_node_execution_id(repository, session, mocker: MockerFixture): """Test get_by_node_execution_id method.""" session_obj, _ = session # Set up mock - mock_select = mocker.patch("repositories.workflow_node_execution.sqlalchemy_repository.select") + mock_select = mocker.patch("core.repositories.workflow_node_execution.sqlalchemy_repository.select") mock_stmt = mocker.MagicMock() mock_select.return_value = mock_stmt mock_stmt.where.return_value = mock_stmt @@ -99,7 +99,7 @@ def test_get_by_workflow_run(repository, session, mocker: MockerFixture): """Test get_by_workflow_run method.""" session_obj, _ = session # Set up mock - mock_select = mocker.patch("repositories.workflow_node_execution.sqlalchemy_repository.select") + mock_select = mocker.patch("core.repositories.workflow_node_execution.sqlalchemy_repository.select") mock_stmt = mocker.MagicMock() mock_select.return_value = mock_stmt mock_stmt.where.return_value = mock_stmt @@ -120,7 +120,7 @@ def test_get_running_executions(repository, session, mocker: MockerFixture): """Test get_running_executions method.""" session_obj, _ = session # Set up mock - mock_select = mocker.patch("repositories.workflow_node_execution.sqlalchemy_repository.select") + mock_select = mocker.patch("core.repositories.workflow_node_execution.sqlalchemy_repository.select") mock_stmt = mocker.MagicMock() mock_select.return_value = mock_stmt mock_stmt.where.return_value = mock_stmt @@ -158,7 +158,7 @@ def test_clear(repository, session, mocker: MockerFixture): """Test clear method.""" session_obj, _ = session # Set up mock - mock_delete = mocker.patch("repositories.workflow_node_execution.sqlalchemy_repository.delete") + mock_delete = mocker.patch("core.repositories.workflow_node_execution.sqlalchemy_repository.delete") mock_stmt = mocker.MagicMock() mock_delete.return_value = mock_stmt mock_stmt.where.return_value = mock_stmt