From 05db262842a2fa6c2479070f1ff084cf05f34181 Mon Sep 17 00:00:00 2001 From: CI Test Date: Tue, 30 Jun 2026 18:08:50 +0800 Subject: [PATCH] style: apply isort formatting to pass CI validation --- alembic/versions/007_add_editing_mode.py | 3 ++- .../versions/009_remove_workspace_concept.py | 3 ++- alembic/versions/010_phase0_extensibility.py | 3 ++- alembic/versions/011_phase1_core_refactor.py | 3 ++- .../versions/012_add_duplication_tables.py | 3 ++- alembic/versions/013_add_recipe_tables.py | 3 ++- alembic/versions/014_add_template_tables.py | 3 ++- apps/api/app/api/router.py | 12 +++++----- apps/api/app/api/routes/duplication.py | 2 +- apps/api/app/api/routes/recipes.py | 6 ++--- apps/api/app/api/routes/subscription.py | 4 ++-- apps/api/app/api/routes/templates.py | 8 +++---- apps/api/app/api/routes/titles.py | 8 +++---- apps/api/app/api/routes/upload.py | 4 +--- apps/api/app/api/routes/voices.py | 10 ++++---- apps/api/app/core/database.py | 4 ++-- apps/api/app/dependencies.py | 24 +++++++++---------- apps/api/app/middleware/prometheus_metrics.py | 4 ++-- apps/worker/video_processing/dedup.py | 5 ++-- .../worker/worker_app/tasks/classification.py | 8 +++---- apps/worker/worker_app/tasks/generation.py | 11 +++++---- apps/worker/worker_app/tasks/ingest.py | 1 - .../worker_app/tasks/voice_extraction.py | 5 ++-- packages/adapters/sqlalchemy_impl/models.py | 2 +- .../sqlalchemy_impl/project_repository.py | 2 +- .../sqlalchemy_impl/recipe_repository.py | 2 +- packages/application/__init__.py | 8 +++---- packages/application/auth/__init__.py | 22 ++++++++--------- .../application/title_library/__init__.py | 4 ++-- .../application/voice_library/__init__.py | 4 ++-- packages/domain/__init__.py | 2 +- packages/domain/auth/__init__.py | 2 +- packages/infrastructure/__init__.py | 2 +- packages/shared/storage.py | 2 +- scripts/smoke_public_auth_flow.py | 2 +- scripts/smoke_public_boundary_flow.py | 2 +- scripts/smoke_public_upload_flow.py | 2 +- scripts/smoke_test.py | 4 ++-- .../test_duplication_upload_error_handling.py | 2 +- tests/integration/test_subscription_api.py | 4 +++- tests/unit/test_asset_diagnosis.py | 3 +-- tests/unit/test_auth.py | 2 +- tests/unit/test_title_library_use_cases.py | 4 ++-- tests/unit/test_voice_library_use_cases.py | 6 ++--- 44 files changed, 112 insertions(+), 108 deletions(-) diff --git a/alembic/versions/007_add_editing_mode.py b/alembic/versions/007_add_editing_mode.py index 3ab6884cf..e71aacd6e 100755 --- a/alembic/versions/007_add_editing_mode.py +++ b/alembic/versions/007_add_editing_mode.py @@ -5,9 +5,10 @@ Revises: 006 Create Date: 2026-06-26 """ -from alembic import op import sqlalchemy as sa +from alembic import op + # revision identifiers revision = "007" down_revision = "006" diff --git a/alembic/versions/009_remove_workspace_concept.py b/alembic/versions/009_remove_workspace_concept.py index f41a4bd26..9e1c04d13 100644 --- a/alembic/versions/009_remove_workspace_concept.py +++ b/alembic/versions/009_remove_workspace_concept.py @@ -12,10 +12,11 @@ This migration: 5. Drops workspace-related tables: workspaces, workspace_members, workspace_invitations """ -from alembic import op import sqlalchemy as sa from sqlalchemy import text +from alembic import op + # revision identifiers revision = "009" down_revision = "008" diff --git a/alembic/versions/010_phase0_extensibility.py b/alembic/versions/010_phase0_extensibility.py index 66096b032..c70dbbafa 100644 --- a/alembic/versions/010_phase0_extensibility.py +++ b/alembic/versions/010_phase0_extensibility.py @@ -11,9 +11,10 @@ This migration: 3. Creates voice_libraries table (配音库,支持 AI 配音管理) """ -from alembic import op import sqlalchemy as sa +from alembic import op + # revision identifiers revision = "010" down_revision = "009" diff --git a/alembic/versions/011_phase1_core_refactor.py b/alembic/versions/011_phase1_core_refactor.py index 5d337101e..ad71c6bb9 100644 --- a/alembic/versions/011_phase1_core_refactor.py +++ b/alembic/versions/011_phase1_core_refactor.py @@ -15,9 +15,10 @@ This migration: 2. Removes edit_plan_id column from generation_tasks table """ -from alembic import op import sqlalchemy as sa +from alembic import op + # revision identifiers revision = "011" down_revision = "010" diff --git a/alembic/versions/012_add_duplication_tables.py b/alembic/versions/012_add_duplication_tables.py index 97a4cce43..696a6cff2 100644 --- a/alembic/versions/012_add_duplication_tables.py +++ b/alembic/versions/012_add_duplication_tables.py @@ -9,9 +9,10 @@ This migration creates two new tables: 2. duplication_segments — 重复片段详情表 """ -from alembic import op import sqlalchemy as sa +from alembic import op + # revision identifiers revision = "012" down_revision = "011" diff --git a/alembic/versions/013_add_recipe_tables.py b/alembic/versions/013_add_recipe_tables.py index d74f077c0..e561a12b1 100644 --- a/alembic/versions/013_add_recipe_tables.py +++ b/alembic/versions/013_add_recipe_tables.py @@ -9,9 +9,10 @@ This migration creates two new tables: 2. recipe_items — 配方素材项表 """ -from alembic import op import sqlalchemy as sa +from alembic import op + # revision identifiers revision = "013" down_revision = "012" diff --git a/alembic/versions/014_add_template_tables.py b/alembic/versions/014_add_template_tables.py index 619835f99..cde2679f9 100644 --- a/alembic/versions/014_add_template_tables.py +++ b/alembic/versions/014_add_template_tables.py @@ -10,9 +10,10 @@ This migration creates three new tables: 3. template_categories — 模板分类表 """ -from alembic import op import sqlalchemy as sa +from alembic import op + # revision identifiers revision = "014" down_revision = "013" diff --git a/apps/api/app/api/router.py b/apps/api/app/api/router.py index aa3505b5f..74e0653d6 100644 --- a/apps/api/app/api/router.py +++ b/apps/api/app/api/router.py @@ -1,23 +1,23 @@ -from app.api.routes.dashboard import router as dashboard_router from app.api.routes.asset_diagnosis import router as asset_diagnosis_router from app.api.routes.asset_libraries import router as asset_libraries_router from app.api.routes.assets import router as assets_router from app.api.routes.auth import router as auth_router from app.api.routes.chunked_upload import router as chunked_upload_router from app.api.routes.classification_jobs import router as classification_jobs_router +from app.api.routes.dashboard import router as dashboard_router from app.api.routes.duplication import router as duplication_router from app.api.routes.generated_videos import router as generated_videos_router -from app.api.routes.recipes import router as recipes_router -from app.api.routes.subscription import router as subscription_router -from app.api.routes.templates import router as templates_router -from app.api.routes.titles import router as titles_router -from app.api.routes.voices import router as voices_router from app.api.routes.generation_tasks import router as generation_tasks_router from app.api.routes.health import router as health_check_router from app.api.routes.ingest_jobs import router as ingest_jobs_router from app.api.routes.projects import router as projects_router +from app.api.routes.recipes import router as recipes_router +from app.api.routes.subscription import router as subscription_router from app.api.routes.task_center import router as task_center_router +from app.api.routes.templates import router as templates_router +from app.api.routes.titles import router as titles_router from app.api.routes.upload import router as upload_router +from app.api.routes.voices import router as voices_router from fastapi import APIRouter api_router = APIRouter(prefix="/api/v1") diff --git a/apps/api/app/api/routes/duplication.py b/apps/api/app/api/routes/duplication.py index 4e4616e7e..3b19b227d 100644 --- a/apps/api/app/api/routes/duplication.py +++ b/apps/api/app/api/routes/duplication.py @@ -10,10 +10,10 @@ from app.auth import AuthenticatedUser, get_current_user from app.core.storage import OSSStorageService, get_storage_service from app.dependencies import get_duplication_repository from app.schemas.duplication import ( + DuplicateSegmentResponse, DuplicationDetailResponse, DuplicationRecordResponse, DuplicationUploadResponse, - DuplicateSegmentResponse, ) from fastapi import APIRouter, Depends, File, HTTPException, Response, UploadFile, status diff --git a/apps/api/app/api/routes/recipes.py b/apps/api/app/api/routes/recipes.py index f00daf11d..ee5e50f31 100644 --- a/apps/api/app/api/routes/recipes.py +++ b/apps/api/app/api/routes/recipes.py @@ -4,9 +4,6 @@ from __future__ import annotations from typing import List -from fastapi import APIRouter, Depends, HTTPException, Query, Response, status -from sqlalchemy.orm import Session - from app.auth import AuthenticatedUser, get_current_user from app.dependencies import get_db_session, get_user_repository from app.schemas.recipe import ( @@ -17,6 +14,9 @@ from app.schemas.recipe import ( UpdateRecipeRequest, UseRecipeResponse, ) +from fastapi import APIRouter, Depends, HTTPException, Query, Response, status +from sqlalchemy.orm import Session + from packages.adapters.sqlalchemy_impl.recipe_repository import SQLAlchemyRecipeRepository from packages.application.recipe.commands import ( CreateRecipeCommand, diff --git a/apps/api/app/api/routes/subscription.py b/apps/api/app/api/routes/subscription.py index 48b9d310b..5d67ff46c 100644 --- a/apps/api/app/api/routes/subscription.py +++ b/apps/api/app/api/routes/subscription.py @@ -6,8 +6,6 @@ from dataclasses import replace from datetime import datetime, timezone from typing import List -from fastapi import APIRouter, Depends, HTTPException, status - from app.auth import AuthenticatedUser, get_current_user from app.dependencies import get_user_repository from app.schemas.subscription import ( @@ -18,6 +16,8 @@ from app.schemas.subscription import ( SubscriptionInfo, ToggleAutoRenewRequest, ) +from fastapi import APIRouter, Depends, HTTPException, status + from packages.ports.user_repository import UserRepository router = APIRouter() diff --git a/apps/api/app/api/routes/templates.py b/apps/api/app/api/routes/templates.py index 7b8849bdc..056278150 100644 --- a/apps/api/app/api/routes/templates.py +++ b/apps/api/app/api/routes/templates.py @@ -4,15 +4,13 @@ from __future__ import annotations from typing import List -from fastapi import APIRouter, Depends, HTTPException, Query, Response, status -from sqlalchemy.orm import Session - from app.auth import AuthenticatedUser, get_current_user from app.dependencies import get_db_session from app.schemas.template import ( CategoryResponse, CreateCategoryRequest, CreateTemplateRequest, + GenerateWarningResponse, ListCategoriesResponse, ListTemplatesResponse, SegmentResponse, @@ -20,8 +18,10 @@ from app.schemas.template import ( UpdateTemplateRequest, ValidateTemplateRequest, ValidateTemplateResponse, - GenerateWarningResponse, ) +from fastapi import APIRouter, Depends, HTTPException, Query, Response, status +from sqlalchemy.orm import Session + from packages.adapters.sqlalchemy_impl.template_repository import SQLAlchemyTemplateRepository from packages.application.template.commands import ( CreateCategoryCommand, diff --git a/apps/api/app/api/routes/titles.py b/apps/api/app/api/routes/titles.py index 634668e8e..b55c8e7f5 100644 --- a/apps/api/app/api/routes/titles.py +++ b/apps/api/app/api/routes/titles.py @@ -4,8 +4,6 @@ from __future__ import annotations from typing import Optional -from fastapi import APIRouter, Depends, HTTPException, Query, Response, status - from app.auth import AuthenticatedUser, get_current_user from app.dependencies import get_db_session, get_user_repository from app.schemas.title_library import ( @@ -14,6 +12,9 @@ from app.schemas.title_library import ( TitleLibraryItemResponse, UpdateTitleLibraryRequest, ) +from fastapi import APIRouter, Depends, HTTPException, Query, Response, status +from sqlalchemy.orm import Session + from packages.adapters.sqlalchemy_impl.title_library_repository import SQLAlchemyTitleLibraryRepository from packages.application.title_library.commands import CreateTitleLibraryCommand, UpdateTitleLibraryCommand from packages.application.title_library.use_cases import ( @@ -21,12 +22,11 @@ from packages.application.title_library.use_cases import ( DeleteTitleLibraryUseCase, GetTitleLibraryUseCase, ListTitleLibraryUseCase, - UpdateTitleLibraryUseCase, NotFoundError, QuotaExceededError, + UpdateTitleLibraryUseCase, ) from packages.ports.user_repository import UserRepository -from sqlalchemy.orm import Session router = APIRouter() diff --git a/apps/api/app/api/routes/upload.py b/apps/api/app/api/routes/upload.py index 65228168b..38a0d536d 100644 --- a/apps/api/app/api/routes/upload.py +++ b/apps/api/app/api/routes/upload.py @@ -1,5 +1,5 @@ import logging -from typing import Any +from typing import Annotated, Any from uuid import uuid4 from app.auth import AuthenticatedUser, get_current_user @@ -19,8 +19,6 @@ from app.schemas.upload import ( UploadAssetRequest, UploadAssetResponse, ) -from typing import Annotated - from fastapi import APIRouter, Depends, File, Form, HTTPException, UploadFile, status from packages.application import GetProjectUseCase, SubmitIngestJobCommand, SubmitIngestJobUseCase diff --git a/apps/api/app/api/routes/voices.py b/apps/api/app/api/routes/voices.py index 1512c6867..d2f41482e 100644 --- a/apps/api/app/api/routes/voices.py +++ b/apps/api/app/api/routes/voices.py @@ -4,16 +4,17 @@ from __future__ import annotations from typing import Optional -from fastapi import APIRouter, Depends, HTTPException, Query, Response, status - from app.auth import AuthenticatedUser, get_current_user from app.dependencies import get_db_session, get_user_repository from app.schemas.voice_library import ( CreateVoiceLibraryRequest, ListVoiceLibraryResponse, - VoiceLibraryItemResponse, UpdateVoiceLibraryRequest, + VoiceLibraryItemResponse, ) +from fastapi import APIRouter, Depends, HTTPException, Query, Response, status +from sqlalchemy.orm import Session + from packages.adapters.sqlalchemy_impl.voice_library_repository import SQLAlchemyVoiceLibraryRepository from packages.application.voice_library.commands import CreateVoiceLibraryCommand, UpdateVoiceLibraryCommand from packages.application.voice_library.use_cases import ( @@ -21,12 +22,11 @@ from packages.application.voice_library.use_cases import ( DeleteVoiceLibraryUseCase, GetVoiceLibraryUseCase, ListVoiceLibraryUseCase, - UpdateVoiceLibraryUseCase, NotFoundError, QuotaExceededError, + UpdateVoiceLibraryUseCase, ) from packages.ports.user_repository import UserRepository -from sqlalchemy.orm import Session router = APIRouter() diff --git a/apps/api/app/core/database.py b/apps/api/app/core/database.py index 82149f15c..4b431c89c 100644 --- a/apps/api/app/core/database.py +++ b/apps/api/app/core/database.py @@ -3,12 +3,12 @@ 统一使用 app.config 中的数据库配置,移除重复的 DatabaseSettings。 """ -from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker, Session from contextlib import contextmanager from typing import Generator from app.config import settings +from sqlalchemy import create_engine +from sqlalchemy.orm import Session, sessionmaker engine = create_engine( settings.database_url, diff --git a/apps/api/app/dependencies.py b/apps/api/app/dependencies.py index 5c3b4a7bb..7b956e2fd 100644 --- a/apps/api/app/dependencies.py +++ b/apps/api/app/dependencies.py @@ -6,9 +6,9 @@ ensuring proper lifecycle management and testability. from __future__ import annotations -import redis from typing import Generator +import redis from app.config import settings from fastapi import Depends from sqlalchemy.orm import Session @@ -31,12 +31,6 @@ from packages.adapters.sqlalchemy_impl.generated_video_repository import ( from packages.adapters.sqlalchemy_impl.generation_task_repository import ( SQLAlchemyGenerationTaskRepository, ) -from packages.adapters.sqlalchemy_impl.title_library_repository import ( - SQLAlchemyTitleLibraryRepository, -) -from packages.adapters.sqlalchemy_impl.voice_library_repository import ( - SQLAlchemyVoiceLibraryRepository, -) from packages.adapters.sqlalchemy_impl.ingest_job_repository import ( SQLAlchemyIngestJobRepository, ) @@ -44,18 +38,24 @@ from packages.adapters.sqlalchemy_impl.project_repository import ( SQLAlchemyProjectRepository, ) from packages.adapters.sqlalchemy_impl.session import build_session_factory +from packages.adapters.sqlalchemy_impl.title_library_repository import ( + SQLAlchemyTitleLibraryRepository, +) from packages.adapters.sqlalchemy_impl.user_repository import SQLAlchemyUserRepository -from packages.ports.asset_repository import AssetRepository +from packages.adapters.sqlalchemy_impl.voice_library_repository import ( + SQLAlchemyVoiceLibraryRepository, +) from packages.ports.asset_library_repository import AssetLibraryRepository -from packages.ports.user_repository import UserRepository +from packages.ports.asset_repository import AssetRepository from packages.ports.classification_job_repository import ClassificationJobRepository from packages.ports.duplication_repository import DuplicationRecordRepository -from packages.ports.generation_task_repository import GenerationTaskRepository -from packages.ports.title_library_repository import TitleLibraryRepository -from packages.ports.voice_library_repository import VoiceLibraryRepository from packages.ports.generated_video_repository import GeneratedVideoRepository +from packages.ports.generation_task_repository import GenerationTaskRepository from packages.ports.ingest_job_repository import IngestJobRepository from packages.ports.project_repository import ProjectRepository +from packages.ports.title_library_repository import TitleLibraryRepository +from packages.ports.user_repository import UserRepository +from packages.ports.voice_library_repository import VoiceLibraryRepository _engine, _SessionLocal = build_session_factory(settings.DATABASE_URL) diff --git a/apps/api/app/middleware/prometheus_metrics.py b/apps/api/app/middleware/prometheus_metrics.py index a571cee44..2c61cec47 100644 --- a/apps/api/app/middleware/prometheus_metrics.py +++ b/apps/api/app/middleware/prometheus_metrics.py @@ -14,12 +14,12 @@ from typing import Callable from fastapi import Request, Response from prometheus_client import ( + CONTENT_TYPE_LATEST, + REGISTRY, Counter, Gauge, Histogram, generate_latest, - CONTENT_TYPE_LATEST, - REGISTRY, ) from starlette.middleware.base import BaseHTTPMiddleware from starlette.responses import PlainTextResponse diff --git a/apps/worker/video_processing/dedup.py b/apps/worker/video_processing/dedup.py index 852a3c764..da2279e66 100644 --- a/apps/worker/video_processing/dedup.py +++ b/apps/worker/video_processing/dedup.py @@ -13,13 +13,12 @@ import cv2 import numpy as np from celery import Task from sqlalchemy.orm import Session +from worker_app.celery_app import celery_app +from worker_app.db import SessionLocal from packages.adapters.sqlalchemy_impl.generated_video_repository import SQLAlchemyGeneratedVideoRepository from packages.shared.storage import get_storage_service -from worker_app.celery_app import celery_app -from worker_app.db import SessionLocal - logger = logging.getLogger(__name__) diff --git a/apps/worker/worker_app/tasks/classification.py b/apps/worker/worker_app/tasks/classification.py index de6460c7f..65ffff9ee 100755 --- a/apps/worker/worker_app/tasks/classification.py +++ b/apps/worker/worker_app/tasks/classification.py @@ -1,19 +1,19 @@ from celery import Task from celery.utils.log import get_task_logger +from worker_app.celery_app import celery_app -from packages.adapters.sqlalchemy_impl.classification_job_repository import ( - SQLAlchemyClassificationJobRepository, -) from packages.adapters.sqlalchemy_impl.asset_repository import ( SQLAlchemyAssetRepository, ) +from packages.adapters.sqlalchemy_impl.classification_job_repository import ( + SQLAlchemyClassificationJobRepository, +) from packages.domain import ( ClassificationJob, ClassificationJobStatus, ClassificationStatus, ) -from worker_app.celery_app import celery_app from .asset_analyzer import classify_asset_real logger = get_task_logger(__name__) diff --git a/apps/worker/worker_app/tasks/generation.py b/apps/worker/worker_app/tasks/generation.py index 1a7b77da5..373a29913 100755 --- a/apps/worker/worker_app/tasks/generation.py +++ b/apps/worker/worker_app/tasks/generation.py @@ -9,11 +9,10 @@ import shutil import subprocess # nosec B404 import tempfile from pathlib import Path -from urllib.parse import urlparse from typing import Optional +from urllib.parse import urlparse import oss2 - from worker_app.celery_app import celery_app OUTPUT_WIDTH = 1280 @@ -154,9 +153,10 @@ def _download_library_assets( """ # 导入模型和会话 try: - from packages.adapters.sqlalchemy_impl.models import AssetModel from worker_app.db import SessionLocal + from packages.adapters.sqlalchemy_impl.models import AssetModel + session = SessionLocal() try: @@ -241,11 +241,12 @@ def generate_video(self, task_id: str) -> dict: Returns: 生成结果字典 """ - from packages.domain import EditingMode, GeneratedVideo, GenerationTaskStatus + from worker_app.db import SessionLocal + from packages.adapters.sqlalchemy_impl.generation_task_repository import ( SQLAlchemyGenerationTaskRepository, ) - from worker_app.db import SessionLocal + from packages.domain import EditingMode, GeneratedVideo, GenerationTaskStatus # 从数据库加载任务信息 session = SessionLocal() diff --git a/apps/worker/worker_app/tasks/ingest.py b/apps/worker/worker_app/tasks/ingest.py index 096bafea3..d0d4683f7 100755 --- a/apps/worker/worker_app/tasks/ingest.py +++ b/apps/worker/worker_app/tasks/ingest.py @@ -5,7 +5,6 @@ from typing import Optional from celery import Celery from celery.app.task import Task from celery.utils.log import get_task_logger - from worker_app.celery_app import celery_app from worker_app.core.asset_types import infer_mime_type_from_storage_key from worker_app.db import SessionLocal diff --git a/apps/worker/worker_app/tasks/voice_extraction.py b/apps/worker/worker_app/tasks/voice_extraction.py index f31196478..994954596 100644 --- a/apps/worker/worker_app/tasks/voice_extraction.py +++ b/apps/worker/worker_app/tasks/voice_extraction.py @@ -9,13 +9,12 @@ from typing import Optional from celery import Task from sqlalchemy.orm import Session +from worker_app.celery_app import celery_app +from worker_app.db import SessionLocal from packages.adapters.sqlalchemy_impl.asset_repository import SQLAlchemyAssetRepository from packages.shared.storage import get_storage_service -from worker_app.celery_app import celery_app -from worker_app.db import SessionLocal - logger = logging.getLogger(__name__) diff --git a/packages/adapters/sqlalchemy_impl/models.py b/packages/adapters/sqlalchemy_impl/models.py index c0a5907ec..961f9359f 100755 --- a/packages/adapters/sqlalchemy_impl/models.py +++ b/packages/adapters/sqlalchemy_impl/models.py @@ -1,6 +1,6 @@ from datetime import datetime, timezone -from sqlalchemy import Boolean, Column, DateTime, Float, Integer, String, Text, JSON, UniqueConstraint, create_engine +from sqlalchemy import JSON, Boolean, Column, DateTime, Float, Integer, String, Text, UniqueConstraint, create_engine from sqlalchemy.orm import declarative_base Base = declarative_base() diff --git a/packages/adapters/sqlalchemy_impl/project_repository.py b/packages/adapters/sqlalchemy_impl/project_repository.py index 33012801b..5444861b7 100644 --- a/packages/adapters/sqlalchemy_impl/project_repository.py +++ b/packages/adapters/sqlalchemy_impl/project_repository.py @@ -52,7 +52,7 @@ class SQLAlchemyProjectRepository: def find_accessible_projects(self, user_id: str) -> list[Project]: """查找用户可访问的所有项目(自己拥有的 + 被共享的)""" - from sqlalchemy import or_, cast + from sqlalchemy import cast, or_ from sqlalchemy.dialects.postgresql import JSONB models = ( diff --git a/packages/adapters/sqlalchemy_impl/recipe_repository.py b/packages/adapters/sqlalchemy_impl/recipe_repository.py index 2687fcfc0..1f3dbc197 100644 --- a/packages/adapters/sqlalchemy_impl/recipe_repository.py +++ b/packages/adapters/sqlalchemy_impl/recipe_repository.py @@ -6,7 +6,7 @@ from typing import List, Optional from sqlalchemy.orm import Session -from packages.adapters.sqlalchemy_impl.models import RecipeModel, RecipeItemModel +from packages.adapters.sqlalchemy_impl.models import RecipeItemModel, RecipeModel from packages.domain.recipe import Recipe, RecipeItem diff --git a/packages/application/__init__.py b/packages/application/__init__.py index 161b22e17..faabb13fc 100644 --- a/packages/application/__init__.py +++ b/packages/application/__init__.py @@ -6,6 +6,10 @@ from .asset_libraries import ( ListAssetLibrariesUseCase, ) from .assets import CreateAssetCommand, CreateAssetUseCase, ListAssetsUseCase +from .classification_jobs import ( + SubmitClassificationJobCommand, + SubmitClassificationJobUseCase, +) from .duplication import ( DeleteDuplicationRecordUseCase, GetDuplicationDetailUseCase, @@ -14,10 +18,6 @@ from .duplication import ( UploadForDuplicationCommand, UploadForDuplicationUseCase, ) -from .classification_jobs import ( - SubmitClassificationJobCommand, - SubmitClassificationJobUseCase, -) from .generated_videos import ( GetGeneratedVideoDownloadUrlUseCase, GetGeneratedVideoUseCase, diff --git a/packages/application/auth/__init__.py b/packages/application/auth/__init__.py index 8a4cc7cf2..7b3ccdbe6 100644 --- a/packages/application/auth/__init__.py +++ b/packages/application/auth/__init__.py @@ -1,6 +1,10 @@ """认证相关 Use Cases 和委托处理器""" -from packages.application.auth.password_hasher import password_hasher, password_validator +from packages.application.auth.jwt_handler import ( + JWTHandler, + configure_jwt_handler, + get_jwt_handler, +) from packages.application.auth.login_use_case import ( LoginRequest, LoginResponse, @@ -10,6 +14,12 @@ from packages.application.auth.login_use_case import ( RefreshTokenRequest, RefreshTokenUseCase, ) +from packages.application.auth.password_handler import ( + PasswordHandler, + configure_password_handler, + get_password_handler, +) +from packages.application.auth.password_hasher import password_hasher, password_validator from packages.application.auth.password_reset_use_case import ( RequestPasswordResetRequest, RequestPasswordResetUseCase, @@ -23,16 +33,6 @@ from packages.application.auth.register_user_use_case import ( VerifyEmailRequest, VerifyEmailUseCase, ) -from packages.application.auth.jwt_handler import ( - JWTHandler, - configure_jwt_handler, - get_jwt_handler, -) -from packages.application.auth.password_handler import ( - PasswordHandler, - configure_password_handler, - get_password_handler, -) __all__ = [ # Use Cases diff --git a/packages/application/title_library/__init__.py b/packages/application/title_library/__init__.py index df83c0eff..71d9a794d 100644 --- a/packages/application/title_library/__init__.py +++ b/packages/application/title_library/__init__.py @@ -5,9 +5,9 @@ from packages.application.title_library.use_cases import ( DeleteTitleLibraryUseCase, GetTitleLibraryUseCase, ListTitleLibraryUseCase, - UpdateTitleLibraryUseCase, - QuotaExceededError, NotFoundError, + QuotaExceededError, + UpdateTitleLibraryUseCase, ) __all__ = [ diff --git a/packages/application/voice_library/__init__.py b/packages/application/voice_library/__init__.py index 521682be3..271ac50aa 100644 --- a/packages/application/voice_library/__init__.py +++ b/packages/application/voice_library/__init__.py @@ -5,9 +5,9 @@ from packages.application.voice_library.use_cases import ( DeleteVoiceLibraryUseCase, GetVoiceLibraryUseCase, ListVoiceLibraryUseCase, - UpdateVoiceLibraryUseCase, - QuotaExceededError, NotFoundError, + QuotaExceededError, + UpdateVoiceLibraryUseCase, ) __all__ = [ diff --git a/packages/domain/__init__.py b/packages/domain/__init__.py index 7ab16d99a..f056ec3f2 100644 --- a/packages/domain/__init__.py +++ b/packages/domain/__init__.py @@ -5,6 +5,7 @@ from .classification import ( ClassificationJob, ClassificationJobStatus, ) +from .duplication import DuplicateSegment, DuplicationRecord from .editing_mode import EditingMode from .entities import ( Asset, @@ -17,7 +18,6 @@ from .entities import ( Project, User, ) -from .duplication import DuplicateSegment, DuplicationRecord from .generated_video import GeneratedVideo from .generation_task import GenerationTask, GenerationTaskStatus from .title_library import TitleLibraryItem diff --git a/packages/domain/auth/__init__.py b/packages/domain/auth/__init__.py index 6e989e294..ce8c4b53d 100644 --- a/packages/domain/auth/__init__.py +++ b/packages/domain/auth/__init__.py @@ -5,7 +5,6 @@ services such as Redis session storage and SMTP email delivery live under `packages.adapters` and should be injected into use cases. """ -from packages.domain.auth.email_service import EmailConfig, EmailService from packages.application.auth.jwt_service import ( JWTConfig, JWTService, @@ -18,6 +17,7 @@ from packages.application.auth.password_hasher import ( password_hasher, password_validator, ) +from packages.domain.auth.email_service import EmailConfig, EmailService from packages.domain.auth.session_store import RedisConfig, SessionStore __all__ = [ diff --git a/packages/infrastructure/__init__.py b/packages/infrastructure/__init__.py index 8d968c987..3b0749d8f 100644 --- a/packages/infrastructure/__init__.py +++ b/packages/infrastructure/__init__.py @@ -5,8 +5,8 @@ This package contains foundational services that support the domain layer: - FeatureFlags: Feature Flag 系统,支持按套餐/用户粒度控制功能开关 """ +from .feature_flags import FeatureFlag, FeatureFlags, FeatureScope, feature_flags from .module_registry import Module, ModuleRegistry, ModuleStatus, module_registry -from .feature_flags import FeatureFlags, FeatureFlag, FeatureScope, feature_flags __all__ = [ "Module", diff --git a/packages/shared/storage.py b/packages/shared/storage.py index 8100f28fc..28205d5f4 100644 --- a/packages/shared/storage.py +++ b/packages/shared/storage.py @@ -7,8 +7,8 @@ import hmac import json import logging import os -from urllib.parse import urlparse from typing import Optional +from urllib.parse import urlparse try: import oss2 diff --git a/scripts/smoke_public_auth_flow.py b/scripts/smoke_public_auth_flow.py index 93470e5e2..07cb148bf 100644 --- a/scripts/smoke_public_auth_flow.py +++ b/scripts/smoke_public_auth_flow.py @@ -8,8 +8,8 @@ login, /auth/me, and /workspaces. Uses only the Python standard library. from __future__ import annotations import argparse -import os import json +import os import time import urllib.error import urllib.request diff --git a/scripts/smoke_public_boundary_flow.py b/scripts/smoke_public_boundary_flow.py index 35af59f67..0b57566ab 100644 --- a/scripts/smoke_public_boundary_flow.py +++ b/scripts/smoke_public_boundary_flow.py @@ -1,10 +1,10 @@ from __future__ import annotations import io +import os import time import uuid -import os import requests BASE_URL = "https://saas.xiaoxiajianji.com/api/v1" diff --git a/scripts/smoke_public_upload_flow.py b/scripts/smoke_public_upload_flow.py index 8cb592695..777c9990c 100644 --- a/scripts/smoke_public_upload_flow.py +++ b/scripts/smoke_public_upload_flow.py @@ -7,10 +7,10 @@ proxy is tested together with the API upload path. from __future__ import annotations import io +import os import time import uuid -import os import requests BASE_URL = "https://saas.xiaoxiajianji.com/api/v1" diff --git a/scripts/smoke_test.py b/scripts/smoke_test.py index d0c052f02..38451a7f3 100644 --- a/scripts/smoke_test.py +++ b/scripts/smoke_test.py @@ -7,11 +7,11 @@ import argparse import json +import ssl import sys import time -import urllib.request import urllib.error -import ssl +import urllib.request CORE_ENDPOINTS = [ { diff --git a/tests/integration/test_duplication_upload_error_handling.py b/tests/integration/test_duplication_upload_error_handling.py index ace0cc237..3c2337410 100644 --- a/tests/integration/test_duplication_upload_error_handling.py +++ b/tests/integration/test_duplication_upload_error_handling.py @@ -17,7 +17,7 @@ import types from dataclasses import dataclass, field from datetime import datetime, timezone from typing import Optional -from unittest.mock import MagicMock, AsyncMock, patch +from unittest.mock import AsyncMock, MagicMock, patch import pytest from fastapi import FastAPI diff --git a/tests/integration/test_subscription_api.py b/tests/integration/test_subscription_api.py index a0b80eda4..1543b6a73 100644 --- a/tests/integration/test_subscription_api.py +++ b/tests/integration/test_subscription_api.py @@ -181,8 +181,10 @@ def _install_mocks(): # 这里我们直接导入真实 schema(因为它是纯 Pydantic 定义,无外部依赖) # 但为安全起见也 mock 掉 try: + from typing import List + from typing import Optional as Opt + from pydantic import BaseModel, Field - from typing import List, Optional as Opt class PlanType(str): FREE = "free" diff --git a/tests/unit/test_asset_diagnosis.py b/tests/unit/test_asset_diagnosis.py index be73f4bc4..ec40c1a8a 100644 --- a/tests/unit/test_asset_diagnosis.py +++ b/tests/unit/test_asset_diagnosis.py @@ -10,11 +10,10 @@ os.environ.setdefault("DATABASE_URL", "sqlite:///test.db") sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "apps" / "api")) import pytest +from app.api.routes.asset_diagnosis import _build_diagnosis from fastapi import FastAPI from fastapi.testclient import TestClient -from app.api.routes.asset_diagnosis import _build_diagnosis - from packages.domain import ( Asset, AssetLibrary, diff --git a/tests/unit/test_auth.py b/tests/unit/test_auth.py index 27118cc8a..95ba7c698 100644 --- a/tests/unit/test_auth.py +++ b/tests/unit/test_auth.py @@ -27,8 +27,8 @@ from app.config import settings from packages.adapters.smtp import NoopEmailService from packages.application.auth.login_use_case import LoginRequest, LoginUseCase -from packages.application.auth.register_user_use_case import RegisterUserRequest, RegisterUserUseCase from packages.application.auth.password_hasher import password_hasher +from packages.application.auth.register_user_use_case import RegisterUserRequest, RegisterUserUseCase from packages.domain.entities import User diff --git a/tests/unit/test_title_library_use_cases.py b/tests/unit/test_title_library_use_cases.py index d154c4c4d..213b9127e 100644 --- a/tests/unit/test_title_library_use_cases.py +++ b/tests/unit/test_title_library_use_cases.py @@ -18,12 +18,12 @@ from packages.application.title_library.commands import ( ) from packages.application.title_library.use_cases import ( CreateTitleLibraryUseCase, - UpdateTitleLibraryUseCase, DeleteTitleLibraryUseCase, GetTitleLibraryUseCase, ListTitleLibraryUseCase, - QuotaExceededError, NotFoundError, + QuotaExceededError, + UpdateTitleLibraryUseCase, ) from packages.domain.title_library import TitleLibraryItem diff --git a/tests/unit/test_voice_library_use_cases.py b/tests/unit/test_voice_library_use_cases.py index 80a2049dc..ca21bdc39 100644 --- a/tests/unit/test_voice_library_use_cases.py +++ b/tests/unit/test_voice_library_use_cases.py @@ -8,7 +8,7 @@ 4. 边界条件与异常场景 """ -from unittest.mock import Mock, MagicMock, call +from unittest.mock import MagicMock, Mock, call import pytest @@ -18,12 +18,12 @@ from packages.application.voice_library.commands import ( ) from packages.application.voice_library.use_cases import ( CreateVoiceLibraryUseCase, - UpdateVoiceLibraryUseCase, DeleteVoiceLibraryUseCase, GetVoiceLibraryUseCase, ListVoiceLibraryUseCase, - QuotaExceededError, NotFoundError, + QuotaExceededError, + UpdateVoiceLibraryUseCase, ) from packages.domain.voice_library import VoiceLibraryItem -- 2.54.0