pynguin 0.46.0.dev0__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.dev0 → pynguin-0.47.0}/PKG-INFO +13 -12
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/README.md +10 -7
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/pyproject.toml +28 -7
- {pynguin-0.46.0.dev0 → 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.dev0 → pynguin-0.47.0}/src/pynguin/analyses/constants.py +33 -1
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/analyses/generator.py +73 -74
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/analyses/module.py +410 -91
- pynguin-0.47.0/src/pynguin/analyses/seeding.py +224 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/analyses/syntaxtree.py +37 -30
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/analyses/type_inference.py +221 -38
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/analyses/typesystem.py +2 -3
- pynguin-0.47.0/src/pynguin/assertion/assertion.py +503 -0
- pynguin-0.46.0.dev0/src/pynguin/assertion/assertion_to_cst.py → pynguin-0.47.0/src/pynguin/assertion/assertion_to_ast.py +73 -32
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/assertion_trace.py +56 -13
- pynguin-0.47.0/src/pynguin/assertion/assertiongenerator.py +631 -0
- pynguin-0.47.0/src/pynguin/assertion/assertiontraceobserver.py +601 -0
- pynguin-0.47.0/src/pynguin/assertion/llmassertiongenerator.py +158 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/controller.py +5 -1
- pynguin-0.47.0/src/pynguin/assertion/mutation_analysis/mutators.py +290 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/__init__.py +16 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/exception.py +43 -1
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/inheritance.py +8 -4
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/logical.py +33 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/misc.py +200 -3
- pynguin-0.47.0/src/pynguin/assertion/mutation_analysis/operators/statement.py +70 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/cli.py +0 -20
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/configuration.py +249 -17
- pynguin-0.47.0/src/pynguin/ga/AGENTS.md +464 -0
- pynguin-0.47.0/src/pynguin/ga/__init__.py +7 -0
- pynguin-0.47.0/src/pynguin/ga/algorithms/AGENTS.md +658 -0
- {pynguin-0.46.0.dev0/src/pynguin/output → pynguin-0.47.0/src/pynguin/ga/algorithms}/__init__.py +1 -1
- pynguin-0.47.0/src/pynguin/ga/algorithms/abstractmosaalgorithm.py +174 -0
- pynguin-0.47.0/src/pynguin/ga/algorithms/archive.py +462 -0
- pynguin-0.47.0/src/pynguin/ga/algorithms/dynamosaalgorithm.py +482 -0
- pynguin-0.47.0/src/pynguin/ga/algorithms/generationalgorithm.py +326 -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.47.0/src/pynguin/ga/algorithms/mioalgorithm.py +142 -0
- pynguin-0.47.0/src/pynguin/ga/algorithms/mosaalgorithm.py +67 -0
- pynguin-0.47.0/src/pynguin/ga/algorithms/randomalgorithm.py +162 -0
- pynguin-0.47.0/src/pynguin/ga/algorithms/randomsearchalgorithm.py +55 -0
- pynguin-0.47.0/src/pynguin/ga/algorithms/wholesuitealgorithm.py +181 -0
- pynguin-0.47.0/src/pynguin/ga/checked_coverage.py +143 -0
- pynguin-0.47.0/src/pynguin/ga/chromosome.py +211 -0
- pynguin-0.47.0/src/pynguin/ga/chromosomefactory.py +26 -0
- pynguin-0.47.0/src/pynguin/ga/chromosomevisitor.py +29 -0
- 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.47.0/src/pynguin/ga/coveragegoals.py +581 -0
- pynguin-0.47.0/src/pynguin/ga/fitness_metrics.py +259 -0
- pynguin-0.47.0/src/pynguin/ga/generationalgorithmfactory.py +448 -0
- pynguin-0.47.0/src/pynguin/ga/llmtestsuitechromosomefactory.py +127 -0
- pynguin-0.47.0/src/pynguin/ga/operators/AGENTS.md +157 -0
- pynguin-0.47.0/src/pynguin/ga/operators/__init__.py +7 -0
- pynguin-0.47.0/src/pynguin/ga/operators/comparator.py +153 -0
- 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.47.0/src/pynguin/ga/operators/ranking.py +224 -0
- pynguin-0.47.0/src/pynguin/ga/operators/selection.py +169 -0
- pynguin-0.47.0/src/pynguin/ga/postprocess.py +557 -0
- pynguin-0.47.0/src/pynguin/ga/searchobserver.py +84 -0
- pynguin-0.47.0/src/pynguin/ga/stoppingcondition.py +621 -0
- pynguin-0.47.0/src/pynguin/ga/testcasechromosome.py +214 -0
- pynguin-0.47.0/src/pynguin/ga/testcasechromosomefactory.py +84 -0
- pynguin-0.47.0/src/pynguin/ga/testcasefactory.py +88 -0
- pynguin-0.47.0/src/pynguin/ga/testsuitechromosome.py +162 -0
- pynguin-0.47.0/src/pynguin/ga/testsuitechromosomefactory.py +61 -0
- pynguin-0.47.0/src/pynguin/generator.py +1200 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/instrumentation/controlflow.py +11 -11
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/instrumentation/machinery.py +5 -2
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/instrumentation/tracer.py +631 -34
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/instrumentation/transformer.py +400 -314
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/python3_10.py +140 -11
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/python3_11.py +69 -15
- {pynguin-0.46.0.dev0 → 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/__init__.py +7 -0
- pynguin-0.47.0/src/pynguin/large_language_model/cache.py +106 -0
- pynguin-0.47.0/src/pynguin/large_language_model/caching.py +73 -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.47.0/src/pynguin/large_language_model/llmagent.py +455 -0
- pynguin-0.47.0/src/pynguin/large_language_model/llmtestcasehandler.py +168 -0
- pynguin-0.47.0/src/pynguin/large_language_model/parsing/AGENTS.md +157 -0
- pynguin-0.47.0/src/pynguin/large_language_model/parsing/__init__.py +7 -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.47.0/src/pynguin/large_language_model/parsing/rewriter.py +825 -0
- pynguin-0.47.0/src/pynguin/large_language_model/parsing/type_str_parser.py +196 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/AGENTS.md +100 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/__init__.py +37 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/assertiongenerationprompt.py +40 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/base_inference_prompt.py +128 -0
- pynguin-0.47.0/src/pynguin/large_language_model/prompts/localsearchprompt.py +71 -0
- 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.47.0/src/pynguin/large_language_model/prompts/uncoveredtargetsprompt.py +96 -0
- 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.47.0/src/pynguin/refinement/__init__.py +11 -0
- pynguin-0.47.0/src/pynguin/refinement/aaa_inserter.py +140 -0
- pynguin-0.47.0/src/pynguin/refinement/ast_analyzer.py +265 -0
- pynguin-0.47.0/src/pynguin/refinement/coverage_checker.py +348 -0
- pynguin-0.47.0/src/pynguin/refinement/llm_client.py +213 -0
- pynguin-0.47.0/src/pynguin/refinement/llm_judge.py +352 -0
- pynguin-0.47.0/src/pynguin/refinement/mutation_analyzer.py +478 -0
- pynguin-0.47.0/src/pynguin/refinement/pipeline.py +890 -0
- pynguin-0.47.0/src/pynguin/refinement/readability_metrics.py +117 -0
- pynguin-0.47.0/src/pynguin/refinement/refiner.py +585 -0
- 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.47.0/src/pynguin/slicer/AGENTS.md +159 -0
- {pynguin-0.46.0.dev0/src/pynguin/execution → pynguin-0.47.0/src/pynguin/slicer}/__init__.py +1 -1
- pynguin-0.47.0/src/pynguin/slicer/dynamicslicer.py +909 -0
- pynguin-0.47.0/src/pynguin/slicer/executedinstruction.py +144 -0
- pynguin-0.47.0/src/pynguin/slicer/executionflowbuilder.py +605 -0
- pynguin-0.47.0/src/pynguin/slicer/stack/__init__.py +9 -0
- pynguin-0.47.0/src/pynguin/slicer/stack/stacksimulation.py +228 -0
- pynguin-0.47.0/src/pynguin/slicer/statementslicingobserver.py +99 -0
- {pynguin-0.46.0.dev0 → 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.47.0/src/pynguin/testcase/localsearch.py +306 -0
- pynguin-0.47.0/src/pynguin/testcase/localsearchobjective.py +143 -0
- pynguin-0.47.0/src/pynguin/testcase/localsearchstatement.py +921 -0
- pynguin-0.47.0/src/pynguin/testcase/localsearchtimer.py +42 -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.dev0 → pynguin-0.47.0}/src/pynguin/utils/AGENTS.md +3 -42
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/configuration_writer.py +1 -1
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/controlflowdistance.py +72 -8
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/execution_recorder.py +6 -5
- {pynguin-0.46.0.dev0 → 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.dev0 → pynguin-0.47.0}/src/pynguin/utils/openai_key_resolver.py +13 -7
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/ml_testfactory_utils.py +39 -10
- 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.dev0 → pynguin-0.47.0}/src/pynguin/utils/report.py +11 -55
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/statistics/outputvariablefactory.py +4 -2
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/statistics/runtimevariable.py +68 -6
- pynguin-0.47.0/src/pynguin/utils/statistics/statisticsobserver.py +88 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/statistics/stats.py +16 -11
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/type_utils.py +102 -9
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/typeevalpy_json_schema.py +23 -14
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/typetracing.py +38 -14
- pynguin-0.47.0/tests/analyses/test_ast_utils.py +91 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/analyses/test_constants.py +14 -0
- pynguin-0.47.0/tests/analyses/test_initialpopulationseeding.py +307 -0
- pynguin-0.47.0/tests/analyses/test_module.py +1050 -0
- 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.dev0 → pynguin-0.47.0}/tests/analyses/test_string_subtype_inference.py +63 -0
- pynguin-0.47.0/tests/analyses/test_subtypes.py +155 -0
- {pynguin-0.46.0.dev0 → 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/analyses/test_typesystem.py +1070 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_exception.py +92 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_inheritance.py +30 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_logical.py +80 -0
- pynguin-0.47.0/tests/assertion/mutation_analysis/operators/test_misc.py +706 -0
- pynguin-0.47.0/tests/assertion/mutation_analysis/operators/test_statement.py +160 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/test_controller.py +4 -4
- pynguin-0.47.0/tests/assertion/mutation_analysis/test_mutators.py +287 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/assertion/test_assertion.py +50 -37
- 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.dev0 → pynguin-0.47.0}/tests/assertion/test_assertion_trace.py +2 -0
- pynguin-0.47.0/tests/assertion/test_assertiongenerator.py +257 -0
- 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.dev0 → pynguin-0.47.0}/tests/conftest.py +196 -11
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/accessibles/accessible.py +16 -0
- pynguin-0.47.0/tests/fixtures/cluster/async_and_sync.py +12 -0
- pynguin-0.47.0/tests/fixtures/cluster/cached_function.py +12 -0
- pynguin-0.47.0/tests/fixtures/cluster/fields.py +39 -0
- pynguin-0.47.0/tests/fixtures/cluster/lazy_module_getattr.py +33 -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/cluster/visibility.py +40 -0
- pynguin-0.47.0/tests/fixtures/cluster/visibility_dependency.py +11 -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.dev0 → 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.dev0 → pynguin-0.47.0}/tests/fixtures/type_tracing/guess_params.py +4 -0
- pynguin-0.47.0/tests/ga/AGENTS.md +170 -0
- {pynguin-0.46.0.dev0/src/pynguin/evolution/operators → pynguin-0.47.0/tests/ga/algorithms}/__init__.py +1 -1
- pynguin-0.47.0/tests/ga/algorithms/test_archive.py +551 -0
- pynguin-0.47.0/tests/ga/algorithms/test_dynamosaalgorithm.py +393 -0
- pynguin-0.47.0/tests/ga/algorithms/test_generationalgorithm.py +32 -0
- pynguin-0.47.0/tests/ga/algorithms/test_integration_mosaalgorithm.py +68 -0
- pynguin-0.47.0/tests/ga/algorithms/test_integration_varioussearchalgorithms.py +125 -0
- pynguin-0.47.0/tests/ga/algorithms/test_lldynamosaalgorithm.py +328 -0
- pynguin-0.47.0/tests/ga/algorithms/test_llmosalgorithm.py +519 -0
- pynguin-0.47.0/tests/ga/algorithms/test_mioalgorithm.py +66 -0
- pynguin-0.47.0/tests/ga/algorithms/test_mosaalgorithm.py +52 -0
- pynguin-0.47.0/tests/ga/algorithms/test_randomalgorithm.py +193 -0
- pynguin-0.47.0/tests/ga/operators/crossover/test_singlepointrelativecrossover.py +39 -0
- pynguin-0.47.0/tests/ga/operators/ranking/test_rankingfunction.py +70 -0
- pynguin-0.47.0/tests/ga/operators/selection/test_randomselection.py +16 -0
- pynguin-0.47.0/tests/ga/operators/selection/test_rankselection.py +16 -0
- pynguin-0.47.0/tests/ga/operators/selection/test_selection.py +29 -0
- pynguin-0.47.0/tests/ga/operators/selection/test_tournamentselection.py +20 -0
- pynguin-0.47.0/tests/ga/operators/test_dominancecomparator.py +48 -0
- pynguin-0.47.0/tests/ga/operators/test_preferencesortingcomparator.py +25 -0
- pynguin-0.47.0/tests/ga/stoppingconditions/test_coverageplateaustoppingcondition.py +63 -0
- pynguin-0.47.0/tests/ga/stoppingconditions/test_maxcoveragestoppingcondition.py +59 -0
- pynguin-0.47.0/tests/ga/stoppingconditions/test_maxiterationsstoppingcondition.py +43 -0
- pynguin-0.47.0/tests/ga/stoppingconditions/test_maxmemorystoppingcondition.py +43 -0
- pynguin-0.47.0/tests/ga/stoppingconditions/test_maxstatementstoppingcondition.py +47 -0
- pynguin-0.47.0/tests/ga/stoppingconditions/test_maxtestsstoppingcondition.py +31 -0
- pynguin-0.47.0/tests/ga/stoppingconditions/test_maxtimestoppingcondition.py +42 -0
- pynguin-0.47.0/tests/ga/stoppingconditions/test_minimumcoverageplateaustoppingcondition.py +85 -0
- pynguin-0.47.0/tests/ga/stoppingconditions/test_stoppingcondition.py +39 -0
- pynguin-0.47.0/tests/ga/test_chromosome.py +62 -0
- pynguin-0.47.0/tests/ga/test_chromosomefactory.py +83 -0
- pynguin-0.47.0/tests/ga/test_computations.py +340 -0
- pynguin-0.47.0/tests/ga/test_computations_cache.py +227 -0
- pynguin-0.47.0/tests/ga/test_computations_fitness_utilities.py +307 -0
- 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.47.0/tests/ga/test_generationalgorithmfactory.py +129 -0
- pynguin-0.47.0/tests/ga/test_generator.py +283 -0
- pynguin-0.47.0/tests/ga/test_llmtestsuitechromosomefactory.py +207 -0
- pynguin-0.47.0/tests/ga/test_postprocess.py +512 -0
- pynguin-0.47.0/tests/ga/test_testcasechromosome.py +676 -0
- pynguin-0.47.0/tests/ga/test_testcasefactory.py +40 -0
- pynguin-0.47.0/tests/ga/test_testsuitechromosome.py +220 -0
- pynguin-0.47.0/tests/instrumentation/__init__.py +6 -0
- pynguin-0.47.0/tests/instrumentation/test_adapters.py +1043 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/instrumentation/test_ast_info.py +139 -9
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/instrumentation/test_machinery.py +7 -5
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/instrumentation/test_tracer.py +151 -2
- pynguin-0.47.0/tests/large_language_model/__init__.py +6 -0
- pynguin-0.47.0/tests/large_language_model/parsing/test_helpers.py +18 -0
- pynguin-0.47.0/tests/large_language_model/parsing/test_type_str_parser.py +139 -0
- pynguin-0.47.0/tests/large_language_model/prompts/test_assertiongenerationprompt.py +106 -0
- 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.47.0/tests/large_language_model/prompts/test_uncovered_targets_prompt.py +114 -0
- pynguin-0.47.0/tests/large_language_model/test_cache.py +113 -0
- pynguin-0.47.0/tests/large_language_model/test_caching.py +109 -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_caching.py +54 -0
- pynguin-0.47.0/tests/large_language_model/test_llm_deserializer.py +608 -0
- pynguin-0.47.0/tests/large_language_model/test_llmagent.py +135 -0
- pynguin-0.47.0/tests/large_language_model/test_llmagent_extended.py +523 -0
- pynguin-0.47.0/tests/large_language_model/test_llmtestcasehandler.py +130 -0
- pynguin-0.47.0/tests/large_language_model/test_llmtestcasehandler_coverage.py +48 -0
- pynguin-0.47.0/tests/large_language_model/test_request_budget.py +151 -0
- pynguin-0.47.0/tests/large_language_model/test_rewriter.py +489 -0
- pynguin-0.47.0/tests/large_language_model/test_temperature_fallback.py +124 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/master_worker/test_client.py +6 -1
- pynguin-0.47.0/tests/quick_eval/__init__.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.47.0/tests/refinement/__init__.py +6 -0
- pynguin-0.47.0/tests/refinement/test_aaa_inserter.py +107 -0
- pynguin-0.47.0/tests/refinement/test_ast_analyzer.py +109 -0
- pynguin-0.47.0/tests/refinement/test_coverage_checker.py +243 -0
- pynguin-0.47.0/tests/refinement/test_llm_client.py +259 -0
- pynguin-0.47.0/tests/refinement/test_llm_judge.py +208 -0
- pynguin-0.47.0/tests/refinement/test_module_refinement.py +250 -0
- pynguin-0.47.0/tests/refinement/test_mutation_analyzer.py +282 -0
- pynguin-0.47.0/tests/refinement/test_pipeline.py +927 -0
- pynguin-0.47.0/tests/refinement/test_readability_metrics.py +111 -0
- pynguin-0.47.0/tests/refinement/test_refiner.py +342 -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/__init__.py +6 -0
- pynguin-0.47.0/tests/slicer/test_assertionslicer.py +234 -0
- pynguin-0.47.0/tests/slicer/test_dependencies.py +466 -0
- pynguin-0.47.0/tests/slicer/test_expected_failures.py +703 -0
- pynguin-0.47.0/tests/slicer/test_language_features.py +1495 -0
- pynguin-0.47.0/tests/slicer/test_statementslicer.py +330 -0
- pynguin-0.47.0/tests/slicer/util.py +200 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/test_cli.py +1 -7
- pynguin-0.47.0/tests/test_generator.py +504 -0
- pynguin-0.47.0/tests/testcase/__init__.py +6 -0
- pynguin-0.47.0/tests/testcase/_builders.py +106 -0
- pynguin-0.47.0/tests/testcase/execution/__init__.py +6 -0
- pynguin-0.47.0/tests/testcase/execution/test_executedinstruction.py +22 -0
- pynguin-0.47.0/tests/testcase/execution/test_executionmocking.py +48 -0
- pynguin-0.47.0/tests/testcase/execution/test_executionresult.py +64 -0
- pynguin-0.47.0/tests/testcase/execution/test_executiontrace.py +83 -0
- pynguin-0.47.0/tests/testcase/execution/test_moduleprovider.py +83 -0
- pynguin-0.47.0/tests/testcase/execution/test_outputsuppression.py +165 -0
- pynguin-0.47.0/tests/testcase/execution/test_returntype.py +139 -0
- pynguin-0.47.0/tests/testcase/execution/test_subprocesstestcaseexecutor.py +290 -0
- pynguin-0.47.0/tests/testcase/execution/test_subprocesstestcaseexecutor_differential.py +36 -0
- 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/__init__.py +6 -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/statements/__init__.py +6 -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_localsearchtimer.py +28 -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.47.0/tests/testcase/variable/__init__.py +6 -0
- pynguin-0.47.0/tests/utils/__init__.py +6 -0
- pynguin-0.47.0/tests/utils/generic/__init__.py +6 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/generic/test_genericaccessibleobject.py +46 -0
- pynguin-0.47.0/tests/utils/pynguinml/__init__.py +6 -0
- pynguin-0.47.0/tests/utils/pynguinml/test_ml_testfactory_utils.py +380 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/pynguinml/test_ml_testing_resources.py +3 -3
- pynguin-0.47.0/tests/utils/pynguinml/test_pynguinml_integration.py +61 -0
- pynguin-0.47.0/tests/utils/stats/__init__.py +6 -0
- pynguin-0.47.0/tests/utils/stats/test_outputvariablefactory.py +196 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/stats/test_runtimevariable.py +9 -3
- pynguin-0.47.0/tests/utils/stats/test_searchstatistics.py +193 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/test_configuration_writer.py +150 -28
- pynguin-0.47.0/tests/utils/test_controlflowdistance.py +215 -0
- pynguin-0.47.0/tests/utils/test_execution_recorder.py +80 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/test_logging_utils.py +2 -4
- pynguin-0.47.0/tests/utils/test_naming.py +71 -0
- pynguin-0.47.0/tests/utils/test_report.py +546 -0
- pynguin-0.47.0/tests/utils/test_string_subtype_integration.py +61 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/test_type_utils.py +190 -0
- pynguin-0.47.0/tests/utils/test_typeevalpy_integration.py +233 -0
- pynguin-0.47.0/tests/utils/test_typeevalpy_json_schema.py +439 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/test_typetracing.py +4 -4
- pynguin-0.47.0/tests/utils/utils.py +111 -0
- pynguin-0.46.0.dev0/src/pynguin/analysis/__init__.py +0 -26
- pynguin-0.46.0.dev0/src/pynguin/analysis/models.py +0 -105
- pynguin-0.46.0.dev0/src/pynguin/analysis/module_analyzer.py +0 -525
- pynguin-0.46.0.dev0/src/pynguin/analysis/type_utils.py +0 -101
- pynguin-0.46.0.dev0/src/pynguin/assertion/assertion.py +0 -304
- pynguin-0.46.0.dev0/src/pynguin/assertion/assertiongenerator.py +0 -140
- pynguin-0.46.0.dev0/src/pynguin/assertion/assertiontraceobserver.py +0 -164
- pynguin-0.46.0.dev0/src/pynguin/assertion/mutation_analysis/mutators.py +0 -121
- pynguin-0.46.0.dev0/src/pynguin/evolution/__init__.py +0 -7
- pynguin-0.46.0.dev0/src/pynguin/evolution/algorithms/__init__.py +0 -28
- pynguin-0.46.0.dev0/src/pynguin/evolution/algorithms/archive.py +0 -142
- pynguin-0.46.0.dev0/src/pynguin/evolution/algorithms/base.py +0 -111
- pynguin-0.46.0.dev0/src/pynguin/evolution/algorithms/codamosa.py +0 -58
- pynguin-0.46.0.dev0/src/pynguin/evolution/algorithms/dynamosa.py +0 -459
- pynguin-0.46.0.dev0/src/pynguin/evolution/algorithms/mio.py +0 -172
- pynguin-0.46.0.dev0/src/pynguin/evolution/algorithms/observer.py +0 -83
- pynguin-0.46.0.dev0/src/pynguin/evolution/algorithms/random.py +0 -139
- pynguin-0.46.0.dev0/src/pynguin/evolution/algorithms/stopping_conditions.py +0 -170
- pynguin-0.46.0.dev0/src/pynguin/evolution/algorithms/wholesuite.py +0 -194
- pynguin-0.46.0.dev0/src/pynguin/evolution/chromosomes/__init__.py +0 -13
- pynguin-0.46.0.dev0/src/pynguin/evolution/chromosomes/base.py +0 -35
- pynguin-0.46.0.dev0/src/pynguin/evolution/chromosomes/individual.py +0 -50
- pynguin-0.46.0.dev0/src/pynguin/evolution/chromosomes/suite.py +0 -138
- pynguin-0.46.0.dev0/src/pynguin/evolution/factory.py +0 -78
- pynguin-0.46.0.dev0/src/pynguin/evolution/fitness/__init__.py +0 -25
- pynguin-0.46.0.dev0/src/pynguin/evolution/fitness/base.py +0 -65
- pynguin-0.46.0.dev0/src/pynguin/evolution/fitness/coverage.py +0 -245
- pynguin-0.46.0.dev0/src/pynguin/evolution/minimization.py +0 -289
- pynguin-0.46.0.dev0/src/pynguin/evolution/operators/crossover.py +0 -201
- pynguin-0.46.0.dev0/src/pynguin/evolution/operators/mutation.py +0 -245
- pynguin-0.46.0.dev0/src/pynguin/evolution/operators/selection.py +0 -63
- pynguin-0.46.0.dev0/src/pynguin/execution/executor.py +0 -270
- pynguin-0.46.0.dev0/src/pynguin/execution/isolation.py +0 -313
- pynguin-0.46.0.dev0/src/pynguin/execution/observer.py +0 -40
- pynguin-0.46.0.dev0/src/pynguin/execution/subprocess_executor.py +0 -235
- pynguin-0.46.0.dev0/src/pynguin/generator.py +0 -609
- pynguin-0.46.0.dev0/src/pynguin/output/writer.py +0 -329
- pynguin-0.46.0.dev0/src/pynguin/testcase/testcase.py +0 -291
- pynguin-0.46.0.dev0/src/pynguin/testcase/testfactory.py +0 -740
- pynguin-0.46.0.dev0/src/pynguin/utils/ast_util.py +0 -218
- pynguin-0.46.0.dev0/src/pynguin/utils/llm.py +0 -165
- pynguin-0.46.0.dev0/src/pynguin/utils/naming.py +0 -21
- pynguin-0.46.0.dev0/src/pynguin/utils/namingscope.py +0 -191
- pynguin-0.46.0.dev0/src/pynguin/utils/statistics/statisticsobserver.py +0 -110
- pynguin-0.46.0.dev0/tests/analyses/test_staticconstantseeding.py +0 -46
- pynguin-0.46.0.dev0/tests/analyses/test_type_inference.py +0 -134
- pynguin-0.46.0.dev0/tests/analysis/test_module_analyzer.py +0 -131
- pynguin-0.46.0.dev0/tests/assertion/mutation_analysis/operators/test_misc.py +0 -290
- pynguin-0.46.0.dev0/tests/assertion/mutation_analysis/test_mutators.py +0 -152
- pynguin-0.46.0.dev0/tests/assertion/test_assertiongenerator.py +0 -38
- pynguin-0.46.0.dev0/tests/evolution/test_chromosomes.py +0 -146
- pynguin-0.46.0.dev0/tests/execution/test_executor.py +0 -170
- pynguin-0.46.0.dev0/tests/resources/__init__.py +0 -0
- pynguin-0.46.0.dev0/tests/resources/typeevalpy/__init__.py +0 -0
- pynguin-0.46.0.dev0/tests/testcase/test_new_testcase.py +0 -161
- pynguin-0.46.0.dev0/tests/testcase/test_testfactory_static.py +0 -144
- pynguin-0.46.0.dev0/tests/utils/utils.py +0 -46
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/LICENSE.rst +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/LICENSES/Apache-2.0.txt +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/LICENSES/BSD-2-Clause.txt +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/LICENSES/CC-BY-4.0.txt +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/LICENSES/CC0-1.0.txt +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/LICENSES/MIT.txt +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/__main__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/analyses/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/analyses/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/analyses/modulecomplexity.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/analyses/string_subtype_inference.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/analyses/string_subtypes.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/arithmetic.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/base.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/decorator.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/operators/loop.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/strategies.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/assertion/mutation_analysis/transformer.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/instrumentation/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/instrumentation/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/common.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/python3_12.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/instrumentation/version/python3_14.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/master_worker/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/master_worker/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/master_worker/client.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/master_worker/master.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/master_worker/worker.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/coverage-template.html +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/camel_case.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/colour.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/csv.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/delimited.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/email.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/camel_case.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/colour.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/csv.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/delimited.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/email.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/ipv4.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/standard_date.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/unix_path.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/faker/xml.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/ipv4.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/numeric.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/standard_date.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/unix_path.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/resources/fans/xml.fan +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/testcase/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/atomicinteger.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/collection_utils.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/exceptions.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/fandango_faker_utils.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/fs_isolation.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/generic/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/generic/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/logging_utils.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/mirror.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/mutation_utils.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/orderedset.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/ml_parsing_utils.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/ml_testing_resources.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/mlparameter.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/pynguinml/np_rng.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/randomness.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/statistics/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/statistics/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/src/pynguin/utils/statistics/statisticsbackend.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/analyses/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/analyses/test_modulecomplexity.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/analyses/test_string_subtypes.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/analyses/test_typesystem_string_subtypes.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/assertion/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/assertion/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0/tests/analysis → pynguin-0.47.0/tests/assertion/mutation_analysis/operators}/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_arithmetic.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_decorator.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/operators/test_loop.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/assertion/mutation_analysis/test_strategies.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/accessibles/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/nestedbranches.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/nobranches.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/simplenesting.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/singlebranches.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/branchcoverage/twomethodsinglebranches.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/c/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/c/my_ctypes.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/abstract.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/alias_module.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/async_class_gen.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/async_class_method.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/async_func.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/async_gen.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/attributes.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/blacklist.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/blacklist_transitive.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/comments.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/complex_dependencies.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/complex_dependency.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/conditional_import.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/dependency.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/diamond_bottom.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/diamond_left.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/diamond_right.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/diamond_top.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/enums.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/import_dependency.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/inheritance.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/lambda.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/nested_functions.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/no_any_annotations.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/no_dependencies.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/overridden_inherited_methods.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/simple_dependencies.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/typing_parameters.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/cluster/uses_async_dependency.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/crash/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/crash/partly_crashing.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/crash/seg_fault.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/duckmock/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/duckmock/complex.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/errors/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/errors/import_error.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/assertions.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/basket.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/calculator.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/calculator_simple.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/collections.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/constructors.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/difficult.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/dummies.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/dynamosa_example.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/enums.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/exceptions.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/flaky.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/impossible.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/inheritance.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/loop.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/module_alias.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/monkey.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/nested.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/objects.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/private_methods.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/queue.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/simple.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/triangle.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/type_inference.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/geometry.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/invoice.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/large_test_cluster.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/mixed.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/type_tracing/string_subtype.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/examples/unasserted_exceptions.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/grammar/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/grammar/parameters.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/instrumentation/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/instrumentation/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/instrumentation/comparison.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/instrumentation/covered_branches.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/instrumentation/covered_classes.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/instrumentation/covered_functions.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/instrumentation/covered_lines.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/instrumentation/excluded_blocks.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/instrumentation/inherited.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/instrumentation/mixed.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/linecoverage/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/linecoverage/artificial_none.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/linecoverage/emptyfile.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/linecoverage/exception.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/linecoverage/list.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/linecoverage/plus.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/linecoverage/setter_getter.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/mutation/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/mutation/exception.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/mutation/expected.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/mutation/mutation.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/mutation/timeout.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/programgraph/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/programgraph/samples.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/programgraph/whileloop.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/programgraph/yield_fun.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/regression/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/regression/argparse_sys_exit.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/regression/custom_error.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/regression/not_main.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/dynamicseeding/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/dynamicseeding/dynamicseedingdummies.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/dummycontainer.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/assertseed_test_.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/classseed_test_.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collfuncseed_test_.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collseed_test_.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/nestedseed_test_.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notknowncall_test_.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notprimseed_test_.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/primitiveseed_test_.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/triangleseed_test_.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongassignseed_test_.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongfunctionnameseed_test_.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/staticconstantseeding/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/staticconstantseeding/dummy/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/staticconstantseeding/dummy/dummy.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/seeding/staticconstantseeding/dummy/empty.so +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/slicer/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/slicer/attribute_dependencies.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/slicer/closure.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/slicer/generator.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/slicer/immutable_attribute_dependency.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/slicer/import_star_def.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/slicer/import_star_main.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/slicer/partial_cover_dependency.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/slicer/simple_call.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/slicer/simple_call_arg.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/test.conf +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/test.conf.license +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/tests/typeinference/test_stubstrategy.pyi +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/type_tracing/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/type_tracing/return_types.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/type_tracing/union_type.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/types/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/types/outside.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/types/subtyping.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/fixtures/types/symbols.py +0 -0
- {pynguin-0.46.0.dev0/tests/instrumentation → pynguin-0.47.0/tests/ga}/__init__.py +0 -0
- {pynguin-0.46.0.dev0/tests/testcase → pynguin-0.47.0/tests/ga/operators}/__init__.py +0 -0
- {pynguin-0.46.0.dev0/tests/utils → pynguin-0.47.0/tests/ga/operators/crossover}/__init__.py +0 -0
- {pynguin-0.46.0.dev0/tests/utils/generic → pynguin-0.47.0/tests/ga/operators/ranking}/__init__.py +0 -0
- {pynguin-0.46.0.dev0/tests/utils/pynguinml → pynguin-0.47.0/tests/ga/operators/selection}/__init__.py +0 -0
- {pynguin-0.46.0.dev0/tests/utils/stats → pynguin-0.47.0/tests/ga/stoppingconditions}/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/instrumentation/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/instrumentation/test_cfg.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/instrumentation/test_controldependencegraph.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/instrumentation/test_programgraph.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/instrumentation/test_version.py +0 -0
- {pynguin-0.46.0.dev0/tests/assertion/mutation_analysis/operators → pynguin-0.47.0/tests/large_language_model/prompts}/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/master_worker/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/master_worker/test_master.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/master_worker/test_worker.py +0 -0
- {pynguin-0.46.0.dev0/tests/evolution → pynguin-0.47.0/tests/resources}/__init__.py +0 -0
- {pynguin-0.46.0.dev0/tests/execution → pynguin-0.47.0/tests/resources/typeevalpy}/__init__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/resources/typeevalpy/dummy.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/resources/typeevalpy/dummy_gt.json +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/resources/typeevalpy/dummy_gt.json.license +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/test___main__.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/testcase/AGENTS.md +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/testutils.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/pynguinml/test_ml_parsing_utils.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/pynguinml/test_mlparameter.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/pynguinml/test_np_rng.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/stats/test_statistics.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/stats/test_statisticsbackend.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/test_atomicinteger.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/test_collection_utils.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/test_exceptions.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/test_fandango_faker_utils.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/test_fs_isolation.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/test_llm.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/test_mirror.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/test_mutation_utils.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/test_orderedset.py +0 -0
- {pynguin-0.46.0.dev0 → pynguin-0.47.0}/tests/utils/test_randomness.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
|
|
@@ -82,7 +80,7 @@ is a tool that allows developers to generate unit tests automatically.
|
|
|
82
80
|
Testing software is often considered to be a tedious task.
|
|
83
81
|
Thus, automated generation techniques have been proposed and mature tools exist—for
|
|
84
82
|
statically typed languages, such as Java.
|
|
85
|
-
There is, however, no fully
|
|
83
|
+
There is, however, no fully automated tool available that produces unit tests for
|
|
86
84
|
general-purpose programs in a dynamically typed language.
|
|
87
85
|
Pynguin is, to the best of our knowledge, the first tool that fills this gap
|
|
88
86
|
and allows the automated generation of unit tests for Python programs.
|
|
@@ -129,7 +127,7 @@ please report your experiences in using Pynguin to us.
|
|
|
129
127
|
## Prerequisites
|
|
130
128
|
|
|
131
129
|
Before you begin, ensure you have met the following requirements:
|
|
132
|
-
- You have installed Python 3.10 (the support for 3.11, 3.12, 3.13 and 3.14 is experimental).
|
|
130
|
+
- You have installed Python 3.10 (the support for 3.11, 3.12, 3.13, and 3.14 is experimental).
|
|
133
131
|
|
|
134
132
|
**Attention:** Pynguin now requires at least Python 3.10! Older versions are no longer
|
|
135
133
|
supported!
|
|
@@ -190,13 +188,16 @@ Pynguin is developed at the
|
|
|
190
188
|
[Chair of Software Engineering II](https://www.fim.uni-passau.de/lehrstuhl-fuer-software-engineering-ii/)
|
|
191
189
|
of the [University of Passau](https://www.uni-passau.de).
|
|
192
190
|
|
|
193
|
-
|
|
191
|
+
Maintainer: [Lukas Krodinger](https://github.com/LuKrO2011)
|
|
192
|
+
|
|
193
|
+
Former Maintainer: [Stephan Lukasczyk](https://codeberg.org/stephanlukasczyk)
|
|
194
194
|
|
|
195
195
|
Contributors:
|
|
196
196
|
- [Lukas Vögl](https://github.com/lvoegl)
|
|
197
197
|
- [Louis Leppelmann](https://github.com/Tudeldu)
|
|
198
198
|
- [Alexander Wüst](https://github.com/Ravaqor)
|
|
199
199
|
- [Altin Hajdari](https://github.com/AltinHajdari)
|
|
200
|
+
- [Ahmed Abidi](https://github.com/AhmedHedi0)
|
|
200
201
|
- [Abdelillah Aissani](https://github.com/Abassion)
|
|
201
202
|
- [Juan Altmayer Pizzorno](https://github.com/jaltmayerpizzorno)
|
|
202
203
|
- [Lucas Berg](https://github.com/BergLucas)
|
|
@@ -215,9 +216,9 @@ Contributors:
|
|
|
215
216
|
|
|
216
217
|
### Development using PyCharm.
|
|
217
218
|
|
|
218
|
-
If you want to use the PyCharm IDE you have to set up a few things:
|
|
219
|
+
If you want to use the PyCharm IDE, you have to set up a few things:
|
|
219
220
|
1. Import `pynguin` into PyCharm.
|
|
220
|
-
2. Let PyCharm configure
|
|
221
|
+
2. Let PyCharm configure a virtual environment using `poetry`.
|
|
221
222
|
3. Set the default test runner to `pytest`
|
|
222
223
|
4. Set the DocString format to `Google`
|
|
223
224
|
|
|
@@ -226,9 +227,9 @@ If you want to use the PyCharm IDE you have to set up a few things:
|
|
|
226
227
|
|
|
227
228
|
This project is licensed under the terms of the [MIT License](LICENSE.rst).
|
|
228
229
|
Pynguin was using the GNU Lesser General Public License (LGPL) until version 0.29.0,
|
|
229
|
-
its
|
|
230
|
+
its license was changed with version 0.30.0.
|
|
230
231
|
|
|
231
232
|
## Star History
|
|
232
233
|
|
|
233
|
-
[](https://star-history.dera.page/#se2p/pynguin)
|
|
234
235
|
|
|
@@ -18,7 +18,7 @@ is a tool that allows developers to generate unit tests automatically.
|
|
|
18
18
|
Testing software is often considered to be a tedious task.
|
|
19
19
|
Thus, automated generation techniques have been proposed and mature tools exist—for
|
|
20
20
|
statically typed languages, such as Java.
|
|
21
|
-
There is, however, no fully
|
|
21
|
+
There is, however, no fully automated tool available that produces unit tests for
|
|
22
22
|
general-purpose programs in a dynamically typed language.
|
|
23
23
|
Pynguin is, to the best of our knowledge, the first tool that fills this gap
|
|
24
24
|
and allows the automated generation of unit tests for Python programs.
|
|
@@ -65,7 +65,7 @@ please report your experiences in using Pynguin to us.
|
|
|
65
65
|
## Prerequisites
|
|
66
66
|
|
|
67
67
|
Before you begin, ensure you have met the following requirements:
|
|
68
|
-
- You have installed Python 3.10 (the support for 3.11, 3.12, 3.13 and 3.14 is experimental).
|
|
68
|
+
- You have installed Python 3.10 (the support for 3.11, 3.12, 3.13, and 3.14 is experimental).
|
|
69
69
|
|
|
70
70
|
**Attention:** Pynguin now requires at least Python 3.10! Older versions are no longer
|
|
71
71
|
supported!
|
|
@@ -126,13 +126,16 @@ Pynguin is developed at the
|
|
|
126
126
|
[Chair of Software Engineering II](https://www.fim.uni-passau.de/lehrstuhl-fuer-software-engineering-ii/)
|
|
127
127
|
of the [University of Passau](https://www.uni-passau.de).
|
|
128
128
|
|
|
129
|
-
|
|
129
|
+
Maintainer: [Lukas Krodinger](https://github.com/LuKrO2011)
|
|
130
|
+
|
|
131
|
+
Former Maintainer: [Stephan Lukasczyk](https://codeberg.org/stephanlukasczyk)
|
|
130
132
|
|
|
131
133
|
Contributors:
|
|
132
134
|
- [Lukas Vögl](https://github.com/lvoegl)
|
|
133
135
|
- [Louis Leppelmann](https://github.com/Tudeldu)
|
|
134
136
|
- [Alexander Wüst](https://github.com/Ravaqor)
|
|
135
137
|
- [Altin Hajdari](https://github.com/AltinHajdari)
|
|
138
|
+
- [Ahmed Abidi](https://github.com/AhmedHedi0)
|
|
136
139
|
- [Abdelillah Aissani](https://github.com/Abassion)
|
|
137
140
|
- [Juan Altmayer Pizzorno](https://github.com/jaltmayerpizzorno)
|
|
138
141
|
- [Lucas Berg](https://github.com/BergLucas)
|
|
@@ -151,9 +154,9 @@ Contributors:
|
|
|
151
154
|
|
|
152
155
|
### Development using PyCharm.
|
|
153
156
|
|
|
154
|
-
If you want to use the PyCharm IDE you have to set up a few things:
|
|
157
|
+
If you want to use the PyCharm IDE, you have to set up a few things:
|
|
155
158
|
1. Import `pynguin` into PyCharm.
|
|
156
|
-
2. Let PyCharm configure
|
|
159
|
+
2. Let PyCharm configure a virtual environment using `poetry`.
|
|
157
160
|
3. Set the default test runner to `pytest`
|
|
158
161
|
4. Set the DocString format to `Google`
|
|
159
162
|
|
|
@@ -162,8 +165,8 @@ If you want to use the PyCharm IDE you have to set up a few things:
|
|
|
162
165
|
|
|
163
166
|
This project is licensed under the terms of the [MIT License](LICENSE.rst).
|
|
164
167
|
Pynguin was using the GNU Lesser General Public License (LGPL) until version 0.29.0,
|
|
165
|
-
its
|
|
168
|
+
its license was changed with version 0.30.0.
|
|
166
169
|
|
|
167
170
|
## Star History
|
|
168
171
|
|
|
169
|
-
[](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
|