auto-coder 0.1.400__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-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
- {auto_coder-0.1.400.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 +25 -4
- 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 +1029 -2310
- 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 +1021 -372
- autocoder/chat_auto_coder_lang.py +23 -732
- autocoder/commands/auto_command.py +26 -9
- 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/file_monitor/test_file_monitor.py +307 -0
- autocoder/common/git_utils.py +51 -10
- 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 +746 -0
- autocoder/common/{context_pruner.py → pruner/context_pruner.py} +137 -40
- 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/{conversation_pruner.py → pruner/conversation_pruner.py} +26 -6
- autocoder/common/pruner/test_agentic_conversation_pruner.py +784 -0
- autocoder/common/pruner/test_context_pruner.py +546 -0
- 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/__init__.py +15 -0
- autocoder/common/tokens/counter.py +44 -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 +2729 -2052
- autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
- autocoder/common/v2/agent/agentic_edit_tools/__init__.py +43 -2
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_read_tool_resolver.py +40 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +52 -0
- autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +8 -0
- 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 +565 -30
- 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 +244 -51
- 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 +409 -140
- 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 +209 -194
- autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +135 -0
- autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +328 -0
- 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 +386 -10
- autocoder/common/v2/agent/runner/__init__.py +31 -0
- autocoder/common/v2/agent/runner/base_runner.py +92 -0
- autocoder/common/v2/agent/runner/file_based_event_runner.py +217 -0
- autocoder/common/v2/agent/runner/sdk_runner.py +182 -0
- autocoder/common/v2/agent/runner/terminal_runner.py +396 -0
- autocoder/common/v2/agent/runner/tool_display.py +589 -0
- 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 +117 -125
- autocoder/{agent → index/filter}/agentic_filter.py +323 -334
- 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 +156 -37
- 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/run_context.py +9 -0
- autocoder/sdk/__init__.py +50 -161
- 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 +158 -170
- autocoder/sdk/cli/options.py +95 -22
- autocoder/sdk/constants.py +139 -51
- autocoder/sdk/core/auto_coder_core.py +484 -267
- autocoder/sdk/core/bridge.py +298 -118
- 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-0.1.400.dist-info/METADATA +0 -396
- auto_coder-0.1.400.dist-info/RECORD +0 -425
- auto_coder-0.1.400.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/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-0.1.400.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,448 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Tests for CommandExecutor functionality.
|
|
3
|
+
|
|
4
|
+
This module tests the main command execution interface with timeout
|
|
5
|
+
support and process management.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import pytest
|
|
9
|
+
import time
|
|
10
|
+
import platform
|
|
11
|
+
from unittest.mock import patch, MagicMock
|
|
12
|
+
|
|
13
|
+
from ..command_executor import CommandExecutor, execute_command
|
|
14
|
+
from ..timeout_config import TimeoutConfig
|
|
15
|
+
from ..exceptions import CommandTimeoutError, CommandExecutionError
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class TestCommandExecutor:
|
|
19
|
+
"""Test cases for CommandExecutor class."""
|
|
20
|
+
|
|
21
|
+
def setup_method(self):
|
|
22
|
+
"""Set up test fixtures."""
|
|
23
|
+
self.config = TimeoutConfig(
|
|
24
|
+
default_timeout=5.0,
|
|
25
|
+
cleanup_timeout=2.0,
|
|
26
|
+
grace_period=1.0
|
|
27
|
+
)
|
|
28
|
+
self.executor = CommandExecutor(self.config, verbose=False)
|
|
29
|
+
|
|
30
|
+
def teardown_method(self):
|
|
31
|
+
"""Clean up after tests."""
|
|
32
|
+
self.executor.cleanup()
|
|
33
|
+
|
|
34
|
+
def test_simple_command_execution(self):
|
|
35
|
+
"""Test basic command execution."""
|
|
36
|
+
if platform.system() == "Windows":
|
|
37
|
+
command = "echo Hello World"
|
|
38
|
+
else:
|
|
39
|
+
command = "echo 'Hello World'"
|
|
40
|
+
|
|
41
|
+
exit_code, output = self.executor.execute(command)
|
|
42
|
+
|
|
43
|
+
assert exit_code == 0
|
|
44
|
+
assert "Hello World" in output
|
|
45
|
+
|
|
46
|
+
def test_command_with_exit_code(self):
|
|
47
|
+
"""Test command that returns non-zero exit code."""
|
|
48
|
+
if platform.system() == "Windows":
|
|
49
|
+
command = "exit 1"
|
|
50
|
+
else:
|
|
51
|
+
command = "exit 1"
|
|
52
|
+
|
|
53
|
+
exit_code, output = self.executor.execute(command)
|
|
54
|
+
|
|
55
|
+
assert exit_code == 1
|
|
56
|
+
|
|
57
|
+
def test_command_timeout(self):
|
|
58
|
+
"""Test command timeout functionality."""
|
|
59
|
+
if platform.system() == "Windows":
|
|
60
|
+
command = "ping -n 10 127.0.0.1" # Windows ping command
|
|
61
|
+
else:
|
|
62
|
+
command = "sleep 10" # Unix sleep command
|
|
63
|
+
|
|
64
|
+
with pytest.raises(CommandTimeoutError) as exc_info:
|
|
65
|
+
self.executor.execute(command, timeout=1.0)
|
|
66
|
+
|
|
67
|
+
assert exc_info.value.timeout == 1.0
|
|
68
|
+
assert command in str(exc_info.value)
|
|
69
|
+
|
|
70
|
+
def test_command_with_working_directory(self):
|
|
71
|
+
"""Test command execution with custom working directory."""
|
|
72
|
+
import tempfile
|
|
73
|
+
import os
|
|
74
|
+
|
|
75
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
|
76
|
+
if platform.system() == "Windows":
|
|
77
|
+
command = "cd"
|
|
78
|
+
else:
|
|
79
|
+
command = "pwd"
|
|
80
|
+
|
|
81
|
+
exit_code, output = self.executor.execute(command, cwd=temp_dir)
|
|
82
|
+
|
|
83
|
+
assert exit_code == 0
|
|
84
|
+
assert temp_dir in output.replace("\\", "/") # Normalize path separators
|
|
85
|
+
|
|
86
|
+
def test_command_with_environment_variables(self):
|
|
87
|
+
"""Test command execution with custom environment variables."""
|
|
88
|
+
env = {"TEST_VAR": "test_value"}
|
|
89
|
+
|
|
90
|
+
if platform.system() == "Windows":
|
|
91
|
+
command = "echo %TEST_VAR%"
|
|
92
|
+
else:
|
|
93
|
+
command = "echo $TEST_VAR"
|
|
94
|
+
|
|
95
|
+
exit_code, output = self.executor.execute(command, env=env)
|
|
96
|
+
|
|
97
|
+
assert exit_code == 0
|
|
98
|
+
assert "test_value" in output
|
|
99
|
+
|
|
100
|
+
def test_executor_status(self):
|
|
101
|
+
"""Test executor status reporting."""
|
|
102
|
+
status = self.executor.get_status()
|
|
103
|
+
|
|
104
|
+
assert isinstance(status, dict)
|
|
105
|
+
assert "config" in status
|
|
106
|
+
assert "active_processes" in status
|
|
107
|
+
assert "performance_summary" in status
|
|
108
|
+
assert "recent_alerts" in status
|
|
109
|
+
|
|
110
|
+
def test_executor_cleanup(self):
|
|
111
|
+
"""Test executor cleanup functionality."""
|
|
112
|
+
# Start a long-running command
|
|
113
|
+
if platform.system() == "Windows":
|
|
114
|
+
command = "ping -n 100 127.0.0.1"
|
|
115
|
+
else:
|
|
116
|
+
command = "sleep 100"
|
|
117
|
+
|
|
118
|
+
# Execute in background (this will be a real test in a threaded environment)
|
|
119
|
+
# For now, just test that cleanup doesn't crash
|
|
120
|
+
self.executor.cleanup()
|
|
121
|
+
|
|
122
|
+
# Verify executor is still functional after cleanup
|
|
123
|
+
simple_command = "echo test"
|
|
124
|
+
exit_code, output = self.executor.execute(simple_command)
|
|
125
|
+
assert exit_code == 0
|
|
126
|
+
|
|
127
|
+
def test_execute_background_basic(self):
|
|
128
|
+
"""Test basic background command execution."""
|
|
129
|
+
if platform.system() == "Windows":
|
|
130
|
+
command = "ping -n 1 127.0.0.1"
|
|
131
|
+
else:
|
|
132
|
+
command = "sleep 0.1"
|
|
133
|
+
|
|
134
|
+
# Execute command in background
|
|
135
|
+
process_info = self.executor.execute_background(command)
|
|
136
|
+
|
|
137
|
+
# Verify we get process information
|
|
138
|
+
assert "pid" in process_info
|
|
139
|
+
assert "command" in process_info
|
|
140
|
+
assert "status" in process_info
|
|
141
|
+
assert process_info["pid"] > 0
|
|
142
|
+
assert process_info["status"] == "running"
|
|
143
|
+
|
|
144
|
+
# Verify process appears in background processes
|
|
145
|
+
bg_processes = self.executor.get_background_processes()
|
|
146
|
+
assert process_info["pid"] in bg_processes
|
|
147
|
+
|
|
148
|
+
# Wait a bit for process to complete
|
|
149
|
+
time.sleep(0.2)
|
|
150
|
+
|
|
151
|
+
# Clean up
|
|
152
|
+
self.executor.cleanup_background_process(process_info["pid"])
|
|
153
|
+
|
|
154
|
+
def test_execute_background_with_working_directory(self):
|
|
155
|
+
"""Test background execution with custom working directory."""
|
|
156
|
+
import tempfile
|
|
157
|
+
|
|
158
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
|
159
|
+
if platform.system() == "Windows":
|
|
160
|
+
command = "echo test"
|
|
161
|
+
else:
|
|
162
|
+
command = "echo test"
|
|
163
|
+
|
|
164
|
+
process_info = self.executor.execute_background(command, cwd=temp_dir)
|
|
165
|
+
|
|
166
|
+
assert "pid" in process_info
|
|
167
|
+
assert process_info["pid"] > 0
|
|
168
|
+
assert "working_directory" in process_info
|
|
169
|
+
|
|
170
|
+
# Clean up
|
|
171
|
+
time.sleep(0.1) # Give process time to complete
|
|
172
|
+
self.executor.cleanup_background_process(process_info["pid"])
|
|
173
|
+
|
|
174
|
+
def test_get_background_processes(self):
|
|
175
|
+
"""Test getting background processes information."""
|
|
176
|
+
if platform.system() == "Windows":
|
|
177
|
+
command = "ping -n 1 127.0.0.1"
|
|
178
|
+
else:
|
|
179
|
+
command = "sleep 0.1"
|
|
180
|
+
|
|
181
|
+
# Start a background process
|
|
182
|
+
process_info = self.executor.execute_background(command)
|
|
183
|
+
pid = process_info["pid"]
|
|
184
|
+
|
|
185
|
+
# Get background processes
|
|
186
|
+
bg_processes = self.executor.get_background_processes()
|
|
187
|
+
|
|
188
|
+
assert pid in bg_processes
|
|
189
|
+
assert bg_processes[pid]["command"] == command
|
|
190
|
+
assert "status" in bg_processes[pid]
|
|
191
|
+
|
|
192
|
+
# Clean up
|
|
193
|
+
time.sleep(0.2)
|
|
194
|
+
self.executor.cleanup_background_process(pid)
|
|
195
|
+
|
|
196
|
+
def test_cleanup_background_process(self):
|
|
197
|
+
"""Test cleanup of specific background process."""
|
|
198
|
+
if platform.system() == "Windows":
|
|
199
|
+
command = "ping -n 5 127.0.0.1"
|
|
200
|
+
else:
|
|
201
|
+
command = "sleep 1"
|
|
202
|
+
|
|
203
|
+
# Start a background process
|
|
204
|
+
process_info = self.executor.execute_background(command)
|
|
205
|
+
pid = process_info["pid"]
|
|
206
|
+
|
|
207
|
+
# Verify process is running
|
|
208
|
+
bg_processes = self.executor.get_background_processes()
|
|
209
|
+
assert pid in bg_processes
|
|
210
|
+
|
|
211
|
+
# Clean up the specific process
|
|
212
|
+
success = self.executor.cleanup_background_process(pid)
|
|
213
|
+
assert success is True or success is False # Should return a boolean
|
|
214
|
+
|
|
215
|
+
# Process should be removed from background processes
|
|
216
|
+
time.sleep(0.1)
|
|
217
|
+
bg_processes = self.executor.get_background_processes()
|
|
218
|
+
# Process might still be there if cleanup is in progress, that's ok
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
class TestExecuteCommand:
|
|
222
|
+
"""Test cases for convenience execute_command function."""
|
|
223
|
+
|
|
224
|
+
def test_convenience_function(self):
|
|
225
|
+
"""Test the convenience execute_command function."""
|
|
226
|
+
if platform.system() == "Windows":
|
|
227
|
+
command = "echo Test"
|
|
228
|
+
else:
|
|
229
|
+
command = "echo 'Test'"
|
|
230
|
+
|
|
231
|
+
exit_code, output = execute_command(command)
|
|
232
|
+
|
|
233
|
+
assert exit_code == 0
|
|
234
|
+
assert "Test" in output
|
|
235
|
+
|
|
236
|
+
def test_convenience_function_with_timeout(self):
|
|
237
|
+
"""Test convenience function with timeout."""
|
|
238
|
+
if platform.system() == "Windows":
|
|
239
|
+
command = "ping -n 10 127.0.0.1"
|
|
240
|
+
else:
|
|
241
|
+
command = "sleep 10"
|
|
242
|
+
|
|
243
|
+
with pytest.raises(CommandTimeoutError):
|
|
244
|
+
execute_command(command, timeout=1.0)
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
class TestExecuteCommandBackground:
|
|
248
|
+
"""Test cases for convenience execute_command_background function."""
|
|
249
|
+
|
|
250
|
+
def test_convenience_background_function(self):
|
|
251
|
+
"""Test the convenience execute_command_background function."""
|
|
252
|
+
from ..command_executor import execute_command_background, cleanup_background_process
|
|
253
|
+
|
|
254
|
+
if platform.system() == "Windows":
|
|
255
|
+
command = "ping -n 1 127.0.0.1"
|
|
256
|
+
else:
|
|
257
|
+
command = "sleep 0.1"
|
|
258
|
+
|
|
259
|
+
process_info = execute_command_background(command)
|
|
260
|
+
|
|
261
|
+
assert "pid" in process_info
|
|
262
|
+
assert "command" in process_info
|
|
263
|
+
assert "status" in process_info
|
|
264
|
+
assert process_info["pid"] > 0
|
|
265
|
+
assert process_info["status"] == "running"
|
|
266
|
+
|
|
267
|
+
# Clean up
|
|
268
|
+
time.sleep(0.2)
|
|
269
|
+
cleanup_background_process(process_info["pid"])
|
|
270
|
+
|
|
271
|
+
def test_get_background_processes_convenience(self):
|
|
272
|
+
"""Test the convenience get_background_processes function."""
|
|
273
|
+
from ..command_executor import (
|
|
274
|
+
execute_command_background,
|
|
275
|
+
get_background_processes,
|
|
276
|
+
cleanup_background_process
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
if platform.system() == "Windows":
|
|
280
|
+
command = "ping -n 1 127.0.0.1"
|
|
281
|
+
else:
|
|
282
|
+
command = "sleep 0.1"
|
|
283
|
+
|
|
284
|
+
# Start a background process
|
|
285
|
+
process_info = execute_command_background(command)
|
|
286
|
+
pid = process_info["pid"]
|
|
287
|
+
|
|
288
|
+
# Get background processes
|
|
289
|
+
bg_processes = get_background_processes()
|
|
290
|
+
|
|
291
|
+
assert pid in bg_processes
|
|
292
|
+
assert bg_processes[pid]["command"] == command
|
|
293
|
+
|
|
294
|
+
# Clean up
|
|
295
|
+
time.sleep(0.2)
|
|
296
|
+
cleanup_background_process(pid)
|
|
297
|
+
|
|
298
|
+
def test_get_background_process_info_convenience(self):
|
|
299
|
+
"""Test the convenience get_background_process_info function."""
|
|
300
|
+
from ..command_executor import (
|
|
301
|
+
execute_command_background,
|
|
302
|
+
get_background_process_info,
|
|
303
|
+
cleanup_background_process
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
if platform.system() == "Windows":
|
|
307
|
+
command = "ping -n 1 127.0.0.1"
|
|
308
|
+
else:
|
|
309
|
+
command = "sleep 0.1"
|
|
310
|
+
|
|
311
|
+
# Start a background process
|
|
312
|
+
process_info = execute_command_background(command)
|
|
313
|
+
pid = process_info["pid"]
|
|
314
|
+
|
|
315
|
+
# Get specific process info
|
|
316
|
+
info = get_background_process_info(pid)
|
|
317
|
+
|
|
318
|
+
assert info is not None
|
|
319
|
+
assert info["command"] == command
|
|
320
|
+
|
|
321
|
+
# Clean up
|
|
322
|
+
time.sleep(0.2)
|
|
323
|
+
cleanup_background_process(pid)
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
class TestCommandExecutorConfiguration:
|
|
327
|
+
"""Test cases for CommandExecutor configuration."""
|
|
328
|
+
|
|
329
|
+
def test_custom_timeout_config(self):
|
|
330
|
+
"""Test executor with custom timeout configuration."""
|
|
331
|
+
config = TimeoutConfig(default_timeout=2.0)
|
|
332
|
+
executor = CommandExecutor(config)
|
|
333
|
+
|
|
334
|
+
# Test that config is applied
|
|
335
|
+
assert executor.config.default_timeout == 2.0
|
|
336
|
+
|
|
337
|
+
executor.cleanup()
|
|
338
|
+
|
|
339
|
+
def test_command_specific_timeout(self):
|
|
340
|
+
"""Test command-specific timeout configuration."""
|
|
341
|
+
config = TimeoutConfig()
|
|
342
|
+
config.set_command_timeout("sleep", 1.0)
|
|
343
|
+
|
|
344
|
+
executor = CommandExecutor(config)
|
|
345
|
+
|
|
346
|
+
# Verify timeout is applied for sleep command
|
|
347
|
+
timeout_val = config.get_timeout_for_command("sleep 5")
|
|
348
|
+
assert timeout_val == 1.0
|
|
349
|
+
|
|
350
|
+
executor.cleanup()
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
class TestErrorHandling:
|
|
354
|
+
"""Test cases for error handling and recovery."""
|
|
355
|
+
|
|
356
|
+
def test_invalid_command(self):
|
|
357
|
+
"""Test handling of invalid commands."""
|
|
358
|
+
executor = CommandExecutor(verbose=False)
|
|
359
|
+
|
|
360
|
+
# This should not raise an exception but return non-zero exit code
|
|
361
|
+
exit_code, output = executor.execute("nonexistent_command_12345")
|
|
362
|
+
|
|
363
|
+
assert exit_code != 0
|
|
364
|
+
|
|
365
|
+
executor.cleanup()
|
|
366
|
+
|
|
367
|
+
def test_process_cleanup_on_error(self):
|
|
368
|
+
"""Test that processes are cleaned up when errors occur."""
|
|
369
|
+
executor = CommandExecutor(verbose=False)
|
|
370
|
+
|
|
371
|
+
try:
|
|
372
|
+
if platform.system() == "Windows":
|
|
373
|
+
command = "ping -n 10 127.0.0.1"
|
|
374
|
+
else:
|
|
375
|
+
command = "sleep 10"
|
|
376
|
+
|
|
377
|
+
with pytest.raises(CommandTimeoutError):
|
|
378
|
+
executor.execute(command, timeout=0.5)
|
|
379
|
+
|
|
380
|
+
finally:
|
|
381
|
+
# Verify cleanup works
|
|
382
|
+
executor.cleanup()
|
|
383
|
+
|
|
384
|
+
# Should have no active processes after cleanup
|
|
385
|
+
status = executor.get_status()
|
|
386
|
+
assert status["active_processes"] == 0
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
@pytest.mark.integration
|
|
390
|
+
class TestIntegrationScenarios:
|
|
391
|
+
"""Integration test scenarios."""
|
|
392
|
+
|
|
393
|
+
def test_multiple_concurrent_commands(self):
|
|
394
|
+
"""Test handling of multiple commands (simulated)."""
|
|
395
|
+
executor = CommandExecutor(verbose=False)
|
|
396
|
+
|
|
397
|
+
try:
|
|
398
|
+
# Execute multiple simple commands
|
|
399
|
+
commands = [
|
|
400
|
+
"echo 'Command 1'",
|
|
401
|
+
"echo 'Command 2'",
|
|
402
|
+
"echo 'Command 3'"
|
|
403
|
+
]
|
|
404
|
+
|
|
405
|
+
results = []
|
|
406
|
+
for cmd in commands:
|
|
407
|
+
if platform.system() == "Windows":
|
|
408
|
+
cmd = cmd.replace("'", '"')
|
|
409
|
+
exit_code, output = executor.execute(cmd)
|
|
410
|
+
results.append((exit_code, output))
|
|
411
|
+
|
|
412
|
+
# Verify all commands succeeded
|
|
413
|
+
for i, (exit_code, output) in enumerate(results):
|
|
414
|
+
assert exit_code == 0
|
|
415
|
+
assert f"Command {i+1}" in output
|
|
416
|
+
|
|
417
|
+
finally:
|
|
418
|
+
executor.cleanup()
|
|
419
|
+
|
|
420
|
+
def test_timeout_and_recovery(self):
|
|
421
|
+
"""Test timeout handling and recovery."""
|
|
422
|
+
executor = CommandExecutor(verbose=False)
|
|
423
|
+
|
|
424
|
+
try:
|
|
425
|
+
# Test timeout
|
|
426
|
+
if platform.system() == "Windows":
|
|
427
|
+
long_command = "ping -n 10 127.0.0.1"
|
|
428
|
+
else:
|
|
429
|
+
long_command = "sleep 5"
|
|
430
|
+
|
|
431
|
+
with pytest.raises(CommandTimeoutError):
|
|
432
|
+
executor.execute(long_command, timeout=1.0)
|
|
433
|
+
|
|
434
|
+
# Test that executor still works after timeout
|
|
435
|
+
simple_command = "echo 'Recovery test'"
|
|
436
|
+
if platform.system() == "Windows":
|
|
437
|
+
simple_command = 'echo "Recovery test"'
|
|
438
|
+
|
|
439
|
+
exit_code, output = executor.execute(simple_command)
|
|
440
|
+
assert exit_code == 0
|
|
441
|
+
assert "Recovery test" in output
|
|
442
|
+
|
|
443
|
+
finally:
|
|
444
|
+
executor.cleanup()
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
if __name__ == "__main__":
|
|
448
|
+
pytest.main([__file__, "-v"])
|