pynguin 0.45.0__tar.gz → 0.46.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 (620) hide show
  1. {pynguin-0.45.0 → pynguin-0.46.0}/PKG-INFO +10 -7
  2. {pynguin-0.45.0 → pynguin-0.46.0}/README.md +9 -6
  3. {pynguin-0.45.0 → pynguin-0.46.0}/pyproject.toml +2 -1
  4. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/__version__.py +1 -1
  5. pynguin-0.46.0/src/pynguin/analyses/AGENTS.md +114 -0
  6. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/analyses/module.py +139 -34
  7. pynguin-0.46.0/src/pynguin/analyses/string_subtype_inference.py +120 -0
  8. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/analyses/type_inference.py +190 -18
  9. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/analyses/typesystem.py +1 -1
  10. pynguin-0.46.0/src/pynguin/assertion/AGENTS.md +205 -0
  11. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/assertion.py +21 -12
  12. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/assertion_to_ast.py +14 -1
  13. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/assertiongenerator.py +256 -18
  14. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/assertiontraceobserver.py +67 -10
  15. pynguin-0.46.0/src/pynguin/assertion/mutation_analysis/AGENTS.md +291 -0
  16. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/mutation_analysis/controller.py +5 -1
  17. pynguin-0.46.0/src/pynguin/assertion/mutation_analysis/mutators.py +290 -0
  18. pynguin-0.46.0/src/pynguin/assertion/mutation_analysis/operators/AGENTS.md +174 -0
  19. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/mutation_analysis/operators/__init__.py +16 -0
  20. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/mutation_analysis/operators/exception.py +43 -1
  21. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/mutation_analysis/operators/inheritance.py +8 -4
  22. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/mutation_analysis/operators/logical.py +33 -0
  23. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/mutation_analysis/operators/misc.py +200 -3
  24. pynguin-0.46.0/src/pynguin/assertion/mutation_analysis/operators/statement.py +70 -0
  25. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/configuration.py +85 -0
  26. pynguin-0.46.0/src/pynguin/ga/AGENTS.md +464 -0
  27. pynguin-0.46.0/src/pynguin/ga/algorithms/AGENTS.md +658 -0
  28. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/algorithms/archive.py +41 -6
  29. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/algorithms/llmosalgorithm.py +0 -1
  30. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/llmtestsuitechromosomefactory.py +1 -1
  31. pynguin-0.46.0/src/pynguin/ga/operators/AGENTS.md +157 -0
  32. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/postprocess.py +61 -13
  33. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/generator.py +216 -25
  34. pynguin-0.46.0/src/pynguin/instrumentation/AGENTS.md +377 -0
  35. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/instrumentation/tracer.py +24 -0
  36. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/instrumentation/transformer.py +50 -0
  37. pynguin-0.46.0/src/pynguin/instrumentation/version/AGENTS.md +77 -0
  38. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/instrumentation/version/python3_10.py +6 -0
  39. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/instrumentation/version/python3_11.py +7 -1
  40. pynguin-0.46.0/src/pynguin/large_language_model/AGENTS.md +219 -0
  41. pynguin-0.46.0/src/pynguin/large_language_model/helpers/AGENTS.md +38 -0
  42. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/helpers/testcasereferencecopier.py +3 -1
  43. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/llmagent.py +7 -3
  44. pynguin-0.46.0/src/pynguin/large_language_model/parsing/AGENTS.md +81 -0
  45. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/parsing/astscoping.py +5 -1
  46. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/parsing/deserializer.py +110 -48
  47. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/parsing/type_str_parser.py +33 -19
  48. pynguin-0.46.0/src/pynguin/large_language_model/prompts/AGENTS.md +77 -0
  49. pynguin-0.46.0/src/pynguin/large_language_model/prompts/base_inference_prompt.py +126 -0
  50. pynguin-0.46.0/src/pynguin/large_language_model/prompts/type_and_subtype_inference_prompt.py +147 -0
  51. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/prompts/typeinferenceprompt.py +3 -94
  52. pynguin-0.46.0/src/pynguin/master_worker/AGENTS.md +133 -0
  53. pynguin-0.46.0/src/pynguin/refinement/__init__.py +11 -0
  54. pynguin-0.46.0/src/pynguin/refinement/aaa_inserter.py +140 -0
  55. pynguin-0.46.0/src/pynguin/refinement/ast_analyzer.py +265 -0
  56. pynguin-0.46.0/src/pynguin/refinement/coverage_checker.py +345 -0
  57. pynguin-0.46.0/src/pynguin/refinement/llm_client.py +215 -0
  58. pynguin-0.46.0/src/pynguin/refinement/llm_judge.py +352 -0
  59. pynguin-0.46.0/src/pynguin/refinement/mutation_analyzer.py +440 -0
  60. pynguin-0.46.0/src/pynguin/refinement/pipeline.py +847 -0
  61. pynguin-0.46.0/src/pynguin/refinement/readability_metrics.py +117 -0
  62. pynguin-0.46.0/src/pynguin/refinement/refiner.py +421 -0
  63. pynguin-0.46.0/src/pynguin/refinement/sut_inspector.py +293 -0
  64. pynguin-0.46.0/src/pynguin/refinement/validator.py +79 -0
  65. pynguin-0.46.0/src/pynguin/resources/AGENTS.md +86 -0
  66. pynguin-0.46.0/src/pynguin/slicer/AGENTS.md +159 -0
  67. pynguin-0.46.0/src/pynguin/testcase/AGENTS.md +274 -0
  68. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/testcase/execution.py +74 -3
  69. pynguin-0.46.0/src/pynguin/testcase/export.py +587 -0
  70. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/testcase/testcase_to_ast.py +33 -4
  71. pynguin-0.46.0/src/pynguin/utils/AGENTS.md +354 -0
  72. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/controlflowdistance.py +2 -2
  73. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/execution_recorder.py +2 -1
  74. pynguin-0.46.0/src/pynguin/utils/generic/AGENTS.md +70 -0
  75. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/llm.py +9 -5
  76. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/namingscope.py +4 -1
  77. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/openai_key_resolver.py +56 -1
  78. pynguin-0.46.0/src/pynguin/utils/pynguinml/AGENTS.md +90 -0
  79. pynguin-0.46.0/src/pynguin/utils/statistics/AGENTS.md +129 -0
  80. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/statistics/runtimevariable.py +56 -3
  81. pynguin-0.46.0/tests/AGENTS.md +130 -0
  82. {pynguin-0.45.0 → pynguin-0.46.0}/tests/analyses/test_module.py +159 -4
  83. {pynguin-0.45.0 → pynguin-0.46.0}/tests/analyses/test_seeding.py +2 -1
  84. pynguin-0.46.0/tests/analyses/test_string_subtype_inference.py +257 -0
  85. pynguin-0.46.0/tests/assertion/AGENTS.md +225 -0
  86. pynguin-0.46.0/tests/assertion/mutation_analysis/operators/AGENTS.md +81 -0
  87. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/mutation_analysis/operators/test_exception.py +92 -0
  88. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/mutation_analysis/operators/test_inheritance.py +30 -0
  89. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/mutation_analysis/operators/test_logical.py +80 -0
  90. pynguin-0.46.0/tests/assertion/mutation_analysis/operators/test_misc.py +706 -0
  91. pynguin-0.46.0/tests/assertion/mutation_analysis/operators/test_statement.py +160 -0
  92. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/mutation_analysis/test_controller.py +4 -4
  93. pynguin-0.46.0/tests/assertion/mutation_analysis/test_mutators.py +287 -0
  94. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/test_assertion.py +9 -14
  95. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/test_assertion_generation_integration.py +265 -11
  96. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/test_assertion_to_ast.py +1 -2
  97. pynguin-0.46.0/tests/assertion/test_assertiongenerator.py +257 -0
  98. pynguin-0.46.0/tests/assertion/test_assertiontraceobserver.py +94 -0
  99. pynguin-0.46.0/tests/fixtures/AGENTS.md +123 -0
  100. pynguin-0.46.0/tests/fixtures/cluster/async_and_sync.py +12 -0
  101. pynguin-0.46.0/tests/fixtures/cluster/cached_function.py +12 -0
  102. pynguin-0.46.0/tests/fixtures/cluster/lazy_module_getattr.py +33 -0
  103. pynguin-0.46.0/tests/fixtures/cluster/visibility.py +40 -0
  104. pynguin-0.46.0/tests/fixtures/cluster/visibility_dependency.py +11 -0
  105. pynguin-0.46.0/tests/fixtures/examples/AGENTS.md +27 -0
  106. pynguin-0.46.0/tests/fixtures/instrumentation/AGENTS.md +49 -0
  107. pynguin-0.46.0/tests/fixtures/instrumentation/excluded_blocks.py +68 -0
  108. pynguin-0.46.0/tests/ga/AGENTS.md +170 -0
  109. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/algorithms/test_archive.py +133 -0
  110. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/algorithms/test_randomalgorithm.py +4 -1
  111. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/test_llmtestsuitechromosomefactory.py +18 -0
  112. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/test_postprocess.py +60 -1
  113. pynguin-0.46.0/tests/instrumentation/AGENTS.md +186 -0
  114. {pynguin-0.45.0 → pynguin-0.46.0}/tests/instrumentation/test_ast_info.py +156 -3
  115. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/helpers/test_testcasereferencecopier.py +7 -6
  116. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/parsing/test_astscoping.py +42 -0
  117. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/parsing/test_type_str_parser.py +28 -0
  118. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/test_llmagent.py +2 -0
  119. {pynguin-0.45.0 → pynguin-0.46.0}/tests/master_worker/test_client.py +0 -1
  120. pynguin-0.46.0/tests/refinement/test_aaa_inserter.py +107 -0
  121. pynguin-0.46.0/tests/refinement/test_ast_analyzer.py +109 -0
  122. pynguin-0.46.0/tests/refinement/test_coverage_checker.py +243 -0
  123. pynguin-0.46.0/tests/refinement/test_llm_client.py +199 -0
  124. pynguin-0.46.0/tests/refinement/test_llm_judge.py +206 -0
  125. pynguin-0.46.0/tests/refinement/test_mutation_analyzer.py +243 -0
  126. pynguin-0.46.0/tests/refinement/test_pipeline.py +853 -0
  127. pynguin-0.46.0/tests/refinement/test_readability_metrics.py +111 -0
  128. pynguin-0.46.0/tests/refinement/test_refiner.py +334 -0
  129. pynguin-0.46.0/tests/refinement/test_sut_inspector.py +85 -0
  130. pynguin-0.46.0/tests/refinement/test_validator.py +80 -0
  131. {pynguin-0.45.0 → pynguin-0.46.0}/tests/test_generator.py +95 -0
  132. pynguin-0.46.0/tests/testcase/AGENTS.md +235 -0
  133. pynguin-0.46.0/tests/testcase/execution/test_executionmocking.py +48 -0
  134. pynguin-0.46.0/tests/testcase/execution/test_outputsuppression.py +165 -0
  135. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/execution/test_subprocesstestcaseexecutor.py +7 -1
  136. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/export/test_export.py +288 -16
  137. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/test_ast_assign_statement.py +26 -24
  138. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/test_testcase_to_ast_integration.py +65 -0
  139. pynguin-0.46.0/tests/utils/stats/__init__.py +6 -0
  140. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_configuration_writer.py +54 -9
  141. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_fs_isolation.py +1 -1
  142. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_namingscope.py +5 -1
  143. pynguin-0.45.0/src/pynguin/assertion/mutation_analysis/mutators.py +0 -121
  144. pynguin-0.45.0/src/pynguin/testcase/export.py +0 -308
  145. pynguin-0.45.0/tests/assertion/mutation_analysis/operators/test_misc.py +0 -290
  146. pynguin-0.45.0/tests/assertion/mutation_analysis/test_mutators.py +0 -152
  147. pynguin-0.45.0/tests/assertion/test_assertiongenerator.py +0 -32
  148. pynguin-0.45.0/tests/assertion/test_assertiontraceobserver.py +0 -49
  149. pynguin-0.45.0/tests/testcase/execution/test_executionmocking.py +0 -0
  150. {pynguin-0.45.0 → pynguin-0.46.0}/LICENSE.rst +0 -0
  151. {pynguin-0.45.0 → pynguin-0.46.0}/LICENSES/Apache-2.0.txt +0 -0
  152. {pynguin-0.45.0 → pynguin-0.46.0}/LICENSES/BSD-2-Clause.txt +0 -0
  153. {pynguin-0.45.0 → pynguin-0.46.0}/LICENSES/CC-BY-4.0.txt +0 -0
  154. {pynguin-0.45.0 → pynguin-0.46.0}/LICENSES/CC0-1.0.txt +0 -0
  155. {pynguin-0.45.0 → pynguin-0.46.0}/LICENSES/MIT.txt +0 -0
  156. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/__init__.py +0 -0
  157. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/__main__.py +0 -0
  158. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/analyses/__init__.py +0 -0
  159. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/analyses/constants.py +0 -0
  160. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/analyses/generator.py +0 -0
  161. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/analyses/modulecomplexity.py +0 -0
  162. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/analyses/seeding.py +0 -0
  163. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/analyses/string_subtypes.py +0 -0
  164. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/analyses/syntaxtree.py +0 -0
  165. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/__init__.py +0 -0
  166. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/assertion_trace.py +0 -0
  167. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/llmassertiongenerator.py +0 -0
  168. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/mutation_analysis/__init__.py +0 -0
  169. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/mutation_analysis/operators/arithmetic.py +0 -0
  170. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/mutation_analysis/operators/base.py +0 -0
  171. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/mutation_analysis/operators/decorator.py +0 -0
  172. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/mutation_analysis/operators/loop.py +0 -0
  173. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/mutation_analysis/strategies.py +0 -0
  174. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/assertion/mutation_analysis/transformer.py +0 -0
  175. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/cli.py +0 -0
  176. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/__init__.py +0 -0
  177. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/algorithms/__init__.py +0 -0
  178. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/algorithms/abstractmosaalgorithm.py +0 -0
  179. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/algorithms/dynamosaalgorithm.py +0 -0
  180. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/algorithms/generationalgorithm.py +0 -0
  181. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/algorithms/mioalgorithm.py +0 -0
  182. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/algorithms/mosaalgorithm.py +0 -0
  183. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/algorithms/randomalgorithm.py +0 -0
  184. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/algorithms/randomsearchalgorithm.py +0 -0
  185. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/algorithms/wholesuitealgorithm.py +0 -0
  186. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/chromosome.py +0 -0
  187. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/chromosomefactory.py +0 -0
  188. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/chromosomevisitor.py +0 -0
  189. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/computations.py +0 -0
  190. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/coveragegoals.py +0 -0
  191. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/generationalgorithmfactory.py +0 -0
  192. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/operators/__init__.py +0 -0
  193. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/operators/comparator.py +0 -0
  194. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/operators/crossover.py +0 -0
  195. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/operators/ranking.py +0 -0
  196. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/operators/selection.py +0 -0
  197. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/searchobserver.py +0 -0
  198. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/stoppingcondition.py +0 -0
  199. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/testcasechromosome.py +0 -0
  200. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/testcasechromosomefactory.py +0 -0
  201. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/testcasefactory.py +0 -0
  202. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/testsuitechromosome.py +0 -0
  203. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/ga/testsuitechromosomefactory.py +0 -0
  204. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/instrumentation/__init__.py +0 -0
  205. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/instrumentation/controlflow.py +0 -0
  206. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/instrumentation/machinery.py +0 -0
  207. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/instrumentation/version/__init__.py +0 -0
  208. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/instrumentation/version/common.py +0 -0
  209. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/instrumentation/version/python3_12.py +0 -0
  210. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/instrumentation/version/python3_13.py +0 -0
  211. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/instrumentation/version/python3_14.py +0 -0
  212. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/__init__.py +0 -0
  213. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/caching.py +0 -0
  214. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/helpers/__init__.py +0 -0
  215. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/llmtestcasehandler.py +0 -0
  216. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/parsing/__init__.py +0 -0
  217. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/parsing/helpers.py +0 -0
  218. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/parsing/rewriter.py +0 -0
  219. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/prompts/__init__.py +0 -0
  220. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/prompts/assertiongenerationprompt.py +0 -0
  221. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/prompts/localsearchprompt.py +0 -0
  222. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/prompts/prompt.py +0 -0
  223. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/prompts/testcasegenerationprompt.py +0 -0
  224. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/large_language_model/prompts/uncoveredtargetsprompt.py +0 -0
  225. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/master_worker/__init__.py +0 -0
  226. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/master_worker/client.py +0 -0
  227. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/master_worker/master.py +0 -0
  228. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/master_worker/worker.py +0 -0
  229. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/__init__.py +0 -0
  230. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/coverage-template.html +0 -0
  231. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/__init__.py +0 -0
  232. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/camel_case.fan +0 -0
  233. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/colour.fan +0 -0
  234. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/csv.fan +0 -0
  235. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/delimited.fan +0 -0
  236. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/email.fan +0 -0
  237. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/faker/__init__.py +0 -0
  238. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/faker/camel_case.fan +0 -0
  239. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/faker/colour.fan +0 -0
  240. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/faker/csv.fan +0 -0
  241. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/faker/delimited.fan +0 -0
  242. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/faker/email.fan +0 -0
  243. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/faker/ipv4.fan +0 -0
  244. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/faker/standard_date.fan +0 -0
  245. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/faker/unix_path.fan +0 -0
  246. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/faker/xml.fan +0 -0
  247. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/ipv4.fan +0 -0
  248. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/numeric.fan +0 -0
  249. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/standard_date.fan +0 -0
  250. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/unix_path.fan +0 -0
  251. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/resources/fans/xml.fan +0 -0
  252. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/slicer/__init__.py +0 -0
  253. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/slicer/dynamicslicer.py +0 -0
  254. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/slicer/executedinstruction.py +0 -0
  255. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/slicer/executionflowbuilder.py +0 -0
  256. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/slicer/stack/__init__.py +0 -0
  257. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/slicer/stack/stacksimulation.py +0 -0
  258. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/slicer/statementslicingobserver.py +0 -0
  259. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/testcase/__init__.py +0 -0
  260. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/testcase/defaulttestcase.py +0 -0
  261. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/testcase/llmlocalsearch.py +0 -0
  262. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/testcase/localsearch.py +0 -0
  263. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/testcase/localsearchobjective.py +0 -0
  264. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/testcase/localsearchstatement.py +0 -0
  265. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/testcase/localsearchtimer.py +0 -0
  266. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/testcase/statement.py +0 -0
  267. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/testcase/statement_to_ast.py +0 -0
  268. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/testcase/testcase.py +0 -0
  269. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/testcase/testcasevisitor.py +0 -0
  270. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/testcase/testfactory.py +0 -0
  271. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/testcase/variablereference.py +0 -0
  272. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/__init__.py +0 -0
  273. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/ast_util.py +0 -0
  274. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/atomicinteger.py +0 -0
  275. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/collection_utils.py +0 -0
  276. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/configuration_writer.py +0 -0
  277. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/exceptions.py +0 -0
  278. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/fandango_faker_utils.py +0 -0
  279. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/fs_isolation.py +0 -0
  280. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/generic/__init__.py +0 -0
  281. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/generic/genericaccessibleobject.py +0 -0
  282. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/logging_utils.py +0 -0
  283. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/mirror.py +0 -0
  284. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/mutation_utils.py +0 -0
  285. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/orderedset.py +0 -0
  286. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/pynguinml/__init__.py +0 -0
  287. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/pynguinml/ml_parsing_utils.py +0 -0
  288. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/pynguinml/ml_testfactory_utils.py +0 -0
  289. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/pynguinml/ml_testing_resources.py +0 -0
  290. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/pynguinml/mlparameter.py +0 -0
  291. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/pynguinml/np_rng.py +0 -0
  292. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/randomness.py +0 -0
  293. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/report.py +0 -0
  294. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/statistics/__init__.py +0 -0
  295. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/statistics/outputvariablefactory.py +0 -0
  296. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/statistics/statisticsbackend.py +0 -0
  297. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/statistics/statisticsobserver.py +0 -0
  298. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/statistics/stats.py +0 -0
  299. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/type_utils.py +0 -0
  300. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/typeevalpy_json_schema.py +0 -0
  301. {pynguin-0.45.0 → pynguin-0.46.0}/src/pynguin/utils/typetracing.py +0 -0
  302. {pynguin-0.45.0 → pynguin-0.46.0}/tests/__init__.py +0 -0
  303. {pynguin-0.45.0 → pynguin-0.46.0}/tests/analyses/__init__.py +0 -0
  304. {pynguin-0.45.0 → pynguin-0.46.0}/tests/analyses/test_constants.py +0 -0
  305. {pynguin-0.45.0 → pynguin-0.46.0}/tests/analyses/test_initialpopulationseeding.py +0 -0
  306. {pynguin-0.45.0 → pynguin-0.46.0}/tests/analyses/test_modulecomplexity.py +0 -0
  307. {pynguin-0.45.0 → pynguin-0.46.0}/tests/analyses/test_staticconstantseeding.py +0 -0
  308. {pynguin-0.45.0 → pynguin-0.46.0}/tests/analyses/test_string_subtypes.py +0 -0
  309. {pynguin-0.45.0 → pynguin-0.46.0}/tests/analyses/test_syntaxtree.py +0 -0
  310. {pynguin-0.45.0 → pynguin-0.46.0}/tests/analyses/test_type_inference.py +0 -0
  311. {pynguin-0.45.0 → pynguin-0.46.0}/tests/analyses/test_typesystem.py +0 -0
  312. {pynguin-0.45.0 → pynguin-0.46.0}/tests/analyses/test_typesystem_string_subtypes.py +0 -0
  313. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/__init__.py +0 -0
  314. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/mutation_analysis/__init__.py +0 -0
  315. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/mutation_analysis/operators/__init__.py +0 -0
  316. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/mutation_analysis/operators/test_arithmetic.py +0 -0
  317. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/mutation_analysis/operators/test_decorator.py +0 -0
  318. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/mutation_analysis/operators/test_loop.py +0 -0
  319. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/mutation_analysis/test_strategies.py +0 -0
  320. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/test_assertion_trace.py +0 -0
  321. {pynguin-0.45.0 → pynguin-0.46.0}/tests/assertion/test_llmassertiongenerator.py +0 -0
  322. {pynguin-0.45.0 → pynguin-0.46.0}/tests/conftest.py +0 -0
  323. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/__init__.py +0 -0
  324. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/accessibles/__init__.py +0 -0
  325. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/accessibles/accessible.py +0 -0
  326. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/branchcoverage/__init__.py +0 -0
  327. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/branchcoverage/nestedbranches.py +0 -0
  328. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/branchcoverage/nobranches.py +0 -0
  329. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/branchcoverage/simplenesting.py +0 -0
  330. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/branchcoverage/singlebranches.py +0 -0
  331. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/branchcoverage/twomethodsinglebranches.py +0 -0
  332. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/c/__init__.py +0 -0
  333. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/c/my_ctypes.py +0 -0
  334. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/__init__.py +0 -0
  335. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/abstract.py +0 -0
  336. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/alias_module.py +0 -0
  337. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/async_class_gen.py +0 -0
  338. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/async_class_method.py +0 -0
  339. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/async_func.py +0 -0
  340. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/async_gen.py +0 -0
  341. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/attributes.py +0 -0
  342. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/blacklist.py +0 -0
  343. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/blacklist_transitive.py +0 -0
  344. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/comments.py +0 -0
  345. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/complex_dependencies.py +0 -0
  346. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/complex_dependency.py +0 -0
  347. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/conditional_import.py +0 -0
  348. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/dependency.py +0 -0
  349. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/diamond_bottom.py +0 -0
  350. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/diamond_left.py +0 -0
  351. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/diamond_right.py +0 -0
  352. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/diamond_top.py +0 -0
  353. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/enums.py +0 -0
  354. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/import_dependency.py +0 -0
  355. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/inheritance.py +0 -0
  356. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/lambda.py +0 -0
  357. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/nested_functions.py +0 -0
  358. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/no_any_annotations.py +0 -0
  359. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/no_dependencies.py +0 -0
  360. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/overridden_inherited_methods.py +0 -0
  361. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/simple_dependencies.py +0 -0
  362. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/typing_parameters.py +0 -0
  363. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/cluster/uses_async_dependency.py +0 -0
  364. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/crash/__init__.py +0 -0
  365. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/crash/partly_crashing.py +0 -0
  366. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/crash/seg_fault.py +0 -0
  367. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/duckmock/__init__.py +0 -0
  368. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/duckmock/complex.py +0 -0
  369. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/errors/__init__.py +0 -0
  370. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/errors/import_error.py +0 -0
  371. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/__init__.py +0 -0
  372. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/assertions.py +0 -0
  373. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/basket.py +0 -0
  374. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/calculator.py +0 -0
  375. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/calculator_simple.py +0 -0
  376. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/collections.py +0 -0
  377. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/constructors.py +0 -0
  378. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/difficult.py +0 -0
  379. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/dummies.py +0 -0
  380. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/dynamosa_example.py +0 -0
  381. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/enums.py +0 -0
  382. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/exceptions.py +0 -0
  383. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/flaky.py +0 -0
  384. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/impossible.py +0 -0
  385. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/inheritance.py +0 -0
  386. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/loop.py +0 -0
  387. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/module_alias.py +0 -0
  388. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/monkey.py +0 -0
  389. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/nested.py +0 -0
  390. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/objects.py +0 -0
  391. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/private_methods.py +0 -0
  392. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/queue.py +0 -0
  393. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/simple.py +0 -0
  394. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/triangle.py +0 -0
  395. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/type_inference.py +0 -0
  396. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/type_tracing/__init__.py +0 -0
  397. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/type_tracing/geometry.py +0 -0
  398. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/type_tracing/invoice.py +0 -0
  399. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/type_tracing/large_test_cluster.py +0 -0
  400. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/type_tracing/mixed.py +0 -0
  401. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/type_tracing/string_subtype.py +0 -0
  402. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/examples/unasserted_exceptions.py +0 -0
  403. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/grammar/__init__.py +0 -0
  404. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/grammar/parameters.py +0 -0
  405. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/instrumentation/__init__.py +0 -0
  406. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/instrumentation/comparison.py +0 -0
  407. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/instrumentation/covered_branches.py +0 -0
  408. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/instrumentation/covered_classes.py +0 -0
  409. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/instrumentation/covered_functions.py +0 -0
  410. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/instrumentation/covered_lines.py +0 -0
  411. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/instrumentation/inherited.py +0 -0
  412. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/instrumentation/mixed.py +0 -0
  413. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/instrumentation/simple.py +0 -0
  414. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/linecoverage/__init__.py +0 -0
  415. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/linecoverage/artificial_none.py +0 -0
  416. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/linecoverage/emptyfile.py +0 -0
  417. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/linecoverage/exception.py +0 -0
  418. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/linecoverage/list.py +0 -0
  419. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/linecoverage/plus.py +0 -0
  420. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/linecoverage/setter_getter.py +0 -0
  421. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/mutation/__init__.py +0 -0
  422. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/mutation/exception.py +0 -0
  423. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/mutation/expected.py +0 -0
  424. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/mutation/mutation.py +0 -0
  425. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/mutation/timeout.py +0 -0
  426. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/programgraph/__init__.py +0 -0
  427. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/programgraph/samples.py +0 -0
  428. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/programgraph/whileloop.py +0 -0
  429. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/programgraph/yield_fun.py +0 -0
  430. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/regression/__init__.py +0 -0
  431. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/regression/argparse_sys_exit.py +0 -0
  432. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/regression/custom_error.py +0 -0
  433. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/regression/not_main.py +0 -0
  434. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/__init__.py +0 -0
  435. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/dynamicseeding/__init__.py +0 -0
  436. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/dynamicseeding/dynamicseedingdummies.py +0 -0
  437. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/initialpopulationseeding/__init__.py +0 -0
  438. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/initialpopulationseeding/dummycontainer.py +0 -0
  439. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/__init__.py +0 -0
  440. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/assertseed_test_.py +0 -0
  441. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/classseed_test_.py +0 -0
  442. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collfuncseed_test_.py +0 -0
  443. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collseed_test_.py +0 -0
  444. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/nestedseed_test_.py +0 -0
  445. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notknowncall_test_.py +0 -0
  446. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notprimseed_test_.py +0 -0
  447. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/primitiveseed_test_.py +0 -0
  448. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/triangleseed_test_.py +0 -0
  449. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongassignseed_test_.py +0 -0
  450. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongfunctionnameseed_test_.py +0 -0
  451. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/staticconstantseeding/__init__.py +0 -0
  452. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/staticconstantseeding/dummy/__init__.py +0 -0
  453. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/staticconstantseeding/dummy/dummy.py +0 -0
  454. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/seeding/staticconstantseeding/dummy/empty.so +0 -0
  455. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/slicer/__init__.py +0 -0
  456. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/slicer/attribute_dependencies.py +0 -0
  457. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/slicer/closure.py +0 -0
  458. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/slicer/generator.py +0 -0
  459. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/slicer/immutable_attribute_dependency.py +0 -0
  460. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/slicer/import_star_def.py +0 -0
  461. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/slicer/import_star_main.py +0 -0
  462. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/slicer/partial_cover_dependency.py +0 -0
  463. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/slicer/simple_call.py +0 -0
  464. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/slicer/simple_call_arg.py +0 -0
  465. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/test.conf +0 -0
  466. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/test.conf.license +0 -0
  467. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/tests/typeinference/test_stubstrategy.pyi +0 -0
  468. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/type_tracing/__init__.py +0 -0
  469. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/type_tracing/guess_params.py +0 -0
  470. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/type_tracing/return_types.py +0 -0
  471. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/type_tracing/union_type.py +0 -0
  472. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/types/__init__.py +0 -0
  473. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/types/outside.py +0 -0
  474. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/types/subtyping.py +0 -0
  475. {pynguin-0.45.0 → pynguin-0.46.0}/tests/fixtures/types/symbols.py +0 -0
  476. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/__init__.py +0 -0
  477. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/algorithms/__init__.py +0 -0
  478. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/algorithms/test_dynamosaalgorithm.py +0 -0
  479. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/algorithms/test_generationalgorithm.py +0 -0
  480. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/algorithms/test_integration_mosaalgorithm.py +0 -0
  481. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/algorithms/test_integration_varioussearchalgorithms.py +0 -0
  482. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/algorithms/test_llmosalgorithm.py +0 -0
  483. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/algorithms/test_mioalgorithm.py +0 -0
  484. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/algorithms/test_mosaalgorithm.py +0 -0
  485. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/operators/__init__.py +0 -0
  486. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/operators/crossover/__init__.py +0 -0
  487. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/operators/crossover/test_singlepointrelativecrossover.py +0 -0
  488. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/operators/ranking/__init__.py +0 -0
  489. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/operators/ranking/test_rankingfunction.py +0 -0
  490. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/operators/selection/__init__.py +0 -0
  491. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/operators/selection/test_randomselection.py +0 -0
  492. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/operators/selection/test_rankselection.py +0 -0
  493. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/operators/selection/test_selection.py +0 -0
  494. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/operators/selection/test_tournamentselection.py +0 -0
  495. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/operators/test_dominancecomparator.py +0 -0
  496. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/operators/test_preferencesortingcomparator.py +0 -0
  497. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/stoppingconditions/__init__.py +0 -0
  498. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/stoppingconditions/test_coverageplateaustoppingcondition.py +0 -0
  499. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/stoppingconditions/test_maxcoveragestoppingcondition.py +0 -0
  500. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/stoppingconditions/test_maxiterationsstoppingcondition.py +0 -0
  501. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/stoppingconditions/test_maxmemorystoppingcondition.py +0 -0
  502. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/stoppingconditions/test_maxstatementstoppingcondition.py +0 -0
  503. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/stoppingconditions/test_maxtestsstoppingcondition.py +0 -0
  504. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/stoppingconditions/test_maxtimestoppingcondition.py +0 -0
  505. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/stoppingconditions/test_minimumcoverageplateaustoppingcondition.py +0 -0
  506. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/stoppingconditions/test_stoppingcondition.py +0 -0
  507. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/test_chromosome.py +0 -0
  508. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/test_chromosomefactory.py +0 -0
  509. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/test_computations.py +0 -0
  510. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/test_computations_cache.py +0 -0
  511. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/test_computations_fitness_utilities.py +0 -0
  512. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/test_coveragegoals.py +0 -0
  513. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/test_generationalgorithmfactory.py +0 -0
  514. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/test_generator.py +0 -0
  515. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/test_testcasechromosome.py +0 -0
  516. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/test_testcasefactory.py +0 -0
  517. {pynguin-0.45.0 → pynguin-0.46.0}/tests/ga/test_testsuitechromosome.py +0 -0
  518. {pynguin-0.45.0 → pynguin-0.46.0}/tests/instrumentation/__init__.py +0 -0
  519. {pynguin-0.45.0 → pynguin-0.46.0}/tests/instrumentation/test_adapters.py +0 -0
  520. {pynguin-0.45.0 → pynguin-0.46.0}/tests/instrumentation/test_cfg.py +0 -0
  521. {pynguin-0.45.0 → pynguin-0.46.0}/tests/instrumentation/test_controldependencegraph.py +0 -0
  522. {pynguin-0.45.0 → pynguin-0.46.0}/tests/instrumentation/test_machinery.py +0 -0
  523. {pynguin-0.45.0 → pynguin-0.46.0}/tests/instrumentation/test_programgraph.py +0 -0
  524. {pynguin-0.45.0 → pynguin-0.46.0}/tests/instrumentation/test_tracer.py +0 -0
  525. {pynguin-0.45.0 → pynguin-0.46.0}/tests/instrumentation/test_version.py +0 -0
  526. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/__init__.py +0 -0
  527. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/parsing/test_helpers.py +0 -0
  528. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/prompts/__init__.py +0 -0
  529. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/prompts/test_assertiongenerationprompt.py +0 -0
  530. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/prompts/test_testcasegenerationprompt.py +0 -0
  531. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/prompts/test_uncovered_targets_prompt.py +0 -0
  532. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/test_caching.py +0 -0
  533. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/test_llm_caching.py +0 -0
  534. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/test_llm_deserializer.py +0 -0
  535. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/test_llmagent_extended.py +0 -0
  536. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/test_llmtestcasehandler.py +0 -0
  537. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/test_llmtestcasehandler_coverage.py +0 -0
  538. {pynguin-0.45.0 → pynguin-0.46.0}/tests/large_language_model/test_rewriter.py +0 -0
  539. {pynguin-0.45.0 → pynguin-0.46.0}/tests/master_worker/__init__.py +0 -0
  540. {pynguin-0.45.0 → pynguin-0.46.0}/tests/master_worker/test_master.py +0 -0
  541. {pynguin-0.45.0 → pynguin-0.46.0}/tests/master_worker/test_worker.py +0 -0
  542. {pynguin-0.45.0/tests/slicer → pynguin-0.46.0/tests/refinement}/__init__.py +0 -0
  543. {pynguin-0.45.0 → pynguin-0.46.0}/tests/resources/__init__.py +0 -0
  544. {pynguin-0.45.0 → pynguin-0.46.0}/tests/resources/typeevalpy/__init__.py +0 -0
  545. {pynguin-0.45.0 → pynguin-0.46.0}/tests/resources/typeevalpy/dummy.py +0 -0
  546. {pynguin-0.45.0 → pynguin-0.46.0}/tests/resources/typeevalpy/dummy_gt.json +0 -0
  547. {pynguin-0.45.0 → pynguin-0.46.0}/tests/resources/typeevalpy/dummy_gt.json.license +0 -0
  548. {pynguin-0.45.0/tests/testcase → pynguin-0.46.0/tests/slicer}/__init__.py +0 -0
  549. {pynguin-0.45.0 → pynguin-0.46.0}/tests/slicer/test_assertionslicer.py +0 -0
  550. {pynguin-0.45.0 → pynguin-0.46.0}/tests/slicer/test_dependencies.py +0 -0
  551. {pynguin-0.45.0 → pynguin-0.46.0}/tests/slicer/test_expected_failures.py +0 -0
  552. {pynguin-0.45.0 → pynguin-0.46.0}/tests/slicer/test_language_features.py +0 -0
  553. {pynguin-0.45.0 → pynguin-0.46.0}/tests/slicer/test_statementslicer.py +0 -0
  554. {pynguin-0.45.0 → pynguin-0.46.0}/tests/slicer/util.py +0 -0
  555. {pynguin-0.45.0 → pynguin-0.46.0}/tests/test___main__.py +0 -0
  556. {pynguin-0.45.0 → pynguin-0.46.0}/tests/test_cli.py +0 -0
  557. {pynguin-0.45.0/tests/testcase/execution → pynguin-0.46.0/tests/testcase}/__init__.py +0 -0
  558. {pynguin-0.45.0/tests/testcase/export → pynguin-0.46.0/tests/testcase/execution}/__init__.py +0 -0
  559. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/execution/test_executedinstruction.py +0 -0
  560. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/execution/test_executioncontext.py +0 -0
  561. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/execution/test_executionresult.py +0 -0
  562. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/execution/test_executiontrace.py +0 -0
  563. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/execution/test_moduleprovider.py +0 -0
  564. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/execution/test_subprocesstestcaseexecutor_differential.py +0 -0
  565. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/execution/test_subprocesstestcaseexecutor_integration.py +0 -0
  566. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/execution/test_testcaseexecutor_integration.py +0 -0
  567. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/execution/test_typetracing.py +0 -0
  568. {pynguin-0.45.0/tests/testcase/statements → pynguin-0.46.0/tests/testcase/export}/__init__.py +0 -0
  569. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/export/conftest.py +0 -0
  570. {pynguin-0.45.0/tests/testcase/variable → pynguin-0.46.0/tests/testcase/statements}/__init__.py +0 -0
  571. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/statements/test_assignmentstatement.py +0 -0
  572. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/statements/test_collectionstatements.py +0 -0
  573. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/statements/test_fieldstatement.py +0 -0
  574. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/statements/test_parameterizedstatements.py +0 -0
  575. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/statements/test_primitivestatements.py +0 -0
  576. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/test_benchmark.py +0 -0
  577. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/test_defaulttestcase.py +0 -0
  578. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/test_llmlocalsearch.py +0 -0
  579. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/test_localsearch.py +0 -0
  580. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/test_localsearchtimer.py +0 -0
  581. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/test_statement_to_ast.py +0 -0
  582. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/test_testcase_integration.py +0 -0
  583. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/test_testfactory.py +0 -0
  584. {pynguin-0.45.0/tests/utils → pynguin-0.46.0/tests/testcase/variable}/__init__.py +0 -0
  585. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testcase/variable/test_variablereference.py +0 -0
  586. {pynguin-0.45.0 → pynguin-0.46.0}/tests/testutils.py +0 -0
  587. {pynguin-0.45.0/tests/utils/generic → pynguin-0.46.0/tests/utils}/__init__.py +0 -0
  588. {pynguin-0.45.0/tests/utils/pynguinml → pynguin-0.46.0/tests/utils/generic}/__init__.py +0 -0
  589. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/generic/test_genericaccessibleobject.py +0 -0
  590. {pynguin-0.45.0/tests/utils/stats → pynguin-0.46.0/tests/utils/pynguinml}/__init__.py +0 -0
  591. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/pynguinml/test_ml_parsing_utils.py +0 -0
  592. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/pynguinml/test_ml_testfactory_utils.py +0 -0
  593. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/pynguinml/test_ml_testing_resources.py +0 -0
  594. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/pynguinml/test_mlparameter.py +0 -0
  595. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/pynguinml/test_np_rng.py +0 -0
  596. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/pynguinml/test_pynguinml_integration.py +0 -0
  597. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/stats/test_outputvariablefactory.py +0 -0
  598. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/stats/test_runtimevariable.py +0 -0
  599. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/stats/test_searchstatistics.py +0 -0
  600. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/stats/test_statistics.py +0 -0
  601. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/stats/test_statisticsbackend.py +0 -0
  602. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_atomicinteger.py +0 -0
  603. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_collection_utils.py +0 -0
  604. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_controlflowdistance.py +0 -0
  605. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_exceptions.py +0 -0
  606. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_execution_recorder.py +0 -0
  607. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_fandango_faker_utils.py +0 -0
  608. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_llm.py +0 -0
  609. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_logging_utils.py +0 -0
  610. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_mirror.py +0 -0
  611. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_mutation_utils.py +0 -0
  612. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_orderedset.py +0 -0
  613. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_randomness.py +0 -0
  614. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_report.py +0 -0
  615. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_string_subtype_integration.py +0 -0
  616. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_type_utils.py +0 -0
  617. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_typeevalpy_integration.py +0 -0
  618. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_typeevalpy_json_schema.py +0 -0
  619. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/test_typetracing.py +0 -0
  620. {pynguin-0.45.0 → pynguin-0.46.0}/tests/utils/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pynguin
