auto-coder 1.0.0__py3-none-any.whl → 2.0.1__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.1.dist-info/LICENSE +158 -0
- auto_coder-2.0.1.dist-info/METADATA +558 -0
- auto_coder-2.0.1.dist-info/RECORD +795 -0
- {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/WHEEL +1 -1
- {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.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 +77 -73
- autocoder/auto_coder.py +31 -40
- autocoder/auto_coder_rag.py +11 -1084
- autocoder/auto_coder_runner.py +962 -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 +409 -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 +316 -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 +356 -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 +1094 -0
- autocoder/default_project/__init__.py +501 -0
- autocoder/dispacher/__init__.py +4 -12
- autocoder/dispacher/actions/action.py +400 -129
- autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
- autocoder/index/entry.py +117 -125
- 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 +923 -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 +665 -0
- autocoder/workflow_agents/loader.py +749 -0
- autocoder/workflow_agents/runner.py +267 -0
- autocoder/workflow_agents/types.py +173 -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.1.dist-info}/top_level.txt +0 -0
- /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Test suite for InteractivePexpectProcess.
|
|
4
|
+
|
|
5
|
+
This module provides unit tests for the InteractivePexpectProcess class.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import pytest
|
|
9
|
+
import time
|
|
10
|
+
import signal
|
|
11
|
+
import platform
|
|
12
|
+
from unittest.mock import Mock, patch
|
|
13
|
+
|
|
14
|
+
from .interactive_pexpect_process import InteractivePexpectProcess, PEXPECT_AVAILABLE
|
|
15
|
+
from .exceptions import CommandExecutionError
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class TestInteractivePexpectProcess:
|
|
19
|
+
"""Test suite for InteractivePexpectProcess."""
|
|
20
|
+
|
|
21
|
+
def test_init(self):
|
|
22
|
+
"""Test initialization."""
|
|
23
|
+
if not PEXPECT_AVAILABLE:
|
|
24
|
+
pytest.skip("pexpect not available")
|
|
25
|
+
|
|
26
|
+
proc = InteractivePexpectProcess("echo test")
|
|
27
|
+
assert proc.command == "echo test"
|
|
28
|
+
assert proc.encoding == "utf-8"
|
|
29
|
+
assert proc.shell is True
|
|
30
|
+
assert proc.timeout is None
|
|
31
|
+
assert not proc.is_alive()
|
|
32
|
+
|
|
33
|
+
def test_init_with_args(self):
|
|
34
|
+
"""Test initialization with arguments."""
|
|
35
|
+
if not PEXPECT_AVAILABLE:
|
|
36
|
+
pytest.skip("pexpect not available")
|
|
37
|
+
|
|
38
|
+
proc = InteractivePexpectProcess(
|
|
39
|
+
["ls", "-la"],
|
|
40
|
+
cwd="/tmp",
|
|
41
|
+
timeout=10.0,
|
|
42
|
+
shell=False
|
|
43
|
+
)
|
|
44
|
+
assert proc.command == ["ls", "-la"]
|
|
45
|
+
assert proc.cwd == "/tmp"
|
|
46
|
+
assert proc.timeout == 10.0
|
|
47
|
+
assert proc.shell is False
|
|
48
|
+
|
|
49
|
+
def test_pexpect_unavailable(self):
|
|
50
|
+
"""Test behavior when pexpect is unavailable."""
|
|
51
|
+
with patch('src.autocoder.common.shell_commands.interactive_pexpect_process.PEXPECT_AVAILABLE', False):
|
|
52
|
+
with pytest.raises(CommandExecutionError, match="pexpect not available"):
|
|
53
|
+
InteractivePexpectProcess("echo test")
|
|
54
|
+
|
|
55
|
+
def test_basic_command(self):
|
|
56
|
+
"""Test running a basic command."""
|
|
57
|
+
if not PEXPECT_AVAILABLE:
|
|
58
|
+
pytest.skip("pexpect not available")
|
|
59
|
+
|
|
60
|
+
with InteractivePexpectProcess("echo 'Hello World'", timeout=5.0) as proc:
|
|
61
|
+
# Give command time to execute
|
|
62
|
+
time.sleep(0.5)
|
|
63
|
+
|
|
64
|
+
# Process should be alive briefly
|
|
65
|
+
assert proc.pid is not None
|
|
66
|
+
|
|
67
|
+
# Read output
|
|
68
|
+
output = proc.read_output(timeout=2.0)
|
|
69
|
+
assert output is not None
|
|
70
|
+
assert "Hello World" in output
|
|
71
|
+
|
|
72
|
+
def test_command_with_args(self):
|
|
73
|
+
"""Test running command with arguments."""
|
|
74
|
+
if not PEXPECT_AVAILABLE:
|
|
75
|
+
pytest.skip("pexpect not available")
|
|
76
|
+
|
|
77
|
+
with InteractivePexpectProcess(["echo", "test"], shell=False, timeout=5.0) as proc:
|
|
78
|
+
time.sleep(0.5)
|
|
79
|
+
|
|
80
|
+
output = proc.read_output(timeout=2.0)
|
|
81
|
+
assert output is not None
|
|
82
|
+
assert "test" in output
|
|
83
|
+
|
|
84
|
+
def test_write_and_read(self):
|
|
85
|
+
"""Test writing to and reading from process."""
|
|
86
|
+
if not PEXPECT_AVAILABLE:
|
|
87
|
+
pytest.skip("pexpect not available")
|
|
88
|
+
|
|
89
|
+
if platform.system() == "Windows":
|
|
90
|
+
pytest.skip("Interactive shell test not reliable on Windows")
|
|
91
|
+
|
|
92
|
+
with InteractivePexpectProcess("cat", timeout=5.0) as proc:
|
|
93
|
+
# Write to process
|
|
94
|
+
test_data = "Hello from test\n"
|
|
95
|
+
proc.write(test_data)
|
|
96
|
+
|
|
97
|
+
# Read back
|
|
98
|
+
output = proc.read_output(timeout=2.0)
|
|
99
|
+
assert output is not None
|
|
100
|
+
assert "Hello from test" in output
|
|
101
|
+
|
|
102
|
+
def test_sendline(self):
|
|
103
|
+
"""Test sendline method."""
|
|
104
|
+
if not PEXPECT_AVAILABLE:
|
|
105
|
+
pytest.skip("pexpect not available")
|
|
106
|
+
|
|
107
|
+
if platform.system() == "Windows":
|
|
108
|
+
pytest.skip("Interactive shell test not reliable on Windows")
|
|
109
|
+
|
|
110
|
+
with InteractivePexpectProcess("cat", timeout=5.0) as proc:
|
|
111
|
+
proc.sendline("test line")
|
|
112
|
+
|
|
113
|
+
output = proc.read_output(timeout=2.0)
|
|
114
|
+
assert output is not None
|
|
115
|
+
assert "test line" in output
|
|
116
|
+
|
|
117
|
+
def test_expect_pattern(self):
|
|
118
|
+
"""Test expect pattern matching."""
|
|
119
|
+
if not PEXPECT_AVAILABLE:
|
|
120
|
+
pytest.skip("pexpect not available")
|
|
121
|
+
|
|
122
|
+
with InteractivePexpectProcess("echo 'Pattern: SUCCESS'", timeout=5.0) as proc:
|
|
123
|
+
try:
|
|
124
|
+
result = proc.expect("SUCCESS", timeout=3.0)
|
|
125
|
+
assert result == 0
|
|
126
|
+
assert proc.after is not None
|
|
127
|
+
assert "SUCCESS" in proc.after
|
|
128
|
+
except CommandExecutionError:
|
|
129
|
+
# This might happen if the command completes too quickly
|
|
130
|
+
pass
|
|
131
|
+
|
|
132
|
+
def test_expect_timeout(self):
|
|
133
|
+
"""Test expect timeout."""
|
|
134
|
+
if not PEXPECT_AVAILABLE:
|
|
135
|
+
pytest.skip("pexpect not available")
|
|
136
|
+
|
|
137
|
+
with InteractivePexpectProcess("echo 'test'", timeout=5.0) as proc:
|
|
138
|
+
with pytest.raises(CommandExecutionError, match="timeout"):
|
|
139
|
+
proc.expect("NEVER_APPEARS", timeout=1.0)
|
|
140
|
+
|
|
141
|
+
def test_signal_handling(self):
|
|
142
|
+
"""Test signal handling."""
|
|
143
|
+
if not PEXPECT_AVAILABLE:
|
|
144
|
+
pytest.skip("pexpect not available")
|
|
145
|
+
|
|
146
|
+
if platform.system() == "Windows":
|
|
147
|
+
pytest.skip("Signal handling test not reliable on Windows")
|
|
148
|
+
|
|
149
|
+
with InteractivePexpectProcess("sleep 10", timeout=5.0) as proc:
|
|
150
|
+
# Let process start
|
|
151
|
+
time.sleep(0.5)
|
|
152
|
+
assert proc.is_alive()
|
|
153
|
+
|
|
154
|
+
# Send SIGINT
|
|
155
|
+
proc.send_signal(signal.SIGINT)
|
|
156
|
+
|
|
157
|
+
# Wait for termination
|
|
158
|
+
time.sleep(1.0)
|
|
159
|
+
|
|
160
|
+
# Process should be terminated
|
|
161
|
+
assert not proc.is_alive()
|
|
162
|
+
|
|
163
|
+
def test_terminate(self):
|
|
164
|
+
"""Test process termination."""
|
|
165
|
+
if not PEXPECT_AVAILABLE:
|
|
166
|
+
pytest.skip("pexpect not available")
|
|
167
|
+
|
|
168
|
+
proc = InteractivePexpectProcess("sleep 10", timeout=5.0)
|
|
169
|
+
proc.start()
|
|
170
|
+
|
|
171
|
+
# Let process start
|
|
172
|
+
time.sleep(0.5)
|
|
173
|
+
assert proc.is_alive()
|
|
174
|
+
|
|
175
|
+
# Terminate
|
|
176
|
+
result = proc.terminate()
|
|
177
|
+
assert result is True
|
|
178
|
+
assert not proc.is_alive()
|
|
179
|
+
|
|
180
|
+
def test_context_manager(self):
|
|
181
|
+
"""Test context manager functionality."""
|
|
182
|
+
if not PEXPECT_AVAILABLE:
|
|
183
|
+
pytest.skip("pexpect not available")
|
|
184
|
+
|
|
185
|
+
with InteractivePexpectProcess("echo 'context test'", timeout=5.0) as proc:
|
|
186
|
+
assert proc.is_alive()
|
|
187
|
+
pid = proc.pid
|
|
188
|
+
assert pid is not None
|
|
189
|
+
|
|
190
|
+
# Process should be terminated after context exit
|
|
191
|
+
assert not proc.is_alive()
|
|
192
|
+
|
|
193
|
+
def test_stats(self):
|
|
194
|
+
"""Test process statistics."""
|
|
195
|
+
if not PEXPECT_AVAILABLE:
|
|
196
|
+
pytest.skip("pexpect not available")
|
|
197
|
+
|
|
198
|
+
with InteractivePexpectProcess("echo 'stats test'", timeout=5.0) as proc:
|
|
199
|
+
time.sleep(0.5)
|
|
200
|
+
|
|
201
|
+
stats = proc.get_stats()
|
|
202
|
+
assert isinstance(stats, dict)
|
|
203
|
+
assert 'pid' in stats
|
|
204
|
+
assert 'is_alive' in stats
|
|
205
|
+
assert 'platform' in stats
|
|
206
|
+
assert 'pexpect_available' in stats
|
|
207
|
+
assert stats['pexpect_available'] is True
|
|
208
|
+
|
|
209
|
+
def test_read_lines(self):
|
|
210
|
+
"""Test line reading generator."""
|
|
211
|
+
if not PEXPECT_AVAILABLE:
|
|
212
|
+
pytest.skip("pexpect not available")
|
|
213
|
+
|
|
214
|
+
script = '''
|
|
215
|
+
python3 -c "
|
|
216
|
+
print('Line 1')
|
|
217
|
+
print('Line 2')
|
|
218
|
+
print('Line 3')
|
|
219
|
+
"
|
|
220
|
+
'''
|
|
221
|
+
|
|
222
|
+
with InteractivePexpectProcess(script, shell=True, timeout=5.0) as proc:
|
|
223
|
+
lines = []
|
|
224
|
+
for line in proc.read_lines(timeout=0.5):
|
|
225
|
+
lines.append(line.strip())
|
|
226
|
+
if len(lines) >= 3: # Limit to avoid infinite loop
|
|
227
|
+
break
|
|
228
|
+
|
|
229
|
+
# Should have captured some lines
|
|
230
|
+
assert len(lines) > 0
|
|
231
|
+
|
|
232
|
+
def test_error_handling(self):
|
|
233
|
+
"""Test error handling."""
|
|
234
|
+
if not PEXPECT_AVAILABLE:
|
|
235
|
+
pytest.skip("pexpect not available")
|
|
236
|
+
|
|
237
|
+
# Test invalid command
|
|
238
|
+
with pytest.raises(CommandExecutionError):
|
|
239
|
+
with InteractivePexpectProcess("nonexistent_command_12345", timeout=2.0) as proc:
|
|
240
|
+
time.sleep(1.0)
|
|
241
|
+
|
|
242
|
+
def test_properties(self):
|
|
243
|
+
"""Test process properties."""
|
|
244
|
+
if not PEXPECT_AVAILABLE:
|
|
245
|
+
pytest.skip("pexpect not available")
|
|
246
|
+
|
|
247
|
+
with InteractivePexpectProcess("echo 'property test'", timeout=5.0) as proc:
|
|
248
|
+
# Test initial properties
|
|
249
|
+
assert proc.pid is not None
|
|
250
|
+
assert proc.duration is not None
|
|
251
|
+
assert proc.bytes_written >= 0
|
|
252
|
+
assert proc.bytes_read >= 0
|
|
253
|
+
|
|
254
|
+
# Test after some activity
|
|
255
|
+
proc.sendline("test")
|
|
256
|
+
time.sleep(0.1)
|
|
257
|
+
|
|
258
|
+
assert proc.bytes_written > 0
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def test_platform_compatibility():
|
|
262
|
+
"""Test platform-specific behavior."""
|
|
263
|
+
if not PEXPECT_AVAILABLE:
|
|
264
|
+
pytest.skip("pexpect not available")
|
|
265
|
+
|
|
266
|
+
# This test should work on all platforms where pexpect is available
|
|
267
|
+
with InteractivePexpectProcess("echo 'platform test'", timeout=5.0) as proc:
|
|
268
|
+
assert proc.is_alive()
|
|
269
|
+
|
|
270
|
+
# Platform-specific behavior
|
|
271
|
+
if platform.system() == "Windows":
|
|
272
|
+
# Windows uses popen_spawn
|
|
273
|
+
assert hasattr(proc.child, 'pid')
|
|
274
|
+
else:
|
|
275
|
+
# Unix-like systems use regular spawn
|
|
276
|
+
assert hasattr(proc.child, 'pid')
|
|
277
|
+
assert hasattr(proc.child, 'isalive')
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
if __name__ == "__main__":
|
|
281
|
+
pytest.main([__file__, "-v"])
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pytest configuration for Shell Commands module tests.
|
|
3
|
+
|
|
4
|
+
This file provides pytest configuration including fixtures, markers,
|
|
5
|
+
and test collection rules for the shell commands test suite.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import pytest
|
|
9
|
+
import platform
|
|
10
|
+
import tempfile
|
|
11
|
+
import shutil
|
|
12
|
+
from typing import Generator
|
|
13
|
+
|
|
14
|
+
# Define custom pytest markers
|
|
15
|
+
def pytest_configure(config):
|
|
16
|
+
"""Configure pytest with custom markers."""
|
|
17
|
+
config.addinivalue_line(
|
|
18
|
+
"markers",
|
|
19
|
+
"integration: marks tests as integration tests (may be slower)"
|
|
20
|
+
)
|
|
21
|
+
config.addinivalue_line(
|
|
22
|
+
"markers",
|
|
23
|
+
"performance: marks tests as performance tests (may be slow and resource intensive)"
|
|
24
|
+
)
|
|
25
|
+
config.addinivalue_line(
|
|
26
|
+
"markers",
|
|
27
|
+
"platform_specific: marks tests that are specific to certain platforms"
|
|
28
|
+
)
|
|
29
|
+
config.addinivalue_line(
|
|
30
|
+
"markers",
|
|
31
|
+
"requires_pexpect: marks tests that require pexpect to be available"
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@pytest.fixture
|
|
36
|
+
def temp_directory() -> Generator[str, None, None]:
|
|
37
|
+
"""Provide a temporary directory for tests."""
|
|
38
|
+
temp_dir = tempfile.mkdtemp()
|
|
39
|
+
try:
|
|
40
|
+
yield temp_dir
|
|
41
|
+
finally:
|
|
42
|
+
try:
|
|
43
|
+
shutil.rmtree(temp_dir)
|
|
44
|
+
except:
|
|
45
|
+
pass
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@pytest.fixture
|
|
49
|
+
def is_windows() -> bool:
|
|
50
|
+
"""Check if running on Windows."""
|
|
51
|
+
return platform.system() == "Windows"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@pytest.fixture
|
|
55
|
+
def is_unix() -> bool:
|
|
56
|
+
"""Check if running on Unix-like system."""
|
|
57
|
+
return platform.system() in ("Linux", "Darwin")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def pytest_collection_modifyitems(config, items):
|
|
61
|
+
"""Modify test collection to add skip conditions."""
|
|
62
|
+
# Skip performance tests by default unless explicitly requested
|
|
63
|
+
if not config.getoption("--run-performance"):
|
|
64
|
+
skip_performance = pytest.mark.skip(reason="Performance tests skipped (use --run-performance to enable)")
|
|
65
|
+
for item in items:
|
|
66
|
+
if "performance" in item.keywords:
|
|
67
|
+
item.add_marker(skip_performance)
|
|
68
|
+
|
|
69
|
+
# Skip integration tests if requested
|
|
70
|
+
if config.getoption("--skip-integration"):
|
|
71
|
+
skip_integration = pytest.mark.skip(reason="Integration tests skipped")
|
|
72
|
+
for item in items:
|
|
73
|
+
if "integration" in item.keywords:
|
|
74
|
+
item.add_marker(skip_integration)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def pytest_addoption(parser):
|
|
78
|
+
"""Add custom command line options."""
|
|
79
|
+
parser.addoption(
|
|
80
|
+
"--run-performance",
|
|
81
|
+
action="store_true",
|
|
82
|
+
default=False,
|
|
83
|
+
help="Run performance tests (disabled by default)"
|
|
84
|
+
)
|
|
85
|
+
parser.addoption(
|
|
86
|
+
"--skip-integration",
|
|
87
|
+
action="store_true",
|
|
88
|
+
default=False,
|
|
89
|
+
help="Skip integration tests"
|
|
90
|
+
)
|
|
91
|
+
parser.addoption(
|
|
92
|
+
"--test-timeout",
|
|
93
|
+
type=int,
|
|
94
|
+
default=30,
|
|
95
|
+
help="Default timeout for individual tests in seconds"
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
# Pytest hooks for better test organization
|
|
100
|
+
def pytest_runtest_setup(item):
|
|
101
|
+
"""Setup hook called before each test."""
|
|
102
|
+
# Set timeout for long-running tests
|
|
103
|
+
if hasattr(item, 'get_closest_marker'):
|
|
104
|
+
performance_marker = item.get_closest_marker("performance")
|
|
105
|
+
integration_marker = item.get_closest_marker("integration")
|
|
106
|
+
|
|
107
|
+
if performance_marker:
|
|
108
|
+
# Performance tests get longer timeout
|
|
109
|
+
if not hasattr(item, '_timeout'):
|
|
110
|
+
item._timeout = 120 # 2 minutes for performance tests
|
|
111
|
+
elif integration_marker:
|
|
112
|
+
# Integration tests get moderate timeout
|
|
113
|
+
if not hasattr(item, '_timeout'):
|
|
114
|
+
item._timeout = 60 # 1 minute for integration tests
|
|
115
|
+
else:
|
|
116
|
+
# Unit tests get standard timeout
|
|
117
|
+
if not hasattr(item, '_timeout'):
|
|
118
|
+
item._timeout = 30 # 30 seconds for unit tests
|