pynguin 0.46.0__tar.gz → 0.47.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pynguin-0.46.0 → pynguin-0.47.0}/PKG-INFO +4 -6
- {pynguin-0.46.0 → pynguin-0.47.0}/README.md +1 -1
- {pynguin-0.46.0 → pynguin-0.47.0}/pyproject.toml +28 -7
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/__version__.py +1 -1
- pynguin-0.47.0/src/pynguin/analyses/ast_utils.py +171 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/constants.py +33 -1
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/generator.py +71 -10
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/module.py +279 -55
- pynguin-0.47.0/src/pynguin/analyses/seeding.py +224 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/syntaxtree.py +37 -30
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/type_inference.py +214 -18
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/typesystem.py +2 -3
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/assertion.py +83 -26
- pynguin-0.47.0/src/pynguin/assertion/assertion_to_ast.py +284 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/assertion_trace.py +4 -6
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/assertiongenerator.py +9 -10
- pynguin-0.47.0/src/pynguin/assertion/assertiontraceobserver.py +601 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/llmassertiongenerator.py +55 -65
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/configuration.py +177 -19
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/archive.py +5 -3
- pynguin-0.47.0/src/pynguin/ga/algorithms/dynamosaalgorithm.py +482 -0
- pynguin-0.47.0/src/pynguin/ga/algorithms/lldynamosaalgorithm.py +231 -0
- pynguin-0.47.0/src/pynguin/ga/algorithms/llmosalgorithm.py +341 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/randomalgorithm.py +3 -4
- pynguin-0.47.0/src/pynguin/ga/checked_coverage.py +143 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/chromosome.py +7 -3
- pynguin-0.47.0/src/pynguin/ga/computation_cache.py +261 -0
- pynguin-0.47.0/src/pynguin/ga/computations.py +420 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/coveragegoals.py +81 -8
- pynguin-0.47.0/src/pynguin/ga/fitness_metrics.py +259 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/generationalgorithmfactory.py +17 -9
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/operators/comparator.py +21 -1
- pynguin-0.47.0/src/pynguin/ga/operators/crossover.py +109 -0
- pynguin-0.47.0/src/pynguin/ga/operators/mutation.py +254 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/postprocess.py +123 -323
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/stoppingcondition.py +6 -29
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/testcasechromosome.py +32 -122
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/testcasefactory.py +2 -3
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/testsuitechromosome.py +5 -36
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/generator.py +49 -54
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/controlflow.py +11 -11
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/machinery.py +5 -2
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/tracer.py +344 -6
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/transformer.py +353 -125
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/python3_10.py +140 -11
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/python3_11.py +69 -15
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/python3_13.py +9 -6
- pynguin-0.47.0/src/pynguin/large_language_model/AGENTS.md +228 -0
- pynguin-0.47.0/src/pynguin/large_language_model/cache.py +106 -0
- pynguin-0.47.0/src/pynguin/large_language_model/client.py +395 -0
- pynguin-0.47.0/src/pynguin/large_language_model/config_schema.py +42 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/llmagent.py +82 -66
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/llmtestcasehandler.py +25 -22
- pynguin-0.47.0/src/pynguin/large_language_model/parsing/AGENTS.md +157 -0
- pynguin-0.47.0/src/pynguin/large_language_model/parsing/deserializer.py +1241 -0
- pynguin-0.47.0/src/pynguin/large_language_model/parsing/helpers.py +25 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/parsing/rewriter.py +26 -189
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/prompts/AGENTS.md +23 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/__init__.py +37 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/prompts/assertiongenerationprompt.py +15 -8
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/prompts/base_inference_prompt.py +4 -2
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/prompts/localsearchprompt.py +19 -17
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/modulereadabilityrefinementprompt.py +47 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/modulerefinementprompt.py +47 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/modulesemanticassertionsprompt.py +47 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/mutationstrengthenprompt.py +59 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/prompt.py +169 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/readabilityrefinementprompt.py +50 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/repairprompt.py +59 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/assertion_generation.yaml +32 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/defaults.yaml +22 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/generator_generate.yaml +16 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/local_search.yaml +37 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/module_readability_refinement.yaml +51 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/module_refinement_combined.yaml +51 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/module_semantic_assertions.yaml +58 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/mutation_strengthen.yaml +44 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/readability_refinement.yaml +79 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/refinement.yaml +13 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/repair.yaml +50 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/semantic_assertions.yaml +165 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/test_case_generation.yaml +39 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/type_inference.yaml +59 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/type_subtype_inference.yaml +85 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/resources/uncovered_targets.yaml +35 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/semanticassertionsprompt.py +50 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/testcasegenerationprompt.py +53 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/type_and_subtype_inference_prompt.py +74 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/typeinferenceprompt.py +62 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/prompts/uncoveredtargetsprompt.py +26 -11
- pynguin-0.47.0/src/pynguin/large_language_model/request.py +57 -0
- pynguin-0.47.0/src/pynguin/refinement/AGENTS.md +86 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/coverage_checker.py +11 -8
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/llm_client.py +83 -85
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/llm_judge.py +1 -1
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/mutation_analyzer.py +44 -6
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/pipeline.py +313 -270
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/refiner.py +180 -16
- pynguin-0.47.0/src/pynguin/refinement/sut_inspector.py +742 -0
- pynguin-0.47.0/src/pynguin/refinement/validator.py +154 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/statementslicingobserver.py +39 -18
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/testcase/AGENTS.md +4 -4
- pynguin-0.47.0/src/pynguin/testcase/collection_tracker.py +478 -0
- pynguin-0.47.0/src/pynguin/testcase/crash_minimization.py +118 -0
- pynguin-0.47.0/src/pynguin/testcase/execution.py +704 -0
- pynguin-0.47.0/src/pynguin/testcase/execution_isolation.py +123 -0
- pynguin-0.47.0/src/pynguin/testcase/execution_observers.py +688 -0
- pynguin-0.47.0/src/pynguin/testcase/execution_result.py +142 -0
- pynguin-0.47.0/src/pynguin/testcase/export.py +576 -0
- pynguin-0.47.0/src/pynguin/testcase/literalgen.py +1225 -0
- pynguin-0.47.0/src/pynguin/testcase/llmlocalsearch.py +244 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/testcase/localsearch.py +71 -69
- pynguin-0.47.0/src/pynguin/testcase/localsearchstatement.py +921 -0
- pynguin-0.47.0/src/pynguin/testcase/subprocess_executor.py +816 -0
- pynguin-0.47.0/src/pynguin/testcase/testcase.py +711 -0
- pynguin-0.47.0/src/pynguin/testcase/testfactory.py +2948 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/AGENTS.md +3 -42
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/controlflowdistance.py +68 -2
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/execution_recorder.py +2 -8
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/generic/genericaccessibleobject.py +34 -1
- pynguin-0.47.0/src/pynguin/utils/llm.py +31 -0
- pynguin-0.47.0/src/pynguin/utils/naming.py +126 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/ml_testfactory_utils.py +28 -7
- pynguin-0.47.0/src/pynguin/utils/pynguinml/ndarray_cst.py +165 -0
- pynguin-0.47.0/src/pynguin/utils/pynguinml/ndarray_mutation.py +176 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/report.py +4 -4
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/statistics/outputvariablefactory.py +3 -1
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/statistics/runtimevariable.py +24 -6
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/type_utils.py +102 -9
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/typeevalpy_json_schema.py +23 -14
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/typetracing.py +35 -7
- pynguin-0.47.0/tests/analyses/test_ast_utils.py +91 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_constants.py +14 -0
- pynguin-0.47.0/tests/analyses/test_initialpopulationseeding.py +307 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_module.py +173 -15
- pynguin-0.47.0/tests/analyses/test_native_libraries.py +325 -0
- pynguin-0.47.0/tests/analyses/test_seeding.py +244 -0
- pynguin-0.47.0/tests/analyses/test_staticconstantseeding.py +84 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_string_subtype_inference.py +6 -2
- pynguin-0.47.0/tests/analyses/test_subtypes.py +155 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_syntaxtree.py +5 -8
- pynguin-0.47.0/tests/analyses/test_type_inference.py +348 -0
- pynguin-0.47.0/tests/assertion/test_assertion.py +174 -0
- pynguin-0.47.0/tests/assertion/test_assertion_generation_integration.py +840 -0
- pynguin-0.47.0/tests/assertion/test_assertion_to_ast.py +275 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/test_assertion_trace.py +2 -6
- pynguin-0.47.0/tests/assertion/test_assertiontraceobserver.py +871 -0
- pynguin-0.47.0/tests/assertion/test_llmassertiongenerator.py +223 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/conftest.py +111 -179
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/accessibles/accessible.py +16 -0
- pynguin-0.47.0/tests/fixtures/cluster/fields.py +39 -0
- pynguin-0.47.0/tests/fixtures/cluster/methods.py +54 -0
- pynguin-0.47.0/tests/fixtures/cluster/tuple_return.py +41 -0
- pynguin-0.47.0/tests/fixtures/examples/abstract_classes.py +141 -0
- pynguin-0.47.0/tests/fixtures/examples/no_cover_example.py +17 -0
- pynguin-0.47.0/tests/fixtures/examples/pattern_matching.py +41 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/simple.py +24 -0
- pynguin-0.47.0/tests/fixtures/instrumentation/unpickling.py +27 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/type_tracing/guess_params.py +4 -0
- pynguin-0.47.0/tests/ga/algorithms/test_dynamosaalgorithm.py +393 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_integration_varioussearchalgorithms.py +1 -0
- pynguin-0.47.0/tests/ga/algorithms/test_lldynamosaalgorithm.py +328 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_llmosalgorithm.py +88 -5
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_randomalgorithm.py +70 -35
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_computations.py +85 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_computations_cache.py +2 -2
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_computations_fitness_utilities.py +37 -21
- pynguin-0.47.0/tests/ga/test_coveragegoals.py +632 -0
- pynguin-0.47.0/tests/ga/test_fine_grained_targeting.py +70 -0
- pynguin-0.47.0/tests/ga/test_fine_grained_targeting_integration.py +43 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_generationalgorithmfactory.py +30 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_generator.py +108 -1
- pynguin-0.47.0/tests/ga/test_postprocess.py +512 -0
- pynguin-0.47.0/tests/ga/test_testcasechromosome.py +676 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_testcasefactory.py +6 -1
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_adapters.py +36 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_ast_info.py +139 -9
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_tracer.py +149 -0
- pynguin-0.47.0/tests/large_language_model/parsing/test_helpers.py +18 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/prompts/test_assertiongenerationprompt.py +1 -1
- pynguin-0.47.0/tests/large_language_model/prompts/test_module_prompts.py +62 -0
- pynguin-0.47.0/tests/large_language_model/prompts/test_mutationstrengthenprompt.py +42 -0
- pynguin-0.47.0/tests/large_language_model/prompts/test_readabilityrefinementprompt.py +33 -0
- pynguin-0.47.0/tests/large_language_model/prompts/test_repairprompt.py +34 -0
- pynguin-0.47.0/tests/large_language_model/prompts/test_semanticassertionsprompt.py +33 -0
- pynguin-0.47.0/tests/large_language_model/prompts/test_testcasegenerationprompt.py +92 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/prompts/test_uncovered_targets_prompt.py +21 -2
- pynguin-0.47.0/tests/large_language_model/test_cache.py +113 -0
- pynguin-0.47.0/tests/large_language_model/test_characterization.py +206 -0
- pynguin-0.47.0/tests/large_language_model/test_client_thinking.py +94 -0
- pynguin-0.47.0/tests/large_language_model/test_extract_python_code.py +45 -0
- pynguin-0.47.0/tests/large_language_model/test_llm_deserializer.py +608 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/test_llmagent.py +2 -2
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/test_llmagent_extended.py +52 -23
- pynguin-0.47.0/tests/large_language_model/test_llmtestcasehandler.py +130 -0
- pynguin-0.47.0/tests/large_language_model/test_request_budget.py +151 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/test_rewriter.py +15 -45
- pynguin-0.47.0/tests/large_language_model/test_temperature_fallback.py +124 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/master_worker/test_client.py +6 -0
- pynguin-0.47.0/tests/quick_eval/test_args.py +100 -0
- pynguin-0.47.0/tests/quick_eval/test_suite_scope.py +40 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_coverage_checker.py +1 -1
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_llm_client.py +82 -22
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_llm_judge.py +5 -3
- pynguin-0.47.0/tests/refinement/test_module_refinement.py +250 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_mutation_analyzer.py +39 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_pipeline.py +74 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_refiner.py +8 -0
- pynguin-0.47.0/tests/refinement/test_sut_inspector.py +457 -0
- pynguin-0.47.0/tests/refinement/test_validator.py +167 -0
- pynguin-0.47.0/tests/slicer/test_assertionslicer.py +234 -0
- pynguin-0.47.0/tests/slicer/test_statementslicer.py +330 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/slicer/util.py +1 -1
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/test_generator.py +36 -9
- pynguin-0.47.0/tests/testcase/_builders.py +106 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_executionresult.py +9 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_moduleprovider.py +11 -0
- pynguin-0.47.0/tests/testcase/execution/test_returntype.py +139 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_subprocesstestcaseexecutor.py +61 -25
- pynguin-0.47.0/tests/testcase/execution/test_subprocesstestcaseexecutor_integration.py +280 -0
- pynguin-0.47.0/tests/testcase/execution/test_testcaseexecutor_integration.py +234 -0
- pynguin-0.47.0/tests/testcase/execution/test_tuple_deconstruction_integration.py +108 -0
- pynguin-0.47.0/tests/testcase/execution/test_typetracing.py +269 -0
- pynguin-0.47.0/tests/testcase/export/conftest.py +14 -0
- pynguin-0.47.0/tests/testcase/export/test_export.py +731 -0
- pynguin-0.47.0/tests/testcase/test_collection_tracker.py +435 -0
- pynguin-0.47.0/tests/testcase/test_constant_seeding_integration.py +76 -0
- pynguin-0.47.0/tests/testcase/test_literalgen.py +783 -0
- pynguin-0.47.0/tests/testcase/test_llmlocalsearch.py +214 -0
- pynguin-0.47.0/tests/testcase/test_localsearch.py +471 -0
- pynguin-0.47.0/tests/testcase/test_localsearchstatement.py +545 -0
- pynguin-0.47.0/tests/testcase/test_ml_testfactory.py +381 -0
- pynguin-0.47.0/tests/testcase/test_testcase.py +249 -0
- pynguin-0.47.0/tests/testcase/test_testfactory.py +1624 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/generic/test_genericaccessibleobject.py +46 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/pynguinml/test_ml_testfactory_utils.py +16 -13
- pynguin-0.47.0/tests/utils/stats/__init__.py +6 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/stats/test_outputvariablefactory.py +13 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/stats/test_runtimevariable.py +9 -3
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_configuration_writer.py +115 -34
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_controlflowdistance.py +90 -2
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_execution_recorder.py +2 -0
- pynguin-0.47.0/tests/utils/test_naming.py +71 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_report.py +1 -1
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_string_subtype_integration.py +9 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_type_utils.py +190 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_typeevalpy_integration.py +3 -2
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_typeevalpy_json_schema.py +4 -2
- pynguin-0.47.0/tests/utils/utils.py +111 -0
- pynguin-0.46.0/src/pynguin/analyses/seeding.py +0 -917
- pynguin-0.46.0/src/pynguin/assertion/assertion_to_ast.py +0 -349
- pynguin-0.46.0/src/pynguin/assertion/assertiontraceobserver.py +0 -399
- pynguin-0.46.0/src/pynguin/ga/algorithms/dynamosaalgorithm.py +0 -321
- pynguin-0.46.0/src/pynguin/ga/algorithms/llmosalgorithm.py +0 -207
- pynguin-0.46.0/src/pynguin/ga/computations.py +0 -1013
- pynguin-0.46.0/src/pynguin/ga/operators/crossover.py +0 -52
- pynguin-0.46.0/src/pynguin/large_language_model/AGENTS.md +0 -219
- pynguin-0.46.0/src/pynguin/large_language_model/helpers/AGENTS.md +0 -38
- pynguin-0.46.0/src/pynguin/large_language_model/helpers/__init__.py +0 -7
- pynguin-0.46.0/src/pynguin/large_language_model/helpers/testcasereferencecopier.py +0 -146
- pynguin-0.46.0/src/pynguin/large_language_model/parsing/AGENTS.md +0 -81
- pynguin-0.46.0/src/pynguin/large_language_model/parsing/astscoping.py +0 -564
- pynguin-0.46.0/src/pynguin/large_language_model/parsing/deserializer.py +0 -970
- pynguin-0.46.0/src/pynguin/large_language_model/parsing/helpers.py +0 -199
- pynguin-0.46.0/src/pynguin/large_language_model/prompts/__init__.py +0 -7
- pynguin-0.46.0/src/pynguin/large_language_model/prompts/prompt.py +0 -38
- pynguin-0.46.0/src/pynguin/large_language_model/prompts/testcasegenerationprompt.py +0 -33
- pynguin-0.46.0/src/pynguin/large_language_model/prompts/type_and_subtype_inference_prompt.py +0 -147
- pynguin-0.46.0/src/pynguin/large_language_model/prompts/typeinferenceprompt.py +0 -110
- pynguin-0.46.0/src/pynguin/refinement/sut_inspector.py +0 -293
- pynguin-0.46.0/src/pynguin/refinement/validator.py +0 -79
- pynguin-0.46.0/src/pynguin/testcase/defaulttestcase.py +0 -215
- pynguin-0.46.0/src/pynguin/testcase/execution.py +0 -2254
- pynguin-0.46.0/src/pynguin/testcase/export.py +0 -587
- pynguin-0.46.0/src/pynguin/testcase/llmlocalsearch.py +0 -230
- pynguin-0.46.0/src/pynguin/testcase/localsearchstatement.py +0 -1494
- pynguin-0.46.0/src/pynguin/testcase/statement.py +0 -2951
- pynguin-0.46.0/src/pynguin/testcase/statement_to_ast.py +0 -480
- pynguin-0.46.0/src/pynguin/testcase/testcase.py +0 -352
- pynguin-0.46.0/src/pynguin/testcase/testcase_to_ast.py +0 -220
- pynguin-0.46.0/src/pynguin/testcase/testcasevisitor.py +0 -21
- pynguin-0.46.0/src/pynguin/testcase/testfactory.py +0 -1915
- pynguin-0.46.0/src/pynguin/testcase/variablereference.py +0 -492
- pynguin-0.46.0/src/pynguin/utils/ast_util.py +0 -218
- pynguin-0.46.0/src/pynguin/utils/llm.py +0 -165
- pynguin-0.46.0/src/pynguin/utils/namingscope.py +0 -194
- pynguin-0.46.0/tests/analyses/test_initialpopulationseeding.py +0 -261
- pynguin-0.46.0/tests/analyses/test_seeding.py +0 -71
- pynguin-0.46.0/tests/analyses/test_staticconstantseeding.py +0 -46
- pynguin-0.46.0/tests/analyses/test_type_inference.py +0 -124
- pynguin-0.46.0/tests/assertion/test_assertion.py +0 -160
- pynguin-0.46.0/tests/assertion/test_assertion_generation_integration.py +0 -715
- pynguin-0.46.0/tests/assertion/test_assertion_to_ast.py +0 -120
- pynguin-0.46.0/tests/assertion/test_assertiontraceobserver.py +0 -94
- pynguin-0.46.0/tests/assertion/test_llmassertiongenerator.py +0 -214
- pynguin-0.46.0/tests/ga/algorithms/test_dynamosaalgorithm.py +0 -90
- pynguin-0.46.0/tests/ga/test_coveragegoals.py +0 -481
- pynguin-0.46.0/tests/ga/test_postprocess.py +0 -1224
- pynguin-0.46.0/tests/ga/test_testcasechromosome.py +0 -337
- pynguin-0.46.0/tests/large_language_model/helpers/test_testcasereferencecopier.py +0 -188
- pynguin-0.46.0/tests/large_language_model/parsing/test_astscoping.py +0 -726
- pynguin-0.46.0/tests/large_language_model/parsing/test_helpers.py +0 -353
- pynguin-0.46.0/tests/large_language_model/prompts/test_testcasegenerationprompt.py +0 -114
- pynguin-0.46.0/tests/large_language_model/test_llm_deserializer.py +0 -645
- pynguin-0.46.0/tests/large_language_model/test_llmtestcasehandler.py +0 -216
- pynguin-0.46.0/tests/refinement/test_sut_inspector.py +0 -85
- pynguin-0.46.0/tests/refinement/test_validator.py +0 -80
- pynguin-0.46.0/tests/slicer/test_assertionslicer.py +0 -387
- pynguin-0.46.0/tests/slicer/test_statementslicer.py +0 -319
- pynguin-0.46.0/tests/testcase/execution/test_executioncontext.py +0 -43
- pynguin-0.46.0/tests/testcase/execution/test_subprocesstestcaseexecutor_integration.py +0 -131
- pynguin-0.46.0/tests/testcase/execution/test_testcaseexecutor_integration.py +0 -197
- pynguin-0.46.0/tests/testcase/execution/test_typetracing.py +0 -115
- pynguin-0.46.0/tests/testcase/export/conftest.py +0 -95
- pynguin-0.46.0/tests/testcase/export/test_export.py +0 -737
- pynguin-0.46.0/tests/testcase/statements/test_assignmentstatement.py +0 -125
- pynguin-0.46.0/tests/testcase/statements/test_collectionstatements.py +0 -137
- pynguin-0.46.0/tests/testcase/statements/test_fieldstatement.py +0 -170
- pynguin-0.46.0/tests/testcase/statements/test_parameterizedstatements.py +0 -546
- pynguin-0.46.0/tests/testcase/statements/test_primitivestatements.py +0 -815
- pynguin-0.46.0/tests/testcase/test_ast_assign_statement.py +0 -384
- pynguin-0.46.0/tests/testcase/test_benchmark.py +0 -63
- pynguin-0.46.0/tests/testcase/test_defaulttestcase.py +0 -504
- pynguin-0.46.0/tests/testcase/test_llmlocalsearch.py +0 -77
- pynguin-0.46.0/tests/testcase/test_localsearch.py +0 -1366
- pynguin-0.46.0/tests/testcase/test_statement_to_ast.py +0 -666
- pynguin-0.46.0/tests/testcase/test_testcase_integration.py +0 -160
- pynguin-0.46.0/tests/testcase/test_testcase_to_ast_integration.py +0 -161
- pynguin-0.46.0/tests/testcase/test_testfactory.py +0 -1077
- pynguin-0.46.0/tests/testcase/variable/test_variablereference.py +0 -316
- pynguin-0.46.0/tests/utils/test_namingscope.py +0 -134
- pynguin-0.46.0/tests/utils/utils.py +0 -46
- {pynguin-0.46.0 → pynguin-0.47.0}/LICENSE.rst +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/LICENSES/Apache-2.0.txt +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/LICENSES/BSD-2-Clause.txt +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/LICENSES/CC-BY-4.0.txt +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/LICENSES/CC0-1.0.txt +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/LICENSES/MIT.txt +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/__main__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/modulecomplexity.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/string_subtype_inference.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/analyses/string_subtypes.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/controller.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/mutators.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/arithmetic.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/base.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/decorator.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/exception.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/inheritance.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/logical.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/loop.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/misc.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/statement.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/strategies.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/transformer.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/cli.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/abstractmosaalgorithm.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/generationalgorithm.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/mioalgorithm.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/mosaalgorithm.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/randomsearchalgorithm.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/algorithms/wholesuitealgorithm.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/chromosomefactory.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/chromosomevisitor.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/llmtestsuitechromosomefactory.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/operators/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/operators/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/operators/ranking.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/operators/selection.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/searchobserver.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/testcasechromosomefactory.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/ga/testsuitechromosomefactory.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/common.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/python3_12.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/python3_14.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/caching.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/parsing/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/large_language_model/parsing/type_str_parser.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/master_worker/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/master_worker/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/master_worker/client.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/master_worker/master.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/master_worker/worker.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/aaa_inserter.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/ast_analyzer.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/refinement/readability_metrics.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/coverage-template.html +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/camel_case.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/colour.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/csv.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/delimited.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/email.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/camel_case.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/colour.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/csv.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/delimited.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/email.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/ipv4.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/standard_date.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/unix_path.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/xml.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/ipv4.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/numeric.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/standard_date.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/unix_path.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/resources/fans/xml.fan +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/dynamicslicer.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/executedinstruction.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/executionflowbuilder.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/stack/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/slicer/stack/stacksimulation.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/testcase/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/testcase/localsearchobjective.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/testcase/localsearchtimer.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/atomicinteger.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/collection_utils.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/configuration_writer.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/exceptions.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/fandango_faker_utils.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/fs_isolation.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/generic/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/generic/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/logging_utils.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/mirror.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/mutation_utils.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/openai_key_resolver.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/orderedset.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/ml_parsing_utils.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/ml_testing_resources.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/mlparameter.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/np_rng.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/randomness.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/statistics/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/statistics/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/statistics/statisticsbackend.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/statistics/statisticsobserver.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/src/pynguin/utils/statistics/stats.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_modulecomplexity.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_string_subtypes.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_typesystem.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/analyses/test_typesystem_string_subtypes.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_arithmetic.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_decorator.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_exception.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_inheritance.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_logical.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_loop.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_misc.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_statement.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/test_controller.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/test_mutators.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/test_strategies.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/assertion/test_assertiongenerator.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/accessibles/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/nestedbranches.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/nobranches.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/simplenesting.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/singlebranches.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/twomethodsinglebranches.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/c/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/c/my_ctypes.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/abstract.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/alias_module.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/async_and_sync.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/async_class_gen.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/async_class_method.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/async_func.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/async_gen.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/attributes.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/blacklist.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/blacklist_transitive.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/cached_function.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/comments.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/complex_dependencies.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/complex_dependency.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/conditional_import.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/dependency.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/diamond_bottom.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/diamond_left.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/diamond_right.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/diamond_top.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/enums.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/import_dependency.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/inheritance.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/lambda.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/lazy_module_getattr.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/nested_functions.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/no_any_annotations.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/no_dependencies.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/overridden_inherited_methods.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/simple_dependencies.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/typing_parameters.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/uses_async_dependency.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/visibility.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/cluster/visibility_dependency.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/crash/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/crash/partly_crashing.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/crash/seg_fault.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/duckmock/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/duckmock/complex.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/errors/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/errors/import_error.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/assertions.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/basket.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/calculator.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/calculator_simple.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/collections.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/constructors.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/difficult.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/dummies.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/dynamosa_example.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/enums.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/exceptions.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/flaky.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/impossible.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/inheritance.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/loop.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/module_alias.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/monkey.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/nested.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/objects.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/private_methods.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/queue.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/simple.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/triangle.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/type_inference.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/geometry.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/invoice.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/large_test_cluster.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/mixed.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/string_subtype.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/examples/unasserted_exceptions.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/grammar/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/grammar/parameters.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/comparison.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/covered_branches.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/covered_classes.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/covered_functions.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/covered_lines.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/excluded_blocks.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/inherited.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/instrumentation/mixed.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/linecoverage/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/linecoverage/artificial_none.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/linecoverage/emptyfile.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/linecoverage/exception.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/linecoverage/list.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/linecoverage/plus.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/linecoverage/setter_getter.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/mutation/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/mutation/exception.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/mutation/expected.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/mutation/mutation.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/mutation/timeout.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/programgraph/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/programgraph/samples.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/programgraph/whileloop.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/programgraph/yield_fun.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/regression/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/regression/argparse_sys_exit.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/regression/custom_error.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/regression/not_main.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/dynamicseeding/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/dynamicseeding/dynamicseedingdummies.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/dummycontainer.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/assertseed_test_.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/classseed_test_.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collfuncseed_test_.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collseed_test_.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/nestedseed_test_.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notknowncall_test_.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notprimseed_test_.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/primitiveseed_test_.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/triangleseed_test_.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongassignseed_test_.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongfunctionnameseed_test_.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/staticconstantseeding/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/staticconstantseeding/dummy/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/staticconstantseeding/dummy/dummy.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/seeding/staticconstantseeding/dummy/empty.so +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/attribute_dependencies.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/closure.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/generator.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/immutable_attribute_dependency.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/import_star_def.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/import_star_main.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/partial_cover_dependency.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/simple_call.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/slicer/simple_call_arg.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/test.conf +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/test.conf.license +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/tests/typeinference/test_stubstrategy.pyi +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/type_tracing/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/type_tracing/return_types.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/type_tracing/union_type.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/types/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/types/outside.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/types/subtyping.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/fixtures/types/symbols.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_archive.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_generationalgorithm.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_integration_mosaalgorithm.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_mioalgorithm.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/algorithms/test_mosaalgorithm.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/crossover/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/crossover/test_singlepointrelativecrossover.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/ranking/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/ranking/test_rankingfunction.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/selection/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/selection/test_randomselection.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/selection/test_rankselection.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/selection/test_selection.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/selection/test_tournamentselection.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/test_dominancecomparator.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/operators/test_preferencesortingcomparator.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_coverageplateaustoppingcondition.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_maxcoveragestoppingcondition.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_maxiterationsstoppingcondition.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_maxmemorystoppingcondition.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_maxstatementstoppingcondition.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_maxtestsstoppingcondition.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_maxtimestoppingcondition.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_minimumcoverageplateaustoppingcondition.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/stoppingconditions/test_stoppingcondition.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_chromosome.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_chromosomefactory.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_llmtestsuitechromosomefactory.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/ga/test_testsuitechromosome.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/AGENTS.md +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_cfg.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_controldependencegraph.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_machinery.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_programgraph.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/instrumentation/test_version.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/parsing/test_type_str_parser.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/prompts/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/test_caching.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/test_llm_caching.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/large_language_model/test_llmtestcasehandler_coverage.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/master_worker/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/master_worker/test_master.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/master_worker/test_worker.py +0 -0
- {pynguin-0.46.0/tests/refinement → pynguin-0.47.0/tests/quick_eval}/__init__.py +0 -0
- {pynguin-0.46.0/tests/slicer → pynguin-0.47.0/tests/refinement}/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_aaa_inserter.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_ast_analyzer.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/refinement/test_readability_metrics.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/resources/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/resources/typeevalpy/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/resources/typeevalpy/dummy.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/resources/typeevalpy/dummy_gt.json +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/resources/typeevalpy/dummy_gt.json.license +0 -0
- {pynguin-0.46.0/tests/testcase → pynguin-0.47.0/tests/slicer}/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/slicer/test_dependencies.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/slicer/test_expected_failures.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/slicer/test_language_features.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/test___main__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/test_cli.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/AGENTS.md +0 -0
- {pynguin-0.46.0/tests/testcase/execution → pynguin-0.47.0/tests/testcase}/__init__.py +0 -0
- {pynguin-0.46.0/tests/testcase/export → pynguin-0.47.0/tests/testcase/execution}/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_executedinstruction.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_executionmocking.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_executiontrace.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_outputsuppression.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/execution/test_subprocesstestcaseexecutor_differential.py +0 -0
- {pynguin-0.46.0/tests/testcase/statements → pynguin-0.47.0/tests/testcase/export}/__init__.py +0 -0
- {pynguin-0.46.0/tests/testcase/variable → pynguin-0.47.0/tests/testcase/statements}/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/testcase/test_localsearchtimer.py +0 -0
- {pynguin-0.46.0/tests/utils → pynguin-0.47.0/tests/testcase/variable}/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/testutils.py +0 -0
- {pynguin-0.46.0/tests/utils/generic → pynguin-0.47.0/tests/utils}/__init__.py +0 -0
- {pynguin-0.46.0/tests/utils/pynguinml → pynguin-0.47.0/tests/utils/generic}/__init__.py +0 -0
- {pynguin-0.46.0/tests/utils/stats → pynguin-0.47.0/tests/utils/pynguinml}/__init__.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/pynguinml/test_ml_parsing_utils.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/pynguinml/test_ml_testing_resources.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/pynguinml/test_mlparameter.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/pynguinml/test_np_rng.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/pynguinml/test_pynguinml_integration.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/stats/test_searchstatistics.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/stats/test_statistics.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/stats/test_statisticsbackend.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_atomicinteger.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_collection_utils.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_exceptions.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_fandango_faker_utils.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_fs_isolation.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_llm.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_logging_utils.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_mirror.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_mutation_utils.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_orderedset.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_randomness.py +0 -0
- {pynguin-0.46.0 → pynguin-0.47.0}/tests/utils/test_typetracing.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: pynguin
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.47.0
|
|
4
4
|
Summary: Pynguin is a tool for automated unit test generation for Python
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: unit test,random testing,search based,test generation
|
|
@@ -33,8 +33,6 @@ Provides-Extra: openai
|
|
|
33
33
|
Provides-Extra: typing
|
|
34
34
|
Requires-Dist: Jinja2 (>=3.1.6,<4.0.0)
|
|
35
35
|
Requires-Dist: Pygments (>=2.19.2,<3.0.0)
|
|
36
|
-
Requires-Dist: asciitree (>=0.3.3,<0.4.0)
|
|
37
|
-
Requires-Dist: astroid (>=4.0.1,<5.0.0)
|
|
38
36
|
Requires-Dist: black (>=25.1.0,<26.0.0)
|
|
39
37
|
Requires-Dist: bytecode (==0.17.0)
|
|
40
38
|
Requires-Dist: dill (>=0.4.0,<0.5.0)
|
|
@@ -49,14 +47,14 @@ Requires-Dist: openai (>=1.72.0,<2.0.0) ; extra == "openai"
|
|
|
49
47
|
Requires-Dist: psutil (>=7.1.1,<8.0.0)
|
|
50
48
|
Requires-Dist: pytest (>=8.3.5,<9.0.0)
|
|
51
49
|
Requires-Dist: python-dotenv (>=1.0.0,<2.0.0) ; extra == "openai"
|
|
50
|
+
Requires-Dist: pyyaml (>=6.0.2,<7.0.0) ; extra == "openai"
|
|
52
51
|
Requires-Dist: rich (>=14.0.0,<15.0.0)
|
|
53
52
|
Requires-Dist: rstr (>=3.2.2,<4.0.0)
|
|
54
53
|
Requires-Dist: setuptools (>=80.9.0,<81.0.0)
|
|
55
54
|
Requires-Dist: simple-parsing (>=0.1.7,<0.2.0)
|
|
56
55
|
Requires-Dist: toml (>=0.10.2,<0.11.0)
|
|
56
|
+
Requires-Dist: typeshed-client (>=2.13.0,<3.0.0)
|
|
57
57
|
Requires-Dist: typing-extensions (>=4.12.2,<5.0.0) ; extra == "typing"
|
|
58
|
-
Requires-Dist: typing_inspect (>=0.9.0,<0.10.0)
|
|
59
|
-
Requires-Dist: xmltodict (>=0.14.2,<0.15.0) ; extra == "fandango-faker"
|
|
60
58
|
Project-URL: Documentation, https://pynguin.readthedocs.io
|
|
61
59
|
Project-URL: Homepage, https://www.pynguin.eu
|
|
62
60
|
Project-URL: Repository, https://github.com/se2p/pynguin
|
|
@@ -233,5 +231,5 @@ its license was changed with version 0.30.0.
|
|
|
233
231
|
|
|
234
232
|
## Star History
|
|
235
233
|
|
|
236
|
-
[](https://star-history.dera.page/#se2p/pynguin)
|
|
237
235
|
|
|
@@ -169,4 +169,4 @@ its license was changed with version 0.30.0.
|
|
|
169
169
|
|
|
170
170
|
## Star History
|
|
171
171
|
|
|
172
|
-
[](https://star-history.dera.page/#se2p/pynguin)
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
[tool.poetry]
|
|
6
6
|
name = "pynguin"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.47.0"
|
|
8
8
|
description = "Pynguin is a tool for automated unit test generation for Python"
|
|
9
9
|
authors = [
|
|
10
10
|
"Stephan Lukasczyk <stephan@pynguin.eu>",
|
|
@@ -51,7 +51,6 @@ include = [
|
|
|
51
51
|
|
|
52
52
|
[tool.poetry.dependencies]
|
|
53
53
|
python = ">=3.10, <3.15"
|
|
54
|
-
astroid = "^4.0.1"
|
|
55
54
|
black = "^25.1.0"
|
|
56
55
|
bytecode = "0.17.0"
|
|
57
56
|
dill = "^0.4.0"
|
|
@@ -62,21 +61,20 @@ rich = "^14.0.0"
|
|
|
62
61
|
Pygments = "^2.19.2"
|
|
63
62
|
pytest = "^8.3.5"
|
|
64
63
|
simple-parsing = "^0.1.7"
|
|
65
|
-
typing_inspect = "^0.9.0"
|
|
66
|
-
asciitree = "^0.3.3"
|
|
67
64
|
libcst = "^1.7.0"
|
|
68
65
|
setuptools = "^80.9.0"
|
|
69
66
|
toml = "^0.10.2"
|
|
70
67
|
psutil = "^7.1.1"
|
|
71
68
|
rstr = "^3.2.2"
|
|
72
69
|
openai = { version = "^1.72.0", optional = true }
|
|
70
|
+
pyyaml = { version = "^6.0.2", optional = true }
|
|
73
71
|
python-dotenv = { version = "^1.0.0", optional = true }
|
|
74
72
|
numpy = { version = "^1.26.4", optional = true }
|
|
75
73
|
mypy = { version = "^1.15.0", optional = true }
|
|
76
74
|
typing-extensions = { version = "^4.12.2", optional = true }
|
|
77
75
|
faker = { version = "^37.3.0", optional = true }
|
|
78
76
|
fandango-fuzzer = { version = "^0.8.2", optional = true }
|
|
79
|
-
|
|
77
|
+
typeshed-client = "^2.13.0"
|
|
80
78
|
|
|
81
79
|
[tool.poetry.group.dev.dependencies]
|
|
82
80
|
mypy = "^1.15.0"
|
|
@@ -102,10 +100,10 @@ pytest-sugar = "^1.0.0"
|
|
|
102
100
|
pytest-xdist = "^3.6.0"
|
|
103
101
|
|
|
104
102
|
[tool.poetry.extras]
|
|
105
|
-
openai = [ "openai", "python-dotenv" ]
|
|
103
|
+
openai = [ "openai", "python-dotenv", "pyyaml" ]
|
|
106
104
|
numpy = [ "numpy" ]
|
|
107
105
|
typing = [ "mypy", "typing-extensions" ]
|
|
108
|
-
fandango-faker = [ "faker", "fandango-fuzzer"
|
|
106
|
+
fandango-faker = [ "faker", "fandango-fuzzer" ]
|
|
109
107
|
|
|
110
108
|
[tool.poetry.scripts]
|
|
111
109
|
pynguin = "pynguin.cli:main"
|
|
@@ -149,6 +147,24 @@ warn_unused_ignores = true
|
|
|
149
147
|
warn_redundant_casts = true
|
|
150
148
|
warn_unused_configs = true
|
|
151
149
|
|
|
150
|
+
# The following modules belong to subsystems that were disabled (kept on disk but
|
|
151
|
+
# inert) during the libcst test-case representation migration. They still use the
|
|
152
|
+
# old per-statement representation API and are excluded from type checking until
|
|
153
|
+
# they are migrated. See TC_REPRESENTATION_PLAN.md.
|
|
154
|
+
[[tool.mypy.overrides]]
|
|
155
|
+
module = [
|
|
156
|
+
"pynguin.testcase.localsearch",
|
|
157
|
+
"pynguin.testcase.localsearchstatement",
|
|
158
|
+
"pynguin.testcase.llmlocalsearch",
|
|
159
|
+
"pynguin.analyses.seeding",
|
|
160
|
+
"pynguin.slicer.statementslicingobserver",
|
|
161
|
+
"pynguin.assertion.llmassertiongenerator",
|
|
162
|
+
"pynguin.large_language_model.parsing.deserializer",
|
|
163
|
+
"pynguin.large_language_model.parsing.helpers",
|
|
164
|
+
"pynguin.large_language_model.helpers.testcasereferencecopier",
|
|
165
|
+
]
|
|
166
|
+
ignore_errors = true
|
|
167
|
+
|
|
152
168
|
[tool.pytest.ini_options]
|
|
153
169
|
testpaths = [
|
|
154
170
|
"tests",
|
|
@@ -267,6 +283,11 @@ max-complexity = 10
|
|
|
267
283
|
convention = "google"
|
|
268
284
|
|
|
269
285
|
[tool.ruff.lint.per-file-ignores]
|
|
286
|
+
# The exported test-suite license header embeds the repo's SPDX copyright text,
|
|
287
|
+
# which uses an EN DASH in the year range (2019–2026).
|
|
288
|
+
"src/pynguin/testcase/export.py" = [
|
|
289
|
+
"RUF001", # String contains ambiguous EN DASH (part of the SPDX license header)
|
|
290
|
+
]
|
|
270
291
|
"tests/**/*.py" = [
|
|
271
292
|
"D100", # Missing docstring in public module
|
|
272
293
|
"D101", # Missing docstring in public class
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# This file is part of Pynguin.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-FileCopyrightText: 2019–2026 Pynguin Contributors
|
|
4
|
+
#
|
|
5
|
+
# SPDX-License-Identifier: MIT
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
"""Utility functions for standard library ast nodes."""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import ast
|
|
13
|
+
from typing import TYPE_CHECKING, TypeVar, cast
|
|
14
|
+
|
|
15
|
+
_T = TypeVar("_T", bound=ast.AST)
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from collections.abc import Iterator
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _is_dataclass(class_node: ast.ClassDef) -> bool:
|
|
22
|
+
"""Whether the class carries a ``@dataclass`` decorator.
|
|
23
|
+
|
|
24
|
+
Recognises ``@dataclass``, ``@dataclasses.dataclass`` and their called
|
|
25
|
+
forms (e.g. ``@dataclass(frozen=True)``).
|
|
26
|
+
"""
|
|
27
|
+
for decorator in class_node.decorator_list:
|
|
28
|
+
target = decorator.func if isinstance(decorator, ast.Call) else decorator
|
|
29
|
+
if isinstance(target, ast.Name) and target.id == "dataclass":
|
|
30
|
+
return True
|
|
31
|
+
if isinstance(target, ast.Attribute) and target.attr == "dataclass":
|
|
32
|
+
return True
|
|
33
|
+
return False
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _is_class_var(annotation: ast.expr) -> bool:
|
|
37
|
+
"""Whether an annotation is ``ClassVar`` / ``ClassVar[...]`` (any import form)."""
|
|
38
|
+
if isinstance(annotation, ast.Subscript):
|
|
39
|
+
annotation = annotation.value
|
|
40
|
+
if isinstance(annotation, ast.Name):
|
|
41
|
+
return annotation.id == "ClassVar"
|
|
42
|
+
if isinstance(annotation, ast.Attribute):
|
|
43
|
+
return annotation.attr == "ClassVar"
|
|
44
|
+
return False
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _flatten_target(target: ast.expr) -> list[ast.expr]:
|
|
48
|
+
"""Flatten tuple/list assignment targets into their leaf expressions."""
|
|
49
|
+
if isinstance(target, (ast.Tuple, ast.List)):
|
|
50
|
+
leaves: list[ast.expr] = []
|
|
51
|
+
for element in target.elts:
|
|
52
|
+
leaves.extend(_flatten_target(element))
|
|
53
|
+
return leaves
|
|
54
|
+
return [target]
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _self_assigned_names(class_node: ast.ClassDef) -> Iterator[str]:
|
|
58
|
+
"""Yield names assigned to ``self.<attr>`` in the class's own methods."""
|
|
59
|
+
for item in class_node.body:
|
|
60
|
+
if not isinstance(item, (ast.FunctionDef, ast.AsyncFunctionDef)):
|
|
61
|
+
continue
|
|
62
|
+
for node in ast.walk(item):
|
|
63
|
+
targets: list[ast.expr] = []
|
|
64
|
+
if isinstance(node, ast.Assign):
|
|
65
|
+
targets = list(node.targets)
|
|
66
|
+
elif isinstance(node, (ast.AnnAssign, ast.AugAssign)):
|
|
67
|
+
targets = [node.target]
|
|
68
|
+
for target in (leaf for tgt in targets for leaf in _flatten_target(tgt)):
|
|
69
|
+
if (
|
|
70
|
+
isinstance(target, ast.Attribute)
|
|
71
|
+
and isinstance(target.value, ast.Name)
|
|
72
|
+
and target.value.id == "self"
|
|
73
|
+
):
|
|
74
|
+
yield target.attr
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _dataclass_field_names(class_node: ast.ClassDef) -> Iterator[str]:
|
|
78
|
+
"""Yield annotated ``@dataclass`` field names (excluding ``ClassVar`` fields)."""
|
|
79
|
+
if not _is_dataclass(class_node):
|
|
80
|
+
return
|
|
81
|
+
for item in class_node.body:
|
|
82
|
+
if (
|
|
83
|
+
isinstance(item, ast.AnnAssign)
|
|
84
|
+
and isinstance(item.target, ast.Name)
|
|
85
|
+
and not _is_class_var(item.annotation)
|
|
86
|
+
):
|
|
87
|
+
yield item.target.id
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def instance_attributes(class_node: ast.ClassDef) -> tuple[str, ...]:
|
|
91
|
+
"""Names assigned to ``self.<attr>`` in the class's own methods.
|
|
92
|
+
|
|
93
|
+
Mirrors ``astroid.ClassDef.instance_attrs`` (own class only, not inherited),
|
|
94
|
+
preserving first-seen order. For ``@dataclass`` classes the class-level
|
|
95
|
+
annotated fields are included as well (excluding ``ClassVar`` fields), since
|
|
96
|
+
astroid's dataclass support synthesises the corresponding ``__init__``
|
|
97
|
+
assignments.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
class_node: The ClassDef AST node.
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
A tuple of instance attribute names.
|
|
104
|
+
"""
|
|
105
|
+
names: dict[str, None] = {}
|
|
106
|
+
for name in (*_dataclass_field_names(class_node), *_self_assigned_names(class_node)):
|
|
107
|
+
names.setdefault(name, None)
|
|
108
|
+
return tuple(names)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def nodes_of_class(tree: ast.AST, types: type[_T] | tuple[type[_T], ...]) -> Iterator[_T]:
|
|
112
|
+
"""Yield all nodes (recursively, preorder DFS) that are instances of ``types``.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
tree: The AST tree root.
|
|
116
|
+
types: Type or tuple of types to match.
|
|
117
|
+
|
|
118
|
+
Yields:
|
|
119
|
+
Nodes matching types.
|
|
120
|
+
"""
|
|
121
|
+
stack = [tree]
|
|
122
|
+
while stack:
|
|
123
|
+
node = stack.pop()
|
|
124
|
+
if isinstance(node, types):
|
|
125
|
+
yield cast("_T", node)
|
|
126
|
+
# Push children in reverse order to visit them left-to-right
|
|
127
|
+
stack.extend(reversed(list(ast.iter_child_nodes(node))))
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def scope_line_range(node: ast.AST) -> tuple[int, int]:
|
|
131
|
+
"""Uniformly retrieve (lineno, end_lineno) for a node.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
node: The AST node.
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
A tuple of start and end line numbers.
|
|
138
|
+
"""
|
|
139
|
+
if isinstance(node, ast.Module):
|
|
140
|
+
# A module's line number is 0 in the AST (matching astroid's
|
|
141
|
+
# ``Module.fromlineno`` and the ``<module>`` code object convention used
|
|
142
|
+
# by the instrumentation transformer), even though its body starts at 1.
|
|
143
|
+
if node.body:
|
|
144
|
+
return 0, node.body[-1].end_lineno or 0
|
|
145
|
+
return 0, 0
|
|
146
|
+
if isinstance(node, ast.match_case):
|
|
147
|
+
start = node.pattern.lineno
|
|
148
|
+
end = node.body[-1].end_lineno or start
|
|
149
|
+
return start, end
|
|
150
|
+
start = getattr(node, "lineno", 1)
|
|
151
|
+
end = getattr(node, "end_lineno", start) or start
|
|
152
|
+
return start, end
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def scope_name(node: ast.AST) -> str:
|
|
156
|
+
"""Retrieve name of a ScopeNode, matching astroid behavior.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
node: The AST node representing the scope.
|
|
160
|
+
|
|
161
|
+
Returns:
|
|
162
|
+
The name of the scope.
|
|
163
|
+
"""
|
|
164
|
+
if isinstance(node, ast.Module):
|
|
165
|
+
return ""
|
|
166
|
+
if isinstance(node, ast.Lambda):
|
|
167
|
+
return "<lambda>"
|
|
168
|
+
if isinstance(node, (ast.ListComp, ast.SetComp, ast.DictComp, ast.GeneratorExp)):
|
|
169
|
+
lineno = getattr(node, "lineno", 1)
|
|
170
|
+
return f"<generator-{lineno}>"
|
|
171
|
+
return getattr(node, "name", "")
|
|
@@ -140,6 +140,22 @@ class ConstantProvider(abc.ABC):
|
|
|
140
140
|
A constant or None, if there is no constant # noqa: DAR202
|
|
141
141
|
"""
|
|
142
142
|
|
|
143
|
+
def get_all_constants_for(self, tp_: type[T]) -> OrderedSet[T]:
|
|
144
|
+
"""Provide every constant value of the given type this provider knows.
|
|
145
|
+
|
|
146
|
+
Unlike :meth:`get_constant_for`, this ignores any per-provider selection
|
|
147
|
+
probability; it reports the full vocabulary reachable through this
|
|
148
|
+
provider. Used by generation strategies that need to inspect the pool
|
|
149
|
+
itself, e.g. to pick a plausible separator between seeded tokens.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
tp_: The type to retrieve
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
All constants of the given type; empty when there are none.
|
|
156
|
+
"""
|
|
157
|
+
return OrderedSet()
|
|
158
|
+
|
|
143
159
|
|
|
144
160
|
class EmptyConstantProvider(ConstantProvider):
|
|
145
161
|
"""Empty provider."""
|
|
@@ -169,6 +185,14 @@ class DelegatingConstantProvider(ConstantProvider, ABC):
|
|
|
169
185
|
return self._pool.get_constant_for(tp_)
|
|
170
186
|
return self._delegate.get_constant_for(tp_)
|
|
171
187
|
|
|
188
|
+
def get_all_constants_for(self, tp_: type[T]) -> OrderedSet[T]: # noqa: D102
|
|
189
|
+
delegated = self._delegate.get_all_constants_for(tp_)
|
|
190
|
+
if not delegated:
|
|
191
|
+
return self._pool.get_all_constants_for(tp_)
|
|
192
|
+
constants: OrderedSet[T] = OrderedSet(self._pool.get_all_constants_for(tp_))
|
|
193
|
+
constants.update(delegated)
|
|
194
|
+
return constants
|
|
195
|
+
|
|
172
196
|
|
|
173
197
|
class DynamicConstantProvider(DelegatingConstantProvider):
|
|
174
198
|
"""Provide values collected during runtime."""
|
|
@@ -298,8 +322,16 @@ def collect_static_constants(
|
|
|
298
322
|
exception,
|
|
299
323
|
)
|
|
300
324
|
|
|
301
|
-
#
|
|
325
|
+
# Scope discovery to the top-level package(s) of the module(s) under test, so a
|
|
326
|
+
# project_path broader than the SUT (shared site-packages, monorepo, vendored deps)
|
|
327
|
+
# does not drown the SUT's constants in those of unrelated packages. With no module
|
|
328
|
+
# names known, fall back to all packages.
|
|
329
|
+
top_level_packages = {name.split(".")[0] for name in (module_names or ())}
|
|
330
|
+
|
|
331
|
+
# Check modules discovered via packages, scoped to the project when known
|
|
302
332
|
for module in _find_modules_with_constants(project_path):
|
|
333
|
+
if top_level_packages and module.split("/")[0] not in top_level_packages:
|
|
334
|
+
continue
|
|
303
335
|
_parse_file(path / module)
|
|
304
336
|
|
|
305
337
|
# Check all modules explicitly specified
|
|
@@ -14,7 +14,14 @@ from abc import abstractmethod
|
|
|
14
14
|
from collections import defaultdict
|
|
15
15
|
|
|
16
16
|
import pynguin.configuration as config
|
|
17
|
-
from pynguin.analyses.typesystem import
|
|
17
|
+
from pynguin.analyses.typesystem import (
|
|
18
|
+
AnyType,
|
|
19
|
+
NoneType,
|
|
20
|
+
ProperType,
|
|
21
|
+
TupleType,
|
|
22
|
+
TypeSystem,
|
|
23
|
+
is_primitive_type,
|
|
24
|
+
)
|
|
18
25
|
from pynguin.ga.operators.selection import Selectable, SelectionFunction
|
|
19
26
|
from pynguin.utils.generic.genericaccessibleobject import (
|
|
20
27
|
GenericAccessibleObject,
|
|
@@ -157,7 +164,18 @@ class HeuristicGeneratorFitnessFunction(GeneratorFitnessFunction):
|
|
|
157
164
|
"""
|
|
158
165
|
return_type = generator.inferred_signature.return_type
|
|
159
166
|
assert return_type is not None, "Return type must not be None for a type generator"
|
|
160
|
-
|
|
167
|
+
dist = self._type_system.subtype_distance(to_generate, return_type)
|
|
168
|
+
if dist is not None:
|
|
169
|
+
return dist
|
|
170
|
+
if isinstance(return_type, TupleType) and not return_type.unknown_size:
|
|
171
|
+
min_dist: int | None = None
|
|
172
|
+
for elem_type in return_type.args:
|
|
173
|
+
d = self._type_system.subtype_distance(to_generate, elem_type)
|
|
174
|
+
if d is not None and (min_dist is None or d < min_dist):
|
|
175
|
+
min_dist = d
|
|
176
|
+
if min_dist is not None:
|
|
177
|
+
return min_dist + 1
|
|
178
|
+
return None
|
|
161
179
|
|
|
162
180
|
def is_maximisation_function(self) -> bool: # noqa: D102
|
|
163
181
|
return False
|
|
@@ -260,6 +278,23 @@ class GeneratorProvider:
|
|
|
260
278
|
if isinstance(generated_type, NoneType) or generated_type.accept(is_primitive_type):
|
|
261
279
|
return
|
|
262
280
|
self._generators[generated_type].add(generator)
|
|
281
|
+
if isinstance(generated_type, TupleType) and not generated_type.unknown_size:
|
|
282
|
+
for elem_type in generated_type.args:
|
|
283
|
+
if isinstance(elem_type, NoneType) or elem_type.accept(is_primitive_type):
|
|
284
|
+
continue
|
|
285
|
+
self._generators[elem_type].add(generator)
|
|
286
|
+
|
|
287
|
+
def remove_generator(self, generator: GenericAccessibleObject) -> None:
|
|
288
|
+
"""Remove a generator from all types it generates.
|
|
289
|
+
|
|
290
|
+
Args:
|
|
291
|
+
generator: The generator to remove.
|
|
292
|
+
"""
|
|
293
|
+
for typ in list(self._generators.keys()):
|
|
294
|
+
gens = self._generators[typ]
|
|
295
|
+
gens.discard(generator)
|
|
296
|
+
if not gens:
|
|
297
|
+
del self._generators[typ]
|
|
263
298
|
|
|
264
299
|
def get_all(self) -> dict[ProperType, OrderedSet[GenericAccessibleObject]]:
|
|
265
300
|
"""Get all generators."""
|
|
@@ -280,13 +315,18 @@ class GeneratorProvider:
|
|
|
280
315
|
"""
|
|
281
316
|
return self._generators.get(proper_type, OrderedSet())
|
|
282
317
|
|
|
283
|
-
def
|
|
284
|
-
"""
|
|
318
|
+
def get_generators_for(self, typ: ProperType) -> OrderedSet[GenericAccessibleObject]:
|
|
319
|
+
"""Get all generators for a specific type including compatible subtypes.
|
|
285
320
|
|
|
286
321
|
Args:
|
|
287
|
-
|
|
322
|
+
typ: The type to get the generators for.
|
|
323
|
+
|
|
324
|
+
Returns:
|
|
325
|
+
The generators for the given type.
|
|
288
326
|
"""
|
|
289
|
-
|
|
327
|
+
type_generators = self._get_generators_for(typ)
|
|
328
|
+
sorted_generators = self._sorted_generators(type_generators.freeze())
|
|
329
|
+
return OrderedSet(gen.generator for gen in sorted_generators)
|
|
290
330
|
|
|
291
331
|
def add_for_type(
|
|
292
332
|
self, proper_type: ProperType, generator: GenericCallableAccessibleObject
|
|
@@ -297,7 +337,14 @@ class GeneratorProvider:
|
|
|
297
337
|
proper_type: The type to add the generators for.
|
|
298
338
|
generator: The generator to add.
|
|
299
339
|
"""
|
|
340
|
+
if isinstance(proper_type, NoneType) or proper_type.accept(is_primitive_type):
|
|
341
|
+
return
|
|
300
342
|
self._generators[proper_type].add(generator)
|
|
343
|
+
if isinstance(proper_type, TupleType) and not proper_type.unknown_size:
|
|
344
|
+
for elem_type in proper_type.args:
|
|
345
|
+
if isinstance(elem_type, NoneType) or elem_type.accept(is_primitive_type):
|
|
346
|
+
continue
|
|
347
|
+
self._generators[elem_type].add(generator)
|
|
301
348
|
|
|
302
349
|
@functools.lru_cache(maxsize=1024)
|
|
303
350
|
def _sorted_generators(
|
|
@@ -337,11 +384,17 @@ class GeneratorProvider:
|
|
|
337
384
|
return OrderedSet()
|
|
338
385
|
|
|
339
386
|
generators: OrderedSet[_Generator] = OrderedSet()
|
|
387
|
+
any_generators: OrderedSet[_Generator] = OrderedSet()
|
|
340
388
|
for generated_typ in self.get_all_types():
|
|
341
389
|
if (distance := self._type_system.subtype_distance(typ, generated_typ)) is not None:
|
|
342
|
-
|
|
390
|
+
if isinstance(generated_typ, AnyType):
|
|
391
|
+
any_generators.update(self._get_for_type(generated_typ, distance))
|
|
392
|
+
else:
|
|
393
|
+
generators.update(self._get_for_type(generated_typ, distance))
|
|
343
394
|
|
|
344
|
-
|
|
395
|
+
if generators:
|
|
396
|
+
return generators
|
|
397
|
+
return any_generators
|
|
345
398
|
|
|
346
399
|
@functools.lru_cache(maxsize=1024)
|
|
347
400
|
def _get_for_type(self, typ: ProperType, distance: int) -> OrderedSet[_Generator]:
|
|
@@ -396,13 +449,21 @@ class RandomGeneratorProvider(GeneratorProvider):
|
|
|
396
449
|
# Just take everything when it's Any.
|
|
397
450
|
return self._get_all_generators(typ)
|
|
398
451
|
|
|
452
|
+
if typ.accept(is_primitive_type):
|
|
453
|
+
return OrderedSet()
|
|
454
|
+
|
|
399
455
|
results: OrderedSet[GenericAccessibleObject] = OrderedSet()
|
|
456
|
+
any_results: OrderedSet[GenericAccessibleObject] = OrderedSet()
|
|
400
457
|
for gen_type, generators in self.get_all().items():
|
|
401
458
|
if self._type_system.is_maybe_subtype(gen_type, typ):
|
|
402
|
-
|
|
459
|
+
if isinstance(gen_type, AnyType):
|
|
460
|
+
any_results.update(generators)
|
|
461
|
+
else:
|
|
462
|
+
results.update(generators)
|
|
403
463
|
|
|
464
|
+
matching = results or any_results
|
|
404
465
|
return OrderedSet(
|
|
405
|
-
_Generator(generator, typ, self._fitness_function) for generator in
|
|
466
|
+
_Generator(generator, typ, self._fitness_function) for generator in matching
|
|
406
467
|
)
|
|
407
468
|
|
|
408
469
|
@functools.lru_cache(maxsize=0) # Required to avoid mypy error
|