pynguin 0.41.0__tar.gz → 0.43.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (496) hide show
  1. {pynguin-0.41.0 → pynguin-0.43.0}/PKG-INFO +7 -6
  2. {pynguin-0.41.0 → pynguin-0.43.0}/README.md +1 -3
  3. {pynguin-0.41.0 → pynguin-0.43.0}/pyproject.toml +23 -3
  4. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/__version__.py +1 -1
  5. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/analyses/constants.py +6 -2
  6. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/analyses/module.py +260 -37
  7. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/analyses/seeding.py +8 -2
  8. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/analyses/typesystem.py +80 -79
  9. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/assertiongenerator.py +32 -25
  10. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/assertiontraceobserver.py +13 -23
  11. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/mutation_analysis/operators/base.py +37 -18
  12. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/mutation_analysis/transformer.py +2 -0
  13. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/configuration.py +58 -2
  14. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/algorithms/dynamosaalgorithm.py +12 -4
  15. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/computations.py +50 -62
  16. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/coveragegoals.py +22 -10
  17. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/generationalgorithmfactory.py +2 -4
  18. pynguin-0.43.0/src/pynguin/ga/postprocess.py +689 -0
  19. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/stoppingcondition.py +11 -1
  20. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/generator.py +218 -69
  21. pynguin-0.43.0/src/pynguin/instrumentation/__init__.py +46 -0
  22. pynguin-0.43.0/src/pynguin/instrumentation/controlflow.py +942 -0
  23. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/instrumentation/machinery.py +29 -30
  24. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/instrumentation/tracer.py +519 -426
  25. pynguin-0.43.0/src/pynguin/instrumentation/transformer.py +733 -0
  26. pynguin-0.43.0/src/pynguin/instrumentation/version/__init__.py +239 -0
  27. pynguin-0.43.0/src/pynguin/instrumentation/version/common.py +367 -0
  28. pynguin-0.43.0/src/pynguin/instrumentation/version/python3_10.py +1868 -0
  29. pynguin-0.43.0/src/pynguin/instrumentation/version/python3_11.py +627 -0
  30. pynguin-0.43.0/src/pynguin/instrumentation/version/python3_12.py +600 -0
  31. pynguin-0.43.0/src/pynguin/instrumentation/version/python3_13.py +419 -0
  32. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/parsing/astscoping.py +2 -1
  33. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/parsing/deserializer.py +2 -1
  34. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/parsing/helpers.py +33 -13
  35. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/parsing/rewriter.py +14 -1
  36. pynguin-0.43.0/src/pynguin/slicer/dynamicslicer.py +909 -0
  37. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/slicer/executedinstruction.py +20 -14
  38. pynguin-0.43.0/src/pynguin/slicer/executionflowbuilder.py +610 -0
  39. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/slicer/stack/stacksimulation.py +95 -60
  40. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/slicer/statementslicingobserver.py +5 -25
  41. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/testcase/defaulttestcase.py +44 -1
  42. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/testcase/execution.py +364 -181
  43. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/testcase/export.py +42 -14
  44. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/testcase/statement.py +4 -1
  45. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/testcase/statement_to_ast.py +2 -2
  46. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/testcase/testcase.py +60 -0
  47. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/testcase/testcase_to_ast.py +10 -0
  48. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/testcase/testfactory.py +5 -3
  49. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/configuration_writer.py +11 -6
  50. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/controlflowdistance.py +24 -34
  51. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/exceptions.py +21 -4
  52. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/pynguinml/ml_testing_resources.py +1 -1
  53. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/report.py +10 -4
  54. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/statistics/runtimevariable.py +6 -0
  55. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/type_utils.py +8 -9
  56. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/typeevalpy_json_schema.py +2 -2
  57. {pynguin-0.41.0 → pynguin-0.43.0}/tests/analyses/test_module.py +101 -1
  58. {pynguin-0.41.0 → pynguin-0.43.0}/tests/analyses/test_seeding.py +1 -1
  59. {pynguin-0.41.0 → pynguin-0.43.0}/tests/analyses/test_typesystem.py +20 -9
  60. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/test_assertion_generation_integration.py +30 -22
  61. {pynguin-0.41.0 → pynguin-0.43.0}/tests/conftest.py +173 -104
  62. pynguin-0.43.0/tests/fixtures/c/my_ctypes.py +7 -0
  63. pynguin-0.43.0/tests/fixtures/crash/partly_crashing.py +15 -0
  64. pynguin-0.43.0/tests/fixtures/crash/seg_fault.py +11 -0
  65. pynguin-0.43.0/tests/fixtures/examples/module_alias.py +10 -0
  66. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/instrumentation/comparison.py +10 -0
  67. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/algorithms/test_dynamosaalgorithm.py +27 -29
  68. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/algorithms/test_integration_mosaalgorithm.py +7 -9
  69. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/algorithms/test_integration_varioussearchalgorithms.py +15 -16
  70. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/test_computations.py +57 -72
  71. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/test_computations_fitness_utilities.py +6 -6
  72. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/test_coveragegoals.py +64 -80
  73. pynguin-0.43.0/tests/ga/test_postprocess.py +1081 -0
  74. pynguin-0.43.0/tests/instrumentation/test_adapters.py +1004 -0
  75. pynguin-0.43.0/tests/instrumentation/test_cfg.py +881 -0
  76. pynguin-0.43.0/tests/instrumentation/test_controldependencegraph.py +241 -0
  77. pynguin-0.43.0/tests/instrumentation/test_machinery.py +52 -0
  78. pynguin-0.43.0/tests/instrumentation/test_programgraph.py +115 -0
  79. pynguin-0.43.0/tests/instrumentation/test_tracer.py +592 -0
  80. pynguin-0.43.0/tests/instrumentation/test_version.py +205 -0
  81. {pynguin-0.41.0 → pynguin-0.43.0}/tests/slicer/test_assertionslicer.py +31 -28
  82. pynguin-0.43.0/tests/slicer/test_dependencies.py +438 -0
  83. pynguin-0.43.0/tests/slicer/test_expected_failures.py +626 -0
  84. pynguin-0.43.0/tests/slicer/test_language_features.py +1397 -0
  85. {pynguin-0.41.0 → pynguin-0.43.0}/tests/slicer/test_statementslicer.py +35 -42
  86. pynguin-0.43.0/tests/slicer/util.py +195 -0
  87. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/execution/test_executiontrace.py +3 -3
  88. pynguin-0.43.0/tests/testcase/execution/test_moduleprovider.py +74 -0
  89. pynguin-0.43.0/tests/testcase/execution/test_subprocesstestcaseexecutor.py +252 -0
  90. pynguin-0.43.0/tests/testcase/execution/test_subprocesstestcaseexecutor_differential.py +38 -0
  91. pynguin-0.43.0/tests/testcase/execution/test_subprocesstestcaseexecutor_integration.py +135 -0
  92. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/execution/test_testcaseexecutor_integration.py +53 -62
  93. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/execution/test_typetracing.py +15 -9
  94. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/export/test_export.py +2 -2
  95. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/test_defaulttestcase.py +191 -0
  96. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/test_testcase_to_ast_integration.py +44 -0
  97. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/test_testfactory.py +3 -0
  98. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/pynguinml/test_ml_parsing_utils.py +4 -3
  99. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/pynguinml/test_pynguinml_integration.py +17 -1
  100. pynguin-0.43.0/tests/utils/stats/__init__.py +6 -0
  101. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/test_configuration_writer.py +14 -3
  102. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/test_controlflowdistance.py +7 -6
  103. pynguin-0.43.0/tests/utils/test_report.py +553 -0
  104. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/test_type_utils.py +54 -0
  105. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/test_typeevalpy_json_schema.py +1 -1
  106. pynguin-0.41.0/src/pynguin/analyses/controlflow.py +0 -983
  107. pynguin-0.41.0/src/pynguin/ga/postprocess.py +0 -273
  108. pynguin-0.41.0/src/pynguin/instrumentation/__init__.py +0 -7
  109. pynguin-0.41.0/src/pynguin/instrumentation/instrumentation.py +0 -1973
  110. pynguin-0.41.0/src/pynguin/slicer/dynamicslicer.py +0 -882
  111. pynguin-0.41.0/src/pynguin/slicer/executionflowbuilder.py +0 -614
  112. pynguin-0.41.0/src/pynguin/slicer/stack/stackeffect.py +0 -219
  113. pynguin-0.41.0/src/pynguin/utils/opcodes.py +0 -294
  114. pynguin-0.41.0/tests/analyses/test_cfg.py +0 -325
  115. pynguin-0.41.0/tests/analyses/test_controldependencegraph.py +0 -100
  116. pynguin-0.41.0/tests/analyses/test_dominatortree.py +0 -121
  117. pynguin-0.41.0/tests/analyses/test_programgraph.py +0 -187
  118. pynguin-0.41.0/tests/ga/test_postprocess.py +0 -240
  119. pynguin-0.41.0/tests/instrumentation/test_instrumentation.py +0 -778
  120. pynguin-0.41.0/tests/instrumentation/test_machinery.py +0 -49
  121. pynguin-0.41.0/tests/slicer/stack/test_stack_effect.py +0 -62
  122. pynguin-0.41.0/tests/slicer/test_dependencies.py +0 -374
  123. pynguin-0.41.0/tests/slicer/test_expected_failures.py +0 -293
  124. pynguin-0.41.0/tests/slicer/test_language_features.py +0 -692
  125. pynguin-0.41.0/tests/slicer/util.py +0 -159
  126. pynguin-0.41.0/tests/testcase/execution/test_executiontracer.py +0 -479
  127. pynguin-0.41.0/tests/testcase/execution/test_moduleprovider.py +0 -39
  128. pynguin-0.41.0/tests/testcase/execution/test_subprocesstestcaseexecutor_differential.py +0 -43
  129. pynguin-0.41.0/tests/utils/test_report.py +0 -509
  130. {pynguin-0.41.0 → pynguin-0.43.0}/LICENSE.rst +0 -0
  131. {pynguin-0.41.0 → pynguin-0.43.0}/LICENSES/Apache-2.0.txt +0 -0
  132. {pynguin-0.41.0 → pynguin-0.43.0}/LICENSES/BSD-2-Clause.txt +0 -0
  133. {pynguin-0.41.0 → pynguin-0.43.0}/LICENSES/CC-BY-4.0.txt +0 -0
  134. {pynguin-0.41.0 → pynguin-0.43.0}/LICENSES/CC0-1.0.txt +0 -0
  135. {pynguin-0.41.0 → pynguin-0.43.0}/LICENSES/MIT.txt +0 -0
  136. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/__init__.py +0 -0
  137. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/__main__.py +0 -0
  138. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/analyses/__init__.py +0 -0
  139. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/analyses/modulecomplexity.py +0 -0
  140. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/analyses/syntaxtree.py +0 -0
  141. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/__init__.py +0 -0
  142. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/assertion.py +0 -0
  143. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/assertion_to_ast.py +0 -0
  144. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/assertion_trace.py +0 -0
  145. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/llmassertiongenerator.py +0 -0
  146. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/mutation_analysis/__init__.py +0 -0
  147. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/mutation_analysis/controller.py +0 -0
  148. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/mutation_analysis/mutators.py +0 -0
  149. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/mutation_analysis/operators/__init__.py +0 -0
  150. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/mutation_analysis/operators/arithmetic.py +0 -0
  151. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/mutation_analysis/operators/decorator.py +0 -0
  152. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/mutation_analysis/operators/exception.py +0 -0
  153. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/mutation_analysis/operators/inheritance.py +0 -0
  154. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/mutation_analysis/operators/logical.py +0 -0
  155. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/mutation_analysis/operators/loop.py +0 -0
  156. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/mutation_analysis/operators/misc.py +0 -0
  157. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/assertion/mutation_analysis/strategies.py +0 -0
  158. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/cli.py +0 -0
  159. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/__init__.py +0 -0
  160. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/algorithms/__init__.py +0 -0
  161. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/algorithms/abstractmosaalgorithm.py +0 -0
  162. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/algorithms/archive.py +0 -0
  163. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/algorithms/generationalgorithm.py +0 -0
  164. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/algorithms/llmosalgorithm.py +0 -0
  165. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/algorithms/mioalgorithm.py +0 -0
  166. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/algorithms/mosaalgorithm.py +0 -0
  167. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/algorithms/randomalgorithm.py +0 -0
  168. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/algorithms/randomsearchalgorithm.py +0 -0
  169. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/algorithms/wholesuitealgorithm.py +0 -0
  170. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/chromosome.py +0 -0
  171. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/chromosomefactory.py +0 -0
  172. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/chromosomevisitor.py +0 -0
  173. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/llmtestsuitechromosomefactory.py +0 -0
  174. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/operators/__init__.py +0 -0
  175. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/operators/comparator.py +0 -0
  176. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/operators/crossover.py +0 -0
  177. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/operators/ranking.py +0 -0
  178. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/operators/selection.py +0 -0
  179. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/searchobserver.py +0 -0
  180. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/testcasechromosome.py +0 -0
  181. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/testcasechromosomefactory.py +0 -0
  182. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/testcasefactory.py +0 -0
  183. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/testsuitechromosome.py +0 -0
  184. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/ga/testsuitechromosomefactory.py +0 -0
  185. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/__init__.py +0 -0
  186. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/caching.py +0 -0
  187. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/helpers/__init__.py +0 -0
  188. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/helpers/testcasereferencecopier.py +0 -0
  189. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/llmagent.py +0 -0
  190. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/llmtestcasehandler.py +0 -0
  191. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/parsing/__init__.py +0 -0
  192. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/prompts/__init__.py +0 -0
  193. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/prompts/assertiongenerationprompt.py +0 -0
  194. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/prompts/prompt.py +0 -0
  195. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/prompts/testcasegenerationprompt.py +0 -0
  196. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/large_language_model/prompts/uncoveredtargetsprompt.py +0 -0
  197. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/resources/__init__.py +0 -0
  198. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/resources/coverage-template.html +0 -0
  199. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/slicer/__init__.py +0 -0
  200. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/slicer/stack/__init__.py +0 -0
  201. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/testcase/__init__.py +0 -0
  202. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/testcase/testcasevisitor.py +0 -0
  203. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/testcase/variablereference.py +0 -0
  204. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/__init__.py +0 -0
  205. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/ast_util.py +0 -0
  206. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/atomicinteger.py +0 -0
  207. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/collection_utils.py +0 -0
  208. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/generic/__init__.py +0 -0
  209. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/generic/genericaccessibleobject.py +0 -0
  210. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/llm.py +0 -0
  211. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/mirror.py +0 -0
  212. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/mutation_utils.py +0 -0
  213. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/namingscope.py +0 -0
  214. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/orderedset.py +0 -0
  215. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/pynguinml/__init__.py +0 -0
  216. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/pynguinml/ml_parsing_utils.py +0 -0
  217. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/pynguinml/ml_testfactory_utils.py +0 -0
  218. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/pynguinml/mlparameter.py +0 -0
  219. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/pynguinml/np_rng.py +0 -0
  220. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/randomness.py +0 -0
  221. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/statistics/__init__.py +0 -0
  222. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/statistics/outputvariablefactory.py +0 -0
  223. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/statistics/statisticsbackend.py +0 -0
  224. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/statistics/statisticsobserver.py +0 -0
  225. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/statistics/stats.py +0 -0
  226. {pynguin-0.41.0 → pynguin-0.43.0}/src/pynguin/utils/typetracing.py +0 -0
  227. {pynguin-0.41.0 → pynguin-0.43.0}/tests/__init__.py +0 -0
  228. {pynguin-0.41.0 → pynguin-0.43.0}/tests/analyses/__init__.py +0 -0
  229. {pynguin-0.41.0 → pynguin-0.43.0}/tests/analyses/test_constants.py +0 -0
  230. {pynguin-0.41.0 → pynguin-0.43.0}/tests/analyses/test_initialpopulationseeding.py +0 -0
  231. {pynguin-0.41.0 → pynguin-0.43.0}/tests/analyses/test_modulecomplexity.py +0 -0
  232. {pynguin-0.41.0 → pynguin-0.43.0}/tests/analyses/test_staticconstantseeding.py +0 -0
  233. {pynguin-0.41.0 → pynguin-0.43.0}/tests/analyses/test_syntaxtree.py +0 -0
  234. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/__init__.py +0 -0
  235. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/mutation_analysis/__init__.py +0 -0
  236. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/mutation_analysis/operators/__init__.py +0 -0
  237. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/mutation_analysis/operators/test_arithmetic.py +0 -0
  238. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/mutation_analysis/operators/test_decorator.py +0 -0
  239. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/mutation_analysis/operators/test_exception.py +0 -0
  240. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/mutation_analysis/operators/test_inheritance.py +0 -0
  241. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/mutation_analysis/operators/test_logical.py +0 -0
  242. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/mutation_analysis/operators/test_loop.py +0 -0
  243. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/mutation_analysis/operators/test_misc.py +0 -0
  244. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/mutation_analysis/test_controller.py +0 -0
  245. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/mutation_analysis/test_mutators.py +0 -0
  246. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/mutation_analysis/test_strategies.py +0 -0
  247. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/test_assertion.py +0 -0
  248. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/test_assertion_to_ast.py +0 -0
  249. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/test_assertion_trace.py +0 -0
  250. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/test_assertiongenerator.py +0 -0
  251. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/test_assertiontraceobserver.py +0 -0
  252. {pynguin-0.41.0 → pynguin-0.43.0}/tests/assertion/test_llmassertiongenerator.py +0 -0
  253. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/__init__.py +0 -0
  254. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/accessibles/__init__.py +0 -0
  255. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/accessibles/accessible.py +0 -0
  256. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/branchcoverage/__init__.py +0 -0
  257. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/branchcoverage/nestedbranches.py +0 -0
  258. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/branchcoverage/nobranches.py +0 -0
  259. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/branchcoverage/simplenesting.py +0 -0
  260. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/branchcoverage/singlebranches.py +0 -0
  261. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/branchcoverage/twomethodsinglebranches.py +0 -0
  262. {pynguin-0.41.0/tests/fixtures/cluster → pynguin-0.43.0/tests/fixtures/c}/__init__.py +0 -0
  263. {pynguin-0.41.0/tests/fixtures/duckmock → pynguin-0.43.0/tests/fixtures/cluster}/__init__.py +0 -0
  264. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/abstract.py +0 -0
  265. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/alias_module.py +0 -0
  266. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/async_class_gen.py +0 -0
  267. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/async_class_method.py +0 -0
  268. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/async_func.py +0 -0
  269. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/async_gen.py +0 -0
  270. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/attributes.py +0 -0
  271. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/blacklist.py +0 -0
  272. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/blacklist_transitive.py +0 -0
  273. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/comments.py +0 -0
  274. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/complex_dependencies.py +0 -0
  275. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/complex_dependency.py +0 -0
  276. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/conditional_import.py +0 -0
  277. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/dependency.py +0 -0
  278. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/diamond_bottom.py +0 -0
  279. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/diamond_left.py +0 -0
  280. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/diamond_right.py +0 -0
  281. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/diamond_top.py +0 -0
  282. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/enums.py +0 -0
  283. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/import_dependency.py +0 -0
  284. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/inheritance.py +0 -0
  285. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/lambda.py +0 -0
  286. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/nested_functions.py +0 -0
  287. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/no_any_annotations.py +0 -0
  288. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/no_dependencies.py +0 -0
  289. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/overridden_inherited_methods.py +0 -0
  290. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/simple_dependencies.py +0 -0
  291. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/typing_parameters.py +0 -0
  292. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/cluster/uses_async_dependency.py +0 -0
  293. {pynguin-0.41.0/tests/fixtures/errors → pynguin-0.43.0/tests/fixtures/crash}/__init__.py +0 -0
  294. {pynguin-0.41.0/tests/fixtures/examples → pynguin-0.43.0/tests/fixtures/duckmock}/__init__.py +0 -0
  295. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/duckmock/complex.py +0 -0
  296. {pynguin-0.41.0/tests/fixtures/examples/type_tracing → pynguin-0.43.0/tests/fixtures/errors}/__init__.py +0 -0
  297. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/errors/import_error.py +0 -0
  298. {pynguin-0.41.0/tests/fixtures/grammar → pynguin-0.43.0/tests/fixtures/examples}/__init__.py +0 -0
  299. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/assertions.py +0 -0
  300. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/basket.py +0 -0
  301. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/calculator.py +0 -0
  302. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/calculator_simple.py +0 -0
  303. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/collections.py +0 -0
  304. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/difficult.py +0 -0
  305. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/dummies.py +0 -0
  306. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/dynamosa_example.py +0 -0
  307. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/enums.py +0 -0
  308. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/exceptions.py +0 -0
  309. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/flaky.py +0 -0
  310. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/impossible.py +0 -0
  311. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/inheritance.py +0 -0
  312. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/loop.py +0 -0
  313. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/monkey.py +0 -0
  314. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/nested.py +0 -0
  315. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/objects.py +0 -0
  316. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/private_methods.py +0 -0
  317. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/queue.py +0 -0
  318. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/simple.py +0 -0
  319. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/triangle.py +0 -0
  320. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/type_inference.py +0 -0
  321. {pynguin-0.41.0/tests/fixtures/instrumentation → pynguin-0.43.0/tests/fixtures/examples/type_tracing}/__init__.py +0 -0
  322. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/type_tracing/geometry.py +0 -0
  323. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/type_tracing/invoice.py +0 -0
  324. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/type_tracing/large_test_cluster.py +0 -0
  325. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/examples/type_tracing/mixed.py +0 -0
  326. {pynguin-0.41.0/tests/fixtures/linecoverage → pynguin-0.43.0/tests/fixtures/grammar}/__init__.py +0 -0
  327. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/grammar/parameters.py +0 -0
  328. {pynguin-0.41.0/tests/fixtures/mutation → pynguin-0.43.0/tests/fixtures/instrumentation}/__init__.py +0 -0
  329. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/instrumentation/inherited.py +0 -0
  330. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/instrumentation/mixed.py +0 -0
  331. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/instrumentation/simple.py +0 -0
  332. {pynguin-0.41.0/tests/fixtures/programgraph → pynguin-0.43.0/tests/fixtures/linecoverage}/__init__.py +0 -0
  333. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/linecoverage/artificial_none.py +0 -0
  334. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/linecoverage/emptyfile.py +0 -0
  335. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/linecoverage/exception.py +0 -0
  336. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/linecoverage/list.py +0 -0
  337. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/linecoverage/plus.py +0 -0
  338. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/linecoverage/setter_getter.py +0 -0
  339. {pynguin-0.41.0/tests/fixtures/regression → pynguin-0.43.0/tests/fixtures/mutation}/__init__.py +0 -0
  340. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/mutation/exception.py +0 -0
  341. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/mutation/expected.py +0 -0
  342. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/mutation/mutation.py +0 -0
  343. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/mutation/timeout.py +0 -0
  344. {pynguin-0.41.0/tests/fixtures/seeding → pynguin-0.43.0/tests/fixtures/programgraph}/__init__.py +0 -0
  345. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/programgraph/samples.py +0 -0
  346. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/programgraph/whileloop.py +0 -0
  347. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/programgraph/yield_fun.py +0 -0
  348. {pynguin-0.41.0/tests/fixtures/seeding/dynamicseeding → pynguin-0.43.0/tests/fixtures/regression}/__init__.py +0 -0
  349. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/regression/argparse_sys_exit.py +0 -0
  350. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/regression/custom_error.py +0 -0
  351. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/regression/not_main.py +0 -0
  352. {pynguin-0.41.0/tests/fixtures/seeding/initialpopulationseeding → pynguin-0.43.0/tests/fixtures/seeding}/__init__.py +0 -0
  353. {pynguin-0.41.0/tests/fixtures/seeding/initialpopulationseeding/seedmodules → pynguin-0.43.0/tests/fixtures/seeding/dynamicseeding}/__init__.py +0 -0
  354. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/seeding/dynamicseeding/dynamicseedingdummies.py +0 -0
  355. {pynguin-0.41.0/tests/fixtures/seeding/staticconstantseeding → pynguin-0.43.0/tests/fixtures/seeding/initialpopulationseeding}/__init__.py +0 -0
  356. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/seeding/initialpopulationseeding/dummycontainer.py +0 -0
  357. {pynguin-0.41.0/tests/fixtures/seeding/staticconstantseeding/dummy → pynguin-0.43.0/tests/fixtures/seeding/initialpopulationseeding/seedmodules}/__init__.py +0 -0
  358. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/assertseed_test_.py +0 -0
  359. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/classseed_test_.py +0 -0
  360. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collfuncseed_test_.py +0 -0
  361. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collseed_test_.py +0 -0
  362. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/nestedseed_test_.py +0 -0
  363. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notknowncall_test_.py +0 -0
  364. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notprimseed_test_.py +0 -0
  365. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/primitiveseed_test_.py +0 -0
  366. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/triangleseed_test_.py +0 -0
  367. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongassignseed_test_.py +0 -0
  368. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongfunctionnameseed_test_.py +0 -0
  369. {pynguin-0.41.0/tests/fixtures/slicer → pynguin-0.43.0/tests/fixtures/seeding/staticconstantseeding}/__init__.py +0 -0
  370. {pynguin-0.41.0/tests/fixtures/type_tracing → pynguin-0.43.0/tests/fixtures/seeding/staticconstantseeding/dummy}/__init__.py +0 -0
  371. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/seeding/staticconstantseeding/dummy/dummy.py +0 -0
  372. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/seeding/staticconstantseeding/dummy/empty.so +0 -0
  373. {pynguin-0.41.0/tests/fixtures/types → pynguin-0.43.0/tests/fixtures/slicer}/__init__.py +0 -0
  374. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/slicer/attribute_dependencies.py +0 -0
  375. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/slicer/closure.py +0 -0
  376. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/slicer/generator.py +0 -0
  377. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/slicer/immutable_attribute_dependency.py +0 -0
  378. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/slicer/import_star_def.py +0 -0
  379. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/slicer/import_star_main.py +0 -0
  380. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/slicer/partial_cover_dependency.py +0 -0
  381. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/slicer/simple_call.py +0 -0
  382. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/slicer/simple_call_arg.py +0 -0
  383. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/test.conf +0 -0
  384. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/test.conf.license +0 -0
  385. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/tests/typeinference/test_stubstrategy.pyi +0 -0
  386. {pynguin-0.41.0/tests/ga → pynguin-0.43.0/tests/fixtures/type_tracing}/__init__.py +0 -0
  387. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/type_tracing/guess_params.py +0 -0
  388. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/type_tracing/return_types.py +0 -0
  389. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/type_tracing/union_type.py +0 -0
  390. {pynguin-0.41.0/tests/ga/operators → pynguin-0.43.0/tests/fixtures/types}/__init__.py +0 -0
  391. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/types/outside.py +0 -0
  392. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/types/subtyping.py +0 -0
  393. {pynguin-0.41.0 → pynguin-0.43.0}/tests/fixtures/types/symbols.py +0 -0
  394. {pynguin-0.41.0/tests/ga/operators/crossover → pynguin-0.43.0/tests/ga}/__init__.py +0 -0
  395. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/algorithms/__init__.py +0 -0
  396. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/algorithms/test_archive.py +0 -0
  397. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/algorithms/test_generationalgorithm.py +0 -0
  398. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/algorithms/test_llmosalgorithm.py +0 -0
  399. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/algorithms/test_mioalgorithm.py +0 -0
  400. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/algorithms/test_mosaalgorithm.py +0 -0
  401. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/algorithms/test_randomalgorithm.py +0 -0
  402. {pynguin-0.41.0/tests/ga/operators/ranking → pynguin-0.43.0/tests/ga/operators}/__init__.py +0 -0
  403. {pynguin-0.41.0/tests/ga/operators/selection → pynguin-0.43.0/tests/ga/operators/crossover}/__init__.py +0 -0
  404. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/operators/crossover/test_singlepointrelativecrossover.py +0 -0
  405. {pynguin-0.41.0/tests/ga/stoppingconditions → pynguin-0.43.0/tests/ga/operators/ranking}/__init__.py +0 -0
  406. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/operators/ranking/test_rankingfunction.py +0 -0
  407. {pynguin-0.41.0/tests/instrumentation → pynguin-0.43.0/tests/ga/operators/selection}/__init__.py +0 -0
  408. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/operators/selection/test_rankselection.py +0 -0
  409. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/operators/selection/test_selection.py +0 -0
  410. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/operators/selection/test_tournamentselection.py +0 -0
  411. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/operators/test_dominancecomparator.py +0 -0
  412. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/operators/test_preferencesortingcomparator.py +0 -0
  413. {pynguin-0.41.0/tests/slicer → pynguin-0.43.0/tests/ga/stoppingconditions}/__init__.py +0 -0
  414. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/stoppingconditions/test_coverageplateaustoppingcondition.py +0 -0
  415. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/stoppingconditions/test_maxcoveragestoppingcondition.py +0 -0
  416. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/stoppingconditions/test_maxiterationsstoppingcondition.py +0 -0
  417. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/stoppingconditions/test_maxmemorystoppingcondition.py +0 -0
  418. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/stoppingconditions/test_maxstatementstoppingcondition.py +0 -0
  419. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/stoppingconditions/test_maxtestsstoppingcondition.py +0 -0
  420. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/stoppingconditions/test_maxtimestoppingcondition.py +0 -0
  421. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/stoppingconditions/test_minimumcoverageplateaustoppingcondition.py +0 -0
  422. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/stoppingconditions/test_stoppingcondition.py +0 -0
  423. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/test_chromosome.py +0 -0
  424. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/test_chromosomefactory.py +0 -0
  425. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/test_computations_cache.py +0 -0
  426. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/test_generationalgorithmfactory.py +0 -0
  427. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/test_llmtestsuitechromosomefactory.py +0 -0
  428. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/test_testcasechromosome.py +0 -0
  429. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/test_testcasefactory.py +0 -0
  430. {pynguin-0.41.0 → pynguin-0.43.0}/tests/ga/test_testsuitechromosome.py +0 -0
  431. {pynguin-0.41.0/tests/slicer/stack → pynguin-0.43.0/tests/instrumentation}/__init__.py +0 -0
  432. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/__init__.py +0 -0
  433. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/helpers/test_testcasereferencecopier.py +0 -0
  434. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/parsing/test_astscoping.py +0 -0
  435. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/parsing/test_helpers.py +0 -0
  436. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/prompts/__init__.py +0 -0
  437. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/prompts/test_assertiongenerationprompt.py +0 -0
  438. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/prompts/test_testcasegenerationprompt.py +0 -0
  439. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/prompts/test_uncovered_targets_prompt.py +0 -0
  440. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/test_caching.py +0 -0
  441. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/test_llm_caching.py +0 -0
  442. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/test_llm_deserializer.py +0 -0
  443. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/test_llmagent.py +0 -0
  444. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/test_llmagent_extended.py +0 -0
  445. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/test_llmtestcasehandler.py +0 -0
  446. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/test_llmtestcasehandler_coverage.py +0 -0
  447. {pynguin-0.41.0 → pynguin-0.43.0}/tests/large_language_model/test_rewriter.py +0 -0
  448. {pynguin-0.41.0/tests/testcase → pynguin-0.43.0/tests/slicer}/__init__.py +0 -0
  449. {pynguin-0.41.0 → pynguin-0.43.0}/tests/test___main__.py +0 -0
  450. {pynguin-0.41.0 → pynguin-0.43.0}/tests/test_cli.py +0 -0
  451. {pynguin-0.41.0 → pynguin-0.43.0}/tests/test_generator.py +0 -0
  452. {pynguin-0.41.0/tests/testcase/execution → pynguin-0.43.0/tests/testcase}/__init__.py +0 -0
  453. {pynguin-0.41.0/tests/testcase/export → pynguin-0.43.0/tests/testcase/execution}/__init__.py +0 -0
  454. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/execution/test_executedinstruction.py +0 -0
  455. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/execution/test_executioncontext.py +0 -0
  456. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/execution/test_executionmocking.py +0 -0
  457. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/execution/test_executionresult.py +0 -0
  458. {pynguin-0.41.0/tests/testcase/statements → pynguin-0.43.0/tests/testcase/export}/__init__.py +0 -0
  459. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/export/conftest.py +0 -0
  460. {pynguin-0.41.0/tests/testcase/variable → pynguin-0.43.0/tests/testcase/statements}/__init__.py +0 -0
  461. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/statements/test_assignmentstatement.py +0 -0
  462. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/statements/test_collectionstatements.py +0 -0
  463. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/statements/test_fieldstatement.py +0 -0
  464. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/statements/test_parameterizedstatements.py +0 -0
  465. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/statements/test_primitivestatements.py +0 -0
  466. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/test_ast_assign_statement.py +0 -0
  467. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/test_benchmark.py +0 -0
  468. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/test_statement_to_ast.py +0 -0
  469. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/test_testcase_integration.py +0 -0
  470. {pynguin-0.41.0/tests/utils → pynguin-0.43.0/tests/testcase/variable}/__init__.py +0 -0
  471. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testcase/variable/test_variablereference.py +0 -0
  472. {pynguin-0.41.0 → pynguin-0.43.0}/tests/testutils.py +0 -0
  473. {pynguin-0.41.0/tests/utils/generic → pynguin-0.43.0/tests/utils}/__init__.py +0 -0
  474. {pynguin-0.41.0/tests/utils/pynguinml → pynguin-0.43.0/tests/utils/generic}/__init__.py +0 -0
  475. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/generic/test_genericaccessibleobject.py +0 -0
  476. {pynguin-0.41.0/tests/utils/stats → pynguin-0.43.0/tests/utils/pynguinml}/__init__.py +0 -0
  477. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/pynguinml/test_ml_testfactory_utils.py +0 -0
  478. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/pynguinml/test_ml_testing_resources.py +0 -0
  479. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/pynguinml/test_mlparameter.py +0 -0
  480. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/pynguinml/test_np_rng.py +0 -0
  481. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/stats/test_outputvariablefactory.py +0 -0
  482. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/stats/test_runtimevariable.py +0 -0
  483. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/stats/test_searchstatistics.py +0 -0
  484. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/stats/test_statistics.py +0 -0
  485. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/stats/test_statisticsbackend.py +0 -0
  486. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/test_atomicinteger.py +0 -0
  487. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/test_collection_utils.py +0 -0
  488. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/test_exceptions.py +0 -0
  489. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/test_llm.py +0 -0
  490. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/test_mirror.py +0 -0
  491. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/test_mutation_utils.py +0 -0
  492. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/test_namingscope.py +0 -0
  493. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/test_orderedset.py +0 -0
  494. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/test_randomness.py +0 -0
  495. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/test_typetracing.py +0 -0
  496. {pynguin-0.41.0 → pynguin-0.43.0}/tests/utils/utils.py +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pynguin
