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,397 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Tests for process cleanup functionality.
|
|
3
|
+
|
|
4
|
+
This module tests the process cleanup mechanisms used in shell command execution.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
import os
|
|
9
|
+
import platform
|
|
10
|
+
import time
|
|
11
|
+
from unittest.mock import Mock, patch, MagicMock
|
|
12
|
+
import subprocess
|
|
13
|
+
|
|
14
|
+
from autocoder.common.shell_commands.process_cleanup import (
|
|
15
|
+
cleanup_process_tree,
|
|
16
|
+
kill_process_group,
|
|
17
|
+
get_process_children,
|
|
18
|
+
is_process_running,
|
|
19
|
+
wait_for_process_exit
|
|
20
|
+
)
|
|
21
|
+
from autocoder.common.shell_commands.exceptions import (
|
|
22
|
+
ProcessCleanupError,
|
|
23
|
+
ProcessNotFoundError
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class TestProcessCleanup:
|
|
28
|
+
"""Test cases for process cleanup functionality."""
|
|
29
|
+
|
|
30
|
+
def test_cleanup_process_tree_nonexistent_process(self):
|
|
31
|
+
"""Test cleanup of non-existent process."""
|
|
32
|
+
# Use a PID that's very unlikely to exist
|
|
33
|
+
fake_pid = 999999
|
|
34
|
+
|
|
35
|
+
# Should handle gracefully
|
|
36
|
+
result = cleanup_process_tree(fake_pid)
|
|
37
|
+
assert result is True # Should return True if process doesn't exist
|
|
38
|
+
|
|
39
|
+
def test_cleanup_process_tree_with_timeout(self):
|
|
40
|
+
"""Test cleanup with custom timeout."""
|
|
41
|
+
# Create a simple process
|
|
42
|
+
if platform.system() == "Windows":
|
|
43
|
+
process = subprocess.Popen(["ping", "-n", "1", "127.0.0.1"],
|
|
44
|
+
stdout=subprocess.PIPE,
|
|
45
|
+
stderr=subprocess.PIPE)
|
|
46
|
+
else:
|
|
47
|
+
process = subprocess.Popen(["sleep", "0.1"],
|
|
48
|
+
stdout=subprocess.PIPE,
|
|
49
|
+
stderr=subprocess.PIPE)
|
|
50
|
+
|
|
51
|
+
pid = process.pid
|
|
52
|
+
|
|
53
|
+
# Wait for process to finish naturally
|
|
54
|
+
time.sleep(0.2)
|
|
55
|
+
|
|
56
|
+
# Cleanup should succeed
|
|
57
|
+
result = cleanup_process_tree(pid, timeout=1.0)
|
|
58
|
+
assert result is True
|
|
59
|
+
|
|
60
|
+
# Ensure process is terminated
|
|
61
|
+
process.wait()
|
|
62
|
+
|
|
63
|
+
def test_cleanup_process_tree_already_terminated(self):
|
|
64
|
+
"""Test cleanup of already terminated process."""
|
|
65
|
+
# Create and immediately terminate a process
|
|
66
|
+
if platform.system() == "Windows":
|
|
67
|
+
process = subprocess.Popen(["ping", "-n", "1", "127.0.0.1"])
|
|
68
|
+
else:
|
|
69
|
+
process = subprocess.Popen(["echo", "test"])
|
|
70
|
+
|
|
71
|
+
pid = process.pid
|
|
72
|
+
process.wait() # Wait for it to finish
|
|
73
|
+
|
|
74
|
+
# Cleanup should succeed
|
|
75
|
+
result = cleanup_process_tree(pid)
|
|
76
|
+
assert result is True
|
|
77
|
+
|
|
78
|
+
@patch('autocoder.common.shell_commands.process_cleanup.psutil')
|
|
79
|
+
@patch('autocoder.common.shell_commands.process_cleanup.os.kill')
|
|
80
|
+
def test_cleanup_process_tree_kill_failure(self, mock_kill, mock_psutil):
|
|
81
|
+
"""Test cleanup when kill fails."""
|
|
82
|
+
# Mock psutil to make it seem like process exists but can't be killed
|
|
83
|
+
mock_proc = MagicMock()
|
|
84
|
+
mock_proc.is_running.return_value = True
|
|
85
|
+
mock_proc.status.return_value = 'running'
|
|
86
|
+
mock_psutil.Process.return_value = mock_proc
|
|
87
|
+
mock_psutil.STATUS_ZOMBIE = 'zombie'
|
|
88
|
+
|
|
89
|
+
# Mock os.kill to raise an exception
|
|
90
|
+
mock_kill.side_effect = OSError("Permission denied")
|
|
91
|
+
|
|
92
|
+
# Should handle the error gracefully
|
|
93
|
+
result = cleanup_process_tree(1234)
|
|
94
|
+
assert result is False # Should return False when cleanup fails
|
|
95
|
+
|
|
96
|
+
def test_cleanup_process_tree_with_children(self):
|
|
97
|
+
"""Test cleanup of process with children."""
|
|
98
|
+
# This test is complex and depends on psutil availability
|
|
99
|
+
# For now, just test that the function can be called
|
|
100
|
+
result = cleanup_process_tree(999999) # Non-existent PID
|
|
101
|
+
assert result is True
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class TestKillProcessGroup:
|
|
105
|
+
"""Test cases for kill_process_group function."""
|
|
106
|
+
|
|
107
|
+
def test_kill_process_group_nonexistent(self):
|
|
108
|
+
"""Test killing non-existent process group."""
|
|
109
|
+
# Use a PGID that's very unlikely to exist
|
|
110
|
+
fake_pgid = 999999
|
|
111
|
+
|
|
112
|
+
# Should handle gracefully
|
|
113
|
+
result = kill_process_group(fake_pgid)
|
|
114
|
+
assert result is False # Should return False if group doesn't exist
|
|
115
|
+
|
|
116
|
+
@patch('autocoder.common.shell_commands.process_cleanup.os.killpg')
|
|
117
|
+
def test_kill_process_group_success(self, mock_killpg):
|
|
118
|
+
"""Test successful process group killing."""
|
|
119
|
+
# Mock successful killpg
|
|
120
|
+
mock_killpg.return_value = None
|
|
121
|
+
|
|
122
|
+
result = kill_process_group(1234)
|
|
123
|
+
assert result is True
|
|
124
|
+
mock_killpg.assert_called_once()
|
|
125
|
+
|
|
126
|
+
@patch('autocoder.common.shell_commands.process_cleanup.os.killpg')
|
|
127
|
+
def test_kill_process_group_failure(self, mock_killpg):
|
|
128
|
+
"""Test failed process group killing."""
|
|
129
|
+
# Mock failed killpg
|
|
130
|
+
mock_killpg.side_effect = OSError("No such process")
|
|
131
|
+
|
|
132
|
+
result = kill_process_group(1234)
|
|
133
|
+
assert result is False
|
|
134
|
+
mock_killpg.assert_called_once()
|
|
135
|
+
|
|
136
|
+
def test_kill_process_group_with_custom_signal(self):
|
|
137
|
+
"""Test killing process group with custom signal."""
|
|
138
|
+
import signal
|
|
139
|
+
|
|
140
|
+
# Should handle custom signal
|
|
141
|
+
result = kill_process_group(999999, signal.SIGTERM)
|
|
142
|
+
assert result is False # Non-existent group should fail
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class TestGetProcessChildren:
|
|
146
|
+
"""Test cases for get_process_children function."""
|
|
147
|
+
|
|
148
|
+
def test_get_process_children_nonexistent(self):
|
|
149
|
+
"""Test getting children of non-existent process."""
|
|
150
|
+
fake_pid = 999999
|
|
151
|
+
|
|
152
|
+
children = get_process_children(fake_pid)
|
|
153
|
+
assert children == [] # Should return empty list
|
|
154
|
+
|
|
155
|
+
def test_get_process_children_no_children(self):
|
|
156
|
+
"""Test getting children of process with no children."""
|
|
157
|
+
# Create a simple process with no children
|
|
158
|
+
if platform.system() == "Windows":
|
|
159
|
+
process = subprocess.Popen(["ping", "-n", "1", "127.0.0.1"])
|
|
160
|
+
else:
|
|
161
|
+
process = subprocess.Popen(["echo", "test"])
|
|
162
|
+
|
|
163
|
+
pid = process.pid
|
|
164
|
+
|
|
165
|
+
children = get_process_children(pid)
|
|
166
|
+
assert isinstance(children, list)
|
|
167
|
+
|
|
168
|
+
# Clean up
|
|
169
|
+
process.wait()
|
|
170
|
+
|
|
171
|
+
@patch('autocoder.common.shell_commands.process_cleanup.PSUTIL_AVAILABLE', False)
|
|
172
|
+
def test_get_process_children_without_psutil(self):
|
|
173
|
+
"""Test getting children when psutil is not available."""
|
|
174
|
+
children = get_process_children(1234)
|
|
175
|
+
assert children == [] # Should return empty list without psutil
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
class TestIsProcessRunning:
|
|
179
|
+
"""Test cases for is_process_running function."""
|
|
180
|
+
|
|
181
|
+
def test_is_process_running_nonexistent(self):
|
|
182
|
+
"""Test checking non-existent process."""
|
|
183
|
+
fake_pid = 999999
|
|
184
|
+
|
|
185
|
+
result = is_process_running(fake_pid)
|
|
186
|
+
assert result is False
|
|
187
|
+
|
|
188
|
+
def test_is_process_running_existing(self):
|
|
189
|
+
"""Test checking existing process."""
|
|
190
|
+
# Create a short-lived process
|
|
191
|
+
if platform.system() == "Windows":
|
|
192
|
+
process = subprocess.Popen(["ping", "-n", "1", "127.0.0.1"])
|
|
193
|
+
else:
|
|
194
|
+
process = subprocess.Popen(["sleep", "0.1"])
|
|
195
|
+
|
|
196
|
+
pid = process.pid
|
|
197
|
+
|
|
198
|
+
# Should be running initially
|
|
199
|
+
result = is_process_running(pid)
|
|
200
|
+
assert result is True
|
|
201
|
+
|
|
202
|
+
# Wait for process to finish
|
|
203
|
+
process.wait()
|
|
204
|
+
|
|
205
|
+
# Should not be running after completion
|
|
206
|
+
result = is_process_running(pid)
|
|
207
|
+
assert result is False
|
|
208
|
+
|
|
209
|
+
def test_is_process_running_current_process(self):
|
|
210
|
+
"""Test checking current process."""
|
|
211
|
+
current_pid = os.getpid()
|
|
212
|
+
|
|
213
|
+
result = is_process_running(current_pid)
|
|
214
|
+
assert result is True
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
class TestWaitForProcessExit:
|
|
218
|
+
"""Test cases for wait_for_process_exit function."""
|
|
219
|
+
|
|
220
|
+
def test_wait_for_process_exit_nonexistent(self):
|
|
221
|
+
"""Test waiting for non-existent process."""
|
|
222
|
+
fake_pid = 999999
|
|
223
|
+
|
|
224
|
+
result = wait_for_process_exit(fake_pid, timeout=0.1)
|
|
225
|
+
assert result is True # Should return True if process doesn't exist
|
|
226
|
+
|
|
227
|
+
def test_wait_for_process_exit_quick_process(self):
|
|
228
|
+
"""Test waiting for quick process."""
|
|
229
|
+
# Create a quick process
|
|
230
|
+
if platform.system() == "Windows":
|
|
231
|
+
process = subprocess.Popen(["ping", "-n", "1", "127.0.0.1"])
|
|
232
|
+
else:
|
|
233
|
+
process = subprocess.Popen(["echo", "test"])
|
|
234
|
+
|
|
235
|
+
pid = process.pid
|
|
236
|
+
|
|
237
|
+
# Should exit quickly
|
|
238
|
+
result = wait_for_process_exit(pid, timeout=5.0)
|
|
239
|
+
assert result is True
|
|
240
|
+
|
|
241
|
+
# Ensure process is done
|
|
242
|
+
process.wait()
|
|
243
|
+
|
|
244
|
+
def test_wait_for_process_exit_timeout(self):
|
|
245
|
+
"""Test waiting for process with timeout."""
|
|
246
|
+
# Create a longer-running process
|
|
247
|
+
if platform.system() == "Windows":
|
|
248
|
+
process = subprocess.Popen(["ping", "-n", "10", "127.0.0.1"])
|
|
249
|
+
else:
|
|
250
|
+
process = subprocess.Popen(["sleep", "1"])
|
|
251
|
+
|
|
252
|
+
pid = process.pid
|
|
253
|
+
|
|
254
|
+
# Should timeout
|
|
255
|
+
result = wait_for_process_exit(pid, timeout=0.1)
|
|
256
|
+
assert result is False
|
|
257
|
+
|
|
258
|
+
# Clean up
|
|
259
|
+
process.terminate()
|
|
260
|
+
process.wait()
|
|
261
|
+
|
|
262
|
+
def test_wait_for_process_exit_zero_timeout(self):
|
|
263
|
+
"""Test waiting with zero timeout."""
|
|
264
|
+
# Create a process
|
|
265
|
+
if platform.system() == "Windows":
|
|
266
|
+
process = subprocess.Popen(["ping", "-n", "1", "127.0.0.1"])
|
|
267
|
+
else:
|
|
268
|
+
process = subprocess.Popen(["echo", "test"])
|
|
269
|
+
|
|
270
|
+
pid = process.pid
|
|
271
|
+
|
|
272
|
+
# Zero timeout should return immediately
|
|
273
|
+
result = wait_for_process_exit(pid, timeout=0.0)
|
|
274
|
+
assert result is False # Should timeout immediately
|
|
275
|
+
|
|
276
|
+
# Clean up
|
|
277
|
+
process.wait()
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
class TestProcessCleanupIntegration:
|
|
281
|
+
"""Test cases for process cleanup integration scenarios."""
|
|
282
|
+
|
|
283
|
+
def test_full_cleanup_workflow(self):
|
|
284
|
+
"""Test complete cleanup workflow."""
|
|
285
|
+
# Create a process
|
|
286
|
+
if platform.system() == "Windows":
|
|
287
|
+
process = subprocess.Popen(["ping", "-n", "1", "127.0.0.1"])
|
|
288
|
+
else:
|
|
289
|
+
process = subprocess.Popen(["echo", "test"])
|
|
290
|
+
|
|
291
|
+
pid = process.pid
|
|
292
|
+
|
|
293
|
+
# Verify process is running
|
|
294
|
+
assert is_process_running(pid) is True
|
|
295
|
+
|
|
296
|
+
# Wait for natural exit
|
|
297
|
+
process.wait()
|
|
298
|
+
|
|
299
|
+
# Cleanup should succeed
|
|
300
|
+
result = cleanup_process_tree(pid)
|
|
301
|
+
assert result is True
|
|
302
|
+
|
|
303
|
+
# Verify process is not running
|
|
304
|
+
assert is_process_running(pid) is False
|
|
305
|
+
|
|
306
|
+
def test_cleanup_with_error_handling(self):
|
|
307
|
+
"""Test cleanup with error handling."""
|
|
308
|
+
# Test with invalid PID
|
|
309
|
+
invalid_pid = -1
|
|
310
|
+
|
|
311
|
+
# Should handle gracefully
|
|
312
|
+
result = cleanup_process_tree(invalid_pid)
|
|
313
|
+
assert result is True # Should succeed for invalid PID
|
|
314
|
+
|
|
315
|
+
def test_cleanup_performance(self):
|
|
316
|
+
"""Test cleanup performance with reasonable timeout."""
|
|
317
|
+
# Create multiple quick processes
|
|
318
|
+
processes = []
|
|
319
|
+
pids = []
|
|
320
|
+
|
|
321
|
+
for i in range(3):
|
|
322
|
+
if platform.system() == "Windows":
|
|
323
|
+
proc = subprocess.Popen(["ping", "-n", "1", "127.0.0.1"])
|
|
324
|
+
else:
|
|
325
|
+
proc = subprocess.Popen(["echo", f"test{i}"])
|
|
326
|
+
|
|
327
|
+
processes.append(proc)
|
|
328
|
+
pids.append(proc.pid)
|
|
329
|
+
|
|
330
|
+
# Wait for all to complete
|
|
331
|
+
for proc in processes:
|
|
332
|
+
proc.wait()
|
|
333
|
+
|
|
334
|
+
# Cleanup should be fast
|
|
335
|
+
start_time = time.time()
|
|
336
|
+
|
|
337
|
+
for pid in pids:
|
|
338
|
+
cleanup_process_tree(pid)
|
|
339
|
+
|
|
340
|
+
elapsed = time.time() - start_time
|
|
341
|
+
assert elapsed < 5.0 # Should complete within 5 seconds
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
class TestProcessCleanupEdgeCases:
|
|
345
|
+
"""Test cases for edge cases in process cleanup."""
|
|
346
|
+
|
|
347
|
+
def test_cleanup_with_negative_pid(self):
|
|
348
|
+
"""Test cleanup with negative PID."""
|
|
349
|
+
result = cleanup_process_tree(-1)
|
|
350
|
+
assert result is True # Should handle gracefully
|
|
351
|
+
|
|
352
|
+
def test_cleanup_with_zero_pid(self):
|
|
353
|
+
"""Test cleanup with zero PID."""
|
|
354
|
+
result = cleanup_process_tree(0)
|
|
355
|
+
assert result is True # Should handle gracefully
|
|
356
|
+
|
|
357
|
+
def test_cleanup_with_very_large_pid(self):
|
|
358
|
+
"""Test cleanup with very large PID."""
|
|
359
|
+
result = cleanup_process_tree(999999999)
|
|
360
|
+
assert result is True # Should handle gracefully
|
|
361
|
+
|
|
362
|
+
def test_cleanup_with_negative_timeout(self):
|
|
363
|
+
"""Test cleanup with negative timeout."""
|
|
364
|
+
result = cleanup_process_tree(999999, timeout=-1.0)
|
|
365
|
+
assert result is True # Should handle gracefully
|
|
366
|
+
|
|
367
|
+
def test_cleanup_with_zero_timeout(self):
|
|
368
|
+
"""Test cleanup with zero timeout."""
|
|
369
|
+
result = cleanup_process_tree(999999, timeout=0.0)
|
|
370
|
+
assert result is True # Should handle gracefully
|
|
371
|
+
|
|
372
|
+
def test_concurrent_cleanup_calls(self):
|
|
373
|
+
"""Test concurrent cleanup calls."""
|
|
374
|
+
import threading
|
|
375
|
+
|
|
376
|
+
results = []
|
|
377
|
+
|
|
378
|
+
def cleanup_worker(pid):
|
|
379
|
+
result = cleanup_process_tree(pid)
|
|
380
|
+
results.append(result)
|
|
381
|
+
|
|
382
|
+
threads = []
|
|
383
|
+
for i in range(3):
|
|
384
|
+
thread = threading.Thread(target=cleanup_worker, args=(999999 + i,))
|
|
385
|
+
threads.append(thread)
|
|
386
|
+
thread.start()
|
|
387
|
+
|
|
388
|
+
for thread in threads:
|
|
389
|
+
thread.join()
|
|
390
|
+
|
|
391
|
+
# All should succeed
|
|
392
|
+
assert all(results)
|
|
393
|
+
assert len(results) == 3
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
if __name__ == "__main__":
|
|
397
|
+
pytest.main([__file__, "-v"])
|