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