pdd-cli 0.0.45__py3-none-any.whl → 0.0.118__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.
- pdd/__init__.py +40 -8
- pdd/agentic_bug.py +323 -0
- pdd/agentic_bug_orchestrator.py +497 -0
- pdd/agentic_change.py +231 -0
- pdd/agentic_change_orchestrator.py +526 -0
- pdd/agentic_common.py +598 -0
- pdd/agentic_crash.py +534 -0
- pdd/agentic_e2e_fix.py +319 -0
- pdd/agentic_e2e_fix_orchestrator.py +426 -0
- pdd/agentic_fix.py +1294 -0
- pdd/agentic_langtest.py +162 -0
- pdd/agentic_update.py +387 -0
- pdd/agentic_verify.py +183 -0
- pdd/architecture_sync.py +565 -0
- pdd/auth_service.py +210 -0
- pdd/auto_deps_main.py +71 -51
- pdd/auto_include.py +245 -5
- pdd/auto_update.py +125 -47
- pdd/bug_main.py +196 -23
- pdd/bug_to_unit_test.py +2 -0
- pdd/change_main.py +11 -4
- pdd/cli.py +22 -1181
- pdd/cmd_test_main.py +350 -150
- pdd/code_generator.py +60 -18
- pdd/code_generator_main.py +790 -57
- pdd/commands/__init__.py +48 -0
- pdd/commands/analysis.py +306 -0
- pdd/commands/auth.py +309 -0
- pdd/commands/connect.py +290 -0
- pdd/commands/fix.py +163 -0
- pdd/commands/generate.py +257 -0
- pdd/commands/maintenance.py +175 -0
- pdd/commands/misc.py +87 -0
- pdd/commands/modify.py +256 -0
- pdd/commands/report.py +144 -0
- pdd/commands/sessions.py +284 -0
- pdd/commands/templates.py +215 -0
- pdd/commands/utility.py +110 -0
- pdd/config_resolution.py +58 -0
- pdd/conflicts_main.py +8 -3
- pdd/construct_paths.py +589 -111
- pdd/context_generator.py +10 -2
- pdd/context_generator_main.py +175 -76
- pdd/continue_generation.py +53 -10
- pdd/core/__init__.py +33 -0
- pdd/core/cli.py +527 -0
- pdd/core/cloud.py +237 -0
- pdd/core/dump.py +554 -0
- pdd/core/errors.py +67 -0
- pdd/core/remote_session.py +61 -0
- pdd/core/utils.py +90 -0
- pdd/crash_main.py +262 -33
- pdd/data/language_format.csv +71 -63
- pdd/data/llm_model.csv +20 -18
- pdd/detect_change_main.py +5 -4
- pdd/docs/prompting_guide.md +864 -0
- pdd/docs/whitepaper_with_benchmarks/data_and_functions/benchmark_analysis.py +495 -0
- pdd/docs/whitepaper_with_benchmarks/data_and_functions/creation_compare.py +528 -0
- pdd/fix_code_loop.py +523 -95
- pdd/fix_code_module_errors.py +6 -2
- pdd/fix_error_loop.py +491 -92
- pdd/fix_errors_from_unit_tests.py +4 -3
- pdd/fix_main.py +278 -21
- pdd/fix_verification_errors.py +12 -100
- pdd/fix_verification_errors_loop.py +529 -286
- pdd/fix_verification_main.py +294 -89
- pdd/frontend/dist/assets/index-B5DZHykP.css +1 -0
- pdd/frontend/dist/assets/index-DQ3wkeQ2.js +449 -0
- pdd/frontend/dist/index.html +376 -0
- pdd/frontend/dist/logo.svg +33 -0
- pdd/generate_output_paths.py +139 -15
- pdd/generate_test.py +218 -146
- pdd/get_comment.py +19 -44
- pdd/get_extension.py +8 -9
- pdd/get_jwt_token.py +318 -22
- pdd/get_language.py +8 -7
- pdd/get_run_command.py +75 -0
- pdd/get_test_command.py +68 -0
- pdd/git_update.py +70 -19
- pdd/incremental_code_generator.py +2 -2
- pdd/insert_includes.py +13 -4
- pdd/llm_invoke.py +1711 -181
- pdd/load_prompt_template.py +19 -12
- pdd/path_resolution.py +140 -0
- pdd/pdd_completion.fish +25 -2
- pdd/pdd_completion.sh +30 -4
- pdd/pdd_completion.zsh +79 -4
- pdd/postprocess.py +14 -4
- pdd/preprocess.py +293 -24
- pdd/preprocess_main.py +41 -6
- pdd/prompts/agentic_bug_step10_pr_LLM.prompt +182 -0
- pdd/prompts/agentic_bug_step1_duplicate_LLM.prompt +73 -0
- pdd/prompts/agentic_bug_step2_docs_LLM.prompt +129 -0
- pdd/prompts/agentic_bug_step3_triage_LLM.prompt +95 -0
- pdd/prompts/agentic_bug_step4_reproduce_LLM.prompt +97 -0
- pdd/prompts/agentic_bug_step5_root_cause_LLM.prompt +123 -0
- pdd/prompts/agentic_bug_step6_test_plan_LLM.prompt +107 -0
- pdd/prompts/agentic_bug_step7_generate_LLM.prompt +172 -0
- pdd/prompts/agentic_bug_step8_verify_LLM.prompt +119 -0
- pdd/prompts/agentic_bug_step9_e2e_test_LLM.prompt +289 -0
- pdd/prompts/agentic_change_step10_identify_issues_LLM.prompt +1006 -0
- pdd/prompts/agentic_change_step11_fix_issues_LLM.prompt +984 -0
- pdd/prompts/agentic_change_step12_create_pr_LLM.prompt +131 -0
- pdd/prompts/agentic_change_step1_duplicate_LLM.prompt +73 -0
- pdd/prompts/agentic_change_step2_docs_LLM.prompt +101 -0
- pdd/prompts/agentic_change_step3_research_LLM.prompt +126 -0
- pdd/prompts/agentic_change_step4_clarify_LLM.prompt +164 -0
- pdd/prompts/agentic_change_step5_docs_change_LLM.prompt +981 -0
- pdd/prompts/agentic_change_step6_devunits_LLM.prompt +1005 -0
- pdd/prompts/agentic_change_step7_architecture_LLM.prompt +1044 -0
- pdd/prompts/agentic_change_step8_analyze_LLM.prompt +1027 -0
- pdd/prompts/agentic_change_step9_implement_LLM.prompt +1077 -0
- pdd/prompts/agentic_crash_explore_LLM.prompt +49 -0
- pdd/prompts/agentic_e2e_fix_step1_unit_tests_LLM.prompt +90 -0
- pdd/prompts/agentic_e2e_fix_step2_e2e_tests_LLM.prompt +91 -0
- pdd/prompts/agentic_e2e_fix_step3_root_cause_LLM.prompt +89 -0
- pdd/prompts/agentic_e2e_fix_step4_fix_e2e_tests_LLM.prompt +96 -0
- pdd/prompts/agentic_e2e_fix_step5_identify_devunits_LLM.prompt +91 -0
- pdd/prompts/agentic_e2e_fix_step6_create_unit_tests_LLM.prompt +106 -0
- pdd/prompts/agentic_e2e_fix_step7_verify_tests_LLM.prompt +116 -0
- pdd/prompts/agentic_e2e_fix_step8_run_pdd_fix_LLM.prompt +120 -0
- pdd/prompts/agentic_e2e_fix_step9_verify_all_LLM.prompt +146 -0
- pdd/prompts/agentic_fix_explore_LLM.prompt +45 -0
- pdd/prompts/agentic_fix_harvest_only_LLM.prompt +48 -0
- pdd/prompts/agentic_fix_primary_LLM.prompt +85 -0
- pdd/prompts/agentic_update_LLM.prompt +925 -0
- pdd/prompts/agentic_verify_explore_LLM.prompt +45 -0
- pdd/prompts/auto_include_LLM.prompt +122 -905
- pdd/prompts/change_LLM.prompt +3093 -1
- pdd/prompts/detect_change_LLM.prompt +686 -27
- pdd/prompts/example_generator_LLM.prompt +22 -1
- pdd/prompts/extract_code_LLM.prompt +5 -1
- pdd/prompts/extract_program_code_fix_LLM.prompt +7 -1
- pdd/prompts/extract_prompt_update_LLM.prompt +7 -8
- pdd/prompts/extract_promptline_LLM.prompt +17 -11
- pdd/prompts/find_verification_errors_LLM.prompt +6 -0
- pdd/prompts/fix_code_module_errors_LLM.prompt +12 -2
- pdd/prompts/fix_errors_from_unit_tests_LLM.prompt +9 -0
- pdd/prompts/fix_verification_errors_LLM.prompt +22 -0
- pdd/prompts/generate_test_LLM.prompt +41 -7
- pdd/prompts/generate_test_from_example_LLM.prompt +115 -0
- pdd/prompts/increase_tests_LLM.prompt +1 -5
- pdd/prompts/insert_includes_LLM.prompt +316 -186
- pdd/prompts/prompt_code_diff_LLM.prompt +119 -0
- pdd/prompts/prompt_diff_LLM.prompt +82 -0
- pdd/prompts/trace_LLM.prompt +25 -22
- pdd/prompts/unfinished_prompt_LLM.prompt +85 -1
- pdd/prompts/update_prompt_LLM.prompt +22 -1
- pdd/pytest_output.py +127 -12
- pdd/remote_session.py +876 -0
- pdd/render_mermaid.py +236 -0
- pdd/server/__init__.py +52 -0
- pdd/server/app.py +335 -0
- pdd/server/click_executor.py +587 -0
- pdd/server/executor.py +338 -0
- pdd/server/jobs.py +661 -0
- pdd/server/models.py +241 -0
- pdd/server/routes/__init__.py +31 -0
- pdd/server/routes/architecture.py +451 -0
- pdd/server/routes/auth.py +364 -0
- pdd/server/routes/commands.py +929 -0
- pdd/server/routes/config.py +42 -0
- pdd/server/routes/files.py +603 -0
- pdd/server/routes/prompts.py +1322 -0
- pdd/server/routes/websocket.py +473 -0
- pdd/server/security.py +243 -0
- pdd/server/terminal_spawner.py +209 -0
- pdd/server/token_counter.py +222 -0
- pdd/setup_tool.py +648 -0
- pdd/simple_math.py +2 -0
- pdd/split_main.py +3 -2
- pdd/summarize_directory.py +237 -195
- pdd/sync_animation.py +8 -4
- pdd/sync_determine_operation.py +839 -112
- pdd/sync_main.py +351 -57
- pdd/sync_orchestration.py +1400 -756
- pdd/sync_tui.py +848 -0
- pdd/template_expander.py +161 -0
- pdd/template_registry.py +264 -0
- pdd/templates/architecture/architecture_json.prompt +237 -0
- pdd/templates/generic/generate_prompt.prompt +174 -0
- pdd/trace.py +168 -12
- pdd/trace_main.py +4 -3
- pdd/track_cost.py +140 -63
- pdd/unfinished_prompt.py +51 -4
- pdd/update_main.py +567 -67
- pdd/update_model_costs.py +2 -2
- pdd/update_prompt.py +19 -4
- {pdd_cli-0.0.45.dist-info → pdd_cli-0.0.118.dist-info}/METADATA +29 -11
- pdd_cli-0.0.118.dist-info/RECORD +227 -0
- {pdd_cli-0.0.45.dist-info → pdd_cli-0.0.118.dist-info}/licenses/LICENSE +1 -1
- pdd_cli-0.0.45.dist-info/RECORD +0 -116
- {pdd_cli-0.0.45.dist-info → pdd_cli-0.0.118.dist-info}/WHEEL +0 -0
- {pdd_cli-0.0.45.dist-info → pdd_cli-0.0.118.dist-info}/entry_points.txt +0 -0
- {pdd_cli-0.0.45.dist-info → pdd_cli-0.0.118.dist-info}/top_level.txt +0 -0
|
@@ -4,7 +4,28 @@
|
|
|
4
4
|
|
|
5
5
|
% The language of the example should be in: <language_for_example>{language}</language_for_example>
|
|
6
6
|
|
|
7
|
+
% File path information:
|
|
8
|
+
- The code module file is located at: <code_module_file_path>{source_file_path}</code_module_file_path>
|
|
9
|
+
- The example file will be saved at: <example_file_path>{example_file_path}</example_file_path>
|
|
10
|
+
- The module name (without extension) is: <module_name>{module_name}</module_name>
|
|
11
|
+
|
|
12
|
+
% IMPORT INSTRUCTIONS: Use the appropriate import mechanism for the target language
|
|
13
|
+
- CRITICAL: Use the exact module_name provided in the file path information above - DO NOT use generic names like "greetings" or "module"
|
|
14
|
+
- Avoid package-style imports unless the file is actually in a package structure
|
|
15
|
+
- Import the specific functions/classes that are defined in the code module
|
|
16
|
+
- CRITICAL: Do not assume module names - use the exact module_name provided
|
|
17
|
+
- CRITICAL: Import the appropriate functions/classes from the module (e.g., if module_name is "simple_math", import "add", "subtract", etc.)
|
|
18
|
+
- CRITICAL: Never include hardcoded absolute paths like "/Users/username/project/examples/" in comments or code
|
|
19
|
+
- Use only relative path descriptions in comments (e.g., "relative to project root" or "relative to this script")
|
|
20
|
+
- Make the example portable across different development environments
|
|
21
|
+
- Use dynamic path resolution with os.path.dirname(__file__) and relative path construction
|
|
22
|
+
- In comments, describe file structure using relative terms, not absolute paths
|
|
23
|
+
- CRITICAL: The 'extracted_code' field must preserve all newlines using proper JSON escaping (\\n). The output must be valid JSON where multi-line code is represented with \\n escape sequences for each line break.
|
|
24
|
+
|
|
7
25
|
% Make sure the following happens:
|
|
8
26
|
- Document in detail what the input and output parameters in the doc strings
|
|
9
|
-
- Someone needs to be able to fully understand how to use the module from the example.
|
|
27
|
+
- Someone needs to be able to fully understand how to use the module from the example.
|
|
28
|
+
- Use correct import statements based on the actual file structure
|
|
29
|
+
- The example should be a complete, runnable script that imports from the actual module
|
|
30
|
+
- Include proper file path handling and module discovery if needed
|
|
10
31
|
<include>./context/example.prompt</include>
|
|
@@ -19,4 +19,8 @@
|
|
|
19
19
|
% Output a JSON object with the following keys:
|
|
20
20
|
- 'focus': String containing the focus of the generation.
|
|
21
21
|
- 'explanation': String explanation of why this block_type was the focus of the generation and explain any errors detected in the code, if a code type of block.
|
|
22
|
-
- 'extracted_code': String containing the entire generated and corrected block_type of focus.
|
|
22
|
+
- 'extracted_code': String containing the entire generated and corrected block_type of focus.
|
|
23
|
+
|
|
24
|
+
% CRITICAL: The 'extracted_code' field MUST preserve all newlines and indentation from the original code. In JSON, newlines must be represented as the escape sequence \n (backslash-n). Each line break in the code must appear as \n in the JSON string value. Do NOT concatenate lines together or remove line breaks. The extracted code must be properly formatted and runnable.
|
|
25
|
+
|
|
26
|
+
% IMPORTANT: Output ONLY the JSON object. Do not add any trailing whitespace or newlines after the closing brace.
|
|
@@ -20,4 +20,10 @@
|
|
|
20
20
|
- 'update_program': Boolean indicating whether the program needs to be updated.
|
|
21
21
|
- 'update_code': Boolean indicating whether the code module needs to be updated.
|
|
22
22
|
- 'fixed_program': The entire updated program code or empty String if no update is needed.
|
|
23
|
-
- 'fixed_code': The entire updated code module or empty String if no update is needed.
|
|
23
|
+
- 'fixed_code': The entire updated code module or empty String if no update is needed.
|
|
24
|
+
|
|
25
|
+
% IMPORTANT JSON formatting rules for code strings:
|
|
26
|
+
- Use standard JSON escaping for newlines: a single backslash-n (\n) represents an actual newline
|
|
27
|
+
- Do NOT double-escape newlines. Use \n not \\n for line breaks in code
|
|
28
|
+
- String literals in code that need to print newlines should use \n (which appears as \\n in JSON)
|
|
29
|
+
- Example: for code with two lines "def foo():\n pass", the JSON should be: "def foo():\n pass"
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
% You are an expert Software Engineer. Your goal is to extract the updated prompt from the LLM output.
|
|
1
|
+
% You are an expert Software Engineer. Your goal is to extract the updated prompt from the LLM output in JSON format.
|
|
2
2
|
|
|
3
3
|
% Here is the generated llm_output: <llm_output>{llm_output}</llm_output>
|
|
4
4
|
|
|
5
|
-
% The LLM output contains the modified prompt that will generate the modified code, possibly with some additional commentary or explanation.
|
|
6
|
-
% Your task is to identify and extract ONLY the modified prompt itself, without adding any JSON structure or additional formatting.
|
|
5
|
+
% The LLM output contains the modified prompt that will generate the modified code, possibly with some additional commentary or explanation. Your task is to identify and extract ONLY the modified prompt itself, without adding any additional formatting.
|
|
7
6
|
|
|
8
7
|
% Ensure you:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
1. Remove any "# Modified Prompt" headers or similar text that isn't part of the actual prompt
|
|
9
|
+
2. Preserve all markdown, code blocks, and formatting within the actual prompt
|
|
10
|
+
3. Don't add any explanatory text, JSON wrappers, or your own commentary
|
|
11
|
+
4. Return only the text that constitutes the actual prompt
|
|
13
12
|
|
|
14
|
-
% The "modified_prompt" should be the complete, standalone prompt that could be used directly to generate the modified code.
|
|
13
|
+
% The "modified_prompt" JSON key should be the complete, standalone prompt that could be used directly to generate the modified code.
|
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
% You are an
|
|
2
|
-
|
|
3
|
-
%
|
|
4
|
-
|
|
5
|
-
%
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
% Output
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
% You are an extremely literal parser. The LLM output below follows this structure:
|
|
2
|
+
% <analysis> ... </analysis>
|
|
3
|
+
% <verbatim_prompt_line>
|
|
4
|
+
% <<EXACT SUBSTRING FROM PROMPT_FILE>>
|
|
5
|
+
% </verbatim_prompt_line>
|
|
6
|
+
%
|
|
7
|
+
% Task
|
|
8
|
+
% • Extract the text between <verbatim_prompt_line> and </verbatim_prompt_line> (if present).
|
|
9
|
+
% • Output ONLY JSON with the keys:
|
|
10
|
+
% - "prompt_line": the exact substring between the tags. Do not alter whitespace or characters except for JSON escaping.
|
|
11
|
+
% - "explanation": short confirmation (<=120 characters) that the substring was copied verbatim, or describe why extraction failed.
|
|
12
|
+
% • If the tags are missing or empty, set "prompt_line" to "" and explain the issue.
|
|
13
|
+
% • Do not wrap the JSON in Markdown. No commentary, no additional keys.
|
|
14
|
+
%
|
|
15
|
+
<llm_output>
|
|
16
|
+
{llm_output}
|
|
17
|
+
</llm_output>
|
|
@@ -21,6 +21,12 @@
|
|
|
21
21
|
Step 4. Identify any potential edge cases, error handling issues, or performance concerns that could cause problems in the future.
|
|
22
22
|
Step 5. Check the code for potential bugs that haven't manifested yet.
|
|
23
23
|
Step 6. If any issues are found, explain in detail the root cause of each issue and how it could impact the program's functioning.
|
|
24
|
+
Step 6.5. When analyzing errors involving mocked dependencies:
|
|
25
|
+
- Identify if 'program' uses MagicMock, unittest.mock, or similar mocking
|
|
26
|
+
- Trace the mock configuration to verify it matches expected real API behavior
|
|
27
|
+
- For AttributeError on mock objects: check if mock.return_value or mock.__getitem__.return_value has correct type
|
|
28
|
+
- Flag errors as "Mock Configuration Error" when the mock setup doesn't match real API return types
|
|
29
|
+
- Flag errors as "Production Code Error" only when the API usage is clearly incorrect
|
|
24
30
|
Step 7. Carefully distinguish between:
|
|
25
31
|
a. Incompatibilities (functions called by program but missing from code_module) - these are critical issues
|
|
26
32
|
b. Prompt adherence issues (code doesn't match prompt requirements) - these are important but secondary to compatibility
|
|
@@ -2,11 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
% IMPORTANT: The crash command should fix whatever needs to be fixed to make the program run successfully:
|
|
4
4
|
- If the code module has bugs, fix the code module
|
|
5
|
-
- If the calling program has bugs, fix the calling program
|
|
5
|
+
- If the calling program has bugs, fix the calling program
|
|
6
6
|
- If both have issues that contribute to the crash, fix BOTH
|
|
7
7
|
- The goal is to ensure the program runs without errors after all fixes are applied
|
|
8
|
+
- If you are not able to fix the calling program, or if you cannot access it, you shouldn't guess at fixes to the calling program. Do not add the functionality of the calling program to the code_module.
|
|
9
|
+
- You must ensure that the code_module strictly adheres to the prompt requirements
|
|
8
10
|
|
|
9
|
-
%
|
|
11
|
+
% The program file is located at: {program_path}
|
|
12
|
+
% The code module is located at: {code_path}
|
|
13
|
+
|
|
14
|
+
% IMPORTANT for path-related errors: When fixing path calculations (e.g., os.path.dirname,
|
|
15
|
+
% sys.path manipulation), consider the file's actual location relative to the project root.
|
|
16
|
+
% For example, if the program is at "context/backend/example.py", it needs to traverse UP
|
|
17
|
+
% two directories to reach the project root, not one.
|
|
18
|
+
|
|
19
|
+
% Here is the calling program that is running the code_module that crashed and/or has errors: <program>{program}</program>
|
|
10
20
|
|
|
11
21
|
% Here is the prompt that generated the code_module below: <prompt>{prompt}</prompt>
|
|
12
22
|
|
|
@@ -10,6 +10,14 @@
|
|
|
10
10
|
|
|
11
11
|
% If the verfication program fails to run, the code_under_test and unit_test are unchanged from the previous iteration.
|
|
12
12
|
|
|
13
|
+
% IMPORTANT: The original prompt is the authoritative specification for what the code should do.
|
|
14
|
+
% When analyzing errors:
|
|
15
|
+
% - If the code doesn't match the prompt specification, fix the CODE
|
|
16
|
+
% - If the unit_test expects behavior not specified in the prompt, fix the TEST
|
|
17
|
+
% - Never add functionality to the code that isn't specified in the prompt
|
|
18
|
+
% - Tests should verify prompt-specified behavior, not arbitrary expectations
|
|
19
|
+
|
|
20
|
+
|
|
13
21
|
|
|
14
22
|
<instructions>
|
|
15
23
|
% Follow these steps to solve these errors:
|
|
@@ -20,4 +28,5 @@
|
|
|
20
28
|
Step 5. Explain in detail step by step how to solve each of the errors and warnings. For each error and warning, there should be several paragraphs description of the solution steps. Sometimes logging or print statements can help debug the code in subsequent iterations. It is important to make sure the tests are still sufficiently comprehensive to catch potential errors.
|
|
21
29
|
Step 6. Review the above steps and correct for any errors and warnings in the code under test or unit test.
|
|
22
30
|
Step 7. For the code that need changes, write the corrected code_under_test and/or corrected unit_test in its/their entirety.
|
|
31
|
+
Step 8. CRITICAL: You MUST preserve ALL existing test functions from the original unit_test. Only modify the tests that are failing. Do not remove, skip, or omit any test functions that were present in the original unit_test, even if they seem unrelated to the current errors. The output must include every single test function from the input.
|
|
23
32
|
</instructions>
|
|
@@ -21,6 +21,28 @@
|
|
|
21
21
|
5. Prefer making additive changes (adding new functions, improving existing ones) rather than removing functionality, even if that means going beyond the minimal requirements of the prompt.
|
|
22
22
|
6. If your previous fixes resulted in verification failures related to missing functions, ensure those functions are included in your solution.
|
|
23
23
|
|
|
24
|
+
% MOCK VS PRODUCTION CODE GUIDANCE:
|
|
25
|
+
1. IDENTIFY THE TEST FILE: The 'program' file may be a TEST FILE that uses mocks (MagicMock, unittest.mock, patch) to simulate external dependencies.
|
|
26
|
+
- Look for imports: `from unittest.mock import MagicMock, patch`
|
|
27
|
+
- Look for mock setup patterns: `mock_obj.return_value`, `mock_obj.__getitem__.return_value`
|
|
28
|
+
|
|
29
|
+
2. WHEN ERRORS OCCUR IN MOCK INTERACTIONS:
|
|
30
|
+
- FIRST check if the mock setup is incorrect (wrong return_value structure, missing __getitem__ configuration)
|
|
31
|
+
- Mock return types must match the REAL API return types exactly
|
|
32
|
+
- Common mock bugs:
|
|
33
|
+
* `__getitem__.return_value = [item]` when it should be `= item` (for APIs where indexing returns single item)
|
|
34
|
+
* Missing chained mock configuration (e.g., `mock.method().other_method()`)
|
|
35
|
+
|
|
36
|
+
3. PRESERVE PRODUCTION CODE API USAGE:
|
|
37
|
+
- The 'code_module' implements PRODUCTION code that calls real APIs
|
|
38
|
+
- Assume production code uses CORRECT API patterns unless you have documentation proving otherwise
|
|
39
|
+
- Do NOT change production code indexing patterns (like `[0][0]`) without external API documentation
|
|
40
|
+
|
|
41
|
+
4. DIAGNOSIS PRIORITY for "AttributeError" or type mismatch:
|
|
42
|
+
a. First: Check mock.return_value / mock.__getitem__.return_value structure
|
|
43
|
+
b. Second: Check if mock chaining matches expected API call pattern
|
|
44
|
+
c. Third: Only then consider if production code has wrong API usage
|
|
45
|
+
|
|
24
46
|
% Follow these steps to fix the program or code_module:
|
|
25
47
|
Step 1. Analyze and understand each identified issue in the context of the code_module and program.
|
|
26
48
|
Step 2. Analyze how the program uses the code_module to determine all functions that must be preserved.
|
|
@@ -4,7 +4,25 @@
|
|
|
4
4
|
|
|
5
5
|
% Here is the code under test: <code_under_test>{code}</code_under_test>
|
|
6
6
|
|
|
7
|
+
% File path information:
|
|
8
|
+
- The code under test module file is located at: <code_under_test_file_path>{source_file_path}</code_under_test_file_path>
|
|
9
|
+
- The example file will be saved at: <test_file_path>{test_file_path}</test_file_path>
|
|
10
|
+
- The module name (without extension) is: <module_name>{module_name}</module_name>
|
|
11
|
+
|
|
12
|
+
% EXISTING TESTS (if provided - your output will be APPENDED to this file):
|
|
13
|
+
<existing_tests>{existing_tests}</existing_tests>
|
|
14
|
+
|
|
15
|
+
% If existing tests are provided above:
|
|
16
|
+
- Generate ONLY NEW test functions (your output will be appended to the existing file)
|
|
17
|
+
- Do NOT include import statements (they already exist in the file)
|
|
18
|
+
- Do NOT duplicate any existing test function names
|
|
19
|
+
- Maintain consistent style with existing tests (fixtures, naming conventions)
|
|
20
|
+
- Focus on testing functionality NOT already covered by existing tests
|
|
21
|
+
|
|
7
22
|
% Follow these rules:
|
|
23
|
+
- CRITICAL: You MUST analyze the actual code provided in code_under_test and generate tests for the EXACT functions defined in that code
|
|
24
|
+
- CRITICAL: Import statements must use the ACTUAL module name from the code file path, not generic names. Include the necessary code/path info to import the code under test.
|
|
25
|
+
- CRITICAL: Test the ACTUAL function names, parameters, and behavior shown in the provided code
|
|
8
26
|
- The module name for the code under test will have the same name as the function name
|
|
9
27
|
- The unit test should be in {language}. If Python, use pytest.
|
|
10
28
|
- Use individual test functions for each case to make it easier to identify which specific cases pass or fail.
|
|
@@ -14,13 +32,29 @@
|
|
|
14
32
|
- Setup and teardown methods should only use public APIs and environment variables, never reset internal module state directly.
|
|
15
33
|
- Design tests to be independent of implementation details that might change when code is regenerated.
|
|
16
34
|
- For test isolation, use fixtures and mocking of external dependencies rather than manipulating internal module state. In general minimize the amount of mocking needed so that the tests are more robust to changes in the code under test and more code is tested.
|
|
17
|
-
|
|
35
|
+
|
|
36
|
+
% TEST ISOLATION PRINCIPLE:
|
|
37
|
+
% CRITICAL: Each test MUST be isolated and not pollute state for other tests.
|
|
38
|
+
- Tests must clean up any state they modify (environment variables, global state, files, mocks)
|
|
39
|
+
- Use the testing framework's built-in isolation mechanisms (fixtures, setup/teardown, context managers)
|
|
40
|
+
- Avoid modifying global or module-level state directly; if unavoidable, always restore original state
|
|
41
|
+
- Prefer function-scoped test resources over shared/module-scoped ones to ensure isolation
|
|
42
|
+
|
|
43
|
+
<include>context/test.prompt</include>
|
|
44
|
+
<include>context/pytest_isolation_example.py</include>
|
|
18
45
|
|
|
19
46
|
<instructions>
|
|
20
|
-
1. Carefully
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
47
|
+
1. FIRST: Carefully analyze the ACTUAL code provided in code_under_test:
|
|
48
|
+
- Identify the EXACT function names defined in the code
|
|
49
|
+
- Identify the EXACT parameters and their types
|
|
50
|
+
- Identify the EXACT return values and behavior
|
|
51
|
+
- Identify any error conditions or edge cases
|
|
52
|
+
2. SECOND: Analyze the prompt that generated the code to understand the intended functionality and edge cases.
|
|
53
|
+
3. THIRD: For each edge case explain whether it is better to do the test using Z3 formal verification or unit tests.
|
|
54
|
+
4. FOURTH: Develop a detailed test plan that will ensure the code under test is correct. This should involve both Z3 formal verification and unit tests.
|
|
55
|
+
5. FIFTH: Write the test file with:
|
|
56
|
+
a) The first part of the test file should be the detailed test plan from step 4 above in comments.
|
|
57
|
+
b) Import statements using the ACTUAL module name from the code file path (e.g., if code is in "my_function.py", use "from my_function import function_name")
|
|
58
|
+
c) Tests for the ACTUAL function names and behavior shown in the provided code
|
|
59
|
+
d) Z3 formal verification tests that are runnable as unit tests.
|
|
26
60
|
</instructions>
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
% You are an expert Software Test Engineer. Your goal is to generate tests based on the intended behavior described in a prompt and demonstrated in an example file.
|
|
2
|
+
|
|
3
|
+
% Here a description of what the code is supposed to do and was the prompt that generated the code: <prompt_that_generated_code>{prompt_that_generated_code}</prompt_that_generated_code>
|
|
4
|
+
|
|
5
|
+
% Here is an example showing how the module should be used: <example_usage>{example}</example_usage>
|
|
6
|
+
|
|
7
|
+
% File path information:
|
|
8
|
+
- The example file is located at: <example_file_path>{source_file_path}</example_file_path>
|
|
9
|
+
- The test file will be saved at: <test_file_path>{test_file_path}</test_file_path>
|
|
10
|
+
- The module name (without extension) is: <module_name>{module_name}</module_name>
|
|
11
|
+
|
|
12
|
+
% EXISTING TESTS (if provided - your output will be APPENDED to this file):
|
|
13
|
+
<existing_tests>{existing_tests}</existing_tests>
|
|
14
|
+
|
|
15
|
+
% If existing tests are provided above:
|
|
16
|
+
- Generate ONLY NEW test functions (your output will be appended to the existing file)
|
|
17
|
+
- Do NOT include import statements (they already exist in the file)
|
|
18
|
+
- Do NOT duplicate any existing test function names
|
|
19
|
+
- Maintain consistent style with existing tests (fixtures, naming conventions)
|
|
20
|
+
- Focus on testing functionality NOT already covered by existing tests
|
|
21
|
+
|
|
22
|
+
% Follow these rules:
|
|
23
|
+
- CRITICAL: Analyze the EXAMPLE to understand the API (function names, parameters, return values)
|
|
24
|
+
- CRITICAL: Import statements must match the module structure shown in the example
|
|
25
|
+
- CRITICAL: Test the intended function names and behavior based on the prompt
|
|
26
|
+
- The module name for the code under test will have the same name as the function name
|
|
27
|
+
- The unit test should be in {language}. If Python, use pytest.
|
|
28
|
+
- Use individual test functions for each case to make it easier to identify which specific cases pass or fail.
|
|
29
|
+
- Use the description of the functionality in the prompt to generate tests with useful tests with good code coverage.
|
|
30
|
+
- Focus on testing the INTENDED FUNCTIONALITY, not implementation details.
|
|
31
|
+
- NEVER access internal implementation details (variables/functions starting with underscore) in your tests.
|
|
32
|
+
- Setup and teardown methods should only use public APIs and environment variables, never reset internal module state directly.
|
|
33
|
+
- Design tests to be independent of implementation details.
|
|
34
|
+
- For test isolation, use fixtures and mocking of external dependencies rather than manipulating internal module state. In general minimize the amount of mocking needed so that the tests are more robust to changes in the code under test and more code is tested.
|
|
35
|
+
- Know that the generated test will be in a different directory (`tests`) than the module (in directory `pdd`) it is calling and will need an absolute reference. The module file name will be same as the function name.
|
|
36
|
+
- Created files should be in the `output` directory.
|
|
37
|
+
- Data files (language_format.csv and llm_model.csv) already exist in the PDD_PATH/`data` directory. Do not write over them. It already contains data for popular languages and LLM models and can be used for tests.
|
|
38
|
+
- The PDD_PATH environment variable is already set.
|
|
39
|
+
|
|
40
|
+
% PYTEST TEST ISOLATION AND ANTI-POLLUTION RULES:
|
|
41
|
+
% CRITICAL: Generated tests MUST be isolated and not pollute state for other tests. Follow these rules strictly:
|
|
42
|
+
|
|
43
|
+
% 1. ENVIRONMENT VARIABLES:
|
|
44
|
+
- ALWAYS use monkeypatch.setenv() or monkeypatch.delenv() instead of os.environ["VAR"] = "value"
|
|
45
|
+
- NEVER use direct os.environ manipulation - it persists beyond the test and pollutes other tests
|
|
46
|
+
- BAD: os.environ["API_KEY"] = "test_key" # POLLUTION: persists after test ends
|
|
47
|
+
- GOOD: monkeypatch.setenv("API_KEY", "test_key") # Auto-cleaned by pytest
|
|
48
|
+
|
|
49
|
+
% 2. MOCKING EXTERNAL DEPENDENCIES:
|
|
50
|
+
- Use context managers or monkeypatch for mocks - they auto-cleanup after the test
|
|
51
|
+
- Prefer monkeypatch.setattr() over unittest.mock.patch() decorators at module level
|
|
52
|
+
- BAD: @patch('module.func') at module/class level # Can leak if exception occurs
|
|
53
|
+
- GOOD: monkeypatch.setattr('module.func', mock_func) # Always cleaned up
|
|
54
|
+
- GOOD: with patch('module.func') as mock: # Context manager ensures cleanup
|
|
55
|
+
|
|
56
|
+
% 3. FIXTURE CLEANUP WITH YIELD:
|
|
57
|
+
- Use yield-based fixtures with cleanup code after yield for any resources
|
|
58
|
+
- Prefer function-scoped fixtures over module or session scope to ensure isolation
|
|
59
|
+
- BAD: @pytest.fixture(scope="module") without cleanup # State leaks between tests
|
|
60
|
+
- GOOD: @pytest.fixture with yield and cleanup after yield # Always cleans up
|
|
61
|
+
- Example of proper fixture:
|
|
62
|
+
@pytest.fixture
|
|
63
|
+
def temp_resource():
|
|
64
|
+
resource = setup_resource()
|
|
65
|
+
yield resource
|
|
66
|
+
resource.cleanup() # Always runs after test, even on failure
|
|
67
|
+
|
|
68
|
+
% 4. SYS.MODULES MANIPULATION:
|
|
69
|
+
- AVOID manipulating sys.modules directly whenever possible
|
|
70
|
+
- If unavoidable, ALWAYS save and restore in try/finally or fixture with yield
|
|
71
|
+
- BAD: sys.modules["module"] = mock_module # Pollutes all subsequent tests
|
|
72
|
+
- GOOD: Use a fixture that saves, mocks, and restores:
|
|
73
|
+
@pytest.fixture
|
|
74
|
+
def mock_module():
|
|
75
|
+
saved = sys.modules.get("module")
|
|
76
|
+
sys.modules["module"] = MagicMock()
|
|
77
|
+
yield
|
|
78
|
+
if saved is not None:
|
|
79
|
+
sys.modules["module"] = saved
|
|
80
|
+
elif "module" in sys.modules:
|
|
81
|
+
del sys.modules["module"]
|
|
82
|
+
|
|
83
|
+
% 5. FILE SYSTEM OPERATIONS:
|
|
84
|
+
- ALWAYS use the tmp_path fixture for creating temporary files and directories
|
|
85
|
+
- NEVER create files in the working directory or fixed paths
|
|
86
|
+
- BAD: with open("test_output.txt", "w") as f: ... # Leaves file behind
|
|
87
|
+
- GOOD: def test_file(tmp_path): (tmp_path / "test_output.txt").write_text(...)
|
|
88
|
+
|
|
89
|
+
% 6. GLOBAL/MODULE STATE:
|
|
90
|
+
- Never modify global variables or module-level state directly in tests
|
|
91
|
+
- Use monkeypatch.setattr() for any module-level variables that need changing
|
|
92
|
+
- Reset any singleton instances using fixtures with proper teardown
|
|
93
|
+
|
|
94
|
+
% SUMMARY OF GOOD PATTERNS:
|
|
95
|
+
- Use tmp_path fixture for file operations
|
|
96
|
+
- Use monkeypatch fixture for environment variables and attributes
|
|
97
|
+
- Use pytest.raises() as context manager for exception testing
|
|
98
|
+
- Prefer function-scoped fixtures over module or session scope
|
|
99
|
+
- Use yield in fixtures to ensure cleanup runs even on test failure
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
<instructions>
|
|
103
|
+
1. FIRST: Carefully analyze the EXAMPLE to understand:
|
|
104
|
+
- How to import the module (exact import statements)
|
|
105
|
+
- What functions/classes are exposed
|
|
106
|
+
- How they are called (parameters, return values)
|
|
107
|
+
2. SECOND: Analyze the prompt that describes the intended functionality and edge cases.
|
|
108
|
+
3. THIRD: For each edge case explain whether it is better to do the test using Z3 formal verification or unit tests.
|
|
109
|
+
4. FOURTH: Develop a detailed test plan that will ensure the intended functionality is correct. This should involve both Z3 formal verification and unit tests.
|
|
110
|
+
5. FIFTH: Write the test file with:
|
|
111
|
+
a) The first part of the test file should be the detailed test plan from step 4 above in comments.
|
|
112
|
+
b) Import statements matching the module structure from the example
|
|
113
|
+
c) Tests for the intended function names and behavior from the prompt
|
|
114
|
+
d) Z3 formal verification tests that are runnable as unit tests.
|
|
115
|
+
</instructions>
|
|
@@ -12,8 +12,4 @@ Here is the coverage report: ```{coverage_report}```
|
|
|
12
12
|
- The module name for the code under test will have the same name as the function name
|
|
13
13
|
- The unit test should be in {language}. If Python, use pytest.
|
|
14
14
|
- Use individual test functions for each case to make it easier to identify which specific cases pass or fail.
|
|
15
|
-
- Use the description of the functionality in the prompt to generate tests with useful tests with good code coverage.
|
|
16
|
-
- Know that the generated test will be in a different directory (`tests`) than the module (in directory `pdd`) it is calling and will need an absolute reference. The module file name will be same as the function name.
|
|
17
|
-
- Created files should be in the `output` directory.
|
|
18
|
-
- Data files (language_format.csv and llm_model.csv) already exist in the PDD_PATH/`data` directory. Do not write over them. It already contains data for popular languages and LLM models and can be used for tests.
|
|
19
|
-
- The PDD_PATH environment variable is already set.
|
|
15
|
+
- Use the description of the functionality in the prompt to generate tests with useful tests with good code coverage.
|