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.
Files changed (195) hide show
  1. pdd/__init__.py +40 -8
  2. pdd/agentic_bug.py +323 -0
  3. pdd/agentic_bug_orchestrator.py +497 -0
  4. pdd/agentic_change.py +231 -0
  5. pdd/agentic_change_orchestrator.py +526 -0
  6. pdd/agentic_common.py +598 -0
  7. pdd/agentic_crash.py +534 -0
  8. pdd/agentic_e2e_fix.py +319 -0
  9. pdd/agentic_e2e_fix_orchestrator.py +426 -0
  10. pdd/agentic_fix.py +1294 -0
  11. pdd/agentic_langtest.py +162 -0
  12. pdd/agentic_update.py +387 -0
  13. pdd/agentic_verify.py +183 -0
  14. pdd/architecture_sync.py +565 -0
  15. pdd/auth_service.py +210 -0
  16. pdd/auto_deps_main.py +71 -51
  17. pdd/auto_include.py +245 -5
  18. pdd/auto_update.py +125 -47
  19. pdd/bug_main.py +196 -23
  20. pdd/bug_to_unit_test.py +2 -0
  21. pdd/change_main.py +11 -4
  22. pdd/cli.py +22 -1181
  23. pdd/cmd_test_main.py +350 -150
  24. pdd/code_generator.py +60 -18
  25. pdd/code_generator_main.py +790 -57
  26. pdd/commands/__init__.py +48 -0
  27. pdd/commands/analysis.py +306 -0
  28. pdd/commands/auth.py +309 -0
  29. pdd/commands/connect.py +290 -0
  30. pdd/commands/fix.py +163 -0
  31. pdd/commands/generate.py +257 -0
  32. pdd/commands/maintenance.py +175 -0
  33. pdd/commands/misc.py +87 -0
  34. pdd/commands/modify.py +256 -0
  35. pdd/commands/report.py +144 -0
  36. pdd/commands/sessions.py +284 -0
  37. pdd/commands/templates.py +215 -0
  38. pdd/commands/utility.py +110 -0
  39. pdd/config_resolution.py +58 -0
  40. pdd/conflicts_main.py +8 -3
  41. pdd/construct_paths.py +589 -111
  42. pdd/context_generator.py +10 -2
  43. pdd/context_generator_main.py +175 -76
  44. pdd/continue_generation.py +53 -10
  45. pdd/core/__init__.py +33 -0
  46. pdd/core/cli.py +527 -0
  47. pdd/core/cloud.py +237 -0
  48. pdd/core/dump.py +554 -0
  49. pdd/core/errors.py +67 -0
  50. pdd/core/remote_session.py +61 -0
  51. pdd/core/utils.py +90 -0
  52. pdd/crash_main.py +262 -33
  53. pdd/data/language_format.csv +71 -63
  54. pdd/data/llm_model.csv +20 -18
  55. pdd/detect_change_main.py +5 -4
  56. pdd/docs/prompting_guide.md +864 -0
  57. pdd/docs/whitepaper_with_benchmarks/data_and_functions/benchmark_analysis.py +495 -0
  58. pdd/docs/whitepaper_with_benchmarks/data_and_functions/creation_compare.py +528 -0
  59. pdd/fix_code_loop.py +523 -95
  60. pdd/fix_code_module_errors.py +6 -2
  61. pdd/fix_error_loop.py +491 -92
  62. pdd/fix_errors_from_unit_tests.py +4 -3
  63. pdd/fix_main.py +278 -21
  64. pdd/fix_verification_errors.py +12 -100
  65. pdd/fix_verification_errors_loop.py +529 -286
  66. pdd/fix_verification_main.py +294 -89
  67. pdd/frontend/dist/assets/index-B5DZHykP.css +1 -0
  68. pdd/frontend/dist/assets/index-DQ3wkeQ2.js +449 -0
  69. pdd/frontend/dist/index.html +376 -0
  70. pdd/frontend/dist/logo.svg +33 -0
  71. pdd/generate_output_paths.py +139 -15
  72. pdd/generate_test.py +218 -146
  73. pdd/get_comment.py +19 -44
  74. pdd/get_extension.py +8 -9
  75. pdd/get_jwt_token.py +318 -22
  76. pdd/get_language.py +8 -7
  77. pdd/get_run_command.py +75 -0
  78. pdd/get_test_command.py +68 -0
  79. pdd/git_update.py +70 -19
  80. pdd/incremental_code_generator.py +2 -2
  81. pdd/insert_includes.py +13 -4
  82. pdd/llm_invoke.py +1711 -181
  83. pdd/load_prompt_template.py +19 -12
  84. pdd/path_resolution.py +140 -0
  85. pdd/pdd_completion.fish +25 -2
  86. pdd/pdd_completion.sh +30 -4
  87. pdd/pdd_completion.zsh +79 -4
  88. pdd/postprocess.py +14 -4
  89. pdd/preprocess.py +293 -24
  90. pdd/preprocess_main.py +41 -6
  91. pdd/prompts/agentic_bug_step10_pr_LLM.prompt +182 -0
  92. pdd/prompts/agentic_bug_step1_duplicate_LLM.prompt +73 -0
  93. pdd/prompts/agentic_bug_step2_docs_LLM.prompt +129 -0
  94. pdd/prompts/agentic_bug_step3_triage_LLM.prompt +95 -0
  95. pdd/prompts/agentic_bug_step4_reproduce_LLM.prompt +97 -0
  96. pdd/prompts/agentic_bug_step5_root_cause_LLM.prompt +123 -0
  97. pdd/prompts/agentic_bug_step6_test_plan_LLM.prompt +107 -0
  98. pdd/prompts/agentic_bug_step7_generate_LLM.prompt +172 -0
  99. pdd/prompts/agentic_bug_step8_verify_LLM.prompt +119 -0
  100. pdd/prompts/agentic_bug_step9_e2e_test_LLM.prompt +289 -0
  101. pdd/prompts/agentic_change_step10_identify_issues_LLM.prompt +1006 -0
  102. pdd/prompts/agentic_change_step11_fix_issues_LLM.prompt +984 -0
  103. pdd/prompts/agentic_change_step12_create_pr_LLM.prompt +131 -0
  104. pdd/prompts/agentic_change_step1_duplicate_LLM.prompt +73 -0
  105. pdd/prompts/agentic_change_step2_docs_LLM.prompt +101 -0
  106. pdd/prompts/agentic_change_step3_research_LLM.prompt +126 -0
  107. pdd/prompts/agentic_change_step4_clarify_LLM.prompt +164 -0
  108. pdd/prompts/agentic_change_step5_docs_change_LLM.prompt +981 -0
  109. pdd/prompts/agentic_change_step6_devunits_LLM.prompt +1005 -0
  110. pdd/prompts/agentic_change_step7_architecture_LLM.prompt +1044 -0
  111. pdd/prompts/agentic_change_step8_analyze_LLM.prompt +1027 -0
  112. pdd/prompts/agentic_change_step9_implement_LLM.prompt +1077 -0
  113. pdd/prompts/agentic_crash_explore_LLM.prompt +49 -0
  114. pdd/prompts/agentic_e2e_fix_step1_unit_tests_LLM.prompt +90 -0
  115. pdd/prompts/agentic_e2e_fix_step2_e2e_tests_LLM.prompt +91 -0
  116. pdd/prompts/agentic_e2e_fix_step3_root_cause_LLM.prompt +89 -0
  117. pdd/prompts/agentic_e2e_fix_step4_fix_e2e_tests_LLM.prompt +96 -0
  118. pdd/prompts/agentic_e2e_fix_step5_identify_devunits_LLM.prompt +91 -0
  119. pdd/prompts/agentic_e2e_fix_step6_create_unit_tests_LLM.prompt +106 -0
  120. pdd/prompts/agentic_e2e_fix_step7_verify_tests_LLM.prompt +116 -0
  121. pdd/prompts/agentic_e2e_fix_step8_run_pdd_fix_LLM.prompt +120 -0
  122. pdd/prompts/agentic_e2e_fix_step9_verify_all_LLM.prompt +146 -0
  123. pdd/prompts/agentic_fix_explore_LLM.prompt +45 -0
  124. pdd/prompts/agentic_fix_harvest_only_LLM.prompt +48 -0
  125. pdd/prompts/agentic_fix_primary_LLM.prompt +85 -0
  126. pdd/prompts/agentic_update_LLM.prompt +925 -0
  127. pdd/prompts/agentic_verify_explore_LLM.prompt +45 -0
  128. pdd/prompts/auto_include_LLM.prompt +122 -905
  129. pdd/prompts/change_LLM.prompt +3093 -1
  130. pdd/prompts/detect_change_LLM.prompt +686 -27
  131. pdd/prompts/example_generator_LLM.prompt +22 -1
  132. pdd/prompts/extract_code_LLM.prompt +5 -1
  133. pdd/prompts/extract_program_code_fix_LLM.prompt +7 -1
  134. pdd/prompts/extract_prompt_update_LLM.prompt +7 -8
  135. pdd/prompts/extract_promptline_LLM.prompt +17 -11
  136. pdd/prompts/find_verification_errors_LLM.prompt +6 -0
  137. pdd/prompts/fix_code_module_errors_LLM.prompt +12 -2
  138. pdd/prompts/fix_errors_from_unit_tests_LLM.prompt +9 -0
  139. pdd/prompts/fix_verification_errors_LLM.prompt +22 -0
  140. pdd/prompts/generate_test_LLM.prompt +41 -7
  141. pdd/prompts/generate_test_from_example_LLM.prompt +115 -0
  142. pdd/prompts/increase_tests_LLM.prompt +1 -5
  143. pdd/prompts/insert_includes_LLM.prompt +316 -186
  144. pdd/prompts/prompt_code_diff_LLM.prompt +119 -0
  145. pdd/prompts/prompt_diff_LLM.prompt +82 -0
  146. pdd/prompts/trace_LLM.prompt +25 -22
  147. pdd/prompts/unfinished_prompt_LLM.prompt +85 -1
  148. pdd/prompts/update_prompt_LLM.prompt +22 -1
  149. pdd/pytest_output.py +127 -12
  150. pdd/remote_session.py +876 -0
  151. pdd/render_mermaid.py +236 -0
  152. pdd/server/__init__.py +52 -0
  153. pdd/server/app.py +335 -0
  154. pdd/server/click_executor.py +587 -0
  155. pdd/server/executor.py +338 -0
  156. pdd/server/jobs.py +661 -0
  157. pdd/server/models.py +241 -0
  158. pdd/server/routes/__init__.py +31 -0
  159. pdd/server/routes/architecture.py +451 -0
  160. pdd/server/routes/auth.py +364 -0
  161. pdd/server/routes/commands.py +929 -0
  162. pdd/server/routes/config.py +42 -0
  163. pdd/server/routes/files.py +603 -0
  164. pdd/server/routes/prompts.py +1322 -0
  165. pdd/server/routes/websocket.py +473 -0
  166. pdd/server/security.py +243 -0
  167. pdd/server/terminal_spawner.py +209 -0
  168. pdd/server/token_counter.py +222 -0
  169. pdd/setup_tool.py +648 -0
  170. pdd/simple_math.py +2 -0
  171. pdd/split_main.py +3 -2
  172. pdd/summarize_directory.py +237 -195
  173. pdd/sync_animation.py +8 -4
  174. pdd/sync_determine_operation.py +839 -112
  175. pdd/sync_main.py +351 -57
  176. pdd/sync_orchestration.py +1400 -756
  177. pdd/sync_tui.py +848 -0
  178. pdd/template_expander.py +161 -0
  179. pdd/template_registry.py +264 -0
  180. pdd/templates/architecture/architecture_json.prompt +237 -0
  181. pdd/templates/generic/generate_prompt.prompt +174 -0
  182. pdd/trace.py +168 -12
  183. pdd/trace_main.py +4 -3
  184. pdd/track_cost.py +140 -63
  185. pdd/unfinished_prompt.py +51 -4
  186. pdd/update_main.py +567 -67
  187. pdd/update_model_costs.py +2 -2
  188. pdd/update_prompt.py +19 -4
  189. {pdd_cli-0.0.45.dist-info → pdd_cli-0.0.118.dist-info}/METADATA +29 -11
  190. pdd_cli-0.0.118.dist-info/RECORD +227 -0
  191. {pdd_cli-0.0.45.dist-info → pdd_cli-0.0.118.dist-info}/licenses/LICENSE +1 -1
  192. pdd_cli-0.0.45.dist-info/RECORD +0 -116
  193. {pdd_cli-0.0.45.dist-info → pdd_cli-0.0.118.dist-info}/WHEEL +0 -0
  194. {pdd_cli-0.0.45.dist-info → pdd_cli-0.0.118.dist-info}/entry_points.txt +0 -0
  195. {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
- % 1. Remove any "# Modified Prompt" headers or similar text that isn't part of the actual prompt
10
- % 2. Preserve all markdown, code blocks, and formatting within the actual prompt
11
- % 3. Don't add any explanatory text, JSON wrappers, or your own commentary
12
- % 4. Return only the text that constitutes the actual prompt
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 expert Software Engineer. Your goal is to extract the closest matching substring described by the prompt's output to be outputed in JSON format.
2
-
3
- % Here is the llm_output to parse: <llm_output>{llm_output}</llm_output>
4
-
5
- % When extracting the closest matching substring from llm_output, consider and correct the following for the extracted code:
6
- - Should be a substring of prompt_file.
7
- - Should be a a substring that closely matches code_str in content.
8
-
9
- % Output a JSON object with the following keys:
10
- - 'explanation': String explanation of why this prompt_line matches the code_str and explain any errors detected in the code.
11
- - 'prompt_line': String containing the closest matching verbatim substring of the prompt_file that matches code_str in content. This is not the line number.
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
- % Here is the program that is running the code_module that crashed and/or has errors: <program>{program}</program>
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
- <include>./context/test.prompt</include>
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 read the prompt that generated the code under test and determine what might be possible edge cases.
21
- 2. For each edge case explain whether it is better to do the test using Z3 formal verification or unit tests.
22
- 3. Develop a detailed test plan that will ensure the code under test is correct. This should involve both Z3 formal verification and unit tests.
23
- 4. Now write the test file.
24
- a) The first part of the test file should be the detailed test plan from step 3 above in comments.
25
- b) Then write the tests and Z3 formal verification tests that are runnable as unit tests.
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.