pynguin 0.48.0__tar.gz → 0.49.0.dev0__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 (765) hide show
  1. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/PKG-INFO +1 -1
  2. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/pyproject.toml +1 -1
  3. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/__version__.py +1 -1
  4. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/configuration.py +55 -2
  5. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/generator.py +199 -20
  6. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/dependency_analyzer.py +62 -24
  7. pynguin-0.49.0.dev0/src/pynguin/mock_generation/llm_backend.py +305 -0
  8. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/llm_classifier_client.py +26 -3
  9. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/mock_generator.py +36 -8
  10. pynguin-0.49.0.dev0/src/pynguin/mock_generation/patch_targets.py +396 -0
  11. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/static_setups.py +29 -13
  12. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/validator.py +11 -5
  13. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/execution.py +21 -9
  14. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/export.py +55 -12
  15. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/mock_statement.py +97 -5
  16. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/mock_templates_store.py +6 -0
  17. pynguin-0.49.0.dev0/src/pynguin/testcase/scoped_patch.py +205 -0
  18. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/testcase.py +4 -0
  19. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/testfactory.py +149 -8
  20. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/statistics/runtimevariable.py +3 -0
  21. pynguin-0.49.0.dev0/tests/fixtures/examples/environment.py +37 -0
  22. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/test_dependency_analyzer.py +82 -7
  23. pynguin-0.49.0.dev0/tests/mock_generation/test_llm_backend.py +149 -0
  24. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/test_mock_generator.py +2 -2
  25. pynguin-0.49.0.dev0/tests/mock_generation/test_patch_targets.py +172 -0
  26. pynguin-0.49.0.dev0/tests/quick_eval/test_mocking.py +187 -0
  27. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_validator.py +19 -0
  28. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/test_generator.py +82 -0
  29. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_testcaseexecutor_integration.py +41 -0
  30. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/export/test_export.py +60 -0
  31. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_mock_statement.py +79 -0
  32. pynguin-0.49.0.dev0/tests/testcase/test_scoped_patch.py +119 -0
  33. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_testfactory.py +107 -0
  34. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_configuration_writer.py +20 -1
  35. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/LICENSE.rst +0 -0
  36. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/LICENSES/Apache-2.0.txt +0 -0
  37. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/LICENSES/BSD-2-Clause.txt +0 -0
  38. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/LICENSES/CC-BY-4.0.txt +0 -0
  39. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/LICENSES/CC0-1.0.txt +0 -0
  40. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/LICENSES/MIT.txt +0 -0
  41. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/README.md +0 -0
  42. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/__init__.py +0 -0
  43. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/__main__.py +0 -0
  44. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/AGENTS.md +0 -0
  45. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/__init__.py +0 -0
  46. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/ast_utils.py +0 -0
  47. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/constants.py +0 -0
  48. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/generator.py +0 -0
  49. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/generics.py +0 -0
  50. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/module.py +0 -0
  51. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/modulecomplexity.py +0 -0
  52. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/seeding.py +0 -0
  53. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/string_subtype_inference.py +0 -0
  54. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/string_subtypes.py +0 -0
  55. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/syntaxtree.py +0 -0
  56. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/type_inference.py +0 -0
  57. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/typesystem.py +0 -0
  58. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/AGENTS.md +0 -0
  59. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/__init__.py +0 -0
  60. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/assertion.py +0 -0
  61. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/assertion_to_ast.py +0 -0
  62. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/assertion_trace.py +0 -0
  63. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/assertiongenerator.py +0 -0
  64. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/assertiontraceobserver.py +0 -0
  65. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/llmassertiongenerator.py +0 -0
  66. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/AGENTS.md +0 -0
  67. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/__init__.py +0 -0
  68. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/controller.py +0 -0
  69. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/mutators.py +0 -0
  70. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/AGENTS.md +0 -0
  71. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/__init__.py +0 -0
  72. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/arithmetic.py +0 -0
  73. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/base.py +0 -0
  74. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/decorator.py +0 -0
  75. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/exception.py +0 -0
  76. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/inheritance.py +0 -0
  77. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/logical.py +0 -0
  78. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/loop.py +0 -0
  79. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/misc.py +0 -0
  80. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/statement.py +0 -0
  81. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/strategies.py +0 -0
  82. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/transformer.py +0 -0
  83. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/cli.py +0 -0
  84. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/AGENTS.md +0 -0
  85. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/__init__.py +0 -0
  86. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/AGENTS.md +0 -0
  87. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/__init__.py +0 -0
  88. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/abstractmosaalgorithm.py +0 -0
  89. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/archive.py +0 -0
  90. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/dynamosaalgorithm.py +0 -0
  91. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/generationalgorithm.py +0 -0
  92. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/lldynamosaalgorithm.py +0 -0
  93. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/llmosalgorithm.py +0 -0
  94. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/mioalgorithm.py +0 -0
  95. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/mosaalgorithm.py +0 -0
  96. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/randomalgorithm.py +0 -0
  97. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/randomsearchalgorithm.py +0 -0
  98. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/wholesuitealgorithm.py +0 -0
  99. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/checked_coverage.py +0 -0
  100. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/chromosome.py +0 -0
  101. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/chromosomefactory.py +0 -0
  102. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/chromosomevisitor.py +0 -0
  103. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/computation_cache.py +0 -0
  104. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/computations.py +0 -0
  105. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/coveragegoals.py +0 -0
  106. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/fitness_metrics.py +0 -0
  107. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/generationalgorithmfactory.py +0 -0
  108. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/llmtestsuitechromosomefactory.py +0 -0
  109. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/operators/AGENTS.md +0 -0
  110. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/operators/__init__.py +0 -0
  111. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/operators/comparator.py +0 -0
  112. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/operators/crossover.py +0 -0
  113. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/operators/mutation.py +0 -0
  114. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/operators/ranking.py +0 -0
  115. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/operators/selection.py +0 -0
  116. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/postprocess.py +0 -0
  117. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/searchobserver.py +0 -0
  118. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/stoppingcondition.py +0 -0
  119. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/testcasechromosome.py +0 -0
  120. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/testcasechromosomefactory.py +0 -0
  121. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/testcasefactory.py +0 -0
  122. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/testsuitechromosome.py +0 -0
  123. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/testsuitechromosomefactory.py +0 -0
  124. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/AGENTS.md +0 -0
  125. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/__init__.py +0 -0
  126. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/controlflow.py +0 -0
  127. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/machinery.py +0 -0
  128. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/tracer.py +0 -0
  129. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/transformer.py +0 -0
  130. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/AGENTS.md +0 -0
  131. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/__init__.py +0 -0
  132. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/common.py +0 -0
  133. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/python3_10.py +0 -0
  134. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/python3_11.py +0 -0
  135. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/python3_12.py +0 -0
  136. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/python3_13.py +0 -0
  137. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/python3_14.py +0 -0
  138. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/python3_15.py +0 -0
  139. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/__init__.py +0 -0
  140. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/aggregation.py +0 -0
  141. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/island.py +0 -0
  142. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/llm_worker.py +0 -0
  143. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/llm_worker_algorithm.py +0 -0
  144. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/llm_worker_protocol.py +0 -0
  145. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/migration.py +0 -0
  146. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/migration_algorithm.py +0 -0
  147. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/orchestrator.py +0 -0
  148. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/population_allocation.py +0 -0
  149. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/AGENTS.md +0 -0
  150. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/__init__.py +0 -0
  151. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/cache.py +0 -0
  152. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/caching.py +0 -0
  153. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/client.py +0 -0
  154. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/config_schema.py +0 -0
  155. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/llmagent.py +0 -0
  156. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/llmtestcasehandler.py +0 -0
  157. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/parsing/AGENTS.md +0 -0
  158. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/parsing/__init__.py +0 -0
  159. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/parsing/deserializer.py +0 -0
  160. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/parsing/helpers.py +0 -0
  161. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/parsing/rewriter.py +0 -0
  162. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/parsing/type_str_parser.py +0 -0
  163. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/AGENTS.md +0 -0
  164. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/__init__.py +0 -0
  165. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/assertiongenerationprompt.py +0 -0
  166. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/base_inference_prompt.py +0 -0
  167. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/localsearchprompt.py +0 -0
  168. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/modulemutationstrengthenprompt.py +0 -0
  169. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/modulereadabilityrefinementprompt.py +0 -0
  170. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/modulerefinementprompt.py +0 -0
  171. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/modulesemanticassertionsprompt.py +0 -0
  172. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/mutationstrengthenprompt.py +0 -0
  173. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/prompt.py +0 -0
  174. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/readabilityrefinementprompt.py +0 -0
  175. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/repairprompt.py +0 -0
  176. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/assertion_generation.yaml +0 -0
  177. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/defaults.yaml +0 -0
  178. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/generator_generate.yaml +0 -0
  179. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/local_search.yaml +0 -0
  180. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/module_mutation_strengthen.yaml +0 -0
  181. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/module_readability_refinement.yaml +0 -0
  182. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/module_refinement_combined.yaml +0 -0
  183. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/module_semantic_assertions.yaml +0 -0
  184. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/mutation_strengthen.yaml +0 -0
  185. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/readability_refinement.yaml +0 -0
  186. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/refinement.yaml +0 -0
  187. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/repair.yaml +0 -0
  188. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/semantic_assertions.yaml +0 -0
  189. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/test_case_generation.yaml +0 -0
  190. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/type_inference.yaml +0 -0
  191. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/type_subtype_inference.yaml +0 -0
  192. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/uncovered_targets.yaml +0 -0
  193. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/semanticassertionsprompt.py +0 -0
  194. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/testcasegenerationprompt.py +0 -0
  195. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/type_and_subtype_inference_prompt.py +0 -0
  196. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/typeinferenceprompt.py +0 -0
  197. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/uncoveredtargetsprompt.py +0 -0
  198. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/query_strategy.py +0 -0
  199. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/request.py +0 -0
  200. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/master_worker/AGENTS.md +0 -0
  201. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/master_worker/__init__.py +0 -0
  202. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/master_worker/client.py +0 -0
  203. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/master_worker/master.py +0 -0
  204. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/master_worker/worker.py +0 -0
  205. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/__init__.py +0 -0
  206. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/ast_helpers.py +0 -0
  207. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/context_extractor.py +0 -0
  208. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/mock_hint_generator.py +0 -0
  209. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/mock_rule_generator.py +0 -0
  210. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/proxy_cache_resolver.py +0 -0
  211. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/untyped_param_analyzer.py +0 -0
  212. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/AGENTS.md +0 -0
  213. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/__init__.py +0 -0
  214. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/aaa_inserter.py +0 -0
  215. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/alignment.py +0 -0
  216. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/api_signatures.py +0 -0
  217. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/ast_analyzer.py +0 -0
  218. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/coverage_checker.py +0 -0
  219. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/llm_client.py +0 -0
  220. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/llm_judge.py +0 -0
  221. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/mutation_analyzer.py +0 -0
  222. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/pipeline.py +0 -0
  223. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/readability_metrics.py +0 -0
  224. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/refiner.py +0 -0
  225. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/sut_inspector.py +0 -0
  226. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/AGENTS.md +0 -0
  227. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/__init__.py +0 -0
  228. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/coverage-template.html +0 -0
  229. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/__init__.py +0 -0
  230. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/camel_case.fan +0 -0
  231. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/colour.fan +0 -0
  232. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/csv.fan +0 -0
  233. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/delimited.fan +0 -0
  234. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/email.fan +0 -0
  235. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/__init__.py +0 -0
  236. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/camel_case.fan +0 -0
  237. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/colour.fan +0 -0
  238. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/csv.fan +0 -0
  239. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/delimited.fan +0 -0
  240. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/email.fan +0 -0
  241. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/ipv4.fan +0 -0
  242. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/standard_date.fan +0 -0
  243. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/unix_path.fan +0 -0
  244. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/xml.fan +0 -0
  245. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/ipv4.fan +0 -0
  246. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/numeric.fan +0 -0
  247. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/standard_date.fan +0 -0
  248. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/unix_path.fan +0 -0
  249. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/xml.fan +0 -0
  250. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/AGENTS.md +0 -0
  251. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/__init__.py +0 -0
  252. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/dynamicslicer.py +0 -0
  253. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/executedinstruction.py +0 -0
  254. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/executionflowbuilder.py +0 -0
  255. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/stack/__init__.py +0 -0
  256. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/stack/stacksimulation.py +0 -0
  257. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/statementslicingobserver.py +0 -0
  258. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/AGENTS.md +0 -0
  259. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/__init__.py +0 -0
  260. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/collection_tracker.py +0 -0
  261. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/crash_minimization.py +0 -0
  262. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/execution_isolation.py +0 -0
  263. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/execution_observers.py +0 -0
  264. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/execution_result.py +0 -0
  265. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/literalgen.py +0 -0
  266. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/llmlocalsearch.py +0 -0
  267. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/localsearch.py +0 -0
  268. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/localsearchobjective.py +0 -0
  269. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/localsearchstatement.py +0 -0
  270. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/localsearchtimer.py +0 -0
  271. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/subprocess_executor.py +0 -0
  272. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/AGENTS.md +0 -0
  273. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/__init__.py +0 -0
  274. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/atomicinteger.py +0 -0
  275. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/collection_utils.py +0 -0
  276. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/configuration_writer.py +0 -0
  277. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/controlflowdistance.py +0 -0
  278. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/cst_imports.py +0 -0
  279. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/exceptions.py +0 -0
  280. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/execution_recorder.py +0 -0
  281. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/fandango_faker_utils.py +0 -0
  282. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/fs_isolation.py +0 -0
  283. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/generic/AGENTS.md +0 -0
  284. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/generic/__init__.py +0 -0
  285. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/generic/genericaccessibleobject.py +0 -0
  286. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/llm.py +0 -0
  287. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/logging_utils.py +0 -0
  288. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/mirror.py +0 -0
  289. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/mutation_utils.py +0 -0
  290. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/naming.py +0 -0
  291. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/openai_key_resolver.py +0 -0
  292. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/orderedset.py +0 -0
  293. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/AGENTS.md +0 -0
  294. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/__init__.py +0 -0
  295. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/ml_parsing_utils.py +0 -0
  296. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/ml_testfactory_utils.py +0 -0
  297. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/ml_testing_resources.py +0 -0
  298. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/mlparameter.py +0 -0
  299. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/ndarray_cst.py +0 -0
  300. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/ndarray_mutation.py +0 -0
  301. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/np_rng.py +0 -0
  302. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/randomness.py +0 -0
  303. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/report.py +0 -0
  304. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/statistics/AGENTS.md +0 -0
  305. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/statistics/__init__.py +0 -0
  306. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/statistics/outputvariablefactory.py +0 -0
  307. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/statistics/statisticsbackend.py +0 -0
  308. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/statistics/statisticsobserver.py +0 -0
  309. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/statistics/stats.py +0 -0
  310. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/timeout.py +0 -0
  311. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/type_utils.py +0 -0
  312. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/typeevalpy_json_schema.py +0 -0
  313. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/typetracing.py +0 -0
  314. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/AGENTS.md +0 -0
  315. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/__init__.py +0 -0
  316. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/__init__.py +0 -0
  317. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_ast_utils.py +0 -0
  318. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_constants.py +0 -0
  319. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_generics.py +0 -0
  320. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_initialpopulationseeding.py +0 -0
  321. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_module.py +0 -0
  322. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_modulecomplexity.py +0 -0
  323. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_native_libraries.py +0 -0
  324. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_seeding.py +0 -0
  325. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_staticconstantseeding.py +0 -0
  326. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_string_subtype_inference.py +0 -0
  327. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_string_subtypes.py +0 -0
  328. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_subtypes.py +0 -0
  329. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_syntaxtree.py +0 -0
  330. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_type_inference.py +0 -0
  331. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_typesystem.py +0 -0
  332. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_typesystem_string_subtypes.py +0 -0
  333. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/AGENTS.md +0 -0
  334. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/__init__.py +0 -0
  335. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/__init__.py +0 -0
  336. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/AGENTS.md +0 -0
  337. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/__init__.py +0 -0
  338. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_arithmetic.py +0 -0
  339. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_decorator.py +0 -0
  340. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_exception.py +0 -0
  341. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_inheritance.py +0 -0
  342. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_logical.py +0 -0
  343. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_loop.py +0 -0
  344. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_misc.py +0 -0
  345. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_statement.py +0 -0
  346. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/test_controller.py +0 -0
  347. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/test_mutators.py +0 -0
  348. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/test_strategies.py +0 -0
  349. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/test_transformer.py +0 -0
  350. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/test_assertion.py +0 -0
  351. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/test_assertion_generation_integration.py +0 -0
  352. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/test_assertion_to_ast.py +0 -0
  353. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/test_assertion_trace.py +0 -0
  354. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/test_assertiongenerator.py +0 -0
  355. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/test_assertiontraceobserver.py +0 -0
  356. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/test_llmassertiongenerator.py +0 -0
  357. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/conftest.py +0 -0
  358. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/AGENTS.md +0 -0
  359. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/__init__.py +0 -0
  360. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/accessibles/__init__.py +0 -0
  361. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/accessibles/accessible.py +0 -0
  362. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/branchcoverage/__init__.py +0 -0
  363. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/branchcoverage/dict_branch.py +0 -0
  364. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/branchcoverage/nestedbranches.py +0 -0
  365. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/branchcoverage/nobranches.py +0 -0
  366. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/branchcoverage/simplenesting.py +0 -0
  367. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/branchcoverage/singlebranches.py +0 -0
  368. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/branchcoverage/twomethodsinglebranches.py +0 -0
  369. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/c/__init__.py +0 -0
  370. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/c/my_ctypes.py +0 -0
  371. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/__init__.py +0 -0
  372. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/abstract.py +0 -0
  373. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/alias_module.py +0 -0
  374. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/async_and_sync.py +0 -0
  375. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/async_class_gen.py +0 -0
  376. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/async_class_method.py +0 -0
  377. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/async_func.py +0 -0
  378. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/async_gen.py +0 -0
  379. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/attributes.py +0 -0
  380. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/blacklist.py +0 -0
  381. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/blacklist_transitive.py +0 -0
  382. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/cached_function.py +0 -0
  383. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/comments.py +0 -0
  384. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/complex_dependencies.py +0 -0
  385. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/complex_dependency.py +0 -0
  386. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/conditional_import.py +0 -0
  387. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/dependency.py +0 -0
  388. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/diamond_bottom.py +0 -0
  389. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/diamond_left.py +0 -0
  390. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/diamond_right.py +0 -0
  391. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/diamond_top.py +0 -0
  392. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/enums.py +0 -0
  393. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/fields.py +0 -0
  394. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/generic_classes.py +0 -0
  395. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/import_dependency.py +0 -0
  396. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/inheritance.py +0 -0
  397. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/lambda.py +0 -0
  398. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/lazy_module_getattr.py +0 -0
  399. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/methods.py +0 -0
  400. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/nested_functions.py +0 -0
  401. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/no_any_annotations.py +0 -0
  402. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/no_dependencies.py +0 -0
  403. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/overridden_inherited_methods.py +0 -0
  404. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/rewritten_module.py +0 -0
  405. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/simple_dependencies.py +0 -0
  406. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/tuple_return.py +0 -0
  407. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/typing_parameters.py +0 -0
  408. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/uses_async_dependency.py +0 -0
  409. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/visibility.py +0 -0
  410. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/visibility_dependency.py +0 -0
  411. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/crash/__init__.py +0 -0
  412. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/crash/partly_crashing.py +0 -0
  413. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/crash/seg_fault.py +0 -0
  414. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/duckmock/__init__.py +0 -0
  415. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/duckmock/complex.py +0 -0
  416. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/errors/__init__.py +0 -0
  417. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/errors/import_error.py +0 -0
  418. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/errors/timeout_error.py +0 -0
  419. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/AGENTS.md +0 -0
  420. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/__init__.py +0 -0
  421. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/abstract_classes.py +0 -0
  422. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/assertions.py +0 -0
  423. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/basket.py +0 -0
  424. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/calculator.py +0 -0
  425. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/calculator_simple.py +0 -0
  426. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/collections.py +0 -0
  427. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/constructors.py +0 -0
  428. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/difficult.py +0 -0
  429. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/dummies.py +0 -0
  430. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/dynamosa_example.py +0 -0
  431. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/enums.py +0 -0
  432. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/exceptions.py +0 -0
  433. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/flaky.py +0 -0
  434. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/higher_order.py +0 -0
  435. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/impossible.py +0 -0
  436. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/inheritance.py +0 -0
  437. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/loop.py +0 -0
  438. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/module_alias.py +0 -0
  439. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/monkey.py +0 -0
  440. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/nested.py +0 -0
  441. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/no_cover_example.py +0 -0
  442. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/objects.py +0 -0
  443. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/pattern_matching.py +0 -0
  444. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/private_methods.py +0 -0
  445. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/queue.py +0 -0
  446. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/reexport_package/__init__.py +0 -0
  447. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/reexport_package/widget.py +0 -0
  448. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/shadowed_submodule/__init__.py +0 -0
  449. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/shadowed_submodule/shadowed.py +0 -0
  450. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/simple.py +0 -0
  451. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/submodule_package/__init__.py +0 -0
  452. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/submodule_package/helper.py +0 -0
  453. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/submodule_package/target.py +0 -0
  454. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/triangle.py +0 -0
  455. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/type_inference.py +0 -0
  456. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/type_tracing/__init__.py +0 -0
  457. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/type_tracing/geometry.py +0 -0
  458. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/type_tracing/invoice.py +0 -0
  459. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/type_tracing/large_test_cluster.py +0 -0
  460. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/type_tracing/mixed.py +0 -0
  461. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/type_tracing/string_subtype.py +0 -0
  462. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/unasserted_exceptions.py +0 -0
  463. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/grammar/__init__.py +0 -0
  464. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/grammar/parameters.py +0 -0
  465. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/AGENTS.md +0 -0
  466. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/__init__.py +0 -0
  467. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/comparison.py +0 -0
  468. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/covered_branches.py +0 -0
  469. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/covered_classes.py +0 -0
  470. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/covered_functions.py +0 -0
  471. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/covered_lines.py +0 -0
  472. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/excluded_blocks.py +0 -0
  473. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/if_else_targets.py +0 -0
  474. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/inherited.py +0 -0
  475. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/mixed.py +0 -0
  476. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/simple.py +0 -0
  477. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/unpickling.py +0 -0
  478. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/linecoverage/__init__.py +0 -0
  479. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/linecoverage/artificial_none.py +0 -0
  480. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/linecoverage/emptyfile.py +0 -0
  481. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/linecoverage/exception.py +0 -0
  482. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/linecoverage/list.py +0 -0
  483. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/linecoverage/plus.py +0 -0
  484. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/linecoverage/setter_getter.py +0 -0
  485. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/__init__.py +0 -0
  486. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/busy_loop.py +0 -0
  487. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/exception.py +0 -0
  488. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/expected.py +0 -0
  489. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/mutation.py +0 -0
  490. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/raising.py +0 -0
  491. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/recursive_enum.py +0 -0
  492. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/relative_package/__init__.py +0 -0
  493. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/relative_package/helper.py +0 -0
  494. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/timeout.py +0 -0
  495. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/programgraph/__init__.py +0 -0
  496. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/programgraph/infinite_loops.py +0 -0
  497. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/programgraph/samples.py +0 -0
  498. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/programgraph/whileloop.py +0 -0
  499. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/programgraph/yield_fun.py +0 -0
  500. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/regression/__init__.py +0 -0
  501. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/regression/argparse_sys_exit.py +0 -0
  502. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/regression/custom_error.py +0 -0
  503. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/regression/not_main.py +0 -0
  504. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/__init__.py +0 -0
  505. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/dynamicseeding/__init__.py +0 -0
  506. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/dynamicseeding/dynamicseedingdummies.py +0 -0
  507. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/__init__.py +0 -0
  508. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/dummycontainer.py +0 -0
  509. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/__init__.py +0 -0
  510. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/assertseed_test_.py +0 -0
  511. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/classseed_test_.py +0 -0
  512. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collfuncseed_test_.py +0 -0
  513. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collseed_test_.py +0 -0
  514. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/nestedseed_test_.py +0 -0
  515. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notknowncall_test_.py +0 -0
  516. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notprimseed_test_.py +0 -0
  517. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/primitiveseed_test_.py +0 -0
  518. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/triangleseed_test_.py +0 -0
  519. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongassignseed_test_.py +0 -0
  520. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongfunctionnameseed_test_.py +0 -0
  521. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/staticconstantseeding/__init__.py +0 -0
  522. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/staticconstantseeding/dummy/__init__.py +0 -0
  523. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/staticconstantseeding/dummy/dummy.py +0 -0
  524. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/staticconstantseeding/dummy/empty.so +0 -0
  525. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/__init__.py +0 -0
  526. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/attribute_dependencies.py +0 -0
  527. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/closure.py +0 -0
  528. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/generator.py +0 -0
  529. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/immutable_attribute_dependency.py +0 -0
  530. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/import_star_def.py +0 -0
  531. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/import_star_main.py +0 -0
  532. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/partial_cover_dependency.py +0 -0
  533. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/simple_call.py +0 -0
  534. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/simple_call_arg.py +0 -0
  535. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/test.conf +0 -0
  536. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/test.conf.license +0 -0
  537. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/tests/typeinference/test_stubstrategy.pyi +0 -0
  538. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/type_tracing/__init__.py +0 -0
  539. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/type_tracing/guess_params.py +0 -0
  540. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/type_tracing/return_types.py +0 -0
  541. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/type_tracing/union_type.py +0 -0
  542. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/types/__init__.py +0 -0
  543. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/types/outside.py +0 -0
  544. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/types/subtyping.py +0 -0
  545. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/types/symbols.py +0 -0
  546. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/AGENTS.md +0 -0
  547. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/__init__.py +0 -0
  548. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/__init__.py +0 -0
  549. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_archive.py +0 -0
  550. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_dynamosaalgorithm.py +0 -0
  551. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_generationalgorithm.py +0 -0
  552. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_integration_mosaalgorithm.py +0 -0
  553. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_integration_varioussearchalgorithms.py +0 -0
  554. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_lldynamosaalgorithm.py +0 -0
  555. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_llm_async_search.py +0 -0
  556. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_llmosalgorithm.py +0 -0
  557. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_mioalgorithm.py +0 -0
  558. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_mosaalgorithm.py +0 -0
  559. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_randomalgorithm.py +0 -0
  560. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/__init__.py +0 -0
  561. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/crossover/__init__.py +0 -0
  562. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/crossover/test_singlepointrelativecrossover.py +0 -0
  563. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/ranking/__init__.py +0 -0
  564. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/ranking/test_rankingfunction.py +0 -0
  565. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/selection/__init__.py +0 -0
  566. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/selection/test_randomselection.py +0 -0
  567. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/selection/test_rankselection.py +0 -0
  568. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/selection/test_selection.py +0 -0
  569. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/selection/test_tournamentselection.py +0 -0
  570. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/selection/test_truncationselection.py +0 -0
  571. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/test_dominancecomparator.py +0 -0
  572. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/test_preferencesortingcomparator.py +0 -0
  573. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/__init__.py +0 -0
  574. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_coverageplateaustoppingcondition.py +0 -0
  575. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_maxcoveragestoppingcondition.py +0 -0
  576. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_maxiterationsstoppingcondition.py +0 -0
  577. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_maxmemorystoppingcondition.py +0 -0
  578. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_maxstatementstoppingcondition.py +0 -0
  579. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_maxtestsstoppingcondition.py +0 -0
  580. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_maxtimestoppingcondition.py +0 -0
  581. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_minimumcoverageplateaustoppingcondition.py +0 -0
  582. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_stoppingcondition.py +0 -0
  583. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_chromosome.py +0 -0
  584. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_chromosomefactory.py +0 -0
  585. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_computations.py +0 -0
  586. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_computations_cache.py +0 -0
  587. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_computations_fitness_utilities.py +0 -0
  588. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_coveragegoals.py +0 -0
  589. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_fine_grained_targeting.py +0 -0
  590. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_fine_grained_targeting_integration.py +0 -0
  591. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_generationalgorithmfactory.py +0 -0
  592. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_generator.py +0 -0
  593. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_llmtestsuitechromosomefactory.py +0 -0
  594. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_postprocess.py +0 -0
  595. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_testcasechromosome.py +0 -0
  596. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_testcasefactory.py +0 -0
  597. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_testsuitechromosome.py +0 -0
  598. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/AGENTS.md +0 -0
  599. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/__init__.py +0 -0
  600. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_adapters.py +0 -0
  601. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_ast_info.py +0 -0
  602. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_cfg.py +0 -0
  603. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_controldependencegraph.py +0 -0
  604. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_machinery.py +0 -0
  605. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_programgraph.py +0 -0
  606. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_tracer.py +0 -0
  607. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_type_checking_integration.py +0 -0
  608. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_version.py +0 -0
  609. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/__init__.py +0 -0
  610. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_aggregation.py +0 -0
  611. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_island.py +0 -0
  612. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_llm_worker.py +0 -0
  613. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_llm_worker_algorithm.py +0 -0
  614. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_llm_worker_protocol.py +0 -0
  615. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_migration.py +0 -0
  616. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_migration_algorithm.py +0 -0
  617. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_orchestrator.py +0 -0
  618. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_population_allocation.py +0 -0
  619. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/__init__.py +0 -0
  620. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/parsing/test_helpers.py +0 -0
  621. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/parsing/test_type_str_parser.py +0 -0
  622. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/__init__.py +0 -0
  623. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_assertiongenerationprompt.py +0 -0
  624. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_module_prompts.py +0 -0
  625. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_mutationstrengthenprompt.py +0 -0
  626. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_readabilityrefinementprompt.py +0 -0
  627. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_repairprompt.py +0 -0
  628. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_semanticassertionsprompt.py +0 -0
  629. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_testcasegenerationprompt.py +0 -0
  630. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_uncovered_targets_prompt.py +0 -0
  631. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_cache.py +0 -0
  632. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_caching.py +0 -0
  633. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_characterization.py +0 -0
  634. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_client_async.py +0 -0
  635. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_client_thinking.py +0 -0
  636. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_extract_python_code.py +0 -0
  637. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_llm_caching.py +0 -0
  638. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_llm_deserializer.py +0 -0
  639. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_llmagent.py +0 -0
  640. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_llmagent_extended.py +0 -0
  641. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_llmtestcasehandler.py +0 -0
  642. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_llmtestcasehandler_coverage.py +0 -0
  643. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_query_strategy.py +0 -0
  644. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_request_budget.py +0 -0
  645. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_rewriter.py +0 -0
  646. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_temperature_fallback.py +0 -0
  647. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/master_worker/__init__.py +0 -0
  648. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/master_worker/test_client.py +0 -0
  649. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/master_worker/test_master.py +0 -0
  650. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/master_worker/test_worker.py +0 -0
  651. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/__init__.py +0 -0
  652. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/test_context_extractor.py +0 -0
  653. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/test_mock_hint_generator.py +0 -0
  654. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/test_mock_rule_generator.py +0 -0
  655. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/test_static_setups.py +0 -0
  656. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/test_untyped_param_analyzer.py +0 -0
  657. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/quick_eval/__init__.py +0 -0
  658. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/quick_eval/test_args.py +0 -0
  659. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/quick_eval/test_output_dir.py +0 -0
  660. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/quick_eval/test_stats.py +0 -0
  661. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/quick_eval/test_suite_project_path.py +0 -0
  662. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/quick_eval/test_suite_scope.py +0 -0
  663. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/__init__.py +0 -0
  664. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_aaa_inserter.py +0 -0
  665. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_alignment.py +0 -0
  666. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_api_signatures.py +0 -0
  667. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_ast_analyzer.py +0 -0
  668. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_coverage_checker.py +0 -0
  669. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_llm_client.py +0 -0
  670. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_llm_judge.py +0 -0
  671. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_module_mutation_strengthening.py +0 -0
  672. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_module_refinement.py +0 -0
  673. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_mutation_analyzer.py +0 -0
  674. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_pipeline.py +0 -0
  675. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_readability_metrics.py +0 -0
  676. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_refiner.py +0 -0
  677. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_sut_inspector.py +0 -0
  678. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/resources/__init__.py +0 -0
  679. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/resources/typeevalpy/__init__.py +0 -0
  680. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/resources/typeevalpy/dummy.py +0 -0
  681. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/resources/typeevalpy/dummy_gt.json +0 -0
  682. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/resources/typeevalpy/dummy_gt.json.license +0 -0
  683. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/slicer/__init__.py +0 -0
  684. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/slicer/test_assertionslicer.py +0 -0
  685. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/slicer/test_dependencies.py +0 -0
  686. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/slicer/test_expected_failures.py +0 -0
  687. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/slicer/test_language_features.py +0 -0
  688. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/slicer/test_statementslicer.py +0 -0
  689. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/slicer/util.py +0 -0
  690. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/test___main__.py +0 -0
  691. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/test_cli.py +0 -0
  692. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/test_compiled_sut_integration.py +0 -0
  693. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/test_random_sut_integration.py +0 -0
  694. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/test_reload_state_coverage_integration.py +0 -0
  695. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/test_shadowed_sut_integration.py +0 -0
  696. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/AGENTS.md +0 -0
  697. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/__init__.py +0 -0
  698. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/_builders.py +0 -0
  699. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/__init__.py +0 -0
  700. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_executedinstruction.py +0 -0
  701. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_executionmocking.py +0 -0
  702. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_executionresult.py +0 -0
  703. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_executiontrace.py +0 -0
  704. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_generator_integration.py +0 -0
  705. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_moduleprovider.py +0 -0
  706. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_outputsuppression.py +0 -0
  707. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_returntype.py +0 -0
  708. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_subprocesstestcaseexecutor.py +0 -0
  709. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_subprocesstestcaseexecutor_differential.py +0 -0
  710. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_subprocesstestcaseexecutor_integration.py +0 -0
  711. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_tuple_deconstruction_integration.py +0 -0
  712. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_typetracing.py +0 -0
  713. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/export/__init__.py +0 -0
  714. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/export/conftest.py +0 -0
  715. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/statements/__init__.py +0 -0
  716. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_collection_tracker.py +0 -0
  717. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_constant_seeding_integration.py +0 -0
  718. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_dict_branch_coverage_integration.py +0 -0
  719. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_literalgen.py +0 -0
  720. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_llmlocalsearch.py +0 -0
  721. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_localsearch.py +0 -0
  722. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_localsearchstatement.py +0 -0
  723. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_localsearchtimer.py +0 -0
  724. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_ml_testfactory.py +0 -0
  725. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_testcase.py +0 -0
  726. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/variable/__init__.py +0 -0
  727. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testutils.py +0 -0
  728. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/__init__.py +0 -0
  729. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/generic/__init__.py +0 -0
  730. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/generic/test_genericaccessibleobject.py +0 -0
  731. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/pynguinml/__init__.py +0 -0
  732. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/pynguinml/test_ml_parsing_utils.py +0 -0
  733. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/pynguinml/test_ml_testfactory_utils.py +0 -0
  734. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/pynguinml/test_ml_testing_resources.py +0 -0
  735. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/pynguinml/test_mlparameter.py +0 -0
  736. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/pynguinml/test_np_rng.py +0 -0
  737. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/pynguinml/test_pynguinml_integration.py +0 -0
  738. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/stats/__init__.py +0 -0
  739. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/stats/test_outputvariablefactory.py +0 -0
  740. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/stats/test_runtimevariable.py +0 -0
  741. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/stats/test_searchstatistics.py +0 -0
  742. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/stats/test_statistics.py +0 -0
  743. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/stats/test_statisticsbackend.py +0 -0
  744. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_atomicinteger.py +0 -0
  745. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_collection_utils.py +0 -0
  746. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_controlflowdistance.py +0 -0
  747. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_exceptions.py +0 -0
  748. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_execution_recorder.py +0 -0
  749. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_fandango_faker_utils.py +0 -0
  750. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_fs_isolation.py +0 -0
  751. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_llm.py +0 -0
  752. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_logging_utils.py +0 -0
  753. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_mirror.py +0 -0
  754. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_mutation_utils.py +0 -0
  755. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_naming.py +0 -0
  756. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_orderedset.py +0 -0
  757. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_randomness.py +0 -0
  758. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_report.py +0 -0
  759. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_string_subtype_integration.py +0 -0
  760. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_timeout.py +0 -0
  761. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_type_utils.py +0 -0
  762. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_typeevalpy_integration.py +0 -0
  763. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_typeevalpy_json_schema.py +0 -0
  764. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_typetracing.py +0 -0
  765. {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pynguin
3
- Version: 0.48.0
3
+ Version: 0.49.0.dev0
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
@@ -4,7 +4,7 @@
4
4
 
5
5
  [tool.poetry]
6
6
  name = "pynguin"
7
- version = "0.48.0"
7
+ version = "0.49.0.dev"
8
8
  description = "Pynguin is a tool for automated unit test generation for Python"
9
9
  authors = [
10
10
  "Stephan Lukasczyk <stephan@pynguin.eu>",
@@ -6,4 +6,4 @@
6
6
  #
7
7
  """Specifies the version of Pynguin."""
8
8
 
9
- __version__ = "0.48.0"
9
+ __version__ = "0.49.0.dev"
@@ -129,6 +129,25 @@ class MutationStrategy(str, enum.Enum):
129
129
  IEEE Transactions on SE 39.4 2013)"""
130
130
 
131
131
 
132
+ class MockLLMBackend(str, enum.Enum):
133
+ """Where the mock-generation pipeline sends its LLM requests."""
134
+
135
+ AUTO = "AUTO"
136
+ """Use the proxy-cache when a proxy URL is configured, otherwise Pynguin's own
137
+ LLM client when an API key is available, otherwise no LLM at all."""
138
+
139
+ PROXY = "PROXY"
140
+ """Send classification and hint requests to the proxy-cache service."""
141
+
142
+ PYNGUIN = "PYNGUIN"
143
+ """Send classification and hint requests through Pynguin's own LLM client
144
+ (``LLM_API_KEY``/``LLM_BASE_URL``/``LLM_MODEL``), cached on disk."""
145
+
146
+ NONE = "NONE"
147
+ """Make no LLM calls: classify with the local rules only and configure mocks
148
+ from the static setups alone."""
149
+
150
+
132
151
  class RefinementGranularity(str, enum.Enum):
133
152
  """Granularity of the LLM readability & assertion refinement stages."""
134
153
 
@@ -1174,8 +1193,14 @@ class MockGenerationConfiguration:
1174
1193
  """Configuration for mock generation."""
1175
1194
 
1176
1195
  mock_generation_enabled: bool = False
1177
- """Enable the mock generation pipeline. Requires proxy_cache_url or
1178
- PYNGUIN_PROXY_CACHE_URL to be set, otherwise falls back to default Pynguin."""
1196
+ """Enable the mock generation pipeline. Classes and functions the module under
1197
+ test reaches are classified locally first; only the remaining third-party ones
1198
+ are sent to the LLM backend selected by ``llm_backend``."""
1199
+
1200
+ llm_backend: MockLLMBackend = MockLLMBackend.AUTO
1201
+ """Where classification and return-value hint requests go. ``AUTO`` prefers the
1202
+ proxy-cache when a proxy URL is configured, then Pynguin's own LLM client when an
1203
+ API key is available, and otherwise runs without an LLM."""
1179
1204
 
1180
1205
  proxy_cache_url: str = ""
1181
1206
  """Base URL of the proxy-cache service.
@@ -1186,6 +1211,34 @@ class MockGenerationConfiguration:
1186
1211
  When provided, the dependency analyzer consults these rules before the LLM.
1187
1212
  Omit to rely purely on the LLM classify endpoint."""
1188
1213
 
1214
+ base_rules_path: str = ""
1215
+ """Optional path to a local rules JSON file produced by the mock rule generator.
1216
+ Used instead of ``base_rules_cache_id`` when set, so mined rules work without
1217
+ the proxy-cache."""
1218
+
1219
+ spec_probability: float = 0.5
1220
+ """Probability that a new mock of a known class is built as
1221
+ ``MagicMock(spec=<class>)``. A spec'd mock passes ``isinstance`` checks and
1222
+ raises ``AttributeError`` for attributes the class lacks; a bare mock accepts
1223
+ everything. Mutation flips the choice, so the search keeps whichever reaches
1224
+ more code. Expects values in [0, 1]."""
1225
+
1226
+ patch_calls: bool = True
1227
+ """Also patch calls the module under test makes to external functions (e.g.
1228
+ ``os.getenv``, ``time.time``, ``requests.get``) that the classifier marks as
1229
+ environment, clock, randomness, or I/O boundaries. Patches are scoped to the
1230
+ module under test during generation and exported as ``patch.object(...)``."""
1231
+
1232
+ patch_probability: float = 0.5
1233
+ """Probability that a freshly generated test case patches each detected
1234
+ external call. Expects values in [0, 1]."""
1235
+
1236
+ unconstructable_mock_probability: float = 0.4
1237
+ """Probability of passing a mock (spec'd to the class) for a parameter whose
1238
+ type Pynguin cannot construct, e.g. an abstract class or a protocol. Types that
1239
+ can be constructed are never mocked unless they are classified boundaries.
1240
+ Optional parameters of such types are skipped instead. Expects values in [0, 1]."""
1241
+
1189
1242
 
1190
1243
  @dataclasses.dataclass
1191
1244
  class LocalSearchConfiguration:
@@ -97,6 +97,7 @@ from pynguin.utils.timeout import TestExecutionTimeoutError, time_limit
97
97
  if TYPE_CHECKING:
98
98
  from pynguin.analyses.module import ModuleTestCluster
99
99
  from pynguin.ga.algorithms.generationalgorithm import GenerationAlgorithm
100
+ from pynguin.mock_generation.mock_generator import MockGenerator
100
101
 
101
102
  if config.configuration.pynguinml.ml_testing_enabled or TYPE_CHECKING:
102
103
  from pynguin.utils.pynguinml import np_rng
@@ -644,6 +645,38 @@ def _cluster_candidate_classes(test_cluster: ModuleTestCluster) -> list[type]:
644
645
  return classes
645
646
 
646
647
 
648
+ def _unconstructable_param_classes(test_cluster: ModuleTestCluster) -> set[str]:
649
+ """FQNs of parameter classes of the module under test that Pynguin cannot build.
650
+
651
+ Such parameters (abstract classes, protocols, classes without a usable
652
+ constructor) may receive a mock; their static setups are derived like those of
653
+ classified boundaries, so the mock can reach value-dependent branches.
654
+
655
+ Args:
656
+ test_cluster: The test cluster of the module under test.
657
+
658
+ Returns:
659
+ The FQNs (``module.qualname``) of those classes.
660
+ """
661
+ from pynguin.analyses.typesystem import Instance # noqa: PLC0415
662
+ from pynguin.testcase.testfactory import may_mock_unconstructable # noqa: PLC0415
663
+
664
+ out: set[str] = set()
665
+ for accessible in test_cluster.accessible_objects_under_test:
666
+ signature = getattr(accessible, "inferred_signature", None)
667
+ if signature is None:
668
+ continue
669
+ for param_type in signature.original_parameters.values():
670
+ if not isinstance(param_type, Instance):
671
+ continue
672
+ raw = param_type.type.raw_type
673
+ if not isinstance(raw, type):
674
+ continue
675
+ if may_mock_unconstructable(raw) and not test_cluster.get_generators_for(param_type):
676
+ out.add(f"{raw.__module__}.{raw.__qualname__}")
677
+ return out
678
+
679
+
647
680
  def _untyped_param_bindings(
648
681
  module_path: Path, candidate_classes: list[type], mock_targets: set[str]
649
682
  ) -> dict[tuple[str, str], str]:
@@ -722,6 +755,10 @@ def _apply_static_setups( # noqa: C901
722
755
  except SyntaxError:
723
756
  return
724
757
  alias_map = ast_helpers.import_alias_map(tree)
758
+ # Classes the module defines itself (e.g. an abstract parameter type).
759
+ for node in tree.body:
760
+ if isinstance(node, ast.ClassDef) and module_name:
761
+ alias_map.setdefault(node.name, f"{module_name}.{node.name}")
725
762
  candidates = candidate_classes or []
726
763
 
727
764
  # Index the injector's untyped bindings by callable key, as generate_templates does.
@@ -765,6 +802,127 @@ def _apply_static_setups( # noqa: C901
765
802
  template.setup_lines.append(line)
766
803
 
767
804
 
805
+ def _resolve_fqn(fqn: str) -> Any:
806
+ """Import the object a fully-qualified name stands for.
807
+
808
+ Args:
809
+ fqn: A dotted name such as ``requests.sessions.Session``.
810
+
811
+ Returns:
812
+ The object, or None if no prefix of *fqn* imports as a module holding it.
813
+ """
814
+ parts = fqn.split(".")
815
+ for split in range(len(parts) - 1, 0, -1):
816
+ try:
817
+ obj: Any = importlib.import_module(".".join(parts[:split]))
818
+ except Exception: # noqa: BLE001, S112
819
+ continue
820
+ for name in parts[split:]:
821
+ obj = getattr(obj, name, None)
822
+ if obj is None:
823
+ break
824
+ if obj is not None:
825
+ return obj
826
+ return None
827
+
828
+
829
+ def _apply_spec_paths(module: types.ModuleType, mock_targets: set[str]) -> None:
830
+ """Record how each mocked class is spelled from the module under test.
831
+
832
+ The path lets a mock be rendered as ``MagicMock(spec=module_0.<path>)`` without
833
+ importing anything else into the generated test.
834
+
835
+ Args:
836
+ module: The module under test.
837
+ mock_targets: The FQNs of the mocked classes.
838
+ """
839
+ import pynguin.testcase.mock_templates_store as _mock_store # noqa: PLC0415
840
+ from pynguin.mock_generation.patch_targets import ( # noqa: PLC0415
841
+ find_attribute_path,
842
+ )
843
+
844
+ for fqn in sorted(mock_targets):
845
+ obj = _resolve_fqn(fqn)
846
+ if obj is None:
847
+ continue
848
+ path = find_attribute_path(module, obj)
849
+ if path is None:
850
+ continue
851
+ _mock_store.MOCK_SPEC_PATHS[fqn] = path
852
+ template = _mock_store.MOCK_TEMPLATES_BY_TARGET.get(fqn)
853
+ if template is not None:
854
+ template.spec_path = path
855
+
856
+
857
+ def _setup_patch_templates(
858
+ module: types.ModuleType,
859
+ gen: MockGenerator,
860
+ base_rules_cache_id: str | None,
861
+ rules_path: Path | None,
862
+ ) -> int:
863
+ """Find the external functions the module under test calls and pick those to patch.
864
+
865
+ Each candidate goes through the same classifier as the mocked classes; every
866
+ callee decided as ``mock`` becomes a patch template whose return values come
867
+ from the static analysis of its call sites.
868
+
869
+ Args:
870
+ module: The module under test.
871
+ gen: The mock generator whose classifier decides.
872
+ base_rules_cache_id: proxy-cache rule set to consult before the LLM.
873
+ rules_path: local rules JSON, used instead of *base_rules_cache_id*.
874
+
875
+ Returns:
876
+ The number of patch templates created.
877
+ """
878
+ import pynguin.testcase.mock_templates_store as _mock_store # noqa: PLC0415
879
+ from pynguin.mock_generation import patch_targets # noqa: PLC0415
880
+ from pynguin.mock_generation.mock_generator import ( # noqa: PLC0415
881
+ MockTemplate,
882
+ MutableSetup,
883
+ )
884
+
885
+ module_path = Path(str(module.__file__))
886
+ source = module_path.read_text(encoding="utf-8")
887
+ candidates = patch_targets.find_patch_candidates(source, module)
888
+ if not candidates:
889
+ return 0
890
+ analyzer = gen.analyzer(module_path, base_rules_cache_id, rules_path)
891
+ decisions = {
892
+ decision.target: decision
893
+ for decision in analyzer.classify_targets([
894
+ (target.fqn, callee) for target, callee in candidates
895
+ ])
896
+ }
897
+ for target, _callee in candidates:
898
+ decision = decisions.get(target.fqn)
899
+ if decision is None or decision.decision != "mock":
900
+ continue
901
+ mutable, lines = patch_targets.patch_setups(source, target)
902
+ dependency = target.attribute.lower()
903
+ _mock_store.MOCK_PATCH_TEMPLATES.append(
904
+ MockTemplate(
905
+ dependency=dependency,
906
+ import_path=target.fqn.split(".", maxsplit=1)[0],
907
+ mock_target=target.fqn,
908
+ setup_code=f"mock_{dependency} = MagicMock()",
909
+ setup_lines=lines,
910
+ mutable_setups=[
911
+ MutableSetup(target=chain, candidates=cands) for chain, cands in mutable
912
+ ],
913
+ patch_target=target,
914
+ )
915
+ )
916
+ _LOGGER.info(
917
+ "Mock generation: patching %s (%s: %s), setups=%s",
918
+ target.fqn,
919
+ decision.source,
920
+ decision.reason,
921
+ [(chain, cands) for chain, cands in mutable] + lines,
922
+ )
923
+ return len(_mock_store.MOCK_PATCH_TEMPLATES)
924
+
925
+
768
926
  def _setup_mock_generation(test_cluster: ModuleTestCluster) -> None:
769
927
  """Run the mock pipeline and record its statistics.
770
928
 
@@ -781,16 +939,20 @@ def _setup_mock_generation(test_cluster: ModuleTestCluster) -> None:
781
939
  stat.track_output_variable(RuntimeVariable.MockTargetsFromLLM, metrics["from_llm"])
782
940
  stat.track_output_variable(RuntimeVariable.MockHintTargets, metrics["hint_targets"])
783
941
  stat.track_output_variable(RuntimeVariable.MockUntypedParams, metrics["untyped_params"])
942
+ stat.track_output_variable(RuntimeVariable.MockPatchTargets, metrics["patch_targets"])
784
943
  stat.track_output_variable(RuntimeVariable.MockGenerationTime, metrics["time"])
785
944
 
786
945
 
787
946
  def _run_mock_generation(test_cluster: ModuleTestCluster) -> dict[str, Any]:
788
947
  """Run the mock pipeline and store templates for statement insertion.
789
948
 
790
- Feeds the proxy-cache-generated mock templates to the test factory (via the shared
949
+ Feeds the mock templates to the test factory (via the shared
791
950
  ``mock_templates_store``) so that, when Pynguin needs a value of a
792
951
  mocked-library type, it inserts a mock statement configured from the
793
- corresponding template (return values / side effects included).
952
+ corresponding template (return values / side effects included). External
953
+ functions the module calls and the classifier marks as ``mock`` become patch
954
+ templates. The LLM backend (proxy-cache or Pynguin's own client) is optional;
955
+ without one only rules, default patch rules, and static setups are used.
794
956
 
795
957
  Args:
796
958
  test_cluster: supplies the classes an untyped parameter may statically
@@ -807,23 +969,23 @@ def _run_mock_generation(test_cluster: ModuleTestCluster) -> dict[str, Any]:
807
969
  "from_llm": 0,
808
970
  "hint_targets": 0,
809
971
  "untyped_params": 0,
972
+ "patch_targets": 0,
810
973
  "time": 0.0,
811
974
  }
812
975
 
813
976
  if not config.configuration.mock_generation.mock_generation_enabled:
814
977
  return metrics
815
978
 
816
- from pynguin.mock_generation.proxy_cache_resolver import ( # noqa: PLC0415
817
- get_proxy_cache_url,
818
- )
979
+ from pynguin.mock_generation import llm_backend # noqa: PLC0415
819
980
 
820
- if not get_proxy_cache_url():
981
+ backend = llm_backend.active_backend()
982
+ if backend == config.MockLLMBackend.NONE:
821
983
  _LOGGER.warning(
822
- "Mock generation is enabled but no proxy-cache URL found. "
823
- "Set PYNGUIN_PROXY_CACHE_URL or --proxy_cache_url. "
824
- "Falling back to default Pynguin without mocks."
984
+ "Mock generation runs without an LLM: no proxy-cache URL and no LLM API key. "
985
+ "Only rules, default patch rules, and static setups are used."
825
986
  )
826
- return metrics
987
+ else:
988
+ _LOGGER.info("Mock generation LLM backend: %s", backend.value)
827
989
 
828
990
  module_name = config.configuration.module_name
829
991
  module = sys.modules.get(module_name)
@@ -836,7 +998,11 @@ def _run_mock_generation(test_cluster: ModuleTestCluster) -> dict[str, Any]:
836
998
  MockGenerator,
837
999
  )
838
1000
 
839
- base_rules_cache_id = config.configuration.mock_generation.base_rules_cache_id or None
1001
+ mock_config = config.configuration.mock_generation
1002
+ base_rules_cache_id = mock_config.base_rules_cache_id or None
1003
+ rules_path = Path(mock_config.base_rules_path) if mock_config.base_rules_path else None
1004
+ _mock_store.MOCK_SPEC_PATHS = {}
1005
+ _mock_store.MOCK_PATCH_TEMPLATES = []
840
1006
 
841
1007
  # Classes an untyped parameter could statically match. Computed unconditionally
842
1008
  # so untyped parameters are mocked directly (no type tracing required).
@@ -844,11 +1010,12 @@ def _run_mock_generation(test_cluster: ModuleTestCluster) -> dict[str, Any]:
844
1010
 
845
1011
  start = time.perf_counter()
846
1012
  try:
847
- gen = MockGenerator(use_proxy=True)
1013
+ gen = MockGenerator(use_llm=backend != config.MockLLMBackend.NONE)
848
1014
  gen.generate_for_module(
849
1015
  Path(str(module.__file__)),
850
1016
  base_rules_cache_id,
851
1017
  candidate_classes=candidate_classes,
1018
+ rules_path=rules_path,
852
1019
  )
853
1020
  _mock_store.MOCK_TARGETS = gen.mock_targets
854
1021
  _mock_store.MOCK_UNTYPED_PARAMS = _untyped_param_bindings(
@@ -878,27 +1045,39 @@ def _run_mock_generation(test_cluster: ModuleTestCluster) -> dict[str, Any]:
878
1045
  mock_hint_generator,
879
1046
  )
880
1047
 
881
- templates = mock_hint_generator.generate_templates(
882
- Path(str(module.__file__)),
883
- gen.mock_targets,
884
- candidate_classes,
885
- module_name=module_name,
886
- untyped_bindings=_mock_store.MOCK_UNTYPED_PARAMS,
1048
+ templates = (
1049
+ mock_hint_generator.generate_templates(
1050
+ Path(str(module.__file__)),
1051
+ gen.mock_targets,
1052
+ candidate_classes,
1053
+ module_name=module_name,
1054
+ untyped_bindings=_mock_store.MOCK_UNTYPED_PARAMS,
1055
+ )
1056
+ if backend != config.MockLLMBackend.NONE
1057
+ else {}
887
1058
  )
888
1059
  _mock_store.MOCK_TEMPLATES_BY_TARGET = templates
889
1060
  metrics["hint_targets"] = len(templates)
890
1061
 
891
1062
  # Static, deterministic return-value setups derived from the SUT itself
892
1063
  # (branch constants + iteration defaults), so bare mocks reach value-
893
- # dependent branches even when the proxy-cache returned no hints.
1064
+ # dependent branches even when the LLM returned no hints. Parameter types
1065
+ # Pynguin cannot construct get them too, as they may be mocked.
1066
+ mockable = gen.mock_targets | _unconstructable_param_classes(test_cluster)
894
1067
  _apply_static_setups(
895
1068
  Path(str(module.__file__)),
896
- gen.mock_targets,
1069
+ mockable,
897
1070
  candidate_classes,
898
1071
  module_name,
899
1072
  _mock_store.MOCK_UNTYPED_PARAMS,
900
1073
  )
901
1074
 
1075
+ _apply_spec_paths(module, mockable)
1076
+ if mock_config.patch_calls:
1077
+ metrics["patch_targets"] = _setup_patch_templates(
1078
+ module, gen, base_rules_cache_id, rules_path
1079
+ )
1080
+
902
1081
  for fqn, template in templates.items():
903
1082
  for setup in template.mutable_setups:
904
1083
  _LOGGER.info(
@@ -6,9 +6,10 @@
6
6
  #
7
7
  """Classifies the external classes a module uses as 'mock', 'skip', or 'unknown'.
8
8
 
9
- Each candidate is a fully-qualified class name (target). Classification order,
10
- first match wins: exception class -> skip, standard library -> skip, heuristic
11
- rule -> mock, proxy-cache (LLM) -> mock/skip, otherwise unknown.
9
+ Each candidate is a fully-qualified class or function name (target).
10
+ Classification order, first match wins: exception class -> skip, project under
11
+ test -> skip, heuristic rule -> mock, default patch rule (functions) -> mock,
12
+ standard library -> skip, LLM backend -> mock/skip, otherwise unknown.
12
13
  """
13
14
 
14
15
  from __future__ import annotations
@@ -21,6 +22,7 @@ import sys
21
22
  from dataclasses import dataclass
22
23
  from typing import TYPE_CHECKING, Any, Literal
23
24
 
25
+ import pynguin.configuration as config
24
26
  from pynguin.mock_generation import llm_classifier_client
25
27
 
26
28
  if TYPE_CHECKING:
@@ -84,13 +86,20 @@ class DependencyAnalyzer:
84
86
  heuristic_rules: HeuristicRules | None = None,
85
87
  *,
86
88
  rules_cache_id: str | None = None,
87
- use_proxy: bool = False,
89
+ rules_path: Path | None = None,
90
+ use_llm: bool = False,
88
91
  ) -> None:
89
- """module_path: SUT source file; rules_cache_id: proxy-cache rules set to load."""
92
+ """Create an analyzer for one module.
93
+
94
+ module_path: SUT source file; rules_path: local rules JSON (preferred over
95
+ rules_cache_id, a proxy-cache rules set to load).
96
+ """
90
97
  self._module_path = module_path
91
- self._use_proxy = use_proxy
98
+ self._use_llm = use_llm
92
99
  if heuristic_rules is not None:
93
100
  self._rules = heuristic_rules
101
+ elif rules_path is not None:
102
+ self._rules = HeuristicRules(rules_path)
94
103
  elif rules_cache_id:
95
104
  self._rules = self._load_rules(rules_cache_id)
96
105
  else:
@@ -172,58 +181,87 @@ class DependencyAnalyzer:
172
181
  # Classification
173
182
 
174
183
  def _classify_local(self, target: str, obj: Any) -> MockDecision | None:
175
- """Deterministic classification (exception/stdlib/rule); None if proxy-cache needed."""
184
+ """Deterministic classification; None if the LLM is needed.
185
+
186
+ Order: exception class -> skip, defined in the project under test -> skip,
187
+ mined rule -> mock, default patch rule (functions only) -> mock, standard
188
+ library -> skip.
189
+ """
176
190
  if isinstance(obj, type) and issubclass(obj, BaseException):
177
191
  return MockDecision(target, "skip", "Exception class", "exception", 1.0)
178
- if target.split(".", 1)[0] in sys.stdlib_module_names:
179
- return MockDecision(target, "skip", "Standard library", "stdlib", 1.0)
192
+ if self._is_local(target, obj):
193
+ return MockDecision(target, "skip", "Defined in the project under test", "local", 1.0)
180
194
  reason = self._rules.match(target)
181
195
  if reason is not None:
182
196
  return MockDecision(target, "mock", reason, "rule", 0.9)
197
+ if obj is not None and not isinstance(obj, type) and callable(obj):
198
+ from pynguin.mock_generation.patch_targets import ( # noqa: PLC0415
199
+ DEFAULT_PATCH_RULES,
200
+ )
201
+
202
+ if target in DEFAULT_PATCH_RULES:
203
+ return MockDecision(
204
+ target, "mock", "Environment, clock, randomness, or I/O", "rule", 1.0
205
+ )
206
+ if target.split(".", 1)[0] in sys.stdlib_module_names:
207
+ return MockDecision(target, "skip", "Standard library", "stdlib", 1.0)
183
208
  return None
184
209
 
210
+ @staticmethod
211
+ def _is_local(target: str, obj: Any) -> bool:
212
+ """Whether *target* belongs to the project the module under test is part of.
213
+
214
+ Such classes and functions are the code under test and should be exercised,
215
+ not replaced by a mock.
216
+ """
217
+ sut_top = config.configuration.module_name.split(".", 1)[0]
218
+ if not sut_top:
219
+ return False
220
+ defining = getattr(obj, "__module__", None) or target
221
+ return defining.split(".", 1)[0] == sut_top
222
+
185
223
  def _classify(self, target: str, obj: Any) -> MockDecision:
186
224
  """Classify a single class *target* (with its resolved *obj* when available)."""
187
225
  local = self._classify_local(target, obj)
188
226
  if local is not None:
189
227
  return local
190
- if self._use_proxy:
191
- proxy = self._classify_via_proxy(target)
192
- if proxy is not None:
193
- return proxy
228
+ if self._use_llm:
229
+ decision = self._classify_via_llm(target)
230
+ if decision is not None:
231
+ return decision
194
232
  return MockDecision(target, "unknown", "Unclassified external class", "llm", 0.0)
195
233
 
196
234
  def _classify_all(self, pairs: list[tuple[str, Any]]) -> list[MockDecision]:
197
- """Classify many candidates, batching the proxy-cache calls into one request."""
235
+ """Classify many candidates, batching the LLM calls into one request."""
198
236
  local: dict[str, MockDecision] = {}
199
- proxy_needed: list[str] = []
237
+ llm_needed: list[str] = []
200
238
  for target, obj in pairs:
201
239
  decision = self._classify_local(target, obj)
202
240
  if decision is not None:
203
241
  local[target] = decision
204
242
  else:
205
- proxy_needed.append(target)
243
+ llm_needed.append(target)
206
244
 
207
- proxy = self._classify_via_proxy_batch(proxy_needed) if self._use_proxy else {}
245
+ llm = self._classify_via_llm_batch(llm_needed) if self._use_llm else {}
208
246
 
209
247
  decisions: list[MockDecision] = []
210
248
  for target, _obj in pairs:
211
249
  decisions.append(
212
250
  local.get(target)
213
- or proxy.get(target)
251
+ or llm.get(target)
214
252
  or MockDecision(target, "unknown", "Unclassified external class", "llm", 0.0)
215
253
  )
216
254
  return decisions
217
255
 
218
256
  @staticmethod
219
- def _classify_via_proxy_batch(targets: list[str]) -> dict[str, MockDecision]:
220
- """Batch-classify *targets* via the proxy-cache; empty dict on connection/HTTP error."""
257
+ def _classify_via_llm_batch(targets: list[str]) -> dict[str, MockDecision]:
258
+ """Batch-classify *targets* via the LLM backend; empty dict on any error."""
221
259
  if not targets:
222
260
  return {}
223
261
  try:
224
262
  results = llm_classifier_client.classify_targets_batch(targets)
225
263
  except Exception as exc: # noqa: BLE001
226
- _logger.warning("Proxy batch classify unavailable (%d): %s", len(targets), exc)
264
+ _logger.warning("LLM batch classify unavailable (%d): %s", len(targets), exc)
227
265
  return {}
228
266
  return {
229
267
  target: MockDecision(
@@ -237,12 +275,12 @@ class DependencyAnalyzer:
237
275
  }
238
276
 
239
277
  @staticmethod
240
- def _classify_via_proxy(target: str) -> MockDecision | None:
241
- """MockDecision from the proxy-cache, or None on connection/HTTP error."""
278
+ def _classify_via_llm(target: str) -> MockDecision | None:
279
+ """MockDecision from the LLM backend, or None on any error."""
242
280
  try:
243
281
  result = llm_classifier_client.classify_target(target)
244
282
  except Exception as exc: # noqa: BLE001
245
- _logger.warning("Proxy classify unavailable for %r: %s", target, exc)
283
+ _logger.warning("LLM classify unavailable for %r: %s", target, exc)
246
284
  return None
247
285
  return MockDecision(
248
286
  target,