google-adk 0.0.1__py3-none-any.whl → 0.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- google/adk/__init__.py +20 -0
- google/adk/agents/__init__.py +32 -0
- google/adk/agents/active_streaming_tool.py +38 -0
- google/adk/agents/base_agent.py +345 -0
- google/adk/agents/callback_context.py +112 -0
- google/adk/agents/invocation_context.py +181 -0
- google/adk/agents/langgraph_agent.py +140 -0
- google/adk/agents/live_request_queue.py +64 -0
- google/adk/agents/llm_agent.py +376 -0
- google/adk/agents/loop_agent.py +62 -0
- google/adk/agents/parallel_agent.py +96 -0
- google/adk/agents/readonly_context.py +46 -0
- google/adk/agents/remote_agent.py +50 -0
- google/adk/agents/run_config.py +87 -0
- google/adk/agents/sequential_agent.py +45 -0
- google/adk/agents/transcription_entry.py +34 -0
- google/adk/artifacts/__init__.py +23 -0
- google/adk/artifacts/base_artifact_service.py +128 -0
- google/adk/artifacts/gcs_artifact_service.py +195 -0
- google/adk/artifacts/in_memory_artifact_service.py +133 -0
- google/adk/auth/__init__.py +22 -0
- google/adk/auth/auth_credential.py +220 -0
- google/adk/auth/auth_handler.py +268 -0
- google/adk/auth/auth_preprocessor.py +116 -0
- google/adk/auth/auth_schemes.py +67 -0
- google/adk/auth/auth_tool.py +55 -0
- google/adk/cli/__init__.py +15 -0
- google/adk/cli/__main__.py +18 -0
- google/adk/cli/agent_graph.py +122 -0
- google/adk/cli/browser/adk_favicon.svg +17 -0
- google/adk/cli/browser/assets/audio-processor.js +51 -0
- google/adk/cli/browser/assets/config/runtime-config.json +3 -0
- google/adk/cli/browser/index.html +33 -0
- google/adk/cli/browser/main-XUU6OGCC.js +75 -0
- google/adk/cli/browser/polyfills-FFHMD2TL.js +18 -0
- google/adk/cli/browser/styles-4VDSPQ37.css +17 -0
- google/adk/cli/cli.py +181 -0
- google/adk/cli/cli_deploy.py +181 -0
- google/adk/cli/cli_eval.py +282 -0
- google/adk/cli/cli_tools_click.py +479 -0
- google/adk/cli/fast_api.py +774 -0
- google/adk/cli/media_streamer/__init__.py +19 -0
- google/adk/cli/media_streamer/index.html +228 -0
- google/adk/cli/utils/__init__.py +49 -0
- google/adk/cli/utils/envs.py +57 -0
- google/adk/cli/utils/evals.py +93 -0
- google/adk/cli/utils/logs.py +72 -0
- google/adk/code_executors/__init__.py +49 -0
- google/adk/code_executors/base_code_executor.py +97 -0
- google/adk/code_executors/code_execution_utils.py +256 -0
- google/adk/code_executors/code_executor_context.py +202 -0
- google/adk/code_executors/container_code_executor.py +196 -0
- google/adk/code_executors/unsafe_local_code_executor.py +71 -0
- google/adk/code_executors/vertex_ai_code_executor.py +234 -0
- google/adk/evaluation/__init__.py +31 -0
- google/adk/evaluation/agent_evaluator.py +329 -0
- google/adk/evaluation/evaluation_constants.py +24 -0
- google/adk/evaluation/evaluation_generator.py +270 -0
- google/adk/evaluation/response_evaluator.py +135 -0
- google/adk/evaluation/trajectory_evaluator.py +184 -0
- google/adk/events/__init__.py +21 -0
- google/adk/events/event.py +130 -0
- google/adk/events/event_actions.py +55 -0
- google/adk/examples/__init__.py +28 -0
- google/adk/examples/base_example_provider.py +35 -0
- google/adk/examples/example.py +27 -0
- google/adk/examples/example_util.py +123 -0
- google/adk/examples/vertex_ai_example_store.py +104 -0
- google/adk/flows/__init__.py +14 -0
- google/adk/flows/llm_flows/__init__.py +20 -0
- google/adk/flows/llm_flows/_base_llm_processor.py +52 -0
- google/adk/flows/llm_flows/_code_execution.py +458 -0
- google/adk/flows/llm_flows/_nl_planning.py +129 -0
- google/adk/flows/llm_flows/agent_transfer.py +132 -0
- google/adk/flows/llm_flows/audio_transcriber.py +109 -0
- google/adk/flows/llm_flows/auto_flow.py +49 -0
- google/adk/flows/llm_flows/base_llm_flow.py +559 -0
- google/adk/flows/llm_flows/basic.py +72 -0
- google/adk/flows/llm_flows/contents.py +370 -0
- google/adk/flows/llm_flows/functions.py +486 -0
- google/adk/flows/llm_flows/identity.py +47 -0
- google/adk/flows/llm_flows/instructions.py +137 -0
- google/adk/flows/llm_flows/single_flow.py +57 -0
- google/adk/memory/__init__.py +35 -0
- google/adk/memory/base_memory_service.py +74 -0
- google/adk/memory/in_memory_memory_service.py +62 -0
- google/adk/memory/vertex_ai_rag_memory_service.py +177 -0
- google/adk/models/__init__.py +31 -0
- google/adk/models/anthropic_llm.py +243 -0
- google/adk/models/base_llm.py +87 -0
- google/adk/models/base_llm_connection.py +76 -0
- google/adk/models/gemini_llm_connection.py +200 -0
- google/adk/models/google_llm.py +331 -0
- google/adk/models/lite_llm.py +673 -0
- google/adk/models/llm_request.py +98 -0
- google/adk/models/llm_response.py +111 -0
- google/adk/models/registry.py +102 -0
- google/adk/planners/__init__.py +23 -0
- google/adk/planners/base_planner.py +66 -0
- google/adk/planners/built_in_planner.py +75 -0
- google/adk/planners/plan_re_act_planner.py +208 -0
- google/adk/runners.py +456 -0
- google/adk/sessions/__init__.py +41 -0
- google/adk/sessions/base_session_service.py +133 -0
- google/adk/sessions/database_session_service.py +522 -0
- google/adk/sessions/in_memory_session_service.py +206 -0
- google/adk/sessions/session.py +54 -0
- google/adk/sessions/state.py +71 -0
- google/adk/sessions/vertex_ai_session_service.py +356 -0
- google/adk/telemetry.py +189 -0
- google/adk/tests/__init__.py +14 -0
- google/adk/tests/integration/.env.example +10 -0
- google/adk/tests/integration/__init__.py +18 -0
- google/adk/tests/integration/conftest.py +119 -0
- google/adk/tests/integration/fixture/__init__.py +14 -0
- google/adk/tests/integration/fixture/agent_with_config/__init__.py +15 -0
- google/adk/tests/integration/fixture/agent_with_config/agent.py +88 -0
- google/adk/tests/integration/fixture/callback_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/callback_agent/agent.py +105 -0
- google/adk/tests/integration/fixture/context_update_test/OWNERS +1 -0
- google/adk/tests/integration/fixture/context_update_test/__init__.py +15 -0
- google/adk/tests/integration/fixture/context_update_test/agent.py +43 -0
- google/adk/tests/integration/fixture/context_update_test/successful_test.session.json +582 -0
- google/adk/tests/integration/fixture/context_variable_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/context_variable_agent/agent.py +115 -0
- google/adk/tests/integration/fixture/customer_support_ma/__init__.py +15 -0
- google/adk/tests/integration/fixture/customer_support_ma/agent.py +172 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/agent.py +338 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/order_query.test.json +69 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/test_config.json +6 -0
- google/adk/tests/integration/fixture/flow_complex_spark/__init__.py +15 -0
- google/adk/tests/integration/fixture/flow_complex_spark/agent.py +182 -0
- google/adk/tests/integration/fixture/flow_complex_spark/sample.debug.log +243 -0
- google/adk/tests/integration/fixture/flow_complex_spark/sample.session.json +190 -0
- google/adk/tests/integration/fixture/hello_world_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/hello_world_agent/agent.py +95 -0
- google/adk/tests/integration/fixture/hello_world_agent/roll_die.test.json +24 -0
- google/adk/tests/integration/fixture/hello_world_agent/test_config.json +6 -0
- google/adk/tests/integration/fixture/home_automation_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/home_automation_agent/agent.py +304 -0
- google/adk/tests/integration/fixture/home_automation_agent/simple_test.test.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/simple_test2.test.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_config.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/dependent_tool_calls.test.json +18 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/eval_data.test.json +17 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/test_config.json +6 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_multi_turn_conversation.test.json +18 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test.test.json +17 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test2.test.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/test_config.json +5 -0
- google/adk/tests/integration/fixture/tool_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/tool_agent/agent.py +218 -0
- google/adk/tests/integration/fixture/tool_agent/files/Agent_test_plan.pdf +0 -0
- google/adk/tests/integration/fixture/trip_planner_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/trip_planner_agent/agent.py +110 -0
- google/adk/tests/integration/fixture/trip_planner_agent/initial.session.json +13 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_config.json +5 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_files/initial.session.json +13 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_files/test_config.json +5 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_files/trip_inquiry_sub_agent.test.json +7 -0
- google/adk/tests/integration/fixture/trip_planner_agent/trip_inquiry.test.json +19 -0
- google/adk/tests/integration/models/__init__.py +14 -0
- google/adk/tests/integration/models/test_google_llm.py +65 -0
- google/adk/tests/integration/test_callback.py +70 -0
- google/adk/tests/integration/test_context_variable.py +67 -0
- google/adk/tests/integration/test_evalute_agent_in_fixture.py +76 -0
- google/adk/tests/integration/test_multi_agent.py +28 -0
- google/adk/tests/integration/test_multi_turn.py +42 -0
- google/adk/tests/integration/test_single_agent.py +23 -0
- google/adk/tests/integration/test_sub_agent.py +26 -0
- google/adk/tests/integration/test_system_instruction.py +177 -0
- google/adk/tests/integration/test_tools.py +287 -0
- google/adk/tests/integration/test_with_test_file.py +34 -0
- google/adk/tests/integration/tools/__init__.py +14 -0
- google/adk/tests/integration/utils/__init__.py +16 -0
- google/adk/tests/integration/utils/asserts.py +75 -0
- google/adk/tests/integration/utils/test_runner.py +97 -0
- google/adk/tests/unittests/__init__.py +14 -0
- google/adk/tests/unittests/agents/__init__.py +14 -0
- google/adk/tests/unittests/agents/test_base_agent.py +407 -0
- google/adk/tests/unittests/agents/test_langgraph_agent.py +191 -0
- google/adk/tests/unittests/agents/test_llm_agent_callbacks.py +138 -0
- google/adk/tests/unittests/agents/test_llm_agent_fields.py +231 -0
- google/adk/tests/unittests/agents/test_loop_agent.py +136 -0
- google/adk/tests/unittests/agents/test_parallel_agent.py +92 -0
- google/adk/tests/unittests/agents/test_sequential_agent.py +114 -0
- google/adk/tests/unittests/artifacts/__init__.py +14 -0
- google/adk/tests/unittests/artifacts/test_artifact_service.py +276 -0
- google/adk/tests/unittests/auth/test_auth_handler.py +575 -0
- google/adk/tests/unittests/conftest.py +73 -0
- google/adk/tests/unittests/fast_api/__init__.py +14 -0
- google/adk/tests/unittests/fast_api/test_fast_api.py +269 -0
- google/adk/tests/unittests/flows/__init__.py +14 -0
- google/adk/tests/unittests/flows/llm_flows/__init__.py +14 -0
- google/adk/tests/unittests/flows/llm_flows/_test_examples.py +142 -0
- google/adk/tests/unittests/flows/llm_flows/test_agent_transfer.py +311 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_long_running.py +244 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_request_euc.py +346 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_sequential.py +93 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_simple.py +258 -0
- google/adk/tests/unittests/flows/llm_flows/test_identity.py +66 -0
- google/adk/tests/unittests/flows/llm_flows/test_instructions.py +164 -0
- google/adk/tests/unittests/flows/llm_flows/test_model_callbacks.py +142 -0
- google/adk/tests/unittests/flows/llm_flows/test_other_configs.py +46 -0
- google/adk/tests/unittests/flows/llm_flows/test_tool_callbacks.py +269 -0
- google/adk/tests/unittests/models/__init__.py +14 -0
- google/adk/tests/unittests/models/test_google_llm.py +224 -0
- google/adk/tests/unittests/models/test_litellm.py +804 -0
- google/adk/tests/unittests/models/test_models.py +60 -0
- google/adk/tests/unittests/sessions/__init__.py +14 -0
- google/adk/tests/unittests/sessions/test_session_service.py +227 -0
- google/adk/tests/unittests/sessions/test_vertex_ai_session_service.py +246 -0
- google/adk/tests/unittests/streaming/__init__.py +14 -0
- google/adk/tests/unittests/streaming/test_streaming.py +50 -0
- google/adk/tests/unittests/tools/__init__.py +14 -0
- google/adk/tests/unittests/tools/apihub_tool/clients/test_apihub_client.py +499 -0
- google/adk/tests/unittests/tools/apihub_tool/test_apihub_toolset.py +204 -0
- google/adk/tests/unittests/tools/application_integration_tool/clients/test_connections_client.py +600 -0
- google/adk/tests/unittests/tools/application_integration_tool/clients/test_integration_client.py +630 -0
- google/adk/tests/unittests/tools/application_integration_tool/test_application_integration_toolset.py +345 -0
- google/adk/tests/unittests/tools/google_api_tool/__init__.py +13 -0
- google/adk/tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py +657 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_auto_auth_credential_exchanger.py +145 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_base_auth_credential_exchanger.py +68 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_oauth2_exchanger.py +153 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_service_account_exchanger.py +196 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/test_auth_helper.py +573 -0
- google/adk/tests/unittests/tools/openapi_tool/common/test_common.py +436 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test.yaml +1367 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_spec_parser.py +628 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_toolset.py +139 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_operation_parser.py +406 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py +966 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_tool_auth_handler.py +201 -0
- google/adk/tests/unittests/tools/retrieval/__init__.py +14 -0
- google/adk/tests/unittests/tools/retrieval/test_vertex_ai_rag_retrieval.py +147 -0
- google/adk/tests/unittests/tools/test_agent_tool.py +167 -0
- google/adk/tests/unittests/tools/test_base_tool.py +141 -0
- google/adk/tests/unittests/tools/test_build_function_declaration.py +277 -0
- google/adk/tests/unittests/utils.py +304 -0
- google/adk/tools/__init__.py +51 -0
- google/adk/tools/_automatic_function_calling_util.py +346 -0
- google/adk/tools/agent_tool.py +176 -0
- google/adk/tools/apihub_tool/__init__.py +19 -0
- google/adk/tools/apihub_tool/apihub_toolset.py +209 -0
- google/adk/tools/apihub_tool/clients/__init__.py +13 -0
- google/adk/tools/apihub_tool/clients/apihub_client.py +332 -0
- google/adk/tools/apihub_tool/clients/secret_client.py +115 -0
- google/adk/tools/application_integration_tool/__init__.py +19 -0
- google/adk/tools/application_integration_tool/application_integration_toolset.py +230 -0
- google/adk/tools/application_integration_tool/clients/connections_client.py +903 -0
- google/adk/tools/application_integration_tool/clients/integration_client.py +253 -0
- google/adk/tools/base_tool.py +144 -0
- google/adk/tools/built_in_code_execution_tool.py +59 -0
- google/adk/tools/crewai_tool.py +72 -0
- google/adk/tools/example_tool.py +62 -0
- google/adk/tools/exit_loop_tool.py +23 -0
- google/adk/tools/function_parameter_parse_util.py +307 -0
- google/adk/tools/function_tool.py +87 -0
- google/adk/tools/get_user_choice_tool.py +28 -0
- google/adk/tools/google_api_tool/__init__.py +14 -0
- google/adk/tools/google_api_tool/google_api_tool.py +59 -0
- google/adk/tools/google_api_tool/google_api_tool_set.py +107 -0
- google/adk/tools/google_api_tool/google_api_tool_sets.py +55 -0
- google/adk/tools/google_api_tool/googleapi_to_openapi_converter.py +521 -0
- google/adk/tools/google_search_tool.py +68 -0
- google/adk/tools/langchain_tool.py +86 -0
- google/adk/tools/load_artifacts_tool.py +113 -0
- google/adk/tools/load_memory_tool.py +58 -0
- google/adk/tools/load_web_page.py +41 -0
- google/adk/tools/long_running_tool.py +39 -0
- google/adk/tools/mcp_tool/__init__.py +42 -0
- google/adk/tools/mcp_tool/conversion_utils.py +161 -0
- google/adk/tools/mcp_tool/mcp_tool.py +113 -0
- google/adk/tools/mcp_tool/mcp_toolset.py +272 -0
- google/adk/tools/openapi_tool/__init__.py +21 -0
- google/adk/tools/openapi_tool/auth/__init__.py +19 -0
- google/adk/tools/openapi_tool/auth/auth_helpers.py +498 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/__init__.py +25 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.py +105 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/base_credential_exchanger.py +55 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.py +117 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.py +97 -0
- google/adk/tools/openapi_tool/common/__init__.py +19 -0
- google/adk/tools/openapi_tool/common/common.py +300 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/__init__.py +32 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.py +231 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py +144 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py +260 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py +496 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py +268 -0
- google/adk/tools/preload_memory_tool.py +72 -0
- google/adk/tools/retrieval/__init__.py +36 -0
- google/adk/tools/retrieval/base_retrieval_tool.py +37 -0
- google/adk/tools/retrieval/files_retrieval.py +33 -0
- google/adk/tools/retrieval/llama_index_retrieval.py +41 -0
- google/adk/tools/retrieval/vertex_ai_rag_retrieval.py +107 -0
- google/adk/tools/tool_context.py +90 -0
- google/adk/tools/toolbox_tool.py +46 -0
- google/adk/tools/transfer_to_agent_tool.py +21 -0
- google/adk/tools/vertex_ai_search_tool.py +96 -0
- google/adk/version.py +16 -0
- google_adk-0.0.1.dist-info/LICENSE.txt → google_adk-0.0.2.dist-info/LICENSE +32 -0
- google_adk-0.0.2.dist-info/METADATA +73 -0
- google_adk-0.0.2.dist-info/RECORD +308 -0
- {google_adk-0.0.1.dist-info → google_adk-0.0.2.dist-info}/WHEEL +1 -2
- google_adk-0.0.2.dist-info/entry_points.txt +3 -0
- agent_kit/__init__.py +0 -0
- google_adk-0.0.1.dist-info/METADATA +0 -15
- google_adk-0.0.1.dist-info/RECORD +0 -6
- google_adk-0.0.1.dist-info/top_level.txt +0 -1
@@ -0,0 +1,436 @@
|
|
1
|
+
# Copyright 2025 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from typing import Any
|
16
|
+
from typing import Dict
|
17
|
+
from typing import List
|
18
|
+
|
19
|
+
from fastapi.openapi.models import Response, Schema
|
20
|
+
from google.adk.tools.openapi_tool.common.common import ApiParameter
|
21
|
+
from google.adk.tools.openapi_tool.common.common import PydocHelper
|
22
|
+
from google.adk.tools.openapi_tool.common.common import rename_python_keywords
|
23
|
+
from google.adk.tools.openapi_tool.common.common import to_snake_case
|
24
|
+
from google.adk.tools.openapi_tool.common.common import TypeHintHelper
|
25
|
+
import pytest
|
26
|
+
|
27
|
+
|
28
|
+
def dict_to_responses(input: Dict[str, Any]) -> Dict[str, Response]:
|
29
|
+
return {k: Response.model_validate(input[k]) for k in input}
|
30
|
+
|
31
|
+
|
32
|
+
class TestToSnakeCase:
|
33
|
+
|
34
|
+
@pytest.mark.parametrize(
|
35
|
+
'input_str, expected_output',
|
36
|
+
[
|
37
|
+
('lowerCamelCase', 'lower_camel_case'),
|
38
|
+
('UpperCamelCase', 'upper_camel_case'),
|
39
|
+
('space separated', 'space_separated'),
|
40
|
+
('REST API', 'rest_api'),
|
41
|
+
('Mixed_CASE with_Spaces', 'mixed_case_with_spaces'),
|
42
|
+
('__init__', 'init'),
|
43
|
+
('APIKey', 'api_key'),
|
44
|
+
('SomeLongURL', 'some_long_url'),
|
45
|
+
('CONSTANT_CASE', 'constant_case'),
|
46
|
+
('already_snake_case', 'already_snake_case'),
|
47
|
+
('single', 'single'),
|
48
|
+
('', ''),
|
49
|
+
(' spaced ', 'spaced'),
|
50
|
+
('with123numbers', 'with123numbers'),
|
51
|
+
('With_Mixed_123_and_SPACES', 'with_mixed_123_and_spaces'),
|
52
|
+
('HTMLParser', 'html_parser'),
|
53
|
+
('HTTPResponseCode', 'http_response_code'),
|
54
|
+
('a_b_c', 'a_b_c'),
|
55
|
+
('A_B_C', 'a_b_c'),
|
56
|
+
('fromAtoB', 'from_ato_b'),
|
57
|
+
('XMLHTTPRequest', 'xmlhttp_request'),
|
58
|
+
('_leading', 'leading'),
|
59
|
+
('trailing_', 'trailing'),
|
60
|
+
(' leading_and_trailing_ ', 'leading_and_trailing'),
|
61
|
+
('Multiple___Underscores', 'multiple_underscores'),
|
62
|
+
(' spaces_and___underscores ', 'spaces_and_underscores'),
|
63
|
+
(' _mixed_Case ', 'mixed_case'),
|
64
|
+
('123Start', '123_start'),
|
65
|
+
('End123', 'end123'),
|
66
|
+
('Mid123dle', 'mid123dle'),
|
67
|
+
],
|
68
|
+
)
|
69
|
+
def test_to_snake_case(self, input_str, expected_output):
|
70
|
+
assert to_snake_case(input_str) == expected_output
|
71
|
+
|
72
|
+
|
73
|
+
class TestRenamePythonKeywords:
|
74
|
+
|
75
|
+
@pytest.mark.parametrize(
|
76
|
+
'input_str, expected_output',
|
77
|
+
[
|
78
|
+
('in', 'param_in'),
|
79
|
+
('for', 'param_for'),
|
80
|
+
('class', 'param_class'),
|
81
|
+
('normal', 'normal'),
|
82
|
+
('param_if', 'param_if'),
|
83
|
+
('', ''),
|
84
|
+
],
|
85
|
+
)
|
86
|
+
def test_rename_python_keywords(self, input_str, expected_output):
|
87
|
+
assert rename_python_keywords(input_str) == expected_output
|
88
|
+
|
89
|
+
|
90
|
+
class TestApiParameter:
|
91
|
+
|
92
|
+
def test_api_parameter_initialization(self):
|
93
|
+
schema = Schema(type='string', description='A string parameter')
|
94
|
+
param = ApiParameter(
|
95
|
+
original_name='testParam',
|
96
|
+
description='A string description',
|
97
|
+
param_location='query',
|
98
|
+
param_schema=schema,
|
99
|
+
)
|
100
|
+
assert param.original_name == 'testParam'
|
101
|
+
assert param.param_location == 'query'
|
102
|
+
assert param.param_schema.type == 'string'
|
103
|
+
assert param.param_schema.description == 'A string parameter'
|
104
|
+
assert param.py_name == 'test_param'
|
105
|
+
assert param.type_hint == 'str'
|
106
|
+
assert param.type_value == str
|
107
|
+
assert param.description == 'A string description'
|
108
|
+
|
109
|
+
def test_api_parameter_keyword_rename(self):
|
110
|
+
schema = Schema(type='string')
|
111
|
+
param = ApiParameter(
|
112
|
+
original_name='in',
|
113
|
+
param_location='query',
|
114
|
+
param_schema=schema,
|
115
|
+
)
|
116
|
+
assert param.py_name == 'param_in'
|
117
|
+
|
118
|
+
def test_api_parameter_custom_py_name(self):
|
119
|
+
schema = Schema(type='integer')
|
120
|
+
param = ApiParameter(
|
121
|
+
original_name='testParam',
|
122
|
+
param_location='query',
|
123
|
+
param_schema=schema,
|
124
|
+
py_name='custom_name',
|
125
|
+
)
|
126
|
+
assert param.py_name == 'custom_name'
|
127
|
+
|
128
|
+
def test_api_parameter_str_representation(self):
|
129
|
+
schema = Schema(type='number')
|
130
|
+
param = ApiParameter(
|
131
|
+
original_name='testParam',
|
132
|
+
param_location='query',
|
133
|
+
param_schema=schema,
|
134
|
+
)
|
135
|
+
assert str(param) == 'test_param: float'
|
136
|
+
|
137
|
+
def test_api_parameter_to_arg_string(self):
|
138
|
+
schema = Schema(type='boolean')
|
139
|
+
param = ApiParameter(
|
140
|
+
original_name='testParam',
|
141
|
+
param_location='query',
|
142
|
+
param_schema=schema,
|
143
|
+
)
|
144
|
+
assert param.to_arg_string() == 'test_param=test_param'
|
145
|
+
|
146
|
+
def test_api_parameter_to_dict_property(self):
|
147
|
+
schema = Schema(type='string')
|
148
|
+
param = ApiParameter(
|
149
|
+
original_name='testParam',
|
150
|
+
param_location='path',
|
151
|
+
param_schema=schema,
|
152
|
+
)
|
153
|
+
assert param.to_dict_property() == '"test_param": test_param'
|
154
|
+
|
155
|
+
def test_api_parameter_model_serializer(self):
|
156
|
+
schema = Schema(type='string', description='test description')
|
157
|
+
param = ApiParameter(
|
158
|
+
original_name='TestParam',
|
159
|
+
param_location='path',
|
160
|
+
param_schema=schema,
|
161
|
+
py_name='test_param_custom',
|
162
|
+
description='test description',
|
163
|
+
)
|
164
|
+
|
165
|
+
serialized_param = param.model_dump(mode='json', exclude_none=True)
|
166
|
+
|
167
|
+
assert serialized_param == {
|
168
|
+
'original_name': 'TestParam',
|
169
|
+
'param_location': 'path',
|
170
|
+
'param_schema': {'type': 'string', 'description': 'test description'},
|
171
|
+
'description': 'test description',
|
172
|
+
'py_name': 'test_param_custom',
|
173
|
+
}
|
174
|
+
|
175
|
+
@pytest.mark.parametrize(
|
176
|
+
'schema, expected_type_value, expected_type_hint',
|
177
|
+
[
|
178
|
+
({'type': 'integer'}, int, 'int'),
|
179
|
+
({'type': 'number'}, float, 'float'),
|
180
|
+
({'type': 'boolean'}, bool, 'bool'),
|
181
|
+
({'type': 'string'}, str, 'str'),
|
182
|
+
(
|
183
|
+
{'type': 'string', 'format': 'date'},
|
184
|
+
str,
|
185
|
+
'str',
|
186
|
+
),
|
187
|
+
(
|
188
|
+
{'type': 'string', 'format': 'date-time'},
|
189
|
+
str,
|
190
|
+
'str',
|
191
|
+
),
|
192
|
+
(
|
193
|
+
{'type': 'array', 'items': {'type': 'integer'}},
|
194
|
+
List[int],
|
195
|
+
'List[int]',
|
196
|
+
),
|
197
|
+
(
|
198
|
+
{'type': 'array', 'items': {'type': 'string'}},
|
199
|
+
List[str],
|
200
|
+
'List[str]',
|
201
|
+
),
|
202
|
+
(
|
203
|
+
{
|
204
|
+
'type': 'array',
|
205
|
+
'items': {'type': 'object'},
|
206
|
+
},
|
207
|
+
List[Dict[str, Any]],
|
208
|
+
'List[Dict[str, Any]]',
|
209
|
+
),
|
210
|
+
({'type': 'object'}, Dict[str, Any], 'Dict[str, Any]'),
|
211
|
+
({'type': 'unknown'}, Any, 'Any'),
|
212
|
+
({}, Any, 'Any'),
|
213
|
+
],
|
214
|
+
)
|
215
|
+
def test_api_parameter_type_hint_helper(
|
216
|
+
self, schema, expected_type_value, expected_type_hint
|
217
|
+
):
|
218
|
+
param = ApiParameter(
|
219
|
+
original_name='test', param_location='query', param_schema=schema
|
220
|
+
)
|
221
|
+
assert param.type_value == expected_type_value
|
222
|
+
assert param.type_hint == expected_type_hint
|
223
|
+
assert (
|
224
|
+
TypeHintHelper.get_type_hint(param.param_schema) == expected_type_hint
|
225
|
+
)
|
226
|
+
assert (
|
227
|
+
TypeHintHelper.get_type_value(param.param_schema) == expected_type_value
|
228
|
+
)
|
229
|
+
|
230
|
+
def test_api_parameter_description(self):
|
231
|
+
schema = Schema(type='string')
|
232
|
+
param = ApiParameter(
|
233
|
+
original_name='param1',
|
234
|
+
param_location='query',
|
235
|
+
param_schema=schema,
|
236
|
+
description='The description',
|
237
|
+
)
|
238
|
+
assert param.description == 'The description'
|
239
|
+
|
240
|
+
def test_api_parameter_description_use_schema_fallback(self):
|
241
|
+
schema = Schema(type='string', description='The description')
|
242
|
+
param = ApiParameter(
|
243
|
+
original_name='param1',
|
244
|
+
param_location='query',
|
245
|
+
param_schema=schema,
|
246
|
+
)
|
247
|
+
assert param.description == 'The description'
|
248
|
+
|
249
|
+
|
250
|
+
class TestTypeHintHelper:
|
251
|
+
|
252
|
+
@pytest.mark.parametrize(
|
253
|
+
'schema, expected_type_value, expected_type_hint',
|
254
|
+
[
|
255
|
+
({'type': 'integer'}, int, 'int'),
|
256
|
+
({'type': 'number'}, float, 'float'),
|
257
|
+
({'type': 'string'}, str, 'str'),
|
258
|
+
(
|
259
|
+
{
|
260
|
+
'type': 'array',
|
261
|
+
'items': {'type': 'string'},
|
262
|
+
},
|
263
|
+
List[str],
|
264
|
+
'List[str]',
|
265
|
+
),
|
266
|
+
],
|
267
|
+
)
|
268
|
+
def test_get_type_value_and_hint(
|
269
|
+
self, schema, expected_type_value, expected_type_hint
|
270
|
+
):
|
271
|
+
|
272
|
+
param = ApiParameter(
|
273
|
+
original_name='test_param',
|
274
|
+
param_location='query',
|
275
|
+
param_schema=schema,
|
276
|
+
description='Test parameter',
|
277
|
+
)
|
278
|
+
assert (
|
279
|
+
TypeHintHelper.get_type_value(param.param_schema) == expected_type_value
|
280
|
+
)
|
281
|
+
assert (
|
282
|
+
TypeHintHelper.get_type_hint(param.param_schema) == expected_type_hint
|
283
|
+
)
|
284
|
+
|
285
|
+
|
286
|
+
class TestPydocHelper:
|
287
|
+
|
288
|
+
def test_generate_param_doc_simple(self):
|
289
|
+
schema = Schema(type='string')
|
290
|
+
param = ApiParameter(
|
291
|
+
original_name='test_param',
|
292
|
+
param_location='query',
|
293
|
+
param_schema=schema,
|
294
|
+
description='Test description',
|
295
|
+
)
|
296
|
+
|
297
|
+
expected_doc = 'test_param (str): Test description'
|
298
|
+
assert PydocHelper.generate_param_doc(param) == expected_doc
|
299
|
+
|
300
|
+
def test_generate_param_doc_no_description(self):
|
301
|
+
schema = Schema(type='integer')
|
302
|
+
param = ApiParameter(
|
303
|
+
original_name='test_param',
|
304
|
+
param_location='query',
|
305
|
+
param_schema=schema,
|
306
|
+
)
|
307
|
+
expected_doc = 'test_param (int): '
|
308
|
+
assert PydocHelper.generate_param_doc(param) == expected_doc
|
309
|
+
|
310
|
+
def test_generate_param_doc_object(self):
|
311
|
+
schema = Schema(
|
312
|
+
type='object',
|
313
|
+
properties={
|
314
|
+
'prop1': {'type': 'string', 'description': 'Prop1 desc'},
|
315
|
+
'prop2': {'type': 'integer'},
|
316
|
+
},
|
317
|
+
)
|
318
|
+
param = ApiParameter(
|
319
|
+
original_name='test_param',
|
320
|
+
param_location='query',
|
321
|
+
param_schema=schema,
|
322
|
+
description='Test object parameter',
|
323
|
+
)
|
324
|
+
expected_doc = (
|
325
|
+
'test_param (Dict[str, Any]): Test object parameter Object'
|
326
|
+
' properties:\n prop1 (str): Prop1 desc\n prop2'
|
327
|
+
' (int): \n'
|
328
|
+
)
|
329
|
+
assert PydocHelper.generate_param_doc(param) == expected_doc
|
330
|
+
|
331
|
+
def test_generate_param_doc_object_no_properties(self):
|
332
|
+
schema = Schema(type='object', description='A test schema')
|
333
|
+
param = ApiParameter(
|
334
|
+
original_name='test_param',
|
335
|
+
param_location='query',
|
336
|
+
param_schema=schema,
|
337
|
+
description='The description.',
|
338
|
+
)
|
339
|
+
expected_doc = 'test_param (Dict[str, Any]): The description.'
|
340
|
+
assert PydocHelper.generate_param_doc(param) == expected_doc
|
341
|
+
|
342
|
+
def test_generate_return_doc_simple(self):
|
343
|
+
responses = {
|
344
|
+
'200': {
|
345
|
+
'description': 'Successful response',
|
346
|
+
'content': {'application/json': {'schema': {'type': 'string'}}},
|
347
|
+
}
|
348
|
+
}
|
349
|
+
expected_doc = 'Returns (str): Successful response'
|
350
|
+
assert (
|
351
|
+
PydocHelper.generate_return_doc(dict_to_responses(responses))
|
352
|
+
== expected_doc
|
353
|
+
)
|
354
|
+
|
355
|
+
def test_generate_return_doc_no_content(self):
|
356
|
+
responses = {'204': {'description': 'No content'}}
|
357
|
+
assert not PydocHelper.generate_return_doc(dict_to_responses(responses))
|
358
|
+
|
359
|
+
def test_generate_return_doc_object(self):
|
360
|
+
responses = {
|
361
|
+
'200': {
|
362
|
+
'description': 'Successful object response',
|
363
|
+
'content': {
|
364
|
+
'application/json': {
|
365
|
+
'schema': {
|
366
|
+
'type': 'object',
|
367
|
+
'properties': {
|
368
|
+
'prop1': {
|
369
|
+
'type': 'string',
|
370
|
+
'description': 'Prop1 desc',
|
371
|
+
},
|
372
|
+
'prop2': {'type': 'integer'},
|
373
|
+
},
|
374
|
+
}
|
375
|
+
}
|
376
|
+
},
|
377
|
+
}
|
378
|
+
}
|
379
|
+
|
380
|
+
return_doc = PydocHelper.generate_return_doc(dict_to_responses(responses))
|
381
|
+
|
382
|
+
assert 'Returns (Dict[str, Any]): Successful object response' in return_doc
|
383
|
+
assert 'prop1 (str): Prop1 desc' in return_doc
|
384
|
+
assert 'prop2 (int):' in return_doc
|
385
|
+
|
386
|
+
def test_generate_return_doc_multiple_success(self):
|
387
|
+
responses = {
|
388
|
+
'200': {
|
389
|
+
'description': 'Successful response',
|
390
|
+
'content': {'application/json': {'schema': {'type': 'string'}}},
|
391
|
+
},
|
392
|
+
'400': {'description': 'Bad request'},
|
393
|
+
}
|
394
|
+
expected_doc = 'Returns (str): Successful response'
|
395
|
+
assert (
|
396
|
+
PydocHelper.generate_return_doc(dict_to_responses(responses))
|
397
|
+
== expected_doc
|
398
|
+
)
|
399
|
+
|
400
|
+
def test_generate_return_doc_2xx_smallest_status_code_response(self):
|
401
|
+
responses = {
|
402
|
+
'201': {
|
403
|
+
'description': '201 response',
|
404
|
+
'content': {'application/json': {'schema': {'type': 'integer'}}},
|
405
|
+
},
|
406
|
+
'200': {
|
407
|
+
'description': '200 response',
|
408
|
+
'content': {'application/json': {'schema': {'type': 'string'}}},
|
409
|
+
},
|
410
|
+
'400': {'description': 'Bad request'},
|
411
|
+
}
|
412
|
+
|
413
|
+
expected_doc = 'Returns (str): 200 response'
|
414
|
+
assert (
|
415
|
+
PydocHelper.generate_return_doc(dict_to_responses(responses))
|
416
|
+
== expected_doc
|
417
|
+
)
|
418
|
+
|
419
|
+
def test_generate_return_doc_contentful_response(self):
|
420
|
+
responses = {
|
421
|
+
'200': {'description': 'No content response'},
|
422
|
+
'201': {
|
423
|
+
'description': '201 response',
|
424
|
+
'content': {'application/json': {'schema': {'type': 'string'}}},
|
425
|
+
},
|
426
|
+
'400': {'description': 'Bad request'},
|
427
|
+
}
|
428
|
+
expected_doc = 'Returns (str): 201 response'
|
429
|
+
assert (
|
430
|
+
PydocHelper.generate_return_doc(dict_to_responses(responses))
|
431
|
+
== expected_doc
|
432
|
+
)
|
433
|
+
|
434
|
+
|
435
|
+
if __name__ == '__main__':
|
436
|
+
pytest.main([__file__])
|