3
- Version: 0.41.0
3
+ Version: 0.43.0
4
4
  Summary: Pynguin is a tool for automated unit test generation for Python
5
5
  License: MIT
6
6
  Keywords: unit test,random testing,search based,test generation
7
7
  Author: Stephan Lukasczyk
8
8
  Author-email: stephan@pynguin.eu
9
- Requires-Python: >=3.10,<3.11
9
+ Requires-Python: >=3.10,<3.14
10
10
  Classifier: Development Status :: 3 - Alpha
11
11
  Classifier: Environment :: Console
12
12
  Classifier: Intended Audience :: Developers
@@ -18,13 +18,16 @@ Classifier: Operating System :: Microsoft :: Windows
18
18
  Classifier: Operating System :: POSIX :: Linux
19
19
  Classifier: Programming Language :: Python :: 3
20
20
  Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
21
24
  Classifier: Programming Language :: Python :: Implementation :: CPython
22
25
  Classifier: Topic :: Education :: Testing
23
26
  Classifier: Topic :: Software Development :: Testing
24
27
  Classifier: Topic :: Software Development :: Testing :: Unit
25
28
  Classifier: Typing :: Typed
26
29
  Requires-Dist: Jinja2 (>=3.1.6,<4.0.0)
27
- Requires-Dist: Pygments (>=2.19.1,<3.0.0)
30
+ Requires-Dist: Pygments (>=2.19.2,<3.0.0)
28
31
  Requires-Dist: asciitree (>=0.3.3,<0.4.0)
