pynguin 0.48.0__tar.gz → 0.49.0.dev0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/PKG-INFO +1 -1
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/pyproject.toml +1 -1
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/__version__.py +1 -1
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/configuration.py +55 -2
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/generator.py +199 -20
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/dependency_analyzer.py +62 -24
- pynguin-0.49.0.dev0/src/pynguin/mock_generation/llm_backend.py +305 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/llm_classifier_client.py +26 -3
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/mock_generator.py +36 -8
- pynguin-0.49.0.dev0/src/pynguin/mock_generation/patch_targets.py +396 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/static_setups.py +29 -13
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/validator.py +11 -5
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/execution.py +21 -9
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/export.py +55 -12
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/mock_statement.py +97 -5
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/mock_templates_store.py +6 -0
- pynguin-0.49.0.dev0/src/pynguin/testcase/scoped_patch.py +205 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/testcase.py +4 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/testfactory.py +149 -8
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/statistics/runtimevariable.py +3 -0
- pynguin-0.49.0.dev0/tests/fixtures/examples/environment.py +37 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/test_dependency_analyzer.py +82 -7
- pynguin-0.49.0.dev0/tests/mock_generation/test_llm_backend.py +149 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/test_mock_generator.py +2 -2
- pynguin-0.49.0.dev0/tests/mock_generation/test_patch_targets.py +172 -0
- pynguin-0.49.0.dev0/tests/quick_eval/test_mocking.py +187 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_validator.py +19 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/test_generator.py +82 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_testcaseexecutor_integration.py +41 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/export/test_export.py +60 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_mock_statement.py +79 -0
- pynguin-0.49.0.dev0/tests/testcase/test_scoped_patch.py +119 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_testfactory.py +107 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_configuration_writer.py +20 -1
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/LICENSE.rst +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/LICENSES/Apache-2.0.txt +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/LICENSES/BSD-2-Clause.txt +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/LICENSES/CC-BY-4.0.txt +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/LICENSES/CC0-1.0.txt +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/LICENSES/MIT.txt +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/README.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/__main__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/ast_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/constants.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/generator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/generics.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/module.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/modulecomplexity.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/seeding.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/string_subtype_inference.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/string_subtypes.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/syntaxtree.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/type_inference.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/analyses/typesystem.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/assertion.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/assertion_to_ast.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/assertion_trace.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/assertiongenerator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/assertiontraceobserver.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/llmassertiongenerator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/controller.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/mutators.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/arithmetic.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/base.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/decorator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/exception.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/inheritance.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/logical.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/loop.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/misc.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/operators/statement.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/strategies.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/assertion/mutation_analysis/transformer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/cli.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/abstractmosaalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/archive.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/dynamosaalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/generationalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/lldynamosaalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/llmosalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/mioalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/mosaalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/randomalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/randomsearchalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/algorithms/wholesuitealgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/checked_coverage.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/chromosome.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/chromosomefactory.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/chromosomevisitor.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/computation_cache.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/computations.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/coveragegoals.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/fitness_metrics.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/generationalgorithmfactory.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/llmtestsuitechromosomefactory.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/operators/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/operators/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/operators/comparator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/operators/crossover.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/operators/mutation.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/operators/ranking.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/operators/selection.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/postprocess.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/searchobserver.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/stoppingcondition.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/testcasechromosome.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/testcasechromosomefactory.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/testcasefactory.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/testsuitechromosome.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/ga/testsuitechromosomefactory.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/controlflow.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/machinery.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/tracer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/transformer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/common.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/python3_10.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/python3_11.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/python3_12.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/python3_13.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/python3_14.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/instrumentation/version/python3_15.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/aggregation.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/island.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/llm_worker.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/llm_worker_algorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/llm_worker_protocol.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/migration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/migration_algorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/orchestrator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/islands/population_allocation.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/cache.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/caching.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/client.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/config_schema.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/llmagent.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/llmtestcasehandler.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/parsing/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/parsing/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/parsing/deserializer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/parsing/helpers.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/parsing/rewriter.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/parsing/type_str_parser.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/assertiongenerationprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/base_inference_prompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/localsearchprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/modulemutationstrengthenprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/modulereadabilityrefinementprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/modulerefinementprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/modulesemanticassertionsprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/mutationstrengthenprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/prompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/readabilityrefinementprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/repairprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/assertion_generation.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/defaults.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/generator_generate.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/local_search.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/module_mutation_strengthen.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/module_readability_refinement.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/module_refinement_combined.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/module_semantic_assertions.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/mutation_strengthen.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/readability_refinement.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/refinement.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/repair.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/semantic_assertions.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/test_case_generation.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/type_inference.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/type_subtype_inference.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/resources/uncovered_targets.yaml +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/semanticassertionsprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/testcasegenerationprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/type_and_subtype_inference_prompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/typeinferenceprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/prompts/uncoveredtargetsprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/query_strategy.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/large_language_model/request.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/master_worker/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/master_worker/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/master_worker/client.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/master_worker/master.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/master_worker/worker.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/ast_helpers.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/context_extractor.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/mock_hint_generator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/mock_rule_generator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/proxy_cache_resolver.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/mock_generation/untyped_param_analyzer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/aaa_inserter.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/alignment.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/api_signatures.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/ast_analyzer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/coverage_checker.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/llm_client.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/llm_judge.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/mutation_analyzer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/pipeline.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/readability_metrics.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/refiner.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/refinement/sut_inspector.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/coverage-template.html +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/camel_case.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/colour.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/csv.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/delimited.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/email.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/camel_case.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/colour.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/csv.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/delimited.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/email.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/ipv4.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/standard_date.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/unix_path.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/faker/xml.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/ipv4.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/numeric.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/standard_date.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/unix_path.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/resources/fans/xml.fan +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/dynamicslicer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/executedinstruction.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/executionflowbuilder.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/stack/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/stack/stacksimulation.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/slicer/statementslicingobserver.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/collection_tracker.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/crash_minimization.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/execution_isolation.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/execution_observers.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/execution_result.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/literalgen.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/llmlocalsearch.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/localsearch.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/localsearchobjective.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/localsearchstatement.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/localsearchtimer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/testcase/subprocess_executor.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/atomicinteger.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/collection_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/configuration_writer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/controlflowdistance.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/cst_imports.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/exceptions.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/execution_recorder.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/fandango_faker_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/fs_isolation.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/generic/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/generic/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/generic/genericaccessibleobject.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/llm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/logging_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/mirror.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/mutation_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/naming.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/openai_key_resolver.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/orderedset.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/ml_parsing_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/ml_testfactory_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/ml_testing_resources.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/mlparameter.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/ndarray_cst.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/ndarray_mutation.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/pynguinml/np_rng.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/randomness.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/report.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/statistics/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/statistics/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/statistics/outputvariablefactory.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/statistics/statisticsbackend.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/statistics/statisticsobserver.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/statistics/stats.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/timeout.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/type_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/typeevalpy_json_schema.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/src/pynguin/utils/typetracing.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_ast_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_constants.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_generics.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_initialpopulationseeding.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_module.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_modulecomplexity.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_native_libraries.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_seeding.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_staticconstantseeding.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_string_subtype_inference.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_string_subtypes.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_subtypes.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_syntaxtree.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_type_inference.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_typesystem.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/analyses/test_typesystem_string_subtypes.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_arithmetic.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_decorator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_exception.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_inheritance.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_logical.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_loop.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_misc.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/operators/test_statement.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/test_controller.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/test_mutators.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/test_strategies.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/mutation_analysis/test_transformer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/test_assertion.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/test_assertion_generation_integration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/test_assertion_to_ast.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/test_assertion_trace.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/test_assertiongenerator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/test_assertiontraceobserver.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/assertion/test_llmassertiongenerator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/conftest.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/accessibles/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/accessibles/accessible.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/branchcoverage/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/branchcoverage/dict_branch.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/branchcoverage/nestedbranches.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/branchcoverage/nobranches.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/branchcoverage/simplenesting.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/branchcoverage/singlebranches.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/branchcoverage/twomethodsinglebranches.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/c/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/c/my_ctypes.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/abstract.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/alias_module.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/async_and_sync.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/async_class_gen.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/async_class_method.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/async_func.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/async_gen.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/attributes.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/blacklist.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/blacklist_transitive.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/cached_function.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/comments.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/complex_dependencies.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/complex_dependency.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/conditional_import.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/dependency.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/diamond_bottom.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/diamond_left.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/diamond_right.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/diamond_top.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/enums.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/fields.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/generic_classes.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/import_dependency.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/inheritance.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/lambda.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/lazy_module_getattr.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/methods.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/nested_functions.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/no_any_annotations.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/no_dependencies.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/overridden_inherited_methods.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/rewritten_module.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/simple_dependencies.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/tuple_return.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/typing_parameters.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/uses_async_dependency.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/visibility.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/cluster/visibility_dependency.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/crash/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/crash/partly_crashing.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/crash/seg_fault.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/duckmock/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/duckmock/complex.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/errors/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/errors/import_error.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/errors/timeout_error.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/abstract_classes.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/assertions.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/basket.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/calculator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/calculator_simple.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/collections.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/constructors.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/difficult.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/dummies.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/dynamosa_example.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/enums.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/exceptions.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/flaky.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/higher_order.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/impossible.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/inheritance.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/loop.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/module_alias.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/monkey.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/nested.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/no_cover_example.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/objects.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/pattern_matching.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/private_methods.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/queue.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/reexport_package/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/reexport_package/widget.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/shadowed_submodule/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/shadowed_submodule/shadowed.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/simple.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/submodule_package/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/submodule_package/helper.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/submodule_package/target.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/triangle.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/type_inference.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/type_tracing/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/type_tracing/geometry.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/type_tracing/invoice.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/type_tracing/large_test_cluster.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/type_tracing/mixed.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/type_tracing/string_subtype.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/examples/unasserted_exceptions.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/grammar/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/grammar/parameters.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/comparison.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/covered_branches.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/covered_classes.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/covered_functions.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/covered_lines.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/excluded_blocks.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/if_else_targets.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/inherited.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/mixed.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/simple.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/instrumentation/unpickling.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/linecoverage/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/linecoverage/artificial_none.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/linecoverage/emptyfile.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/linecoverage/exception.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/linecoverage/list.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/linecoverage/plus.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/linecoverage/setter_getter.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/busy_loop.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/exception.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/expected.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/mutation.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/raising.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/recursive_enum.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/relative_package/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/relative_package/helper.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/mutation/timeout.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/programgraph/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/programgraph/infinite_loops.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/programgraph/samples.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/programgraph/whileloop.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/programgraph/yield_fun.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/regression/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/regression/argparse_sys_exit.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/regression/custom_error.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/regression/not_main.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/dynamicseeding/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/dynamicseeding/dynamicseedingdummies.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/dummycontainer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/assertseed_test_.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/classseed_test_.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collfuncseed_test_.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collseed_test_.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/nestedseed_test_.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notknowncall_test_.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notprimseed_test_.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/primitiveseed_test_.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/triangleseed_test_.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongassignseed_test_.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongfunctionnameseed_test_.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/staticconstantseeding/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/staticconstantseeding/dummy/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/staticconstantseeding/dummy/dummy.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/seeding/staticconstantseeding/dummy/empty.so +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/attribute_dependencies.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/closure.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/generator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/immutable_attribute_dependency.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/import_star_def.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/import_star_main.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/partial_cover_dependency.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/simple_call.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/slicer/simple_call_arg.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/test.conf +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/test.conf.license +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/tests/typeinference/test_stubstrategy.pyi +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/type_tracing/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/type_tracing/guess_params.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/type_tracing/return_types.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/type_tracing/union_type.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/types/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/types/outside.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/types/subtyping.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/fixtures/types/symbols.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_archive.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_dynamosaalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_generationalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_integration_mosaalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_integration_varioussearchalgorithms.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_lldynamosaalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_llm_async_search.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_llmosalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_mioalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_mosaalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/algorithms/test_randomalgorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/crossover/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/crossover/test_singlepointrelativecrossover.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/ranking/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/ranking/test_rankingfunction.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/selection/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/selection/test_randomselection.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/selection/test_rankselection.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/selection/test_selection.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/selection/test_tournamentselection.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/selection/test_truncationselection.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/test_dominancecomparator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/operators/test_preferencesortingcomparator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_coverageplateaustoppingcondition.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_maxcoveragestoppingcondition.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_maxiterationsstoppingcondition.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_maxmemorystoppingcondition.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_maxstatementstoppingcondition.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_maxtestsstoppingcondition.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_maxtimestoppingcondition.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_minimumcoverageplateaustoppingcondition.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/stoppingconditions/test_stoppingcondition.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_chromosome.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_chromosomefactory.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_computations.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_computations_cache.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_computations_fitness_utilities.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_coveragegoals.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_fine_grained_targeting.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_fine_grained_targeting_integration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_generationalgorithmfactory.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_generator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_llmtestsuitechromosomefactory.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_postprocess.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_testcasechromosome.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_testcasefactory.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/ga/test_testsuitechromosome.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_adapters.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_ast_info.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_cfg.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_controldependencegraph.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_machinery.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_programgraph.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_tracer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_type_checking_integration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/instrumentation/test_version.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_aggregation.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_island.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_llm_worker.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_llm_worker_algorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_llm_worker_protocol.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_migration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_migration_algorithm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_orchestrator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/islands/test_population_allocation.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/parsing/test_helpers.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/parsing/test_type_str_parser.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_assertiongenerationprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_module_prompts.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_mutationstrengthenprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_readabilityrefinementprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_repairprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_semanticassertionsprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_testcasegenerationprompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/prompts/test_uncovered_targets_prompt.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_cache.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_caching.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_characterization.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_client_async.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_client_thinking.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_extract_python_code.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_llm_caching.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_llm_deserializer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_llmagent.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_llmagent_extended.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_llmtestcasehandler.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_llmtestcasehandler_coverage.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_query_strategy.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_request_budget.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_rewriter.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/large_language_model/test_temperature_fallback.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/master_worker/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/master_worker/test_client.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/master_worker/test_master.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/master_worker/test_worker.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/test_context_extractor.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/test_mock_hint_generator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/test_mock_rule_generator.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/test_static_setups.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/mock_generation/test_untyped_param_analyzer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/quick_eval/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/quick_eval/test_args.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/quick_eval/test_output_dir.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/quick_eval/test_stats.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/quick_eval/test_suite_project_path.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/quick_eval/test_suite_scope.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_aaa_inserter.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_alignment.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_api_signatures.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_ast_analyzer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_coverage_checker.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_llm_client.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_llm_judge.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_module_mutation_strengthening.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_module_refinement.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_mutation_analyzer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_pipeline.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_readability_metrics.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_refiner.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/refinement/test_sut_inspector.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/resources/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/resources/typeevalpy/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/resources/typeevalpy/dummy.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/resources/typeevalpy/dummy_gt.json +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/resources/typeevalpy/dummy_gt.json.license +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/slicer/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/slicer/test_assertionslicer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/slicer/test_dependencies.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/slicer/test_expected_failures.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/slicer/test_language_features.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/slicer/test_statementslicer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/slicer/util.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/test___main__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/test_cli.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/test_compiled_sut_integration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/test_random_sut_integration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/test_reload_state_coverage_integration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/test_shadowed_sut_integration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/AGENTS.md +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/_builders.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_executedinstruction.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_executionmocking.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_executionresult.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_executiontrace.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_generator_integration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_moduleprovider.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_outputsuppression.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_returntype.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_subprocesstestcaseexecutor.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_subprocesstestcaseexecutor_differential.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_subprocesstestcaseexecutor_integration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_tuple_deconstruction_integration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/execution/test_typetracing.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/export/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/export/conftest.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/statements/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_collection_tracker.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_constant_seeding_integration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_dict_branch_coverage_integration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_literalgen.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_llmlocalsearch.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_localsearch.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_localsearchstatement.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_localsearchtimer.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_ml_testfactory.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/test_testcase.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testcase/variable/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/testutils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/generic/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/generic/test_genericaccessibleobject.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/pynguinml/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/pynguinml/test_ml_parsing_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/pynguinml/test_ml_testfactory_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/pynguinml/test_ml_testing_resources.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/pynguinml/test_mlparameter.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/pynguinml/test_np_rng.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/pynguinml/test_pynguinml_integration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/stats/__init__.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/stats/test_outputvariablefactory.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/stats/test_runtimevariable.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/stats/test_searchstatistics.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/stats/test_statistics.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/stats/test_statisticsbackend.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_atomicinteger.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_collection_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_controlflowdistance.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_exceptions.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_execution_recorder.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_fandango_faker_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_fs_isolation.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_llm.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_logging_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_mirror.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_mutation_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_naming.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_orderedset.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_randomness.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_report.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_string_subtype_integration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_timeout.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_type_utils.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_typeevalpy_integration.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_typeevalpy_json_schema.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/test_typetracing.py +0 -0
- {pynguin-0.48.0 → pynguin-0.49.0.dev0}/tests/utils/utils.py +0 -0
|
@@ -129,6 +129,25 @@ class MutationStrategy(str, enum.Enum):
|
|
|
129
129
|
IEEE Transactions on SE 39.4 2013)"""
|
|
130
130
|
|
|
131
131
|
|
|
132
|
+
class MockLLMBackend(str, enum.Enum):
|
|
133
|
+
"""Where the mock-generation pipeline sends its LLM requests."""
|
|
134
|
+
|
|
135
|
+
AUTO = "AUTO"
|
|
136
|
+
"""Use the proxy-cache when a proxy URL is configured, otherwise Pynguin's own
|
|
137
|
+
LLM client when an API key is available, otherwise no LLM at all."""
|
|
138
|
+
|
|
139
|
+
PROXY = "PROXY"
|
|
140
|
+
"""Send classification and hint requests to the proxy-cache service."""
|
|
141
|
+
|
|
142
|
+
PYNGUIN = "PYNGUIN"
|
|
143
|
+
"""Send classification and hint requests through Pynguin's own LLM client
|
|
144
|
+
(``LLM_API_KEY``/``LLM_BASE_URL``/``LLM_MODEL``), cached on disk."""
|
|
145
|
+
|
|
146
|
+
NONE = "NONE"
|
|
147
|
+
"""Make no LLM calls: classify with the local rules only and configure mocks
|
|
148
|
+
from the static setups alone."""
|
|
149
|
+
|
|
150
|
+
|
|
132
151
|
class RefinementGranularity(str, enum.Enum):
|
|
133
152
|
"""Granularity of the LLM readability & assertion refinement stages."""
|
|
134
153
|
|
|
@@ -1174,8 +1193,14 @@ class MockGenerationConfiguration:
|
|
|
1174
1193
|
"""Configuration for mock generation."""
|
|
1175
1194
|
|
|
1176
1195
|
mock_generation_enabled: bool = False
|
|
1177
|
-
"""Enable the mock generation pipeline.
|
|
1178
|
-
|
|
1196
|
+
"""Enable the mock generation pipeline. Classes and functions the module under
|
|
1197
|
+
test reaches are classified locally first; only the remaining third-party ones
|
|
1198
|
+
are sent to the LLM backend selected by ``llm_backend``."""
|
|
1199
|
+
|
|
1200
|
+
llm_backend: MockLLMBackend = MockLLMBackend.AUTO
|
|
1201
|
+
"""Where classification and return-value hint requests go. ``AUTO`` prefers the
|
|
1202
|
+
proxy-cache when a proxy URL is configured, then Pynguin's own LLM client when an
|
|
1203
|
+
API key is available, and otherwise runs without an LLM."""
|
|
1179
1204
|
|
|
1180
1205
|
proxy_cache_url: str = ""
|
|
1181
1206
|
"""Base URL of the proxy-cache service.
|
|
@@ -1186,6 +1211,34 @@ class MockGenerationConfiguration:
|
|
|
1186
1211
|
When provided, the dependency analyzer consults these rules before the LLM.
|
|
1187
1212
|
Omit to rely purely on the LLM classify endpoint."""
|
|
1188
1213
|
|
|
1214
|
+
base_rules_path: str = ""
|
|
1215
|
+
"""Optional path to a local rules JSON file produced by the mock rule generator.
|
|
1216
|
+
Used instead of ``base_rules_cache_id`` when set, so mined rules work without
|
|
1217
|
+
the proxy-cache."""
|
|
1218
|
+
|
|
1219
|
+
spec_probability: float = 0.5
|
|
1220
|
+
"""Probability that a new mock of a known class is built as
|
|
1221
|
+
``MagicMock(spec=<class>)``. A spec'd mock passes ``isinstance`` checks and
|
|
1222
|
+
raises ``AttributeError`` for attributes the class lacks; a bare mock accepts
|
|
1223
|
+
everything. Mutation flips the choice, so the search keeps whichever reaches
|
|
1224
|
+
more code. Expects values in [0, 1]."""
|
|
1225
|
+
|
|
1226
|
+
patch_calls: bool = True
|
|
1227
|
+
"""Also patch calls the module under test makes to external functions (e.g.
|
|
1228
|
+
``os.getenv``, ``time.time``, ``requests.get``) that the classifier marks as
|
|
1229
|
+
environment, clock, randomness, or I/O boundaries. Patches are scoped to the
|
|
1230
|
+
module under test during generation and exported as ``patch.object(...)``."""
|
|
1231
|
+
|
|
1232
|
+
patch_probability: float = 0.5
|
|
1233
|
+
"""Probability that a freshly generated test case patches each detected
|
|
1234
|
+
external call. Expects values in [0, 1]."""
|
|
1235
|
+
|
|
1236
|
+
unconstructable_mock_probability: float = 0.4
|
|
1237
|
+
"""Probability of passing a mock (spec'd to the class) for a parameter whose
|
|
1238
|
+
type Pynguin cannot construct, e.g. an abstract class or a protocol. Types that
|
|
1239
|
+
can be constructed are never mocked unless they are classified boundaries.
|
|
1240
|
+
Optional parameters of such types are skipped instead. Expects values in [0, 1]."""
|
|
1241
|
+
|
|
1189
1242
|
|
|
1190
1243
|
@dataclasses.dataclass
|
|
1191
1244
|
class LocalSearchConfiguration:
|
|
@@ -97,6 +97,7 @@ from pynguin.utils.timeout import TestExecutionTimeoutError, time_limit
|
|
|
97
97
|
if TYPE_CHECKING:
|
|
98
98
|
from pynguin.analyses.module import ModuleTestCluster
|
|
99
99
|
from pynguin.ga.algorithms.generationalgorithm import GenerationAlgorithm
|
|
100
|
+
from pynguin.mock_generation.mock_generator import MockGenerator
|
|
100
101
|
|
|
101
102
|
if config.configuration.pynguinml.ml_testing_enabled or TYPE_CHECKING:
|
|
102
103
|
from pynguin.utils.pynguinml import np_rng
|
|
@@ -644,6 +645,38 @@ def _cluster_candidate_classes(test_cluster: ModuleTestCluster) -> list[type]:
|
|
|
644
645
|
return classes
|
|
645
646
|
|
|
646
647
|
|
|
648
|
+
def _unconstructable_param_classes(test_cluster: ModuleTestCluster) -> set[str]:
|
|
649
|
+
"""FQNs of parameter classes of the module under test that Pynguin cannot build.
|
|
650
|
+
|
|
651
|
+
Such parameters (abstract classes, protocols, classes without a usable
|
|
652
|
+
constructor) may receive a mock; their static setups are derived like those of
|
|
653
|
+
classified boundaries, so the mock can reach value-dependent branches.
|
|
654
|
+
|
|
655
|
+
Args:
|
|
656
|
+
test_cluster: The test cluster of the module under test.
|
|
657
|
+
|
|
658
|
+
Returns:
|
|
659
|
+
The FQNs (``module.qualname``) of those classes.
|
|
660
|
+
"""
|
|
661
|
+
from pynguin.analyses.typesystem import Instance # noqa: PLC0415
|
|
662
|
+
from pynguin.testcase.testfactory import may_mock_unconstructable # noqa: PLC0415
|
|
663
|
+
|
|
664
|
+
out: set[str] = set()
|
|
665
|
+
for accessible in test_cluster.accessible_objects_under_test:
|
|
666
|
+
signature = getattr(accessible, "inferred_signature", None)
|
|
667
|
+
if signature is None:
|
|
668
|
+
continue
|
|
669
|
+
for param_type in signature.original_parameters.values():
|
|
670
|
+
if not isinstance(param_type, Instance):
|
|
671
|
+
continue
|
|
672
|
+
raw = param_type.type.raw_type
|
|
673
|
+
if not isinstance(raw, type):
|
|
674
|
+
continue
|
|
675
|
+
if may_mock_unconstructable(raw) and not test_cluster.get_generators_for(param_type):
|
|
676
|
+
out.add(f"{raw.__module__}.{raw.__qualname__}")
|
|
677
|
+
return out
|
|
678
|
+
|
|
679
|
+
|
|
647
680
|
def _untyped_param_bindings(
|
|
648
681
|
module_path: Path, candidate_classes: list[type], mock_targets: set[str]
|
|
649
682
|
) -> dict[tuple[str, str], str]:
|
|
@@ -722,6 +755,10 @@ def _apply_static_setups( # noqa: C901
|
|
|
722
755
|
except SyntaxError:
|
|
723
756
|
return
|
|
724
757
|
alias_map = ast_helpers.import_alias_map(tree)
|
|
758
|
+
# Classes the module defines itself (e.g. an abstract parameter type).
|
|
759
|
+
for node in tree.body:
|
|
760
|
+
if isinstance(node, ast.ClassDef) and module_name:
|
|
761
|
+
alias_map.setdefault(node.name, f"{module_name}.{node.name}")
|
|
725
762
|
candidates = candidate_classes or []
|
|
726
763
|
|
|
727
764
|
# Index the injector's untyped bindings by callable key, as generate_templates does.
|
|
@@ -765,6 +802,127 @@ def _apply_static_setups( # noqa: C901
|
|
|
765
802
|
template.setup_lines.append(line)
|
|
766
803
|
|
|
767
804
|
|
|
805
|
+
def _resolve_fqn(fqn: str) -> Any:
|
|
806
|
+
"""Import the object a fully-qualified name stands for.
|
|
807
|
+
|
|
808
|
+
Args:
|
|
809
|
+
fqn: A dotted name such as ``requests.sessions.Session``.
|
|
810
|
+
|
|
811
|
+
Returns:
|
|
812
|
+
The object, or None if no prefix of *fqn* imports as a module holding it.
|
|
813
|
+
"""
|
|
814
|
+
parts = fqn.split(".")
|
|
815
|
+
for split in range(len(parts) - 1, 0, -1):
|
|
816
|
+
try:
|
|
817
|
+
obj: Any = importlib.import_module(".".join(parts[:split]))
|
|
818
|
+
except Exception: # noqa: BLE001, S112
|
|
819
|
+
continue
|
|
820
|
+
for name in parts[split:]:
|
|
821
|
+
obj = getattr(obj, name, None)
|
|
822
|
+
if obj is None:
|
|
823
|
+
break
|
|
824
|
+
if obj is not None:
|
|
825
|
+
return obj
|
|
826
|
+
return None
|
|
827
|
+
|
|
828
|
+
|
|
829
|
+
def _apply_spec_paths(module: types.ModuleType, mock_targets: set[str]) -> None:
|
|
830
|
+
"""Record how each mocked class is spelled from the module under test.
|
|
831
|
+
|
|
832
|
+
The path lets a mock be rendered as ``MagicMock(spec=module_0.<path>)`` without
|
|
833
|
+
importing anything else into the generated test.
|
|
834
|
+
|
|
835
|
+
Args:
|
|
836
|
+
module: The module under test.
|
|
837
|
+
mock_targets: The FQNs of the mocked classes.
|
|
838
|
+
"""
|
|
839
|
+
import pynguin.testcase.mock_templates_store as _mock_store # noqa: PLC0415
|
|
840
|
+
from pynguin.mock_generation.patch_targets import ( # noqa: PLC0415
|
|
841
|
+
find_attribute_path,
|
|
842
|
+
)
|
|
843
|
+
|
|
844
|
+
for fqn in sorted(mock_targets):
|
|
845
|
+
obj = _resolve_fqn(fqn)
|
|
846
|
+
if obj is None:
|
|
847
|
+
continue
|
|
848
|
+
path = find_attribute_path(module, obj)
|
|
849
|
+
if path is None:
|
|
850
|
+
continue
|
|
851
|
+
_mock_store.MOCK_SPEC_PATHS[fqn] = path
|
|
852
|
+
template = _mock_store.MOCK_TEMPLATES_BY_TARGET.get(fqn)
|
|
853
|
+
if template is not None:
|
|
854
|
+
template.spec_path = path
|
|
855
|
+
|
|
856
|
+
|
|
857
|
+
def _setup_patch_templates(
|
|
858
|
+
module: types.ModuleType,
|
|
859
|
+
gen: MockGenerator,
|
|
860
|
+
base_rules_cache_id: str | None,
|
|
861
|
+
rules_path: Path | None,
|
|
862
|
+
) -> int:
|
|
863
|
+
"""Find the external functions the module under test calls and pick those to patch.
|
|
864
|
+
|
|
865
|
+
Each candidate goes through the same classifier as the mocked classes; every
|
|
866
|
+
callee decided as ``mock`` becomes a patch template whose return values come
|
|
867
|
+
from the static analysis of its call sites.
|
|
868
|
+
|
|
869
|
+
Args:
|
|
870
|
+
module: The module under test.
|
|
871
|
+
gen: The mock generator whose classifier decides.
|
|
872
|
+
base_rules_cache_id: proxy-cache rule set to consult before the LLM.
|
|
873
|
+
rules_path: local rules JSON, used instead of *base_rules_cache_id*.
|
|
874
|
+
|
|
875
|
+
Returns:
|
|
876
|
+
The number of patch templates created.
|
|
877
|
+
"""
|
|
878
|
+
import pynguin.testcase.mock_templates_store as _mock_store # noqa: PLC0415
|
|
879
|
+
from pynguin.mock_generation import patch_targets # noqa: PLC0415
|
|
880
|
+
from pynguin.mock_generation.mock_generator import ( # noqa: PLC0415
|
|
881
|
+
MockTemplate,
|
|
882
|
+
MutableSetup,
|
|
883
|
+
)
|
|
884
|
+
|
|
885
|
+
module_path = Path(str(module.__file__))
|
|
886
|
+
source = module_path.read_text(encoding="utf-8")
|
|
887
|
+
candidates = patch_targets.find_patch_candidates(source, module)
|
|
888
|
+
if not candidates:
|
|
889
|
+
return 0
|
|
890
|
+
analyzer = gen.analyzer(module_path, base_rules_cache_id, rules_path)
|
|
891
|
+
decisions = {
|
|
892
|
+
decision.target: decision
|
|
893
|
+
for decision in analyzer.classify_targets([
|
|
894
|
+
(target.fqn, callee) for target, callee in candidates
|
|
895
|
+
])
|
|
896
|
+
}
|
|
897
|
+
for target, _callee in candidates:
|
|
898
|
+
decision = decisions.get(target.fqn)
|
|
899
|
+
if decision is None or decision.decision != "mock":
|
|
900
|
+
continue
|
|
901
|
+
mutable, lines = patch_targets.patch_setups(source, target)
|
|
902
|
+
dependency = target.attribute.lower()
|
|
903
|
+
_mock_store.MOCK_PATCH_TEMPLATES.append(
|
|
904
|
+
MockTemplate(
|
|
905
|
+
dependency=dependency,
|
|
906
|
+
import_path=target.fqn.split(".", maxsplit=1)[0],
|
|
907
|
+
mock_target=target.fqn,
|
|
908
|
+
setup_code=f"mock_{dependency} = MagicMock()",
|
|
909
|
+
setup_lines=lines,
|
|
910
|
+
mutable_setups=[
|
|
911
|
+
MutableSetup(target=chain, candidates=cands) for chain, cands in mutable
|
|
912
|
+
],
|
|
913
|
+
patch_target=target,
|
|
914
|
+
)
|
|
915
|
+
)
|
|
916
|
+
_LOGGER.info(
|
|
917
|
+
"Mock generation: patching %s (%s: %s), setups=%s",
|
|
918
|
+
target.fqn,
|
|
919
|
+
decision.source,
|
|
920
|
+
decision.reason,
|
|
921
|
+
[(chain, cands) for chain, cands in mutable] + lines,
|
|
922
|
+
)
|
|
923
|
+
return len(_mock_store.MOCK_PATCH_TEMPLATES)
|
|
924
|
+
|
|
925
|
+
|
|
768
926
|
def _setup_mock_generation(test_cluster: ModuleTestCluster) -> None:
|
|
769
927
|
"""Run the mock pipeline and record its statistics.
|
|
770
928
|
|
|
@@ -781,16 +939,20 @@ def _setup_mock_generation(test_cluster: ModuleTestCluster) -> None:
|
|
|
781
939
|
stat.track_output_variable(RuntimeVariable.MockTargetsFromLLM, metrics["from_llm"])
|
|
782
940
|
stat.track_output_variable(RuntimeVariable.MockHintTargets, metrics["hint_targets"])
|
|
783
941
|
stat.track_output_variable(RuntimeVariable.MockUntypedParams, metrics["untyped_params"])
|
|
942
|
+
stat.track_output_variable(RuntimeVariable.MockPatchTargets, metrics["patch_targets"])
|
|
784
943
|
stat.track_output_variable(RuntimeVariable.MockGenerationTime, metrics["time"])
|
|
785
944
|
|
|
786
945
|
|
|
787
946
|
def _run_mock_generation(test_cluster: ModuleTestCluster) -> dict[str, Any]:
|
|
788
947
|
"""Run the mock pipeline and store templates for statement insertion.
|
|
789
948
|
|
|
790
|
-
Feeds the
|
|
949
|
+
Feeds the mock templates to the test factory (via the shared
|
|
791
950
|
``mock_templates_store``) so that, when Pynguin needs a value of a
|
|
792
951
|
mocked-library type, it inserts a mock statement configured from the
|
|
793
|
-
corresponding template (return values / side effects included).
|
|
952
|
+
corresponding template (return values / side effects included). External
|
|
953
|
+
functions the module calls and the classifier marks as ``mock`` become patch
|
|
954
|
+
templates. The LLM backend (proxy-cache or Pynguin's own client) is optional;
|
|
955
|
+
without one only rules, default patch rules, and static setups are used.
|
|
794
956
|
|
|
795
957
|
Args:
|
|
796
958
|
test_cluster: supplies the classes an untyped parameter may statically
|
|
@@ -807,23 +969,23 @@ def _run_mock_generation(test_cluster: ModuleTestCluster) -> dict[str, Any]:
|
|
|
807
969
|
"from_llm": 0,
|
|
808
970
|
"hint_targets": 0,
|
|
809
971
|
"untyped_params": 0,
|
|
972
|
+
"patch_targets": 0,
|
|
810
973
|
"time": 0.0,
|
|
811
974
|
}
|
|
812
975
|
|
|
813
976
|
if not config.configuration.mock_generation.mock_generation_enabled:
|
|
814
977
|
return metrics
|
|
815
978
|
|
|
816
|
-
from pynguin.mock_generation
|
|
817
|
-
get_proxy_cache_url,
|
|
818
|
-
)
|
|
979
|
+
from pynguin.mock_generation import llm_backend # noqa: PLC0415
|
|
819
980
|
|
|
820
|
-
|
|
981
|
+
backend = llm_backend.active_backend()
|
|
982
|
+
if backend == config.MockLLMBackend.NONE:
|
|
821
983
|
_LOGGER.warning(
|
|
822
|
-
"Mock generation
|
|
823
|
-
"
|
|
824
|
-
"Falling back to default Pynguin without mocks."
|
|
984
|
+
"Mock generation runs without an LLM: no proxy-cache URL and no LLM API key. "
|
|
985
|
+
"Only rules, default patch rules, and static setups are used."
|
|
825
986
|
)
|
|
826
|
-
|
|
987
|
+
else:
|
|
988
|
+
_LOGGER.info("Mock generation LLM backend: %s", backend.value)
|
|
827
989
|
|
|
828
990
|
module_name = config.configuration.module_name
|
|
829
991
|
module = sys.modules.get(module_name)
|
|
@@ -836,7 +998,11 @@ def _run_mock_generation(test_cluster: ModuleTestCluster) -> dict[str, Any]:
|
|
|
836
998
|
MockGenerator,
|
|
837
999
|
)
|
|
838
1000
|
|
|
839
|
-
|
|
1001
|
+
mock_config = config.configuration.mock_generation
|
|
1002
|
+
base_rules_cache_id = mock_config.base_rules_cache_id or None
|
|
1003
|
+
rules_path = Path(mock_config.base_rules_path) if mock_config.base_rules_path else None
|
|
1004
|
+
_mock_store.MOCK_SPEC_PATHS = {}
|
|
1005
|
+
_mock_store.MOCK_PATCH_TEMPLATES = []
|
|
840
1006
|
|
|
841
1007
|
# Classes an untyped parameter could statically match. Computed unconditionally
|
|
842
1008
|
# so untyped parameters are mocked directly (no type tracing required).
|
|
@@ -844,11 +1010,12 @@ def _run_mock_generation(test_cluster: ModuleTestCluster) -> dict[str, Any]:
|
|
|
844
1010
|
|
|
845
1011
|
start = time.perf_counter()
|
|
846
1012
|
try:
|
|
847
|
-
gen = MockGenerator(
|
|
1013
|
+
gen = MockGenerator(use_llm=backend != config.MockLLMBackend.NONE)
|
|
848
1014
|
gen.generate_for_module(
|
|
849
1015
|
Path(str(module.__file__)),
|
|
850
1016
|
base_rules_cache_id,
|
|
851
1017
|
candidate_classes=candidate_classes,
|
|
1018
|
+
rules_path=rules_path,
|
|
852
1019
|
)
|
|
853
1020
|
_mock_store.MOCK_TARGETS = gen.mock_targets
|
|
854
1021
|
_mock_store.MOCK_UNTYPED_PARAMS = _untyped_param_bindings(
|
|
@@ -878,27 +1045,39 @@ def _run_mock_generation(test_cluster: ModuleTestCluster) -> dict[str, Any]:
|
|
|
878
1045
|
mock_hint_generator,
|
|
879
1046
|
)
|
|
880
1047
|
|
|
881
|
-
templates =
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
1048
|
+
templates = (
|
|
1049
|
+
mock_hint_generator.generate_templates(
|
|
1050
|
+
Path(str(module.__file__)),
|
|
1051
|
+
gen.mock_targets,
|
|
1052
|
+
candidate_classes,
|
|
1053
|
+
module_name=module_name,
|
|
1054
|
+
untyped_bindings=_mock_store.MOCK_UNTYPED_PARAMS,
|
|
1055
|
+
)
|
|
1056
|
+
if backend != config.MockLLMBackend.NONE
|
|
1057
|
+
else {}
|
|
887
1058
|
)
|
|
888
1059
|
_mock_store.MOCK_TEMPLATES_BY_TARGET = templates
|
|
889
1060
|
metrics["hint_targets"] = len(templates)
|
|
890
1061
|
|
|
891
1062
|
# Static, deterministic return-value setups derived from the SUT itself
|
|
892
1063
|
# (branch constants + iteration defaults), so bare mocks reach value-
|
|
893
|
-
# dependent branches even when the
|
|
1064
|
+
# dependent branches even when the LLM returned no hints. Parameter types
|
|
1065
|
+
# Pynguin cannot construct get them too, as they may be mocked.
|
|
1066
|
+
mockable = gen.mock_targets | _unconstructable_param_classes(test_cluster)
|
|
894
1067
|
_apply_static_setups(
|
|
895
1068
|
Path(str(module.__file__)),
|
|
896
|
-
|
|
1069
|
+
mockable,
|
|
897
1070
|
candidate_classes,
|
|
898
1071
|
module_name,
|
|
899
1072
|
_mock_store.MOCK_UNTYPED_PARAMS,
|
|
900
1073
|
)
|
|
901
1074
|
|
|
1075
|
+
_apply_spec_paths(module, mockable)
|
|
1076
|
+
if mock_config.patch_calls:
|
|
1077
|
+
metrics["patch_targets"] = _setup_patch_templates(
|
|
1078
|
+
module, gen, base_rules_cache_id, rules_path
|
|
1079
|
+
)
|
|
1080
|
+
|
|
902
1081
|
for fqn, template in templates.items():
|
|
903
1082
|
for setup in template.mutable_setups:
|
|
904
1083
|
_LOGGER.info(
|
|
@@ -6,9 +6,10 @@
|
|
|
6
6
|
#
|
|
7
7
|
"""Classifies the external classes a module uses as 'mock', 'skip', or 'unknown'.
|
|
8
8
|
|
|
9
|
-
Each candidate is a fully-qualified class name (target).
|
|
10
|
-
first match wins: exception class -> skip,
|
|
11
|
-
rule -> mock,
|
|
9
|
+
Each candidate is a fully-qualified class or function name (target).
|
|
10
|
+
Classification order, first match wins: exception class -> skip, project under
|
|
11
|
+
test -> skip, heuristic rule -> mock, default patch rule (functions) -> mock,
|
|
12
|
+
standard library -> skip, LLM backend -> mock/skip, otherwise unknown.
|
|
12
13
|
"""
|
|
13
14
|
|
|
14
15
|
from __future__ import annotations
|
|
@@ -21,6 +22,7 @@ import sys
|
|
|
21
22
|
from dataclasses import dataclass
|
|
22
23
|
from typing import TYPE_CHECKING, Any, Literal
|
|
23
24
|
|
|
25
|
+
import pynguin.configuration as config
|
|
24
26
|
from pynguin.mock_generation import llm_classifier_client
|
|
25
27
|
|
|
26
28
|
if TYPE_CHECKING:
|
|
@@ -84,13 +86,20 @@ class DependencyAnalyzer:
|
|
|
84
86
|
heuristic_rules: HeuristicRules | None = None,
|
|
85
87
|
*,
|
|
86
88
|
rules_cache_id: str | None = None,
|
|
87
|
-
|
|
89
|
+
rules_path: Path | None = None,
|
|
90
|
+
use_llm: bool = False,
|
|
88
91
|
) -> None:
|
|
89
|
-
"""
|
|
92
|
+
"""Create an analyzer for one module.
|
|
93
|
+
|
|
94
|
+
module_path: SUT source file; rules_path: local rules JSON (preferred over
|
|
95
|
+
rules_cache_id, a proxy-cache rules set to load).
|
|
96
|
+
"""
|
|
90
97
|
self._module_path = module_path
|
|
91
|
-
self.
|
|
98
|
+
self._use_llm = use_llm
|
|
92
99
|
if heuristic_rules is not None:
|
|
93
100
|
self._rules = heuristic_rules
|
|
101
|
+
elif rules_path is not None:
|
|
102
|
+
self._rules = HeuristicRules(rules_path)
|
|
94
103
|
elif rules_cache_id:
|
|
95
104
|
self._rules = self._load_rules(rules_cache_id)
|
|
96
105
|
else:
|
|
@@ -172,58 +181,87 @@ class DependencyAnalyzer:
|
|
|
172
181
|
# Classification
|
|
173
182
|
|
|
174
183
|
def _classify_local(self, target: str, obj: Any) -> MockDecision | None:
|
|
175
|
-
"""Deterministic classification
|
|
184
|
+
"""Deterministic classification; None if the LLM is needed.
|
|
185
|
+
|
|
186
|
+
Order: exception class -> skip, defined in the project under test -> skip,
|
|
187
|
+
mined rule -> mock, default patch rule (functions only) -> mock, standard
|
|
188
|
+
library -> skip.
|
|
189
|
+
"""
|
|
176
190
|
if isinstance(obj, type) and issubclass(obj, BaseException):
|
|
177
191
|
return MockDecision(target, "skip", "Exception class", "exception", 1.0)
|
|
178
|
-
if
|
|
179
|
-
return MockDecision(target, "skip", "
|
|
192
|
+
if self._is_local(target, obj):
|
|
193
|
+
return MockDecision(target, "skip", "Defined in the project under test", "local", 1.0)
|
|
180
194
|
reason = self._rules.match(target)
|
|
181
195
|
if reason is not None:
|
|
182
196
|
return MockDecision(target, "mock", reason, "rule", 0.9)
|
|
197
|
+
if obj is not None and not isinstance(obj, type) and callable(obj):
|
|
198
|
+
from pynguin.mock_generation.patch_targets import ( # noqa: PLC0415
|
|
199
|
+
DEFAULT_PATCH_RULES,
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
if target in DEFAULT_PATCH_RULES:
|
|
203
|
+
return MockDecision(
|
|
204
|
+
target, "mock", "Environment, clock, randomness, or I/O", "rule", 1.0
|
|
205
|
+
)
|
|
206
|
+
if target.split(".", 1)[0] in sys.stdlib_module_names:
|
|
207
|
+
return MockDecision(target, "skip", "Standard library", "stdlib", 1.0)
|
|
183
208
|
return None
|
|
184
209
|
|
|
210
|
+
@staticmethod
|
|
211
|
+
def _is_local(target: str, obj: Any) -> bool:
|
|
212
|
+
"""Whether *target* belongs to the project the module under test is part of.
|
|
213
|
+
|
|
214
|
+
Such classes and functions are the code under test and should be exercised,
|
|
215
|
+
not replaced by a mock.
|
|
216
|
+
"""
|
|
217
|
+
sut_top = config.configuration.module_name.split(".", 1)[0]
|
|
218
|
+
if not sut_top:
|
|
219
|
+
return False
|
|
220
|
+
defining = getattr(obj, "__module__", None) or target
|
|
221
|
+
return defining.split(".", 1)[0] == sut_top
|
|
222
|
+
|
|
185
223
|
def _classify(self, target: str, obj: Any) -> MockDecision:
|
|
186
224
|
"""Classify a single class *target* (with its resolved *obj* when available)."""
|
|
187
225
|
local = self._classify_local(target, obj)
|
|
188
226
|
if local is not None:
|
|
189
227
|
return local
|
|
190
|
-
if self.
|
|
191
|
-
|
|
192
|
-
if
|
|
193
|
-
return
|
|
228
|
+
if self._use_llm:
|
|
229
|
+
decision = self._classify_via_llm(target)
|
|
230
|
+
if decision is not None:
|
|
231
|
+
return decision
|
|
194
232
|
return MockDecision(target, "unknown", "Unclassified external class", "llm", 0.0)
|
|
195
233
|
|
|
196
234
|
def _classify_all(self, pairs: list[tuple[str, Any]]) -> list[MockDecision]:
|
|
197
|
-
"""Classify many candidates, batching the
|
|
235
|
+
"""Classify many candidates, batching the LLM calls into one request."""
|
|
198
236
|
local: dict[str, MockDecision] = {}
|
|
199
|
-
|
|
237
|
+
llm_needed: list[str] = []
|
|
200
238
|
for target, obj in pairs:
|
|
201
239
|
decision = self._classify_local(target, obj)
|
|
202
240
|
if decision is not None:
|
|
203
241
|
local[target] = decision
|
|
204
242
|
else:
|
|
205
|
-
|
|
243
|
+
llm_needed.append(target)
|
|
206
244
|
|
|
207
|
-
|
|
245
|
+
llm = self._classify_via_llm_batch(llm_needed) if self._use_llm else {}
|
|
208
246
|
|
|
209
247
|
decisions: list[MockDecision] = []
|
|
210
248
|
for target, _obj in pairs:
|
|
211
249
|
decisions.append(
|
|
212
250
|
local.get(target)
|
|
213
|
-
or
|
|
251
|
+
or llm.get(target)
|
|
214
252
|
or MockDecision(target, "unknown", "Unclassified external class", "llm", 0.0)
|
|
215
253
|
)
|
|
216
254
|
return decisions
|
|
217
255
|
|
|
218
256
|
@staticmethod
|
|
219
|
-
def
|
|
220
|
-
"""Batch-classify *targets* via the
|
|
257
|
+
def _classify_via_llm_batch(targets: list[str]) -> dict[str, MockDecision]:
|
|
258
|
+
"""Batch-classify *targets* via the LLM backend; empty dict on any error."""
|
|
221
259
|
if not targets:
|
|
222
260
|
return {}
|
|
223
261
|
try:
|
|
224
262
|
results = llm_classifier_client.classify_targets_batch(targets)
|
|
225
263
|
except Exception as exc: # noqa: BLE001
|
|
226
|
-
_logger.warning("
|
|
264
|
+
_logger.warning("LLM batch classify unavailable (%d): %s", len(targets), exc)
|
|
227
265
|
return {}
|
|
228
266
|
return {
|
|
229
267
|
target: MockDecision(
|
|
@@ -237,12 +275,12 @@ class DependencyAnalyzer:
|
|
|
237
275
|
}
|
|
238
276
|
|
|
239
277
|
@staticmethod
|
|
240
|
-
def
|
|
241
|
-
"""MockDecision from the
|
|
278
|
+
def _classify_via_llm(target: str) -> MockDecision | None:
|
|
279
|
+
"""MockDecision from the LLM backend, or None on any error."""
|
|
242
280
|
try:
|
|
243
281
|
result = llm_classifier_client.classify_target(target)
|
|
244
282
|
except Exception as exc: # noqa: BLE001
|
|
245
|
-
_logger.warning("
|
|
283
|
+
_logger.warning("LLM classify unavailable for %r: %s", target, exc)
|
|
246
284
|
return None
|
|
247
285
|
return MockDecision(
|
|
248
286
|
target,
|