auto-coder 1.0.0__py3-none-any.whl → 2.0.0__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.
Potentially problematic release.
This version of auto-coder might be problematic. Click here for more details.
- auto_coder-2.0.0.dist-info/LICENSE +158 -0
- auto_coder-2.0.0.dist-info/METADATA +558 -0
- auto_coder-2.0.0.dist-info/RECORD +795 -0
- {auto_coder-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
- {auto_coder-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
- autocoder/__init__.py +31 -0
- autocoder/agent/auto_filegroup.py +32 -13
- autocoder/agent/auto_learn_from_commit.py +9 -1
- autocoder/agent/base_agentic/__init__.py +3 -0
- autocoder/agent/base_agentic/agent_hub.py +1 -1
- autocoder/agent/base_agentic/base_agent.py +235 -136
- autocoder/agent/base_agentic/default_tools.py +119 -118
- autocoder/agent/base_agentic/test_base_agent.py +1 -1
- autocoder/agent/base_agentic/tool_registry.py +32 -20
- autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +24 -3
- autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
- autocoder/agent/base_agentic/types.py +42 -0
- autocoder/agent/entry_command_agent/chat.py +73 -59
- autocoder/auto_coder.py +31 -40
- autocoder/auto_coder_rag.py +11 -1084
- autocoder/auto_coder_runner.py +970 -2345
- autocoder/auto_coder_terminal.py +26 -0
- autocoder/auto_coder_terminal_v3.py +190 -0
- autocoder/chat/conf_command.py +224 -124
- autocoder/chat/models_command.py +361 -299
- autocoder/chat/rules_command.py +79 -31
- autocoder/chat_auto_coder.py +988 -398
- autocoder/chat_auto_coder_lang.py +23 -732
- autocoder/commands/auto_command.py +25 -8
- autocoder/commands/auto_web.py +1 -1
- autocoder/commands/tools.py +44 -44
- autocoder/common/__init__.py +150 -128
- autocoder/common/ac_style_command_parser/__init__.py +39 -2
- autocoder/common/ac_style_command_parser/config.py +422 -0
- autocoder/common/ac_style_command_parser/parser.py +292 -78
- autocoder/common/ac_style_command_parser/test_parser.py +241 -16
- autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
- autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
- autocoder/common/action_yml_file_manager.py +25 -13
- autocoder/common/agent_events/__init__.py +52 -0
- autocoder/common/agent_events/agent_event_emitter.py +193 -0
- autocoder/common/agent_events/event_factory.py +177 -0
- autocoder/common/agent_events/examples.py +307 -0
- autocoder/common/agent_events/types.py +113 -0
- autocoder/common/agent_events/utils.py +68 -0
- autocoder/common/agent_hooks/__init__.py +44 -0
- autocoder/common/agent_hooks/examples.py +582 -0
- autocoder/common/agent_hooks/hook_executor.py +217 -0
- autocoder/common/agent_hooks/hook_manager.py +288 -0
- autocoder/common/agent_hooks/types.py +133 -0
- autocoder/common/agent_hooks/utils.py +99 -0
- autocoder/common/agent_query_queue/queue_executor.py +324 -0
- autocoder/common/agent_query_queue/queue_manager.py +325 -0
- autocoder/common/agents/__init__.py +11 -0
- autocoder/common/agents/agent_manager.py +323 -0
- autocoder/common/agents/agent_parser.py +189 -0
- autocoder/common/agents/example_usage.py +344 -0
- autocoder/common/agents/integration_example.py +330 -0
- autocoder/common/agents/test_agent_parser.py +545 -0
- autocoder/common/async_utils.py +101 -0
- autocoder/common/auto_coder_lang.py +23 -972
- autocoder/common/autocoderargs_parser/__init__.py +14 -0
- autocoder/common/autocoderargs_parser/parser.py +184 -0
- autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
- autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
- autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
- autocoder/common/autocoderargs_parser/token_parser.py +290 -0
- autocoder/common/buildin_tokenizer.py +2 -4
- autocoder/common/code_auto_generate.py +149 -74
- autocoder/common/code_auto_generate_diff.py +163 -70
- autocoder/common/code_auto_generate_editblock.py +179 -89
- autocoder/common/code_auto_generate_strict_diff.py +167 -72
- autocoder/common/code_auto_merge_editblock.py +13 -6
- autocoder/common/code_modification_ranker.py +1 -1
- autocoder/common/command_completer.py +3 -3
- autocoder/common/command_file_manager/manager.py +183 -47
- autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
- autocoder/common/command_templates.py +1 -1
- autocoder/common/conf_utils.py +2 -4
- autocoder/common/conversations/config.py +11 -3
- autocoder/common/conversations/get_conversation_manager.py +100 -2
- autocoder/common/conversations/llm_stats_models.py +264 -0
- autocoder/common/conversations/manager.py +112 -28
- autocoder/common/conversations/models.py +16 -2
- autocoder/common/conversations/storage/index_manager.py +134 -10
- autocoder/common/core_config/__init__.py +63 -0
- autocoder/common/core_config/agentic_mode_manager.py +109 -0
- autocoder/common/core_config/base_manager.py +123 -0
- autocoder/common/core_config/compatibility.py +151 -0
- autocoder/common/core_config/config_manager.py +156 -0
- autocoder/common/core_config/conversation_manager.py +31 -0
- autocoder/common/core_config/exclude_manager.py +72 -0
- autocoder/common/core_config/file_manager.py +177 -0
- autocoder/common/core_config/human_as_model_manager.py +129 -0
- autocoder/common/core_config/lib_manager.py +54 -0
- autocoder/common/core_config/main_manager.py +81 -0
- autocoder/common/core_config/mode_manager.py +126 -0
- autocoder/common/core_config/models.py +70 -0
- autocoder/common/core_config/test_memory_manager.py +1056 -0
- autocoder/common/env_manager.py +282 -0
- autocoder/common/env_manager_usage_example.py +211 -0
- autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
- autocoder/common/file_checkpoint/manager.py +264 -48
- autocoder/common/file_checkpoint/test_backup.py +1 -18
- autocoder/common/file_checkpoint/test_manager.py +270 -1
- autocoder/common/file_checkpoint/test_store.py +1 -17
- autocoder/common/file_handler/__init__.py +23 -0
- autocoder/common/file_handler/active_context_handler.py +159 -0
- autocoder/common/file_handler/add_files_handler.py +409 -0
- autocoder/common/file_handler/chat_handler.py +180 -0
- autocoder/common/file_handler/coding_handler.py +401 -0
- autocoder/common/file_handler/commit_handler.py +200 -0
- autocoder/common/file_handler/lib_handler.py +156 -0
- autocoder/common/file_handler/list_files_handler.py +111 -0
- autocoder/common/file_handler/mcp_handler.py +268 -0
- autocoder/common/file_handler/models_handler.py +493 -0
- autocoder/common/file_handler/remove_files_handler.py +172 -0
- autocoder/common/git_utils.py +44 -8
- autocoder/common/global_cancel.py +15 -6
- autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
- autocoder/common/international/__init__.py +31 -0
- autocoder/common/international/demo_international.py +92 -0
- autocoder/common/international/message_manager.py +157 -0
- autocoder/common/international/messages/__init__.py +56 -0
- autocoder/common/international/messages/async_command_messages.py +507 -0
- autocoder/common/international/messages/auto_coder_messages.py +2208 -0
- autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
- autocoder/common/international/messages/command_help_messages.py +986 -0
- autocoder/common/international/messages/conversation_command_messages.py +191 -0
- autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
- autocoder/common/international/messages/queue_command_messages.py +751 -0
- autocoder/common/international/messages/rules_command_messages.py +77 -0
- autocoder/common/international/messages/sdk_messages.py +1707 -0
- autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
- autocoder/common/international/messages/tool_display_messages.py +1212 -0
- autocoder/common/international/messages/workflow_exception_messages.py +473 -0
- autocoder/common/international/test_international.py +612 -0
- autocoder/common/linter_core/__init__.py +28 -0
- autocoder/common/linter_core/base_linter.py +61 -0
- autocoder/common/linter_core/config_loader.py +271 -0
- autocoder/common/linter_core/formatters/__init__.py +0 -0
- autocoder/common/linter_core/formatters/base_formatter.py +38 -0
- autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
- autocoder/common/linter_core/linter.py +166 -0
- autocoder/common/linter_core/linter_factory.py +216 -0
- autocoder/common/linter_core/linter_manager.py +333 -0
- autocoder/common/linter_core/linters/__init__.py +9 -0
- autocoder/common/linter_core/linters/java_linter.py +342 -0
- autocoder/common/linter_core/linters/python_linter.py +115 -0
- autocoder/common/linter_core/linters/typescript_linter.py +119 -0
- autocoder/common/linter_core/models/__init__.py +7 -0
- autocoder/common/linter_core/models/lint_result.py +91 -0
- autocoder/common/linter_core/models.py +33 -0
- autocoder/common/linter_core/tests/__init__.py +3 -0
- autocoder/common/linter_core/tests/test_config_loader.py +323 -0
- autocoder/common/linter_core/tests/test_config_loading.py +308 -0
- autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
- autocoder/common/linter_core/tests/test_formatters.py +147 -0
- autocoder/common/linter_core/tests/test_integration.py +317 -0
- autocoder/common/linter_core/tests/test_java_linter.py +496 -0
- autocoder/common/linter_core/tests/test_linters.py +265 -0
- autocoder/common/linter_core/tests/test_models.py +81 -0
- autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
- autocoder/common/linter_core/tests/verify_fixes.py +183 -0
- autocoder/common/llm_friendly_package/__init__.py +31 -0
- autocoder/common/llm_friendly_package/base_manager.py +102 -0
- autocoder/common/llm_friendly_package/docs_manager.py +121 -0
- autocoder/common/llm_friendly_package/library_manager.py +171 -0
- autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
- autocoder/common/llm_friendly_package/models.py +40 -0
- autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
- autocoder/common/llms/__init__.py +15 -0
- autocoder/common/llms/demo_error_handling.py +85 -0
- autocoder/common/llms/factory.py +142 -0
- autocoder/common/llms/manager.py +264 -0
- autocoder/common/llms/pricing.py +121 -0
- autocoder/common/llms/registry.py +288 -0
- autocoder/common/llms/schema.py +77 -0
- autocoder/common/llms/simple_demo.py +45 -0
- autocoder/common/llms/test_quick_model.py +116 -0
- autocoder/common/llms/test_remove_functionality.py +182 -0
- autocoder/common/llms/tests/__init__.py +1 -0
- autocoder/common/llms/tests/test_manager.py +330 -0
- autocoder/common/llms/tests/test_registry.py +364 -0
- autocoder/common/mcp_tools/__init__.py +62 -0
- autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
- autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
- autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
- autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
- autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
- autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
- autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
- autocoder/common/mcp_tools/verify_functionality.py +202 -0
- autocoder/common/model_speed_tester.py +32 -26
- autocoder/common/priority_directory_finder/__init__.py +142 -0
- autocoder/common/priority_directory_finder/examples.py +230 -0
- autocoder/common/priority_directory_finder/finder.py +283 -0
- autocoder/common/priority_directory_finder/models.py +236 -0
- autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
- autocoder/common/project_scanner/__init__.py +18 -0
- autocoder/common/project_scanner/compat.py +77 -0
- autocoder/common/project_scanner/scanner.py +436 -0
- autocoder/common/project_tracker/__init__.py +27 -0
- autocoder/common/project_tracker/api.py +228 -0
- autocoder/common/project_tracker/demo.py +272 -0
- autocoder/common/project_tracker/tracker.py +487 -0
- autocoder/common/project_tracker/types.py +53 -0
- autocoder/common/pruner/__init__.py +67 -0
- autocoder/common/pruner/agentic_conversation_pruner.py +651 -102
- autocoder/common/pruner/conversation_message_ids_api.py +386 -0
- autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
- autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
- autocoder/common/pruner/conversation_normalizer.py +347 -0
- autocoder/common/pruner/conversation_pruner.py +26 -6
- autocoder/common/pruner/test_agentic_conversation_pruner.py +554 -112
- autocoder/common/pruner/test_conversation_normalizer.py +502 -0
- autocoder/common/pruner/test_tool_content_detector.py +324 -0
- autocoder/common/pruner/tool_content_detector.py +227 -0
- autocoder/common/pruner/tools/__init__.py +18 -0
- autocoder/common/pruner/tools/query_message_ids.py +264 -0
- autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
- autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
- autocoder/common/pull_requests/__init__.py +9 -1
- autocoder/common/pull_requests/utils.py +122 -1
- autocoder/common/rag_manager/rag_manager.py +36 -40
- autocoder/common/rulefiles/__init__.py +53 -1
- autocoder/common/rulefiles/api.py +250 -0
- autocoder/common/rulefiles/core/__init__.py +14 -0
- autocoder/common/rulefiles/core/manager.py +241 -0
- autocoder/common/rulefiles/core/selector.py +805 -0
- autocoder/common/rulefiles/models/__init__.py +20 -0
- autocoder/common/rulefiles/models/index.py +16 -0
- autocoder/common/rulefiles/models/init_rule.py +18 -0
- autocoder/common/rulefiles/models/rule_file.py +18 -0
- autocoder/common/rulefiles/models/rule_relevance.py +14 -0
- autocoder/common/rulefiles/models/summary.py +16 -0
- autocoder/common/rulefiles/test_rulefiles.py +776 -0
- autocoder/common/rulefiles/utils/__init__.py +34 -0
- autocoder/common/rulefiles/utils/monitor.py +86 -0
- autocoder/common/rulefiles/utils/parser.py +230 -0
- autocoder/common/save_formatted_log.py +67 -10
- autocoder/common/search_replace.py +8 -1
- autocoder/common/search_replace_patch/__init__.py +24 -0
- autocoder/common/search_replace_patch/base.py +115 -0
- autocoder/common/search_replace_patch/manager.py +248 -0
- autocoder/common/search_replace_patch/patch_replacer.py +304 -0
- autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
- autocoder/common/search_replace_patch/string_replacer.py +181 -0
- autocoder/common/search_replace_patch/tests/__init__.py +3 -0
- autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
- autocoder/common/search_replace_patch/tests/test_base.py +188 -0
- autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
- autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
- autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
- autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
- autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
- autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
- autocoder/common/shell_commands/__init__.py +197 -0
- autocoder/common/shell_commands/background_process_notifier.py +346 -0
- autocoder/common/shell_commands/command_executor.py +1127 -0
- autocoder/common/shell_commands/error_recovery.py +541 -0
- autocoder/common/shell_commands/exceptions.py +120 -0
- autocoder/common/shell_commands/interactive_executor.py +476 -0
- autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
- autocoder/common/shell_commands/interactive_process.py +744 -0
- autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
- autocoder/common/shell_commands/monitoring.py +529 -0
- autocoder/common/shell_commands/process_cleanup.py +386 -0
- autocoder/common/shell_commands/process_manager.py +606 -0
- autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
- autocoder/common/shell_commands/tests/__init__.py +6 -0
- autocoder/common/shell_commands/tests/conftest.py +118 -0
- autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
- autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
- autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
- autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
- autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
- autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
- autocoder/common/shell_commands/tests/test_integration.py +664 -0
- autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
- autocoder/common/shell_commands/tests/test_performance.py +632 -0
- autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
- autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
- autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
- autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
- autocoder/common/shell_commands/timeout_config.py +315 -0
- autocoder/common/shell_commands/timeout_manager.py +352 -0
- autocoder/common/terminal_paste/__init__.py +14 -0
- autocoder/common/terminal_paste/demo.py +145 -0
- autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
- autocoder/common/terminal_paste/paste_handler.py +200 -0
- autocoder/common/terminal_paste/paste_manager.py +118 -0
- autocoder/common/terminal_paste/tests/__init__.py +1 -0
- autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
- autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
- autocoder/common/terminal_paste/utils.py +163 -0
- autocoder/common/test_autocoder_args.py +232 -0
- autocoder/common/test_env_manager.py +173 -0
- autocoder/common/test_env_manager_integration.py +159 -0
- autocoder/common/text_similarity/__init__.py +9 -0
- autocoder/common/text_similarity/demo.py +216 -0
- autocoder/common/text_similarity/examples.py +266 -0
- autocoder/common/text_similarity/test_text_similarity.py +306 -0
- autocoder/common/text_similarity/text_similarity.py +194 -0
- autocoder/common/text_similarity/utils.py +125 -0
- autocoder/common/todos/__init__.py +61 -0
- autocoder/common/todos/cache/__init__.py +16 -0
- autocoder/common/todos/cache/base_cache.py +89 -0
- autocoder/common/todos/cache/cache_manager.py +228 -0
- autocoder/common/todos/cache/memory_cache.py +225 -0
- autocoder/common/todos/config.py +155 -0
- autocoder/common/todos/exceptions.py +35 -0
- autocoder/common/todos/get_todo_manager.py +161 -0
- autocoder/common/todos/manager.py +537 -0
- autocoder/common/todos/models.py +239 -0
- autocoder/common/todos/storage/__init__.py +14 -0
- autocoder/common/todos/storage/base_storage.py +76 -0
- autocoder/common/todos/storage/file_storage.py +278 -0
- autocoder/common/tokens/counter.py +24 -2
- autocoder/common/tools_manager/__init__.py +17 -0
- autocoder/common/tools_manager/examples.py +162 -0
- autocoder/common/tools_manager/manager.py +385 -0
- autocoder/common/tools_manager/models.py +39 -0
- autocoder/common/tools_manager/test_tools_manager.py +303 -0
- autocoder/common/tools_manager/utils.py +191 -0
- autocoder/common/v2/agent/agentic_callbacks.py +270 -0
- autocoder/common/v2/agent/agentic_edit.py +2699 -1856
- autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
- autocoder/common/v2/agent/agentic_edit_tools/__init__.py +35 -1
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +10 -1
- autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
- autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
- autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
- autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
- autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
- autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +564 -29
- autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
- autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
- autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
- autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
- autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
- autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
- autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
- autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +243 -50
- autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
- autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
- autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +410 -86
- autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
- autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
- autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
- autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +207 -192
- autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +80 -63
- autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +237 -233
- autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
- autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
- autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
- autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
- autocoder/common/v2/agent/agentic_edit_types.py +343 -9
- autocoder/common/v2/agent/runner/__init__.py +3 -3
- autocoder/common/v2/agent/runner/base_runner.py +12 -26
- autocoder/common/v2/agent/runner/{event_runner.py → file_based_event_runner.py} +3 -2
- autocoder/common/v2/agent/runner/sdk_runner.py +150 -8
- autocoder/common/v2/agent/runner/terminal_runner.py +170 -57
- autocoder/common/v2/agent/runner/tool_display.py +557 -159
- autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
- autocoder/common/v2/agent/test_agentic_edit.py +194 -0
- autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
- autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
- autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
- autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
- autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
- autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
- autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
- autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
- autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
- autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
- autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
- autocoder/common/v2/code_auto_generate.py +136 -78
- autocoder/common/v2/code_auto_generate_diff.py +135 -79
- autocoder/common/v2/code_auto_generate_editblock.py +174 -99
- autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
- autocoder/common/v2/code_auto_merge.py +1 -1
- autocoder/common/v2/code_auto_merge_editblock.py +13 -1
- autocoder/common/v2/code_diff_manager.py +3 -3
- autocoder/common/v2/code_editblock_manager.py +4 -14
- autocoder/common/v2/code_manager.py +1 -1
- autocoder/common/v2/code_strict_diff_manager.py +2 -2
- autocoder/common/wrap_llm_hint/__init__.py +10 -0
- autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
- autocoder/common/wrap_llm_hint/utils.py +432 -0
- autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
- autocoder/completer/__init__.py +8 -0
- autocoder/completer/command_completer_v2.py +1051 -0
- autocoder/default_project/__init__.py +501 -0
- autocoder/dispacher/__init__.py +4 -12
- autocoder/dispacher/actions/action.py +165 -7
- autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
- autocoder/index/entry.py +116 -124
- autocoder/{agent → index/filter}/agentic_filter.py +322 -333
- autocoder/index/filter/normal_filter.py +5 -11
- autocoder/index/filter/quick_filter.py +1 -1
- autocoder/index/index.py +36 -9
- autocoder/index/tests/__init__.py +1 -0
- autocoder/index/tests/run_tests.py +195 -0
- autocoder/index/tests/test_entry.py +303 -0
- autocoder/index/tests/test_index_manager.py +314 -0
- autocoder/index/tests/test_module_integration.py +300 -0
- autocoder/index/tests/test_symbols_utils.py +183 -0
- autocoder/inner/__init__.py +4 -0
- autocoder/inner/agentic.py +932 -0
- autocoder/inner/async_command_handler.py +992 -0
- autocoder/inner/conversation_command_handlers.py +623 -0
- autocoder/inner/merge_command_handler.py +213 -0
- autocoder/inner/queue_command_handler.py +684 -0
- autocoder/models.py +95 -266
- autocoder/plugins/git_helper_plugin.py +31 -29
- autocoder/plugins/token_helper_plugin.py +65 -46
- autocoder/pyproject/__init__.py +32 -29
- autocoder/rag/agentic_rag.py +215 -75
- autocoder/rag/cache/simple_cache.py +1 -2
- autocoder/rag/loaders/image_loader.py +1 -1
- autocoder/rag/long_context_rag.py +42 -26
- autocoder/rag/qa_conversation_strategy.py +1 -1
- autocoder/rag/terminal/__init__.py +17 -0
- autocoder/rag/terminal/args.py +581 -0
- autocoder/rag/terminal/bootstrap.py +61 -0
- autocoder/rag/terminal/command_handlers.py +653 -0
- autocoder/rag/terminal/formatters/__init__.py +20 -0
- autocoder/rag/terminal/formatters/base.py +70 -0
- autocoder/rag/terminal/formatters/json_format.py +66 -0
- autocoder/rag/terminal/formatters/stream_json.py +95 -0
- autocoder/rag/terminal/formatters/text.py +28 -0
- autocoder/rag/terminal/init.py +120 -0
- autocoder/rag/terminal/utils.py +106 -0
- autocoder/rag/test_agentic_rag.py +389 -0
- autocoder/rag/test_doc_filter.py +3 -3
- autocoder/rag/test_long_context_rag.py +1 -1
- autocoder/rag/test_token_limiter.py +517 -10
- autocoder/rag/token_counter.py +3 -0
- autocoder/rag/token_limiter.py +19 -15
- autocoder/rag/tools/__init__.py +26 -2
- autocoder/rag/tools/bochaai_example.py +343 -0
- autocoder/rag/tools/bochaai_sdk.py +541 -0
- autocoder/rag/tools/metaso_example.py +268 -0
- autocoder/rag/tools/metaso_sdk.py +417 -0
- autocoder/rag/tools/recall_tool.py +28 -7
- autocoder/rag/tools/run_integration_tests.py +204 -0
- autocoder/rag/tools/test_all_providers.py +318 -0
- autocoder/rag/tools/test_bochaai_integration.py +482 -0
- autocoder/rag/tools/test_final_integration.py +215 -0
- autocoder/rag/tools/test_metaso_integration.py +424 -0
- autocoder/rag/tools/test_metaso_real.py +171 -0
- autocoder/rag/tools/test_web_crawl_tool.py +639 -0
- autocoder/rag/tools/test_web_search_tool.py +509 -0
- autocoder/rag/tools/todo_read_tool.py +202 -0
- autocoder/rag/tools/todo_write_tool.py +412 -0
- autocoder/rag/tools/web_crawl_tool.py +634 -0
- autocoder/rag/tools/web_search_tool.py +558 -0
- autocoder/rag/tools/web_tools_example.py +119 -0
- autocoder/rag/types.py +16 -0
- autocoder/rag/variable_holder.py +4 -2
- autocoder/rags.py +86 -79
- autocoder/regexproject/__init__.py +23 -21
- autocoder/sdk/__init__.py +46 -190
- autocoder/sdk/api.py +370 -0
- autocoder/sdk/async_runner/__init__.py +26 -0
- autocoder/sdk/async_runner/async_executor.py +650 -0
- autocoder/sdk/async_runner/async_handler.py +356 -0
- autocoder/sdk/async_runner/markdown_processor.py +595 -0
- autocoder/sdk/async_runner/task_metadata.py +284 -0
- autocoder/sdk/async_runner/worktree_manager.py +438 -0
- autocoder/sdk/cli/__init__.py +2 -5
- autocoder/sdk/cli/formatters.py +28 -204
- autocoder/sdk/cli/handlers.py +77 -44
- autocoder/sdk/cli/main.py +154 -171
- autocoder/sdk/cli/options.py +95 -22
- autocoder/sdk/constants.py +139 -51
- autocoder/sdk/core/auto_coder_core.py +484 -109
- autocoder/sdk/core/bridge.py +297 -115
- autocoder/sdk/exceptions.py +18 -12
- autocoder/sdk/formatters/__init__.py +19 -0
- autocoder/sdk/formatters/input.py +64 -0
- autocoder/sdk/formatters/output.py +247 -0
- autocoder/sdk/formatters/stream.py +54 -0
- autocoder/sdk/models/__init__.py +6 -5
- autocoder/sdk/models/options.py +55 -18
- autocoder/sdk/utils/formatters.py +27 -195
- autocoder/suffixproject/__init__.py +28 -25
- autocoder/terminal/__init__.py +14 -0
- autocoder/terminal/app.py +454 -0
- autocoder/terminal/args.py +32 -0
- autocoder/terminal/bootstrap.py +178 -0
- autocoder/terminal/command_processor.py +521 -0
- autocoder/terminal/command_registry.py +57 -0
- autocoder/terminal/help.py +97 -0
- autocoder/terminal/tasks/__init__.py +5 -0
- autocoder/terminal/tasks/background.py +77 -0
- autocoder/terminal/tasks/task_event.py +70 -0
- autocoder/terminal/ui/__init__.py +13 -0
- autocoder/terminal/ui/completer.py +268 -0
- autocoder/terminal/ui/keybindings.py +75 -0
- autocoder/terminal/ui/session.py +41 -0
- autocoder/terminal/ui/toolbar.py +64 -0
- autocoder/terminal/utils/__init__.py +13 -0
- autocoder/terminal/utils/errors.py +18 -0
- autocoder/terminal/utils/paths.py +19 -0
- autocoder/terminal/utils/shell.py +43 -0
- autocoder/terminal_v3/__init__.py +10 -0
- autocoder/terminal_v3/app.py +201 -0
- autocoder/terminal_v3/handlers/__init__.py +5 -0
- autocoder/terminal_v3/handlers/command_handler.py +131 -0
- autocoder/terminal_v3/models/__init__.py +6 -0
- autocoder/terminal_v3/models/conversation_buffer.py +214 -0
- autocoder/terminal_v3/models/message.py +50 -0
- autocoder/terminal_v3/models/tool_display.py +247 -0
- autocoder/terminal_v3/ui/__init__.py +7 -0
- autocoder/terminal_v3/ui/keybindings.py +56 -0
- autocoder/terminal_v3/ui/layout.py +141 -0
- autocoder/terminal_v3/ui/styles.py +43 -0
- autocoder/tsproject/__init__.py +23 -23
- autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
- autocoder/utils/llms.py +88 -80
- autocoder/utils/math_utils.py +101 -0
- autocoder/utils/model_provider_selector.py +16 -4
- autocoder/utils/operate_config_api.py +33 -5
- autocoder/utils/thread_utils.py +2 -2
- autocoder/version.py +4 -2
- autocoder/workflow_agents/__init__.py +84 -0
- autocoder/workflow_agents/agent.py +143 -0
- autocoder/workflow_agents/exceptions.py +573 -0
- autocoder/workflow_agents/executor.py +489 -0
- autocoder/workflow_agents/loader.py +737 -0
- autocoder/workflow_agents/runner.py +267 -0
- autocoder/workflow_agents/types.py +172 -0
- autocoder/workflow_agents/utils.py +434 -0
- autocoder/workflow_agents/workflow_manager.py +211 -0
- auto_coder-1.0.0.dist-info/METADATA +0 -396
- auto_coder-1.0.0.dist-info/RECORD +0 -442
- auto_coder-1.0.0.dist-info/licenses/LICENSE +0 -201
- autocoder/auto_coder_server.py +0 -672
- autocoder/benchmark.py +0 -138
- autocoder/common/ac_style_command_parser/example.py +0 -7
- autocoder/common/cleaner.py +0 -31
- autocoder/common/command_completer_v2.py +0 -615
- autocoder/common/context_pruner.py +0 -477
- autocoder/common/conversation_pruner.py +0 -132
- autocoder/common/directory_cache/__init__.py +0 -1
- autocoder/common/directory_cache/cache.py +0 -192
- autocoder/common/directory_cache/test_cache.py +0 -190
- autocoder/common/file_checkpoint/examples.py +0 -217
- autocoder/common/llm_friendly_package_example.py +0 -138
- autocoder/common/llm_friendly_package_test.py +0 -63
- autocoder/common/pull_requests/test_module.py +0 -1
- autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
- autocoder/common/text.py +0 -30
- autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
- autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
- autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
- autocoder/common/v2/agent/agentic_tool_display.py +0 -183
- autocoder/plugins/dynamic_completion_example.py +0 -148
- autocoder/plugins/sample_plugin.py +0 -160
- autocoder/sdk/cli/__main__.py +0 -26
- autocoder/sdk/cli/completion_wrapper.py +0 -38
- autocoder/sdk/cli/install_completion.py +0 -301
- autocoder/sdk/models/messages.py +0 -209
- autocoder/sdk/session/__init__.py +0 -32
- autocoder/sdk/session/session.py +0 -106
- autocoder/sdk/session/session_manager.py +0 -56
- {auto_coder-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
- /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
|
@@ -0,0 +1,612 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
测试国际化模块的功能
|
|
4
|
+
Test cases for the international module
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
import os
|
|
9
|
+
import tempfile
|
|
10
|
+
from unittest.mock import patch, MagicMock
|
|
11
|
+
from autocoder.common.international import (
|
|
12
|
+
MessageManager,
|
|
13
|
+
register_messages,
|
|
14
|
+
get_message,
|
|
15
|
+
get_message_with_format,
|
|
16
|
+
get_system_language,
|
|
17
|
+
get_message_manager,
|
|
18
|
+
get_supported_languages,
|
|
19
|
+
is_language_supported
|
|
20
|
+
)
|
|
21
|
+
from autocoder.common.international.messages.auto_coder_messages import AUTO_CODER_MESSAGES
|
|
22
|
+
from autocoder.common.international.messages.chat_auto_coder_messages import CHAT_AUTO_CODER_MESSAGES
|
|
23
|
+
from autocoder.common.international.messages.sdk_messages import SDK_MESSAGES
|
|
24
|
+
from autocoder.common.international.messages.rules_command_messages import RULES_COMMAND_MESSAGES
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@pytest.fixture
|
|
28
|
+
def message_manager():
|
|
29
|
+
"""创建MessageManager实例的fixture"""
|
|
30
|
+
return MessageManager()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@pytest.fixture
|
|
34
|
+
def test_messages():
|
|
35
|
+
"""测试消息的fixture"""
|
|
36
|
+
return {
|
|
37
|
+
"test_key": {
|
|
38
|
+
"en": "Test message",
|
|
39
|
+
"zh": "测试消息",
|
|
40
|
+
"ja": "テストメッセージ",
|
|
41
|
+
"ar": "رسالة اختبار",
|
|
42
|
+
"ru": "Тестовое сообщение"
|
|
43
|
+
},
|
|
44
|
+
"another_key": {
|
|
45
|
+
"en": "Another message",
|
|
46
|
+
"zh": "另一条消息",
|
|
47
|
+
"ja": "別のメッセージ",
|
|
48
|
+
"ar": "رسالة أخرى",
|
|
49
|
+
"ru": "Другое сообщение"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class TestMessageManager:
|
|
55
|
+
"""测试MessageManager类"""
|
|
56
|
+
|
|
57
|
+
def test_singleton_pattern(self):
|
|
58
|
+
"""测试单例模式"""
|
|
59
|
+
manager1 = get_message_manager()
|
|
60
|
+
manager2 = get_message_manager()
|
|
61
|
+
assert manager1 is manager2, "MessageManager should be singleton"
|
|
62
|
+
|
|
63
|
+
def test_register_messages(self, message_manager, test_messages):
|
|
64
|
+
"""测试消息注册功能"""
|
|
65
|
+
message_manager.register_messages(test_messages)
|
|
66
|
+
|
|
67
|
+
# 验证消息已注册
|
|
68
|
+
assert "test_key" in message_manager._messages
|
|
69
|
+
assert "another_key" in message_manager._messages
|
|
70
|
+
assert message_manager._messages["test_key"]["en"] == "Test message"
|
|
71
|
+
assert message_manager._messages["test_key"]["zh"] == "测试消息"
|
|
72
|
+
|
|
73
|
+
@pytest.mark.parametrize("language,expected", [
|
|
74
|
+
("en", "Hello"),
|
|
75
|
+
("zh", "你好"),
|
|
76
|
+
("ja", "こんにちは"),
|
|
77
|
+
("ar", "مرحبا"),
|
|
78
|
+
("ru", "Привет")
|
|
79
|
+
])
|
|
80
|
+
def test_get_message_multilingual(self, message_manager, language, expected):
|
|
81
|
+
"""测试获取多语言消息"""
|
|
82
|
+
test_messages = {
|
|
83
|
+
"greeting": {
|
|
84
|
+
"en": "Hello",
|
|
85
|
+
"zh": "你好",
|
|
86
|
+
"ja": "こんにちは",
|
|
87
|
+
"ar": "مرحبا",
|
|
88
|
+
"ru": "Привет"
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
message_manager.register_messages(test_messages)
|
|
93
|
+
|
|
94
|
+
# 模拟指定语言环境
|
|
95
|
+
with patch.object(message_manager, 'get_system_language', return_value=language):
|
|
96
|
+
message = message_manager.get_message("greeting")
|
|
97
|
+
assert message == expected
|
|
98
|
+
|
|
99
|
+
def test_get_message_fallback_to_english(self, message_manager):
|
|
100
|
+
"""测试不支持的语言回退到英文"""
|
|
101
|
+
test_messages = {
|
|
102
|
+
"greeting": {
|
|
103
|
+
"en": "Hello",
|
|
104
|
+
"zh": "你好"
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
message_manager.register_messages(test_messages)
|
|
109
|
+
|
|
110
|
+
# 模拟不支持的语言
|
|
111
|
+
with patch.object(message_manager, 'get_system_language', return_value='fr'):
|
|
112
|
+
message = message_manager.get_message("greeting")
|
|
113
|
+
assert message == "Hello"
|
|
114
|
+
|
|
115
|
+
def test_get_message_not_found(self, message_manager):
|
|
116
|
+
"""测试获取不存在的消息"""
|
|
117
|
+
message = message_manager.get_message("nonexistent_key")
|
|
118
|
+
assert message == ""
|
|
119
|
+
|
|
120
|
+
@pytest.mark.parametrize("language,expected", [
|
|
121
|
+
("en", "Welcome, Alice!"),
|
|
122
|
+
("zh", "欢迎,Alice!"),
|
|
123
|
+
])
|
|
124
|
+
def test_get_message_with_format(self, message_manager, language, expected):
|
|
125
|
+
"""测试格式化消息"""
|
|
126
|
+
test_messages = {
|
|
127
|
+
"welcome": {
|
|
128
|
+
"en": "Welcome, {{name}}!",
|
|
129
|
+
"zh": "欢迎,{{name}}!"
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
message_manager.register_messages(test_messages)
|
|
134
|
+
|
|
135
|
+
# 测试格式化
|
|
136
|
+
with patch.object(message_manager, 'get_system_language', return_value=language):
|
|
137
|
+
message = message_manager.get_message_with_format("welcome", name="Alice")
|
|
138
|
+
assert message == expected
|
|
139
|
+
|
|
140
|
+
def test_get_message_with_format_multiple_params(self, message_manager):
|
|
141
|
+
"""测试多参数格式化"""
|
|
142
|
+
test_messages = {
|
|
143
|
+
"user_info": {
|
|
144
|
+
"en": "User {{name}} is {{age}} years old",
|
|
145
|
+
"zh": "用户{{name}}今年{{age}}岁"
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
message_manager.register_messages(test_messages)
|
|
150
|
+
|
|
151
|
+
with patch.object(message_manager, 'get_system_language', return_value='en'):
|
|
152
|
+
message = message_manager.get_message_with_format("user_info", name="Bob", age=25)
|
|
153
|
+
assert message == "User Bob is 25 years old"
|
|
154
|
+
|
|
155
|
+
def test_get_message_with_format_not_found(self, message_manager):
|
|
156
|
+
"""测试格式化不存在的消息"""
|
|
157
|
+
message = message_manager.get_message_with_format("nonexistent", name="test")
|
|
158
|
+
assert message == ""
|
|
159
|
+
|
|
160
|
+
@pytest.mark.parametrize("locale_setting,expected", [
|
|
161
|
+
(('zh_CN', 'UTF-8'), 'zh'),
|
|
162
|
+
(('en_US', 'UTF-8'), 'en'),
|
|
163
|
+
(('ja_JP', 'UTF-8'), 'ja'),
|
|
164
|
+
(('ar_SA', 'UTF-8'), 'ar'),
|
|
165
|
+
(('ru_RU', 'UTF-8'), 'ru'),
|
|
166
|
+
(('fr_FR', 'UTF-8'), 'en'), # 不支持的语言回退到英文
|
|
167
|
+
])
|
|
168
|
+
@patch('locale.getdefaultlocale')
|
|
169
|
+
def test_get_system_language(self, mock_getdefaultlocale, message_manager, locale_setting, expected):
|
|
170
|
+
"""测试系统语言检测"""
|
|
171
|
+
mock_getdefaultlocale.return_value = locale_setting
|
|
172
|
+
lang = message_manager.get_system_language()
|
|
173
|
+
assert lang == expected
|
|
174
|
+
|
|
175
|
+
@patch('locale.getdefaultlocale')
|
|
176
|
+
def test_get_system_language_exception(self, mock_getdefaultlocale, message_manager):
|
|
177
|
+
"""测试系统语言检测异常情况"""
|
|
178
|
+
# 测试异常情况
|
|
179
|
+
mock_getdefaultlocale.side_effect = Exception("Locale error")
|
|
180
|
+
lang = message_manager.get_system_language()
|
|
181
|
+
assert lang == 'en' # 默认回退到英文
|
|
182
|
+
|
|
183
|
+
def test_empty_messages(self, message_manager):
|
|
184
|
+
"""测试空消息字典"""
|
|
185
|
+
message_manager.register_messages({})
|
|
186
|
+
message = message_manager.get_message("any_key")
|
|
187
|
+
assert message == ""
|
|
188
|
+
|
|
189
|
+
def test_override_existing_messages(self, message_manager):
|
|
190
|
+
"""测试覆盖已存在的消息"""
|
|
191
|
+
# 先注册一个消息
|
|
192
|
+
original_messages = {
|
|
193
|
+
"test_key": {
|
|
194
|
+
"en": "Original message",
|
|
195
|
+
"zh": "原始消息"
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
message_manager.register_messages(original_messages)
|
|
199
|
+
|
|
200
|
+
# 再注册同样的键但不同的内容
|
|
201
|
+
new_messages = {
|
|
202
|
+
"test_key": {
|
|
203
|
+
"en": "New message",
|
|
204
|
+
"zh": "新消息"
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
message_manager.register_messages(new_messages)
|
|
208
|
+
|
|
209
|
+
# 验证消息已被覆盖
|
|
210
|
+
with patch.object(message_manager, 'get_system_language', return_value='en'):
|
|
211
|
+
message = message_manager.get_message("test_key")
|
|
212
|
+
assert message == "New message"
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
@pytest.fixture
|
|
216
|
+
def clean_global_manager():
|
|
217
|
+
"""清空全局消息管理器的fixture"""
|
|
218
|
+
manager = get_message_manager()
|
|
219
|
+
original_messages = manager._messages.copy()
|
|
220
|
+
manager._messages = {}
|
|
221
|
+
yield manager
|
|
222
|
+
# 恢复原始消息
|
|
223
|
+
manager._messages = original_messages
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
class TestInternationalModule:
|
|
227
|
+
"""测试国际化模块的公共接口"""
|
|
228
|
+
|
|
229
|
+
def test_register_messages_function(self, clean_global_manager):
|
|
230
|
+
"""测试register_messages函数"""
|
|
231
|
+
test_messages = {
|
|
232
|
+
"function_test": {
|
|
233
|
+
"en": "Function test",
|
|
234
|
+
"zh": "函数测试"
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
register_messages(test_messages)
|
|
239
|
+
|
|
240
|
+
# 验证消息已注册到全局管理器
|
|
241
|
+
assert "function_test" in clean_global_manager._messages
|
|
242
|
+
|
|
243
|
+
def test_get_message_function(self, clean_global_manager):
|
|
244
|
+
"""测试get_message函数"""
|
|
245
|
+
test_messages = {
|
|
246
|
+
"hello": {
|
|
247
|
+
"en": "Hello World",
|
|
248
|
+
"zh": "你好世界"
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
register_messages(test_messages)
|
|
253
|
+
|
|
254
|
+
# 测试获取消息
|
|
255
|
+
with patch('autocoder.common.international.message_manager.get_system_language', return_value='en'):
|
|
256
|
+
message = get_message("hello")
|
|
257
|
+
assert message == "Hello World"
|
|
258
|
+
|
|
259
|
+
def test_get_message_with_format_function(self, clean_global_manager):
|
|
260
|
+
"""测试get_message_with_format函数"""
|
|
261
|
+
test_messages = {
|
|
262
|
+
"greeting": {
|
|
263
|
+
"en": "Hello {{name}}",
|
|
264
|
+
"zh": "你好{{name}}"
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
register_messages(test_messages)
|
|
269
|
+
|
|
270
|
+
# 测试格式化消息
|
|
271
|
+
with patch('autocoder.common.international.message_manager.get_system_language', return_value='en'):
|
|
272
|
+
message = get_message_with_format("greeting", name="World")
|
|
273
|
+
assert message == "Hello World"
|
|
274
|
+
|
|
275
|
+
def test_get_system_language_function(self):
|
|
276
|
+
"""测试get_system_language函数"""
|
|
277
|
+
with patch('locale.getdefaultlocale', return_value=('zh_CN', 'UTF-8')):
|
|
278
|
+
lang = get_system_language()
|
|
279
|
+
assert lang == 'zh'
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
class TestAutoRegistration:
|
|
283
|
+
"""测试自动注册功能"""
|
|
284
|
+
|
|
285
|
+
def test_messages_auto_registered(self):
|
|
286
|
+
"""测试消息已自动注册"""
|
|
287
|
+
# 获取全局管理器
|
|
288
|
+
manager = get_message_manager()
|
|
289
|
+
|
|
290
|
+
# 验证至少有一些消息已经注册
|
|
291
|
+
assert len(manager._messages) > 0, "应该有自动注册的消息"
|
|
292
|
+
|
|
293
|
+
# 测试一些已知的消息键(这些应该在auto_coder_messages.py中)
|
|
294
|
+
# 注意:这里需要根据实际的消息键来调整
|
|
295
|
+
known_keys = ["file_scored_message", "config_delete_success", "config_invalid_format"]
|
|
296
|
+
|
|
297
|
+
for key in known_keys:
|
|
298
|
+
if key in manager._messages:
|
|
299
|
+
# 验证消息结构
|
|
300
|
+
assert isinstance(manager._messages[key], dict)
|
|
301
|
+
assert "en" in manager._messages[key]
|
|
302
|
+
break # 找到一个就足够了
|
|
303
|
+
|
|
304
|
+
def test_get_auto_registered_message(self):
|
|
305
|
+
"""测试获取自动注册的消息"""
|
|
306
|
+
# 尝试获取一个应该已经注册的消息
|
|
307
|
+
try:
|
|
308
|
+
message = get_message("file_scored_message")
|
|
309
|
+
# 如果消息存在,它不应该是"Message not found"
|
|
310
|
+
assert message != "Message not found: file_scored_message"
|
|
311
|
+
except:
|
|
312
|
+
# 如果消息不存在,这也是可以接受的(因为我们不确定具体的消息键)
|
|
313
|
+
pass
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
class TestErrorHandling:
|
|
317
|
+
"""测试错误处理"""
|
|
318
|
+
|
|
319
|
+
def test_malformed_messages(self, message_manager):
|
|
320
|
+
"""测试格式不正确的消息"""
|
|
321
|
+
# 测试缺少语言键的消息
|
|
322
|
+
malformed_messages = {
|
|
323
|
+
"bad_message": {
|
|
324
|
+
"en": "Good message"
|
|
325
|
+
# 缺少其他语言
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
# 应该能够正常注册
|
|
330
|
+
message_manager.register_messages(malformed_messages)
|
|
331
|
+
|
|
332
|
+
# 应该能够获取存在的语言
|
|
333
|
+
with patch.object(message_manager, 'get_system_language', return_value='en'):
|
|
334
|
+
message = message_manager.get_message("bad_message")
|
|
335
|
+
assert message == "Good message"
|
|
336
|
+
|
|
337
|
+
# 对于不存在的语言应该回退到英文
|
|
338
|
+
with patch.object(message_manager, 'get_system_language', return_value='zh'):
|
|
339
|
+
message = message_manager.get_message("bad_message")
|
|
340
|
+
assert message == "Good message"
|
|
341
|
+
|
|
342
|
+
def test_invalid_message_structure(self, message_manager):
|
|
343
|
+
"""测试无效的消息结构"""
|
|
344
|
+
# 测试非字典类型的消息
|
|
345
|
+
invalid_messages = {
|
|
346
|
+
"invalid": {"en": "This is not a valid message structure"}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
message_manager.register_messages(invalid_messages)
|
|
350
|
+
|
|
351
|
+
# 应该能够正常获取消息
|
|
352
|
+
message = message_manager.get_message("invalid")
|
|
353
|
+
assert message == "This is not a valid message structure"
|
|
354
|
+
|
|
355
|
+
@patch('autocoder.common.international.message_manager.format_str_jinja2')
|
|
356
|
+
def test_format_error_handling(self, mock_format, message_manager):
|
|
357
|
+
"""测试格式化错误处理"""
|
|
358
|
+
# 模拟格式化错误
|
|
359
|
+
mock_format.side_effect = Exception("Format error")
|
|
360
|
+
|
|
361
|
+
test_messages = {
|
|
362
|
+
"format_test": {
|
|
363
|
+
"en": "Hello {{name}}",
|
|
364
|
+
"zh": "你好{{name}}"
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
message_manager.register_messages(test_messages)
|
|
369
|
+
|
|
370
|
+
# 当格式化失败时,应该抛出异常
|
|
371
|
+
with patch.object(message_manager, 'get_system_language', return_value='en'):
|
|
372
|
+
with pytest.raises(Exception):
|
|
373
|
+
message_manager.get_message_with_format("format_test", name="World")
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
# 新增:测试验证所有消息文件的五种语言完整性
|
|
377
|
+
class TestMessagesCompleteness:
|
|
378
|
+
"""测试消息文件的五种语言完整性"""
|
|
379
|
+
|
|
380
|
+
REQUIRED_LANGUAGES = ['en', 'zh', 'ja', 'ar', 'ru']
|
|
381
|
+
|
|
382
|
+
@pytest.mark.parametrize("messages_dict,file_name", [
|
|
383
|
+
(AUTO_CODER_MESSAGES, "auto_coder_messages.py"),
|
|
384
|
+
(CHAT_AUTO_CODER_MESSAGES, "chat_auto_coder_messages.py"),
|
|
385
|
+
(SDK_MESSAGES, "sdk_messages.py"),
|
|
386
|
+
(RULES_COMMAND_MESSAGES, "rules_command_messages.py")
|
|
387
|
+
])
|
|
388
|
+
def test_all_messages_have_five_languages(self, messages_dict, file_name):
|
|
389
|
+
"""测试所有消息键都包含五种语言"""
|
|
390
|
+
missing_languages_errors = []
|
|
391
|
+
empty_content_errors = []
|
|
392
|
+
|
|
393
|
+
for key, message_data in messages_dict.items():
|
|
394
|
+
# 检查消息数据是否为字典
|
|
395
|
+
if not isinstance(message_data, dict):
|
|
396
|
+
missing_languages_errors.append(f"[{file_name}] Key '{key}': Expected dict, got {type(message_data).__name__}")
|
|
397
|
+
continue
|
|
398
|
+
|
|
399
|
+
# 检查缺失的语言
|
|
400
|
+
missing_languages = set(self.REQUIRED_LANGUAGES) - set(message_data.keys())
|
|
401
|
+
if missing_languages:
|
|
402
|
+
missing_langs_str = ", ".join(sorted(missing_languages))
|
|
403
|
+
missing_languages_errors.append(f"[{file_name}] Key '{key}': Missing languages: {missing_langs_str}")
|
|
404
|
+
|
|
405
|
+
# 检查空内容
|
|
406
|
+
for lang, content in message_data.items():
|
|
407
|
+
if not content or (isinstance(content, str) and content.strip() == ""):
|
|
408
|
+
empty_content_errors.append(f"[{file_name}] Key '{key}', Language '{lang}': Content is empty")
|
|
409
|
+
|
|
410
|
+
# 汇总错误信息
|
|
411
|
+
all_errors = missing_languages_errors + empty_content_errors
|
|
412
|
+
|
|
413
|
+
if all_errors:
|
|
414
|
+
error_summary = f"\n{file_name} 语言完整性验证失败:\n"
|
|
415
|
+
error_summary += f"总键数: {len(messages_dict)}\n"
|
|
416
|
+
error_summary += f"缺失语言的键数: {len(missing_languages_errors)}\n"
|
|
417
|
+
error_summary += f"空内容错误数: {len(empty_content_errors)}\n"
|
|
418
|
+
error_summary += "错误详情:\n" + "\n".join(all_errors[:10]) # 只显示前10个错误
|
|
419
|
+
if len(all_errors) > 10:
|
|
420
|
+
error_summary += f"\n... 还有 {len(all_errors) - 10} 个错误"
|
|
421
|
+
|
|
422
|
+
pytest.fail(error_summary)
|
|
423
|
+
|
|
424
|
+
def test_messages_structure_consistency(self):
|
|
425
|
+
"""测试消息结构一致性"""
|
|
426
|
+
all_message_files = [
|
|
427
|
+
(AUTO_CODER_MESSAGES, "auto_coder_messages.py"),
|
|
428
|
+
(CHAT_AUTO_CODER_MESSAGES, "chat_auto_coder_messages.py"),
|
|
429
|
+
(SDK_MESSAGES, "sdk_messages.py")
|
|
430
|
+
]
|
|
431
|
+
|
|
432
|
+
inconsistent_keys = []
|
|
433
|
+
|
|
434
|
+
for messages_dict, file_name in all_message_files:
|
|
435
|
+
for key, message_data in messages_dict.items():
|
|
436
|
+
if not isinstance(message_data, dict):
|
|
437
|
+
continue
|
|
438
|
+
|
|
439
|
+
# 检查是否所有语言的消息都是字符串类型
|
|
440
|
+
for lang, content in message_data.items():
|
|
441
|
+
if not isinstance(content, str):
|
|
442
|
+
inconsistent_keys.append(f"[{file_name}] Key '{key}', Language '{lang}': Content is not string (got {type(content).__name__})")
|
|
443
|
+
|
|
444
|
+
if inconsistent_keys:
|
|
445
|
+
error_summary = f"消息结构一致性验证失败:\n" + "\n".join(inconsistent_keys)
|
|
446
|
+
pytest.fail(error_summary)
|
|
447
|
+
|
|
448
|
+
def test_supported_languages_api(self):
|
|
449
|
+
"""测试语言支持API"""
|
|
450
|
+
supported_langs = get_supported_languages()
|
|
451
|
+
|
|
452
|
+
# 验证返回的是五种语言
|
|
453
|
+
assert len(supported_langs) == 5
|
|
454
|
+
assert set(supported_langs) == set(self.REQUIRED_LANGUAGES)
|
|
455
|
+
|
|
456
|
+
# 测试语言支持检查
|
|
457
|
+
for lang in self.REQUIRED_LANGUAGES:
|
|
458
|
+
assert is_language_supported(lang), f"Language {lang} should be supported"
|
|
459
|
+
|
|
460
|
+
# 测试不支持的语言
|
|
461
|
+
assert not is_language_supported('fr'), "French should not be supported"
|
|
462
|
+
assert not is_language_supported('de'), "German should not be supported"
|
|
463
|
+
|
|
464
|
+
# def test_message_keys_uniqueness(self):
|
|
465
|
+
# """测试消息键的唯一性(跨文件检查重复键)"""
|
|
466
|
+
# all_keys = set()
|
|
467
|
+
# duplicate_keys = []
|
|
468
|
+
|
|
469
|
+
# all_message_files = [
|
|
470
|
+
# (AUTO_CODER_MESSAGES, "auto_coder_messages.py"),
|
|
471
|
+
# (CHAT_AUTO_CODER_MESSAGES, "chat_auto_coder_messages.py"),
|
|
472
|
+
# (SDK_MESSAGES, "sdk_messages.py")
|
|
473
|
+
# ]
|
|
474
|
+
|
|
475
|
+
# for messages_dict, file_name in all_message_files:
|
|
476
|
+
# for key in messages_dict.keys():
|
|
477
|
+
# if key in all_keys:
|
|
478
|
+
# duplicate_keys.append(f"Duplicate key '{key}' found in {file_name}")
|
|
479
|
+
# all_keys.add(key)
|
|
480
|
+
|
|
481
|
+
# if duplicate_keys:
|
|
482
|
+
# error_summary = f"发现重复的消息键:\n" + "\n".join(duplicate_keys)
|
|
483
|
+
# pytest.fail(error_summary)
|
|
484
|
+
|
|
485
|
+
@pytest.mark.parametrize("messages_dict,file_name", [
|
|
486
|
+
(AUTO_CODER_MESSAGES, "auto_coder_messages.py"),
|
|
487
|
+
(CHAT_AUTO_CODER_MESSAGES, "chat_auto_coder_messages.py"),
|
|
488
|
+
(SDK_MESSAGES, "sdk_messages.py"),
|
|
489
|
+
(RULES_COMMAND_MESSAGES, "rules_command_messages.py")
|
|
490
|
+
])
|
|
491
|
+
def test_jinja2_template_syntax(self, messages_dict, file_name):
|
|
492
|
+
"""测试Jinja2模板语法的有效性"""
|
|
493
|
+
from byzerllm.utils import format_str_jinja2
|
|
494
|
+
|
|
495
|
+
syntax_errors = []
|
|
496
|
+
|
|
497
|
+
for key, message_data in messages_dict.items():
|
|
498
|
+
if not isinstance(message_data, dict):
|
|
499
|
+
continue
|
|
500
|
+
|
|
501
|
+
for lang, content in message_data.items():
|
|
502
|
+
if not isinstance(content, str):
|
|
503
|
+
continue
|
|
504
|
+
|
|
505
|
+
# 如果包含{{}}模板语法,测试其有效性
|
|
506
|
+
if "{{" in content and "}}" in content:
|
|
507
|
+
try:
|
|
508
|
+
# 尝试用虚拟参数格式化
|
|
509
|
+
test_params = {}
|
|
510
|
+
# 提取模板变量名
|
|
511
|
+
import re
|
|
512
|
+
variables = re.findall(r'\{\{\s*(\w+)\s*\}\}', content)
|
|
513
|
+
for var in variables:
|
|
514
|
+
test_params[var] = "test_value"
|
|
515
|
+
|
|
516
|
+
format_str_jinja2(content, **test_params)
|
|
517
|
+
except Exception as e:
|
|
518
|
+
syntax_errors.append(f"[{file_name}] Key '{key}', Language '{lang}': Jinja2 syntax error: {e}")
|
|
519
|
+
|
|
520
|
+
if syntax_errors:
|
|
521
|
+
error_summary = f"{file_name} Jinja2模板语法验证失败:\n" + "\n".join(syntax_errors[:5])
|
|
522
|
+
if len(syntax_errors) > 5:
|
|
523
|
+
error_summary += f"\n... 还有 {len(syntax_errors) - 5} 个错误"
|
|
524
|
+
pytest.fail(error_summary)
|
|
525
|
+
|
|
526
|
+
def test_no_duplicate_keys_across_files(self):
|
|
527
|
+
"""测试不同消息文件之间不应有重复的键"""
|
|
528
|
+
|
|
529
|
+
# 定义文件和对应的消息字典
|
|
530
|
+
message_files = [
|
|
531
|
+
("auto_coder_messages.py", AUTO_CODER_MESSAGES),
|
|
532
|
+
("chat_auto_coder_messages.py", CHAT_AUTO_CODER_MESSAGES),
|
|
533
|
+
("sdk_messages.py", SDK_MESSAGES),
|
|
534
|
+
("rules_command_messages.py", RULES_COMMAND_MESSAGES)
|
|
535
|
+
]
|
|
536
|
+
|
|
537
|
+
# 收集所有键和其所在文件的映射
|
|
538
|
+
key_to_files = {}
|
|
539
|
+
|
|
540
|
+
for file_name, messages_dict in message_files:
|
|
541
|
+
for key in messages_dict.keys():
|
|
542
|
+
if key not in key_to_files:
|
|
543
|
+
key_to_files[key] = []
|
|
544
|
+
key_to_files[key].append(file_name)
|
|
545
|
+
|
|
546
|
+
# 查找重复的键
|
|
547
|
+
duplicate_keys = {}
|
|
548
|
+
for key, files in key_to_files.items():
|
|
549
|
+
if len(files) > 1:
|
|
550
|
+
duplicate_keys[key] = files
|
|
551
|
+
|
|
552
|
+
# 如果有重复键,生成易读的错误报告
|
|
553
|
+
if duplicate_keys:
|
|
554
|
+
error_lines = [
|
|
555
|
+
"❌ 发现重复的消息键!",
|
|
556
|
+
"=" * 50,
|
|
557
|
+
"以下键在多个文件中重复定义:"
|
|
558
|
+
]
|
|
559
|
+
|
|
560
|
+
# 按键名排序,便于阅读
|
|
561
|
+
for key in sorted(duplicate_keys.keys()):
|
|
562
|
+
files = duplicate_keys[key]
|
|
563
|
+
files_str = " & ".join(files)
|
|
564
|
+
error_lines.append(f" 🔑 '{key}' → {files_str}")
|
|
565
|
+
|
|
566
|
+
error_lines.extend([
|
|
567
|
+
"",
|
|
568
|
+
f"📊 统计信息:",
|
|
569
|
+
f" • 重复键总数: {len(duplicate_keys)}",
|
|
570
|
+
f" • 涉及文件: {len(set(file for files in duplicate_keys.values() for file in files))}",
|
|
571
|
+
"",
|
|
572
|
+
"💡 建议:",
|
|
573
|
+
" • 为每个文件使用唯一的键名前缀",
|
|
574
|
+
" • 或将通用消息移到共享文件中"
|
|
575
|
+
])
|
|
576
|
+
|
|
577
|
+
error_message = "\n".join(error_lines)
|
|
578
|
+
pytest.fail(error_message)
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
class TestRulesCommandMessages:
|
|
582
|
+
"""测试规则命令消息的特定功能"""
|
|
583
|
+
|
|
584
|
+
def test_rules_command_keys_prefix(self):
|
|
585
|
+
"""测试所有规则命令消息键都以rule_cmd_开头"""
|
|
586
|
+
for key in RULES_COMMAND_MESSAGES.keys():
|
|
587
|
+
assert key.startswith('rule_cmd_'), f"规则命令消息键 '{key}' 应该以 'rule_cmd_' 开头"
|
|
588
|
+
|
|
589
|
+
def test_rules_command_required_messages(self):
|
|
590
|
+
"""测试包含所有必需的规则命令消息"""
|
|
591
|
+
required_keys = [
|
|
592
|
+
'rule_cmd_analyzing_project',
|
|
593
|
+
'rule_cmd_init_failed',
|
|
594
|
+
'rule_cmd_init_success',
|
|
595
|
+
'rule_cmd_init_error'
|
|
596
|
+
]
|
|
597
|
+
|
|
598
|
+
for key in required_keys:
|
|
599
|
+
assert key in RULES_COMMAND_MESSAGES, f"缺少必需的规则命令消息键: {key}"
|
|
600
|
+
|
|
601
|
+
def test_rules_command_error_message_formatting(self):
|
|
602
|
+
"""测试规则命令错误消息支持格式化"""
|
|
603
|
+
from autocoder.common.international import get_message_with_format
|
|
604
|
+
|
|
605
|
+
# 测试错误消息模板
|
|
606
|
+
formatted_msg = get_message_with_format('rule_cmd_init_error', error='test error')
|
|
607
|
+
assert 'test error' in formatted_msg, "错误消息应该包含格式化的错误信息"
|
|
608
|
+
assert formatted_msg != '', "格式化的错误消息不应为空"
|
|
609
|
+
|
|
610
|
+
|
|
611
|
+
if __name__ == '__main__':
|
|
612
|
+
pytest.main([__file__, "-v"])
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Linter Core Module
|
|
3
|
+
|
|
4
|
+
A comprehensive multi-language linting framework that provides extensible
|
|
5
|
+
linting capabilities with support for TypeScript, Python, and easy addition
|
|
6
|
+
of new language linters.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .base_linter import BaseLinter
|
|
10
|
+
from .linter_factory import LinterFactory
|
|
11
|
+
from .linter_manager import LinterManager
|
|
12
|
+
from .models.lint_result import LintResult
|
|
13
|
+
from .formatters.base_formatter import BaseLintOutputFormatter
|
|
14
|
+
from .formatters.raw_formatter import RawLintOutputFormatter
|
|
15
|
+
from .config_loader import LinterConfigLoader, load_linter_config
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
'BaseLinter',
|
|
19
|
+
'LinterFactory',
|
|
20
|
+
'LinterManager',
|
|
21
|
+
'LintResult',
|
|
22
|
+
'BaseLintOutputFormatter',
|
|
23
|
+
'RawLintOutputFormatter',
|
|
24
|
+
'LinterConfigLoader',
|
|
25
|
+
'load_linter_config'
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
__version__ = "1.0.0"
|