29
32
  Requires-Dist: astroid (>=3.3.9,<4.0.0)
30
33
  Requires-Dist: black (>=25.1.0,<26.0.0)
@@ -113,9 +116,7 @@ please report your experiences in using Pynguin to us.
113
116
  ## Prerequisites
114
117
 
115
118
  Before you begin, ensure you have met the following requirements:
116
- - You have installed Python 3.10 (we have not yet tested with Python
117
- 3.11, there might be some problems due to changed internals regarding the byte-code
118
- instrumentation).
119
+ - You have installed Python 3.10 (the support for 3.11, 3.12 and 3.13 is experimental).
119
120
 
120
121
  **Attention:** Pynguin now requires Python 3.10! Older versions are no longer
121
122
  supported!
@@ -66,9 +66,7 @@ please report your experiences in using Pynguin to us.
66
66
  ## Prerequisites
67
67
 
68
68
  Before you begin, ensure you have met the following requirements:
69
- - You have installed Python 3.10 (we have not yet tested with Python
70
- 3.11, there might be some problems due to changed internals regarding the byte-code
71
- instrumentation).
69
+ - You have installed Python 3.10 (the support for 3.11, 3.12 and 3.13 is experimental).
72
70
 
73
71
  **Attention:** Pynguin now requires Python 3.10! Older versions are no longer
