pynguin 0.46.0__tar.gz → 0.47.0__tar.gz

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 (750) hide show
  1. {pynguin-0.46.0 → pynguin-0.47.0}/PKG-INFO +4 -6
  2. {pynguin-0.46.0 → pynguin-0.47.0}/README.md +1 -1
  3. {pynguin-0.46.0 → pynguin-0.47.0}/pyproject.toml +28 -7
  4. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/__version__.py +1 -1
  5. pynguin-0.47.0/src/pynguin/analyses/ast_utils.py +171 -0
  6. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/constants.py +33 -1
  7. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/generator.py +71 -10
  8. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/module.py +279 -55
  9. pynguin-0.47.0/src/pynguin/analyses/seeding.py +224 -0
  10. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/syntaxtree.py +37 -30
  11. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/type_inference.py +214 -18
  12. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/typesystem.py +2 -3
  13. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/assertion.py +83 -26
  14. pynguin-0.47.0/src/pynguin/assertion/assertion_to_ast.py +284 -0
  15. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/assertion_trace.py +4 -6
  16. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/assertiongenerator.py +9 -10
  17. pynguin-0.47.0/src/pynguin/assertion/assertiontraceobserver.py +601 -0
  18. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/llmassertiongenerator.py +55 -65
  19. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/configuration.py +177 -19
  20. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/archive.py +5 -3
  21. pynguin-0.47.0/src/pynguin/ga/algorithms/dynamosaalgorithm.py +482 -0
  22. pynguin-0.47.0/src/pynguin/ga/algorithms/lldynamosaalgorithm.py +231 -0
  23. pynguin-0.47.0/src/pynguin/ga/algorithms/llmosalgorithm.py +341 -0
  24. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/randomalgorithm.py +3 -4
  25. pynguin-0.47.0/src/pynguin/ga/checked_coverage.py +143 -0
  26. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/chromosome.py +7 -3
  27. pynguin-0.47.0/src/pynguin/ga/computation_cache.py +261 -0
  28. pynguin-0.47.0/src/pynguin/ga/computations.py +420 -0
  29. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/coveragegoals.py +81 -8
  30. pynguin-0.47.0/src/pynguin/ga/fitness_metrics.py +259 -0
  31. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/generationalgorithmfactory.py +17 -9
  32. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/operators/comparator.py +21 -1
  33. pynguin-0.47.0/src/pynguin/ga/operators/crossover.py +109 -0
  34. pynguin-0.47.0/src/pynguin/ga/operators/mutation.py +254 -0
  35. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/postprocess.py +123 -323
  36. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/stoppingcondition.py +6 -29
  37. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/testcasechromosome.py +32 -122
  38. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/testcasefactory.py +2 -3
  39. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/testsuitechromosome.py +5 -36
  40. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/generator.py +49 -54
  41. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/controlflow.py +11 -11
  42. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/machinery.py +5 -2
  43. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/tracer.py +344 -6
  44. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/transformer.py +353 -125
  45. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/python3_10.py +140 -11
  46. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/python3_11.py +69 -15
  47. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/python3_13.py +9 -6
  48. pynguin-0.47.0/src/pynguin/large_language_model/AGENTS.md +228 -0
  49. pynguin-0.47.0/src/pynguin/large_language_model/cache.py +106 -0
  50. pynguin-0.47.0/src/pynguin/large_language_model/client.py +395 -0
  51. pynguin-0.47.0/src/pynguin/large_language_model/config_schema.py +42 -0
  52. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/llmagent.py +82 -66
  53. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/llmtestcasehandler.py +25 -22
  54. pynguin-0.47.0/src/pynguin/large_language_model/parsing/AGENTS.md +157 -0
  55. pynguin-0.47.0/src/pynguin/large_language_model/parsing/deserializer.py +1241 -0
  56. pynguin-0.47.0/src/pynguin/large_language_model/parsing/helpers.py +25 -0
  57. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/parsing/rewriter.py +26 -189
  58. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/prompts/AGENTS.md +23 -0
  59. pynguin-0.47.0/src/pynguin/large_language_model/prompts/__init__.py +37 -0
  60. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/prompts/assertiongenerationprompt.py +15 -8
  61. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/prompts/base_inference_prompt.py +4 -2
  62. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/prompts/localsearchprompt.py +19 -17
  63. pynguin-0.47.0/src/pynguin/large_language_model/prompts/modulereadabilityrefinementprompt.py +47 -0
  64. pynguin-0.47.0/src/pynguin/large_language_model/prompts/modulerefinementprompt.py +47 -0
  65. pynguin-0.47.0/src/pynguin/large_language_model/prompts/modulesemanticassertionsprompt.py +47 -0
  66. pynguin-0.47.0/src/pynguin/large_language_model/prompts/mutationstrengthenprompt.py +59 -0
  67. pynguin-0.47.0/src/pynguin/large_language_model/prompts/prompt.py +169 -0
  68. pynguin-0.47.0/src/pynguin/large_language_model/prompts/readabilityrefinementprompt.py +50 -0
  69. pynguin-0.47.0/src/pynguin/large_language_model/prompts/repairprompt.py +59 -0
  70. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/assertion_generation.yaml +32 -0
  71. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/defaults.yaml +22 -0
  72. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/generator_generate.yaml +16 -0
  73. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/local_search.yaml +37 -0
  74. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/module_readability_refinement.yaml +51 -0
  75. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/module_refinement_combined.yaml +51 -0
  76. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/module_semantic_assertions.yaml +58 -0
  77. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/mutation_strengthen.yaml +44 -0
  78. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/readability_refinement.yaml +79 -0
  79. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/refinement.yaml +13 -0
  80. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/repair.yaml +50 -0
  81. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/semantic_assertions.yaml +165 -0
  82. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/test_case_generation.yaml +39 -0
  83. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/type_inference.yaml +59 -0
  84. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/type_subtype_inference.yaml +85 -0
  85. pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/uncovered_targets.yaml +35 -0
  86. pynguin-0.47.0/src/pynguin/large_language_model/prompts/semanticassertionsprompt.py +50 -0
  87. pynguin-0.47.0/src/pynguin/large_language_model/prompts/testcasegenerationprompt.py +53 -0
  88. pynguin-0.47.0/src/pynguin/large_language_model/prompts/type_and_subtype_inference_prompt.py +74 -0
  89. pynguin-0.47.0/src/pynguin/large_language_model/prompts/typeinferenceprompt.py +62 -0
  90. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/prompts/uncoveredtargetsprompt.py +26 -11
  91. pynguin-0.47.0/src/pynguin/large_language_model/request.py +57 -0
  92. pynguin-0.47.0/src/pynguin/refinement/AGENTS.md +86 -0
  93. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/coverage_checker.py +11 -8
  94. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/llm_client.py +83 -85
  95. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/llm_judge.py +1 -1
  96. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/mutation_analyzer.py +44 -6
  97. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/pipeline.py +313 -270
  98. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/refiner.py +180 -16
  99. pynguin-0.47.0/src/pynguin/refinement/sut_inspector.py +742 -0
  100. pynguin-0.47.0/src/pynguin/refinement/validator.py +154 -0
  101. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/statementslicingobserver.py +39 -18
  102. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/testcase/AGENTS.md +4 -4
  103. pynguin-0.47.0/src/pynguin/testcase/collection_tracker.py +478 -0
  104. pynguin-0.47.0/src/pynguin/testcase/crash_minimization.py +118 -0
  105. pynguin-0.47.0/src/pynguin/testcase/execution.py +704 -0
  106. pynguin-0.47.0/src/pynguin/testcase/execution_isolation.py +123 -0
  107. pynguin-0.47.0/src/pynguin/testcase/execution_observers.py +688 -0
  108. pynguin-0.47.0/src/pynguin/testcase/execution_result.py +142 -0
  109. pynguin-0.47.0/src/pynguin/testcase/export.py +576 -0
  110. pynguin-0.47.0/src/pynguin/testcase/literalgen.py +1225 -0
  111. pynguin-0.47.0/src/pynguin/testcase/llmlocalsearch.py +244 -0
  112. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/testcase/localsearch.py +71 -69
  113. pynguin-0.47.0/src/pynguin/testcase/localsearchstatement.py +921 -0
  114. pynguin-0.47.0/src/pynguin/testcase/subprocess_executor.py +816 -0
  115. pynguin-0.47.0/src/pynguin/testcase/testcase.py +711 -0
  116. pynguin-0.47.0/src/pynguin/testcase/testfactory.py +2948 -0
  117. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/AGENTS.md +3 -42
  118. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/controlflowdistance.py +68 -2
  119. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/execution_recorder.py +2 -8
  120. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/generic/genericaccessibleobject.py +34 -1
  121. pynguin-0.47.0/src/pynguin/utils/llm.py +31 -0
  122. pynguin-0.47.0/src/pynguin/utils/naming.py +126 -0
  123. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/ml_testfactory_utils.py +28 -7
  124. pynguin-0.47.0/src/pynguin/utils/pynguinml/ndarray_cst.py +165 -0
  125. pynguin-0.47.0/src/pynguin/utils/pynguinml/ndarray_mutation.py +176 -0
  126. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/report.py +4 -4
  127. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/statistics/outputvariablefactory.py +3 -1
  128. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/statistics/runtimevariable.py +24 -6
  129. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/type_utils.py +102 -9
  130. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/typeevalpy_json_schema.py +23 -14
  131. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/typetracing.py +35 -7
  132. pynguin-0.47.0/tests/analyses/test_ast_utils.py +91 -0
  133. {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_constants.py +14 -0
  134. pynguin-0.47.0/tests/analyses/test_initialpopulationseeding.py +307 -0
  135. {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_module.py +173 -15
  136. pynguin-0.47.0/tests/analyses/test_native_libraries.py +325 -0
  137. pynguin-0.47.0/tests/analyses/test_seeding.py +244 -0
  138. pynguin-0.47.0/tests/analyses/test_staticconstantseeding.py +84 -0
  139. {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_string_subtype_inference.py +6 -2
  140. pynguin-0.47.0/tests/analyses/test_subtypes.py +155 -0
  141. {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_syntaxtree.py +5 -8
  142. pynguin-0.47.0/tests/analyses/test_type_inference.py +348 -0
  143. pynguin-0.47.0/tests/assertion/test_assertion.py +174 -0
  144. pynguin-0.47.0/tests/assertion/test_assertion_generation_integration.py +840 -0
  145. pynguin-0.47.0/tests/assertion/test_assertion_to_ast.py +275 -0
  146. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/test_assertion_trace.py +2 -6
  147. pynguin-0.47.0/tests/assertion/test_assertiontraceobserver.py +871 -0
  148. pynguin-0.47.0/tests/assertion/test_llmassertiongenerator.py +223 -0
  149. {pynguin-0.46.0 → pynguin-0.47.0}/tests/conftest.py +111 -179
  150. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/accessibles/accessible.py +16 -0
  151. pynguin-0.47.0/tests/fixtures/cluster/fields.py +39 -0
  152. pynguin-0.47.0/tests/fixtures/cluster/methods.py +54 -0
  153. pynguin-0.47.0/tests/fixtures/cluster/tuple_return.py +41 -0
  154. pynguin-0.47.0/tests/fixtures/examples/abstract_classes.py +141 -0
  155. pynguin-0.47.0/tests/fixtures/examples/no_cover_example.py +17 -0
  156. pynguin-0.47.0/tests/fixtures/examples/pattern_matching.py +41 -0
  157. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/simple.py +24 -0
  158. pynguin-0.47.0/tests/fixtures/instrumentation/unpickling.py +27 -0
  159. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/type_tracing/guess_params.py +4 -0
  160. pynguin-0.47.0/tests/ga/algorithms/test_dynamosaalgorithm.py +393 -0
  161. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_integration_varioussearchalgorithms.py +1 -0
  162. pynguin-0.47.0/tests/ga/algorithms/test_lldynamosaalgorithm.py +328 -0
  163. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_llmosalgorithm.py +88 -5
  164. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_randomalgorithm.py +70 -35
  165. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_computations.py +85 -0
  166. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_computations_cache.py +2 -2
  167. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_computations_fitness_utilities.py +37 -21
  168. pynguin-0.47.0/tests/ga/test_coveragegoals.py +632 -0
  169. pynguin-0.47.0/tests/ga/test_fine_grained_targeting.py +70 -0
  170. pynguin-0.47.0/tests/ga/test_fine_grained_targeting_integration.py +43 -0
  171. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_generationalgorithmfactory.py +30 -0
  172. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_generator.py +108 -1
  173. pynguin-0.47.0/tests/ga/test_postprocess.py +512 -0
  174. pynguin-0.47.0/tests/ga/test_testcasechromosome.py +676 -0
  175. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_testcasefactory.py +6 -1
  176. {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_adapters.py +36 -0
  177. {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_ast_info.py +139 -9
  178. {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_tracer.py +149 -0
  179. pynguin-0.47.0/tests/large_language_model/parsing/test_helpers.py +18 -0
  180. {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/prompts/test_assertiongenerationprompt.py +1 -1
  181. pynguin-0.47.0/tests/large_language_model/prompts/test_module_prompts.py +62 -0
  182. pynguin-0.47.0/tests/large_language_model/prompts/test_mutationstrengthenprompt.py +42 -0
  183. pynguin-0.47.0/tests/large_language_model/prompts/test_readabilityrefinementprompt.py +33 -0
  184. pynguin-0.47.0/tests/large_language_model/prompts/test_repairprompt.py +34 -0
  185. pynguin-0.47.0/tests/large_language_model/prompts/test_semanticassertionsprompt.py +33 -0
  186. pynguin-0.47.0/tests/large_language_model/prompts/test_testcasegenerationprompt.py +92 -0
  187. {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/prompts/test_uncovered_targets_prompt.py +21 -2
  188. pynguin-0.47.0/tests/large_language_model/test_cache.py +113 -0
  189. pynguin-0.47.0/tests/large_language_model/test_characterization.py +206 -0
  190. pynguin-0.47.0/tests/large_language_model/test_client_thinking.py +94 -0
  191. pynguin-0.47.0/tests/large_language_model/test_extract_python_code.py +45 -0
  192. pynguin-0.47.0/tests/large_language_model/test_llm_deserializer.py +608 -0
  193. {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/test_llmagent.py +2 -2
  194. {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/test_llmagent_extended.py +52 -23
  195. pynguin-0.47.0/tests/large_language_model/test_llmtestcasehandler.py +130 -0
  196. pynguin-0.47.0/tests/large_language_model/test_request_budget.py +151 -0
  197. {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/test_rewriter.py +15 -45
  198. pynguin-0.47.0/tests/large_language_model/test_temperature_fallback.py +124 -0
  199. {pynguin-0.46.0 → pynguin-0.47.0}/tests/master_worker/test_client.py +6 -0
  200. pynguin-0.47.0/tests/quick_eval/test_args.py +100 -0
  201. pynguin-0.47.0/tests/quick_eval/test_suite_scope.py +40 -0
  202. {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_coverage_checker.py +1 -1
  203. {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_llm_client.py +82 -22
  204. {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_llm_judge.py +5 -3
  205. pynguin-0.47.0/tests/refinement/test_module_refinement.py +250 -0
  206. {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_mutation_analyzer.py +39 -0
  207. {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_pipeline.py +74 -0
  208. {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_refiner.py +8 -0
  209. pynguin-0.47.0/tests/refinement/test_sut_inspector.py +457 -0
  210. pynguin-0.47.0/tests/refinement/test_validator.py +167 -0
  211. pynguin-0.47.0/tests/slicer/test_assertionslicer.py +234 -0
  212. pynguin-0.47.0/tests/slicer/test_statementslicer.py +330 -0
  213. {pynguin-0.46.0 → pynguin-0.47.0}/tests/slicer/util.py +1 -1
  214. {pynguin-0.46.0 → pynguin-0.47.0}/tests/test_generator.py +36 -9
  215. pynguin-0.47.0/tests/testcase/_builders.py +106 -0
  216. {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_executionresult.py +9 -0
  217. {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_moduleprovider.py +11 -0
  218. pynguin-0.47.0/tests/testcase/execution/test_returntype.py +139 -0
  219. {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_subprocesstestcaseexecutor.py +61 -25
  220. pynguin-0.47.0/tests/testcase/execution/test_subprocesstestcaseexecutor_integration.py +280 -0
  221. pynguin-0.47.0/tests/testcase/execution/test_testcaseexecutor_integration.py +234 -0
  222. pynguin-0.47.0/tests/testcase/execution/test_tuple_deconstruction_integration.py +108 -0
  223. pynguin-0.47.0/tests/testcase/execution/test_typetracing.py +269 -0
  224. pynguin-0.47.0/tests/testcase/export/conftest.py +14 -0
  225. pynguin-0.47.0/tests/testcase/export/test_export.py +731 -0
  226. pynguin-0.47.0/tests/testcase/test_collection_tracker.py +435 -0
  227. pynguin-0.47.0/tests/testcase/test_constant_seeding_integration.py +76 -0
  228. pynguin-0.47.0/tests/testcase/test_literalgen.py +783 -0
  229. pynguin-0.47.0/tests/testcase/test_llmlocalsearch.py +214 -0
  230. pynguin-0.47.0/tests/testcase/test_localsearch.py +471 -0
  231. pynguin-0.47.0/tests/testcase/test_localsearchstatement.py +545 -0
  232. pynguin-0.47.0/tests/testcase/test_ml_testfactory.py +381 -0
  233. pynguin-0.47.0/tests/testcase/test_testcase.py +249 -0
  234. pynguin-0.47.0/tests/testcase/test_testfactory.py +1624 -0
  235. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/generic/test_genericaccessibleobject.py +46 -0
  236. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/pynguinml/test_ml_testfactory_utils.py +16 -13
  237. pynguin-0.47.0/tests/utils/stats/__init__.py +6 -0
  238. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/stats/test_outputvariablefactory.py +13 -0
  239. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/stats/test_runtimevariable.py +9 -3
  240. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_configuration_writer.py +115 -34
  241. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_controlflowdistance.py +90 -2
  242. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_execution_recorder.py +2 -0
  243. pynguin-0.47.0/tests/utils/test_naming.py +71 -0
  244. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_report.py +1 -1
  245. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_string_subtype_integration.py +9 -0
  246. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_type_utils.py +190 -0
  247. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_typeevalpy_integration.py +3 -2
  248. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_typeevalpy_json_schema.py +4 -2
  249. pynguin-0.47.0/tests/utils/utils.py +111 -0
  250. pynguin-0.46.0/src/pynguin/analyses/seeding.py +0 -917
  251. pynguin-0.46.0/src/pynguin/assertion/assertion_to_ast.py +0 -349
  252. pynguin-0.46.0/src/pynguin/assertion/assertiontraceobserver.py +0 -399
  253. pynguin-0.46.0/src/pynguin/ga/algorithms/dynamosaalgorithm.py +0 -321
  254. pynguin-0.46.0/src/pynguin/ga/algorithms/llmosalgorithm.py +0 -207
  255. pynguin-0.46.0/src/pynguin/ga/computations.py +0 -1013
  256. pynguin-0.46.0/src/pynguin/ga/operators/crossover.py +0 -52
  257. pynguin-0.46.0/src/pynguin/large_language_model/AGENTS.md +0 -219
  258. pynguin-0.46.0/src/pynguin/large_language_model/helpers/AGENTS.md +0 -38
  259. pynguin-0.46.0/src/pynguin/large_language_model/helpers/__init__.py +0 -7
  260. pynguin-0.46.0/src/pynguin/large_language_model/helpers/testcasereferencecopier.py +0 -146
  261. pynguin-0.46.0/src/pynguin/large_language_model/parsing/AGENTS.md +0 -81
  262. pynguin-0.46.0/src/pynguin/large_language_model/parsing/astscoping.py +0 -564
  263. pynguin-0.46.0/src/pynguin/large_language_model/parsing/deserializer.py +0 -970
  264. pynguin-0.46.0/src/pynguin/large_language_model/parsing/helpers.py +0 -199
  265. pynguin-0.46.0/src/pynguin/large_language_model/prompts/__init__.py +0 -7
  266. pynguin-0.46.0/src/pynguin/large_language_model/prompts/prompt.py +0 -38
  267. pynguin-0.46.0/src/pynguin/large_language_model/prompts/testcasegenerationprompt.py +0 -33
  268. pynguin-0.46.0/src/pynguin/large_language_model/prompts/type_and_subtype_inference_prompt.py +0 -147
  269. pynguin-0.46.0/src/pynguin/large_language_model/prompts/typeinferenceprompt.py +0 -110
  270. pynguin-0.46.0/src/pynguin/refinement/sut_inspector.py +0 -293
  271. pynguin-0.46.0/src/pynguin/refinement/validator.py +0 -79
  272. pynguin-0.46.0/src/pynguin/testcase/defaulttestcase.py +0 -215
  273. pynguin-0.46.0/src/pynguin/testcase/execution.py +0 -2254
  274. pynguin-0.46.0/src/pynguin/testcase/export.py +0 -587
  275. pynguin-0.46.0/src/pynguin/testcase/llmlocalsearch.py +0 -230
  276. pynguin-0.46.0/src/pynguin/testcase/localsearchstatement.py +0 -1494
  277. pynguin-0.46.0/src/pynguin/testcase/statement.py +0 -2951
  278. pynguin-0.46.0/src/pynguin/testcase/statement_to_ast.py +0 -480
  279. pynguin-0.46.0/src/pynguin/testcase/testcase.py +0 -352
  280. pynguin-0.46.0/src/pynguin/testcase/testcase_to_ast.py +0 -220
  281. pynguin-0.46.0/src/pynguin/testcase/testcasevisitor.py +0 -21
  282. pynguin-0.46.0/src/pynguin/testcase/testfactory.py +0 -1915
  283. pynguin-0.46.0/src/pynguin/testcase/variablereference.py +0 -492
  284. pynguin-0.46.0/src/pynguin/utils/ast_util.py +0 -218
  285. pynguin-0.46.0/src/pynguin/utils/llm.py +0 -165
  286. pynguin-0.46.0/src/pynguin/utils/namingscope.py +0 -194
  287. pynguin-0.46.0/tests/analyses/test_initialpopulationseeding.py +0 -261
  288. pynguin-0.46.0/tests/analyses/test_seeding.py +0 -71
  289. pynguin-0.46.0/tests/analyses/test_staticconstantseeding.py +0 -46
  290. pynguin-0.46.0/tests/analyses/test_type_inference.py +0 -124
  291. pynguin-0.46.0/tests/assertion/test_assertion.py +0 -160
  292. pynguin-0.46.0/tests/assertion/test_assertion_generation_integration.py +0 -715
  293. pynguin-0.46.0/tests/assertion/test_assertion_to_ast.py +0 -120
  294. pynguin-0.46.0/tests/assertion/test_assertiontraceobserver.py +0 -94
  295. pynguin-0.46.0/tests/assertion/test_llmassertiongenerator.py +0 -214
  296. pynguin-0.46.0/tests/ga/algorithms/test_dynamosaalgorithm.py +0 -90
  297. pynguin-0.46.0/tests/ga/test_coveragegoals.py +0 -481
  298. pynguin-0.46.0/tests/ga/test_postprocess.py +0 -1224
  299. pynguin-0.46.0/tests/ga/test_testcasechromosome.py +0 -337
  300. pynguin-0.46.0/tests/large_language_model/helpers/test_testcasereferencecopier.py +0 -188
  301. pynguin-0.46.0/tests/large_language_model/parsing/test_astscoping.py +0 -726
  302. pynguin-0.46.0/tests/large_language_model/parsing/test_helpers.py +0 -353
  303. pynguin-0.46.0/tests/large_language_model/prompts/test_testcasegenerationprompt.py +0 -114
  304. pynguin-0.46.0/tests/large_language_model/test_llm_deserializer.py +0 -645
  305. pynguin-0.46.0/tests/large_language_model/test_llmtestcasehandler.py +0 -216
  306. pynguin-0.46.0/tests/refinement/test_sut_inspector.py +0 -85
  307. pynguin-0.46.0/tests/refinement/test_validator.py +0 -80
  308. pynguin-0.46.0/tests/slicer/test_assertionslicer.py +0 -387
  309. pynguin-0.46.0/tests/slicer/test_statementslicer.py +0 -319
  310. pynguin-0.46.0/tests/testcase/execution/test_executioncontext.py +0 -43
  311. pynguin-0.46.0/tests/testcase/execution/test_subprocesstestcaseexecutor_integration.py +0 -131
  312. pynguin-0.46.0/tests/testcase/execution/test_testcaseexecutor_integration.py +0 -197
  313. pynguin-0.46.0/tests/testcase/execution/test_typetracing.py +0 -115
  314. pynguin-0.46.0/tests/testcase/export/conftest.py +0 -95
  315. pynguin-0.46.0/tests/testcase/export/test_export.py +0 -737
  316. pynguin-0.46.0/tests/testcase/statements/test_assignmentstatement.py +0 -125
  317. pynguin-0.46.0/tests/testcase/statements/test_collectionstatements.py +0 -137
  318. pynguin-0.46.0/tests/testcase/statements/test_fieldstatement.py +0 -170
  319. pynguin-0.46.0/tests/testcase/statements/test_parameterizedstatements.py +0 -546
  320. pynguin-0.46.0/tests/testcase/statements/test_primitivestatements.py +0 -815
  321. pynguin-0.46.0/tests/testcase/test_ast_assign_statement.py +0 -384
  322. pynguin-0.46.0/tests/testcase/test_benchmark.py +0 -63
  323. pynguin-0.46.0/tests/testcase/test_defaulttestcase.py +0 -504
  324. pynguin-0.46.0/tests/testcase/test_llmlocalsearch.py +0 -77
  325. pynguin-0.46.0/tests/testcase/test_localsearch.py +0 -1366
  326. pynguin-0.46.0/tests/testcase/test_statement_to_ast.py +0 -666
  327. pynguin-0.46.0/tests/testcase/test_testcase_integration.py +0 -160
  328. pynguin-0.46.0/tests/testcase/test_testcase_to_ast_integration.py +0 -161
  329. pynguin-0.46.0/tests/testcase/test_testfactory.py +0 -1077
  330. pynguin-0.46.0/tests/testcase/variable/test_variablereference.py +0 -316
  331. pynguin-0.46.0/tests/utils/test_namingscope.py +0 -134
  332. pynguin-0.46.0/tests/utils/utils.py +0 -46
  333. {pynguin-0.46.0 → pynguin-0.47.0}/LICENSE.rst +0 -0
  334. {pynguin-0.46.0 → pynguin-0.47.0}/LICENSES/Apache-2.0.txt +0 -0
  335. {pynguin-0.46.0 → pynguin-0.47.0}/LICENSES/BSD-2-Clause.txt +0 -0
  336. {pynguin-0.46.0 → pynguin-0.47.0}/LICENSES/CC-BY-4.0.txt +0 -0
  337. {pynguin-0.46.0 → pynguin-0.47.0}/LICENSES/CC0-1.0.txt +0 -0
  338. {pynguin-0.46.0 → pynguin-0.47.0}/LICENSES/MIT.txt +0 -0
  339. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/__init__.py +0 -0
  340. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/__main__.py +0 -0
  341. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/AGENTS.md +0 -0
  342. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/__init__.py +0 -0
  343. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/modulecomplexity.py +0 -0
  344. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/string_subtype_inference.py +0 -0
  345. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/string_subtypes.py +0 -0
  346. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/AGENTS.md +0 -0
  347. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/__init__.py +0 -0
  348. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/AGENTS.md +0 -0
  349. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/__init__.py +0 -0
  350. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/controller.py +0 -0
  351. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/mutators.py +0 -0
  352. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/AGENTS.md +0 -0
  353. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/__init__.py +0 -0
  354. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/arithmetic.py +0 -0
  355. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/base.py +0 -0
  356. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/decorator.py +0 -0
  357. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/exception.py +0 -0
  358. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/inheritance.py +0 -0
  359. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/logical.py +0 -0
  360. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/loop.py +0 -0
  361. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/misc.py +0 -0
  362. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/statement.py +0 -0
  363. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/strategies.py +0 -0
  364. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/transformer.py +0 -0
  365. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/cli.py +0 -0
  366. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/AGENTS.md +0 -0
  367. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/__init__.py +0 -0
  368. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/AGENTS.md +0 -0
  369. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/__init__.py +0 -0
  370. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/abstractmosaalgorithm.py +0 -0
  371. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/generationalgorithm.py +0 -0
  372. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/mioalgorithm.py +0 -0
  373. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/mosaalgorithm.py +0 -0
  374. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/randomsearchalgorithm.py +0 -0
  375. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/wholesuitealgorithm.py +0 -0
  376. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/chromosomefactory.py +0 -0
  377. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/chromosomevisitor.py +0 -0
  378. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/llmtestsuitechromosomefactory.py +0 -0
  379. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/operators/AGENTS.md +0 -0
  380. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/operators/__init__.py +0 -0
  381. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/operators/ranking.py +0 -0
  382. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/operators/selection.py +0 -0
  383. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/searchobserver.py +0 -0
  384. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/testcasechromosomefactory.py +0 -0
  385. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/testsuitechromosomefactory.py +0 -0
  386. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/AGENTS.md +0 -0
  387. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/__init__.py +0 -0
  388. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/AGENTS.md +0 -0
  389. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/__init__.py +0 -0
  390. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/common.py +0 -0
  391. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/python3_12.py +0 -0
  392. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/python3_14.py +0 -0
  393. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/__init__.py +0 -0
  394. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/caching.py +0 -0
  395. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/parsing/__init__.py +0 -0
  396. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/parsing/type_str_parser.py +0 -0
  397. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/master_worker/AGENTS.md +0 -0
  398. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/master_worker/__init__.py +0 -0
  399. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/master_worker/client.py +0 -0
  400. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/master_worker/master.py +0 -0
  401. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/master_worker/worker.py +0 -0
  402. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/__init__.py +0 -0
  403. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/aaa_inserter.py +0 -0
  404. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/ast_analyzer.py +0 -0
  405. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/readability_metrics.py +0 -0
  406. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/AGENTS.md +0 -0
  407. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/__init__.py +0 -0
  408. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/coverage-template.html +0 -0
  409. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/__init__.py +0 -0
  410. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/camel_case.fan +0 -0
  411. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/colour.fan +0 -0
  412. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/csv.fan +0 -0
  413. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/delimited.fan +0 -0
  414. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/email.fan +0 -0
  415. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/__init__.py +0 -0
  416. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/camel_case.fan +0 -0
  417. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/colour.fan +0 -0
  418. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/csv.fan +0 -0
  419. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/delimited.fan +0 -0
  420. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/email.fan +0 -0
  421. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/ipv4.fan +0 -0
  422. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/standard_date.fan +0 -0
  423. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/unix_path.fan +0 -0
  424. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/xml.fan +0 -0
  425. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/ipv4.fan +0 -0
  426. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/numeric.fan +0 -0
  427. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/standard_date.fan +0 -0
  428. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/unix_path.fan +0 -0
  429. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/xml.fan +0 -0
  430. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/AGENTS.md +0 -0
  431. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/__init__.py +0 -0
  432. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/dynamicslicer.py +0 -0
  433. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/executedinstruction.py +0 -0
  434. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/executionflowbuilder.py +0 -0
  435. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/stack/__init__.py +0 -0
  436. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/stack/stacksimulation.py +0 -0
  437. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/testcase/__init__.py +0 -0
  438. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/testcase/localsearchobjective.py +0 -0
  439. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/testcase/localsearchtimer.py +0 -0
  440. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/__init__.py +0 -0
  441. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/atomicinteger.py +0 -0
  442. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/collection_utils.py +0 -0
  443. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/configuration_writer.py +0 -0
  444. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/exceptions.py +0 -0
  445. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/fandango_faker_utils.py +0 -0
  446. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/fs_isolation.py +0 -0
  447. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/generic/AGENTS.md +0 -0
  448. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/generic/__init__.py +0 -0
  449. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/logging_utils.py +0 -0
  450. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/mirror.py +0 -0
  451. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/mutation_utils.py +0 -0
  452. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/openai_key_resolver.py +0 -0
  453. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/orderedset.py +0 -0
  454. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/AGENTS.md +0 -0
  455. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/__init__.py +0 -0
  456. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/ml_parsing_utils.py +0 -0
  457. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/ml_testing_resources.py +0 -0
  458. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/mlparameter.py +0 -0
  459. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/np_rng.py +0 -0
  460. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/randomness.py +0 -0
  461. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/statistics/AGENTS.md +0 -0
  462. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/statistics/__init__.py +0 -0
  463. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/statistics/statisticsbackend.py +0 -0
  464. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/statistics/statisticsobserver.py +0 -0
  465. {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/statistics/stats.py +0 -0
  466. {pynguin-0.46.0 → pynguin-0.47.0}/tests/AGENTS.md +0 -0
  467. {pynguin-0.46.0 → pynguin-0.47.0}/tests/__init__.py +0 -0
  468. {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/__init__.py +0 -0
  469. {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_modulecomplexity.py +0 -0
  470. {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_string_subtypes.py +0 -0
  471. {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_typesystem.py +0 -0
  472. {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_typesystem_string_subtypes.py +0 -0
  473. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/AGENTS.md +0 -0
  474. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/__init__.py +0 -0
  475. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/__init__.py +0 -0
  476. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/AGENTS.md +0 -0
  477. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/__init__.py +0 -0
  478. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_arithmetic.py +0 -0
  479. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_decorator.py +0 -0
  480. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_exception.py +0 -0
  481. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_inheritance.py +0 -0
  482. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_logical.py +0 -0
  483. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_loop.py +0 -0
  484. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_misc.py +0 -0
  485. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_statement.py +0 -0
  486. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/test_controller.py +0 -0
  487. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/test_mutators.py +0 -0
  488. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/test_strategies.py +0 -0
  489. {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/test_assertiongenerator.py +0 -0
  490. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/AGENTS.md +0 -0
  491. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/__init__.py +0 -0
  492. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/accessibles/__init__.py +0 -0
  493. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/__init__.py +0 -0
  494. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/nestedbranches.py +0 -0
  495. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/nobranches.py +0 -0
  496. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/simplenesting.py +0 -0
  497. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/singlebranches.py +0 -0
  498. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/twomethodsinglebranches.py +0 -0
  499. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/c/__init__.py +0 -0
  500. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/c/my_ctypes.py +0 -0
  501. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/__init__.py +0 -0
  502. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/abstract.py +0 -0
  503. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/alias_module.py +0 -0
  504. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/async_and_sync.py +0 -0
  505. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/async_class_gen.py +0 -0
  506. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/async_class_method.py +0 -0
  507. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/async_func.py +0 -0
  508. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/async_gen.py +0 -0
  509. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/attributes.py +0 -0
  510. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/blacklist.py +0 -0
  511. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/blacklist_transitive.py +0 -0
  512. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/cached_function.py +0 -0
  513. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/comments.py +0 -0
  514. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/complex_dependencies.py +0 -0
  515. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/complex_dependency.py +0 -0
  516. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/conditional_import.py +0 -0
  517. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/dependency.py +0 -0
  518. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/diamond_bottom.py +0 -0
  519. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/diamond_left.py +0 -0
  520. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/diamond_right.py +0 -0
  521. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/diamond_top.py +0 -0
  522. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/enums.py +0 -0
  523. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/import_dependency.py +0 -0
  524. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/inheritance.py +0 -0
  525. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/lambda.py +0 -0
  526. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/lazy_module_getattr.py +0 -0
  527. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/nested_functions.py +0 -0
  528. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/no_any_annotations.py +0 -0
  529. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/no_dependencies.py +0 -0
  530. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/overridden_inherited_methods.py +0 -0
  531. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/simple_dependencies.py +0 -0
  532. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/typing_parameters.py +0 -0
  533. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/uses_async_dependency.py +0 -0
  534. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/visibility.py +0 -0
  535. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/visibility_dependency.py +0 -0
  536. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/crash/__init__.py +0 -0
  537. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/crash/partly_crashing.py +0 -0
  538. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/crash/seg_fault.py +0 -0
  539. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/duckmock/__init__.py +0 -0
  540. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/duckmock/complex.py +0 -0
  541. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/errors/__init__.py +0 -0
  542. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/errors/import_error.py +0 -0
  543. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/AGENTS.md +0 -0
  544. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/__init__.py +0 -0
  545. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/assertions.py +0 -0
  546. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/basket.py +0 -0
  547. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/calculator.py +0 -0
  548. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/calculator_simple.py +0 -0
  549. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/collections.py +0 -0
  550. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/constructors.py +0 -0
  551. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/difficult.py +0 -0
  552. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/dummies.py +0 -0
  553. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/dynamosa_example.py +0 -0
  554. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/enums.py +0 -0
  555. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/exceptions.py +0 -0
  556. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/flaky.py +0 -0
  557. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/impossible.py +0 -0
  558. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/inheritance.py +0 -0
  559. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/loop.py +0 -0
  560. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/module_alias.py +0 -0
  561. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/monkey.py +0 -0
  562. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/nested.py +0 -0
  563. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/objects.py +0 -0
  564. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/private_methods.py +0 -0
  565. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/queue.py +0 -0
  566. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/simple.py +0 -0
  567. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/triangle.py +0 -0
  568. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/type_inference.py +0 -0
  569. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/__init__.py +0 -0
  570. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/geometry.py +0 -0
  571. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/invoice.py +0 -0
  572. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/large_test_cluster.py +0 -0
  573. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/mixed.py +0 -0
  574. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/string_subtype.py +0 -0
  575. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/unasserted_exceptions.py +0 -0
  576. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/grammar/__init__.py +0 -0
  577. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/grammar/parameters.py +0 -0
  578. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/AGENTS.md +0 -0
  579. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/__init__.py +0 -0
  580. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/comparison.py +0 -0
  581. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/covered_branches.py +0 -0
  582. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/covered_classes.py +0 -0
  583. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/covered_functions.py +0 -0
  584. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/covered_lines.py +0 -0
  585. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/excluded_blocks.py +0 -0
  586. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/inherited.py +0 -0
  587. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/mixed.py +0 -0
  588. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/linecoverage/__init__.py +0 -0
  589. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/linecoverage/artificial_none.py +0 -0
  590. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/linecoverage/emptyfile.py +0 -0
  591. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/linecoverage/exception.py +0 -0
  592. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/linecoverage/list.py +0 -0
  593. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/linecoverage/plus.py +0 -0
  594. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/linecoverage/setter_getter.py +0 -0
  595. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/mutation/__init__.py +0 -0
  596. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/mutation/exception.py +0 -0
  597. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/mutation/expected.py +0 -0
  598. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/mutation/mutation.py +0 -0
  599. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/mutation/timeout.py +0 -0
  600. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/programgraph/__init__.py +0 -0
  601. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/programgraph/samples.py +0 -0
  602. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/programgraph/whileloop.py +0 -0
  603. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/programgraph/yield_fun.py +0 -0
  604. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/regression/__init__.py +0 -0
  605. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/regression/argparse_sys_exit.py +0 -0
  606. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/regression/custom_error.py +0 -0
  607. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/regression/not_main.py +0 -0
  608. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/__init__.py +0 -0
  609. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/dynamicseeding/__init__.py +0 -0
  610. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/dynamicseeding/dynamicseedingdummies.py +0 -0
  611. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/__init__.py +0 -0
  612. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/dummycontainer.py +0 -0
  613. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/__init__.py +0 -0
  614. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/assertseed_test_.py +0 -0
  615. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/classseed_test_.py +0 -0
  616. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collfuncseed_test_.py +0 -0
  617. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collseed_test_.py +0 -0
  618. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/nestedseed_test_.py +0 -0
  619. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notknowncall_test_.py +0 -0
  620. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notprimseed_test_.py +0 -0
  621. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/primitiveseed_test_.py +0 -0
  622. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/triangleseed_test_.py +0 -0
  623. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongassignseed_test_.py +0 -0
  624. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongfunctionnameseed_test_.py +0 -0
  625. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/staticconstantseeding/__init__.py +0 -0
  626. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/staticconstantseeding/dummy/__init__.py +0 -0
  627. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/staticconstantseeding/dummy/dummy.py +0 -0
  628. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/staticconstantseeding/dummy/empty.so +0 -0
  629. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/__init__.py +0 -0
  630. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/attribute_dependencies.py +0 -0
  631. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/closure.py +0 -0
  632. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/generator.py +0 -0
  633. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/immutable_attribute_dependency.py +0 -0
  634. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/import_star_def.py +0 -0
  635. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/import_star_main.py +0 -0
  636. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/partial_cover_dependency.py +0 -0
  637. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/simple_call.py +0 -0
  638. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/simple_call_arg.py +0 -0
  639. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/test.conf +0 -0
  640. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/test.conf.license +0 -0
  641. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/tests/typeinference/test_stubstrategy.pyi +0 -0
  642. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/type_tracing/__init__.py +0 -0
  643. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/type_tracing/return_types.py +0 -0
  644. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/type_tracing/union_type.py +0 -0
  645. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/types/__init__.py +0 -0
  646. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/types/outside.py +0 -0
  647. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/types/subtyping.py +0 -0
  648. {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/types/symbols.py +0 -0
  649. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/AGENTS.md +0 -0
  650. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/__init__.py +0 -0
  651. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/__init__.py +0 -0
  652. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_archive.py +0 -0
  653. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_generationalgorithm.py +0 -0
  654. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_integration_mosaalgorithm.py +0 -0
  655. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_mioalgorithm.py +0 -0
  656. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_mosaalgorithm.py +0 -0
  657. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/__init__.py +0 -0
  658. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/crossover/__init__.py +0 -0
  659. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/crossover/test_singlepointrelativecrossover.py +0 -0
  660. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/ranking/__init__.py +0 -0
  661. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/ranking/test_rankingfunction.py +0 -0
  662. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/selection/__init__.py +0 -0
  663. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/selection/test_randomselection.py +0 -0
  664. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/selection/test_rankselection.py +0 -0
  665. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/selection/test_selection.py +0 -0
  666. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/selection/test_tournamentselection.py +0 -0
  667. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/test_dominancecomparator.py +0 -0
  668. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/test_preferencesortingcomparator.py +0 -0
  669. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/__init__.py +0 -0
  670. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_coverageplateaustoppingcondition.py +0 -0
  671. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_maxcoveragestoppingcondition.py +0 -0
  672. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_maxiterationsstoppingcondition.py +0 -0
  673. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_maxmemorystoppingcondition.py +0 -0
  674. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_maxstatementstoppingcondition.py +0 -0
  675. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_maxtestsstoppingcondition.py +0 -0
  676. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_maxtimestoppingcondition.py +0 -0
  677. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_minimumcoverageplateaustoppingcondition.py +0 -0
  678. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_stoppingcondition.py +0 -0
  679. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_chromosome.py +0 -0
  680. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_chromosomefactory.py +0 -0
  681. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_llmtestsuitechromosomefactory.py +0 -0
  682. {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_testsuitechromosome.py +0 -0
  683. {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/AGENTS.md +0 -0
  684. {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/__init__.py +0 -0
  685. {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_cfg.py +0 -0
  686. {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_controldependencegraph.py +0 -0
  687. {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_machinery.py +0 -0
  688. {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_programgraph.py +0 -0
  689. {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_version.py +0 -0
  690. {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/__init__.py +0 -0
  691. {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/parsing/test_type_str_parser.py +0 -0
  692. {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/prompts/__init__.py +0 -0
  693. {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/test_caching.py +0 -0
  694. {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/test_llm_caching.py +0 -0
  695. {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/test_llmtestcasehandler_coverage.py +0 -0
  696. {pynguin-0.46.0 → pynguin-0.47.0}/tests/master_worker/__init__.py +0 -0
  697. {pynguin-0.46.0 → pynguin-0.47.0}/tests/master_worker/test_master.py +0 -0
  698. {pynguin-0.46.0 → pynguin-0.47.0}/tests/master_worker/test_worker.py +0 -0
  699. {pynguin-0.46.0/tests/refinement → pynguin-0.47.0/tests/quick_eval}/__init__.py +0 -0
  700. {pynguin-0.46.0/tests/slicer → pynguin-0.47.0/tests/refinement}/__init__.py +0 -0
  701. {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_aaa_inserter.py +0 -0
  702. {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_ast_analyzer.py +0 -0
  703. {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_readability_metrics.py +0 -0
  704. {pynguin-0.46.0 → pynguin-0.47.0}/tests/resources/__init__.py +0 -0
  705. {pynguin-0.46.0 → pynguin-0.47.0}/tests/resources/typeevalpy/__init__.py +0 -0
  706. {pynguin-0.46.0 → pynguin-0.47.0}/tests/resources/typeevalpy/dummy.py +0 -0
  707. {pynguin-0.46.0 → pynguin-0.47.0}/tests/resources/typeevalpy/dummy_gt.json +0 -0
  708. {pynguin-0.46.0 → pynguin-0.47.0}/tests/resources/typeevalpy/dummy_gt.json.license +0 -0
  709. {pynguin-0.46.0/tests/testcase → pynguin-0.47.0/tests/slicer}/__init__.py +0 -0
  710. {pynguin-0.46.0 → pynguin-0.47.0}/tests/slicer/test_dependencies.py +0 -0
  711. {pynguin-0.46.0 → pynguin-0.47.0}/tests/slicer/test_expected_failures.py +0 -0
  712. {pynguin-0.46.0 → pynguin-0.47.0}/tests/slicer/test_language_features.py +0 -0
  713. {pynguin-0.46.0 → pynguin-0.47.0}/tests/test___main__.py +0 -0
  714. {pynguin-0.46.0 → pynguin-0.47.0}/tests/test_cli.py +0 -0
  715. {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/AGENTS.md +0 -0
  716. {pynguin-0.46.0/tests/testcase/execution → pynguin-0.47.0/tests/testcase}/__init__.py +0 -0
  717. {pynguin-0.46.0/tests/testcase/export → pynguin-0.47.0/tests/testcase/execution}/__init__.py +0 -0
  718. {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_executedinstruction.py +0 -0
  719. {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_executionmocking.py +0 -0
  720. {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_executiontrace.py +0 -0
  721. {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_outputsuppression.py +0 -0
  722. {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_subprocesstestcaseexecutor_differential.py +0 -0
  723. {pynguin-0.46.0/tests/testcase/statements → pynguin-0.47.0/tests/testcase/export}/__init__.py +0 -0
  724. {pynguin-0.46.0/tests/testcase/variable → pynguin-0.47.0/tests/testcase/statements}/__init__.py +0 -0
  725. {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/test_localsearchtimer.py +0 -0
  726. {pynguin-0.46.0/tests/utils → pynguin-0.47.0/tests/testcase/variable}/__init__.py +0 -0
  727. {pynguin-0.46.0 → pynguin-0.47.0}/tests/testutils.py +0 -0
  728. {pynguin-0.46.0/tests/utils/generic → pynguin-0.47.0/tests/utils}/__init__.py +0 -0
  729. {pynguin-0.46.0/tests/utils/pynguinml → pynguin-0.47.0/tests/utils/generic}/__init__.py +0 -0
  730. {pynguin-0.46.0/tests/utils/stats → pynguin-0.47.0/tests/utils/pynguinml}/__init__.py +0 -0
  731. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/pynguinml/test_ml_parsing_utils.py +0 -0
  732. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/pynguinml/test_ml_testing_resources.py +0 -0
  733. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/pynguinml/test_mlparameter.py +0 -0
  734. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/pynguinml/test_np_rng.py +0 -0
  735. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/pynguinml/test_pynguinml_integration.py +0 -0
  736. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/stats/test_searchstatistics.py +0 -0
  737. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/stats/test_statistics.py +0 -0
  738. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/stats/test_statisticsbackend.py +0 -0
  739. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_atomicinteger.py +0 -0
  740. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_collection_utils.py +0 -0
  741. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_exceptions.py +0 -0
  742. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_fandango_faker_utils.py +0 -0
  743. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_fs_isolation.py +0 -0
  744. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_llm.py +0 -0
  745. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_logging_utils.py +0 -0
  746. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_mirror.py +0 -0
  747. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_mutation_utils.py +0 -0
  748. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_orderedset.py +0 -0
  749. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_randomness.py +0 -0
  750. {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_typetracing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pynguin
3
- Version: 0.46.0
3
+ Version: 0.47.0
4
4
  Summary: Pynguin is a tool for automated unit test generation for Python
5
5
  License: MIT
6
6
  Keywords: unit test,random testing,search based,test generation
@@ -33,8 +33,6 @@ Provides-Extra: openai
33
33
  Provides-Extra: typing
34
34
  Requires-Dist: Jinja2 (>=3.1.6,<4.0.0)
35
35
  Requires-Dist: Pygments (>=2.19.2,<3.0.0)
36
- Requires-Dist: asciitree (>=0.3.3,<0.4.0)
37
- Requires-Dist: astroid (>=4.0.1,<5.0.0)
38
36
  Requires-Dist: black (>=25.1.0,<26.0.0)
39
37
  Requires-Dist: bytecode (==0.17.0)
40
38
  Requires-Dist: dill (>=0.4.0,<0.5.0)
@@ -49,14 +47,14 @@ Requires-Dist: openai (>=1.72.0,<2.0.0) ; extra == "openai"
49
47
  Requires-Dist: psutil (>=7.1.1,<8.0.0)
50
48
  Requires-Dist: pytest (>=8.3.5,<9.0.0)
51
49
  Requires-Dist: python-dotenv (>=1.0.0,<2.0.0) ; extra == "openai"
50
+ Requires-Dist: pyyaml (>=6.0.2,<7.0.0) ; extra == "openai"
52
51
  Requires-Dist: rich (>=14.0.0,<15.0.0)
53
52
  Requires-Dist: rstr (>=3.2.2,<4.0.0)
54
53
  Requires-Dist: setuptools (>=80.9.0,<81.0.0)
55
54
  Requires-Dist: simple-parsing (>=0.1.7,<0.2.0)
56
55
  Requires-Dist: toml (>=0.10.2,<0.11.0)
56
+ Requires-Dist: typeshed-client (>=2.13.0,<3.0.0)
57
57
  Requires-Dist: typing-extensions (>=4.12.2,<5.0.0) ; extra == "typing"
58
- Requires-Dist: typing_inspect (>=0.9.0,<0.10.0)
59
- Requires-Dist: xmltodict (>=0.14.2,<0.15.0) ; extra == "fandango-faker"
60
58
  Project-URL: Documentation, https://pynguin.readthedocs.io
61
59
  Project-URL: Homepage, https://www.pynguin.eu
62
60
  Project-URL: Repository, https://github.com/se2p/pynguin
@@ -233,5 +231,5 @@ its license was changed with version 0.30.0.
233
231
 
234
232
  ## Star History
235
233
 
236
- [![Star History Chart](https://api.star-history.com/svg?repos=se2p/pynguin&type=Date)](https://star-history.com/#se2p/pynguin)
234
+ [![Star History Chart](https://star-history.dera.page/svg?repos=se2p/pynguin&type=Date)](https://star-history.dera.page/#se2p/pynguin)
237
235
 
@@ -169,4 +169,4 @@ its license was changed with version 0.30.0.
169
169
 
170
170
  ## Star History
171
171
 
172
- [![Star History Chart](https://api.star-history.com/svg?repos=se2p/pynguin&type=Date)](https://star-history.com/#se2p/pynguin)
172
+ [![Star History Chart](https://star-history.dera.page/svg?repos=se2p/pynguin&type=Date)](https://star-history.dera.page/#se2p/pynguin)
@@ -4,7 +4,7 @@
4
4
 
5
5
  [tool.poetry]
6
6
  name = "pynguin"
7
- version = "0.46.0"
7
+ version = "0.47.0"
8
8
  description = "Pynguin is a tool for automated unit test generation for Python"
9
9
  authors = [
10
10
  "Stephan Lukasczyk <stephan@pynguin.eu>",
@@ -51,7 +51,6 @@ include = [
51
51
 
52
52
  [tool.poetry.dependencies]
53
53
  python = ">=3.10, <3.15"
54
- astroid = "^4.0.1"
55
54
  black = "^25.1.0"
56
55
  bytecode = "0.17.0"
57
56
  dill = "^0.4.0"
@@ -62,21 +61,20 @@ rich = "^14.0.0"
62
61
  Pygments = "^2.19.2"
63
62
  pytest = "^8.3.5"
64
63
  simple-parsing = "^0.1.7"
65
- typing_inspect = "^0.9.0"
66
- asciitree = "^0.3.3"
67
64
  libcst = "^1.7.0"
68
65
  setuptools = "^80.9.0"
69
66
  toml = "^0.10.2"
70
67
  psutil = "^7.1.1"
71
68
  rstr = "^3.2.2"
72
69
  openai = { version = "^1.72.0", optional = true }
70
+ pyyaml = { version = "^6.0.2", optional = true }
73
71
  python-dotenv = { version = "^1.0.0", optional = true }
74
72
  numpy = { version = "^1.26.4", optional = true }
75
73
  mypy = { version = "^1.15.0", optional = true }
76
74
  typing-extensions = { version = "^4.12.2", optional = true }
77
75
  faker = { version = "^37.3.0", optional = true }
78
76
  fandango-fuzzer = { version = "^0.8.2", optional = true }
79
- xmltodict = { version = "^0.14.2", optional = true }
77
+ typeshed-client = "^2.13.0"
80
78
 
81
79
  [tool.poetry.group.dev.dependencies]
82
80
  mypy = "^1.15.0"
@@ -102,10 +100,10 @@ pytest-sugar = "^1.0.0"
102
100
  pytest-xdist = "^3.6.0"
103
101
 
104
102
  [tool.poetry.extras]
105
- openai = [ "openai", "python-dotenv" ]
103
+ openai = [ "openai", "python-dotenv", "pyyaml" ]
106
104
  numpy = [ "numpy" ]
107
105
  typing = [ "mypy", "typing-extensions" ]
108
- fandango-faker = [ "faker", "fandango-fuzzer", "xmltodict" ]
106
+ fandango-faker = [ "faker", "fandango-fuzzer" ]
109
107
 
110
108
  [tool.poetry.scripts]
111
109
  pynguin = "pynguin.cli:main"
@@ -149,6 +147,24 @@ warn_unused_ignores = true
149
147
  warn_redundant_casts = true
150
148
  warn_unused_configs = true
151
149
 
150
+ # The following modules belong to subsystems that were disabled (kept on disk but
151
+ # inert) during the libcst test-case representation migration. They still use the
152
+ # old per-statement representation API and are excluded from type checking until
153
+ # they are migrated. See TC_REPRESENTATION_PLAN.md.
154
+ [[tool.mypy.overrides]]
155
+ module = [
156
+ "pynguin.testcase.localsearch",
157
+ "pynguin.testcase.localsearchstatement",
158
+ "pynguin.testcase.llmlocalsearch",
159
+ "pynguin.analyses.seeding",
160
+ "pynguin.slicer.statementslicingobserver",
161
+ "pynguin.assertion.llmassertiongenerator",
162
+ "pynguin.large_language_model.parsing.deserializer",
163
+ "pynguin.large_language_model.parsing.helpers",
164
+ "pynguin.large_language_model.helpers.testcasereferencecopier",
165
+ ]
166
+ ignore_errors = true
167
+
152
168
  [tool.pytest.ini_options]
153
169
  testpaths = [
154
170
  "tests",
@@ -267,6 +283,11 @@ max-complexity = 10
267
283
  convention = "google"
268
284
 
269
285
  [tool.ruff.lint.per-file-ignores]
286
+ # The exported test-suite license header embeds the repo's SPDX copyright text,
287
+ # which uses an EN DASH in the year range (2019–2026).
288
+ "src/pynguin/testcase/export.py" = [
289
+ "RUF001", # String contains ambiguous EN DASH (part of the SPDX license header)
290
+ ]
270
291
  "tests/**/*.py" = [
271
292
  "D100", # Missing docstring in public module
272
293
  "D101", # Missing docstring in public class
@@ -6,4 +6,4 @@
6
6
  #
7
7
  """Specifies the version of Pynguin."""
8
8
 
9
- __version__ = "0.46.0"
9
+ __version__ = "0.47.0"
@@ -0,0 +1,171 @@
1
+ # This file is part of Pynguin.
2
+ #
3
+ # SPDX-FileCopyrightText: 2019–2026 Pynguin Contributors
4
+ #
5
+ # SPDX-License-Identifier: MIT
6
+ #
7
+
8
+ """Utility functions for standard library ast nodes."""
9
+
10
+ from __future__ import annotations
11
+
12
+ import ast
13
+ from typing import TYPE_CHECKING, TypeVar, cast
14
+
15
+ _T = TypeVar("_T", bound=ast.AST)
16
+
17
+ if TYPE_CHECKING:
18
+ from collections.abc import Iterator
19
+
20
+
21
+ def _is_dataclass(class_node: ast.ClassDef) -> bool:
22
+ """Whether the class carries a ``@dataclass`` decorator.
23
+
24
+ Recognises ``@dataclass``, ``@dataclasses.dataclass`` and their called
25
+ forms (e.g. ``@dataclass(frozen=True)``).
26
+ """
27
+ for decorator in class_node.decorator_list:
28
+ target = decorator.func if isinstance(decorator, ast.Call) else decorator
29
+ if isinstance(target, ast.Name) and target.id == "dataclass":
30
+ return True
31
+ if isinstance(target, ast.Attribute) and target.attr == "dataclass":
32
+ return True
33
+ return False
34
+
35
+
36
+ def _is_class_var(annotation: ast.expr) -> bool:
37
+ """Whether an annotation is ``ClassVar`` / ``ClassVar[...]`` (any import form)."""
38
+ if isinstance(annotation, ast.Subscript):
39
+ annotation = annotation.value
40
+ if isinstance(annotation, ast.Name):
41
+ return annotation.id == "ClassVar"
42
+ if isinstance(annotation, ast.Attribute):
43
+ return annotation.attr == "ClassVar"
44
+ return False
45
+
46
+
47
+ def _flatten_target(target: ast.expr) -> list[ast.expr]:
48
+ """Flatten tuple/list assignment targets into their leaf expressions."""
49
+ if isinstance(target, (ast.Tuple, ast.List)):
50
+ leaves: list[ast.expr] = []
51
+ for element in target.elts:
52
+ leaves.extend(_flatten_target(element))
53
+ return leaves
54
+ return [target]
55
+
56
+
57
+ def _self_assigned_names(class_node: ast.ClassDef) -> Iterator[str]:
58
+ """Yield names assigned to ``self.<attr>`` in the class's own methods."""
59
+ for item in class_node.body:
60
+ if not isinstance(item, (ast.FunctionDef, ast.AsyncFunctionDef)):
61
+ continue
62
+ for node in ast.walk(item):
63
+ targets: list[ast.expr] = []
64
+ if isinstance(node, ast.Assign):
65
+ targets = list(node.targets)
66
+ elif isinstance(node, (ast.AnnAssign, ast.AugAssign)):
67
+ targets = [node.target]
68
+ for target in (leaf for tgt in targets for leaf in _flatten_target(tgt)):
69
+ if (
70
+ isinstance(target, ast.Attribute)
71
+ and isinstance(target.value, ast.Name)
72
+ and target.value.id == "self"
73
+ ):
74
+ yield target.attr
75
+
76
+
77
+ def _dataclass_field_names(class_node: ast.ClassDef) -> Iterator[str]:
78
+ """Yield annotated ``@dataclass`` field names (excluding ``ClassVar`` fields)."""
79
+ if not _is_dataclass(class_node):
80
+ return
81
+ for item in class_node.body:
82
+ if (
83
+ isinstance(item, ast.AnnAssign)
84
+ and isinstance(item.target, ast.Name)
85
+ and not _is_class_var(item.annotation)
86
+ ):
87
+ yield item.target.id
88
+
89
+
90
+ def instance_attributes(class_node: ast.ClassDef) -> tuple[str, ...]:
91
+ """Names assigned to ``self.<attr>`` in the class's own methods.
92
+
93
+ Mirrors ``astroid.ClassDef.instance_attrs`` (own class only, not inherited),
94
+ preserving first-seen order. For ``@dataclass`` classes the class-level
95
+ annotated fields are included as well (excluding ``ClassVar`` fields), since
96
+ astroid's dataclass support synthesises the corresponding ``__init__``
97
+ assignments.
98
+
99
+ Args:
100
+ class_node: The ClassDef AST node.
101
+
102
+ Returns:
103
+ A tuple of instance attribute names.
104
+ """
105
+ names: dict[str, None] = {}
106
+ for name in (*_dataclass_field_names(class_node), *_self_assigned_names(class_node)):
107
+ names.setdefault(name, None)
108
+ return tuple(names)
109
+
110
+
111
+ def nodes_of_class(tree: ast.AST, types: type[_T] | tuple[type[_T], ...]) -> Iterator[_T]:
112
+ """Yield all nodes (recursively, preorder DFS) that are instances of ``types``.
113
+
114
+ Args:
115
+ tree: The AST tree root.
116
+ types: Type or tuple of types to match.
117
+
118
+ Yields:
119
+ Nodes matching types.
120
+ """
121
+ stack = [tree]
122
+ while stack:
123
+ node = stack.pop()
124
+ if isinstance(node, types):
125
+ yield cast("_T", node)
126
+ # Push children in reverse order to visit them left-to-right
127
+ stack.extend(reversed(list(ast.iter_child_nodes(node))))
128
+
129
+
130
+ def scope_line_range(node: ast.AST) -> tuple[int, int]:
131
+ """Uniformly retrieve (lineno, end_lineno) for a node.
132
+
133
+ Args:
134
+ node: The AST node.
135
+
136
+ Returns:
137
+ A tuple of start and end line numbers.
138
+ """
139
+ if isinstance(node, ast.Module):
140
+ # A module's line number is 0 in the AST (matching astroid's
141
+ # ``Module.fromlineno`` and the ``<module>`` code object convention used
142
+ # by the instrumentation transformer), even though its body starts at 1.
143
+ if node.body:
144
+ return 0, node.body[-1].end_lineno or 0
145
+ return 0, 0
146
+ if isinstance(node, ast.match_case):
147
+ start = node.pattern.lineno
148
+ end = node.body[-1].end_lineno or start
149
+ return start, end
150
+ start = getattr(node, "lineno", 1)
151
+ end = getattr(node, "end_lineno", start) or start
152
+ return start, end
153
+
154
+
155
+ def scope_name(node: ast.AST) -> str:
156
+ """Retrieve name of a ScopeNode, matching astroid behavior.
157
+
158
+ Args:
159
+ node: The AST node representing the scope.
160
+
161
+ Returns:
162
+ The name of the scope.
163
+ """
164
+ if isinstance(node, ast.Module):
165
+ return ""
166
+ if isinstance(node, ast.Lambda):
167
+ return "<lambda>"
168
+ if isinstance(node, (ast.ListComp, ast.SetComp, ast.DictComp, ast.GeneratorExp)):
169
+ lineno = getattr(node, "lineno", 1)
170
+ return f"<generator-{lineno}>"
171
+ return getattr(node, "name", "")
@@ -140,6 +140,22 @@ class ConstantProvider(abc.ABC):
140
140
  A constant or None, if there is no constant # noqa: DAR202
141
141
  """
142
142
 
143
+ def get_all_constants_for(self, tp_: type[T]) -> OrderedSet[T]:
144
+ """Provide every constant value of the given type this provider knows.
145
+
146
+ Unlike :meth:`get_constant_for`, this ignores any per-provider selection
147
+ probability; it reports the full vocabulary reachable through this
148
+ provider. Used by generation strategies that need to inspect the pool
149
+ itself, e.g. to pick a plausible separator between seeded tokens.
150
+
151
+ Args:
152
+ tp_: The type to retrieve
153
+
154
+ Returns:
155
+ All constants of the given type; empty when there are none.
156
+ """
157
+ return OrderedSet()
158
+
143
159
 
144
160
  class EmptyConstantProvider(ConstantProvider):
145
161
  """Empty provider."""
@@ -169,6 +185,14 @@ class DelegatingConstantProvider(ConstantProvider, ABC):
169
185
  return self._pool.get_constant_for(tp_)
170
186
  return self._delegate.get_constant_for(tp_)
171
187
 
188
+ def get_all_constants_for(self, tp_: type[T]) -> OrderedSet[T]: # noqa: D102
189
+ delegated = self._delegate.get_all_constants_for(tp_)
190
+ if not delegated:
191
+ return self._pool.get_all_constants_for(tp_)
192
+ constants: OrderedSet[T] = OrderedSet(self._pool.get_all_constants_for(tp_))
193
+ constants.update(delegated)
194
+ return constants
195
+
172
196
 
173
197
  class DynamicConstantProvider(DelegatingConstantProvider):
174
198
  """Provide values collected during runtime."""
@@ -298,8 +322,16 @@ def collect_static_constants(
298
322
  exception,
299
323
  )
300
324
 
301
- # Check all modules discovered via packages
325
+ # Scope discovery to the top-level package(s) of the module(s) under test, so a
326
+ # project_path broader than the SUT (shared site-packages, monorepo, vendored deps)
327
+ # does not drown the SUT's constants in those of unrelated packages. With no module
328
+ # names known, fall back to all packages.
329
+ top_level_packages = {name.split(".")[0] for name in (module_names or ())}
330
+
331
+ # Check modules discovered via packages, scoped to the project when known
302
332
  for module in _find_modules_with_constants(project_path):
333
+ if top_level_packages and module.split("/")[0] not in top_level_packages:
334
+ continue
303
335
  _parse_file(path / module)
304
336
 
305
337
  # Check all modules explicitly specified
@@ -14,7 +14,14 @@ from abc import abstractmethod
14
14
  from collections import defaultdict
15
15
 
16
16
  import pynguin.configuration as config
17
- from pynguin.analyses.typesystem import AnyType, NoneType, ProperType, TypeSystem, is_primitive_type
17
+ from pynguin.analyses.typesystem import (
18
+ AnyType,
19
+ NoneType,
20
+ ProperType,
21
+ TupleType,
22
+ TypeSystem,
23
+ is_primitive_type,
24
+ )
18
25
  from pynguin.ga.operators.selection import Selectable, SelectionFunction
19
26
  from pynguin.utils.generic.genericaccessibleobject import (
20
27
  GenericAccessibleObject,
@@ -157,7 +164,18 @@ class HeuristicGeneratorFitnessFunction(GeneratorFitnessFunction):
157
164
  """
158
165
  return_type = generator.inferred_signature.return_type
159
166
  assert return_type is not None, "Return type must not be None for a type generator"
160
- return self._type_system.subtype_distance(to_generate, return_type)
167
+ dist = self._type_system.subtype_distance(to_generate, return_type)
168
+ if dist is not None:
169
+ return dist
170
+ if isinstance(return_type, TupleType) and not return_type.unknown_size:
171
+ min_dist: int | None = None
172
+ for elem_type in return_type.args:
173
+ d = self._type_system.subtype_distance(to_generate, elem_type)
174
+ if d is not None and (min_dist is None or d < min_dist):
175
+ min_dist = d
176
+ if min_dist is not None:
177
+ return min_dist + 1
178
+ return None
161
179
 
162
180
  def is_maximisation_function(self) -> bool: # noqa: D102
163
181
  return False
@@ -260,6 +278,23 @@ class GeneratorProvider:
260
278
  if isinstance(generated_type, NoneType) or generated_type.accept(is_primitive_type):
261
279
  return
262
280
  self._generators[generated_type].add(generator)
281
+ if isinstance(generated_type, TupleType) and not generated_type.unknown_size:
282
+ for elem_type in generated_type.args:
283
+ if isinstance(elem_type, NoneType) or elem_type.accept(is_primitive_type):
284
+ continue
285
+ self._generators[elem_type].add(generator)
286
+
287
+ def remove_generator(self, generator: GenericAccessibleObject) -> None:
288
+ """Remove a generator from all types it generates.
289
+
290
+ Args:
291
+ generator: The generator to remove.
292
+ """
293
+ for typ in list(self._generators.keys()):
294
+ gens = self._generators[typ]
295
+ gens.discard(generator)
296
+ if not gens:
297
+ del self._generators[typ]
263
298
 
264
299
  def get_all(self) -> dict[ProperType, OrderedSet[GenericAccessibleObject]]:
265
300
  """Get all generators."""
@@ -280,13 +315,18 @@ class GeneratorProvider:
280
315
  """
281
316
  return self._generators.get(proper_type, OrderedSet())
282
317
 
283
- def remove_all_generators_for(self, proper_type: ProperType) -> None:
284
- """Remove all generators for a specific type.
318
+ def get_generators_for(self, typ: ProperType) -> OrderedSet[GenericAccessibleObject]:
319
+ """Get all generators for a specific type including compatible subtypes.
285
320
 
286
321
  Args:
287
- proper_type: The type to remove the generators for.
322
+ typ: The type to get the generators for.
323
+
324
+ Returns:
325
+ The generators for the given type.
288
326
  """
289
- del self._generators[proper_type]
327
+ type_generators = self._get_generators_for(typ)
328
+ sorted_generators = self._sorted_generators(type_generators.freeze())
329
+ return OrderedSet(gen.generator for gen in sorted_generators)
290
330
 
291
331
  def add_for_type(
292
332
  self, proper_type: ProperType, generator: GenericCallableAccessibleObject
@@ -297,7 +337,14 @@ class GeneratorProvider:
297
337
  proper_type: The type to add the generators for.
298
338
  generator: The generator to add.
299
339
  """
340
+ if isinstance(proper_type, NoneType) or proper_type.accept(is_primitive_type):
341
+ return
300
342
  self._generators[proper_type].add(generator)
343
+ if isinstance(proper_type, TupleType) and not proper_type.unknown_size:
344
+ for elem_type in proper_type.args:
345
+ if isinstance(elem_type, NoneType) or elem_type.accept(is_primitive_type):
346
+ continue
347
+ self._generators[elem_type].add(generator)
301
348
 
302
349
  @functools.lru_cache(maxsize=1024)
303
350
  def _sorted_generators(
@@ -337,11 +384,17 @@ class GeneratorProvider:
337
384
  return OrderedSet()
338
385
 
339
386
  generators: OrderedSet[_Generator] = OrderedSet()
387
+ any_generators: OrderedSet[_Generator] = OrderedSet()
340
388
  for generated_typ in self.get_all_types():
341
389
  if (distance := self._type_system.subtype_distance(typ, generated_typ)) is not None:
342
- generators.update(self._get_for_type(generated_typ, distance))
390
+ if isinstance(generated_typ, AnyType):
391
+ any_generators.update(self._get_for_type(generated_typ, distance))
392
+ else:
393
+ generators.update(self._get_for_type(generated_typ, distance))
343
394
 
344
- return generators
395
+ if generators:
396
+ return generators
397
+ return any_generators
345
398
 
346
399
  @functools.lru_cache(maxsize=1024)
347
400
  def _get_for_type(self, typ: ProperType, distance: int) -> OrderedSet[_Generator]:
@@ -396,13 +449,21 @@ class RandomGeneratorProvider(GeneratorProvider):
396
449
  # Just take everything when it's Any.
397
450
  return self._get_all_generators(typ)
398
451
 
452
+ if typ.accept(is_primitive_type):
453
+ return OrderedSet()
454
+
399
455
  results: OrderedSet[GenericAccessibleObject] = OrderedSet()
456
+ any_results: OrderedSet[GenericAccessibleObject] = OrderedSet()
400
457
  for gen_type, generators in self.get_all().items():
401
458
  if self._type_system.is_maybe_subtype(gen_type, typ):
402
- results.update(generators)
459
+ if isinstance(gen_type, AnyType):
460
+ any_results.update(generators)
461
+ else:
462
+ results.update(generators)
403
463
 
464
+ matching = results or any_results
404
465
  return OrderedSet(
405
- _Generator(generator, typ, self._fitness_function) for generator in results
466
+ _Generator(generator, typ, self._fitness_function) for generator in matching
406
467
  )
407
468
 
408
469
  @functools.lru_cache(maxsize=0) # Required to avoid mypy error