chore: add some type (#37173)

This commit is contained in:
Asuka Minato
2026-09-19 09:26:15 +00:00
committed by GitHub
parent b520bef0b1
commit ce5dc6f314
42 changed files with 98 additions and 93 deletions
+3 -3
View File
@@ -32,7 +32,7 @@ logger = logging.getLogger(__name__)
@click.command("setup-system-tool-oauth-client", help="Setup system tool oauth client.")
@click.option("--provider", prompt=True, help="Provider name")
@click.option("--client-params", prompt=True, help="Client Params")
def setup_system_tool_oauth_client(provider, client_params):
def setup_system_tool_oauth_client(provider: str, client_params: str):
"""
Setup system tool oauth client
"""
@@ -79,7 +79,7 @@ def setup_system_tool_oauth_client(provider, client_params):
@click.command("setup-system-trigger-oauth-client", help="Setup system trigger oauth client.")
@click.option("--provider", prompt=True, help="Provider name")
@click.option("--client-params", prompt=True, help="Client Params")
def setup_system_trigger_oauth_client(provider, client_params):
def setup_system_trigger_oauth_client(provider: str, client_params: str):
"""
Setup system trigger oauth client
"""
@@ -129,7 +129,7 @@ def setup_system_trigger_oauth_client(provider, client_params):
@click.command("setup-datasource-oauth-client", help="Setup datasource oauth client.")
@click.option("--provider", prompt=True, help="Provider name")
@click.option("--client-params", prompt=True, help="Client Params")
def setup_datasource_oauth_client(provider, client_params):
def setup_datasource_oauth_client(provider: str, client_params: str):
"""
Setup datasource oauth client
"""
+2 -2
View File
@@ -20,8 +20,8 @@ class ProviderTokenNotInitError(ValueError):
description = "Provider Token Not Init"
def __init__(self, *args, **kwargs):
self.description = args[0] if args else self.description
def __init__(self, *args: object, **kwargs: object):
self.description = str(args[0]) if args else self.description
class QuotaExceededError(ValueError):
+1 -1
View File
@@ -541,7 +541,7 @@ class IndexingRunner:
return text_docs
@staticmethod
def filter_string(text):
def filter_string(text: str):
text = re.sub(r"<\|", "<", text)
text = re.sub(r"\|>", ">", text)
text = re.sub(r"[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]", "", text)
+1 -1
View File
@@ -86,7 +86,7 @@ def on_user_loaded(_sender, user: Union["Account", "EndUser"]):
@worker_init.connect(weak=False)
def init_celery_worker(*args, **kwargs):
def init_celery_worker(*args: object, **kwargs: object):
if dify_config.ENABLE_OTEL:
from opentelemetry.instrumentation.celery import CeleryInstrumentor
from opentelemetry.metrics import get_meter_provider
@@ -348,7 +348,7 @@ class TestAlibabaCloudMySQLVector(unittest.TestCase):
# Simulate table doesn't exist error on delete
def execute_side_effect(*args, **kwargs):
def execute_side_effect[**P](*args: P.args, **kwargs: P.kwargs):
if "DELETE" in args[0]:
raise MySQLError(errno=1146, msg="Table doesn't exist")
@@ -12,8 +12,8 @@ from pymochow.model.schema import HNSWParams, VectorIndex
from pymochow.model.table import Table
class AttrDict(UserDict):
def __getattr__(self, item):
class AttrDict[K, V](UserDict[K, V]):
def __getattr__(self, item: K):
return self.get(item)
@@ -27,7 +27,7 @@ def _build_fake_pymochow_modules():
pymochow_model_table = types.ModuleType("pymochow.model.table")
class _SimpleObject:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
self.args = args
for key, value in kwargs.items():
setattr(self, key, value)
@@ -20,7 +20,7 @@ def _build_fake_psycopg2_modules():
psycopg2_pool = types.ModuleType("psycopg2.pool")
class SimpleConnectionPool:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
self.args = args
self.kwargs = kwargs
self.getconn = MagicMock()
@@ -67,7 +67,7 @@ class _FakeBeginContext:
def _sessionmaker_factory(calls, execute_results=None):
def _sessionmaker(*args, **kwargs):
def _sessionmaker[**P](*args: P.args, **kwargs: P.kwargs):
session = _FakeSessionContext(calls=calls, execute_results=execute_results)
return MagicMock(begin=MagicMock(return_value=_FakeBeginContext(session)))
@@ -20,7 +20,7 @@ def _build_fake_psycopg2_modules():
psycopg2_pool = types.ModuleType("psycopg2.pool")
class SimpleConnectionPool:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
self.args = args
self.kwargs = kwargs
self.getconn = MagicMock()
+27 -25
View File
@@ -9,7 +9,7 @@ from celery import shared_task
from sqlalchemy import delete, select
from sqlalchemy.engine import CursorResult
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import Session, sessionmaker
from configs import dify_config
from core.db.session_factory import session_factory
@@ -103,7 +103,7 @@ def remove_app_and_related_data_task(self, tenant_id: str, app_id: str):
def _delete_app_model_configs(tenant_id: str, app_id: str):
def del_model_config(session, model_config_id: str):
def del_model_config(session: Session, model_config_id: str):
session.execute(
delete(AppModelConfig)
.where(AppModelConfig.id == model_config_id)
@@ -119,7 +119,7 @@ def _delete_app_model_configs(tenant_id: str, app_id: str):
def _delete_app_site(tenant_id: str, app_id: str):
def del_site(session, site_id: str):
def del_site(session: Session, site_id: str):
session.execute(delete(Site).where(Site.id == site_id).execution_options(synchronize_session=False))
_delete_records(
@@ -131,7 +131,7 @@ def _delete_app_site(tenant_id: str, app_id: str):
def _delete_app_mcp_servers(tenant_id: str, app_id: str):
def del_mcp_server(session, mcp_server_id: str):
def del_mcp_server(session: Session, mcp_server_id: str):
session.execute(
delete(AppMCPServer).where(AppMCPServer.id == mcp_server_id).execution_options(synchronize_session=False)
)
@@ -145,7 +145,7 @@ def _delete_app_mcp_servers(tenant_id: str, app_id: str):
def _delete_app_api_tokens(tenant_id: str, app_id: str):
def del_api_token(session, api_token_id: str):
def del_api_token(session: Session, api_token_id: str):
# Fetch token details for cache invalidation
token_obj = session.scalar(select(ApiToken).where(ApiToken.id == api_token_id).limit(1))
if token_obj:
@@ -165,7 +165,7 @@ def _delete_app_api_tokens(tenant_id: str, app_id: str):
def _delete_installed_apps(tenant_id: str, app_id: str):
def del_installed_app(session, installed_app_id: str):
def del_installed_app(session: Session, installed_app_id: str):
session.execute(
delete(InstalledApp).where(InstalledApp.id == installed_app_id).execution_options(synchronize_session=False)
)
@@ -191,7 +191,7 @@ def _delete_app_stars(tenant_id: str, app_id: str):
def _delete_recommended_apps(tenant_id: str, app_id: str):
def del_recommended_app(session, recommended_app_id: str):
def del_recommended_app(session: Session, recommended_app_id: str):
session.execute(
delete(RecommendedApp)
.where(RecommendedApp.id == recommended_app_id)
@@ -207,7 +207,7 @@ def _delete_recommended_apps(tenant_id: str, app_id: str):
def _delete_app_annotation_data(tenant_id: str, app_id: str):
def del_annotation_hit_history(session, annotation_hit_history_id: str):
def del_annotation_hit_history(session: Session, annotation_hit_history_id: str):
session.execute(
delete(AppAnnotationHitHistory)
.where(AppAnnotationHitHistory.id == annotation_hit_history_id)
@@ -221,7 +221,7 @@ def _delete_app_annotation_data(tenant_id: str, app_id: str):
"annotation hit history",
)
def del_annotation_setting(session, annotation_setting_id: str):
def del_annotation_setting(session: Session, annotation_setting_id: str):
session.execute(
delete(AppAnnotationSetting)
.where(AppAnnotationSetting.id == annotation_setting_id)
@@ -237,7 +237,7 @@ def _delete_app_annotation_data(tenant_id: str, app_id: str):
def _delete_app_dataset_joins(tenant_id: str, app_id: str):
def del_dataset_join(session, dataset_join_id: str):
def del_dataset_join(session: Session, dataset_join_id: str):
session.execute(
delete(AppDatasetJoin)
.where(AppDatasetJoin.id == dataset_join_id)
@@ -253,7 +253,7 @@ def _delete_app_dataset_joins(tenant_id: str, app_id: str):
def _delete_app_workflows(tenant_id: str, app_id: str):
def del_workflow(session, workflow_id: str):
def del_workflow(session: Session, workflow_id: str):
session.execute(delete(Workflow).where(Workflow.id == workflow_id).execution_options(synchronize_session=False))
_delete_records(
@@ -304,7 +304,7 @@ def _delete_app_workflow_node_executions(tenant_id: str, app_id: str):
def _delete_app_workflow_app_logs(tenant_id: str, app_id: str):
def del_workflow_app_log(session, workflow_app_log_id: str):
def del_workflow_app_log(session: Session, workflow_app_log_id: str):
session.execute(
delete(WorkflowAppLog)
.where(WorkflowAppLog.id == workflow_app_log_id)
@@ -320,7 +320,7 @@ def _delete_app_workflow_app_logs(tenant_id: str, app_id: str):
def _delete_app_workflow_archive_logs(tenant_id: str, app_id: str):
def del_workflow_archive_log(session, workflow_archive_log_id: str):
def del_workflow_archive_log(session: Session, workflow_archive_log_id: str):
session.execute(
delete(WorkflowArchiveLog)
.where(WorkflowArchiveLog.id == workflow_archive_log_id)
@@ -361,7 +361,7 @@ def _delete_archived_workflow_run_files(tenant_id: str, app_id: str):
def _delete_app_conversations(tenant_id: str, app_id: str):
def del_conversation(session, conversation_id: str):
def del_conversation(session: Session, conversation_id: str):
session.execute(
delete(PinnedConversation)
.where(PinnedConversation.conversation_id == conversation_id)
@@ -388,7 +388,7 @@ def _delete_conversation_variables(*, app_id: str):
def _delete_app_messages(tenant_id: str, app_id: str):
def del_message(session, message_id: str):
def del_message(session: Session, message_id: str):
session.execute(
delete(MessageFeedback)
.where(MessageFeedback.message_id == message_id)
@@ -428,7 +428,7 @@ def _delete_app_messages(tenant_id: str, app_id: str):
def _delete_workflow_tool_providers(tenant_id: str, app_id: str):
def del_tool_provider(session, tool_provider_id: str):
def del_tool_provider(session: Session, tool_provider_id: str):
session.execute(
delete(WorkflowToolProvider)
.where(WorkflowToolProvider.id == tool_provider_id)
@@ -444,7 +444,7 @@ def _delete_workflow_tool_providers(tenant_id: str, app_id: str):
def _delete_app_tag_bindings(tenant_id: str, app_id: str):
def del_tag_binding(session, tag_binding_id: str):
def del_tag_binding(session: Session, tag_binding_id: str):
session.execute(
delete(TagBinding).where(TagBinding.id == tag_binding_id).execution_options(synchronize_session=False)
)
@@ -458,7 +458,7 @@ def _delete_app_tag_bindings(tenant_id: str, app_id: str):
def _delete_end_users(tenant_id: str, app_id: str):
def del_end_user(session, end_user_id: str):
def del_end_user(session: Session, end_user_id: str):
session.execute(delete(EndUser).where(EndUser.id == end_user_id).execution_options(synchronize_session=False))
_delete_records(
@@ -470,7 +470,7 @@ def _delete_end_users(tenant_id: str, app_id: str):
def _delete_trace_app_configs(tenant_id: str, app_id: str):
def del_trace_app_config(session, trace_app_config_id: str):
def del_trace_app_config(session: Session, trace_app_config_id: str):
session.execute(
delete(TraceAppConfig)
.where(TraceAppConfig.id == trace_app_config_id)
@@ -639,7 +639,7 @@ def _delete_draft_variable_offload_data(file_ids: list[str]) -> int:
def _delete_app_triggers(tenant_id: str, app_id: str):
def del_app_trigger(session, trigger_id: str):
def del_app_trigger(session: Session, trigger_id: str):
session.execute(
delete(AppTrigger).where(AppTrigger.id == trigger_id).execution_options(synchronize_session=False)
)
@@ -653,7 +653,7 @@ def _delete_app_triggers(tenant_id: str, app_id: str):
def _delete_workflow_plugin_triggers(tenant_id: str, app_id: str):
def del_plugin_trigger(session, trigger_id: str):
def del_plugin_trigger(session: Session, trigger_id: str):
session.execute(
delete(WorkflowPluginTrigger)
.where(WorkflowPluginTrigger.id == trigger_id)
@@ -669,7 +669,7 @@ def _delete_workflow_plugin_triggers(tenant_id: str, app_id: str):
def _delete_workflow_webhook_triggers(tenant_id: str, app_id: str):
def del_webhook_trigger(session, trigger_id: str):
def del_webhook_trigger(session: Session, trigger_id: str):
session.execute(
delete(WorkflowWebhookTrigger)
.where(WorkflowWebhookTrigger.id == trigger_id)
@@ -685,7 +685,7 @@ def _delete_workflow_webhook_triggers(tenant_id: str, app_id: str):
def _delete_workflow_schedule_plans(tenant_id: str, app_id: str):
def del_schedule_plan(session, plan_id: str):
def del_schedule_plan(session: Session, plan_id: str):
session.execute(
delete(WorkflowSchedulePlan)
.where(WorkflowSchedulePlan.id == plan_id)
@@ -701,7 +701,7 @@ def _delete_workflow_schedule_plans(tenant_id: str, app_id: str):
def _delete_workflow_trigger_logs(tenant_id: str, app_id: str):
def del_trigger_log(session, log_id: str):
def del_trigger_log(session: Session, log_id: str):
session.execute(
delete(WorkflowTriggerLog)
.where(WorkflowTriggerLog.id == log_id)
@@ -716,7 +716,9 @@ def _delete_workflow_trigger_logs(tenant_id: str, app_id: str):
)
def _delete_records(query_sql: str, params: dict[str, Any], delete_func: Callable, name: str) -> None:
def _delete_records(
query_sql: str, params: dict[str, Any], delete_func: Callable[[Session, str], None], name: str
) -> None:
while True:
with session_factory.create_session() as session:
rs = session.execute(sa.text(query_sql), params)
@@ -98,7 +98,7 @@ def test_run_completion_dispatches_to_completion_handler(
):
app = app_with_mode("completion")
captured: dict = {}
captured = {}
def _fake_generate(*, app_model, user, args, invoke_from, streaming):
captured["mode"] = app_model.mode
@@ -176,7 +176,7 @@ class TestScheduleServiceIntegration:
with pytest.MonkeyPatch.context() as monkeypatch:
calls: list[tuple] = []
def _track(*args, **kwargs):
def _track[**P](*args: P.args, **kwargs: P.kwargs):
calls.append((args, kwargs))
return datetime(2026, 1, 9, 10, 0, 0)
@@ -38,7 +38,7 @@ class _TrackedSessionContext:
self._opened_sessions.append(self._session)
original_close = self._session.close
def _tracked_close(*args, **kwargs):
def _tracked_close[**P](*args: P.args, **kwargs: P.kwargs):
self._closed_sessions.append(self._session)
return original_close(*args, **kwargs)
@@ -70,7 +70,7 @@ def session_close_tracker():
original_create_session = task_module.session_factory.create_session
def _tracked_create_session(*args, **kwargs):
def _tracked_create_session[**P](*args: P.args, **kwargs: P.kwargs):
original_context_manager = original_create_session(*args, **kwargs)
return _TrackedSessionContext(original_context_manager, opened_sessions, closed_sessions)
@@ -43,7 +43,7 @@ def load_balancing_module(monkeypatch: pytest.MonkeyPatch):
monkeypatch.setattr(wraps, "setup_required", _noop)
monkeypatch.setattr(wraps, "account_initialization_required", _noop)
def _noop_route(*args, **kwargs): # type: ignore[override]
def _noop_route[**P](*args: P.args, **kwargs: P.kwargs): # type: ignore[override]
def _decorator(cls):
return cls
@@ -36,7 +36,7 @@ class TestAdvancedChatAppConfigManager:
def test_config_validate_filters_keys(self):
def _add_key(key, value):
def _inner(*args, **kwargs):
def _inner[**P](*args: P.args, **kwargs: P.kwargs):
config = kwargs.get("config") if kwargs else args[-1]
config = {**config, key: value}
return config, [key]
@@ -711,7 +711,7 @@ class TestAdvancedChatAppGeneratorInternals:
generator._get_message = MagicMock(return_value=_make_message(message_id="msg", conversation_id="conv"))
@contextmanager
def _fake_context(*args, **kwargs):
def _fake_context[**P](*args: P.args, **kwargs: P.kwargs):
yield
monkeypatch.setattr("core.app.apps.advanced_chat.app_generator.preserve_flask_contexts", _fake_context)
@@ -763,7 +763,7 @@ class TestAdvancedChatAppGeneratorInternals:
sqlite_session.commit()
@contextmanager
def _fake_context(*args, **kwargs):
def _fake_context[**P](*args: P.args, **kwargs: P.kwargs):
yield
monkeypatch.setattr("core.app.apps.advanced_chat.app_generator.preserve_flask_contexts", _fake_context)
@@ -814,7 +814,7 @@ class TestAdvancedChatAppGeneratorInternals:
generator._get_message = MagicMock(return_value=_make_message(message_id="msg", conversation_id="conv"))
@contextmanager
def _fake_context(*args, **kwargs):
def _fake_context[**P](*args: P.args, **kwargs: P.kwargs):
yield
monkeypatch.setattr("core.app.apps.advanced_chat.app_generator.preserve_flask_contexts", _fake_context)
@@ -893,7 +893,7 @@ class TestAdvancedChatAppGeneratorInternals:
sqlite_session.commit()
@contextmanager
def _fake_context(*args, **kwargs):
def _fake_context[**P](*args: P.args, **kwargs: P.kwargs):
yield
monkeypatch.setattr("core.app.apps.advanced_chat.app_generator.preserve_flask_contexts", _fake_context)
@@ -935,7 +935,7 @@ class TestAdvancedChatAppGeneratorInternals:
sqlite_session.commit()
@contextmanager
def _fake_context(*args, **kwargs):
def _fake_context[**P](*args: P.args, **kwargs: P.kwargs):
yield
def _make_runner(error: Exception):
@@ -1149,7 +1149,7 @@ class TestAdvancedChatAppGeneratorInternals:
monkeypatch.setattr("core.app.apps.advanced_chat.app_generator.AdvancedChatAppRunner", _Runner)
@contextmanager
def _fake_context(*args, **kwargs):
def _fake_context[**P](*args: P.args, **kwargs: P.kwargs):
yield
monkeypatch.setattr("core.app.apps.advanced_chat.app_generator.preserve_flask_contexts", _fake_context)
@@ -334,7 +334,7 @@ class TestGenerateWorker:
@pytest.fixture(autouse=True)
def patch_context(self, mocker: MockerFixture):
@contextlib.contextmanager
def ctx_manager(*args, **kwargs):
def ctx_manager[**P](*args: P.args, **kwargs: P.kwargs):
yield
mocker.patch("libs.flask_utils.preserve_flask_contexts", ctx_manager)
@@ -259,7 +259,7 @@ class TestAgentChatAppGeneratorWorker:
@pytest.fixture(autouse=True)
def patch_context(self, mocker: MockerFixture):
@contextlib.contextmanager
def ctx_manager(*args, **kwargs):
def ctx_manager[**P](*args: P.args, **kwargs: P.kwargs):
yield
mocker.patch("core.app.apps.agent_chat.app_generator.preserve_flask_contexts", ctx_manager)
@@ -91,7 +91,7 @@ class TestChatAppConfigManager:
config = {"extra": 1}
def _add_key(key, value):
def _inner(*args, **kwargs):
def _inner[**P](*args: P.args, **kwargs: P.kwargs):
config = args[-1]
config = {**config, key: value}
return config, [key]
@@ -25,7 +25,7 @@ class DummyGenerateEntity:
class DummyQueueManager:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
self.published = []
def publish_error(self, error, pub_from):
@@ -149,7 +149,7 @@ def _persist_worker_records(session: Session) -> None:
session.commit()
def _dummy_preserve(*args, **kwargs):
def _dummy_preserve[**P](*args: P.args, **kwargs: P.kwargs):
return contextlib.nullcontext()
@@ -199,7 +199,7 @@ def test_message_cycle_manager_uses_new_conversation_flag(monkeypatch: pytest.Mo
def start(self):
self.started = True
def fake_thread(*args, **kwargs):
def fake_thread[**P](*args: P.args, **kwargs: P.kwargs):
thread = DummyThread(**kwargs)
captured["thread"] = thread
return thread
@@ -14,7 +14,7 @@ from models import Tenant
class DummyQueueManager(AppQueueManager):
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
super().__init__(*args, **kwargs)
self.published = []
@@ -36,7 +36,7 @@ class TestWorkflowAppConfigManager:
def test_config_validate_filters_keys(self):
def _add_key(key, value):
def _inner(*args, **kwargs):
def _inner[**P](*args: P.args, **kwargs: P.kwargs):
# Support both positional and keyword arguments for config
if "config" in kwargs:
config = kwargs["config"]
@@ -468,7 +468,7 @@ class TestWorkflowGenerateTaskPipeline:
pipeline._process_stream_response = lambda **kwargs: iter([PingStreamResponse(task_id="task")])
class _Publisher:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
self.calls = 0
def check_and_get_audio(self, *, block=False):
@@ -628,7 +628,7 @@ class TestWorkflowGenerateTaskPipeline:
blocking_reads = []
class _Publisher:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
pass
def check_and_get_audio(self, *, block=False):
@@ -662,7 +662,7 @@ class TestWorkflowGenerateTaskPipeline:
pipeline._process_stream_response = lambda **kwargs: iter([])
class _Publisher:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
pass
def check_and_get_audio(self, *, block=False):
@@ -415,7 +415,7 @@ class TestEasyUiBasedGenerateTaskPipeline:
_set_method(pipeline, "_save_message", lambda **kwargs: None)
class _Session:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
pass
def __enter__(self):
@@ -589,7 +589,7 @@ class TestEasyUiBasedGenerateTaskPipeline:
return self._items
class _Session:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
self.calls = 0
def __enter__(self):
@@ -675,7 +675,7 @@ class TestEasyUiBasedGenerateTaskPipeline:
_set_method(pipeline, "error_to_stream_response", lambda err: ErrorStreamResponse(task_id="task", err=err))
class _Session:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
pass
def __enter__(self):
@@ -763,7 +763,7 @@ class TestEasyUiBasedGenerateTaskPipeline:
agent_thought = _agent_thought()
class _Session:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
pass
def __enter__(self):
@@ -1186,7 +1186,7 @@ class TestEasyUiBasedGenerateTaskPipeline:
)
class _Session:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
pass
def __enter__(self):
@@ -1522,7 +1522,7 @@ class TestEasyUiBasedGenerateTaskPipeline:
return []
class _Session:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
pass
def __enter__(self):
@@ -1561,7 +1561,7 @@ class TestEasyUiBasedGenerateTaskPipeline:
return []
class _Session:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
pass
def __enter__(self):
@@ -1624,7 +1624,7 @@ class TestEasyUiBasedGenerateTaskPipeline:
return self._items
class _Session:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
self.calls = 0
def __enter__(self):
@@ -1686,7 +1686,7 @@ class TestEasyUiBasedGenerateTaskPipeline:
)
class _Session:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
pass
def __enter__(self):
@@ -30,7 +30,7 @@ class TestExternalDataFetch:
# This approach is robust regardless of thread scheduling order
from unittest.mock import MagicMock
def factory_side_effect(*args, **kwargs):
def factory_side_effect[**P](*args: P.args, **kwargs: P.kwargs):
variable = kwargs.get("variable")
mock_instance = MagicMock()
if variable == "var1":
@@ -629,7 +629,7 @@ class TestPostWriter:
call_count = {"n": 0}
original_get = write_queue.get
def patched_get(*args, **kwargs):
def patched_get[**P](*args: P.args, **kwargs: P.kwargs):
call_count["n"] += 1
if call_count["n"] == 1:
raise queue.Empty
@@ -933,7 +933,7 @@ class TestHandlePostRequestNew:
def _stream_ctx(self, mock_response):
@contextmanager
def _stream(*args, **kwargs):
def _stream[**P](*args: P.args, **kwargs: P.kwargs):
yield mock_response
return _stream
@@ -1388,7 +1388,7 @@ class TestPostWriterNew:
original_get = c2s.get
def patched_get(*args, **kwargs):
def patched_get[**P](*args: P.args, **kwargs: P.kwargs):
call_count["n"] += 1
if call_count["n"] == 1:
raise queue.Empty
@@ -62,7 +62,7 @@ class ReceiveNotification(RootModel[Union[CancelledNotification, MockNotificatio
class MockSession(BaseSession[MockRequest, MockNotification, MockResult, ReceiveRequest, ReceiveNotification]):
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
super().__init__(*args, **kwargs)
self.received_requests = []
self.received_notifications = []
@@ -150,7 +150,7 @@ class TestOutputModeration:
output_moderation.is_final_chunk = True
# To avoid infinite loop, we'll set thread_running to False after one iteration
def side_effect(*args, **kwargs):
def side_effect[**P](*args: P.args, **kwargs: P.kwargs):
output_moderation.thread_running = False
return mock_moderation.return_value
@@ -182,7 +182,7 @@ class TestOutputModeration:
with patch.object(OutputModeration, "moderation") as mock_moderation:
# Use side_effect to change thread_running on second call
def side_effect(*args, **kwargs):
def side_effect[**P](*args: P.args, **kwargs: P.kwargs):
if mock_moderation.call_count > 1:
output_moderation.thread_running = False
return None
@@ -221,7 +221,7 @@ class TestOutputModeration:
# Return None (exception or no rule)
mock_moderation.return_value = None
def side_effect(*args, **kwargs):
def side_effect[**P](*args: P.args, **kwargs: P.kwargs):
output_moderation.thread_running = False
mock_moderation.side_effect = side_effect
@@ -64,7 +64,7 @@ class TestOAuthHandler:
handler = OAuthHandler()
captured_data = {}
def fake_stream(*args, **kwargs):
def fake_stream[**P](*args: P.args, **kwargs: P.kwargs):
captured_data.update(kwargs["data"])
return iter([SimpleNamespace(credentials={"token": "abc"}, metadata={}, expires_at=1)])
@@ -67,7 +67,7 @@ class TestPluginTriggerClient:
client = PluginTriggerClient()
provider = _trigger_provider("remote")
def fake_request(*args, **kwargs):
def fake_request[**P](*args: P.args, **kwargs: P.kwargs):
transformer = kwargs["transformer"]
payload = {
"data": [
@@ -94,7 +94,7 @@ class TestPluginTriggerClient:
client = PluginTriggerClient()
provider = _trigger_provider("provider")
def fake_request(*args, **kwargs):
def fake_request[**P](*args: P.args, **kwargs: P.kwargs):
transformer = kwargs["transformer"]
payload = {"data": {"declaration": {"events": [{"identity": {"provider": "old"}}]}}}
transformed = transformer(payload)
@@ -1284,7 +1284,7 @@ class TestPluginRuntimeAdvancedScenarios:
# Arrange
call_count = 0
def side_effect(*args, **kwargs):
def side_effect[**P](*args: P.args, **kwargs: P.kwargs):
nonlocal call_count
call_count += 1
if call_count < 3:
@@ -66,7 +66,7 @@ class TestCSVExtractor:
def test_extract_wraps_unicode_error_when_autodetect_disabled(self, monkeypatch: pytest.MonkeyPatch):
extractor = CSVExtractor("dummy.csv", autodetect_encoding=False)
def raise_decode(*args, **kwargs):
def raise_decode[**P](*args: P.args, **kwargs: P.kwargs):
raise UnicodeDecodeError("utf-8", b"x", 0, 1, "decode error")
monkeypatch.setattr("builtins.open", raise_decode)
@@ -102,7 +102,7 @@ class TestCSVExtractor:
def test_extract_autodetect_encoding_all_attempts_fail_returns_empty(self, monkeypatch: pytest.MonkeyPatch):
extractor = CSVExtractor("dummy.csv", autodetect_encoding=True)
def always_raise(*args, **kwargs):
def always_raise[**P](*args: P.args, **kwargs: P.kwargs):
raise UnicodeDecodeError("utf-8", b"x", 0, 1, "decode error")
monkeypatch.setattr("builtins.open", always_raise)
@@ -36,7 +36,7 @@ class _ExtractorFactory:
calls = self.calls
class DummyExtractor:
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
calls.append((name, args, kwargs))
def extract(self):
@@ -5,6 +5,7 @@ from unittest.mock import Mock, patch
import pandas as pd
import pytest
from flask import Flask
from sqlalchemy import event
from sqlalchemy.orm import Session
from werkzeug.datastructures import FileStorage
@@ -95,7 +96,9 @@ class TestQAIndexProcessor:
splitter = Mock()
splitter.split_documents.return_value = [split_node]
def _append_document(flask_app, tenant_id, document_node, all_qa_documents, document_language):
def _append_document(
flask_app: Flask, tenant_id, document_node, all_qa_documents: list[Document], document_language
):
all_qa_documents.append(Document(page_content="Q1", metadata={"answer": "A1"}))
with (
@@ -142,7 +145,7 @@ class TestQAIndexProcessor:
splitter = Mock()
splitter.split_documents.return_value = [split_node]
def _append_document(flask_app, tenant_id, document_node, all_qa_documents, document_language):
def _append_document(flask_app: Flask, tenant_id, document_node, all_qa_documents, document_language):
all_qa_documents.append(Document(page_content=f"Q-{document_node.page_content}", metadata={"answer": "A"}))
with (
@@ -83,7 +83,7 @@ def _tool_yaml() -> dict[str, Any]:
def test_builtin_tool_provider_init_load_tools_and_basic_accessors(monkeypatch: pytest.MonkeyPatch):
yaml_payloads = [_provider_yaml(), _tool_yaml()]
def _load_yaml(*args, **kwargs):
def _load_yaml[**P](*args: P.args, **kwargs: P.kwargs):
return yaml_payloads.pop(0)
monkeypatch.setattr("core.tools.builtin_tool.provider.load_yaml_file_cached", _load_yaml)
@@ -12,7 +12,7 @@ class _FakeToolFileManager:
last_call: dict[str, Any] | None = None
def __init__(self, *args, **kwargs):
def __init__[**P](self, *args: P.args, **kwargs: P.kwargs):
pass
def create_file_by_raw(
@@ -1685,7 +1685,7 @@ def test_run_datasource_node_preview_raises_for_stream_non_string(
runtime = mocker.Mock()
def _bad_stream_generator(*args, **kwargs):
def _bad_stream_generator[**P](*args: P.args, **kwargs: P.kwargs):
yield DatasourceMessage(
type=DatasourceMessage.MessageType.VARIABLE,
message=DatasourceMessage.VariableMessage(variable_name="content", variable_value=1, stream=True),
@@ -1537,7 +1537,7 @@ class TestBillingServiceSubscriptionOperations:
}
# Second chunk fails - need to create a mock that raises when called
def side_effect_func(*args, **kwargs):
def side_effect_func[**P](*args: P.args, **kwargs: P.kwargs):
if mock_send_request.call_count == 1:
return first_chunk_response
else:
@@ -1561,7 +1561,7 @@ class TestBillingServiceSubscriptionOperations:
tenant_ids = [f"tenant-{i}" for i in range(250)]
# All chunks fail
def side_effect_func(*args, **kwargs):
def side_effect_func[**P](*args: P.args, **kwargs: P.kwargs):
raise ValueError("API error")
mock_send_request.side_effect = side_effect_func