pynguin 0.34.0__tar.gz → 0.35.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.34.0 → pynguin-0.35.0}/PKG-INFO +15 -12
- {pynguin-0.34.0 → pynguin-0.35.0}/README.md +3 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/pyproject.toml +117 -95
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/__version__.py +1 -1
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/analyses/constants.py +11 -11
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/analyses/controlflow.py +12 -11
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/analyses/module.py +76 -17
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/analyses/modulecomplexity.py +14 -12
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/analyses/seeding.py +14 -10
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/analyses/syntaxtree.py +13 -11
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/analyses/typesystem.py +60 -29
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/assertion/assertion.py +7 -7
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/assertion/assertion_to_ast.py +4 -1
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/assertion/assertion_trace.py +9 -9
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/assertion/assertiongenerator.py +1 -1
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/assertion/assertiontraceobserver.py +3 -2
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/cli.py +1 -4
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/algorithms/abstractmosaalgorithm.py +2 -2
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/algorithms/dynamosaalgorithm.py +10 -10
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/algorithms/generationalgorithm.py +7 -7
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/algorithms/mosaalgorithm.py +3 -3
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/algorithms/randomalgorithm.py +3 -3
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/algorithms/wholesuitealgorithm.py +2 -3
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/chromosome.py +18 -54
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/computations.py +12 -13
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/coveragegoals.py +13 -9
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/generationalgorithmfactory.py +6 -6
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/operators/ranking.py +2 -2
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/searchobserver.py +2 -2
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/stoppingcondition.py +3 -3
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/testcasechromosome.py +4 -4
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/testcasefactory.py +3 -3
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/testsuitechromosome.py +25 -34
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/generator.py +18 -17
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/instrumentation/instrumentation.py +28 -28
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/instrumentation/machinery.py +4 -3
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/slicer/dynamicslicer.py +26 -26
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/slicer/executionflowbuilder.py +11 -10
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/slicer/stack/stackeffect.py +5 -5
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/slicer/stack/stacksimulation.py +8 -8
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/slicer/statementslicingobserver.py +9 -9
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/testcase/defaulttestcase.py +2 -3
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/testcase/execution.py +57 -31
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/testcase/export.py +12 -11
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/testcase/statement.py +27 -21
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/testcase/statement_to_ast.py +30 -20
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/testcase/testcase.py +2 -2
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/testcase/testfactory.py +23 -13
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/testcase/variablereference.py +13 -9
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/ast_util.py +7 -6
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/controlflowdistance.py +8 -3
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/generic/genericaccessibleobject.py +4 -6
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/orderedset.py +14 -24
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/randomness.py +1 -1
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/report.py +2 -2
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/statistics/outputvariablefactory.py +5 -7
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/statistics/statistics.py +37 -19
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/statistics/statisticsbackend.py +2 -2
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/type_utils.py +2 -2
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/typetracing.py +9 -8
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/analyses/test_module.py +15 -3
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/assertion/test_assertion_trace.py +6 -6
- pynguin-0.35.0/tests/fixtures/cluster/alias_module.py +14 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/algorithms/test_dynamosaalgorithm.py +14 -6
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/test_computations.py +6 -6
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/test_coveragegoals.py +3 -3
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/instrumentation/test_instrumentation.py +22 -1
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/slicer/util.py +12 -12
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/test_generator.py +7 -2
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/test_testfactory.py +43 -27
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/stats/test_searchstatistics.py +2 -2
- {pynguin-0.34.0 → pynguin-0.35.0}/LICENSE.rst +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/__init__.py +4 -4
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/__main__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/analyses/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/analyses/type4py_api.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/assertion/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/assertion/mutation_analysis/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/assertion/mutation_analysis/mutationadapter.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/configuration.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/algorithms/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/algorithms/archive.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/algorithms/mioalgorithm.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/algorithms/randomsearchalgorithm.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/chromosomefactory.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/chromosomevisitor.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/operators/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/operators/comparator.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/operators/crossover.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/operators/selection.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/postprocess.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/testcasechromosomefactory.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/ga/testsuitechromosomefactory.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/instrumentation/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/resources/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/resources/coverage-template.html +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/slicer/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/slicer/executedinstruction.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/slicer/stack/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/testcase/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/testcase/testcase_to_ast.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/testcase/testcasevisitor.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/atomicinteger.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/collection_utils.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/exceptions.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/generic/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/mirror.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/mutation_utils.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/namingscope.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/opcodes.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/statistics/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/statistics/runtimevariable.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/src/pynguin/utils/statistics/statisticsobserver.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/analyses/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/analyses/test_cfg.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/analyses/test_constants.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/analyses/test_controldependencegraph.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/analyses/test_dominatortree.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/analyses/test_initialpopulationseeding.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/analyses/test_modulecomplexity.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/analyses/test_programgraph.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/analyses/test_seeding.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/analyses/test_staticconstantseeding.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/analyses/test_syntaxtree.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/analyses/test_type4py_api.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/analyses/test_typesystem.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/assertion/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/assertion/mutation_analysis/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/assertion/mutation_analysis/test_mutationadapter.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/assertion/test_assertion.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/assertion/test_assertion_generation_integration.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/assertion/test_assertion_to_ast.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/assertion/test_assertiongenerator.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/assertion/test_assertiontraceobserver.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/conftest.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/accessibles/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/accessibles/accessible.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/branchcoverage/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/branchcoverage/nestedbranches.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/branchcoverage/nobranches.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/branchcoverage/singlebranches.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/branchcoverage/twomethodsinglebranches.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/abstract.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/async_class_gen.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/async_class_method.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/async_func.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/async_gen.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/attributes.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/blacklist.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/blacklist_transitive.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/comments.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/complex_dependencies.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/complex_dependency.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/conditional_import.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/dependency.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/diamond_bottom.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/diamond_left.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/diamond_right.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/diamond_top.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/enums.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/import_dependency.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/inheritance.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/nested_functions.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/no_any_annotations.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/no_dependencies.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/overridden_inherited_methods.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/simple_dependencies.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/typing_parameters.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/cluster/uses_async_dependency.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/duckmock/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/duckmock/complex.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/assertions.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/basket.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/calculator.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/calculator_simple.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/collections.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/difficult.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/dummies.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/dynamosa_example.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/enums.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/exceptions.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/flaky.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/impossible.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/inheritance.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/loop.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/monkey.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/nested.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/objects.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/private_methods.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/queue.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/simple.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/triangle.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/type_inference.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/type_tracing/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/type_tracing/geometry.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/type_tracing/invoice.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/type_tracing/large_test_cluster.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/examples/type_tracing/mixed.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/grammar/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/grammar/parameters.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/instrumentation/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/instrumentation/comparison.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/instrumentation/inherited.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/instrumentation/mixed.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/instrumentation/simple.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/linecoverage/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/linecoverage/artificial_none.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/linecoverage/emptyfile.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/linecoverage/exception.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/linecoverage/list.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/linecoverage/plus.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/linecoverage/setter_getter.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/mutation/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/mutation/exception.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/mutation/expected.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/mutation/mutation.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/mutation/timeout.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/programgraph/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/programgraph/samples.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/programgraph/whileloop.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/dynamicseeding/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/dynamicseeding/dynamicseedingdummies.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/initialpopulationseeding/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/initialpopulationseeding/dummycontainer.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/assertseed_test_.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/classseed_test_.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collfuncseed_test_.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/collseed_test_.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/nestedseed_test_.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notknowncall_test_.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/notprimseed_test_.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/primitiveseed_test_.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/triangleseed_test_.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongassignseed_test_.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/initialpopulationseeding/seedmodules/wrongfunctionnameseed_test_.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/staticconstantseeding/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/staticconstantseeding/dummy/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/staticconstantseeding/dummy/dummy.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/seeding/staticconstantseeding/dummy/empty.so +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/slicer/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/slicer/attribute_dependencies.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/slicer/closure.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/slicer/generator.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/slicer/immutable_attribute_dependency.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/slicer/import_star_def.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/slicer/import_star_main.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/slicer/partial_cover_dependency.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/slicer/simple_call.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/slicer/simple_call_arg.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/test.conf +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/test.conf.license +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/tests/typeinference/test_stubstrategy.pyi +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/type_tracing/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/type_tracing/guess_params.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/type_tracing/return_types.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/types/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/types/outside.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/types/subtyping.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/fixtures/types/symbols.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/algorithms/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/algorithms/test_archive.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/algorithms/test_generationalgorithm.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/algorithms/test_integration_mosaalgorithm.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/algorithms/test_integration_varioussearchalgorithms.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/algorithms/test_mioalgorithm.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/algorithms/test_mosaalgorithm.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/algorithms/test_randomalgorithm.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/operators/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/operators/crossover/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/operators/crossover/test_singlepointrelativecrossover.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/operators/ranking/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/operators/ranking/test_rankingfunction.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/operators/selection/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/operators/selection/test_rankselection.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/operators/selection/test_selection.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/operators/selection/test_tournamentselection.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/operators/test_dominancecomparator.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/operators/test_preferencesortingcomparator.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/stoppingconditions/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/stoppingconditions/test_coverageplateaustoppingcondition.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/stoppingconditions/test_maxcoveragestoppingcondition.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/stoppingconditions/test_maxiterationsstoppingcondition.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/stoppingconditions/test_maxstatementstoppingcondition.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/stoppingconditions/test_maxtestsstoppingcondition.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/stoppingconditions/test_maxtimestoppingcondition.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/stoppingconditions/test_minimumcoverageplateaustoppingcondition.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/stoppingconditions/test_stoppingcondition.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/test_chromosome.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/test_chromosomefactory.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/test_computations_cache.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/test_computations_fitness_utilities.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/test_generationalgorithmfactory.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/test_postprocess.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/test_testcasechromosome.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/test_testcasefactory.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/ga/test_testsuitechromosome.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/instrumentation/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/instrumentation/test_machinery.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/slicer/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/slicer/stack/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/slicer/stack/test_stack_effect.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/slicer/test_assertionslicer.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/slicer/test_dependencies.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/slicer/test_expected_failures.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/slicer/test_language_features.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/slicer/test_statementslicer.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/test___main__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/test_cli.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/execution/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/execution/test_executedinstruction.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/execution/test_executioncontext.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/execution/test_executionresult.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/execution/test_executiontrace.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/execution/test_executiontracer.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/execution/test_moduleprovider.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/execution/test_testcaseexecutor_integration.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/execution/test_typetracing.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/export/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/export/conftest.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/export/test_export.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/statements/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/statements/test_assignmentstatement.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/statements/test_collectionstatements.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/statements/test_fieldstatement.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/statements/test_parameterizedstatements.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/statements/test_primitivestatements.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/test_benchmark.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/test_defaulttestcase.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/test_statement_to_ast.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/test_testcase_integration.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/test_testcase_to_ast_integration.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/variable/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testcase/variable/test_variablereference.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/testutils.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/generic/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/generic/test_genericaccessibleobject.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/stats/__init__.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/stats/test_outputvariablefactory.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/stats/test_statistics.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/stats/test_statisticsbackend.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/test_atomicinteger.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/test_collection_utils.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/test_controlflowdistance.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/test_exceptions.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/test_mirror.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/test_mutation_utils.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/test_namingscope.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/test_orderedset.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/test_randomness.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/test_report.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/test_type_utils.py +0 -0
- {pynguin-0.34.0 → pynguin-0.35.0}/tests/utils/test_typetracing.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pynguin
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.35.0
|
|
4
4
|
Summary: Pynguin is a tool for automated unit test generation for Python
|
|
5
5
|
Home-page: https://www.pynguin.eu
|
|
6
6
|
License: MIT
|
|
@@ -24,20 +24,20 @@ Classifier: Topic :: Education :: Testing
|
|
|
24
24
|
Classifier: Topic :: Software Development :: Testing
|
|
25
25
|
Classifier: Topic :: Software Development :: Testing :: Unit
|
|
26
26
|
Classifier: Typing :: Typed
|
|
27
|
-
Requires-Dist: Jinja2 (>=3.1.
|
|
27
|
+
Requires-Dist: Jinja2 (>=3.1.3,<4.0.0)
|
|
28
28
|
Requires-Dist: MutPy-Pynguin (>=0.7.1,<0.8.0)
|
|
29
|
-
Requires-Dist: Pygments (>=2.
|
|
29
|
+
Requires-Dist: Pygments (>=2.17.2,<3.0.0)
|
|
30
30
|
Requires-Dist: asciitree (>=0.3.3,<0.4.0)
|
|
31
|
-
Requires-Dist: astroid (>=
|
|
32
|
-
Requires-Dist: black (>=
|
|
33
|
-
Requires-Dist: bytecode (>=0.
|
|
34
|
-
Requires-Dist: jellyfish (>=1.0.
|
|
35
|
-
Requires-Dist: libcst (>=1.0
|
|
36
|
-
Requires-Dist: networkx (>=3.
|
|
37
|
-
Requires-Dist: pytest (>=
|
|
31
|
+
Requires-Dist: astroid (>=3.0.3,<4.0.0)
|
|
32
|
+
Requires-Dist: black (>=24.2.0,<25.0.0)
|
|
33
|
+
Requires-Dist: bytecode (>=0.15.1,<0.16.0)
|
|
34
|
+
Requires-Dist: jellyfish (>=1.0.3,<2.0.0)
|
|
35
|
+
Requires-Dist: libcst (>=1.2.0,<2.0.0)
|
|
36
|
+
Requires-Dist: networkx (>=3.2,<4.0)
|
|
37
|
+
Requires-Dist: pytest (>=8.0.1,<9.0.0)
|
|
38
38
|
Requires-Dist: requests (>=2.31.0,<3.0.0)
|
|
39
|
-
Requires-Dist: rich (>=13.
|
|
40
|
-
Requires-Dist: simple-parsing (>=0.1.
|
|
39
|
+
Requires-Dist: rich (>=13.7.0,<14.0.0)
|
|
40
|
+
Requires-Dist: simple-parsing (>=0.1.5,<0.2.0)
|
|
41
41
|
Requires-Dist: typing_inspect (>=0.9.0,<0.10.0)
|
|
42
42
|
Project-URL: Documentation, https://pynguin.readthedocs.io
|
|
43
43
|
Project-URL: Repository, https://github.com/se2p/pynguin
|
|
@@ -85,6 +85,7 @@ and allows the automated generation of unit tests for Python programs.
|
|
|
85
85
|
[](https://doi.org/10.5281/zenodo.3989840)
|
|
86
86
|
[](https://api.reuse.software/info/github.com/se2p/pynguin)
|
|
87
87
|
[](https://pepy.tech/project/pynguin)
|
|
88
|
+
[](https://archive.softwareheritage.org/browse/origin/?origin_url=https://github.com/se2p/pynguin)
|
|
88
89
|
|
|
89
90
|
|
|
90
91
|

|
|
@@ -176,6 +177,8 @@ of the [University of Passau](https://www.uni-passau.de).
|
|
|
176
177
|
Maintainer: [Stephan Lukasczyk](https://github.com/stephanlukasczyk)
|
|
177
178
|
|
|
178
179
|
Contributors:
|
|
180
|
+
- [Juan Altmayer Pizzorno](https://github.com/jaltmayerpizzorno)
|
|
181
|
+
- [Lucas Berg](https://github.com/BergLucas)
|
|
179
182
|
- [Tucker Blue](https://github.com/tuckcodes)
|
|
180
183
|
- [Gordon Fraser](https://github.com/gofraser)
|
|
181
184
|
- [Abdur-Rahmaan Janhangeer](https://github.com/Abdur-rahmaanJ)
|
|
@@ -40,6 +40,7 @@ and allows the automated generation of unit tests for Python programs.
|
|
|
40
40
|
[](https://doi.org/10.5281/zenodo.3989840)
|
|
41
41
|
[](https://api.reuse.software/info/github.com/se2p/pynguin)
|
|
42
42
|
[](https://pepy.tech/project/pynguin)
|
|
43
|
+
[](https://archive.softwareheritage.org/browse/origin/?origin_url=https://github.com/se2p/pynguin)
|
|
43
44
|
|
|
44
45
|
|
|
45
46
|

|
|
@@ -131,6 +132,8 @@ of the [University of Passau](https://www.uni-passau.de).
|
|
|
131
132
|
Maintainer: [Stephan Lukasczyk](https://github.com/stephanlukasczyk)
|
|
132
133
|
|
|
133
134
|
Contributors:
|
|
135
|
+
- [Juan Altmayer Pizzorno](https://github.com/jaltmayerpizzorno)
|
|
136
|
+
- [Lucas Berg](https://github.com/BergLucas)
|
|
134
137
|
- [Tucker Blue](https://github.com/tuckcodes)
|
|
135
138
|
- [Gordon Fraser](https://github.com/gofraser)
|
|
136
139
|
- [Abdur-Rahmaan Janhangeer](https://github.com/Abdur-rahmaanJ)
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
[tool.poetry]
|
|
6
6
|
name = "pynguin"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.35.0"
|
|
8
8
|
description = "Pynguin is a tool for automated unit test generation for Python"
|
|
9
9
|
authors = ["Stephan Lukasczyk <stephan@pynguin.eu>"]
|
|
10
10
|
license = "MIT"
|
|
@@ -44,46 +44,47 @@ include = [
|
|
|
44
44
|
|
|
45
45
|
[tool.poetry.dependencies]
|
|
46
46
|
python = ">=3.10, <3.11"
|
|
47
|
-
astroid = "^
|
|
48
|
-
black = "^
|
|
49
|
-
bytecode = "^0.
|
|
50
|
-
jellyfish = "^1.0.
|
|
51
|
-
Jinja2 = "^3.1.
|
|
47
|
+
astroid = "^3.0.3"
|
|
48
|
+
black = "^24.2.0"
|
|
49
|
+
bytecode = "^0.15.1"
|
|
50
|
+
jellyfish = "^1.0.3"
|
|
51
|
+
Jinja2 = "^3.1.3"
|
|
52
52
|
MutPy-Pynguin = "^0.7.1"
|
|
53
|
-
networkx = "^3.
|
|
54
|
-
rich = "^13.
|
|
55
|
-
Pygments = "^2.
|
|
56
|
-
pytest = "^
|
|
57
|
-
simple-parsing = "^0.1.
|
|
53
|
+
networkx = "^3.2"
|
|
54
|
+
rich = "^13.7.0"
|
|
55
|
+
Pygments = "^2.17.2"
|
|
56
|
+
pytest = "^8.0.1"
|
|
57
|
+
simple-parsing = "^0.1.5"
|
|
58
58
|
typing_inspect = "^0.9.0"
|
|
59
59
|
asciitree = "^0.3.3"
|
|
60
|
-
libcst = "^1.0
|
|
60
|
+
libcst = "^1.2.0"
|
|
61
61
|
requests = "^2.31.0"
|
|
62
62
|
|
|
63
63
|
[tool.poetry.group.dev.dependencies]
|
|
64
|
-
black = "^
|
|
65
|
-
isort = {extras = ["pyproject"], version = "^5.
|
|
66
|
-
mypy = "^1.
|
|
67
|
-
pre-commit = "^3.
|
|
68
|
-
pyupgrade = "^3.
|
|
69
|
-
types-requests = "^2.31.0
|
|
64
|
+
black = "^24.2.0"
|
|
65
|
+
isort = {extras = ["pyproject"], version = "^5.13.2"}
|
|
66
|
+
mypy = "^1.8.0"
|
|
67
|
+
pre-commit = "^3.6.2"
|
|
68
|
+
pyupgrade = "^3.15.1"
|
|
69
|
+
types-requests = "^2.31.0"
|
|
70
70
|
requests-mock = "^1.11.0"
|
|
71
|
-
ruff = "^0.
|
|
71
|
+
ruff = "^0.2"
|
|
72
72
|
|
|
73
73
|
[tool.poetry.group.docs.dependencies]
|
|
74
|
-
sphinx = "^7.
|
|
75
|
-
sphinx-autodoc-typehints = "^
|
|
74
|
+
sphinx = "^7.2.6"
|
|
75
|
+
sphinx-autodoc-typehints = "^2.0"
|
|
76
76
|
sphinx-hoverxref = "^1.3.0"
|
|
77
|
+
sphinx-rtd-theme = "^2.0.0"
|
|
77
78
|
sphinx-selective-exclude = "^1.0.3"
|
|
78
79
|
|
|
79
80
|
[tool.poetry.group.test.dependencies]
|
|
80
|
-
coverage = "^7.
|
|
81
|
-
hypothesis = "^6.
|
|
82
|
-
pytest = "^
|
|
81
|
+
coverage = "^7.4.2"
|
|
82
|
+
hypothesis = "^6.98.9"
|
|
83
|
+
pytest = "^8.0.1"
|
|
83
84
|
pytest-cov = "^4.1.0"
|
|
84
|
-
pytest-mock = "^3.
|
|
85
|
+
pytest-mock = "^3.12.0"
|
|
85
86
|
pytest-picked = "^0.5.0"
|
|
86
|
-
pytest-sugar = "^0.
|
|
87
|
+
pytest-sugar = "^1.0.0"
|
|
87
88
|
|
|
88
89
|
[tool.poetry.scripts]
|
|
89
90
|
pynguin = "pynguin.cli:main"
|
|
@@ -174,81 +175,102 @@ build-backend = "poetry.core.masonry.api"
|
|
|
174
175
|
# Assume Python 3.10.
|
|
175
176
|
target-version = "py310"
|
|
176
177
|
line-length = 88
|
|
177
|
-
|
|
178
|
+
preview = true
|
|
179
|
+
src = ["src", "tests"]
|
|
180
|
+
exclude = [
|
|
181
|
+
".bzr",
|
|
182
|
+
".direnv",
|
|
183
|
+
".eggs",
|
|
184
|
+
".git",
|
|
185
|
+
".hg",
|
|
186
|
+
".mypy_cache",
|
|
187
|
+
".nox",
|
|
188
|
+
".pants.d",
|
|
189
|
+
".ruff_cache",
|
|
190
|
+
".svn",
|
|
191
|
+
".tox",
|
|
192
|
+
".venv",
|
|
193
|
+
"__pypackages__",
|
|
194
|
+
"_build",
|
|
195
|
+
"buck-out",
|
|
196
|
+
"build",
|
|
197
|
+
"dist",
|
|
198
|
+
"node_modules",
|
|
199
|
+
"venv",
|
|
200
|
+
"tests/fixtures/*.py",
|
|
201
|
+
"tests/fixtures/*.pyi",
|
|
202
|
+
]
|
|
203
|
+
|
|
204
|
+
[tool.ruff.lint]
|
|
178
205
|
select = [
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
206
|
+
"A", # flake8-builtins
|
|
207
|
+
"ARG", # flake8-unused-arguments
|
|
208
|
+
"B", # bugbear
|
|
209
|
+
"BLE", # flake8-blind-except
|
|
210
|
+
"CPY", # flake8-copyright
|
|
211
|
+
"C4", # flake8-comprehensions
|
|
212
|
+
"C90", # mccabe
|
|
213
|
+
"D", # pydocstyle
|
|
214
|
+
"DTZ", # flake8-datetimez
|
|
215
|
+
"E", # pycodestyle
|
|
216
|
+
"ERA", # flake8-eradicate
|
|
217
|
+
"F", # pyflakes
|
|
218
|
+
"FA", # flake8-future-annotations
|
|
219
|
+
"FBT", # flake8-boolean-trap
|
|
220
|
+
"FIX", # flake8-fixme
|
|
221
|
+
"FLY", # flynt
|
|
222
|
+
"FURB", # refurb
|
|
223
|
+
"G", # flake8-logging-format
|
|
224
|
+
"ICN", # flake8-import-conventions
|
|
225
|
+
"INT", # flake8-gettext
|
|
226
|
+
"ISC", # flake8-implicit-str-concat
|
|
227
|
+
"LOG", # flake8-logging
|
|
228
|
+
"N", # flake8-naming
|
|
229
|
+
"NPY", # numpy
|
|
230
|
+
"PERF", # perflint
|
|
231
|
+
"PGH", # pygrep-hooks
|
|
232
|
+
"PIE", # flake8-pie
|
|
233
|
+
"PL", # pylint
|
|
234
|
+
"PT", # flake8-pytest-style
|
|
235
|
+
"PTH", # flake8-use-pathlib
|
|
236
|
+
"PYI", # flake8-pyi
|
|
237
|
+
"Q", # flake8-quotes
|
|
238
|
+
"RET", # flake8-return
|
|
239
|
+
"RSE", # flake8-raise
|
|
240
|
+
"RUF", # ruff
|
|
241
|
+
"S", # flake8-bandig
|
|
242
|
+
"SIM", # flake8-simplify
|
|
243
|
+
"SLF", # flake8-self
|
|
244
|
+
"SLOT", # flake8-slots
|
|
245
|
+
"TCH", # flake8-type-checking
|
|
246
|
+
"TID", # flake8-tidy-imports
|
|
247
|
+
"T20", # flake8-print
|
|
248
|
+
"UP", # pyupgrade
|
|
249
|
+
"W", # pycodestyle
|
|
212
250
|
]
|
|
213
251
|
ignore = [
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
252
|
+
"ARG002", # unused method argument
|
|
253
|
+
"B019", # functools.lru_cache might cause memory leaks
|
|
254
|
+
"CPY001", # missing copyright notice at top of file
|
|
255
|
+
"D105", # missing docstrings in magic methods
|
|
256
|
+
"FIX002", # valid TODO comments
|
|
257
|
+
"PLR0911", # do not complain about too many return statements
|
|
258
|
+
"PLR0912", # do not complain about too many branches
|
|
259
|
+
"PLR0913", # do not complain about too many arguments to function call
|
|
260
|
+
"PLR2004", # magic values in comparisons
|
|
261
|
+
"PLR6301", # method could be a function, class method, or static method
|
|
262
|
+
"S101", # do not complain about using assert statements
|
|
222
263
|
]
|
|
223
|
-
#
|
|
224
|
-
exclude = [
|
|
225
|
-
".bzr",
|
|
226
|
-
".direnv",
|
|
227
|
-
".eggs",
|
|
228
|
-
".git",
|
|
229
|
-
".hg",
|
|
230
|
-
".mypy_cache",
|
|
231
|
-
".nox",
|
|
232
|
-
".pants.d",
|
|
233
|
-
".ruff_cache",
|
|
234
|
-
".svn",
|
|
235
|
-
".tox",
|
|
236
|
-
".venv",
|
|
237
|
-
"__pypackages__",
|
|
238
|
-
"_build",
|
|
239
|
-
"buck-out",
|
|
240
|
-
"build",
|
|
241
|
-
"dist",
|
|
242
|
-
"node_modules",
|
|
243
|
-
"venv",
|
|
244
|
-
]
|
|
245
|
-
per-file-ignores = {}
|
|
246
|
-
# Allow unused variables when underscore-prefixed.
|
|
264
|
+
# Allow unused variables when underscore-prefixed:
|
|
247
265
|
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
|
|
248
266
|
|
|
249
|
-
[tool.ruff.mccabe]
|
|
250
|
-
# Unlike Flake8, default to a complexity level of 10.
|
|
267
|
+
[tool.ruff.lint.mccabe]
|
|
251
268
|
max-complexity = 10
|
|
252
269
|
|
|
253
|
-
[tool.ruff.pydocstyle]
|
|
270
|
+
[tool.ruff.lint.pydocstyle]
|
|
254
271
|
convention = "google"
|
|
272
|
+
|
|
273
|
+
[tool.ruff.lint.per-file-ignores]
|
|
274
|
+
"tests/**/*.py" = [
|
|
275
|
+
"S101", # Use of `assert` detected
|
|
276
|
+
]
|
|
@@ -212,13 +212,13 @@ class DynamicConstantProvider(DelegatingConstantProvider):
|
|
|
212
212
|
"isdecimal": lambda value: "non_decimal" if value.isdecimal() else "0123456789",
|
|
213
213
|
"isalpha": lambda value: f"{value}1" if value.isalpha() else "isalpha",
|
|
214
214
|
"isdigit": lambda value: f"{value}_" if value.isdigit() else "0",
|
|
215
|
-
"isidentifier": lambda value:
|
|
216
|
-
|
|
217
|
-
|
|
215
|
+
"isidentifier": lambda value: (
|
|
216
|
+
f"{value}!" if value.isidentifier() else "is_Identifier"
|
|
217
|
+
),
|
|
218
218
|
"isnumeric": lambda value: f"{value}A" if value.isnumeric() else "012345",
|
|
219
|
-
"isprintable": lambda value:
|
|
220
|
-
|
|
221
|
-
|
|
219
|
+
"isprintable": lambda value: (
|
|
220
|
+
f"{value}{os.linesep}" if value.isprintable() else "is_printable"
|
|
221
|
+
),
|
|
222
222
|
"isspace": lambda value: f"{value}a" if value.isspace() else " ",
|
|
223
223
|
"istitle": lambda value: f"{value} AAA" if value.istitle() else "Is Title",
|
|
224
224
|
}
|
|
@@ -311,21 +311,21 @@ class _ConstantCollector(ast.NodeVisitor):
|
|
|
311
311
|
self._pool = ConstantPool()
|
|
312
312
|
self._string_expressions: OrderedSet[str] = OrderedSet()
|
|
313
313
|
|
|
314
|
-
def visit_Constant(self, node: ast.Constant):
|
|
314
|
+
def visit_Constant(self, node: ast.Constant): # noqa: N802
|
|
315
315
|
if type(node.value) in typing.get_args(ConstantTypes):
|
|
316
316
|
self._pool.add_constant(node.value)
|
|
317
317
|
return self.generic_visit(node)
|
|
318
318
|
|
|
319
|
-
def visit_Module(self, node: ast.Module):
|
|
319
|
+
def visit_Module(self, node: ast.Module): # noqa: N802
|
|
320
320
|
return self._visit_doc_string(node)
|
|
321
321
|
|
|
322
|
-
def visit_FunctionDef(self, node: ast.FunctionDef):
|
|
322
|
+
def visit_FunctionDef(self, node: ast.FunctionDef): # noqa: N802
|
|
323
323
|
return self._visit_doc_string(node)
|
|
324
324
|
|
|
325
|
-
def visit_ClassDef(self, node: ast.ClassDef):
|
|
325
|
+
def visit_ClassDef(self, node: ast.ClassDef): # noqa: N802
|
|
326
326
|
return self._visit_doc_string(node)
|
|
327
327
|
|
|
328
|
-
def visit_AsyncFunctionDef(self, node: ast.AsyncFunctionDef):
|
|
328
|
+
def visit_AsyncFunctionDef(self, node: ast.AsyncFunctionDef): # noqa: N802
|
|
329
329
|
return self._visit_doc_string(node)
|
|
330
330
|
|
|
331
331
|
def _visit_doc_string(
|
|
@@ -39,6 +39,7 @@ class ProgramGraphNode:
|
|
|
39
39
|
def __init__(
|
|
40
40
|
self,
|
|
41
41
|
index: int,
|
|
42
|
+
*,
|
|
42
43
|
offset: int = 0,
|
|
43
44
|
basic_block: BasicBlock | None = None,
|
|
44
45
|
is_artificial: bool = False,
|
|
@@ -120,7 +121,7 @@ class ProgramGraphNode:
|
|
|
120
121
|
"""
|
|
121
122
|
self._predicate_id = predicate_id
|
|
122
123
|
|
|
123
|
-
def __eq__(self, other:
|
|
124
|
+
def __eq__(self, other: object) -> bool:
|
|
124
125
|
if not isinstance(other, ProgramGraphNode):
|
|
125
126
|
return False
|
|
126
127
|
if self is other:
|
|
@@ -148,7 +149,7 @@ class ProgramGraphNode:
|
|
|
148
149
|
else:
|
|
149
150
|
arg = repr(arg)
|
|
150
151
|
formatted = instr.name # type: ignore[union-attr]
|
|
151
|
-
if arg
|
|
152
|
+
if arg:
|
|
152
153
|
formatted += f" {arg}"
|
|
153
154
|
instructions.append(formatted)
|
|
154
155
|
result += "\n" + "\n".join(instructions)
|
|
@@ -425,10 +426,10 @@ class CFG(ProgramGraph[ProgramGraphNode]):
|
|
|
425
426
|
"""
|
|
426
427
|
reversed_cfg = CFG(cfg.bytecode_cfg())
|
|
427
428
|
|
|
428
|
-
reversed_cfg._graph = cfg._graph.reverse(copy=True)
|
|
429
|
+
reversed_cfg._graph = cfg._graph.reverse(copy=True) # noqa: SLF001
|
|
429
430
|
return reversed_cfg
|
|
430
431
|
|
|
431
|
-
def reversed(self) -> CFG:
|
|
432
|
+
def reversed(self) -> CFG:
|
|
432
433
|
"""Provides the reversed graph of this graph.
|
|
433
434
|
|
|
434
435
|
Returns:
|
|
@@ -450,7 +451,7 @@ class CFG(ProgramGraph[ProgramGraphNode]):
|
|
|
450
451
|
ControlFlowGraph()
|
|
451
452
|
) # TODO(fk) Cloning the bytecode cfg is complicated.
|
|
452
453
|
|
|
453
|
-
copy._graph = cfg._graph.copy()
|
|
454
|
+
copy._graph = cfg._graph.copy() # noqa: SLF001
|
|
454
455
|
return copy
|
|
455
456
|
|
|
456
457
|
def copy(self) -> CFG:
|
|
@@ -486,16 +487,16 @@ class CFG(ProgramGraph[ProgramGraphNode]):
|
|
|
486
487
|
if isinstance(last_instr, Instr) and (
|
|
487
488
|
last_instr.is_cond_jump() or last_instr.opcode == op.FOR_ITER
|
|
488
489
|
):
|
|
489
|
-
if last_instr.opcode in
|
|
490
|
+
if last_instr.opcode in {op.POP_JUMP_IF_TRUE, op.JUMP_IF_TRUE_OR_POP}:
|
|
490
491
|
# These jump to arg if ToS is True
|
|
491
492
|
true_branch = target_block
|
|
492
493
|
false_branch = next_block
|
|
493
|
-
elif last_instr.opcode in
|
|
494
|
+
elif last_instr.opcode in {
|
|
494
495
|
op.POP_JUMP_IF_FALSE,
|
|
495
496
|
op.JUMP_IF_FALSE_OR_POP,
|
|
496
497
|
op.JUMP_IF_NOT_EXC_MATCH,
|
|
497
498
|
op.FOR_ITER,
|
|
498
|
-
|
|
499
|
+
}:
|
|
499
500
|
# These jump to arg if ToS is False, is Empty or if Exc does
|
|
500
501
|
# not match.
|
|
501
502
|
true_branch = next_block
|
|
@@ -635,9 +636,9 @@ class DominatorTree(ProgramGraph[ProgramGraphNode]):
|
|
|
635
636
|
Returns:
|
|
636
637
|
The dominance tree for the control-flow graph
|
|
637
638
|
"""
|
|
638
|
-
dominance: dict[
|
|
639
|
-
|
|
640
|
-
|
|
639
|
+
dominance: dict[ProgramGraphNode, set[ProgramGraphNode]] = (
|
|
640
|
+
DominatorTree._calculate_dominance(graph)
|
|
641
|
+
)
|
|
641
642
|
for dominance_node, nodes in dominance.items():
|
|
642
643
|
nodes.discard(dominance_node)
|
|
643
644
|
dominance_tree = DominatorTree()
|
|
@@ -21,6 +21,7 @@ import queue
|
|
|
21
21
|
import typing
|
|
22
22
|
|
|
23
23
|
from collections import defaultdict
|
|
24
|
+
from pathlib import Path
|
|
24
25
|
from types import BuiltinFunctionType
|
|
25
26
|
from types import FunctionType
|
|
26
27
|
from types import GenericAlias
|
|
@@ -227,7 +228,45 @@ class _ModuleParseResult:
|
|
|
227
228
|
type4py_data: Type4pyData | None
|
|
228
229
|
|
|
229
230
|
|
|
230
|
-
def
|
|
231
|
+
def import_module(module_name: str) -> ModuleType:
|
|
232
|
+
"""Imports a module by name.
|
|
233
|
+
|
|
234
|
+
Unlike the built-in :py:func:`importlib.import_module`, this function also supports
|
|
235
|
+
importing module aliases.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
module_name: The fully-qualified name of the module
|
|
239
|
+
|
|
240
|
+
Returns:
|
|
241
|
+
The imported module
|
|
242
|
+
"""
|
|
243
|
+
try:
|
|
244
|
+
return importlib.import_module(module_name)
|
|
245
|
+
except ModuleNotFoundError as error:
|
|
246
|
+
try:
|
|
247
|
+
package_name, submodule_name = module_name.rsplit(".", 1)
|
|
248
|
+
except ValueError as e:
|
|
249
|
+
raise error from e
|
|
250
|
+
|
|
251
|
+
try:
|
|
252
|
+
package = import_module(package_name)
|
|
253
|
+
except ModuleNotFoundError as e:
|
|
254
|
+
raise error from e
|
|
255
|
+
|
|
256
|
+
try:
|
|
257
|
+
submodule = getattr(package, submodule_name)
|
|
258
|
+
except AttributeError as e:
|
|
259
|
+
raise error from e
|
|
260
|
+
|
|
261
|
+
if not inspect.ismodule(submodule):
|
|
262
|
+
raise error
|
|
263
|
+
|
|
264
|
+
return submodule
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def parse_module(
|
|
268
|
+
module_name: str, *, query_type4py: bool = False
|
|
269
|
+
) -> _ModuleParseResult:
|
|
231
270
|
"""Parses a module and extracts its module-type and AST.
|
|
232
271
|
|
|
233
272
|
If the source code is not available it is not possible to build an AST. In this
|
|
@@ -242,7 +281,7 @@ def parse_module(module_name: str, query_type4py: bool = False) -> _ModuleParseR
|
|
|
242
281
|
Returns:
|
|
243
282
|
A tuple of the imported module type and its optional AST
|
|
244
283
|
"""
|
|
245
|
-
module =
|
|
284
|
+
module = import_module(module_name)
|
|
246
285
|
type4py_data: Type4pyData | None = None
|
|
247
286
|
syntax_tree: astroid.Module | None = None
|
|
248
287
|
linenos: int = -1
|
|
@@ -511,7 +550,7 @@ class TypeGuessingStats:
|
|
|
511
550
|
)
|
|
512
551
|
|
|
513
552
|
|
|
514
|
-
class ModuleTestCluster(TestCluster):
|
|
553
|
+
class ModuleTestCluster(TestCluster): # noqa: PLR0904
|
|
515
554
|
"""A test cluster for a module.
|
|
516
555
|
|
|
517
556
|
Contains all methods/constructors/functions and all required transitive
|
|
@@ -521,17 +560,17 @@ class ModuleTestCluster(TestCluster):
|
|
|
521
560
|
def __init__(self, linenos: int) -> None: # noqa: D107
|
|
522
561
|
self.__type_system = TypeSystem()
|
|
523
562
|
self.__linenos = linenos
|
|
524
|
-
self.__generators: dict[
|
|
525
|
-
|
|
526
|
-
|
|
563
|
+
self.__generators: dict[ProperType, OrderedSet[GenericAccessibleObject]] = (
|
|
564
|
+
defaultdict(OrderedSet)
|
|
565
|
+
)
|
|
527
566
|
|
|
528
567
|
# Modifier belong to a certain class, not type.
|
|
529
|
-
self.__modifiers: dict[
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
self.__accessible_objects_under_test: OrderedSet[
|
|
533
|
-
|
|
534
|
-
|
|
568
|
+
self.__modifiers: dict[TypeInfo, OrderedSet[GenericAccessibleObject]] = (
|
|
569
|
+
defaultdict(OrderedSet)
|
|
570
|
+
)
|
|
571
|
+
self.__accessible_objects_under_test: OrderedSet[GenericAccessibleObject] = (
|
|
572
|
+
OrderedSet()
|
|
573
|
+
)
|
|
535
574
|
self.__function_data_for_accessibles: dict[
|
|
536
575
|
GenericAccessibleObject, _CallableData
|
|
537
576
|
] = {}
|
|
@@ -592,7 +631,7 @@ class ModuleTestCluster(TestCluster):
|
|
|
592
631
|
if len(items) >= max_size or new_type in items:
|
|
593
632
|
return old_type
|
|
594
633
|
new_type = UnionType(tuple(sorted((*items, new_type))))
|
|
595
|
-
elif old_type in
|
|
634
|
+
elif old_type in {ANY, new_type}:
|
|
596
635
|
new_type = UnionType((new_type,))
|
|
597
636
|
else:
|
|
598
637
|
new_type = UnionType(tuple(sorted((old_type, new_type))))
|
|
@@ -818,7 +857,7 @@ class ModuleTestCluster(TestCluster):
|
|
|
818
857
|
]
|
|
819
858
|
|
|
820
859
|
|
|
821
|
-
class FilteredModuleTestCluster(TestCluster):
|
|
860
|
+
class FilteredModuleTestCluster(TestCluster): # noqa: PLR0904
|
|
822
861
|
"""A test cluster wrapping another test cluster.
|
|
823
862
|
|
|
824
863
|
Delegates most methods to the wrapped delegate. This cluster filters out
|
|
@@ -1237,7 +1276,7 @@ def __analyse_method(
|
|
|
1237
1276
|
|
|
1238
1277
|
|
|
1239
1278
|
class _ParseResults(dict):
|
|
1240
|
-
def __init__(self, query_type4py: bool):
|
|
1279
|
+
def __init__(self, *, query_type4py: bool):
|
|
1241
1280
|
super().__init__()
|
|
1242
1281
|
self._query_type4py = query_type4py
|
|
1243
1282
|
|
|
@@ -1251,6 +1290,7 @@ def __resolve_dependencies(
|
|
|
1251
1290
|
root_module: _ModuleParseResult,
|
|
1252
1291
|
type_inference_strategy: TypeInferenceStrategy,
|
|
1253
1292
|
test_cluster: ModuleTestCluster,
|
|
1293
|
+
*,
|
|
1254
1294
|
query_type4py: bool = False,
|
|
1255
1295
|
) -> None:
|
|
1256
1296
|
parse_results: dict[str, _ModuleParseResult] = _ParseResults(
|
|
@@ -1348,11 +1388,28 @@ def __analyse_included_classes(
|
|
|
1348
1388
|
|
|
1349
1389
|
type_info = test_cluster.type_system.to_type_info(current)
|
|
1350
1390
|
|
|
1391
|
+
# Skip if the class is _ObjectProxyMethods, as it is broken
|
|
1392
|
+
# since __module__ is not well defined on it.
|
|
1393
|
+
if isinstance(current.__module__, property):
|
|
1394
|
+
LOGGER.info("Skipping class that has a property __module__: %s", current)
|
|
1395
|
+
continue
|
|
1396
|
+
|
|
1397
|
+
# Skip some C-extension modules that are not publicly accessible.
|
|
1398
|
+
try:
|
|
1399
|
+
results = parse_results[current.__module__]
|
|
1400
|
+
except ModuleNotFoundError as error:
|
|
1401
|
+
if getattr(current, "__file__", None) is None or Path(
|
|
1402
|
+
current.__file__
|
|
1403
|
+
).suffix in {".so", ".pyd"}:
|
|
1404
|
+
LOGGER.info("C-extension module not found: %s", current.__module__)
|
|
1405
|
+
continue
|
|
1406
|
+
raise error
|
|
1407
|
+
|
|
1351
1408
|
__analyse_class(
|
|
1352
1409
|
type_info=type_info,
|
|
1353
1410
|
type_inference_strategy=type_inference_strategy,
|
|
1354
|
-
module_tree=
|
|
1355
|
-
type4py_data=
|
|
1411
|
+
module_tree=results.syntax_tree,
|
|
1412
|
+
type4py_data=results.type4py_data,
|
|
1356
1413
|
test_cluster=test_cluster,
|
|
1357
1414
|
add_to_test=current.__module__ == root_module_name,
|
|
1358
1415
|
)
|
|
@@ -1402,6 +1459,7 @@ def __analyse_included_functions(
|
|
|
1402
1459
|
def analyse_module(
|
|
1403
1460
|
parsed_module: _ModuleParseResult,
|
|
1404
1461
|
type_inference_strategy: TypeInferenceStrategy = TypeInferenceStrategy.TYPE_HINTS,
|
|
1462
|
+
*,
|
|
1405
1463
|
query_type4py: bool = False,
|
|
1406
1464
|
) -> ModuleTestCluster:
|
|
1407
1465
|
"""Analyses a module to build a test cluster.
|
|
@@ -1427,6 +1485,7 @@ def analyse_module(
|
|
|
1427
1485
|
def generate_test_cluster(
|
|
1428
1486
|
module_name: str,
|
|
1429
1487
|
type_inference_strategy: TypeInferenceStrategy = TypeInferenceStrategy.TYPE_HINTS,
|
|
1488
|
+
*,
|
|
1430
1489
|
query_type4py: bool = False,
|
|
1431
1490
|
) -> ModuleTestCluster:
|
|
1432
1491
|
"""Generates a new test cluster from the given module.
|