74
72
  supported!
@@ -4,7 +4,7 @@
4
4
 
5
5
  [tool.poetry]
6
6
  name = "pynguin"
7
- version = "0.41.0"
7
+ version = "0.43.0"
8
8
  description = "Pynguin is a tool for automated unit test generation for Python"
9
9
  authors = [
10
10
  "Stephan Lukasczyk <stephan@pynguin.eu>",
@@ -32,6 +32,9 @@ classifiers = [
32
32
  "Operating System :: Microsoft :: Windows",
33
33
  "Operating System :: POSIX :: Linux",
34
34
  "Programming Language :: Python :: 3.10",
35
+ "Programming Language :: Python :: 3.11",
36
+ "Programming Language :: Python :: 3.12",
37
+ "Programming Language :: Python :: 3.13",
35
38
  "Programming Language :: Python :: Implementation :: CPython",
36
39
  "Topic :: Education :: Testing",
37
40
  "Topic :: Software Development :: Testing",
@@ -46,7 +49,7 @@ include = [
46
49
  ]
47
50
 
48
51
  [tool.poetry.dependencies]
49
- python = ">=3.10, <3.11"
52
+ python = ">=3.10, <3.14"
50
53
  astroid = "^3.3.9"
51
54
  black = "^25.1.0"
52
55
  bytecode = "^0.16.1"
@@ -55,7 +58,7 @@ Jinja2 = "^3.1.6"
55
58
  networkx = "^3.4"
56
59
  multiprocess = "^0.70.16"
57
60
  rich = "^14.0.0"
58
- Pygments = "^2.19.1"
61
+ Pygments = "^2.19.2"
59
62
  pytest = "^8.3.5"
60
63
  simple-parsing = "^0.1.7"
61
64
  typing_inspect = "^0.9.0"
@@ -72,6 +75,7 @@ pre-commit = "^4.2.0"
72
75
  ruff = "^0.11"
73
76
  types-toml = "^0.10.8.20240310"
74
77
  types-pyyaml = "^6.0.12.20250516"
78
+ types-networkx = "^3.4"
75
79
 
76
80
  [tool.poetry.group.docs.dependencies]
77
81
  sphinx = "^8.1.3"
@@ -106,6 +110,7 @@ pynguin = "pynguin.cli:main"
106
110
  branch = true
107
111
  source = ["src/pynguin", "tests"]
108
112
  omit = ["tests/fixtures/*"]
113
+ relative_files = true
109
114
 
110
115
  [tool.coverage.report]
111
116
  exclude_lines = [
@@ -276,3 +281,18 @@ convention = "google"
276
281
  "S101", # Use of `assert` detected
277
282
  "SLF001", # Private member accessed
278
283
  ]
284
+
285
+ [tool.tox]
286
+ requires = ["tox~=4.28"]
287
+ env_list = ["3.10", "3.11", "3.12", "3.13"]
288
+
289
+ [tool.tox.env_run_base]
290
+ skip_install = true
291
+ allowlist_externals = ["make", "poetry"]
292
+ commands_pre = [
293
+ ["poetry", "env", "use", "{env_name}"],
294
+ ["poetry", "install", "--with", "openai,numpy"],
295
+ ]
296
+ commands = [
297
+ ["make", "check"],
298
+ ]
@@ -6,4 +6,4 @@
6
6
  #
7
7
  """Specifies the version of Pynguin."""
8
8
 
9
- __version__ = "0.41.0"
9
+ __version__ = "0.43.0"
@@ -288,8 +288,12 @@ def collect_static_constants(project_path: str | os.PathLike) -> ConstantPool:
288
288
  try:
289
289
  tree = ast.parse(module_file.read())
290
290
  collector.visit(tree)
291
- except BaseException as exception:
292
- logger.exception("Cannot collect constants: %s", exception)
291
+ except BaseException as exception: # noqa: BLE001
292
+ logger.warning(
293
+ "Could not collect constants from %s. Skipping constant collection (%s).",
294
+ module,
295
+ exception,
296
+ )
293
297
  return collector.constants
294
298
 
295
299
 
@@ -35,10 +35,13 @@ from typing import Any
35
35
  import astroid
36
36
 
37
37
  import pynguin.configuration as config
38
- import pynguin.utils.pynguinml.ml_testing_resources as tr
39
38
  import pynguin.utils.statistics.stats as stat
40
39
  import pynguin.utils.typetracing as tt
41
40
 
41
+
42
+ if config.configuration.pynguinml.ml_testing_enabled or typing.TYPE_CHECKING:
43
+ import pynguin.utils.pynguinml.ml_testing_resources as tr
44
+
42
45
  from pynguin.analyses.modulecomplexity import mccabe_complexity
43
46
  from pynguin.analyses.syntaxtree import FunctionDescription
44
47
  from pynguin.analyses.syntaxtree import astroid_to_ast
@@ -58,10 +61,10 @@ from pynguin.analyses.typesystem import UnionType
58
61
  from pynguin.analyses.typesystem import Unsupported
59
62
  from pynguin.analyses.typesystem import is_primitive_type
60
63
  from pynguin.configuration import TypeInferenceStrategy
61
- from pynguin.instrumentation.instrumentation import CODE_OBJECT_ID_KEY
62
64
  from pynguin.utils import randomness
63
65
  from pynguin.utils.exceptions import ConstraintValidationError
64
66
  from pynguin.utils.exceptions import ConstructionFailedException
67
+ from pynguin.utils.exceptions import CoroutineFoundException
65
68
  from pynguin.utils.generic.genericaccessibleobject import GenericAccessibleObject
66
69
  from pynguin.utils.generic.genericaccessibleobject import (
67
70
  GenericCallableAccessibleObject,
@@ -196,31 +199,199 @@ def _is_blacklisted(element: Any) -> bool:
196
199
  module_blacklist = set(MODULE_BLACKLIST).union(config.configuration.ignore_modules)
197
200
  method_blacklist = set(METHOD_BLACKLIST).union(config.configuration.ignore_methods)
198
201
 
199
- if inspect.ismodule(element):
200
- return element.__name__ in module_blacklist
201
- if inspect.isclass(element):
202
- if element.__module__ == "builtins" and (element in PRIMITIVES or element in COLLECTIONS):
203
- # Allow some builtin types
204
- return False
205
- return element.__module__ in module_blacklist
206
- if inspect.isfunction(element):
207
- # Some modules can be run standalone using a main function or provide a small
208
- # set of tests ('test'). We don't want to include those functions.
209
- # Importing certain modules such as inspect, that use or import C-functions can
210
- # lead to __module__ being None. We want to exclude these functions as well.
211
- return (
212
- element.__module__ is None
213
- or element.__module__ in module_blacklist
214
- or element.__qualname__.startswith((
215
- "main",
216
- "test",
217
- ))
218
- or f"{element.__module__}.{element.__qualname__}" in method_blacklist
202
+ try:
203
+ if inspect.ismodule(element):
204
+ return element.__name__ in module_blacklist
205
+ if inspect.isclass(element):
206
+ if element.__module__ == "builtins" and (
207
+ element in PRIMITIVES or element in COLLECTIONS
208
+ ):
209
+ # Allow some builtin types
210
+ return False
211
+ return element.__module__ in module_blacklist
212
+ if inspect.isfunction(element):
213
+ # Some modules can be run standalone using a main function or provide a small
214
+ # set of tests ('test'). We don't want to include those functions.
215
+ # Importing certain modules such as inspect, that use or import C-functions can
216
+ # lead to __module__ being None. We want to exclude these functions as well.
217
+ return (
218
+ element.__module__ is None
219
+ or element.__module__ in module_blacklist
220
+ or element.__qualname__.startswith((
221
+ "main",
222
+ "test",
223
+ ))
224
+ or f"{element.__module__}.{element.__qualname__}" in method_blacklist
225
+ )
226
+ except Exception: # noqa: BLE001
227
+ LOGGER.warning(
228
+ "Could not check if %s is blacklisted. Assuming it is not.", element, exc_info=True
229
+ )
230
+ # Something that is not supported yet.
231
+ return False
232
+
233
+
234
+ C_MODULE_WHITELIST = frozenset((
235
+ # === Basic C modules (interpreter startup) ===
236
+ "abc",
237
+ "ast",
238
+ "codecs",
239
+ "collections",
240
+ "enum",
241
+ "functools",
242
+ "imp",
243
+ "io",
244
+ "locale",
245
+ "operator",
246
+ "signal",
247
+ "sitebuiltins",
248
+ "stat",
249
+ "thread",
250
+ "tracemalloc",
251
+ "weakref",
252
+ "builtins",
253
+ "errno",
254
+ "marshal",
255
+ "sys",
256
+ "time",
257
+ "sre",
258
+ "symtable",
259
+ "warnings",
260
+ "string",
261
+ "re",
262
+ "inspect",
263
+ "tokenize",
264
+ # === Common Data Structures & Algorithms ===
265
+ "array",
266
+ "bisect",
267
+ "heapq",
268
+ "itertools",
269
+ # === Math & Random ===
270
+ "math",
271
+ "random",
272
+ "statistics",
273
+ # === Data Serialization & Formats ===
274
+ "csv",
275
+ "json",
276
+ "pickle",
277
+ "struct",
278
+ "elementtree",
279
+ "pyexpat",
280
+ "binascii",
281
+ # === Hashing & Cryptography ===
282
+ "hashlib",
283
+ "ssl",
284
+ "blake2",
285
+ "md5",
286
+ "sha3",
287
+ "unicodedata",
288
+ # === Compression ===
289
+ "zlib",
290
+ "bz2",
291
+ "lzma",
292
+ # === Concurrency & Interoperability ===
293
+ # "multiprocessing", # Explicitly not included
294
+ # "ctypes", # Explicitly not included
295
+ # "asyncio", # Explicitly not included
296
+ # === Networking ===
297
+ "socket",
298
+ "select",
299
+ # === Database ===
300
+ "sqlite3",
301
+ # === GUI ===
302
+ "tkinter",
303
+ # === Introspection & Debugging ===
304
+ "gc",
305
+ "faulthandler",
306
+ # === Platform: POSIX/Unix-like ===
307
+ "posix",
308
+ # "posixsubprocess", # Explicitly not included
309
+ "fcntl",
310
+ "grp",
311
+ "pwd",
312
+ "resource",
313
+ "termios",
314
+ # === Platform: Windows ===
315
+ "winapi",
316
+ "msvcrt",
317
+ # === Platform: macOS ===
318
+ "scproxy",
319
+ # === Platform: Cross-platform ===
320
+ "mmap",
321
+ # --- Other ---
322
+ "queue",
323
+ "decimal",
324
+ "uuid",
325
+ "datetime",
326
+ "zoneinfo",
327
+ "shlex",
328
+ "calendar",
329
+ "yaml",
330
+ "email",
331
+ "syslog",
332
+ "dataclasses",
333
+ "pprint",
334
+ "difflib",
335
+ "cmath",
336
+ "hmac",
337
+ ))
338
+
339
+
340
+ def _c_is_whitelisted(element: ModuleType) -> bool:
341
+ """Checks if the given element belongs to the C module whitelist.
342
+
343
+ Args:
344
+ element: The element to check
345
+
346
+ Returns:
347
+ Is the element whitelisted?
348
+ """
349
+ c_module_whitelist = set(C_MODULE_WHITELIST)
350
+
351
+ try:
352
+ module_name = element.__name__
353
+ top_level = module_name.split(".")[0]
354
+ public_top_level = top_level.lstrip("_")
355
+ return public_top_level in c_module_whitelist
356
+ except Exception: # noqa: BLE001
357
+ LOGGER.warning(
358
+ "Could not check if %s is whitelisted. Assuming it is not.", element, exc_info=True
219
359
  )
220
360
  # Something that is not supported yet.
221
361
  return False
222
362
 
223
363
 
364
+ def _handle_c_modules(
365
+ c_extensions: set[str],
366
+ ) -> None:
367
+ """Handles the C extensions in the subject module.
368
+
369
+ Args:
370
+ c_extensions: The set of C extensions.
371
+ """
372
+ subprocess_mode_recommended = len(c_extensions) > 0
373
+ if config.configuration.subprocess_if_recommended:
374
+ config.configuration.subprocess = subprocess_mode_recommended
375
+ LOGGER.info(
376
+ "Subprocess mode is set to %s because the subject module uses "
377
+ "the following C extensions: %s. ",
378
+ config.configuration.subprocess,
379
+ ", ".join(sorted(c_extensions)),
380
+ )
381
+ elif not config.configuration.subprocess and subprocess_mode_recommended:
382
+ LOGGER.warning(
383
+ "You are using threaded execution mode, but the subject module "
384
+ "uses the following C extensions: %s. "
385
+ "This may lead to unexpected behavior, consider using "
386
+ "subprocess mode instead.",
387
+ ", ".join(sorted(c_extensions)),
388
+ )
389
+
390
+ # Store the discovered C extensions in the statistics
391
+ stat.track_output_variable(RuntimeVariable.CExtensionModules, str(sorted(c_extensions)))
392
+ stat.track_output_variable(RuntimeVariable.SubprocessMode, str(config.configuration.subprocess))
393
+
394
+
224
395
  @dataclasses.dataclass
225
396
  class _ModuleParseResult:
226
397
  """A data wrapper for an imported and parsed module."""
@@ -934,8 +1105,14 @@ class FilteredModuleTestCluster(TestCluster): # noqa: PLR0904
934
1105
  ) -> None:
935
1106
  self.__delegate = delegate
936
1107
  self.__subject_properties = subject_properties
937
- self.__code_object_id_to_accessible_objects: dict[int, GenericCallableAccessibleObject] = {
938
- json.loads(acc.callable.__code__.co_consts[0])[CODE_OBJECT_ID_KEY]: acc
1108
+
1109
+ existing_code_objects = {
1110
+ metadata.code_object: code_object_id
1111
+ for code_object_id, metadata in subject_properties.existing_code_objects.items()
1112
+ }
1113
+
1114
+ self.__code_object_id_to_accessible_objects = {
1115
+ existing_code_objects[acc.callable.__code__]: acc
939
1116
  for acc in delegate.accessible_objects_under_test
940
1117
  if isinstance(acc, GenericCallableAccessibleObject)
941
1118
  and hasattr(acc.callable, "__code__")
@@ -1132,7 +1309,7 @@ def __analyse_function(
1132
1309
  return
1133
1310
  if inspect.iscoroutinefunction(func) or inspect.isasyncgenfunction(func):
1134
1311
  if add_to_test:
1135
- raise ValueError("Pynguin cannot handle Coroutine in SUT. Stopping.")
1312
+ raise CoroutineFoundException("Found coroutine in SUT: %s", func_name)
1136
1313
  # Coroutine outside the SUT are not problematic, just exclude them.
1137
1314
  LOGGER.debug("Skipping coroutine %s outside of SUT", func_name)
1138
1315
  return
@@ -1146,17 +1323,17 @@ def __analyse_function(
1146
1323
  description = get_function_description(func_ast)
1147
1324
  raised_exceptions = description.raises if description is not None else set()
1148
1325
  cyclomatic_complexity = __get_mccabe_complexity(func_ast)
1149
- if (
1150
- getattr(func, "__name__", None) == "<lambda>"
1151
- and (
1152
- lambda_assigned_name := _get_lambda_assigned_name(
1153
- module_tree, func.__code__.co_firstlineno
1154
- )
1155
- )
1156
- is not None
1157
- ):
1158
- func_name = lambda_assigned_name
1159
- func.__name__ = lambda_assigned_name
1326
+ if getattr(func, "__name__", None) == "<lambda>":
1327
+ if lambda_assigned_name := _get_lambda_assigned_name(
1328
+ module_tree, func.__code__.co_firstlineno
1329
+ ):
1330
+ func_name = lambda_assigned_name
1331
+ func.__name__ = lambda_assigned_name
1332
+ else:
1333
+ # If the lambda itself has no name, we must not add it to the test cluster
1334
+ # or else it will cause an exception during test export.
1335
+ return
1336
+
1160
1337
  generic_function = GenericFunction(func, inferred_signature, raised_exceptions, func_name)
1161
1338
 
1162
1339
  if config.configuration.pynguinml.ml_testing_enabled and module_tree is not None:
@@ -1334,7 +1511,7 @@ def __analyse_method(
1334
1511
  return
1335
1512
  if inspect.iscoroutinefunction(method) or inspect.isasyncgenfunction(method):
1336
1513
  if add_to_test:
1337
- raise ValueError("Pynguin cannot handle Coroutine in SUT. Stopping.")
1514
+ raise CoroutineFoundException("Found coroutine in SUT: %s", method_name)
1338
1515
  # Coroutine outside the SUT are not problematic, just exclude them.
1339
1516
  LOGGER.debug("Skipping coroutine %s outside of SUT", method_name)
1340
1517
  return
@@ -1402,6 +1579,9 @@ def __resolve_dependencies(
1402
1579
  seen_classes: set[Any] = set()
1403
1580
  seen_functions: set[Any] = set()
1404
1581
 
1582
+ # Set of C-extension modules that are not whitelisted
1583
+ dangerous_c_modules: set[str] = set()
1584
+
1405
1585
  # Always analyse builtins
1406
1586
  __analyse_included_classes(
1407
1587
  module=builtins,
@@ -1426,6 +1606,13 @@ def __resolve_dependencies(
1426
1606
  # Don't include anything from the blacklist
1427
1607
  continue
1428
1608
 
1609
+ # Check if the module contains c extensions that are not whitelisted
1610
+ dangerous_c_modules.update(
1611
+ __check_c_modules(
1612
+ module=current_module,
1613
+ )
1614
+ )
1615
+
1429
1616
  # Analyze all classes found in the current module
1430
1617
  __analyse_included_classes(
1431
1618
  module=current_module,
@@ -1458,6 +1645,7 @@ def __resolve_dependencies(
1458
1645
  LOGGER.info("Modules: %5i", len(seen_modules))
1459
1646
  LOGGER.info("Functions: %5i", len(seen_functions))
1460
1647
  LOGGER.info("Classes: %5i", len(seen_classes))
1648
+ _handle_c_modules(dangerous_c_modules)
1461
1649
 
1462
1650
  test_cluster.type_system.push_attributes_down()
1463
1651
 
@@ -1555,6 +1743,41 @@ def __analyse_included_functions(
1555
1743
  )
1556
1744
 
1557
1745
 
1746
+ def __check_c_modules(
1747
+ *,
1748
+ module: ModuleType,
1749
+ ) -> set[str]:
1750
+ """Return the names of modules containing non-whitelisted C extensions.
1751
+
1752
+ Args:
1753
+ module: The module to check
1754
+
1755
+ Returns:
1756
+ A set of module names with non-whitelisted C code.
1757
+ """
1758
+ non_whitelisted_modules = set()
1759
+
1760
+ # If the whole module file looks like a binary extension:
1761
+ module_file = getattr(module, "__file__", "")
1762
+ if module_file and Path(module_file).suffix in {".so", ".pyd"}:
1763
+ if not _c_is_whitelisted(module):
1764
+ non_whitelisted_modules.add(module.__name__)
1765
+ return non_whitelisted_modules
1766
+
1767
+ # If the module is Python, inspect its members too:
1768
+ for element in vars(module).values():
1769
+ if inspect.isfunction(element) or inspect.isclass(element):
1770
+ try:
1771
+ inspect.getsource(element)
1772
+ # Source is available => likely pure Python.
1773
+ except Exception: # noqa: BLE001
1774
+ # No source => likely compiled or builtin.
1775
+ if not _c_is_whitelisted(module):
1776
+ non_whitelisted_modules.add(module.__name__)
1777
+
1778
+ return non_whitelisted_modules
1779
+
1780
+
1558
1781
  def analyse_module(
1559
1782
  parsed_module: _ModuleParseResult,
1560
1783
  type_inference_strategy: TypeInferenceStrategy = TypeInferenceStrategy.TYPE_HINTS,
@@ -104,8 +104,14 @@ class InitialPopulationProvider:
104
104
  logger.debug("No suitable test module found.")
105
105
  stat.track_output_variable(RuntimeVariable.SuitableTestModule, value=False)
106
106
  return None
107
- except BaseException as exception:
108
- logger.exception("Cannot read module: %s", exception)
107
+ except BaseException as exception: # noqa: BLE001
108
+ try:
109
+ logger.exception("Cannot read module: %s", exception)
110
+ except BaseException: # noqa: BLE001
111
+ # Starting with Python 3.11, the exception method tries to parse the file
112
+ # using the ast.parse function which can fail.
113
+ logger.error("Cannot read module: %s", exception)
114
+
109
115
  stat.track_output_variable(RuntimeVariable.SuitableTestModule, value=False)
110
116
  return None
111
117