3
- Version: 0.45.0
3
+ Version: 0.46.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
@@ -82,7 +82,7 @@ is a tool that allows developers to generate unit tests automatically.
82
82
  Testing software is often considered to be a tedious task.
83
83
  Thus, automated generation techniques have been proposed and mature tools exist—for
84
84
  statically typed languages, such as Java.
85
- There is, however, no fully-automated tool available that produces unit tests for
85
+ There is, however, no fully automated tool available that produces unit tests for
86
86
  general-purpose programs in a dynamically typed language.
87
87
  Pynguin is, to the best of our knowledge, the first tool that fills this gap
88
88
  and allows the automated generation of unit tests for Python programs.
@@ -129,7 +129,7 @@ please report your experiences in using Pynguin to us.
129
129
  ## Prerequisites
130
130
 
131
131
  Before you begin, ensure you have met the following requirements:
132
- - You have installed Python 3.10 (the support for 3.11, 3.12, 3.13 and 3.14 is experimental).
132
+ - You have installed Python 3.10 (the support for 3.11, 3.12, 3.13, and 3.14 is experimental).
133
133
 
134
134
  **Attention:** Pynguin now requires at least Python 3.10! Older versions are no longer
135
135
  supported!
@@ -190,13 +190,16 @@ Pynguin is developed at the
190
190
  [Chair of Software Engineering II](https://www.fim.uni-passau.de/lehrstuhl-fuer-software-engineering-ii/)
191
191
  of the [University of Passau](https://www.uni-passau.de).
192
192
 
193
- Maintainers: [Stephan Lukasczyk](https://github.com/stephanlukasczyk), [Lukas Krodinger](https://github.com/LuKrO2011)
193
+ Maintainer: [Lukas Krodinger](https://github.com/LuKrO2011)
194
+
195
+ Former Maintainer: [Stephan Lukasczyk](https://codeberg.org/stephanlukasczyk)
194
196
 
195
197
  Contributors:
196
198
  - [Lukas Vögl](https://github.com/lvoegl)
197
199
  - [Louis Leppelmann](https://github.com/Tudeldu)
198
200
  - [Alexander Wüst](https://github.com/Ravaqor)
199
201
  - [Altin Hajdari](https://github.com/AltinHajdari)
202
+ - [Ahmed Abidi](https://github.com/AhmedHedi0)
200
203
  - [Abdelillah Aissani](https://github.com/Abassion)
201
204
  - [Juan Altmayer Pizzorno](https://github.com/jaltmayerpizzorno)
202
205
  - [Lucas Berg](https://github.com/BergLucas)
@@ -215,9 +218,9 @@ Contributors:
215
218
 
216
219
  ### Development using PyCharm.
217
220
 
218
- If you want to use the PyCharm IDE you have to set up a few things:
221
+ If you want to use the PyCharm IDE, you have to set up a few things:
219
222
  1. Import `pynguin` into PyCharm.
220
- 2. Let PyCharm configure configure a virtual environment using `poetry`.
223
+ 2. Let PyCharm configure a virtual environment using `poetry`.
221
224
  3. Set the default test runner to `pytest`
222
225
  4. Set the DocString format to `Google`
223
226
 
@@ -226,7 +229,7 @@ If you want to use the PyCharm IDE you have to set up a few things:
226
229
 
227
230
  This project is licensed under the terms of the [MIT License](LICENSE.rst).
228
231
  Pynguin was using the GNU Lesser General Public License (LGPL) until version 0.29.0,
229
- its licence was changed with version 0.30.0.
232
+ its license was changed with version 0.30.0.
230
233
 
231
234
  ## Star History
232
235
 
@@ -18,7 +18,7 @@ is a tool that allows developers to generate unit tests automatically.
18
18
  Testing software is often considered to be a tedious task.
19
19
  Thus, automated generation techniques have been proposed and mature tools exist—for
20
20
  statically typed languages, such as Java.
21
- There is, however, no fully-automated tool available that produces unit tests for
21
+ There is, however, no fully automated tool available that produces unit tests for
22
22
  general-purpose programs in a dynamically typed language.
23
23
  Pynguin is, to the best of our knowledge, the first tool that fills this gap
24
24
  and allows the automated generation of unit tests for Python programs.
@@ -65,7 +65,7 @@ please report your experiences in using Pynguin to us.
65
65
  ## Prerequisites
66
66
 
67
67
  Before you begin, ensure you have met the following requirements:
68
- - You have installed Python 3.10 (the support for 3.11, 3.12, 3.13 and 3.14 is experimental).
68
+ - You have installed Python 3.10 (the support for 3.11, 3.12, 3.13, and 3.14 is experimental).
69
69
 
70
70
  **Attention:** Pynguin now requires at least Python 3.10! Older versions are no longer
71
71
  supported!
@@ -126,13 +126,16 @@ Pynguin is developed at the
126
126
  [Chair of Software Engineering II](https://www.fim.uni-passau.de/lehrstuhl-fuer-software-engineering-ii/)
127
127
  of the [University of Passau](https://www.uni-passau.de).
128
128
 
129
- Maintainers: [Stephan Lukasczyk](https://github.com/stephanlukasczyk), [Lukas Krodinger](https://github.com/LuKrO2011)
129
+ Maintainer: [Lukas Krodinger](https://github.com/LuKrO2011)
130
+
131
+ Former Maintainer: [Stephan Lukasczyk](https://codeberg.org/stephanlukasczyk)
130
132
 
131
133
  Contributors:
132
134
  - [Lukas Vögl](https://github.com/lvoegl)
133
135
  - [Louis Leppelmann](https://github.com/Tudeldu)
134
136
  - [Alexander Wüst](https://github.com/Ravaqor)
135
137
  - [Altin Hajdari](https://github.com/AltinHajdari)
138
+ - [Ahmed Abidi](https://github.com/AhmedHedi0)
136
139
  - [Abdelillah Aissani](https://github.com/Abassion)
137
140
  - [Juan Altmayer Pizzorno](https://github.com/jaltmayerpizzorno)
138
141
  - [Lucas Berg](https://github.com/BergLucas)
@@ -151,9 +154,9 @@ Contributors:
151
154
 
152
155
  ### Development using PyCharm.
153
156
 
154
- If you want to use the PyCharm IDE you have to set up a few things:
157
+ If you want to use the PyCharm IDE, you have to set up a few things:
155
158
  1. Import `pynguin` into PyCharm.
156
- 2. Let PyCharm configure configure a virtual environment using `poetry`.
159
+ 2. Let PyCharm configure a virtual environment using `poetry`.
157
160
  3. Set the default test runner to `pytest`
158
161
  4. Set the DocString format to `Google`
159
162
 
@@ -162,7 +165,7 @@ If you want to use the PyCharm IDE you have to set up a few things:
162
165
 
163
166
  This project is licensed under the terms of the [MIT License](LICENSE.rst).
164
167
  Pynguin was using the GNU Lesser General Public License (LGPL) until version 0.29.0,
165
- its licence was changed with version 0.30.0.
168
+ its license was changed with version 0.30.0.
166
169
 
167
170
  ## Star History
168
171
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  [tool.poetry]
6
6
  name = "pynguin"
7
- version = "0.45.0"
7
+ version = "0.46.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>",
@@ -99,6 +99,7 @@ pytest-cov = "^6.1.1"
99
99
  pytest-mock = "^3.14.0"
100
100
  pytest-picked = "^0.5.1"
101
101
  pytest-sugar = "^1.0.0"
102
+ pytest-xdist = "^3.6.0"
102
103
 
103
104
  [tool.poetry.extras]
104
105
  openai = [ "openai", "python-dotenv" ]
@@ -6,4 +6,4 @@
6
6
  #
7
7
  """Specifies the version of Pynguin."""
8
8
 
9
- __version__ = "0.45.0"
9
+ __version__ = "0.46.0"
@@ -0,0 +1,114 @@
1
+ <!--
2
+ SPDX-FileCopyrightText: 2019–2026 Pynguin Contributors
3
+
4
+ SPDX-License-Identifier: CC-BY-4.0
5
+ -->
6
+
7
+ # Analyses Module
8
+
9
+ <!-- Parent: ../AGENTS.md -->
10
+
11
+ The `analyses/` directory contains static analysis components for subject program understanding, including module analysis, type inference, and test cluster generation.
12
+
13
+ ## Overview
14
+
15
+ This module performs comprehensive program analysis to:
16
+ - Build test clusters from subject program callables
17
+ - Perform type inference on generic types
18
+ - Analyze module structure and complexity
19
+ - Support seeding from existing tests
20
+
21
+ ## Directory Structure
22
+
23
+ ```
24
+ analyses/
25
+ ├── constants.py # Analysis constants and configuration
26
+ ├── generator.py # Test cluster generation from modules
27
+ ├── module.py # Module representation and access
28
+ ├── modulecomplexity.py # Module complexity metrics
29
+ ├── seeding.py # Seed test generation from existing tests
30
+ ├── string_subtypes.py # String type hierarchy analysis
31
+ ├── syntaxtree.py # Abstract syntax tree utilities
32
+ └── type_inference.py # Generic type inference engine
33
+ ├── typesystem.py # Type system representation
34
+ ```
35
+
36
+ ## Core Components
37
+
38
+ ### 1. Module Analysis (module.py)
39
+ - **ModuleAccessor**: Accesses Python modules and their callables
40
+ - Discovers classes, methods, functions within a module
41
+ - Tracks module dependencies and import structure
42
+ - Filters public vs. private members
43
+
44
+ ### 2. Type System (typesystem.py)
45
+ - **GenericType**: Represents generic Python types (List[int], Dict[str, Any])
46
+ - **Type inference**: Resolves type parameters from annotations and usage
47
+ - Handles complex type hierarchies and bounds
48
+ - Supports Union, Optional, generic base classes
49
+
50
+ ### 3. Type Inference (type_inference.py)
51
+ - Infers generic type parameters from class hierarchies
52
+ - Resolves type variables in method signatures
53
+ - Handles substitution of type bounds
54
+
55
+ ### 4. Test Cluster Generation (generator.py)
56
+ - **TestCluster**: Collection of callable descriptions with dependency info
57
+ - Creates from subject module or custom callables
58
+ - Builds dependency graph for method/function calls
59
+ - Tracks class hierarchies for polymorphism
60
+
61
+ ### 5. Seeding (seeding.py)
62
+ - Loads existing tests from files or test suites
63
+ - Extracts test cases for use as initial population
64
+ - Supports multiple test formats
65
+
66
+ ### 6. Complexity Analysis (modulecomplexity.py)
67
+ - Computes module complexity metrics
68
+ - Analyzes cyclomatic complexity
69
+ - Used for search space characterization
70
+
71
+ ## Key Patterns
72
+
73
+ ### Module Access
74
+ ```python
75
+ from pynguin.analyses.module import ModuleAccessor
76
+
77
+ accessor = ModuleAccessor(module)
78
+ callables = accessor.get_all_callables()
79
+ classes = accessor.get_classes()
80
+ ```
81
+
82
+ ### Type System
83
+ ```python
84
+ from pynguin.analyses.typesystem import GenericType
85
+
86
+ # Parse complex types
87
+ list_int = GenericType.from_string("List[int]")
88
+ dict_type = GenericType.from_string("Dict[str, Any]")
89
+ ```
90
+
91
+ ### Test Cluster
92
+ ```python
93
+ from pynguin.analyses.generator import TestClusterGenerator
94
+
95
+ generator = TestClusterGenerator()
96
+ cluster = generator.generate_cluster(module)
97
+ callables = cluster.get_all_callables()
98
+ ```
99
+
100
+ ## Related Modules
101
+
102
+ - `ga/` - Uses test clusters for search space definition
103
+ - `testcase/` - Test cases use analyzed type information
104
+ - `instrumentation/` - Complements dynamic analysis
105
+
106
+ ## Key Files to Explore
107
+
108
+ - `typesystem.py` - Complete type system representation
109
+ - `generator.py` - Test cluster generation algorithm
110
+ - `module.py` - Module introspection utilities
111
+
112
+ ---
113
+
114
+ **Timestamp**: 2026-01-30
@@ -19,6 +19,7 @@ import itertools
19
19
  import json
20
20
  import logging
21
21
  import queue
22
+ import re
22
23
  import types
23
24
  import typing
24
25
  from collections import defaultdict
@@ -44,6 +45,7 @@ from pynguin.analyses.type_inference import (
44
45
  HintInference,
45
46
  InferenceProvider,
46
47
  LLMInference,
48
+ LLMInferenceWithSubtypes,
47
49
  NoInference,
48
50
  TypeEvalPyInference,
49
51
  )
@@ -74,13 +76,12 @@ from pynguin.analyses.typesystem import (
74
76
  UnionType,
75
77
  Unsupported,
76
78
  )
77
- from pynguin.configuration import TypeInferenceStrategy
79
+ from pynguin.configuration import ElementVisibility, TypeInferenceStrategy
78
80
  from pynguin.ga.operators.selection import RandomSelection, RankSelection
79
81
  from pynguin.utils import randomness
80
82
  from pynguin.utils.exceptions import (
81
83
  ConstraintValidationError,
82
84
  ConstructionFailedException,
83
- CoroutineFoundException,
84
85
  )
85
86
  from pynguin.utils.generic.genericaccessibleobject import (
86
87
  GenericAccessibleObject,
@@ -204,6 +205,27 @@ MODULE_BLACKLIST = frozenset((
204
205
  METHOD_BLACKLIST = frozenset(("time.sleep",))
205
206
 
206
207
 
208
+ def _is_function(element: Any) -> bool:
209
+ """Whether the element is a module-level function we can analyse.
210
+
211
+ Besides plain functions this also accepts callables wrapped by
212
+ ``functools.cache`` / ``functools.lru_cache`` (a
213
+ ``functools._lru_cache_wrapper``), for which ``inspect.isfunction`` returns
214
+ ``False``. Without this a cache-decorated public function would be silently
215
+ dropped from the test cluster.
216
+
217
+ Args:
218
+ element: The element to check
219
+
220
+ Returns:
221
+ Is the element a (possibly cache-wrapped) function?
222
+ """
223
+ return inspect.isfunction(element) or (
224
+ isinstance(element, functools._lru_cache_wrapper) # noqa: SLF001
225
+ and inspect.isfunction(inspect.unwrap(element))
226
+ )
227
+
228
+
207
229
  def _is_blacklisted(element: Any) -> bool:
208
230
  """Checks if the given element belongs to the blacklist.
209
231
 
@@ -226,19 +248,21 @@ def _is_blacklisted(element: Any) -> bool:
226
248
  # Allow some builtin types
227
249
  return False
228
250
  return element.__module__ in module_blacklist
229
- if inspect.isfunction(element):
251
+ if _is_function(element):
230
252
  # Some modules can be run standalone using a main function or provide a small
231
253
  # set of tests ('test'). We don't want to include those functions.
232
254
  # Importing certain modules such as inspect, that use or import C-functions can
233
255
  # lead to __module__ being None. We want to exclude these functions as well.
256
+ # Unwrap so cache-wrapped functions are checked against their real name/module.
257
+ func = inspect.unwrap(element)
234
258
  return (
235
- element.__module__ is None
236
- or element.__module__ in module_blacklist
237
- or element.__qualname__.startswith((
259
+ func.__module__ is None
260
+ or func.__module__ in module_blacklist
261
+ or func.__qualname__.startswith((
238
262
  "main",
239
263
  "test",
240
264
  ))
241
- or f"{element.__module__}.{element.__qualname__}" in method_blacklist
265
+ or f"{func.__module__}.{func.__qualname__}" in method_blacklist
242
266
  )
243
267
  except Exception: # noqa: BLE001
244
268
  LOGGER.warning(
@@ -793,6 +817,9 @@ class ModuleTestCluster(TestCluster): # noqa: PLR0904
793
817
  # Keep track of all callables, this is only for statistics purposes.
794
818
  self.__callables: OrderedSet[GenericCallableAccessibleObject] = OrderedSet()
795
819
 
820
+ # Whether the SUT or any of its transitive imports uses Python's random module.
821
+ self.sut_uses_random: bool = False
822
+
796
823
  def _setup_generator_selection(self) -> GeneratorProvider:
797
824
  if (
798
825
  config.configuration.generator_selection.generator_selection_algorithm
@@ -1286,6 +1313,51 @@ def __is_private(method_name: str) -> bool:
1286
1313
  return method_name.startswith("__") and not method_name.endswith("__")
1287
1314
 
1288
1315
 
1316
+ __NAME_MANGLED_PATTERN = re.compile(r"^_[A-Za-z][A-Za-z0-9]*__\w+$")
1317
+
1318
+
1319
+ def __is_name_mangled(name: str) -> bool:
1320
+ """Checks whether ``name`` looks like a name-mangled private attribute.
1321
+
1322
+ Python mangles a class-private name ``__attr`` defined in class ``Foo`` to
1323
+ ``_Foo__attr``. Since the leading underscores of the class name are
1324
+ stripped during mangling, the mangled name always starts with a single
1325
+ underscore, followed by an identifier not starting with an underscore,
1326
+ followed by a double underscore and the (non-dunder) original name.
1327
+
1328
+ Args:
1329
+ name: The name to check.
1330
+
1331
+ Returns:
1332
+ True, if the name looks like a name-mangled private attribute.
1333
+ """
1334
+ return bool(__NAME_MANGLED_PATTERN.fullmatch(name)) and not name.endswith("__")
1335
+
1336
+
1337
+ def __should_skip_by_visibility(name: str, *, add_to_test: bool) -> bool:
1338
+ """Determines whether an element should be skipped based on its visibility.
1339
+
1340
+ Args:
1341
+ name: The (unqualified) name of the element.
1342
+ add_to_test: Whether the element belongs to the module under test.
1343
+
1344
+ Returns:
1345
+ True, if the element should be skipped from analysis.
1346
+ """
1347
+ if not add_to_test:
1348
+ # The relaxed visibility handling only applies to the module under test;
1349
+ # non-public elements of dependency modules are always excluded.
1350
+ return __is_private(name) or __is_protected(name)
1351
+
1352
+ match config.configuration.element_visibility:
1353
+ case ElementVisibility.ALL:
1354
+ return False
1355
+ case ElementVisibility.PROTECTED:
1356
+ return __is_private(name) or __is_name_mangled(name)
1357
+ case _:
1358
+ return __is_private(name) or __is_protected(name)
1359
+
1360
+
1289
1361
  def __is_method_defined_in_class(class_: type | types.UnionType, method: object) -> bool:
1290
1362
  return class_ == get_class_that_defined_method(method)
1291
1363
 
@@ -1353,14 +1425,20 @@ def __analyse_function(
1353
1425
  test_cluster: ModuleTestCluster,
1354
1426
  add_to_test: bool,
1355
1427
  ) -> None:
1356
- if __is_private(func_name) or __is_protected(func_name):
1428
+ if __should_skip_by_visibility(func_name.rpartition(".")[2], add_to_test=add_to_test):
1357
1429
  LOGGER.debug("Skipping function %s from analysis", func_name)
1358
1430
  return
1359
1431
  if inspect.iscoroutinefunction(func) or inspect.isasyncgenfunction(func):
1432
+ # Pynguin cannot execute coroutines (see issue #62 / MR !59), so we skip
1433
+ # them instead of aborting the whole module and still test its
1434
+ # synchronous members.
1360
1435
  if add_to_test:
1361
- raise CoroutineFoundException("Found coroutine in SUT: %s", func_name)
1362
- # Coroutine outside the SUT are not problematic, just exclude them.
1363
- LOGGER.debug("Skipping coroutine %s outside of SUT", func_name)
1436
+ LOGGER.warning(
1437
+ "Skipping coroutine %s: Pynguin only tests the non-async parts of this module.",
1438
+ func_name,
1439
+ )
1440
+ else:
1441
+ LOGGER.debug("Skipping coroutine %s outside of SUT", func_name)
1364
1442
  return
1365
1443
 
1366
1444
  LOGGER.debug("Analysing function %s", func_name)
@@ -1553,18 +1631,23 @@ def __analyse_method(
1553
1631
  ) -> None:
1554
1632
  if (
1555
1633
  __is_annotate(method_name)
1556
- or __is_private(method_name)
1557
- or __is_protected(method_name)
1634
+ or __should_skip_by_visibility(method_name.rpartition(".")[2], add_to_test=add_to_test)
1558
1635
  or __is_constructor(method_name)
1559
1636
  or not __is_method_defined_in_class(type_info.raw_type, method)
1560
1637
  ):
1561
1638
  LOGGER.debug("Skipping method %s from analysis", method_name)
1562
1639
  return
1563
1640
  if inspect.iscoroutinefunction(method) or inspect.isasyncgenfunction(method):
1641
+ # Pynguin cannot execute coroutines (see issue #62 / MR !59), so we skip
1642
+ # them instead of aborting the whole module and still test its
1643
+ # synchronous members.
1564
1644
  if add_to_test:
1565
- raise CoroutineFoundException("Found coroutine in SUT: %s", method_name)
1566
- # Coroutine outside the SUT are not problematic, just exclude them.
1567
- LOGGER.debug("Skipping coroutine %s outside of SUT", method_name)
1645
+ LOGGER.warning(
1646
+ "Skipping coroutine %s: Pynguin only tests the non-async parts of this module.",
1647
+ method_name,
1648
+ )
1649
+ else:
1650
+ LOGGER.debug("Skipping coroutine %s outside of SUT", method_name)
1568
1651
  return
1569
1652
 
1570
1653
  LOGGER.debug("Analysing method %s.%s", type_info.full_name, method_name)
@@ -1778,7 +1861,7 @@ def __analyse_included_functions(
1778
1861
  seen_functions: set,
1779
1862
  ) -> None:
1780
1863
  for current in filter(
1781
- lambda x: inspect.isfunction(x) and not _is_blacklisted(x),
1864
+ lambda x: _is_function(x) and not _is_blacklisted(x),
1782
1865
  vars(module).values(),
1783
1866
  ):
1784
1867
  if current in seen_functions:
@@ -1815,8 +1898,12 @@ def __check_c_modules(
1815
1898
  non_whitelisted_modules.add(module.__name__)
1816
1899
  return non_whitelisted_modules
1817
1900
 
1818
- # If the module is Python, inspect its members too:
1819
- for element in vars(module).values():
1901
+ # If the module is Python, inspect its members too.
1902
+ # Snapshot the values first: inspecting a member can mutate the module's
1903
+ # globals (e.g. a PEP 562 module-level ``__getattr__`` that lazily caches
1904
+ # results), which would otherwise raise "dictionary changed size during
1905
+ # iteration" while iterating the live ``__dict__``.
1906
+ for element in list(vars(module).values()):
1820
1907
  if inspect.isfunction(element) or inspect.isclass(element):
1821
1908
  try:
1822
1909
  inspect.getsource(element)
@@ -1890,6 +1977,9 @@ def get_type_provider(
1890
1977
  case TypeInferenceStrategy.LLM:
1891
1978
  callables = _collect_public_callables(module)
1892
1979
  return LLMInference(callables, LLMProvider.OPENAI, type_system)
1980
+ case TypeInferenceStrategy.LLM_WITH_SUBTYPES:
1981
+ callables = _collect_public_callables(module)
1982
+ return LLMInferenceWithSubtypes(callables, LLMProvider.OPENAI, type_system)
1893
1983
  case TypeInferenceStrategy.TYPE_HINTS:
1894
1984
  return HintInference()
1895
1985
  case TypeInferenceStrategy.NONE:
@@ -1928,33 +2018,48 @@ def _load_typeevalpy_data() -> ParsedTypeEvalPyData | None:
1928
2018
  return None
1929
2019
 
1930
2020
 
1931
- def _collect_public_callables(module: ModuleType) -> Sequence[Callable[..., Any]]:
1932
- """Collects a list of all public accessibles in a module."""
1933
- callables = []
1934
- seen = set()
1935
-
1936
- def add(obj):
1937
- if id(obj) not in seen:
1938
- callables.append(obj)
1939
- seen.add(id(obj))
1940
-
2021
+ def __collect_module_level_functions(
2022
+ module: ModuleType, add: Callable[[Callable[..., Any]], None]
2023
+ ) -> None:
1941
2024
  for name, obj in vars(module).items():
1942
- if name.startswith("_") and name != "__init__":
2025
+ if name != "__init__" and __should_skip_by_visibility(name, add_to_test=True):
1943
2026
  continue
1944
2027
  if inspect.isfunction(obj) and obj.__module__ == module.__name__:
1945
2028
  add(obj)
1946
2029
 
2030
+
2031
+ def __collect_class_methods(module: ModuleType, add: Callable[[Callable[..., Any]], None]) -> None:
1947
2032
  for cls_name, cls in vars(module).items():
2033
+ if not inspect.isclass(cls) or cls.__module__ != module.__name__:
2034
+ continue
2035
+ # The private-class filter is only applied for PUBLIC visibility; other
2036
+ # visibility levels never filter classes by name (matching the main
2037
+ # analysis, which does not filter classes based on their name).
1948
2038
  if (
1949
- cls_name.startswith("_")
1950
- or not inspect.isclass(cls)
1951
- or cls.__module__ != module.__name__
2039
+ config.configuration.element_visibility == ElementVisibility.PUBLIC
2040
+ and cls_name.startswith("_")
1952
2041
  ):
1953
2042
  continue
1954
2043
  for meth_name, member in inspect.getmembers(cls, predicate=inspect.isfunction):
1955
- if not meth_name.startswith("_"):
2044
+ if __is_constructor(meth_name):
2045
+ continue
2046
+ if not __should_skip_by_visibility(meth_name, add_to_test=True):
1956
2047
  add(member)
1957
2048
 
2049
+
2050
+ def _collect_public_callables(module: ModuleType) -> Sequence[Callable[..., Any]]:
2051
+ """Collects a list of all public accessibles in a module."""
2052
+ callables: list[Callable[..., Any]] = []
2053
+ seen: set[int] = set()
2054
+
2055
+ def add(obj: Callable[..., Any]) -> None:
2056
+ if id(obj) not in seen:
2057
+ callables.append(obj)
2058
+ seen.add(id(obj))
2059
+
2060
+ __collect_module_level_functions(module, add)
2061
+ __collect_class_methods(module, add)
2062
+
1958
2063
  return callables
1959
2064
 
1960
2065
 
@@ -0,0 +1,120 @@
1
+ # This file is part of Pynguin.
2
+ #
3
+ # SPDX-FileCopyrightText: 2019–2026 Pynguin Contributors
4
+ #
5
+ # SPDX-License-Identifier: MIT
6
+ #
7
+ """Utility for converting LLM subtype inference to StringSubtype instances."""
8
+
9
+ from __future__ import annotations
10
+
11
+ import logging
12
+ import re
13
+
14
+ from pynguin.analyses.typesystem import (
15
+ CSVString,
16
+ EmailString,
17
+ IPv4String,
18
+ IPv6String,
19
+ ISOColorString,
20
+ ISODateString,
21
+ StringSubtype,
22
+ URLString,
23
+ )
24
+
25
+ _LOGGER = logging.getLogger(__name__)
26
+
27
+ # Mapping of Faker method names to corresponding StringSubtype classes
28
+ _GENERATOR_TO_SUBTYPE: dict[str, type[StringSubtype]] = {
29
+ "email": EmailString,
30
+ "ipv4": IPv4String,
31
+ "ipv6": IPv6String,
32
+ "color": ISOColorString,
33
+ "csv": CSVString,
34
+ "date": ISODateString,
35
+ "url": URLString,
36
+ }
37
+
38
+ # Mapping of StringSubtype classes to Faker method names
39
+ _SUBTYPE_TO_GENERATOR: dict[type[StringSubtype], str] = {
40
+ v: k for k, v in _GENERATOR_TO_SUBTYPE.items()
41
+ }
42
+
43
+ AVAILABLE_GENERATORS: list[str] = list(_GENERATOR_TO_SUBTYPE.keys())
44
+
45
+
46
+ def get_subtype_for_generator(generator_name: str) -> StringSubtype | None:
47
+ """Get a StringSubtype instance for a given Faker generator name."""
48
+ subtype_class = _GENERATOR_TO_SUBTYPE.get(generator_name)
49
+ # All registered StringSubtype subclasses have no-arg constructors
50
+ return subtype_class() if subtype_class else None # type: ignore[call-arg]
51
+
52
+
53
+ def get_generator_for_subtype(subtype: StringSubtype) -> str | None:
54
+ """Get the Faker generator name for a given StringSubtype instance."""
55
+ return _SUBTYPE_TO_GENERATOR.get(type(subtype))
56
+
57
+
58
+ def has_generator(generator_name: str) -> bool:
59
+ """Check if a generator name is registered."""
60
+ return generator_name in _GENERATOR_TO_SUBTYPE
61
+
62
+
63
+ def from_string(subtype_str: str) -> StringSubtype | None:
64
+ """Convert a subtype string into a StringSubtype instance.
65
+
66
+ The subtype string can be either:
67
+ 1. A Faker generator name (e.g., "email", "ipv4", "url")
68
+ 2. A custom regex pattern (e.g., "^[a-z]+$")
69
+
70
+ Args:
71
+ subtype_str: The subtype string from LLM inference
72
+
73
+ Returns:
74
+ A StringSubtype instance, or None if conversion fails
75
+ """
76
+ if not subtype_str or not isinstance(subtype_str, str):
77
+ return None
78
+
79
+ # First, try to match against known Faker generators
80
+ if has_generator(subtype_str):
81
+ subtype = get_subtype_for_generator(subtype_str)
82
+ if subtype:
83
+ return subtype
84
+
85
+ # Otherwise, try to parse as a custom regex pattern
86
+ try:
87
+ # Validate that it's a valid regex by attempting to compile it
88
+ compiled_regex = re.compile(subtype_str)
89
+ return StringSubtype(compiled_regex)
90
+ except re.error as e:
91
+ _LOGGER.warning(
92
+ "Failed to parse subtype string '%s' as regex pattern: %s",
93
+ subtype_str,
94
+ e,
95
+ )
96
+ return None
97
+
98
+
99
+ def from_faker_generator(generator_name: str) -> StringSubtype | None:
100
+ """Create a StringSubtype from a Faker generator name.
101
+
102
+ Args:
103
+ generator_name: The name of the Faker generator
104
+
105
+ Returns:
106
+ A StringSubtype instance, or None if the generator is not registered
107
+ """
108
+ return get_subtype_for_generator(generator_name)
109
+
110
+
111
+ def to_faker_generator(subtype: StringSubtype) -> str | None:
112
+ """Get the Faker generator name for a StringSubtype, if available.
113
+
114
+ Args:
115
+ subtype: The StringSubtype instance
116
+
117
+ Returns:
118
+ The Faker generator name, or None if no mapping exists
119
+ """
120
+ return get_generator_for_subtype(subtype)