From 6c55a51756fa2d366e5dfd8926faf80515491910 Mon Sep 17 00:00:00 2001 From: Krzysztof Rudnicki Date: Wed, 22 Mar 2023 09:32:16 +0000 Subject: [PATCH] Run autopep8 on code --- main.py | 195 +- venv/bin/autopep8 | 8 + venv/bin/epylint | 8 + venv/bin/get_objgraph | 1 + venv/bin/isort | 8 + venv/bin/isort-identify-imports | 8 + venv/bin/pycodestyle | 8 + venv/bin/pylint | 8 + venv/bin/pylint-config | 8 + venv/bin/pyreverse | 8 + venv/bin/symilar | 8 + venv/bin/undill | 1 + .../__pycache__/autopep8.cpython-310.pyc | Bin 0 -> 100400 bytes .../__pycache__/mccabe.cpython-310.pyc | Bin 0 -> 11335 bytes .../__pycache__/pycodestyle.cpython-310.pyc | Bin 0 -> 70560 bytes .../typing_extensions.cpython-310.pyc | Bin 79111 -> 64978 bytes .../astroid-2.15.0.dist-info/CONTRIBUTORS.txt | 199 + .../INSTALLER | 0 .../astroid-2.15.0.dist-info/LICENSE | 1 + .../astroid-2.15.0.dist-info/METADATA | 128 + .../astroid-2.15.0.dist-info/RECORD | 209 + .../astroid-2.15.0.dist-info/WHEEL | 1 + .../astroid-2.15.0.dist-info/top_level.txt | 1 + .../site-packages/astroid/__init__.py | 1 + .../site-packages/astroid/__pkginfo__.py | 6 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4908 bytes .../__pycache__/__pkginfo__.cpython-310.pyc | Bin 0 -> 210 bytes .../astroid/__pycache__/_ast.cpython-310.pyc | Bin 0 -> 3811 bytes .../_backport_stdlib_names.cpython-310.pyc | Bin 0 -> 3722 bytes .../__pycache__/_cache.cpython-310.pyc | Bin 0 -> 1114 bytes .../__pycache__/arguments.cpython-310.pyc | Bin 0 -> 7868 bytes .../astroid_manager.cpython-310.pyc | Bin 0 -> 532 bytes .../astroid/__pycache__/bases.cpython-310.pyc | Bin 0 -> 21367 bytes .../__pycache__/builder.cpython-310.pyc | Bin 0 -> 15003 bytes .../astroid/__pycache__/const.cpython-310.pyc | Bin 0 -> 1028 bytes .../__pycache__/constraint.cpython-310.pyc | Bin 0 -> 4722 bytes .../__pycache__/context.cpython-310.pyc | Bin 0 -> 5647 bytes .../__pycache__/decorators.cpython-310.pyc | Bin 0 -> 7977 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 14601 bytes .../filter_statements.cpython-310.pyc | Bin 0 -> 4050 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 0 -> 8776 bytes .../__pycache__/inference.cpython-310.pyc | Bin 0 -> 29903 bytes .../__pycache__/inference_tip.cpython-310.pyc | Bin 0 -> 2739 bytes .../__pycache__/manager.cpython-310.pyc | Bin 0 -> 12763 bytes .../__pycache__/mixins.cpython-310.pyc | Bin 0 -> 904 bytes .../__pycache__/modutils.cpython-310.pyc | Bin 0 -> 19002 bytes .../__pycache__/node_classes.cpython-310.pyc | Bin 0 -> 1898 bytes .../__pycache__/objects.cpython-310.pyc | Bin 0 -> 10774 bytes .../__pycache__/protocols.cpython-310.pyc | Bin 0 -> 21167 bytes .../__pycache__/raw_building.cpython-310.pyc | Bin 0 -> 15450 bytes .../__pycache__/rebuilder.cpython-310.pyc | Bin 0 -> 59170 bytes .../__pycache__/scoped_nodes.cpython-310.pyc | Bin 0 -> 755 bytes .../__pycache__/test_utils.cpython-310.pyc | Bin 0 -> 3104 bytes .../__pycache__/transforms.cpython-310.pyc | Bin 0 -> 3476 bytes .../__pycache__/typing.cpython-310.pyc | Bin 0 -> 2101 bytes .../astroid/__pycache__/util.cpython-310.pyc | Bin 0 -> 6360 bytes .../python3.10/site-packages/astroid/_ast.py | 1 + .../astroid/_backport_stdlib_names.py | 356 ++ .../site-packages/astroid/_cache.py | 1 + .../site-packages/astroid/arguments.py | 309 + .../site-packages/astroid/astroid_manager.py | 1 + .../python3.10/site-packages/astroid/bases.py | 711 +++ .../site-packages/astroid/brain/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 176 bytes .../brain_argparse.cpython-310.pyc | Bin 0 -> 1313 bytes .../__pycache__/brain_attrs.cpython-310.pyc | Bin 0 -> 1911 bytes .../__pycache__/brain_boto3.cpython-310.pyc | Bin 0 -> 1011 bytes .../brain_builtin_inference.cpython-310.pyc | Bin 0 -> 24966 bytes .../brain_collections.cpython-310.pyc | Bin 0 -> 3933 bytes .../__pycache__/brain_crypt.cpython-310.pyc | Bin 0 -> 859 bytes .../__pycache__/brain_ctypes.cpython-310.pyc | Bin 0 -> 2201 bytes .../__pycache__/brain_curses.cpython-310.pyc | Bin 0 -> 3472 bytes .../brain_dataclasses.cpython-310.pyc | Bin 0 -> 14111 bytes .../brain_dateutil.cpython-310.pyc | Bin 0 -> 743 bytes .../brain_fstrings.cpython-310.pyc | Bin 0 -> 1891 bytes .../brain_functools.cpython-310.pyc | Bin 0 -> 5272 bytes .../__pycache__/brain_gi.cpython-310.pyc | Bin 0 -> 4438 bytes .../__pycache__/brain_hashlib.cpython-310.pyc | Bin 0 -> 2217 bytes .../__pycache__/brain_http.cpython-310.pyc | Bin 0 -> 10599 bytes .../brain_hypothesis.cpython-310.pyc | Bin 0 -> 1630 bytes .../__pycache__/brain_io.cpython-310.pyc | Bin 0 -> 1362 bytes .../brain_mechanize.cpython-310.pyc | Bin 0 -> 2629 bytes .../brain_multiprocessing.cpython-310.pyc | Bin 0 -> 2747 bytes .../brain_namedtuple_enum.cpython-310.pyc | Bin 0 -> 16491 bytes .../__pycache__/brain_nose.cpython-310.pyc | Bin 0 -> 2237 bytes ...rain_numpy_core_einsumfunc.cpython-310.pyc | Bin 0 -> 842 bytes ...ain_numpy_core_fromnumeric.cpython-310.pyc | Bin 0 -> 731 bytes ...n_numpy_core_function_base.cpython-310.pyc | Bin 0 -> 1158 bytes ...rain_numpy_core_multiarray.cpython-310.pyc | Bin 0 -> 3583 bytes .../brain_numpy_core_numeric.cpython-310.pyc | Bin 0 -> 1508 bytes ...in_numpy_core_numerictypes.cpython-310.pyc | Bin 0 -> 8213 bytes .../brain_numpy_core_umath.cpython-310.pyc | Bin 0 -> 4606 bytes .../brain_numpy_ma.cpython-310.pyc | Bin 0 -> 886 bytes .../brain_numpy_ndarray.cpython-310.pyc | Bin 0 -> 9070 bytes .../brain_numpy_random_mtrand.cpython-310.pyc | Bin 0 -> 3385 bytes .../brain_numpy_utils.cpython-310.pyc | Bin 0 -> 2921 bytes .../__pycache__/brain_pathlib.cpython-310.pyc | Bin 0 -> 1544 bytes .../brain_pkg_resources.cpython-310.pyc | Bin 0 -> 2194 bytes .../__pycache__/brain_pytest.cpython-310.pyc | Bin 0 -> 2169 bytes .../__pycache__/brain_qt.cpython-310.pyc | Bin 0 -> 2511 bytes .../__pycache__/brain_random.cpython-310.pyc | Bin 0 -> 2618 bytes .../__pycache__/brain_re.cpython-310.pyc | Bin 0 -> 2629 bytes .../__pycache__/brain_regex.cpython-310.pyc | Bin 0 -> 3318 bytes .../brain_responses.cpython-310.pyc | Bin 0 -> 1876 bytes .../brain_scipy_signal.cpython-310.pyc | Bin 0 -> 2290 bytes .../__pycache__/brain_signal.cpython-310.pyc | Bin 0 -> 3913 bytes .../__pycache__/brain_six.cpython-310.pyc | Bin 0 -> 6660 bytes .../brain_sqlalchemy.cpython-310.pyc | Bin 0 -> 1005 bytes .../__pycache__/brain_ssl.cpython-310.pyc | Bin 0 -> 6625 bytes .../brain_subprocess.cpython-310.pyc | Bin 0 -> 3013 bytes .../brain_threading.cpython-310.pyc | Bin 0 -> 866 bytes .../__pycache__/brain_type.cpython-310.pyc | Bin 0 -> 2509 bytes .../__pycache__/brain_typing.cpython-310.pyc | Bin 0 -> 10016 bytes .../brain_unittest.cpython-310.pyc | Bin 0 -> 1125 bytes .../__pycache__/brain_uuid.cpython-310.pyc | Bin 0 -> 743 bytes .../brain/__pycache__/helpers.cpython-310.pyc | Bin 0 -> 1162 bytes .../astroid/brain/brain_argparse.py | 1 + .../astroid/brain/brain_attrs.py | 1 + .../astroid/brain/brain_boto3.py | 1 + .../astroid/brain/brain_builtin_inference.py | 1007 +++ .../astroid/brain/brain_collections.py | 1 + .../astroid/brain/brain_crypt.py | 1 + .../astroid/brain/brain_ctypes.py | 1 + .../astroid/brain/brain_curses.py | 1 + .../astroid/brain/brain_dataclasses.py | 636 ++ .../astroid/brain/brain_dateutil.py | 1 + .../astroid/brain/brain_fstrings.py | 61 + .../astroid/brain/brain_functools.py | 164 + .../site-packages/astroid/brain/brain_gi.py | 1 + .../astroid/brain/brain_hashlib.py | 1 + .../site-packages/astroid/brain/brain_http.py | 1 + .../astroid/brain/brain_hypothesis.py | 1 + .../site-packages/astroid/brain/brain_io.py | 1 + .../astroid/brain/brain_mechanize.py | 1 + .../astroid/brain/brain_multiprocessing.py | 1 + .../astroid/brain/brain_namedtuple_enum.py | 639 ++ .../site-packages/astroid/brain/brain_nose.py | 1 + .../brain/brain_numpy_core_einsumfunc.py | 1 + .../brain/brain_numpy_core_fromnumeric.py | 1 + .../brain/brain_numpy_core_function_base.py | 1 + .../brain/brain_numpy_core_multiarray.py | 1 + .../astroid/brain/brain_numpy_core_numeric.py | 1 + .../brain/brain_numpy_core_numerictypes.py | 1 + .../astroid/brain/brain_numpy_core_umath.py | 1 + .../astroid/brain/brain_numpy_ma.py | 1 + .../astroid/brain/brain_numpy_ndarray.py | 1 + .../brain/brain_numpy_random_mtrand.py | 1 + .../astroid/brain/brain_numpy_utils.py | 1 + .../astroid/brain/brain_pathlib.py | 1 + .../astroid/brain/brain_pkg_resources.py | 1 + .../astroid/brain/brain_pytest.py | 1 + .../site-packages/astroid/brain/brain_qt.py | 1 + .../astroid/brain/brain_random.py | 1 + .../site-packages/astroid/brain/brain_re.py | 1 + .../astroid/brain/brain_regex.py | 1 + .../astroid/brain/brain_responses.py | 1 + .../astroid/brain/brain_scipy_signal.py | 1 + .../astroid/brain/brain_signal.py | 1 + .../site-packages/astroid/brain/brain_six.py | 1 + .../astroid/brain/brain_sqlalchemy.py | 1 + .../site-packages/astroid/brain/brain_ssl.py | 1 + .../astroid/brain/brain_subprocess.py | 1 + .../astroid/brain/brain_threading.py | 1 + .../site-packages/astroid/brain/brain_type.py | 1 + .../astroid/brain/brain_typing.py | 438 ++ .../astroid/brain/brain_unittest.py | 1 + .../site-packages/astroid/brain/brain_uuid.py | 1 + .../site-packages/astroid/brain/helpers.py | 1 + .../site-packages/astroid/builder.py | 494 ++ .../python3.10/site-packages/astroid/const.py | 1 + .../site-packages/astroid/constraint.py | 137 + .../site-packages/astroid/context.py | 1 + .../site-packages/astroid/decorators.py | 290 + .../site-packages/astroid/exceptions.py | 1 + .../astroid/filter_statements.py | 1 + .../site-packages/astroid/helpers.py | 320 + .../site-packages/astroid/inference.py | 1273 ++++ .../site-packages/astroid/inference_tip.py | 85 + .../astroid/interpreter/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 182 bytes .../__pycache__/dunder_lookup.cpython-310.pyc | Bin 0 -> 2159 bytes .../__pycache__/objectmodel.cpython-310.pyc | Bin 0 -> 31392 bytes .../astroid/interpreter/_import/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 190 bytes .../_import/__pycache__/spec.cpython-310.pyc | Bin 0 -> 12368 bytes .../_import/__pycache__/util.cpython-310.pyc | Bin 0 -> 2033 bytes .../astroid/interpreter/_import/spec.py | 472 ++ .../astroid/interpreter/_import/util.py | 1 + .../astroid/interpreter/dunder_lookup.py | 1 + .../astroid/interpreter/objectmodel.py | 940 +++ .../site-packages/astroid/manager.py | 447 ++ .../site-packages/astroid/mixins.py | 31 + .../site-packages/astroid/modutils.py | 701 ++ .../site-packages/astroid/node_classes.py | 99 + .../site-packages/astroid/nodes/__init__.py | 302 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3574 bytes .../__pycache__/_base_nodes.cpython-310.pyc | Bin 0 -> 7915 bytes .../__pycache__/as_string.cpython-310.pyc | Bin 0 -> 28344 bytes .../nodes/__pycache__/const.cpython-310.pyc | Bin 0 -> 571 bytes .../__pycache__/node_classes.cpython-310.pyc | Bin 0 -> 122590 bytes .../nodes/__pycache__/node_ng.cpython-310.pyc | Bin 0 -> 23166 bytes .../nodes/__pycache__/utils.cpython-310.pyc | Bin 0 -> 542 bytes .../astroid/nodes/_base_nodes.py | 1 + .../site-packages/astroid/nodes/as_string.py | 1 + .../site-packages/astroid/nodes/const.py | 1 + .../astroid/nodes/node_classes.py | 5643 +++++++++++++++++ .../site-packages/astroid/nodes/node_ng.py | 814 +++ .../astroid/nodes/scoped_nodes/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1057 bytes .../__pycache__/mixin.cpython-310.pyc | Bin 0 -> 7044 bytes .../__pycache__/scoped_nodes.cpython-310.pyc | Bin 0 -> 74249 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 1055 bytes .../astroid/nodes/scoped_nodes/mixin.py | 1 + .../nodes/scoped_nodes/scoped_nodes.py | 3084 +++++++++ .../astroid/nodes/scoped_nodes/utils.py | 1 + .../site-packages/astroid/nodes/utils.py | 1 + .../site-packages/astroid/objects.py | 1 + .../site-packages/astroid/protocols.py | 980 +++ .../site-packages/astroid/raw_building.py | 643 ++ .../site-packages/astroid/rebuilder.py | 2110 ++++++ .../site-packages/astroid/scoped_nodes.py | 35 + .../site-packages/astroid/test_utils.py | 1 + .../site-packages/astroid/transforms.py | 1 + .../site-packages/astroid/typing.py | 71 + .../python3.10/site-packages/astroid/util.py | 162 + .../autopep8-2.0.2.dist-info/AUTHORS.rst | 1 + .../autopep8-2.0.2.dist-info/INSTALLER | 1 + .../autopep8-2.0.2.dist-info/LICENSE | 1 + .../autopep8-2.0.2.dist-info/METADATA | 460 ++ .../autopep8-2.0.2.dist-info/RECORD | 12 + .../REQUESTED | 0 .../autopep8-2.0.2.dist-info/WHEEL | 1 + .../autopep8-2.0.2.dist-info/entry_points.txt | 1 + .../autopep8-2.0.2.dist-info/top_level.txt | 1 + venv/lib/python3.10/site-packages/autopep8.py | 4570 +++++++++++++ .../dill-0.3.6.dist-info/INSTALLER | 1 + .../dill-0.3.6.dist-info/LICENSE | 1 + .../dill-0.3.6.dist-info/METADATA | 1 + .../site-packages/dill-0.3.6.dist-info/RECORD | 94 + .../site-packages/dill-0.3.6.dist-info/WHEEL | 1 + .../dill-0.3.6.dist-info/top_level.txt | 1 + .../python3.10/site-packages/dill/__diff.py | 1 + .../python3.10/site-packages/dill/__info__.py | 1 + .../python3.10/site-packages/dill/__init__.py | 1 + .../dill/__pycache__/__diff.cpython-310.pyc | Bin 0 -> 5846 bytes .../dill/__pycache__/__info__.cpython-310.pyc | Bin 0 -> 10522 bytes .../dill/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3656 bytes .../dill/__pycache__/_dill.cpython-310.pyc | Bin 0 -> 54521 bytes .../dill/__pycache__/_objects.cpython-310.pyc | Bin 0 -> 14212 bytes .../dill/__pycache__/_shims.cpython-310.pyc | Bin 0 -> 6578 bytes .../dill/__pycache__/detect.cpython-310.pyc | Bin 0 -> 8260 bytes .../dill/__pycache__/logger.cpython-310.pyc | Bin 0 -> 8844 bytes .../dill/__pycache__/objtypes.cpython-310.pyc | Bin 0 -> 530 bytes .../dill/__pycache__/pointers.cpython-310.pyc | Bin 0 -> 3422 bytes .../dill/__pycache__/session.cpython-310.pyc | Bin 0 -> 17920 bytes .../dill/__pycache__/settings.cpython-310.pyc | Bin 0 -> 346 bytes .../dill/__pycache__/source.cpython-310.pyc | Bin 0 -> 25925 bytes .../dill/__pycache__/temp.cpython-310.pyc | Bin 0 -> 7226 bytes .../python3.10/site-packages/dill/_dill.py | 1 + .../python3.10/site-packages/dill/_objects.py | 1 + .../python3.10/site-packages/dill/_shims.py | 1 + .../python3.10/site-packages/dill/detect.py | 1 + .../python3.10/site-packages/dill/logger.py | 1 + .../python3.10/site-packages/dill/objtypes.py | 1 + .../python3.10/site-packages/dill/pointers.py | 1 + .../python3.10/site-packages/dill/session.py | 1 + .../python3.10/site-packages/dill/settings.py | 1 + .../python3.10/site-packages/dill/source.py | 1 + .../lib/python3.10/site-packages/dill/temp.py | 1 + .../site-packages/dill/tests/__init__.py | 1 + .../site-packages/dill/tests/__main__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 398 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 753 bytes .../__pycache__/test_check.cpython-310.pyc | Bin 0 -> 1481 bytes .../__pycache__/test_classdef.cpython-310.pyc | Bin 0 -> 8771 bytes .../test_dataclasses.cpython-310.pyc | Bin 0 -> 1033 bytes .../__pycache__/test_detect.cpython-310.pyc | Bin 0 -> 5095 bytes .../test_dictviews.cpython-310.pyc | Bin 0 -> 1233 bytes .../__pycache__/test_diff.cpython-310.pyc | Bin 0 -> 1533 bytes .../test_extendpickle.cpython-310.pyc | Bin 0 -> 1275 bytes .../__pycache__/test_fglobals.cpython-310.pyc | Bin 0 -> 1878 bytes .../__pycache__/test_file.cpython-310.pyc | Bin 0 -> 7066 bytes .../test_functions.cpython-310.pyc | Bin 0 -> 4428 bytes .../__pycache__/test_functors.cpython-310.pyc | Bin 0 -> 967 bytes .../__pycache__/test_logger.cpython-310.pyc | Bin 0 -> 1949 bytes .../__pycache__/test_mixins.cpython-310.pyc | Bin 0 -> 4686 bytes .../__pycache__/test_module.cpython-310.pyc | Bin 0 -> 1742 bytes .../test_moduledict.cpython-310.pyc | Bin 0 -> 1723 bytes .../__pycache__/test_nested.cpython-310.pyc | Bin 0 -> 3610 bytes .../__pycache__/test_objects.cpython-310.pyc | Bin 0 -> 1829 bytes .../test_properties.cpython-310.pyc | Bin 0 -> 1592 bytes .../test_pycapsule.cpython-310.pyc | Bin 0 -> 1054 bytes .../test_recursive.cpython-310.pyc | Bin 0 -> 5645 bytes .../test_registered.cpython-310.pyc | Bin 0 -> 1451 bytes .../test_restricted.cpython-310.pyc | Bin 0 -> 978 bytes .../__pycache__/test_selected.cpython-310.pyc | Bin 0 -> 3214 bytes .../__pycache__/test_session.cpython-310.pyc | Bin 0 -> 8183 bytes .../__pycache__/test_source.cpython-310.pyc | Bin 0 -> 5313 bytes .../__pycache__/test_temp.cpython-310.pyc | Bin 0 -> 3121 bytes .../__pycache__/test_weakref.cpython-310.pyc | Bin 0 -> 1736 bytes .../site-packages/dill/tests/test_check.py | 1 + .../site-packages/dill/tests/test_classdef.py | 1 + .../dill/tests/test_dataclasses.py | 1 + .../site-packages/dill/tests/test_detect.py | 1 + .../dill/tests/test_dictviews.py | 1 + .../site-packages/dill/tests/test_diff.py | 1 + .../dill/tests/test_extendpickle.py | 1 + .../site-packages/dill/tests/test_fglobals.py | 1 + .../site-packages/dill/tests/test_file.py | 1 + .../dill/tests/test_functions.py | 1 + .../site-packages/dill/tests/test_functors.py | 1 + .../site-packages/dill/tests/test_logger.py | 1 + .../site-packages/dill/tests/test_mixins.py | 1 + .../site-packages/dill/tests/test_module.py | 1 + .../dill/tests/test_moduledict.py | 1 + .../site-packages/dill/tests/test_nested.py | 1 + .../site-packages/dill/tests/test_objects.py | 1 + .../dill/tests/test_properties.py | 1 + .../dill/tests/test_pycapsule.py | 1 + .../dill/tests/test_recursive.py | 1 + .../dill/tests/test_registered.py | 1 + .../dill/tests/test_restricted.py | 1 + .../site-packages/dill/tests/test_selected.py | 1 + .../site-packages/dill/tests/test_session.py | 1 + .../site-packages/dill/tests/test_source.py | 1 + .../site-packages/dill/tests/test_temp.py | 1 + .../site-packages/dill/tests/test_weakref.py | 1 + .../isort-5.12.0.dist-info/INSTALLER | 1 + .../isort-5.12.0.dist-info/LICENSE | 1 + .../isort-5.12.0.dist-info/METADATA | 1 + .../isort-5.12.0.dist-info/RECORD | 97 + .../isort-5.12.0.dist-info/WHEEL | 1 + .../isort-5.12.0.dist-info/entry_points.txt | 1 + .../site-packages/isort/__init__.py | 1 + .../site-packages/isort/__main__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 877 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 215 bytes .../__pycache__/_version.cpython-310.pyc | Bin 0 -> 251 bytes .../isort/__pycache__/api.cpython-310.pyc | Bin 0 -> 18567 bytes .../__pycache__/comments.cpython-310.pyc | Bin 0 -> 1066 bytes .../isort/__pycache__/core.cpython-310.pyc | Bin 0 -> 9156 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 9245 bytes .../isort/__pycache__/files.cpython-310.pyc | Bin 0 -> 1245 bytes .../isort/__pycache__/format.cpython-310.pyc | Bin 0 -> 5604 bytes .../isort/__pycache__/hooks.cpython-310.pyc | Bin 0 -> 3346 bytes .../__pycache__/identify.cpython-310.pyc | Bin 0 -> 4780 bytes .../isort/__pycache__/io.cpython-310.pyc | Bin 0 -> 2788 bytes .../isort/__pycache__/literal.cpython-310.pyc | Bin 0 -> 4230 bytes .../isort/__pycache__/logo.cpython-310.pyc | Bin 0 -> 564 bytes .../isort/__pycache__/main.cpython-310.pyc | Bin 0 -> 31591 bytes .../isort/__pycache__/output.cpython-310.pyc | Bin 0 -> 13387 bytes .../isort/__pycache__/parse.cpython-310.pyc | Bin 0 -> 11820 bytes .../isort/__pycache__/place.cpython-310.pyc | Bin 0 -> 5042 bytes .../__pycache__/profiles.cpython-310.pyc | Bin 0 -> 1603 bytes .../__pycache__/pylama_isort.cpython-310.pyc | Bin 0 -> 1651 bytes .../__pycache__/sections.cpython-310.pyc | Bin 0 -> 482 bytes .../__pycache__/settings.cpython-310.pyc | Bin 0 -> 24409 bytes .../setuptools_commands.cpython-310.pyc | Bin 0 -> 2345 bytes .../isort/__pycache__/sorting.cpython-310.pyc | Bin 0 -> 3535 bytes .../isort/__pycache__/utils.cpython-310.pyc | Bin 0 -> 2671 bytes .../isort/__pycache__/wrap.cpython-310.pyc | Bin 0 -> 3398 bytes .../__pycache__/wrap_modes.cpython-310.pyc | Bin 0 -> 7977 bytes .../isort/_vendored/tomli/LICENSE | 1 + .../isort/_vendored/tomli/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 356 bytes .../tomli/__pycache__/_parser.cpython-310.pyc | Bin 0 -> 15525 bytes .../tomli/__pycache__/_re.cpython-310.pyc | Bin 0 -> 2814 bytes .../isort/_vendored/tomli/_parser.py | 1 + .../isort/_vendored/tomli/_re.py | 1 + .../isort/_vendored/tomli/py.typed | 1 + .../site-packages/isort/_version.py | 1 + .../lib/python3.10/site-packages/isort/api.py | 1 + .../site-packages/isort/comments.py | 1 + .../python3.10/site-packages/isort/core.py | 1 + .../isort/deprecated/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 179 bytes .../__pycache__/finders.cpython-310.pyc | Bin 0 -> 13662 bytes .../site-packages/isort/deprecated/finders.py | 1 + .../site-packages/isort/exceptions.py | 1 + .../python3.10/site-packages/isort/files.py | 1 + .../python3.10/site-packages/isort/format.py | 1 + .../python3.10/site-packages/isort/hooks.py | 1 + .../site-packages/isort/identify.py | 1 + venv/lib/python3.10/site-packages/isort/io.py | 1 + .../python3.10/site-packages/isort/literal.py | 1 + .../python3.10/site-packages/isort/logo.py | 1 + .../python3.10/site-packages/isort/main.py | 1 + .../python3.10/site-packages/isort/output.py | 1 + .../python3.10/site-packages/isort/parse.py | 1 + .../python3.10/site-packages/isort/place.py | 1 + .../site-packages/isort/profiles.py | 1 + .../python3.10/site-packages/isort/py.typed | 1 + .../site-packages/isort/pylama_isort.py | 1 + .../site-packages/isort/sections.py | 1 + .../site-packages/isort/settings.py | 1 + .../isort/setuptools_commands.py | 1 + .../python3.10/site-packages/isort/sorting.py | 1 + .../site-packages/isort/stdlibs/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 357 bytes .../stdlibs/__pycache__/all.cpython-310.pyc | Bin 0 -> 235 bytes .../stdlibs/__pycache__/py2.cpython-310.pyc | Bin 0 -> 216 bytes .../stdlibs/__pycache__/py27.cpython-310.pyc | Bin 0 -> 2938 bytes .../stdlibs/__pycache__/py3.cpython-310.pyc | Bin 0 -> 323 bytes .../stdlibs/__pycache__/py310.cpython-310.pyc | Bin 0 -> 2187 bytes .../stdlibs/__pycache__/py311.cpython-310.pyc | Bin 0 -> 2188 bytes .../stdlibs/__pycache__/py36.cpython-310.pyc | Bin 0 -> 2206 bytes .../stdlibs/__pycache__/py37.cpython-310.pyc | Bin 0 -> 2224 bytes .../stdlibs/__pycache__/py38.cpython-310.pyc | Bin 0 -> 2215 bytes .../stdlibs/__pycache__/py39.cpython-310.pyc | Bin 0 -> 2203 bytes .../site-packages/isort/stdlibs/all.py | 1 + .../site-packages/isort/stdlibs/py2.py | 1 + .../site-packages/isort/stdlibs/py27.py | 1 + .../site-packages/isort/stdlibs/py3.py | 1 + .../site-packages/isort/stdlibs/py310.py | 1 + .../site-packages/isort/stdlibs/py311.py | 1 + .../site-packages/isort/stdlibs/py36.py | 1 + .../site-packages/isort/stdlibs/py37.py | 1 + .../site-packages/isort/stdlibs/py38.py | 1 + .../site-packages/isort/stdlibs/py39.py | 1 + .../python3.10/site-packages/isort/utils.py | 1 + .../python3.10/site-packages/isort/wrap.py | 1 + .../site-packages/isort/wrap_modes.py | 1 + .../AUTHORS.rst | 1 + .../INSTALLER | 1 + .../lazy_object_proxy-1.9.0.dist-info/LICENSE | 1 + .../METADATA | 1 + .../lazy_object_proxy-1.9.0.dist-info/RECORD | 20 + .../lazy_object_proxy-1.9.0.dist-info/WHEEL | 1 + .../top_level.txt | 1 + .../lazy_object_proxy/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 559 bytes .../__pycache__/_version.cpython-310.pyc | Bin 0 -> 275 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 383 bytes .../__pycache__/simple.cpython-310.pyc | Bin 0 -> 8374 bytes .../__pycache__/slots.cpython-310.pyc | Bin 0 -> 15609 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 2109 bytes .../lazy_object_proxy/_version.py | 1 + .../cext.cpython-310-x86_64-linux-gnu.so | 1 + .../site-packages/lazy_object_proxy/compat.py | 1 + .../site-packages/lazy_object_proxy/simple.py | 1 + .../site-packages/lazy_object_proxy/slots.py | 1 + .../site-packages/lazy_object_proxy/utils.py | 1 + .../mccabe-0.7.0.dist-info/INSTALLER | 1 + .../mccabe-0.7.0.dist-info/LICENSE | 1 + .../mccabe-0.7.0.dist-info/METADATA | 1 + .../mccabe-0.7.0.dist-info/RECORD | 9 + .../mccabe-0.7.0.dist-info/WHEEL | 1 + .../mccabe-0.7.0.dist-info/entry_points.txt | 1 + .../mccabe-0.7.0.dist-info/top_level.txt | 1 + venv/lib/python3.10/site-packages/mccabe.py | 1 + .../pycodestyle-2.10.0.dist-info/INSTALLER | 1 + .../pycodestyle-2.10.0.dist-info/LICENSE | 1 + .../pycodestyle-2.10.0.dist-info/METADATA | 1 + .../pycodestyle-2.10.0.dist-info/RECORD | 10 + .../pycodestyle-2.10.0.dist-info/WHEEL | 1 + .../entry_points.txt | 1 + .../top_level.txt | 1 + .../python3.10/site-packages/pycodestyle.py | 1 + .../pylint-2.17.0.dist-info/CONTRIBUTORS.txt | 609 ++ .../pylint-2.17.0.dist-info/INSTALLER | 1 + .../pylint-2.17.0.dist-info/LICENSE | 1 + .../pylint-2.17.0.dist-info/METADATA | 275 + .../pylint-2.17.0.dist-info/RECORD | 383 ++ .../pylint-2.17.0.dist-info/REQUESTED | 0 .../pylint-2.17.0.dist-info/WHEEL | 1 + .../pylint-2.17.0.dist-info/entry_points.txt | 1 + .../pylint-2.17.0.dist-info/top_level.txt | 1 + .../site-packages/pylint/__init__.py | 1 + .../site-packages/pylint/__main__.py | 1 + .../site-packages/pylint/__pkginfo__.py | 43 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3629 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 236 bytes .../__pycache__/__pkginfo__.cpython-310.pyc | Bin 0 -> 1068 bytes .../__pycache__/constants.cpython-310.pyc | Bin 0 -> 8278 bytes .../__pycache__/epylint.cpython-310.pyc | Bin 0 -> 6387 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 2445 bytes .../pylint/__pycache__/graph.cpython-310.pyc | Bin 0 -> 6224 bytes .../__pycache__/interfaces.cpython-310.pyc | Bin 0 -> 5439 bytes .../pylint/__pycache__/typing.cpython-310.pyc | Bin 0 -> 3925 bytes .../site-packages/pylint/checkers/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3190 bytes .../__pycache__/async.cpython-310.pyc | Bin 0 -> 2986 bytes .../bad_chained_comparison.cpython-310.pyc | Bin 0 -> 2750 bytes .../__pycache__/base_checker.cpython-310.pyc | Bin 0 -> 10296 bytes .../__pycache__/deprecated.cpython-310.pyc | Bin 0 -> 9070 bytes .../design_analysis.cpython-310.pyc | Bin 0 -> 15390 bytes .../dunder_methods.cpython-310.pyc | Bin 0 -> 3276 bytes .../ellipsis_checker.cpython-310.pyc | Bin 0 -> 2038 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 20085 bytes .../__pycache__/format.cpython-310.pyc | Bin 0 -> 16732 bytes .../__pycache__/imports.cpython-310.pyc | Bin 0 -> 28939 bytes .../lambda_expressions.cpython-310.pyc | Bin 0 -> 2737 bytes .../__pycache__/logging.cpython-310.pyc | Bin 0 -> 13195 bytes .../mapreduce_checker.cpython-310.pyc | Bin 0 -> 1537 bytes .../__pycache__/method_args.cpython-310.pyc | Bin 0 -> 4632 bytes .../checkers/__pycache__/misc.cpython-310.pyc | Bin 0 -> 5018 bytes ...modified_iterating_checker.cpython-310.pyc | Bin 0 -> 6478 bytes .../nested_min_max.cpython-310.pyc | Bin 0 -> 3441 bytes .../__pycache__/newstyle.cpython-310.pyc | Bin 0 -> 2897 bytes .../non_ascii_names.cpython-310.pyc | Bin 0 -> 5637 bytes .../__pycache__/raw_metrics.cpython-310.pyc | Bin 0 -> 3675 bytes .../__pycache__/similar.cpython-310.pyc | Bin 0 -> 29921 bytes .../__pycache__/spelling.cpython-310.pyc | Bin 0 -> 13323 bytes .../__pycache__/stdlib.cpython-310.pyc | Bin 0 -> 22819 bytes .../__pycache__/strings.cpython-310.pyc | Bin 0 -> 25396 bytes .../threading_checker.cpython-310.pyc | Bin 0 -> 2061 bytes .../__pycache__/typecheck.cpython-310.pyc | Bin 0 -> 55274 bytes .../__pycache__/unicode.cpython-310.pyc | Bin 0 -> 13678 bytes .../unsupported_version.cpython-310.pyc | Bin 0 -> 3029 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 61810 bytes .../__pycache__/variables.cpython-310.pyc | Bin 0 -> 76171 bytes .../site-packages/pylint/checkers/async.py | 96 + .../pylint/checkers/bad_chained_comparison.py | 60 + .../pylint/checkers/base/__init__.py | 1 + .../base/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1365 bytes .../__pycache__/basic_checker.cpython-310.pyc | Bin 0 -> 26373 bytes .../basic_error_checker.cpython-310.pyc | Bin 0 -> 17721 bytes .../comparison_checker.cpython-310.pyc | Bin 0 -> 9696 bytes .../docstring_checker.cpython-310.pyc | Bin 0 -> 5360 bytes .../__pycache__/pass_checker.cpython-310.pyc | Bin 0 -> 1112 bytes .../pylint/checkers/base/basic_checker.py | 966 +++ .../checkers/base/basic_error_checker.py | 582 ++ .../checkers/base/comparison_checker.py | 1 + .../pylint/checkers/base/docstring_checker.py | 1 + .../checkers/base/name_checker/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 574 bytes .../__pycache__/checker.cpython-310.pyc | Bin 0 -> 17682 bytes .../__pycache__/naming_style.cpython-310.pyc | Bin 0 -> 4412 bytes .../checkers/base/name_checker/checker.py | 686 ++ .../base/name_checker/naming_style.py | 185 + .../pylint/checkers/base/pass_checker.py | 1 + .../pylint/checkers/base_checker.py | 1 + .../pylint/checkers/classes/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 704 bytes .../__pycache__/class_checker.cpython-310.pyc | Bin 0 -> 56097 bytes .../special_methods_checker.cpython-310.pyc | Bin 0 -> 10217 bytes .../pylint/checkers/classes/class_checker.py | 2318 +++++++ .../classes/special_methods_checker.py | 403 ++ .../pylint/checkers/deprecated.py | 1 + .../pylint/checkers/design_analysis.py | 1 + .../pylint/checkers/dunder_methods.py | 96 + .../pylint/checkers/ellipsis_checker.py | 1 + .../pylint/checkers/exceptions.py | 659 ++ .../site-packages/pylint/checkers/format.py | 1 + .../site-packages/pylint/checkers/imports.py | 1088 ++++ .../pylint/checkers/lambda_expressions.py | 1 + .../site-packages/pylint/checkers/logging.py | 415 ++ .../pylint/checkers/mapreduce_checker.py | 1 + .../pylint/checkers/method_args.py | 1 + .../site-packages/pylint/checkers/misc.py | 1 + .../checkers/modified_iterating_checker.py | 1 + .../pylint/checkers/nested_min_max.py | 1 + .../site-packages/pylint/checkers/newstyle.py | 1 + .../pylint/checkers/non_ascii_names.py | 175 + .../pylint/checkers/raw_metrics.py | 1 + .../pylint/checkers/refactoring/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1045 bytes ...mplicit_booleaness_checker.cpython-310.pyc | Bin 0 -> 7415 bytes .../__pycache__/not_checker.cpython-310.pyc | Bin 0 -> 2065 bytes .../recommendation_checker.cpython-310.pyc | Bin 0 -> 10751 bytes .../refactoring_checker.cpython-310.pyc | Bin 0 -> 65357 bytes .../implicit_booleaness_checker.py | 237 + .../checkers/refactoring/not_checker.py | 1 + .../refactoring/recommendation_checker.py | 1 + .../refactoring/refactoring_checker.py | 2368 +++++++ .../site-packages/pylint/checkers/similar.py | 955 +++ .../site-packages/pylint/checkers/spelling.py | 479 ++ .../site-packages/pylint/checkers/stdlib.py | 837 +++ .../site-packages/pylint/checkers/strings.py | 1024 +++ .../pylint/checkers/threading_checker.py | 1 + .../pylint/checkers/typecheck.py | 2294 +++++++ .../site-packages/pylint/checkers/unicode.py | 538 ++ .../pylint/checkers/unsupported_version.py | 1 + .../site-packages/pylint/checkers/utils.py | 2297 +++++++ .../pylint/checkers/variables.py | 3238 ++++++++++ .../site-packages/pylint/config/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1907 bytes .../__pycache__/argument.cpython-310.pyc | Bin 0 -> 12337 bytes .../arguments_manager.cpython-310.pyc | Bin 0 -> 22619 bytes .../arguments_provider.cpython-310.pyc | Bin 0 -> 7181 bytes .../callback_actions.cpython-310.pyc | Bin 0 -> 13269 bytes .../config_file_parser.cpython-310.pyc | Bin 0 -> 3926 bytes .../config_initialization.cpython-310.pyc | Bin 0 -> 2891 bytes .../configuration_mixin.cpython-310.pyc | Bin 0 -> 1435 bytes .../deprecation_actions.cpython-310.pyc | Bin 0 -> 2730 bytes .../environment_variable.cpython-310.pyc | Bin 0 -> 399 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 1270 bytes .../find_default_config_files.cpython-310.pyc | Bin 0 -> 3828 bytes .../help_formatter.cpython-310.pyc | Bin 0 -> 2780 bytes .../config/__pycache__/option.cpython-310.pyc | Bin 0 -> 7368 bytes .../option_manager_mixin.cpython-310.pyc | Bin 0 -> 11634 bytes .../__pycache__/option_parser.cpython-310.pyc | Bin 0 -> 1995 bytes .../options_provider_mixin.cpython-310.pyc | Bin 0 -> 4023 bytes .../config/__pycache__/utils.cpython-310.pyc | Bin 0 -> 6269 bytes .../pylint/config/_pylint_config/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 505 bytes .../generate_command.cpython-310.pyc | Bin 0 -> 1824 bytes .../__pycache__/help_message.cpython-310.pyc | Bin 0 -> 1619 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 911 bytes .../__pycache__/setup.cpython-310.pyc | Bin 0 -> 1734 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 3780 bytes .../config/_pylint_config/generate_command.py | 1 + .../config/_pylint_config/help_message.py | 1 + .../pylint/config/_pylint_config/main.py | 1 + .../pylint/config/_pylint_config/setup.py | 1 + .../pylint/config/_pylint_config/utils.py | 1 + .../site-packages/pylint/config/argument.py | 509 ++ .../pylint/config/arguments_manager.py | 1 + .../pylint/config/arguments_provider.py | 216 + .../pylint/config/callback_actions.py | 1 + .../pylint/config/config_file_parser.py | 124 + .../pylint/config/config_initialization.py | 135 + .../pylint/config/configuration_mixin.py | 1 + .../pylint/config/deprecation_actions.py | 1 + .../pylint/config/environment_variable.py | 1 + .../site-packages/pylint/config/exceptions.py | 1 + .../config/find_default_config_files.py | 1 + .../pylint/config/help_formatter.py | 1 + .../site-packages/pylint/config/option.py | 239 + .../pylint/config/option_manager_mixin.py | 1 + .../pylint/config/option_parser.py | 56 + .../pylint/config/options_provider_mixin.py | 1 + .../site-packages/pylint/config/utils.py | 1 + .../site-packages/pylint/constants.py | 299 + .../site-packages/pylint/epylint.py | 1 + .../site-packages/pylint/exceptions.py | 1 + .../pylint/extensions/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 642 bytes .../_check_docs_utils.cpython-310.pyc | Bin 0 -> 21545 bytes .../__pycache__/bad_builtin.cpython-310.pyc | Bin 0 -> 2062 bytes .../broad_try_clause.cpython-310.pyc | Bin 0 -> 2238 bytes .../__pycache__/check_elif.cpython-310.pyc | Bin 0 -> 2804 bytes .../__pycache__/code_style.cpython-310.pyc | Bin 0 -> 9181 bytes .../__pycache__/comparetozero.cpython-310.pyc | Bin 0 -> 2438 bytes .../comparison_placement.cpython-310.pyc | Bin 0 -> 2390 bytes .../confusing_elif.cpython-310.pyc | Bin 0 -> 2209 bytes ...oring_into_while_condition.cpython-310.pyc | Bin 0 -> 3269 bytes ...onsider_ternary_expression.cpython-310.pyc | Bin 0 -> 1707 bytes .../dict_init_mutate.cpython-310.pyc | Bin 0 -> 1981 bytes .../__pycache__/docparams.cpython-310.pyc | Bin 0 -> 17686 bytes .../__pycache__/docstyle.cpython-310.pyc | Bin 0 -> 2738 bytes .../__pycache__/dunder.cpython-310.pyc | Bin 0 -> 2256 bytes .../__pycache__/empty_comment.cpython-310.pyc | Bin 0 -> 2086 bytes .../__pycache__/emptystring.cpython-310.pyc | Bin 0 -> 2275 bytes .../eq_without_hash.cpython-310.pyc | Bin 0 -> 1796 bytes .../__pycache__/for_any_all.cpython-310.pyc | Bin 0 -> 4653 bytes .../__pycache__/magic_value.cpython-310.pyc | Bin 0 -> 4191 bytes .../__pycache__/mccabe.cpython-310.pyc | Bin 0 -> 6735 bytes .../__pycache__/no_self_use.cpython-310.pyc | Bin 0 -> 3574 bytes .../overlapping_exceptions.cpython-310.pyc | Bin 0 -> 2744 bytes .../private_import.cpython-310.pyc | Bin 0 -> 7885 bytes .../redefined_loop_name.cpython-310.pyc | Bin 0 -> 2970 bytes .../redefined_variable_type.cpython-310.pyc | Bin 0 -> 3405 bytes .../set_membership.cpython-310.pyc | Bin 0 -> 2208 bytes .../__pycache__/typing.cpython-310.pyc | Bin 0 -> 14418 bytes .../__pycache__/while_used.cpython-310.pyc | Bin 0 -> 1347 bytes .../pylint/extensions/_check_docs_utils.py | 848 +++ .../pylint/extensions/bad_builtin.py | 1 + .../pylint/extensions/broad_try_clause.py | 1 + .../pylint/extensions/check_elif.py | 1 + .../pylint/extensions/code_style.py | 1 + .../pylint/extensions/comparetozero.py | 1 + .../pylint/extensions/comparison_placement.py | 1 + .../pylint/extensions/confusing_elif.py | 55 + ...nsider_refactoring_into_while_condition.py | 1 + .../extensions/consider_ternary_expression.py | 1 + .../pylint/extensions/dict_init_mutate.py | 1 + .../pylint/extensions/docparams.py | 1 + .../pylint/extensions/docstyle.py | 1 + .../site-packages/pylint/extensions/dunder.py | 1 + .../pylint/extensions/empty_comment.py | 1 + .../pylint/extensions/emptystring.py | 1 + .../pylint/extensions/eq_without_hash.py | 1 + .../pylint/extensions/for_any_all.py | 1 + .../pylint/extensions/magic_value.py | 1 + .../site-packages/pylint/extensions/mccabe.py | 1 + .../pylint/extensions/no_self_use.py | 1 + .../extensions/overlapping_exceptions.py | 90 + .../pylint/extensions/private_import.py | 264 + .../pylint/extensions/redefined_loop_name.py | 1 + .../extensions/redefined_variable_type.py | 1 + .../pylint/extensions/set_membership.py | 1 + .../site-packages/pylint/extensions/typing.py | 504 ++ .../pylint/extensions/while_used.py | 1 + .../python3.10/site-packages/pylint/graph.py | 1 + .../site-packages/pylint/interfaces.py | 1 + .../site-packages/pylint/lint/__init__.py | 55 + .../lint/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1312 bytes .../__pycache__/base_options.cpython-310.pyc | Bin 0 -> 11910 bytes .../lint/__pycache__/caching.cpython-310.pyc | Bin 0 -> 2154 bytes .../expand_modules.cpython-310.pyc | Bin 0 -> 4576 bytes .../message_state_handler.cpython-310.pyc | Bin 0 -> 11284 bytes .../lint/__pycache__/parallel.cpython-310.pyc | Bin 0 -> 4258 bytes .../lint/__pycache__/pylinter.cpython-310.pyc | Bin 0 -> 38903 bytes .../report_functions.cpython-310.pyc | Bin 0 -> 2710 bytes .../lint/__pycache__/run.cpython-310.pyc | Bin 0 -> 5515 bytes .../lint/__pycache__/utils.cpython-310.pyc | Bin 0 -> 5079 bytes .../site-packages/pylint/lint/base_options.py | 595 ++ .../site-packages/pylint/lint/caching.py | 1 + .../pylint/lint/expand_modules.py | 182 + .../pylint/lint/message_state_handler.py | 1 + .../site-packages/pylint/lint/parallel.py | 178 + .../site-packages/pylint/lint/pylinter.py | 1388 ++++ .../pylint/lint/report_functions.py | 1 + .../site-packages/pylint/lint/run.py | 252 + .../site-packages/pylint/lint/utils.py | 144 + .../site-packages/pylint/message/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 564 bytes .../_deleted_message_ids.cpython-310.pyc | Bin 0 -> 6043 bytes .../__pycache__/message.cpython-310.pyc | Bin 0 -> 2482 bytes .../message_definition.cpython-310.pyc | Bin 0 -> 4976 bytes .../message_definition_store.cpython-310.pyc | Bin 0 -> 5224 bytes .../message_id_store.cpython-310.pyc | Bin 0 -> 5603 bytes .../pylint/message/_deleted_message_ids.py | 179 + .../site-packages/pylint/message/message.py | 1 + .../pylint/message/message_definition.py | 1 + .../message/message_definition_store.py | 1 + .../pylint/message/message_id_store.py | 1 + .../pylint/pyreverse/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 239 bytes .../__pycache__/diadefslib.cpython-310.pyc | Bin 0 -> 8569 bytes .../__pycache__/diagrams.cpython-310.pyc | Bin 0 -> 11078 bytes .../__pycache__/dot_printer.cpython-310.pyc | Bin 0 -> 5522 bytes .../__pycache__/inspector.cpython-310.pyc | Bin 0 -> 14028 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 6598 bytes .../mermaidjs_printer.cpython-310.pyc | Bin 0 -> 3737 bytes .../plantuml_printer.cpython-310.pyc | Bin 0 -> 3343 bytes .../__pycache__/printer.cpython-310.pyc | Bin 0 -> 4826 bytes .../printer_factory.cpython-310.pyc | Bin 0 -> 946 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 7916 bytes .../__pycache__/vcg_printer.cpython-310.pyc | Bin 0 -> 6866 bytes .../__pycache__/writer.cpython-310.pyc | Bin 0 -> 5293 bytes .../pylint/pyreverse/diadefslib.py | 1 + .../pylint/pyreverse/diagrams.py | 311 + .../pylint/pyreverse/dot_printer.py | 1 + .../pylint/pyreverse/inspector.py | 419 ++ .../site-packages/pylint/pyreverse/main.py | 304 + .../pylint/pyreverse/mermaidjs_printer.py | 1 + .../pylint/pyreverse/plantuml_printer.py | 1 + .../site-packages/pylint/pyreverse/printer.py | 1 + .../pylint/pyreverse/printer_factory.py | 1 + .../site-packages/pylint/pyreverse/utils.py | 1 + .../pylint/pyreverse/vcg_printer.py | 1 + .../site-packages/pylint/pyreverse/writer.py | 154 + .../pylint/reporters/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1096 bytes .../__pycache__/base_reporter.cpython-310.pyc | Bin 0 -> 3988 bytes .../collecting_reporter.cpython-310.pyc | Bin 0 -> 1172 bytes .../__pycache__/json_reporter.cpython-310.pyc | Bin 0 -> 3789 bytes .../multi_reporter.cpython-310.pyc | Bin 0 -> 4180 bytes .../reports_handler_mix_in.cpython-310.pyc | Bin 0 -> 3324 bytes .../__pycache__/text.cpython-310.pyc | Bin 0 -> 10329 bytes .../pylint/reporters/base_reporter.py | 1 + .../pylint/reporters/collecting_reporter.py | 1 + .../pylint/reporters/json_reporter.py | 1 + .../pylint/reporters/multi_reporter.py | 1 + .../reporters/reports_handler_mix_in.py | 1 + .../site-packages/pylint/reporters/text.py | 332 + .../pylint/reporters/ureports/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 275 bytes .../__pycache__/base_writer.cpython-310.pyc | Bin 0 -> 3676 bytes .../__pycache__/nodes.cpython-310.pyc | Bin 0 -> 6426 bytes .../__pycache__/text_writer.cpython-310.pyc | Bin 0 -> 4303 bytes .../pylint/reporters/ureports/base_writer.py | 1 + .../pylint/reporters/ureports/nodes.py | 1 + .../pylint/reporters/ureports/text_writer.py | 1 + .../pylint/testutils/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1199 bytes .../__pycache__/_run.cpython-310.pyc | Bin 0 -> 1980 bytes .../checker_test_case.cpython-310.pyc | Bin 0 -> 4030 bytes .../configuration_test.cpython-310.pyc | Bin 0 -> 4471 bytes .../__pycache__/constants.cpython-310.pyc | Bin 0 -> 744 bytes .../__pycache__/decorator.cpython-310.pyc | Bin 0 -> 1425 bytes .../functional_test_file.cpython-310.pyc | Bin 0 -> 548 bytes .../__pycache__/get_test_info.cpython-310.pyc | Bin 0 -> 1623 bytes .../global_test_linter.cpython-310.pyc | Bin 0 -> 628 bytes .../lint_module_test.cpython-310.pyc | Bin 0 -> 11369 bytes .../__pycache__/output_line.cpython-310.pyc | Bin 0 -> 4796 bytes .../__pycache__/pyreverse.cpython-310.pyc | Bin 0 -> 3398 bytes .../reporter_for_tests.cpython-310.pyc | Bin 0 -> 3396 bytes .../__pycache__/tokenize_str.cpython-310.pyc | Bin 0 -> 542 bytes .../unittest_linter.cpython-310.pyc | Bin 0 -> 2281 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 2872 bytes .../pylint/testutils/_primer/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 326 bytes .../package_to_lint.cpython-310.pyc | Bin 0 -> 4214 bytes .../__pycache__/primer.cpython-310.pyc | Bin 0 -> 3555 bytes .../primer_command.cpython-310.pyc | Bin 0 -> 1554 bytes .../primer_compare_command.cpython-310.pyc | Bin 0 -> 4596 bytes .../primer_prepare_command.cpython-310.pyc | Bin 0 -> 1832 bytes .../primer_run_command.cpython-310.pyc | Bin 0 -> 3818 bytes .../testutils/_primer/package_to_lint.py | 136 + .../pylint/testutils/_primer/primer.py | 1 + .../testutils/_primer/primer_command.py | 1 + .../_primer/primer_compare_command.py | 158 + .../_primer/primer_prepare_command.py | 1 + .../testutils/_primer/primer_run_command.py | 1 + .../site-packages/pylint/testutils/_run.py | 1 + .../pylint/testutils/checker_test_case.py | 1 + .../pylint/testutils/configuration_test.py | 1 + .../pylint/testutils/constants.py | 1 + .../pylint/testutils/decorator.py | 1 + .../pylint/testutils/functional/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 632 bytes .../find_functional_tests.cpython-310.pyc | Bin 0 -> 2037 bytes .../lint_module_output_update.cpython-310.pyc | Bin 0 -> 2354 bytes .../__pycache__/test_file.cpython-310.pyc | Bin 0 -> 4706 bytes .../functional/find_functional_tests.py | 1 + .../functional/lint_module_output_update.py | 1 + .../pylint/testutils/functional/test_file.py | 1 + .../pylint/testutils/functional_test_file.py | 1 + .../pylint/testutils/get_test_info.py | 1 + .../pylint/testutils/global_test_linter.py | 1 + .../pylint/testutils/lint_module_test.py | 326 + .../pylint/testutils/output_line.py | 1 + .../pylint/testutils/pyreverse.py | 127 + .../pylint/testutils/reporter_for_tests.py | 79 + .../pylint/testutils/testing_pylintrc | 1 + .../pylint/testutils/tokenize_str.py | 1 + .../pylint/testutils/unittest_linter.py | 1 + .../site-packages/pylint/testutils/utils.py | 1 + .../python3.10/site-packages/pylint/typing.py | 1 + .../site-packages/pylint/utils/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1125 bytes .../__pycache__/ast_walker.cpython-310.pyc | Bin 0 -> 3008 bytes .../utils/__pycache__/docs.cpython-310.pyc | Bin 0 -> 3148 bytes .../__pycache__/file_state.cpython-310.pyc | Bin 0 -> 6542 bytes .../__pycache__/linterstats.cpython-310.pyc | Bin 0 -> 10634 bytes .../__pycache__/pragma_parser.cpython-310.pyc | Bin 0 -> 4145 bytes .../utils/__pycache__/utils.cpython-310.pyc | Bin 0 -> 13017 bytes .../site-packages/pylint/utils/ast_walker.py | 1 + .../site-packages/pylint/utils/docs.py | 1 + .../site-packages/pylint/utils/file_state.py | 1 + .../site-packages/pylint/utils/linterstats.py | 394 ++ .../pylint/utils/pragma_parser.py | 1 + .../site-packages/pylint/utils/utils.py | 1 + .../LICENSE | 1 - .../METADATA | 1 - .../RECORD | 10 - .../WHEEL | 1 - .../direct_url.json | 1 - .../top_level.txt | 1 - .../INSTALLER | 1 + .../typing_extensions-4.4.0.dist-info/LICENSE | 1 + .../METADATA | 1 + .../typing_extensions-4.4.0.dist-info/RECORD | 7 + .../typing_extensions-4.4.0.dist-info/WHEEL | 1 + .../site-packages/typing_extensions.py | 2 +- .../wrapt-1.15.0.dist-info/INSTALLER | 1 + .../wrapt-1.15.0.dist-info/LICENSE | 1 + .../wrapt-1.15.0.dist-info/METADATA | 1 + .../wrapt-1.15.0.dist-info/RECORD | 17 + .../wrapt-1.15.0.dist-info/WHEEL | 1 + .../wrapt-1.15.0.dist-info/top_level.txt | 1 + .../site-packages/wrapt/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1025 bytes .../__pycache__/arguments.cpython-310.pyc | Bin 0 -> 1351 bytes .../__pycache__/decorators.cpython-310.pyc | Bin 0 -> 9327 bytes .../__pycache__/importer.cpython-310.pyc | Bin 0 -> 5636 bytes .../__pycache__/wrappers.cpython-310.pyc | Bin 0 -> 25402 bytes .../_wrappers.cpython-310-x86_64-linux-gnu.so | 1 + .../site-packages/wrapt/arguments.py | 1 + .../site-packages/wrapt/decorators.py | 1 + .../site-packages/wrapt/importer.py | 1 + .../site-packages/wrapt/wrappers.py | 1 + 865 files changed, 62182 insertions(+), 108 deletions(-) create mode 100755 venv/bin/autopep8 create mode 100755 venv/bin/epylint create mode 120000 venv/bin/get_objgraph create mode 100755 venv/bin/isort create mode 100755 venv/bin/isort-identify-imports create mode 100755 venv/bin/pycodestyle create mode 100755 venv/bin/pylint create mode 100755 venv/bin/pylint-config create mode 100755 venv/bin/pyreverse create mode 100755 venv/bin/symilar create mode 120000 venv/bin/undill create mode 100644 venv/lib/python3.10/site-packages/__pycache__/autopep8.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/__pycache__/mccabe.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/__pycache__/pycodestyle.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/CONTRIBUTORS.txt rename venv/lib/python3.10/site-packages/{typing_extensions-3.10.0.2.dist-info => astroid-2.15.0.dist-info}/INSTALLER (100%) create mode 120000 venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/LICENSE create mode 100644 venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/METADATA create mode 100644 venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/RECORD create mode 120000 venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/WHEEL create mode 120000 venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/top_level.txt create mode 120000 venv/lib/python3.10/site-packages/astroid/__init__.py create mode 100644 venv/lib/python3.10/site-packages/astroid/__pkginfo__.py create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/__pkginfo__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/_ast.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/_backport_stdlib_names.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/_cache.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/arguments.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/astroid_manager.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/bases.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/builder.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/const.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/constraint.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/context.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/decorators.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/exceptions.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/filter_statements.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/helpers.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/inference.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/inference_tip.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/manager.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/mixins.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/modutils.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/node_classes.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/objects.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/protocols.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/raw_building.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/rebuilder.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/scoped_nodes.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/test_utils.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/transforms.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/typing.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/__pycache__/util.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/astroid/_ast.py create mode 100644 venv/lib/python3.10/site-packages/astroid/_backport_stdlib_names.py create mode 120000 venv/lib/python3.10/site-packages/astroid/_cache.py create mode 100644 venv/lib/python3.10/site-packages/astroid/arguments.py create mode 120000 venv/lib/python3.10/site-packages/astroid/astroid_manager.py create mode 100644 venv/lib/python3.10/site-packages/astroid/bases.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/__init__.py create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_argparse.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_attrs.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_boto3.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_builtin_inference.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_collections.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_crypt.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_ctypes.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_curses.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_dataclasses.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_dateutil.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_fstrings.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_functools.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_gi.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_hashlib.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_http.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_hypothesis.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_io.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_mechanize.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_multiprocessing.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_namedtuple_enum.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_nose.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_einsumfunc.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_fromnumeric.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_function_base.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_multiarray.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_numeric.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_numerictypes.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_umath.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_ma.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_ndarray.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_random_mtrand.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_utils.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_pathlib.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_pkg_resources.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_pytest.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_qt.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_random.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_re.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_regex.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_responses.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_scipy_signal.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_signal.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_six.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_sqlalchemy.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_ssl.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_subprocess.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_threading.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_type.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_typing.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_unittest.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_uuid.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/__pycache__/helpers.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_argparse.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_attrs.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_boto3.py create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/brain_builtin_inference.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_collections.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_crypt.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_ctypes.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_curses.py create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/brain_dataclasses.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_dateutil.py create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/brain_fstrings.py create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/brain_functools.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_gi.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_hashlib.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_http.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_hypothesis.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_io.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_mechanize.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_multiprocessing.py create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/brain_namedtuple_enum.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_nose.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_einsumfunc.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_fromnumeric.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_function_base.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_multiarray.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_numeric.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_numerictypes.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_umath.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_ma.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_ndarray.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_random_mtrand.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_utils.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_pathlib.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_pkg_resources.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_pytest.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_qt.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_random.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_re.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_regex.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_responses.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_scipy_signal.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_signal.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_six.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_sqlalchemy.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_ssl.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_subprocess.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_threading.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_type.py create mode 100644 venv/lib/python3.10/site-packages/astroid/brain/brain_typing.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_unittest.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/brain_uuid.py create mode 120000 venv/lib/python3.10/site-packages/astroid/brain/helpers.py create mode 100644 venv/lib/python3.10/site-packages/astroid/builder.py create mode 120000 venv/lib/python3.10/site-packages/astroid/const.py create mode 100644 venv/lib/python3.10/site-packages/astroid/constraint.py create mode 120000 venv/lib/python3.10/site-packages/astroid/context.py create mode 100644 venv/lib/python3.10/site-packages/astroid/decorators.py create mode 120000 venv/lib/python3.10/site-packages/astroid/exceptions.py create mode 120000 venv/lib/python3.10/site-packages/astroid/filter_statements.py create mode 100644 venv/lib/python3.10/site-packages/astroid/helpers.py create mode 100644 venv/lib/python3.10/site-packages/astroid/inference.py create mode 100644 venv/lib/python3.10/site-packages/astroid/inference_tip.py create mode 120000 venv/lib/python3.10/site-packages/astroid/interpreter/__init__.py create mode 100644 venv/lib/python3.10/site-packages/astroid/interpreter/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/interpreter/__pycache__/dunder_lookup.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/interpreter/__pycache__/objectmodel.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/astroid/interpreter/_import/__init__.py create mode 100644 venv/lib/python3.10/site-packages/astroid/interpreter/_import/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/interpreter/_import/__pycache__/spec.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/interpreter/_import/__pycache__/util.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/interpreter/_import/spec.py create mode 120000 venv/lib/python3.10/site-packages/astroid/interpreter/_import/util.py create mode 120000 venv/lib/python3.10/site-packages/astroid/interpreter/dunder_lookup.py create mode 100644 venv/lib/python3.10/site-packages/astroid/interpreter/objectmodel.py create mode 100644 venv/lib/python3.10/site-packages/astroid/manager.py create mode 100644 venv/lib/python3.10/site-packages/astroid/mixins.py create mode 100644 venv/lib/python3.10/site-packages/astroid/modutils.py create mode 100644 venv/lib/python3.10/site-packages/astroid/node_classes.py create mode 100644 venv/lib/python3.10/site-packages/astroid/nodes/__init__.py create mode 100644 venv/lib/python3.10/site-packages/astroid/nodes/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/nodes/__pycache__/_base_nodes.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/nodes/__pycache__/as_string.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/nodes/__pycache__/const.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/nodes/__pycache__/node_classes.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/nodes/__pycache__/node_ng.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/nodes/__pycache__/utils.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/astroid/nodes/_base_nodes.py create mode 120000 venv/lib/python3.10/site-packages/astroid/nodes/as_string.py create mode 120000 venv/lib/python3.10/site-packages/astroid/nodes/const.py create mode 100644 venv/lib/python3.10/site-packages/astroid/nodes/node_classes.py create mode 100644 venv/lib/python3.10/site-packages/astroid/nodes/node_ng.py create mode 120000 venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__init__.py create mode 100644 venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__pycache__/mixin.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__pycache__/scoped_nodes.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__pycache__/utils.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/mixin.py create mode 100644 venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/scoped_nodes.py create mode 120000 venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/utils.py create mode 120000 venv/lib/python3.10/site-packages/astroid/nodes/utils.py create mode 120000 venv/lib/python3.10/site-packages/astroid/objects.py create mode 100644 venv/lib/python3.10/site-packages/astroid/protocols.py create mode 100644 venv/lib/python3.10/site-packages/astroid/raw_building.py create mode 100644 venv/lib/python3.10/site-packages/astroid/rebuilder.py create mode 100644 venv/lib/python3.10/site-packages/astroid/scoped_nodes.py create mode 120000 venv/lib/python3.10/site-packages/astroid/test_utils.py create mode 120000 venv/lib/python3.10/site-packages/astroid/transforms.py create mode 100644 venv/lib/python3.10/site-packages/astroid/typing.py create mode 100644 venv/lib/python3.10/site-packages/astroid/util.py create mode 120000 venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/AUTHORS.rst create mode 100644 venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/INSTALLER create mode 120000 venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/LICENSE create mode 100644 venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/METADATA create mode 100644 venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/RECORD rename venv/lib/python3.10/site-packages/{typing_extensions-3.10.0.2.dist-info => autopep8-2.0.2.dist-info}/REQUESTED (100%) create mode 120000 venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/WHEEL create mode 120000 venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/entry_points.txt create mode 120000 venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/top_level.txt create mode 100644 venv/lib/python3.10/site-packages/autopep8.py create mode 100644 venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/INSTALLER create mode 120000 venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/LICENSE create mode 120000 venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/METADATA create mode 100644 venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/RECORD create mode 120000 venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/WHEEL create mode 120000 venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/top_level.txt create mode 120000 venv/lib/python3.10/site-packages/dill/__diff.py create mode 120000 venv/lib/python3.10/site-packages/dill/__info__.py create mode 120000 venv/lib/python3.10/site-packages/dill/__init__.py create mode 100644 venv/lib/python3.10/site-packages/dill/__pycache__/__diff.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/__pycache__/__info__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/__pycache__/_dill.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/__pycache__/_objects.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/__pycache__/_shims.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/__pycache__/detect.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/__pycache__/logger.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/__pycache__/objtypes.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/__pycache__/pointers.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/__pycache__/session.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/__pycache__/settings.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/__pycache__/source.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/__pycache__/temp.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/dill/_dill.py create mode 120000 venv/lib/python3.10/site-packages/dill/_objects.py create mode 120000 venv/lib/python3.10/site-packages/dill/_shims.py create mode 120000 venv/lib/python3.10/site-packages/dill/detect.py create mode 120000 venv/lib/python3.10/site-packages/dill/logger.py create mode 120000 venv/lib/python3.10/site-packages/dill/objtypes.py create mode 120000 venv/lib/python3.10/site-packages/dill/pointers.py create mode 120000 venv/lib/python3.10/site-packages/dill/session.py create mode 120000 venv/lib/python3.10/site-packages/dill/settings.py create mode 120000 venv/lib/python3.10/site-packages/dill/source.py create mode 120000 venv/lib/python3.10/site-packages/dill/temp.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/__init__.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/__main__.py create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/__main__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_check.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_classdef.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_dataclasses.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_detect.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_dictviews.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_diff.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_extendpickle.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_fglobals.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_file.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_functions.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_functors.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_logger.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_mixins.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_module.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_moduledict.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_nested.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_objects.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_properties.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_pycapsule.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_recursive.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_registered.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_restricted.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_selected.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_session.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_source.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_temp.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_weakref.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_check.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_classdef.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_dataclasses.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_detect.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_dictviews.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_diff.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_extendpickle.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_fglobals.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_file.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_functions.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_functors.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_logger.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_mixins.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_module.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_moduledict.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_nested.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_objects.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_properties.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_pycapsule.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_recursive.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_registered.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_restricted.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_selected.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_session.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_source.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_temp.py create mode 120000 venv/lib/python3.10/site-packages/dill/tests/test_weakref.py create mode 100644 venv/lib/python3.10/site-packages/isort-5.12.0.dist-info/INSTALLER create mode 120000 venv/lib/python3.10/site-packages/isort-5.12.0.dist-info/LICENSE create mode 120000 venv/lib/python3.10/site-packages/isort-5.12.0.dist-info/METADATA create mode 100644 venv/lib/python3.10/site-packages/isort-5.12.0.dist-info/RECORD create mode 120000 venv/lib/python3.10/site-packages/isort-5.12.0.dist-info/WHEEL create mode 120000 venv/lib/python3.10/site-packages/isort-5.12.0.dist-info/entry_points.txt create mode 120000 venv/lib/python3.10/site-packages/isort/__init__.py create mode 120000 venv/lib/python3.10/site-packages/isort/__main__.py create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/__main__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/_version.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/api.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/comments.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/core.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/exceptions.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/files.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/format.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/hooks.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/identify.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/io.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/literal.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/logo.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/main.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/output.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/parse.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/place.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/profiles.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/pylama_isort.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/sections.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/settings.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/setuptools_commands.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/sorting.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/utils.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/wrap.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/__pycache__/wrap_modes.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/isort/_vendored/tomli/LICENSE create mode 120000 venv/lib/python3.10/site-packages/isort/_vendored/tomli/__init__.py create mode 100644 venv/lib/python3.10/site-packages/isort/_vendored/tomli/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/_vendored/tomli/__pycache__/_parser.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/_vendored/tomli/__pycache__/_re.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/isort/_vendored/tomli/_parser.py create mode 120000 venv/lib/python3.10/site-packages/isort/_vendored/tomli/_re.py create mode 120000 venv/lib/python3.10/site-packages/isort/_vendored/tomli/py.typed create mode 120000 venv/lib/python3.10/site-packages/isort/_version.py create mode 120000 venv/lib/python3.10/site-packages/isort/api.py create mode 120000 venv/lib/python3.10/site-packages/isort/comments.py create mode 120000 venv/lib/python3.10/site-packages/isort/core.py create mode 120000 venv/lib/python3.10/site-packages/isort/deprecated/__init__.py create mode 100644 venv/lib/python3.10/site-packages/isort/deprecated/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/deprecated/__pycache__/finders.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/isort/deprecated/finders.py create mode 120000 venv/lib/python3.10/site-packages/isort/exceptions.py create mode 120000 venv/lib/python3.10/site-packages/isort/files.py create mode 120000 venv/lib/python3.10/site-packages/isort/format.py create mode 120000 venv/lib/python3.10/site-packages/isort/hooks.py create mode 120000 venv/lib/python3.10/site-packages/isort/identify.py create mode 120000 venv/lib/python3.10/site-packages/isort/io.py create mode 120000 venv/lib/python3.10/site-packages/isort/literal.py create mode 120000 venv/lib/python3.10/site-packages/isort/logo.py create mode 120000 venv/lib/python3.10/site-packages/isort/main.py create mode 120000 venv/lib/python3.10/site-packages/isort/output.py create mode 120000 venv/lib/python3.10/site-packages/isort/parse.py create mode 120000 venv/lib/python3.10/site-packages/isort/place.py create mode 120000 venv/lib/python3.10/site-packages/isort/profiles.py create mode 120000 venv/lib/python3.10/site-packages/isort/py.typed create mode 120000 venv/lib/python3.10/site-packages/isort/pylama_isort.py create mode 120000 venv/lib/python3.10/site-packages/isort/sections.py create mode 120000 venv/lib/python3.10/site-packages/isort/settings.py create mode 120000 venv/lib/python3.10/site-packages/isort/setuptools_commands.py create mode 120000 venv/lib/python3.10/site-packages/isort/sorting.py create mode 120000 venv/lib/python3.10/site-packages/isort/stdlibs/__init__.py create mode 100644 venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/all.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py2.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py27.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py3.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py310.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py311.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py36.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py37.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py38.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py39.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/isort/stdlibs/all.py create mode 120000 venv/lib/python3.10/site-packages/isort/stdlibs/py2.py create mode 120000 venv/lib/python3.10/site-packages/isort/stdlibs/py27.py create mode 120000 venv/lib/python3.10/site-packages/isort/stdlibs/py3.py create mode 120000 venv/lib/python3.10/site-packages/isort/stdlibs/py310.py create mode 120000 venv/lib/python3.10/site-packages/isort/stdlibs/py311.py create mode 120000 venv/lib/python3.10/site-packages/isort/stdlibs/py36.py create mode 120000 venv/lib/python3.10/site-packages/isort/stdlibs/py37.py create mode 120000 venv/lib/python3.10/site-packages/isort/stdlibs/py38.py create mode 120000 venv/lib/python3.10/site-packages/isort/stdlibs/py39.py create mode 120000 venv/lib/python3.10/site-packages/isort/utils.py create mode 120000 venv/lib/python3.10/site-packages/isort/wrap.py create mode 120000 venv/lib/python3.10/site-packages/isort/wrap_modes.py create mode 120000 venv/lib/python3.10/site-packages/lazy_object_proxy-1.9.0.dist-info/AUTHORS.rst create mode 100644 venv/lib/python3.10/site-packages/lazy_object_proxy-1.9.0.dist-info/INSTALLER create mode 120000 venv/lib/python3.10/site-packages/lazy_object_proxy-1.9.0.dist-info/LICENSE create mode 120000 venv/lib/python3.10/site-packages/lazy_object_proxy-1.9.0.dist-info/METADATA create mode 100644 venv/lib/python3.10/site-packages/lazy_object_proxy-1.9.0.dist-info/RECORD create mode 120000 venv/lib/python3.10/site-packages/lazy_object_proxy-1.9.0.dist-info/WHEEL create mode 120000 venv/lib/python3.10/site-packages/lazy_object_proxy-1.9.0.dist-info/top_level.txt create mode 120000 venv/lib/python3.10/site-packages/lazy_object_proxy/__init__.py create mode 100644 venv/lib/python3.10/site-packages/lazy_object_proxy/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/lazy_object_proxy/__pycache__/_version.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/lazy_object_proxy/__pycache__/compat.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/lazy_object_proxy/__pycache__/simple.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/lazy_object_proxy/__pycache__/slots.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/lazy_object_proxy/__pycache__/utils.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/lazy_object_proxy/_version.py create mode 120000 venv/lib/python3.10/site-packages/lazy_object_proxy/cext.cpython-310-x86_64-linux-gnu.so create mode 120000 venv/lib/python3.10/site-packages/lazy_object_proxy/compat.py create mode 120000 venv/lib/python3.10/site-packages/lazy_object_proxy/simple.py create mode 120000 venv/lib/python3.10/site-packages/lazy_object_proxy/slots.py create mode 120000 venv/lib/python3.10/site-packages/lazy_object_proxy/utils.py create mode 100644 venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/INSTALLER create mode 120000 venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/LICENSE create mode 120000 venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/METADATA create mode 100644 venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/RECORD create mode 120000 venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/WHEEL create mode 120000 venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/entry_points.txt create mode 120000 venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/top_level.txt create mode 120000 venv/lib/python3.10/site-packages/mccabe.py create mode 100644 venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/INSTALLER create mode 120000 venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/LICENSE create mode 120000 venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/METADATA create mode 100644 venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/RECORD create mode 120000 venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/WHEEL create mode 120000 venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/entry_points.txt create mode 120000 venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/top_level.txt create mode 120000 venv/lib/python3.10/site-packages/pycodestyle.py create mode 100644 venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/CONTRIBUTORS.txt create mode 100644 venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/INSTALLER create mode 120000 venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/LICENSE create mode 100644 venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/METADATA create mode 100644 venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/RECORD create mode 100644 venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/REQUESTED create mode 120000 venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/WHEEL create mode 120000 venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/entry_points.txt create mode 120000 venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/top_level.txt create mode 120000 venv/lib/python3.10/site-packages/pylint/__init__.py create mode 120000 venv/lib/python3.10/site-packages/pylint/__main__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/__pkginfo__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/__pycache__/__main__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/__pycache__/__pkginfo__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/__pycache__/constants.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/__pycache__/epylint.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/__pycache__/exceptions.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/__pycache__/graph.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/__pycache__/interfaces.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/__pycache__/typing.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/async.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/bad_chained_comparison.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/base_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/deprecated.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/design_analysis.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/dunder_methods.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/ellipsis_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/exceptions.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/format.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/imports.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/lambda_expressions.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/logging.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/mapreduce_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/method_args.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/misc.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/modified_iterating_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/nested_min_max.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/newstyle.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/non_ascii_names.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/raw_metrics.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/similar.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/spelling.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/stdlib.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/strings.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/threading_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/typecheck.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/unicode.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/unsupported_version.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/utils.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/variables.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/async.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/bad_chained_comparison.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/base/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/basic_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/basic_error_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/comparison_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/docstring_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/pass_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/base/basic_checker.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/base/basic_error_checker.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/base/comparison_checker.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/base/docstring_checker.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/__pycache__/checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/__pycache__/naming_style.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/checker.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/naming_style.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/base/pass_checker.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/base_checker.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/classes/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/classes/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/classes/__pycache__/class_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/classes/__pycache__/special_methods_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/classes/class_checker.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/classes/special_methods_checker.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/deprecated.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/design_analysis.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/dunder_methods.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/ellipsis_checker.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/exceptions.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/format.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/imports.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/lambda_expressions.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/logging.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/mapreduce_checker.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/method_args.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/misc.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/modified_iterating_checker.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/nested_min_max.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/newstyle.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/non_ascii_names.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/raw_metrics.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/refactoring/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/refactoring/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/refactoring/__pycache__/implicit_booleaness_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/refactoring/__pycache__/not_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/refactoring/__pycache__/recommendation_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/refactoring/__pycache__/refactoring_checker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/refactoring/implicit_booleaness_checker.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/refactoring/not_checker.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/refactoring/recommendation_checker.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/refactoring/refactoring_checker.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/similar.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/spelling.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/stdlib.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/strings.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/threading_checker.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/typecheck.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/unicode.py create mode 120000 venv/lib/python3.10/site-packages/pylint/checkers/unsupported_version.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/utils.py create mode 100644 venv/lib/python3.10/site-packages/pylint/checkers/variables.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/argument.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/arguments_manager.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/arguments_provider.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/callback_actions.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/config_file_parser.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/config_initialization.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/configuration_mixin.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/deprecation_actions.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/environment_variable.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/exceptions.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/find_default_config_files.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/help_formatter.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/option.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/option_manager_mixin.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/option_parser.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/options_provider_mixin.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/__pycache__/utils.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/pylint/config/_pylint_config/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/config/_pylint_config/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/_pylint_config/__pycache__/generate_command.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/_pylint_config/__pycache__/help_message.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/_pylint_config/__pycache__/main.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/_pylint_config/__pycache__/setup.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/config/_pylint_config/__pycache__/utils.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/pylint/config/_pylint_config/generate_command.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/_pylint_config/help_message.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/_pylint_config/main.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/_pylint_config/setup.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/_pylint_config/utils.py create mode 100644 venv/lib/python3.10/site-packages/pylint/config/argument.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/arguments_manager.py create mode 100644 venv/lib/python3.10/site-packages/pylint/config/arguments_provider.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/callback_actions.py create mode 100644 venv/lib/python3.10/site-packages/pylint/config/config_file_parser.py create mode 100644 venv/lib/python3.10/site-packages/pylint/config/config_initialization.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/configuration_mixin.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/deprecation_actions.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/environment_variable.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/exceptions.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/find_default_config_files.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/help_formatter.py create mode 100644 venv/lib/python3.10/site-packages/pylint/config/option.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/option_manager_mixin.py create mode 100644 venv/lib/python3.10/site-packages/pylint/config/option_parser.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/options_provider_mixin.py create mode 120000 venv/lib/python3.10/site-packages/pylint/config/utils.py create mode 100644 venv/lib/python3.10/site-packages/pylint/constants.py create mode 120000 venv/lib/python3.10/site-packages/pylint/epylint.py create mode 120000 venv/lib/python3.10/site-packages/pylint/exceptions.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/_check_docs_utils.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/bad_builtin.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/broad_try_clause.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/check_elif.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/code_style.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/comparetozero.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/comparison_placement.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/confusing_elif.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/consider_refactoring_into_while_condition.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/consider_ternary_expression.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/dict_init_mutate.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/docparams.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/docstyle.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/dunder.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/empty_comment.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/emptystring.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/eq_without_hash.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/for_any_all.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/magic_value.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/mccabe.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/no_self_use.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/overlapping_exceptions.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/private_import.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/redefined_loop_name.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/redefined_variable_type.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/set_membership.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/typing.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/__pycache__/while_used.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/_check_docs_utils.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/bad_builtin.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/broad_try_clause.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/check_elif.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/code_style.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/comparetozero.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/comparison_placement.py create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/confusing_elif.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/consider_refactoring_into_while_condition.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/consider_ternary_expression.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/dict_init_mutate.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/docparams.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/docstyle.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/dunder.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/empty_comment.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/emptystring.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/eq_without_hash.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/for_any_all.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/magic_value.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/mccabe.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/no_self_use.py create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/overlapping_exceptions.py create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/private_import.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/redefined_loop_name.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/redefined_variable_type.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/set_membership.py create mode 100644 venv/lib/python3.10/site-packages/pylint/extensions/typing.py create mode 120000 venv/lib/python3.10/site-packages/pylint/extensions/while_used.py create mode 120000 venv/lib/python3.10/site-packages/pylint/graph.py create mode 120000 venv/lib/python3.10/site-packages/pylint/interfaces.py create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/__pycache__/base_options.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/__pycache__/caching.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/__pycache__/expand_modules.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/__pycache__/message_state_handler.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/__pycache__/parallel.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/__pycache__/pylinter.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/__pycache__/report_functions.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/__pycache__/run.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/__pycache__/utils.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/base_options.py create mode 120000 venv/lib/python3.10/site-packages/pylint/lint/caching.py create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/expand_modules.py create mode 120000 venv/lib/python3.10/site-packages/pylint/lint/message_state_handler.py create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/parallel.py create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/pylinter.py create mode 120000 venv/lib/python3.10/site-packages/pylint/lint/report_functions.py create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/run.py create mode 100644 venv/lib/python3.10/site-packages/pylint/lint/utils.py create mode 120000 venv/lib/python3.10/site-packages/pylint/message/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/message/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/message/__pycache__/_deleted_message_ids.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/message/__pycache__/message.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/message/__pycache__/message_definition.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/message/__pycache__/message_definition_store.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/message/__pycache__/message_id_store.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/message/_deleted_message_ids.py create mode 120000 venv/lib/python3.10/site-packages/pylint/message/message.py create mode 120000 venv/lib/python3.10/site-packages/pylint/message/message_definition.py create mode 120000 venv/lib/python3.10/site-packages/pylint/message/message_definition_store.py create mode 120000 venv/lib/python3.10/site-packages/pylint/message/message_id_store.py create mode 120000 venv/lib/python3.10/site-packages/pylint/pyreverse/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/__pycache__/diadefslib.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/__pycache__/diagrams.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/__pycache__/dot_printer.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/__pycache__/inspector.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/__pycache__/main.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/__pycache__/mermaidjs_printer.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/__pycache__/plantuml_printer.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/__pycache__/printer.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/__pycache__/printer_factory.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/__pycache__/utils.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/__pycache__/vcg_printer.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/__pycache__/writer.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/pylint/pyreverse/diadefslib.py create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/diagrams.py create mode 120000 venv/lib/python3.10/site-packages/pylint/pyreverse/dot_printer.py create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/inspector.py create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/main.py create mode 120000 venv/lib/python3.10/site-packages/pylint/pyreverse/mermaidjs_printer.py create mode 120000 venv/lib/python3.10/site-packages/pylint/pyreverse/plantuml_printer.py create mode 120000 venv/lib/python3.10/site-packages/pylint/pyreverse/printer.py create mode 120000 venv/lib/python3.10/site-packages/pylint/pyreverse/printer_factory.py create mode 120000 venv/lib/python3.10/site-packages/pylint/pyreverse/utils.py create mode 120000 venv/lib/python3.10/site-packages/pylint/pyreverse/vcg_printer.py create mode 100644 venv/lib/python3.10/site-packages/pylint/pyreverse/writer.py create mode 120000 venv/lib/python3.10/site-packages/pylint/reporters/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/reporters/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/reporters/__pycache__/base_reporter.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/reporters/__pycache__/collecting_reporter.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/reporters/__pycache__/json_reporter.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/reporters/__pycache__/multi_reporter.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/reporters/__pycache__/reports_handler_mix_in.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/reporters/__pycache__/text.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/pylint/reporters/base_reporter.py create mode 120000 venv/lib/python3.10/site-packages/pylint/reporters/collecting_reporter.py create mode 120000 venv/lib/python3.10/site-packages/pylint/reporters/json_reporter.py create mode 120000 venv/lib/python3.10/site-packages/pylint/reporters/multi_reporter.py create mode 120000 venv/lib/python3.10/site-packages/pylint/reporters/reports_handler_mix_in.py create mode 100644 venv/lib/python3.10/site-packages/pylint/reporters/text.py create mode 120000 venv/lib/python3.10/site-packages/pylint/reporters/ureports/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/reporters/ureports/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/reporters/ureports/__pycache__/base_writer.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/reporters/ureports/__pycache__/nodes.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/reporters/ureports/__pycache__/text_writer.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/pylint/reporters/ureports/base_writer.py create mode 120000 venv/lib/python3.10/site-packages/pylint/reporters/ureports/nodes.py create mode 120000 venv/lib/python3.10/site-packages/pylint/reporters/ureports/text_writer.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/_run.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/checker_test_case.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/configuration_test.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/constants.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/decorator.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/functional_test_file.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/get_test_info.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/global_test_linter.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/lint_module_test.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/output_line.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/pyreverse.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/reporter_for_tests.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/tokenize_str.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/unittest_linter.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/__pycache__/utils.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/_primer/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/_primer/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/_primer/__pycache__/package_to_lint.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/_primer/__pycache__/primer.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/_primer/__pycache__/primer_command.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/_primer/__pycache__/primer_compare_command.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/_primer/__pycache__/primer_prepare_command.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/_primer/__pycache__/primer_run_command.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/_primer/package_to_lint.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/_primer/primer.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/_primer/primer_command.py create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/_primer/primer_compare_command.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/_primer/primer_prepare_command.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/_primer/primer_run_command.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/_run.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/checker_test_case.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/configuration_test.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/constants.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/decorator.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/functional/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/functional/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/functional/__pycache__/find_functional_tests.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/functional/__pycache__/lint_module_output_update.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/functional/__pycache__/test_file.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/functional/find_functional_tests.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/functional/lint_module_output_update.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/functional/test_file.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/functional_test_file.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/get_test_info.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/global_test_linter.py create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/lint_module_test.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/output_line.py create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/pyreverse.py create mode 100644 venv/lib/python3.10/site-packages/pylint/testutils/reporter_for_tests.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/testing_pylintrc create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/tokenize_str.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/unittest_linter.py create mode 120000 venv/lib/python3.10/site-packages/pylint/testutils/utils.py create mode 120000 venv/lib/python3.10/site-packages/pylint/typing.py create mode 120000 venv/lib/python3.10/site-packages/pylint/utils/__init__.py create mode 100644 venv/lib/python3.10/site-packages/pylint/utils/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/utils/__pycache__/ast_walker.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/utils/__pycache__/docs.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/utils/__pycache__/file_state.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/utils/__pycache__/linterstats.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/utils/__pycache__/pragma_parser.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/pylint/utils/__pycache__/utils.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/pylint/utils/ast_walker.py create mode 120000 venv/lib/python3.10/site-packages/pylint/utils/docs.py create mode 120000 venv/lib/python3.10/site-packages/pylint/utils/file_state.py create mode 100644 venv/lib/python3.10/site-packages/pylint/utils/linterstats.py create mode 120000 venv/lib/python3.10/site-packages/pylint/utils/pragma_parser.py create mode 120000 venv/lib/python3.10/site-packages/pylint/utils/utils.py delete mode 120000 venv/lib/python3.10/site-packages/typing_extensions-3.10.0.2.dist-info/LICENSE delete mode 120000 venv/lib/python3.10/site-packages/typing_extensions-3.10.0.2.dist-info/METADATA delete mode 100644 venv/lib/python3.10/site-packages/typing_extensions-3.10.0.2.dist-info/RECORD delete mode 120000 venv/lib/python3.10/site-packages/typing_extensions-3.10.0.2.dist-info/WHEEL delete mode 100644 venv/lib/python3.10/site-packages/typing_extensions-3.10.0.2.dist-info/direct_url.json delete mode 120000 venv/lib/python3.10/site-packages/typing_extensions-3.10.0.2.dist-info/top_level.txt create mode 100644 venv/lib/python3.10/site-packages/typing_extensions-4.4.0.dist-info/INSTALLER create mode 120000 venv/lib/python3.10/site-packages/typing_extensions-4.4.0.dist-info/LICENSE create mode 120000 venv/lib/python3.10/site-packages/typing_extensions-4.4.0.dist-info/METADATA create mode 100644 venv/lib/python3.10/site-packages/typing_extensions-4.4.0.dist-info/RECORD create mode 120000 venv/lib/python3.10/site-packages/typing_extensions-4.4.0.dist-info/WHEEL create mode 100644 venv/lib/python3.10/site-packages/wrapt-1.15.0.dist-info/INSTALLER create mode 120000 venv/lib/python3.10/site-packages/wrapt-1.15.0.dist-info/LICENSE create mode 120000 venv/lib/python3.10/site-packages/wrapt-1.15.0.dist-info/METADATA create mode 100644 venv/lib/python3.10/site-packages/wrapt-1.15.0.dist-info/RECORD create mode 120000 venv/lib/python3.10/site-packages/wrapt-1.15.0.dist-info/WHEEL create mode 120000 venv/lib/python3.10/site-packages/wrapt-1.15.0.dist-info/top_level.txt create mode 120000 venv/lib/python3.10/site-packages/wrapt/__init__.py create mode 100644 venv/lib/python3.10/site-packages/wrapt/__pycache__/__init__.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/wrapt/__pycache__/arguments.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/wrapt/__pycache__/decorators.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/wrapt/__pycache__/importer.cpython-310.pyc create mode 100644 venv/lib/python3.10/site-packages/wrapt/__pycache__/wrappers.cpython-310.pyc create mode 120000 venv/lib/python3.10/site-packages/wrapt/_wrappers.cpython-310-x86_64-linux-gnu.so create mode 120000 venv/lib/python3.10/site-packages/wrapt/arguments.py create mode 120000 venv/lib/python3.10/site-packages/wrapt/decorators.py create mode 120000 venv/lib/python3.10/site-packages/wrapt/importer.py create mode 120000 venv/lib/python3.10/site-packages/wrapt/wrappers.py diff --git a/main.py b/main.py index 4fb5d46d..ffb4cd2f 100644 --- a/main.py +++ b/main.py @@ -21,30 +21,33 @@ Does not work if no Start (Should print out NO START FOUND) Does not work if no End (Should print out NO END FOUND) Does not work if no path (Should print out NO PATH FOUND) """ + + + + import heapq - - class MazeSolver: - # self corresponds to "this" in js, it refers to object of MazeSolver class - def __init__(self, maze): - # assign readed maze 2D array to parameter from class MazeSolver - self.maze = maze - self.start, self.end = self.find_start_and_end() + # self corresponds to "this" in js, it refers to object of MazeSolver class + def __init__(self, maze): + # assign readed maze 2D array to parameter from class MazeSolver + self.maze = maze + self.start, self.end = self.find_start_and_end() -# go through each character in 2D array and find one that corresponds to Start/End character +# go through each character in 2D array and find one that corresponds to +# Start/End character - def find_start_and_end(self): - start = end = None - for row in range(len(self.maze)): - for col in range(len(self.maze[row])): - if self.maze[row][col] == 'S': - start = (row, col) - elif self.maze[row][col] == 'E': - end = (row, col) - if start != None and end != None: - return start, end - print(f"DID NOT FOUND START OR END, Start: {start}, End: {end}") + def find_start_and_end(self): + start = end = None + for row in range(len(self.maze)): + for col in range(len(self.maze[row])): + if self.maze[row][col] == 'S': + start = (row, col) + elif self.maze[row][col] == 'E': + end = (row, col) + if start is not None and end is not None: + return start, end + print(f"DID NOT FOUND START OR END, Start: {start}, End: {end}") # Go through each neighboor # N @@ -52,94 +55,102 @@ class MazeSolver: # N # If it is not a "wall" (#) add its position to list of neighbors - def get_neighbors(self, position): - row, col = position - neighbors = [] - if row > 0 and self.maze[row - 1][col] != '#': - neighbors.append((row - 1, col)) - if col > 0 and self.maze[row][col - 1] != '#': - neighbors.append((row, col - 1)) - if row < len(self.maze) - 1 and self.maze[row + 1][col] != '#': - neighbors.append((row + 1, col)) - if col < len(self.maze[row]) - 1 and self.maze[row][col + 1] != '#': - neighbors.append((row, col + 1)) - return neighbors + def get_neighbors(self, position): + row, col = position + neighbors = [] + if row > 0 and self.maze[row - 1][col] != '#': + neighbors.append((row - 1, col)) + if col > 0 and self.maze[row][col - 1] != '#': + neighbors.append((row, col - 1)) + if row < len(self.maze) - 1 and self.maze[row + 1][col] != '#': + neighbors.append((row + 1, col)) + if col < len(self.maze[row]) - 1 and self.maze[row][col + 1] != '#': + neighbors.append((row, col + 1)) + return neighbors # find path through maze - def solve(self): - queue = [] - # set means that values inside can not repeat - visited = set() - # https://docs.python.org/3/library/heapq.html - # push onto the queue (which becomes heapq), element containinig values - # we use heapq so the element with lowest heurisitc value will always be at the top of heap - heapq.heappush( - queue, (self.heuristicEuclidean(self.start), self.start, [self.start])) + def solve(self): + queue = [] + # set means that values inside can not repeat + visited = set() + # https://docs.python.org/3/library/heapq.html + # push onto the queue (which becomes heapq), element containinig values + # we use heapq so the element with lowest heurisitc value will always + # be at the top of heap + heapq.heappush( + queue, (self.heuristicEuclidean( + self.start), self.start, [ + self.start])) - # go through queue until it's empty - # find neighbour (which is not wall) closests to END point (based on heuristic) - # go there and repeat - # if cannot find path it starts over but skips the path that lead it to dead end - while queue: - # pop first element of heap - # first value is skipped and we only save current position and path on heap - _, current, path = heapq.heappop(queue) - # if we already visited current skip code and go to next iteration - if current in visited: - continue + # go through queue until it's empty + # find neighbour (which is not wall) closests to END point (based on heuristic) + # go there and repeat + # if cannot find path it starts over but skips the path that lead it to + # dead end + while queue: + # pop first element of heap + # first value is skipped and we only save current position and path + # on heap + _, current, path = heapq.heappop(queue) + # if we already visited current skip code and go to next iteration + if current in visited: + continue # if we found the end return path - if current == self.end: - return path - visited.add(current) - for neighbor in self.get_neighbors(current): - if neighbor not in visited: - new_path = path + [neighbor] - heapq.heappush(queue, - (self.heuristicEuclidean(neighbor), neighbor, new_path)) - print_maze(self.maze, new_path) - print() + if current == self.end: + return path + visited.add(current) + for neighbor in self.get_neighbors(current): + if neighbor not in visited: + new_path = path + [neighbor] + heapq.heappush( + queue, (self.heuristicEuclidean(neighbor), neighbor, new_path)) + print_maze(self.maze, new_path) + print() - # This heuristic returns the Manhatan distance between the given position and the maze's end - def heuristicManhatan(self, position): - return abs(position[0] - self.end[0]) + abs(position[1] - self.end[1]) + # This heuristic returns the Manhatan distance between the given position + # and the maze's end + def heuristicManhatan(self, position): + return abs(position[0] - self.end[0]) + abs(position[1] - self.end[1]) - # This heuristic returns the Euclidean distance between the given position and the maze's end - def heuristicEuclidean(self, position): - return (abs(position[0] - self.end[0])**2 + - abs(position[1] - self.end[1])**2)**0.5 + # This heuristic returns the Euclidean distance between the given position + # and the maze's end + def heuristicEuclidean(self, position): + return (abs(position[0] - self.end[0])**2 + + abs(position[1] - self.end[1])**2)**0.5 # Open and load text file to array def load_maze(filename): - # Open for reading only and save to fileContents - fileContents = open(filename, 'r') - # strip() removes extra white spaces from the beginning and the end of a string - # list() changes string to array of chars - # Inside of square brackets we will have an array of characters for each line of file - # after going through every line in a file we will have 2D array of arrays of characters of every line - maze = [list(line.strip()) for line in fileContents] - return maze + # Open for reading only and save to fileContents + fileContents = open(filename, 'r') + # strip() removes extra white spaces from the beginning and the end of a string + # list() changes string to array of chars + # Inside of square brackets we will have an array of characters for each line of file + # after going through every line in a file we will have 2D array of arrays + # of characters of every line + maze = [list(line.strip()) for line in fileContents] + return maze def print_maze(maze, path=None): - if path is None: - path = [] - for row in range(len(maze)): - for col in range(len(maze[row])): - if (row, col) in path: - print('*', end='') - else: - print(maze[row][col], end='') - print() + if path is None: + path = [] + for row in range(len(maze)): + for col in range(len(maze[row])): + if (row, col) in path: + print('*', end='') + else: + print(maze[row][col], end='') + print() # Ran first in the code if __name__ == '__main__': - # Open and load text file to array - maze = load_maze('mazes/mazeDeadEnd.txt') - # Initialize MazeSolver object with maze as paramater - solver = MazeSolver(maze) - # Find path using MazeSolver solve method - path = solver.solve() - print_maze(maze, path) + # Open and load text file to array + maze = load_maze('mazes/mazeDeadEnd.txt') + # Initialize MazeSolver object with maze as paramater + solver = MazeSolver(maze) + # Find path using MazeSolver solve method + path = solver.solve() + print_maze(maze, path) diff --git a/venv/bin/autopep8 b/venv/bin/autopep8 new file mode 100755 index 00000000..53c1bd46 --- /dev/null +++ b/venv/bin/autopep8 @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import re +import sys +from autopep8 import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/epylint b/venv/bin/epylint new file mode 100755 index 00000000..d37d6f8c --- /dev/null +++ b/venv/bin/epylint @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import re +import sys +from pylint import run_epylint +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(run_epylint()) diff --git a/venv/bin/get_objgraph b/venv/bin/get_objgraph new file mode 120000 index 00000000..058fc9d8 --- /dev/null +++ b/venv/bin/get_objgraph @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/6a/50/3f/1f2a45ac215d6ff2ad0866b0c04c341528fa5265298b72142c813ce4da \ No newline at end of file diff --git a/venv/bin/isort b/venv/bin/isort new file mode 100755 index 00000000..b5d54d4a --- /dev/null +++ b/venv/bin/isort @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import re +import sys +from isort.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/isort-identify-imports b/venv/bin/isort-identify-imports new file mode 100755 index 00000000..d7304b15 --- /dev/null +++ b/venv/bin/isort-identify-imports @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import re +import sys +from isort.main import identify_imports_main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(identify_imports_main()) diff --git a/venv/bin/pycodestyle b/venv/bin/pycodestyle new file mode 100755 index 00000000..d6925748 --- /dev/null +++ b/venv/bin/pycodestyle @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import re +import sys +from pycodestyle import _main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(_main()) diff --git a/venv/bin/pylint b/venv/bin/pylint new file mode 100755 index 00000000..7708e71f --- /dev/null +++ b/venv/bin/pylint @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import re +import sys +from pylint import run_pylint +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(run_pylint()) diff --git a/venv/bin/pylint-config b/venv/bin/pylint-config new file mode 100755 index 00000000..60946af1 --- /dev/null +++ b/venv/bin/pylint-config @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import re +import sys +from pylint import _run_pylint_config +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(_run_pylint_config()) diff --git a/venv/bin/pyreverse b/venv/bin/pyreverse new file mode 100755 index 00000000..610df84c --- /dev/null +++ b/venv/bin/pyreverse @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import re +import sys +from pylint import run_pyreverse +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(run_pyreverse()) diff --git a/venv/bin/symilar b/venv/bin/symilar new file mode 100755 index 00000000..2f93feb6 --- /dev/null +++ b/venv/bin/symilar @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import re +import sys +from pylint import run_symilar +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(run_symilar()) diff --git a/venv/bin/undill b/venv/bin/undill new file mode 120000 index 00000000..3375e250 --- /dev/null +++ b/venv/bin/undill @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/e2/49/4a/6f73df3fa16a5661da7e3c9b169500e2697bc26be21656ce72fcca59af \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/__pycache__/autopep8.cpython-310.pyc b/venv/lib/python3.10/site-packages/__pycache__/autopep8.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1bd8aea1a4faf79b61f8b417dddf8b70e8436d8c GIT binary patch literal 100400 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%0A^g0ln{#`;jk8nwG-tg)rhWCCxHBHkdxFCbd> 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 DYrDaJ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/__pycache__/mccabe.cpython-310.pyc b/venv/lib/python3.10/site-packages/__pycache__/mccabe.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a34b8cb817236f37c030eb1d6ec28b3d9ba83454 GIT binary patch literal 11335 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 I;%x5!0K!eRc>n+a literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/__pycache__/pycodestyle.cpython-310.pyc b/venv/lib/python3.10/site-packages/__pycache__/pycodestyle.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..422ce9affa7d6f6e098260ff3bd9bcab825c2dd6 GIT binary patch literal 70560 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�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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/__pycache__/typing_extensions.cpython-310.pyc b/venv/lib/python3.10/site-packages/__pycache__/typing_extensions.cpython-310.pyc index d41cdc43e8b9bc51631e1d6a286d7fcb9c268f67..817292d2082350c3221d939008306caddbe61ed2 100644 GIT binary patch literal 64978 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 literal 79111 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 diff --git a/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/CONTRIBUTORS.txt b/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/CONTRIBUTORS.txt new file mode 100644 index 00000000..685f8a0b --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/CONTRIBUTORS.txt @@ -0,0 +1,199 @@ +# This file is autocompleted by 'contributors-txt', +# using the configuration in 'script/.contributors_aliases.json'. +# Do not add new persons manually and only add information without +# using '-' as the line first character. +# Please verify that your change are stable if you modify manually. + +Ex-maintainers +-------------- +- Claudiu Popa +- Sylvain Thénault +- Torsten Marek + + +Maintainers +----------- +- Pierre Sassoulas +- Daniël van Noord <13665637+DanielNoord@users.noreply.github.com> +- Hippo91 +- Marc Mueller <30130371+cdce8p@users.noreply.github.com> +- Jacob Walls +- Bryce Guinta +- Ceridwen +- Mark Byrne <31762852+mbyrnepr2@users.noreply.github.com> +- Łukasz Rogalski +- Florian Bruhin +- Ashley Whetter +- Dimitri Prybysh +- Areveny + + +Contributors +------------ +- Emile Anclin +- Nick Drozd +- Andrew Haigh +- Julien Cristau +- David Liu +- Alexandre Fayolle +- Eevee (Alex Munroe) +- David Gilman +- Julien Jehannet +- Calen Pennington +- Tushar Sadhwani <86737547+tushar-deepsource@users.noreply.github.com> +- Hugo van Kemenade +- Tim Martin +- Phil Schaf +- Alex Hall +- Raphael Gaschignard +- Radosław Ganczarek +- Paligot Gérard +- Ioana Tagirta +- Derek Gustafson +- David Shea +- Daniel Harding +- Christian Clauss +- Ville Skyttä +- Rene Zhang +- Philip Lorenz +- Nicolas Chauvat +- Michael K +- Mario Corchero +- Marien Zwart +- Laura Médioni +- James Addison <55152140+jayaddison@users.noreply.github.com> +- FELD Boris +- Enji Cooper +- Dani Alcala <112832187+clavedeluna@users.noreply.github.com> +- Adrien Di Mascio +- tristanlatr <19967168+tristanlatr@users.noreply.github.com> +- emile@crater.logilab.fr +- doranid +- brendanator +- Tomas Gavenciak +- Tim Paine +- Thomas Hisch +- Stefan Scherfke +- Sergei Lebedev <185856+superbobry@users.noreply.github.com> +- Saugat Pachhai (सौगात) +- Ram Rachum +- Pierre-Yves David +- Peter Pentchev +- Peter Kolbus +- Omer Katz +- Moises Lopez +- Michal Vasilek +- Keichi Takahashi +- Kavins Singh +- Karthikeyan Singaravelan +- Joshua Cannon +- John Vandenberg +- Jacob Bogdanov +- Google, Inc. +- David Euresti +- David Douard +- David Cain +- Anthony Truchet +- Anthony Sottile +- Alexander Shadchin +- wgehalo +- rr- +- raylu +- plucury +- ostr00000 +- noah-weingarden <33741795+noah-weingarden@users.noreply.github.com> +- nathannaveen <42319948+nathannaveen@users.noreply.github.com> +- mathieui +- markmcclain +- ioanatia +- grayjk +- adam-grant-hendry <59346180+adam-grant-hendry@users.noreply.github.com> +- Zbigniew Jędrzejewski-Szmek +- Zac Hatfield-Dodds +- Vilnis Termanis +- Valentin Valls +- Uilian Ries +- Tomas Novak +- Thirumal Venkat +- SupImDos <62866982+SupImDos@users.noreply.github.com> +- Stanislav Levin +- Simon Hewitt +- Serhiy Storchaka +- Roy Wright +- Robin Jarry +- René Fritze <47802+renefritze@users.noreply.github.com> +- Redoubts +- Philipp Hörist +- Peter de Blanc +- Peter Talley +- Ovidiu Sabou +- Nicolas Noirbent +- Neil Girdhar +- Michał Masłowski +- Mateusz Bysiek +- Leandro T. C. Melo +- Konrad Weihmann +- Kian Meng, Ang +- Kai Mueller <15907922+kasium@users.noreply.github.com> +- Jörg Thalheim +- Jonathan Striebel +- John Belmonte +- Jeff Widman +- Jeff Quast +- Jarrad Hope +- Jared Garst +- Jakub Wilk +- Iva Miholic +- Ionel Maries Cristian +- HoverHell +- HQupgradeHQ <18361586+HQupgradeHQ@users.noreply.github.com> +- Grygorii Iermolenko +- Gregory P. Smith +- Giuseppe Scrivano +- Frédéric Chapoton +- Francis Charette Migneault +- Felix Mölder +- Federico Bond +- DudeNr33 <3929834+DudeNr33@users.noreply.github.com> +- Dmitry Shachnev +- Denis Laxalde +- Deepyaman Datta +- David Poirier +- Dave Hirschfeld +- Dave Baum +- Daniel Martin +- Daniel Colascione +- Damien Baty +- Craig Franklin +- Colin Kennedy +- Cole Robinson +- Christoph Reiter +- Chris Philip +- BioGeek +- Bianca Power <30207144+biancapower@users.noreply.github.com> +- Benjamin Elven <25181435+S3ntinelX@users.noreply.github.com> +- Ben Elliston +- Becker Awqatty +- Batuhan Taskaya +- BasPH +- Azeem Bande-Ali +- Avram Lubkin +- Aru Sahni +- Artsiom Kaval +- Anubhav <35621759+anubh-v@users.noreply.github.com> +- Antoine Boellinger +- Alphadelta14 +- Alexander Scheel +- Alexander Presnyakov +- Ahmed Azzaoui + +Co-Author +--------- +The following persons were credited manually but did not commit themselves +under this name, or we did not manage to find their commits in the history. + +- François Mockers +- platings +- carl +- alain lefroy +- Mark Gius diff --git a/venv/lib/python3.10/site-packages/typing_extensions-3.10.0.2.dist-info/INSTALLER b/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/INSTALLER similarity index 100% rename from venv/lib/python3.10/site-packages/typing_extensions-3.10.0.2.dist-info/INSTALLER rename to venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/INSTALLER diff --git a/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/LICENSE b/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/LICENSE new file mode 120000 index 00000000..767cd6d2 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/LICENSE @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/fe/a1/6b/da9e734dea0d9c8d9f5b909878ef4171626354329609fffcf3db42cb24 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/METADATA b/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/METADATA new file mode 100644 index 00000000..2cbe2760 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/METADATA @@ -0,0 +1,128 @@ +Metadata-Version: 2.1 +Name: astroid +Version: 2.15.0 +Summary: An abstract syntax tree for Python with inference support. +Author-email: Python Code Quality Authority +License: LGPL-2.1-or-later +Project-URL: Docs, https://pylint.readthedocs.io/projects/astroid/en/latest/ +Project-URL: Source Code, https://github.com/PyCQA/astroid +Project-URL: Bug tracker, https://github.com/PyCQA/astroid/issues +Project-URL: Discord server, https://discord.gg/Egy6P8AMB5 +Keywords: static code analysis,python,abstract syntax tree +Classifier: Development Status :: 6 - Mature +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2) +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Software Development :: Quality Assurance +Classifier: Topic :: Software Development :: Testing +Requires-Python: >=3.7.2 +Description-Content-Type: text/x-rst +License-File: LICENSE +License-File: CONTRIBUTORS.txt +Requires-Dist: lazy-object-proxy (>=1.4.0) +Requires-Dist: typed-ast (<2.0,>=1.4.0) ; implementation_name == "cpython" and python_version < "3.8" +Requires-Dist: wrapt (<2,>=1.11) ; python_version < "3.11" +Requires-Dist: typing-extensions (>=4.0.0) ; python_version < "3.11" +Requires-Dist: wrapt (<2,>=1.14) ; python_version >= "3.11" + +Astroid +======= + +.. image:: https://codecov.io/gh/PyCQA/astroid/branch/main/graph/badge.svg?token=Buxy4WptLb + :target: https://codecov.io/gh/PyCQA/astroid + :alt: Coverage badge from codecov + +.. image:: https://readthedocs.org/projects/astroid/badge/?version=latest + :target: http://astroid.readthedocs.io/en/latest/?badge=latest + :alt: Documentation Status + +.. image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/ambv/black + +.. image:: https://results.pre-commit.ci/badge/github/PyCQA/astroid/main.svg + :target: https://results.pre-commit.ci/latest/github/PyCQA/astroid/main + :alt: pre-commit.ci status + +.. |tidelift_logo| image:: https://raw.githubusercontent.com/PyCQA/astroid/main/doc/media/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White.png + :width: 200 + :alt: Tidelift + +.. list-table:: + :widths: 10 100 + + * - |tidelift_logo| + - Professional support for astroid is available as part of the + `Tidelift Subscription`_. Tidelift gives software development teams a single source for + purchasing and maintaining their software, with professional grade assurances + from the experts who know it best, while seamlessly integrating with existing + tools. + +.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-astroid?utm_source=pypi-astroid&utm_medium=referral&utm_campaign=readme + + + +What's this? +------------ + +The aim of this module is to provide a common base representation of +python source code. It is currently the library powering pylint's capabilities. + +It provides a compatible representation which comes from the `_ast` +module. It rebuilds the tree generated by the builtin _ast module by +recursively walking down the AST and building an extended ast. The new +node classes have additional methods and attributes for different +usages. They include some support for static inference and local name +scopes. Furthermore, astroid can also build partial trees by inspecting living +objects. + + +Installation +------------ + +Extract the tarball, jump into the created directory and run:: + + pip install . + + +If you want to do an editable installation, you can run:: + + pip install -e . + + +If you have any questions, please mail the code-quality@python.org +mailing list for support. See +http://mail.python.org/mailman/listinfo/code-quality for subscription +information and archives. + +Documentation +------------- +http://astroid.readthedocs.io/en/latest/ + + +Python Versions +--------------- + +astroid 2.0 is currently available for Python 3 only. If you want Python 2 +support, use an older version of astroid (though note that these versions +are no longer supported). + +Test +---- + +Tests are in the 'test' subdirectory. To launch the whole tests suite, you can use +either `tox` or `pytest`:: + + tox + pytest diff --git a/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/RECORD b/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/RECORD new file mode 100644 index 00000000..619a9b45 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/RECORD @@ -0,0 +1,209 @@ +astroid-2.15.0.dist-info/CONTRIBUTORS.txt,sha256=_R56rA3okHgrKxY42SDN2zOaFZV49Oks0iFtQ_tIIBs,8038 +astroid-2.15.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +astroid-2.15.0.dist-info/LICENSE,sha256=_qFr2p5zTeoNnI2fW5CYeO9BcWJjVDKWCf_889tCyyQ,26516 +astroid-2.15.0.dist-info/METADATA,sha256=rju1DTgF4pzdcf_H6Kb8EQeonNs7FtpDgLyaecs6tmg,4786 +astroid-2.15.0.dist-info/RECORD,, +astroid-2.15.0.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92 +astroid-2.15.0.dist-info/top_level.txt,sha256=HsdW4O2x7ZXRj6k-agi3RaQybGLobI3VSE-jt4vQUXM,8 +astroid/__init__.py,sha256=HKHncgrj70qSs9Gg4aDpFyiAQFHhrSoR1O20OQ3K0Bo,5091 +astroid/__pkginfo__.py,sha256=yDKgWZv5-RlTCQCeK9XRzNWKAN03w8wVDGG2JiXtjZM,274 +astroid/__pycache__/__init__.cpython-310.pyc,, +astroid/__pycache__/__pkginfo__.cpython-310.pyc,, +astroid/__pycache__/_ast.cpython-310.pyc,, +astroid/__pycache__/_backport_stdlib_names.cpython-310.pyc,, +astroid/__pycache__/_cache.cpython-310.pyc,, +astroid/__pycache__/arguments.cpython-310.pyc,, +astroid/__pycache__/astroid_manager.cpython-310.pyc,, +astroid/__pycache__/bases.cpython-310.pyc,, +astroid/__pycache__/builder.cpython-310.pyc,, +astroid/__pycache__/const.cpython-310.pyc,, +astroid/__pycache__/constraint.cpython-310.pyc,, +astroid/__pycache__/context.cpython-310.pyc,, +astroid/__pycache__/decorators.cpython-310.pyc,, +astroid/__pycache__/exceptions.cpython-310.pyc,, +astroid/__pycache__/filter_statements.cpython-310.pyc,, +astroid/__pycache__/helpers.cpython-310.pyc,, +astroid/__pycache__/inference.cpython-310.pyc,, +astroid/__pycache__/inference_tip.cpython-310.pyc,, +astroid/__pycache__/manager.cpython-310.pyc,, +astroid/__pycache__/mixins.cpython-310.pyc,, +astroid/__pycache__/modutils.cpython-310.pyc,, +astroid/__pycache__/node_classes.cpython-310.pyc,, +astroid/__pycache__/objects.cpython-310.pyc,, +astroid/__pycache__/protocols.cpython-310.pyc,, +astroid/__pycache__/raw_building.cpython-310.pyc,, +astroid/__pycache__/rebuilder.cpython-310.pyc,, +astroid/__pycache__/scoped_nodes.cpython-310.pyc,, +astroid/__pycache__/test_utils.cpython-310.pyc,, +astroid/__pycache__/transforms.cpython-310.pyc,, +astroid/__pycache__/typing.cpython-310.pyc,, +astroid/__pycache__/util.cpython-310.pyc,, +astroid/_ast.py,sha256=fx6vCj7YJJRQSf3GQYRllJ9hRKPh9-QczU3crjt3IrA,4146 +astroid/_backport_stdlib_names.py,sha256=pmMEGwionQpfJdJaJomDF6Qc6peNMxChcOsNa8U2IDo,7016 +astroid/_cache.py,sha256=ZuO1Kl9HXaxoJ_hJXbzWqkMGmQR7CGf-R4cPen9odzM,786 +astroid/arguments.py,sha256=9GeVion6IpISnxQGyXU6uHxfJ_kuDXOCYm3Jv6SJNUg,12958 +astroid/astroid_manager.py,sha256=02l_ltGWEglvkoL_qMGmYxuHpDA5-ySPf0r1cGwIQqU,572 +astroid/bases.py,sha256=9GT3_gPrLdlS3zmvW3Nmv2X2pQcY5_vywz1MVky4ero,25594 +astroid/brain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +astroid/brain/__pycache__/__init__.cpython-310.pyc,, +astroid/brain/__pycache__/brain_argparse.cpython-310.pyc,, +astroid/brain/__pycache__/brain_attrs.cpython-310.pyc,, +astroid/brain/__pycache__/brain_boto3.cpython-310.pyc,, +astroid/brain/__pycache__/brain_builtin_inference.cpython-310.pyc,, +astroid/brain/__pycache__/brain_collections.cpython-310.pyc,, +astroid/brain/__pycache__/brain_crypt.cpython-310.pyc,, +astroid/brain/__pycache__/brain_ctypes.cpython-310.pyc,, +astroid/brain/__pycache__/brain_curses.cpython-310.pyc,, +astroid/brain/__pycache__/brain_dataclasses.cpython-310.pyc,, +astroid/brain/__pycache__/brain_dateutil.cpython-310.pyc,, +astroid/brain/__pycache__/brain_fstrings.cpython-310.pyc,, +astroid/brain/__pycache__/brain_functools.cpython-310.pyc,, +astroid/brain/__pycache__/brain_gi.cpython-310.pyc,, +astroid/brain/__pycache__/brain_hashlib.cpython-310.pyc,, +astroid/brain/__pycache__/brain_http.cpython-310.pyc,, +astroid/brain/__pycache__/brain_hypothesis.cpython-310.pyc,, +astroid/brain/__pycache__/brain_io.cpython-310.pyc,, +astroid/brain/__pycache__/brain_mechanize.cpython-310.pyc,, +astroid/brain/__pycache__/brain_multiprocessing.cpython-310.pyc,, +astroid/brain/__pycache__/brain_namedtuple_enum.cpython-310.pyc,, +astroid/brain/__pycache__/brain_nose.cpython-310.pyc,, +astroid/brain/__pycache__/brain_numpy_core_einsumfunc.cpython-310.pyc,, +astroid/brain/__pycache__/brain_numpy_core_fromnumeric.cpython-310.pyc,, +astroid/brain/__pycache__/brain_numpy_core_function_base.cpython-310.pyc,, +astroid/brain/__pycache__/brain_numpy_core_multiarray.cpython-310.pyc,, +astroid/brain/__pycache__/brain_numpy_core_numeric.cpython-310.pyc,, +astroid/brain/__pycache__/brain_numpy_core_numerictypes.cpython-310.pyc,, +astroid/brain/__pycache__/brain_numpy_core_umath.cpython-310.pyc,, +astroid/brain/__pycache__/brain_numpy_ma.cpython-310.pyc,, +astroid/brain/__pycache__/brain_numpy_ndarray.cpython-310.pyc,, +astroid/brain/__pycache__/brain_numpy_random_mtrand.cpython-310.pyc,, +astroid/brain/__pycache__/brain_numpy_utils.cpython-310.pyc,, +astroid/brain/__pycache__/brain_pathlib.cpython-310.pyc,, +astroid/brain/__pycache__/brain_pkg_resources.cpython-310.pyc,, +astroid/brain/__pycache__/brain_pytest.cpython-310.pyc,, +astroid/brain/__pycache__/brain_qt.cpython-310.pyc,, +astroid/brain/__pycache__/brain_random.cpython-310.pyc,, +astroid/brain/__pycache__/brain_re.cpython-310.pyc,, +astroid/brain/__pycache__/brain_regex.cpython-310.pyc,, +astroid/brain/__pycache__/brain_responses.cpython-310.pyc,, +astroid/brain/__pycache__/brain_scipy_signal.cpython-310.pyc,, +astroid/brain/__pycache__/brain_signal.cpython-310.pyc,, +astroid/brain/__pycache__/brain_six.cpython-310.pyc,, +astroid/brain/__pycache__/brain_sqlalchemy.cpython-310.pyc,, +astroid/brain/__pycache__/brain_ssl.cpython-310.pyc,, +astroid/brain/__pycache__/brain_subprocess.cpython-310.pyc,, +astroid/brain/__pycache__/brain_threading.cpython-310.pyc,, +astroid/brain/__pycache__/brain_type.cpython-310.pyc,, +astroid/brain/__pycache__/brain_typing.cpython-310.pyc,, +astroid/brain/__pycache__/brain_unittest.cpython-310.pyc,, +astroid/brain/__pycache__/brain_uuid.cpython-310.pyc,, +astroid/brain/__pycache__/helpers.cpython-310.pyc,, +astroid/brain/brain_argparse.py,sha256=ozU4z8-HTSX6tl6g2ysoqFGn6b8jK4Bt_NlAKl_jYyQ,1557 +astroid/brain/brain_attrs.py,sha256=PGFhUbL428Mc_cuyFgZIB2alt2ICfeaamWB-0C_kxAk,2857 +astroid/brain/brain_boto3.py,sha256=gZOkDoY1YZk24EpOMVQVj0MBuNfBWn_XfDmmlH4jyHU,1012 +astroid/brain/brain_builtin_inference.py,sha256=N-B5FxLAID8wztOTdiZEoc42qrQh5M8MrtSH4BaQwZs,34254 +astroid/brain/brain_collections.py,sha256=__vh_SUp3ymY68i_UYW1OMlAjDN-Hiv_NHdDQs98HV4,4416 +astroid/brain/brain_crypt.py,sha256=Zo66z94cQOL-HNOcAQSPNs_Ib_xNLLY9qEtxZ1VkbAM,863 +astroid/brain/brain_ctypes.py,sha256=55flnAIj_Th_eqqG1HRMDR5ctt74ww1vDsSF42F26Es,2660 +astroid/brain/brain_curses.py,sha256=XXyCeLASFFksO2zSbrZgB_AImGBlIGZ7Pgjdm04x-jg,3477 +astroid/brain/brain_dataclasses.py,sha256=81fglaiPlsUkbImjLpSIpdVCdmmZa8vYUcCKQFo9YAI,22089 +astroid/brain/brain_dateutil.py,sha256=1INt87VBa9Qt0DzEuI1r7cEtdyg5CvNDUIdVCv-j_mc,767 +astroid/brain/brain_fstrings.py,sha256=VU14-7tVsJWlZt0r3UMB8lPS-Bb72dyYcDvd1PmTPJM,2471 +astroid/brain/brain_functools.py,sha256=91kJd49eYZGh9fG45uBS4I6j635Q7VctZND-iqB2dRg,5986 +astroid/brain/brain_gi.py,sha256=LYtvbe48qmyugTP31CcrqfM6X0ra_h6ntTBuKGCIrcM,7543 +astroid/brain/brain_hashlib.py,sha256=WE7fQJCA3Rp1ZFDIseQjhrLEcsYhOfrka2PcvvuZ6Tg,2821 +astroid/brain/brain_http.py,sha256=mYLcMdh_ka5d11IpdWg6WrG3R7R2wN4bKOLVG0W3vPk,10640 +astroid/brain/brain_hypothesis.py,sha256=K4LfRb2KT6H5B7oGxAXQLcJFl9bkeKfFW8IEceGAbfw,1732 +astroid/brain/brain_io.py,sha256=l499fbVi5HUbPWoyQn1xTHaPgRcf0hsKjjI90BdHzyQ,1526 +astroid/brain/brain_mechanize.py,sha256=45syVjTGklYjS469vPsuHmyic09OTZtcJuM7FEXcMYI,2646 +astroid/brain/brain_multiprocessing.py,sha256=htHZ3zSyv4eqh6c-AFRPt2GlyyPb4Jg8OQfAolojR8Q,3211 +astroid/brain/brain_namedtuple_enum.py,sha256=j9GnadFsrVT6A-tz_w-HQcOBUHU4IiG09qKpJNSdA0s,22725 +astroid/brain/brain_nose.py,sha256=DCUwKzR14Se5tF-s54AMwFoRvhsHH_nf6agrh966VpQ,2320 +astroid/brain/brain_numpy_core_einsumfunc.py,sha256=CuZtZYZGDhPzV46l1xyNl_7RfMCaQ4bYyZgJ9f8KxcQ,825 +astroid/brain/brain_numpy_core_fromnumeric.py,sha256=3UFRtK5U51AVQNxawf9ElhFv2tizhj5RfyCSnPT3u54,732 +astroid/brain/brain_numpy_core_function_base.py,sha256=_k-WRQ_x0QEHhvr9IwuTLnpGoCYOVO0GAH7e3DyoHNQ,1298 +astroid/brain/brain_numpy_core_multiarray.py,sha256=NIxnvno-mhp-P6IKfyRaKOFtiHx8H9cEchjgx69oht0,4238 +astroid/brain/brain_numpy_core_numeric.py,sha256=VAc51Ud8QDujsh29e-RQK5SBcKW_jzjZIFmntCslCKU,1629 +astroid/brain/brain_numpy_core_numerictypes.py,sha256=HVJ_paQwjh2V8qz0Juei6b2ZRm_dmDJodiDKfAcE-mE,8546 +astroid/brain/brain_numpy_core_umath.py,sha256=2EhXmtiw8wQcdUtbnlLLTjHAOHpQ1c9BXHdc6kHJGbA,4893 +astroid/brain/brain_numpy_ma.py,sha256=1XHvZH1C3CEXTiRH3BJxpFiztgqBYEGd9JDFquGsUMk,896 +astroid/brain/brain_numpy_ndarray.py,sha256=HohawmatzpNMOJAhYbEPJGZdCTNmYO1Oz-IPxYDd5mM,8998 +astroid/brain/brain_numpy_random_mtrand.py,sha256=Wrpm9SX8kH0Xsk9b3qpR0rhs-MEb0I5aN4E-66wkLkM,3436 +astroid/brain/brain_numpy_utils.py,sha256=wgSRUgGdn8Io0AoTe6avll35oceRq2S6ZXqNviljvGI,2637 +astroid/brain/brain_pathlib.py,sha256=Ec8Xuo-4IIG2wH4875c8c2Xe_I0fqPbPqoKCJOttVlE,1542 +astroid/brain/brain_pkg_resources.py,sha256=W3Q4G6mYTYtJY9iWQv3vEO8_lpmLFAin9aQLtBRLxAc,2200 +astroid/brain/brain_pytest.py,sha256=suTDBHCJ_p4F7TGXjwVJAFtiAP-VlkFE2gncXjLRQKM,2223 +astroid/brain/brain_qt.py,sha256=qvexV4IFa4YKL0Nyo6qxmz_DfDDNwFVwBTJGADtVkiI,2808 +astroid/brain/brain_random.py,sha256=grXJrYL3rZpzm8SmuEnWkLwWNqWKtd5YmwbBoV6mjN4,2890 +astroid/brain/brain_re.py,sha256=aSU-HyEWsCrc1seiFohZw54ivcNtC-_AyiChJOSU-7Q,2870 +astroid/brain/brain_regex.py,sha256=UzW2lF2ctbdD8BX4fkC7PFtXDdGNUcdBKZx7sJiO4Z0,3362 +astroid/brain/brain_responses.py,sha256=Jn7jS8L26T5hnUwOcHX469FTkVs3_Yz8OiVRPAx3Bjo,1868 +astroid/brain/brain_scipy_signal.py,sha256=Mi93D6-j94tqhqDHCbabVs3_eDAhti88CL1_rOvnG_I,2276 +astroid/brain/brain_signal.py,sha256=18rOCgLVmM1rtc6BFYPx4qziSrfPt6CrP-A2fJyMWBY,3880 +astroid/brain/brain_six.py,sha256=MWQm81s9Zb_i1NIqY3MnXuawlsXqgK1BDj1vBDZ-MdE,7625 +astroid/brain/brain_sqlalchemy.py,sha256=onKAxgKY-GYLe2v6PVK3APBn_z8txokEZfDcXt33GuE,1009 +astroid/brain/brain_ssl.py,sha256=8MdXhl9ZvYVe6U_gtSTtgnm_Dned2Ic9MbgfSj56RHU,6554 +astroid/brain/brain_subprocess.py,sha256=Kayri4dMqwtXbZTOhB0E05p2ckKc7hIGPt1jA3zv2xA,2996 +astroid/brain/brain_threading.py,sha256=rN-dQ_4Zo0AZOOiPQigxF3NEgmDC7DY-r0ujLN6W52c,870 +astroid/brain/brain_type.py,sha256=VUwQsehFIShvKrm98ywa5-gGz7eLwJnBHCpQdreGOGM,2483 +astroid/brain/brain_typing.py,sha256=uficlx7AzFIkcBQKeOvmzg_75kxAZENTDilXTYv-rfE,14315 +astroid/brain/brain_unittest.py,sha256=X_xqI70br7JgIrUiUwP4Hm9mQwCx9jBfvNW5h0wmp-0,1147 +astroid/brain/brain_uuid.py,sha256=t0fj_QeNzbPga03GS0YP92sjjEmxN04rlgZ4dt82JHE,667 +astroid/brain/helpers.py,sha256=qtThXG2zllaFm8Ril8Mjbb6yuRPUqy-elXz4Qu8UKX0,908 +astroid/builder.py,sha256=bkCDciVprfLz3vyg6BfoTaUMe34tRB1n0z3hCXvoyLE,18788 +astroid/const.py,sha256=-C9gZEVAgp83YpjnG4k6BKBlTkn22J3UeR59IzPzC-s,1095 +astroid/constraint.py,sha256=RgYVUe0CiEXeXB0iGDd896CEDgCHpwALdzZEFogagwo,5043 +astroid/context.py,sha256=BwdZndGFMeP9ldxt-c4LP21N61ZGCFjySNCASiGHWhw,5994 +astroid/decorators.py,sha256=4_SEOBUSxU60_7SaOkACXvBiiwGxYVd7E6YJdhB-5AY,10090 +astroid/exceptions.py,sha256=wcJFoxkuWUslQMsjjBsvQadlTl-CCLin4I5Mg9EA4XQ,13089 +astroid/filter_statements.py,sha256=zd55vGal1W6k1DZRsZoTQodtTZCtKrmebUVkECeoUS4,9643 +astroid/helpers.py,sha256=2ppef_tEbjaFyvFb2QrNq36I8pNk-wxLDkpfwXN0dc8,11312 +astroid/inference.py,sha256=IJZGg3YLTIXfHxDuOnEdd5IAfdk7sTPWSGt8OXqEHpM,45121 +astroid/inference_tip.py,sha256=4ims3HAlCZwVybV1CyLxreDtPVNEnvta_OKb_ELAbyA,2888 +astroid/interpreter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +astroid/interpreter/__pycache__/__init__.cpython-310.pyc,, +astroid/interpreter/__pycache__/dunder_lookup.cpython-310.pyc,, +astroid/interpreter/__pycache__/objectmodel.cpython-310.pyc,, +astroid/interpreter/_import/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +astroid/interpreter/_import/__pycache__/__init__.cpython-310.pyc,, +astroid/interpreter/_import/__pycache__/spec.cpython-310.pyc,, +astroid/interpreter/_import/__pycache__/util.cpython-310.pyc,, +astroid/interpreter/_import/spec.py,sha256=1s6GkO0yVgdtXHJAhD8v8W27ZmtkfT5p-mAKf8v4xmY,16381 +astroid/interpreter/_import/util.py,sha256=b5ggIRSth_I5Uwv3s44jMwf3OlnFAWIV-57wX3XK9yM,4592 +astroid/interpreter/dunder_lookup.py,sha256=77YNmgp6l2sPA7UIaUpjaP6-4x26NP93IihPR5EEv-c,2172 +astroid/interpreter/objectmodel.py,sha256=SVtDFz0kAlHgkRTcIp4r3t2UEjeJLE2jXSxZdo8QhXw,31177 +astroid/manager.py,sha256=g17lbC6NM9ieO3hZVJLtwE6Gb_JlCsEJJ42YtK7B27Q,17598 +astroid/mixins.py,sha256=4fuPIi4N5ucNbocjVrS5UpEc_6Jkn3gsYD--JG85TII,1182 +astroid/modutils.py,sha256=nmwwzrvSGIl4DRHC6WoyGPDkDtKgyKpcHSidjw_B8UU,23481 +astroid/node_classes.py,sha256=ws0UW2SFejWF75iHfxx-u80XQt4beDAiDyabWrOwlPE,1827 +astroid/nodes/__init__.py,sha256=Uuli4TfBDzdUTPvVvjp-aEB0SpMv-6gdoWajJt1fguo,5043 +astroid/nodes/__pycache__/__init__.cpython-310.pyc,, +astroid/nodes/__pycache__/_base_nodes.cpython-310.pyc,, +astroid/nodes/__pycache__/as_string.cpython-310.pyc,, +astroid/nodes/__pycache__/const.cpython-310.pyc,, +astroid/nodes/__pycache__/node_classes.cpython-310.pyc,, +astroid/nodes/__pycache__/node_ng.cpython-310.pyc,, +astroid/nodes/__pycache__/utils.cpython-310.pyc,, +astroid/nodes/_base_nodes.py,sha256=oQ4ueaxb5-JAnG1w17lK8TRo4xs3KatHrY985M0qgss,7398 +astroid/nodes/as_string.py,sha256=i4s5M3Ghaef0d-Jgqi5NkPz8AYcXG3ZL7N3HPYZsp_0,24451 +astroid/nodes/const.py,sha256=iyQn_v-wEzK6uXc-dEMoliPVSRy0NZ8T3XmvvPXLuP4,797 +astroid/nodes/node_classes.py,sha256=vmiMXFjaRS7o8ag4yShavJxfyd3CIh9xOfJiORxxQ2M,172738 +astroid/nodes/node_ng.py,sha256=pqrceCAgS64qDmFGBghjWnneodH6P9KYsUFhsi_9Aq8,28223 +astroid/nodes/scoped_nodes/__init__.py,sha256=CRdThe_LiW7SgcJz3pHSL8oFqHKNIJWg1WkQOkws994,1219 +astroid/nodes/scoped_nodes/__pycache__/__init__.cpython-310.pyc,, +astroid/nodes/scoped_nodes/__pycache__/mixin.cpython-310.pyc,, +astroid/nodes/scoped_nodes/__pycache__/scoped_nodes.cpython-310.pyc,, +astroid/nodes/scoped_nodes/__pycache__/utils.cpython-310.pyc,, +astroid/nodes/scoped_nodes/mixin.py,sha256=mN3oqKpS2AWOtrBjHDDfReVO7OxAMhl_es-jzsn89Js,6917 +astroid/nodes/scoped_nodes/scoped_nodes.py,sha256=DdqlbBVNPoQbP3AE8nJGsnHjMH0uU92Tp32B8F87v1w,106494 +astroid/nodes/scoped_nodes/utils.py,sha256=Nnjdkcbm9zs72HcoV9b_hE6P-SLZ7MCB9urU-WUDNVg,1216 +astroid/nodes/utils.py,sha256=Uy6xoownLyWwDtuZ5qUpjbq19P2pUIcj0J04khbH5HY,423 +astroid/objects.py,sha256=8roM53sWwFzusAIvz3nOj0LaQEXdzJw0ANfb6mDMy5w,12757 +astroid/protocols.py,sha256=dkQszq5bOlJ7Jlyu4hdF8l7sv7hVfH7glKWVblf3bkU,32684 +astroid/raw_building.py,sha256=TI55TaZL35Zi3bk2DThToKEQ8rMOhZCgAMayfktxbAM,22875 +astroid/rebuilder.py,sha256=ura2IJRixG6FQjgHFXP3-XrGfhPKoW6t1nGXuHl8lQs,79566 +astroid/scoped_nodes.py,sha256=j51jEOiN1rkMqmrhvVtYje8d-EWaGbzrgCwvg_s4TE0,958 +astroid/test_utils.py,sha256=7wyVL8A8WYQXbix1mT05lh8yO4kXk1gRjCCuqwfV4f8,2434 +astroid/transforms.py,sha256=eg7b0lehQu_GsFHCsLdUsNNvbxYBGcTC0p7rF2EKIXc,3271 +astroid/typing.py,sha256=OTOZbQ7tHSMq1tlASsVgRMC90GTjFoVSCgevZarAwhI,1983 +astroid/util.py,sha256=T5ux2LDjSNv2et5blQuUU7xCBr1id-CeU8lorr-yAVo,4729 diff --git a/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/WHEEL b/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/WHEEL new file mode 120000 index 00000000..0df5e3de --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/WHEEL @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/db/07/a9/3359e4e034b8785a58ad6d534ea3dca0635f1e184efe2e66e1c3a299ba \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/top_level.txt b/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/top_level.txt new file mode 120000 index 00000000..62af17c1 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid-2.15.0.dist-info/top_level.txt @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/1e/c7/56/e0edb1ed95d18fa93e6a08b745a4326c62e86c8dd5484fa3b78bd05173 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/__init__.py b/venv/lib/python3.10/site-packages/astroid/__init__.py new file mode 120000 index 00000000..83a7cc97 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/__init__.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/1c/a1/e7/720ae3ef4a92b3d1a0e1a0e91728804051e1ad2a11d4edb4390dcad01a \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/__pkginfo__.py b/venv/lib/python3.10/site-packages/astroid/__pkginfo__.py new file mode 100644 index 00000000..3f1d1a29 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/__pkginfo__.py @@ -0,0 +1,6 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +__version__ = "2.15.0" +version = __version__ diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/__init__.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3cd9aca3537ba2a8870d2f6e58d033b89acf8de5 GIT binary patch literal 4908 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 BYV-gA literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/__pkginfo__.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/__pkginfo__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55fdea398c2a459c6c35a27417463a62a1e34cd2 GIT binary patch literal 210 zcmd1j<>g{#U|{%iT4BexIr71efov4O2;?~caWM~&NMVR#NM(p(OkoUW&}6D&Gtx6O z)idzZWV*#2A77SQRGgWg7axC%9m-tEPy{j?O#BMa&&bbB)h{Z|%S$cNcXbT%^waf8 zOfu9jOU*0O&&f>EFQ_cZ$j>v@Gc?dI&MZmQEl5nxPE1cN)=w-hDay}G(T|TW$WG79 gOUsXs*DI*J#bJ}1pHiBWY6o&-F$<7jVc}o|03UBSp#T5? literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/_ast.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/_ast.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b39ab8f73ed99551a52e63b5324fa3155cb608cd GIT binary patch literal 3811 zcmai1TXP$?6<%O3Tu~%NU*xNt(01*HiY3}{+QyBnk>fZXb!5h4*=@ZUcV|Vc>{XV# z40h>69J()dAM+DB(>{9gPx=$^+9yAECJ$_8obOiM=W5!Hr@CdYtZ65n?pC}?x9U}y5t>^yQTp1JH$v{s2sf;YsU;&hK5+G}N4iJ7 z8D{*+NTw|#Jhr{Y4Eh9k9~%k#*0^hkvY38li0QEW()5m_UlCRGtGYic=EYHQ?3Lx6 z5Fd&w;-onB%Jxo*1u-YiVf2((6z_`$sMDe)E{Kbu&WNkxlDG`&thgpV5KT~Xg0CCR zkKT}qnoLaxNs{J49;HdvM&G?1#Bs0@hoDQnK;}^pgDkg$ZYUo1dzj#A>i*;FpZNFJ z9<8g=?KH{5@A4*pLq>Q*${w7|w|il>crO+GID81YF>JKcBvh^+WVzqlzTTnZ$A7eV zg^ctbh|utuFgy-pvCtHJ3FZK{fNcoxsLB`pq(d^(=7U-sW%*awc`^L1C!Z)ckWaM) z19x{&m1LOrCEd}26n=v1_`WLpepd?#y5jra^n-Y3X2$o&G~@fP4S5ujX)s!CJxjY` zOZJl_l&w3r9;~(()`E>|t>lAuD0!+(U{$4?V_ml!CV8eT5=uFRTaC(O&O(D7a^>A0 zS&iClvfKj@Lu1RxS>KT7b1skNCiS{=yuZL-vxb8@uDVz2$6`1RtL(R_yaO zO~kFdh`kY~Gn-)mKM(!qq0A5;O;?`4j4Tr%7n3B7vJu%?h~55# z5m+D7v?|B7cA#P zwgpRWS;G3BvaLP%^lpUQ&04q#Jn<(e#8A>BbgV7u$o{(zw*i zYKpAj(^!+s3S^O00BB2_S*wTg%GeZ_i!^YRz+N8H)>CKq4NDnSZ@cT}zX5+nDcyxt zYrM|nHFO^C+iF5ZCCpLNDxx%%8!w<1>E?`Dp_rHK1&4dX&0m3(CaXV8s4P>EO{VApqC=8_H~_xpGz$B#!(wD~_GKi~JZztfOTVHgl%# z%X6S7q@qbujF#$;Abv?Ij9bD6w1orch!S8)xPY#h0-O?MK)jy-r$q%2Z>OjV_d|3x zYi;>^>^@?bM{GD^e;KjXfVWyBwlZRu6q_IL`FZ&%I0k%aX~374n^k4feVxyu{8l2A z4g96l-9M*NnV(0`mHS1Urjn@Ay&%8Wk8@?B0w}8>@2B4?leFcmtv`!4p|A%UBVx%; zUj1D!d&eE*@4)pKO}~g7%VCFq)_<%S%`4A>c|yHp^u6LkDG_SfGkQdc$!sI0a6gWe z&v9iUzm)Pb@V+a~Z!wmjX^YlPNqu=5;J}fTXSGFFK#U&=de6^5|6hwnWr#T49`Ktt zM{F5(xv6-Rpk)Im${N}?VXmc{1AhMIz(KzeCC#$pcfL{lF3fQ^zoYmnR;*^qUd_mD z`5MO8Fm9sR>p*N=Fm!oB5ufq&r{V0h?Qpq`>g}rE_l15s{*%o0AOc7@SQ_NY^ zr>K)3fw5^TYb_0gq&%wZb-Zd&raup3W#12E&^=VpPr&;(w2V@tYZXbt`bpAw(<(Cm z1<*xdZ4tFlOkE^;zvhzVuz>C>bso``n3BoCQ3~dRqvV4JN6AeNj*{A%=jaW-+1GCt zUs6Jl*9kNMluacrqlZ}>qY~18l*M49BTbsrMKH%BEGynL4w&&+lT@U=>drfR5pO!w z4E^#UmCAVnq$mB9@M?5|(2sGfxb9g5)$}UfsxrSLC91Wqq@)>L`-)8aF?A_Gi!jh$ zK-wM)8l4d7RifOb;sL!(@t9Ewu31GYui&*`VRc^SHDvTUXqWM~b*pZdPgJJLvt@@` G?a0qCIE=jj literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/_backport_stdlib_names.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/_backport_stdlib_names.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3deae4af79de615e18ecf98a5d7ca3e2d96bc3b GIT binary patch literal 3722 zcmZu!%Z}W}742rTNp|;)B`BLbHrxe5B8@b%>?n|hIDi)k0zrtqNo7G4$?9gQ$*NLS zab`GK7>JQ&{vbQ8@&WmX{6b|JZ}bI09*A--**%g23s4Uq#p1o^oO|x2K0RG8X0zEJ zfAIYKU*9$V{5y`n@h`^N&+y;<2|x9W&FXm_wR1KXQ8TL-ujgOQ*+N8OQOC{vyE9x{ zzMlVlhO05I#&uGsO*CH54%e4r{xYefdi96sd$W4IkL&}nU}+tFKKsU<4eop*;%~Wg zf;+zy%fp?lKK*L``}y4uuK%(Aypdh*b?$m&wDtLm!8cmv7s5KJmCK*zkM2Kwko$)F zyw>W6K5zJi$lc)XJ72f5EIM8Httb@lgj=t_XoM5_1#f%d@=IYwURlAtsPl5jt43Hm z+%vM;OSQwMxU0KPdY5ml?$(X>#{Kl{tn7F0z8NFAukG$kI@gO2&!0SgoJ)mZ1+SW8 zh(FHD-sc@3@>1lzsp(zoj;o%x?U2hYUdq)D!EnT)gs4S*fBgp3%$`5{(R?-waiz@= z7Ur@J%VJlTU076I&9cJ1YNZ#CaOy6?vTAy@54XC$_0m{f3FnYQ$S%26IB;R<2P0fa zF9qLQu??HzaO8w%sZ!nmEtZ&}YD*hdLRGpRA505va4f>w3yniV!DU}r>nj2;goi$z@_KPJCytjh#L&lX0i=8!WLyBmH*SZCcW~g-)Hh9d7D}RC9LozK0 z8C|)w+=SFaLS9%P+jk|@%9cg~f3`-hv~%&&grs=Yi(Z6fBe;15NDiQ;o?8MlYp1WX|lLR34IfGRp-HYK; z+nU8)hxC)}D5sF@fSU1ap(G(kG=zos16#Vz8?3%WwT9EeLCIw=p|i|JJ9MSSdyxe(8{z`u3Mt`Fo5j8XYDqD!W*K(_ ziiSi^C2Pfwr4nF_D~s~_oMoUB8#y1A6Y*(*xIsb4z@zSMC0JIyn6gJbsgC=qVQa+e zTR20fL!?2s+3zS$#5a`?Xdg8N{*g8}lC8GD#gjv#?g=8S^~iF^64!|KLa><2Z51*^ z=crbY@=p4aq|xy6#~+2&wpU=E6d&)dC9*!2+X8|LtK!C3Qpg#3wm^rRXh9HdrlOv_ zV&NPf*lLS(P!gy#?XHT0qXR_Lc3AMT8gVwLcm&&w38uB&ZVA5xc@dx|#e0Oa(}Ub$ zKuWY>0gPb_BMnlAOdDZ21pKb%nte#EFr&e&U0)uI5*E6XcJTMaY59Q{K#=OJE4S?)xp9bhf!nb8Bj2gUZR+x>?OCB4^Y{W z!;rxKsgo?>`AB9{!1MOKDLFb%)b|WtFGsMjWhYT3gzr0t-q@DlhKY{?taMA}Mg_u7 zrU_vyRSm!1Xy-=SYjF`i7&+qpXg3+4paN?NaE%^G8%cbKe5_TP z9C}O{ZTrv|KxQc+DG%hQ>Mf+x=MT=$-?3Y%5J}C@cR?M!kcSkdIFfR*b~oSW6w{Hdhw!FVrAk?!{3j_Md_m6e&{~X2E}(W^$B0LAEf_v(G;L^)H^^`xP%Ap3yLNhSblduM+wuIwL2( zXAnNe=fxT1VzsQ#ieo~cXZ$`IKaB7-6SAih5YO<{F>}xG6USK=#mPK=JNt6>Wpp0R mqbPbCy-niiKk?h>WIUfo|HYMM^zZoXo!i;`&V2fxMgIdmD1Z(C literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/_cache.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/_cache.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd32893d00ccbc5f8528f16442396a12ee1e9a78 GIT binary patch literal 1114 zcmZ8g!D`z;5Z#qlva8sRa|jelL8pQtu@Z6(rN#+qY2!nBQwhsPyNT7xD`zDKY|>K# zz4Z?Y$*uh*U3=;;%)XhoX|w6sgplvw+CP5Ey@TI?R~8<=A%tc- z03?w#AtM@6ir7l5ksaEU91&?tc1t9?u|lTU4GA6Td?X$B4<_r-VohkB<|2<%ox#@b z>1l*V%j8fw75`a zwmk=adhSPfkZt*S>Ypipk}2tn%olzZ>x)F?sqPl8QTfE^f(=rwBD!=d#1?#g?12a1 zf?N|0?4c+fATt?9Ij?HKmSrkA|3%C*2z_`T4AYSc%tUKtg2Ud)yTSGcakd*=DSZ_r z@mVmQ=EGF)b$54yEY8*TSVUidKo*EBH)$+`Dsy){E$W=dI?g$7Lh20f5weFx}nHv05I1wJf zt`57@wKW-TEl zUl8Afka7-fYxZJ=(`p>H(7|-rgAS`wucKq(t>JjJ7%9#RkMmI~Ckf&P=a&Qxr7=`ZJEvNJkIxbc@pMdD0iot#sZay8ui!i8_ qGAeBLd;PbE{J1yh9UY!56)5YK!>;dFSAC7|BtvO5Si@@BUi%*}hXjiN literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/arguments.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/arguments.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2af7c20450feedcc01a8264ce06d6386dadcd1b2 GIT binary patch literal 7868 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/astroid_manager.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/astroid_manager.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff2c57da5c073c66c1c0812082951aa186bcf739 GIT binary patch literal 532 zcmY+Bv2NQi5QZt)XacoK_fEGp9wIjAS`^g~6b2d(NhU1>C9>9`6e*DB1fKged4T|Z z6$6>lrLWK_=U5(0fJYv{yYIiB;pC*42q9KafB)RPeXO4Oez0=RzVS{UI2ch2lbPIQ zeO~98u=#IMPt4>-%%=J{6Qa27Fu_lB7TVxRqX+6NEL~`{1Dz-aG;mcds_&QAWl_ut zhG_4srvw^WjP1(l2-puH5|?U%P7j0i))e=h-E|Aztzif$VS^574HWhjNN}%NKn(q! zRw{)aNvU#JGx1emwG(osy~IGUC?i`e-!gLBuKNui^i#>_Ts4 zTzPM!ysWP0i}N44xsdGKopjj9VNG4|pUaC+G9lUXLASqnwj@W${!}B3&Db1&>4RB0 R`;|XVq&FO<;@xSHzW^b#rBwg` literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/bases.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/bases.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b38ee54e925761099cdb1d961aaf0ea451ad441d GIT binary patch literal 21367 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/builder.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/builder.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62ea1b4d8a4246323459ac58460bce783c6c8fa3 GIT binary patch literal 15003 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/const.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/const.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf57a5fe4a61134ff34a7d06f0ba2cf8483b0072 GIT binary patch literal 1028 zcmY+C%Wl&^6hLR}vE#UD`hEjzvS{7V1t1~Rw22@kO`;?f$_Q!Xbf(m)V;kEkWL?HPGvH9rOm>5W3jB z!NV=OEw=f>4x&5a$qk}UIqss;;uPvZ%@UTR?WUJg4XlzjRlS&68ON&hY5oD*4|on( zT7$9Yr(Tdq#C~IM4R=s>u0?R|_};*YvT_dg%KJ{@ zrD8X7&#&CiB5~X#jYE$+=V6efd(k8=g2OG4M3rkHf(f>8wn~jb?0P}znIs|@kEEVV z5}Avj^$;Oe-Is-H5hq?4FfX_WDQWi)UeUbLtlc>4X83xBHmsKSA8$hDd+%FKxuj;u9_6yA z&ajv4fR*neks1_{6&9~R?(wQpYpMzu$c2{;!HnD(;?b>2x7TUas|*tBRT>Ret#@k2 zy;i4BH;y`$dXt^Ds%MQ__kKf~;b17vQ@YA(r|n*!wT@2U3OlWIKGZt*!<*4Y7Wd6; m`ft@gk~{}x5epaavS#DiOR%jKv;r>b%et8}v59Tn0{IV#7yu0b literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/constraint.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/constraint.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c88d4c1e3be4a53ed54c139e74f0ee2e7cd0cd53 GIT binary patch literal 4722 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/context.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/context.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1000a3e512e23bef8df26401502b9908bea46bd3 GIT binary patch literal 5647 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/exceptions.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b90221f06a5b49d5a0795987b9e873de89130141 GIT binary patch literal 14601 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 HW={SuAtU$> literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/inference.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/inference.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c0764bfcd87f71f59d9cdbdbbdd2ea281a4b874 GIT binary patch literal 29903 zcmb__33wdWec#UP?1{w!1aDEIR@6a3qCirIZBZm8-lQag6iHn}(aQy904%fz_+~&7 z@It0cMV6h=mXq4KoP1#7+F{b9jdQd~+q8*uI&to!nK*|N=WxHKZX&miAe-p#_kS~c z5v1hr3#EPY=FPj`|NZaxQ19){#$&Nq>FYCJ?%(q7zWg_ccl^uX?Xg(Q@Lo^EVo%4M zm>qKr$E+At(>4vpT-K|b%nj6y3$@*U1hJTuC`ZK*Vt>SYwfj? zCsnzry3SrF@pR?p>Miyy)%EuJ>aF&z)q-7+^i1Wp>IQp5^>+LA>K*nS)jRDwt9RLV zRX5rjt9RRXR|oCE>OJ;7k~dqqx4OyRB=Mfgebpg*NaDH5=IR!EOLeQgwR*pOzY%kL z)kiU|-pT{j2ki&(zIOg0Cx6+n-{tl@eHRV;-FWu9t0&*%EW2dd594hBZ`i$*dA?IBv^OU=C z{s4Z*+@~%Zmks1Sj@qBX^F;A!_5{CUQsUQ~hn;Qg4f^wp`wVhCi=53InMa&ocYecp z%-I#@dCq+fd7i%}&*z;z&fYMO?b^t5G91TmI{Tdi=+g_$KD`k3=@e^0Kk<(I@9pZ@ zZ#jpY$HN+nZV@?7BY){)%pQ@Rf5AEI45QxBX1$|fy-rv!-cicws`s~@qs~)dy)OQ( zo*ctG{*LpE^DO3ZT zpFv$OIqye`a{ko$Hs@8uJST8ob3TNa@BEo_$@vIk)6&;3IHLuM!-!p!Ui_8wY3DQO#VhVBXye<$wf~ay zBhD41zS=R5f9?FJ^J8J(KIp!R{M(DKx*wFMz@F6jH_necKfzq~Ywm0K_Mvu|!)kol z`47%dhP8ay{V;NzKn_0N+m-Wgou6`kI?Va)?zbbycVNZ;&iPsAKcfGa*f(kM@137> zeqLJqi2D)b`e-Ih)>a{}2^Hsg<6ny2n-q2Tw`v;An zr&O!e{gRX%9<+k=o>HY!8mYKJ=73vsRmrcbAbrS3jEOpiw82Esd*b<{`-*!G?%VUk zq2U8Td{=EINFSMERi#RhIx#clK2uUb;^`Vv22(*|q~y6?kVW6o74+T@vW`1imo~g0 zHQ`pKT;&CcTHQgu%#^D8_0f983#@6sTtR2EN1uOS>z3ltC!ao!uJ*92doU61c|Yhs z6pb}XSus+sIYmwsz8C#^k<|vd(fZU(lscFRR_xN#vU|E*amuyveM(`#xiD3~Eeqcc z)g1S{PU;VnILOXS&y*_DVbbbdzOTw7)4tp6oX(r?dLI}rRlD=tR2;6?_PWmWXc-gF zb`F-Y2x@d<1~bv?OrtZZSgF@voSs5LKJ3upQmr)Zs=;_L(Afyy>Oo&K?U?ILSNve@ z@#)b~*Yn1vD_x&ZXZonBV@3R#AXOikbVq$JFpDRGzT$2yB&Qi`=&BRQnHZ^~KS6JC ze+Y$p-LVr3k5B*2%6mHx)2uSBIxgoeC_^t&9b!a19q$ zH?xOpTxdvvAo=3Ck{b6^8ZaFsmFrKd+Col%7NB~vc;eKkNq7(ckqt8Ndy(8u4w08* zjo33tat!P=bM`aMb~btix8@Ya>Z%|>S@0)HeqpBURG_4L$9CFdr}qZ6&X1*eYE*niltXOX)$gWX&$)%^14CaJ}nM)s0dIIMR) zx`B~*lj= z?d;}Cd1Uj{j6YGYJutL&%Vw|ayZ23%MqdQ|67RMtm~aFfN;OR>Sgc_EU{m!*GmC<_8Qv-LM?g<89&>wE`lX7VrLRz zeLbk}@s9cujfA(it7NW`(4|mIt`U#o0FU_Wkbp-4$ft0Yo82oAu{nf-&YdyjRkP~#V{eSC;#|BDS9kk>jfQa%>+i=KNXK^zzXX0sCw?hDhjpA!H7u@GBO%*4 zc0AhHhz(l9qulk;KVk%epGWZ9fC#a`sob35qZ!|rH1Ug%0jyZn8Ph=(R}7Fy^$7CH zda3P^zTb9ubsz!HNwS*~Qu0^nQv~ZD@O?K3b}H zJBONOfW?y);MiK7RI^g7kBx!a2T34Ox8@I~gE&xzz>-XQVEG^u>IwGhNd|`z1nH@| z=a*|`AB*3KE9_N(q++=6#TtR7$iAw*ESIXe=Lk~WL&|q{TOqHv27!4YowSVfq7}~? zNx(#MF&odCSyLUu$Azrm&!N5LQGa1Y6E<3jonS%S!nGOY+Pr|sQeffrhgcgc(*zFl zTHv@CCjiZ-fF{g&<1#=;KqMZ4$Y8t^Fi0NQ0RfDHG!DS%dBL1B=FA8<+QC8{K&HWX z3owE#$N6-P_!Q{}@i{PF42)veT&lD%nULJvYVFi{mYpyZ?vW7Z| zq##|H@QMx>avQ^w*G2c63fKK~DoCramJZS!ExgbK5;Z?IkDWemUdEfqC6gPn% zOkxMn2`;Y1WhHhlnb_BR-HPkG?IatRv4j+`#?JIqr98@)7u^{UQlX^B%Vd&EEhd?O zDb%^P(JyRd>B>fYuY>4oR-kaM>`#yfD0tX6nhe4Z^Du2jtJio z(r`Tsy6pb)dGx02dDE`$e+x_tqorw3qw%GBQV!W0P^JP)6a@TqmD_-eO4ULH65AvL zB>*+U5pJxyYTVrzE(KWrx{NI>6@frUDVbP746I;k8f11%)vLOk=IsjGFo~$wDG&g| z)*u5(DaqJ@>A9haO^y?rkc5_r>B9{Tu!<458s?b!UFI3{xZW0EYBS9xi}r9FGp&{& zkU@4kJ2G0YPVM}0)bEkDU^8zjPER=iwIat%p*t{`LD@}kX%;AY9Gsnb$(&2c8|ss{w4Zh2j)k3{YNW?x_g^&Bk&Zf9 z6TX(oC!n?lmUA#Md*>l?=Sy;IdoguG0?$M0VT|vJA&goF{BSk-6N0b`5#bb)b4J6+ ziQJ&M10e%4^@FCy`QY~4YS&^2&i@=Ld4sqP_%$|rOAC*;0Y=0)4E6{Vw5W@E8U=+# zR67_WL-dKfrKRH5nYayqJ{V*`=@PUOj`mIe~428LC zW}drOz>iW#BgR>ujH$H%D?GJ;;H_nRsV^$mFw|{QLc-&rj92nJ3LLT7;z-p>JAr3vX=sUVW`=yau|q&!!#FjgupisbbW%L@Oj-(grpSF!w zN}jjvbVzoF^!iFYj;LO|p=hyBx2n6|Bnv7JrCcCAGP11=5cEVfLCt`@M)3+-f@#Pv zHNR`SK{%QykArF#qctc>pT2-H!r@rC6<}9aEN0Clz*p6gzHp1~JjEwKrGDAvdFAmM zlNRoJX9|oCM4CdqM5JKO4eupHz|`P330_pAQ3$nnk&B&=la-+`qi%vg)5?<+!S^no zLJwIYkJovWjEK^94Tl9K(t9QyV zTyc_65pRD85y~;LR&fU_QN(IF#th?WFMixu`ZeWfcFkUj(s+E<|ZrV_s=|T z;LV6VkN0yif0>Zw#3ho;1rSYt5g9lvwNWpQKjf(U~#`gQX=KosAB;0AM`;R%_M5GshCiYB2}$m zz+I`{&rCh+S=fr2V=`&1x*fq_q6;w92l?p&gH9R=^$r^Y3Fc;vF#uL4Z=^4ni|TcJUg+1$p$D}eqD#jr z5FKz8gb;iU5v+l=#2O5=X6^$JPSoaEXgsk7nCm&~*;s8k=GmHo!TQGYJPVF{K5;oV zmki4!XAZt?nYBPSnxKGS07)e$psuO?| z^*BLN1D=}UO9GguuDXFL#El`KQncMh$l8t)5nKTW0HW}p38=bi#;IV{5N3i{CBazp zo#e|}G)?oWz~1+vf`ttsvl5NIi+!O%s)H>dPUyi;aKh&ip=dKnor@+t&qBWfg5<|1 zEs&Yz4N;n%Ni`V`V-jr1>|?V-l-a;|FmGxy?Pn&lRGq4wQ3~Q)8u1#wPxj0u{2T}s zw6xUUgGI@s&A#m*Rr65kfoK7yK(I_ruxdHL)-r#X! zM+9%D%VEDXgbH%YH-{j+h9*Yc8r>jKKL=xv-CM6X#U|~P5p;uLpT=!$Qzqs#f$)Cx z!@SU+)TAjbEO8R5zf~YhmXTjv6DPqEqV-KHVZMdDshpw6*+jJJK&3uXs&oJu1>Gjf zo5TxH0?>$;pVq`LR59nw_WGtKHkX0AnCCLVF+wxR8F=8#fuhdld;^FoE@%e1 zP~HThi38E#`%7_6X7tLb??khM=@zkQZEW=kd{Q50Ao$?BnX_GADm3DI`Mrz4hvZ>g zM*JbpAJND_0))Z1Nj50#BCQSjDSTY$(;M{o^oTdA%2WQrBP}v6&`NGn8)qX*-b`*X znW3oM$!l_ksj`)=ydAxH83Y=d@AmEdVQ`WrI7z*o*Wf9J5?DU5VURP~-1t5=sR_l6 z&NfuIWE?FCBB$_FQ{2mz2U__fsHB#ze1NpJ}k*fje1S|fu zPXqv;GGQ@5Ugq;4Fj(ceGziriZ23OFKiu|-nQ5$eM%amFsYV9tY|dp~%5a@gR~is? z0ewz~eSWRG&yBPmU4&X3Yc76f{h17mOP_2<9GnX%jsB)N?;?bI(TYVf_p|OsC~n0J zPa7Vc2PjMvjll81Jr6x=p``7#B6h=gTPk?aJ;T5~1=JwSG%{=cm?E_7NUp!+2cylp zMEwFg^l6|3>Sj)d`r}Ptz-dhOChF4_M@ocVA8v`s(^KRbfyi`cXc;P$M&WJ2j#g&0 zY`tIajuV3`wOVrtycYDdam*0EIDlYz@%YobkMB8l=;(>!@qNQ54h`>nGRPE*q5~)v z_2&9P0Hdg>?A1CwQWq4VSe0Id_RMf(Y8?xZ!%{ahkli@X*zE`gvu&i8Thh*mYN80< zUph}-AJcC4$V02GY!F*64s4=Pn?ag$KMu92Q0(qK9iqkNYX2a&^$9cwvt18Oout3| znKmp?W}3RPf*z5>OoOX8&HfNcYE+qfE1v>|ese`nS~!1j{a>{1BB!r@0u@Jyb2pg! zBU2rSlUtf5!+WVT_yk$33zWF$gRwE7K_~u7x)B%qNCMj_ zkL{Fz+X%RJBjzV3Q{>j4k2%)y7-%NM%0}WNw7Tz{OG3w*aFWomCbjKVJsRadv)M_Z z-tY_gKPN3YQ(?{%t(=U_r6H6i8_@fr=3Xc{(sLQm=?rwXMY3t=+W`p;TN3I&m|Fl%LjOafOKVdK7LdI~JwKqX=1T=c=z2E=W?fyQzN89Z zIoFT0VH}9+R9Y)4G1k~6<6~lS0GBa_&v~62b1ZtCGe_xMW=>S@G}q`^lSW~v$#T@8p899m zy-qrSq`%RoCPAu!y?Ue`1b@5x|>cFCJL@sUWR^ z6dq&=UrqZHbc^weT6-W9_ZgNNVfGZbKsa~#+M*kuEl(|t=5*z7hI3)%0c6@5L*Z4A z7~XLNUAw0>37&?WpJQ7x6#_#7KD`~Q@Fh;ldyvh%knG74wLzMo)}BbtyqdQLj5M@l zc~d`=J$T{^#FMK@%e(+J#V>Ivp+^7}9aO6r9F=U7d6rgeGWBh@sK^EGa9vDT@VRn)>yd$ zTVJt>)QTc2dg}qA;*w@w$Y)@9x6-EdrusEhwa}|M$ERspJu7@mqD9#BKiYbx(?+cmoK0g7)rR1QhS?2+*0W11a z{0xoKU|@y$t;Z=t#m(Oy*!ge9G?yqnOA+Bw)?8 zA47Vd#6FE&rr$rg%UJde>n zOS&131#D;1fy+K%W)+xWDs$tPK$l^AOrbZBlBLg|X{6>?UygY{(OKGG6Y5wX0TE89bMH(ORbqkM)Y&P+Yq>{#TywtzqO6h^RHqyvtX0k*C5-m z2HBUgwPol(p63jdxn<_9Xta7BpO0zDx;4sZ#mwRVJu`sBlX?6 z3Aa{o$-I)9LS+Y36VpV_)SA`{NEloX*HUiqnj@6Y4pGT8fgGDd{X8-S8G65Jsh9gL zSOc`MBxI|3d{)a4*nLkA?>hE;@yOBQ;e96#9@(n|8;a|eNb4e_!-5X>usBv4g`4P% z668!E2N=7J0f>WUM}g1jY@CizU7OHPBBgb~bBs}Dhvl}VE&5HSijK&l1Bmn| zNNHaXXvKy12U53ltUFYid+JwF%7)`5xDvQ#U8A7Phv;19t3I`r*kc4mAeUPv0kEw=^uoptAcO)5m_BQoi@^WD`jq>rd?H0a+_Wy}dT84<7gt;` zf6rP_e~4x}kVhN|M6M!#-hqhNI%2fbij~%iY!I|yiL6dJE3Q6|tf6`(A(&38R)Sf- zfNw$;)q{+6()FNMCao9_zQ)0mV>U0CNubWfTwMJTUOUJ=p^zQjL+rl_5ny|CaT55V zo+VcEt!d!+L1T8yo(XsK#YmzP%P+m|VId|Srf>&O9O!sq;Rh!O5C;WldIkmw&^qV~ zccO(L-PgxlNMGG_wJ(?a!L(uy`R#c+o zTp0A>;uMm@Hrb8Vj;1_BN)dm?nDOM}!_;a0->Gka<6 zN{DJX;iT3=ARuZ+&Ln!G34pY20{O%1k1FVdlMeHxkS`VHb9FCuKA=jQZ3$wAzc_h)#r~n$7wKNQ_w0R)Nfn8KHVx^bt@&emq2&(vKv_0fnf+%ZPpYf>f9wqk{I@D3C49^Wf7 zB5j0UkZ9v6sd^*rabI++iX3KxUpc7AMFH81@Jp1fJ-%@X`E1huK*crhhB0Y(8 zGTH4A1euOl;JO`qogJG%4oxDzLJS4-XLDFV;sm#|#)m?owjl>Re=8LT8S<&j`k!Oa z$6yBonG9+8xB2>82!iwz?u?MpAp1=7lnRuh0dstj!4Lv_c|?m~amBF!InEc?&P$0m~ZCNBtNFfTqHc| z@7OXaOOUKj5&K1s8oQ>)cZpJ`iQjgYYezKqps3FcdNiRGQ{X6}J^DwC$Da@cPMUT& zh31lY2dp7n&3WVi=Uc((L6-?e5B7N&Ktz!O4012y)O#}CfKC!>nS1>#7(n1W96x}5 zTChq^Vd?+A0iP`8>MjcmV>zMKF-OVZqWwhn(&xD3)cvnhGBX*fdUqKREZXoiG! zTQKg_oBUzS(eU7!HpYl#w9N|Mgxoe5lr^BDK{Sg8#cSjCV8P#~%xCxgba8B`l0nx}n#}g1HjKUWD;0Fx#RTSAD zDgB#Z8l)5sNh;4>cv!rWpuYH)Pe*k?aSF}Quq;r#0TG{`Kom^?!(?hG;L`VpR1j8{ z6d=N!-F^Vh#p1>VKLw7G3NsPmwc8oop{K_+cXJKY3|&d;375H+S#M$xnQ*W}!iX>5 z_4I+mP!aFj+hWFpOmo=KgXmLXGF4Yn*I&hd!m#vGcCA^eh;9M|KF>8G8=lQ@4ch-p zzNx;B57(cw`|%YXSLxQg)!-O0X@+wMTF+g+#2mi%HggDW5j3uH?fhxSy+dP#dqP;a zhdkv8H4P01cnEEeRPI;>=kDkMp`FG>tvM1p8*+z&f6z2ty@4UX!9gZ{^|5{XpWL^H zlfL`VaBJf2-i}xGHIz~RmjMA){XYiR%r3S9X7?{SyJQcn92DLHQ-te&A&OPw) zfQGkJz@|bp^QtZ563{THxG}J25W|B-A$%>ENt8R8H^0SFj7%jdWo?wVcX)sx+ZQ!2TSE z`rwk$u!^7~2(e!|)H4aONyTS>na~E|f$mRq%~aRGRb-tK&s2ey&}H5~S8v1gQ5^zn zq30_UYE6y!`Jp05S-g8@P-oF6ACN^_oxx|E4aN8K_zqcL>7w--*iCZ4@WPlT<^UH8 zBN=civ0VtM;D}zrB=9KJMLf0h)dv}S83FJH@oZ}e!0M=RyN9Qd!d`bT%JL#CNFm0K z24=>wBzaT>HDx9Zeu5r5);H85lCFU>Qr`dGk=6j6=YJ6f_JR(mTqDhDYi zKj0!u5V#+n0zu*o&G&F2)FIu@5Ogm=;iw(_#T(=CuzxTIt$4I&rhGzTKP>!J%hF27USxU!43OuwiqNmddUim!%$WBfu=ogW}C+C z@RlwBsgD)7rgA_>mP()XZNd*BCB*o$d!k*)(uHocPx|aSo215Qhf1Y`vU6EtsTR2h zr)!WQwPgz}(t|r}Rovd2#S2T+E%2`3u_A*IITJged3M=75B{vJ0$`=k6SPZ35;iCu zZXys)&S0|zP0KpRK~Wa=>=DkC$jYP@?Ni1ot}`2jcTzJHkW1CQL_ga`iC*ag1Mr^- zX9jCpTVnd8(1|OCA_uczG=?GG3D;y`6Dm?ok=uA2xEKyI$Voixm|D&}!dD9e{0+Vm zRcWS}Qi~SI9%HOU(@BWnu_nX}H~7Sq#X!g!d^1Bc1vKy>!%Pmj8&~zUp;m5))kIh% zVae55h;BLg(E&1fHJ=KU>lgZiLF8oH^NQu3u$DaAEF9hW2g7L!~Ae) z6m0hVHThe(4d!*=HqBE8-g=^NpnCHvRb zf0TV&{BVOduY;N1X{$FtxLgU&Mq6L6GmQ(zjuR?{eG5$y(H4(jz;jLb6_Ki1C`>_* z5mT^0(Oaj5c5wUGl4!?HYG&F_YJ?y%dN&5@6%51-#6L%ge?$&nlZ48Mr_8LY*2>&h z!&rarYqVA)^_x~t{u_Cyju1~EyBWm4q0#O&{A^*Pz7F8$Pq>z{K$S#dCqj8teZl>J-^u}PQ~Y1erw z5C6-FJe*vSgVNWL!@*l%Cv+oP*%eIukUZu zZe3#)jUbQlbWi$4j{h-K1zT$`%#F}D(c3o-4{4r;q4|iN)ir|-bnd*lv+Aj}AI{FO88kx3} z)!Qjfg_r=If^f^ug5AP#LKt*=E+(+At?)?MUBEfHnP);A6P5xlx(hx7C<$lU+w}S^ zsdcW@$IGKbqFsImCLisZ^^=&0u9Xs~{FUZrxwW-fIvnDn9Wo5REg@0D53gi>s~J!$ zEgo9x7Z?-BYym3QN|;zxz}F6+)MjNt4{t*V6%j!XFFA-_#~!} zQQvWHGL9qFL9Rkz!C^M~)Tkmd13|wVkFFsFJ-q5J%>0iSny8oZmclirk$QSVH{V8a7?q*4C!N-xZG~_&9^_9E` zSZ66PKg)o4pc(ReV3*$;q92r@RbH1nha-rvc_id|i4;oo3932?M=2gui{lhR$H6q5 zmgND+QJhzZpTTjbMhYxVrPU9n@x-p@JsyLdO-@pmN|;*V7@*AuOcY=?^>}F?G_|~- zLtm~a5|4{}Kyb95T7J4O@5iAvs9_=vEe_P`6Z$)M?kp5>n2~P2(B0g9a_gqT{Q$0w z+jnf-R5OYvZK3*G}^R2@Xk4`byfJK)(UT8_n_(VaD&{n!;t=y zZ{lZZo*Jgk(X@ff^#}DpYf$&M2GtF2(!%gy9*1{_4-N0%cWl@0CuL`~aS%8N*^ahF zSt2Gxf%~50Gq|l#-`%MGmb+%2!EZ5GhX7iV2UvlqWgg;A;VpvLX*S%`!y+f*b!}Wd9Two&>a~2dO zJQEnXeD2X;u<&q8LeYD6kN6`ky+1qrWIJd9)hyhw;;1!`$jf@WlBTF{Z0Ej0&m zLRg65!E6w(PkDO5gzXfP&I#2gOj^`jbZAtcbrA9`NKg=<;7NhN)+%{UxGFG_Fk**V zcS*gCsa>EDIp&2scms?>-d!k&Ga^^(&Th{eFd&g5gs~T^MxGBc<|OaZG3CwjleilX<|IM8TSK&)4!J&{UmBx$ z*PeQiXE)opzC68evA*Q`a!%q>JKwh+E8RPDBwXpR9QeNVA>Wsr-6B$5Ymr2u-Yspl zxI*t=i4A-L^Q~p3+e0=GZR&GBO9)HDusJokw=M}{Ft1MzU&NfN??MpWk_N6#D_!3K z!$|FeDxh%3wHCK9bv=Vy-arzS_JZfDyE*ujtkWcIh=0HXt>(Zs&MIlq(Tb|Gl`JVb`T>ozXx902VN zPK4_7pzzcK5bE1YLWfbS?Lem(zSk6+md9w;)HscDOER(15TZU-II(182gFxa?cqRf z*SJLjY@>AdxG39NdS56N$muS6I+bas74k~T!)~d<{kx}#o1|G z+=3l^nRZ8W_Bq)-g;Jr__~url+hFkqMuhtxY~53E6A*R8v4h8PmPyH-&|o$+b=J;N z9Ees<2&M$l6Eb-iUDRimGrJ;3DlG;Pd)oO@cwP>^d$@X~b#V6DL$WihsS6W^hh%jn z=Q+U?0P0hktZuZMgYQ5BD6!0A1H zF}f0z6UrmxF)g6-J5W_}=I$1c$Z~LU*WR1vu%3~Wy^>dA%Aw8*uRAGf9Y!0Yu>n1> z*9h&wnL;>^;{bn=d=T#atBu1mZG<-^tF_3sB+T{eqAtfO_aa^5oUA~0+zrB`!=Mg0 zat-fgatP`W<|nXd_v@Gx0x98a4`FNq5xJL5Hj%UK^@2ZQo=9nO zXl&p4&V!Q?xfGcBZDb8u9AgST!lEpJ)mxM$`kCOFa}1tp5@SAb8Rwxj;}fzoII}!v z&Ok`ye-79j9Fw@6M<*exfb7BV?ukZnzUOjGJ%(CxqIf|Kk&2|oP2VdjnD$htTtKGd z%3Z3=QYENN2^A{8bX*_sEy&Bj(ymeh3#XU|y79jpS zB3koDfm&M(ya9ayE<|e(Mxs2~_u%@-*M&SFb$_X|vHHD!8k+kA9q}jOQZboa3;ZCr zD_gjK5r~rx7Ic@uuXl{+-?rg+z2)cS5-H?Io_<_Xwx4-xz%+O+bCQ=5z!8=@#?(dv z7gr@F2Y6OV1?Y$9S z6c+}%>VtR$aq2`mS5mZrU*-yuc7W}U!E0@C_6`Bo=Cxq}_$By3+{BrVZi~}*oPm_< z+mz*AW%Og1utP7VAnnvg1&`wlJ#{!jA8lM_=JB2nG2rPFEJ9|_Gsh&$CH0*(TEW;v zq;}?nn%Q@L)SbeGo`~*;`T#Ecfq7_5HHY1H&+k#z$9|}%(W8$0jRg2}(LHIrJk7o> z>QNE%1<%15@JPilhwhGzgQk(h+c}}ponFzzVCw#a)4K_cLj?}$6<*t^6~NT##Wj#% zdA%A!!Pd#QtQ5VynMXaxsXKsDuqVp#sJq$yAqJZnu-|f%zuL;!{Rl8FQFRS6p_Nm< zzlYz$n!3Js)wEyNByApFqNWr2`wRSZiotuEF=>fuQBRgCFW)WQQ|#H8?tg`)!v0M$ zwblQw{+(&d`Mw+GY%r%ed?FHCKh&A~!+iaA23;+D2g`-`D17W4mTB+R_ji`*s$F^& zj`W9bn6tgke|y86pT^f{_Wu3b=M2Xt5cN4`|K-jy-^i_oc>e>RLJTC>5~6KV$Gk1_BYX_F`+0`v06c^E&4p%=GsR{(%9t403cqmzJ-s z(qCzQZH>d&e{EI&=k2TdCuR{~k*fX~uh-V|4!X2dJxMKAFR+QX7)Y$u<$nEL1}8>3 z5R1@DNm`UL@>Q&N^0hSyV%uv?CK1u#(lv?$g3QIYUSnunlwPz-TkNRxvDF_jIO4CF zg}^m{ScH(*F;#L3ijx_T@8Ndo`rZXxXE?HJ5KEe=X|1<}vaKCtsKHc{CM~^-JqcTa z>aD#eT`lq2ps3F>UpMG;*Y~cPq|afSyKmTLd(OS@I42w$ZZM8;#zY8t9|5m9j%Xg9 zeEafY@9*s>-;GkALOp{Y3sObsen*Q%+{q8-g8U2|q{+poEo|s(jEyk(&j@f!-OLn) z#XkH|2m1HJkK7w7jf|=|vserg49Eeh6ay}{$}q?>=s^&q!mD<*MBdBvJcB+4{S1~d zAh&GyM%VI!;RkEIoN0Y+X>=&pj@YuHD0qoE)E682PImL~%4P0Y8B!OaYA zVX&UTtqckX?B!7f@VR#tuCYKUhlg72SM}d4QX7~b>IV5cRYQ7?H18z4?@oShc3R8X zp74QoPo*>qW=5`y)O^z2%-qW}uTYZfKUAa!k*2B)WKH*BWr73@(>N(6+m^bTAbD8+ z){dRj`Xh0%43bZZ5mHVx1&QOl14->-3v2OrtUUaYmN6dOr2-%5z``x0Nn4mtz%t?J!o5FpNF?9tgavf2SIUe0~rEm90 z?uHQ%Q}k=h@rMllh^15E34HA(@^?)CDub^x5U18}GPcOTU<*AAL=!4TblRBh)iW-x zf?8to?!ec;bk77PJl;+Gp(+!9e9Roj6Mx)_wjTTys$$!pF2innH|wXhM{FmeLJv}* z=|t3@qL&n%9;PKy`H2Ebv@CX}secmfg2;10LgZ`Bv_8PGw1S858l<=D8y~5$k9lJV zlU5GbK+!zU|JE2c8+Sm_wZ_<#%=OS*Z{c>mEc`!c`T>&+bq}v{gb9HEy=i95uj9_R zWx2(4Z&ZhA8xO{3cy+&g2MCt!# zdSzSuHZy_T8<;z9HFNhS&l3 zwjU`EXCE*hK+bhxP8{51?a_Z!XyyOK?14aVHJi+)%*`0xI%)Ifwh{@`%rBIefl`IzvshG}Ympo|~MPX>Yv5Sjbe))F2H zs&8f?oe5iWdbh$g)0;nhZaJL~bb7^Eo|?K`(O);l*o3pa1J zcX+zfPU6jWf2g*z^nLH0OYDQ3|lyE{lDQAM#Dr&5IgP;Q4}OTMbBVLwi{yxZw8cb@HP-QqZpXW)#G$K%HV z0c~o)_COe!j4T=l_I^tlBV%NDO?az}D$E=hqNT{8@q&D5D0@^n1W0W|nZpkW01ObD z;~lGpvS61qRpUlarbPc(%m>oXo)2l%AlHsN1-JZ zWMO=Bu(bvCQ26rzY9k60AQJ>us63C#Y#<`&hK#SQ(4uaOIXL!zKmk-ulH~~qSkFsE z=F_mpS)d!7yIh8X;k^Cn3l1$YRNO6{>tqVtD*b`bAetiI$Nd<4)&vO=vm%>#LYNLI z*xZS;flP)vVP$*K+pwUp0qWG34q{Dc5P>J9OAw%5dWr&QoTsYX$@d~IE2(^Fy* zXe_Y5h|4%&ml1UsP7xoA0N2bT@mE3k#t;`r##6Xm2c(cj1SLfnd1{Ub&W)hgd}|$& z7Xg;cptfFBec*qI}fV$859uOLkoK*OMM<0kGf(!E#PVL5On?6tZ z?unJU4?Rbe4qVG`owemRPi@fQyS6_c@V$N#N3oh16WD=s2XE?7>AnHij)n`7dP&3; z_$eBb?n$*0|23G9xX3ikH+8d4;FsW^jsLIhH}#rL_D}QDTTL=30C~$R&2*qM{#Sa6 zl;O4KT1DoxH`hy-C`#I|W=SmM{|(SfjI4FRZi#n6fT%FxVjAUo(Tg<=bVEjM(Ul?j zMQavX(tGg!bIDzBbiy9($W>gdm!K(kA)g8YmPJ93*8^y~@L|A%Kp?Mjr??mM*(ggA zuKTg{!p%rPn}sWWSA>1#w~jAo4|&|z-$6P*`d;yy<5|qS)Y$klV_jihOrb|QF8%2+ z8w4l5slXR~eb>rwFP(6W&xyN7e`aV+hi@%Kf|f1IwyanJNl=DFf)qiD(n$1hu{|Ib+6UA# zOAw=lB8f^R6-Tk1w;d-2%61Y~e)ExXrSg%=S5nDmJ|Jjvl-B&!7I|zX9I#N1ZQdnjX5krU}i{gf5J_ z-Y`5vC)li;p2^>qXYqH=%kg*K%j4Us7aF!_H;P`d;dlx!brAi!fjNVmD_=Q)~(#(pY3{7TdD_c)<4&-)rH%dcPnmKX#{SgCEDm-UI?1b zQY#E=bNDs4;x5V7otmgMZ)0G!UI{~22H{exsRl$X_jV9fNd(GzGEiwYTMAb=Q#KR(T%}&G zfUv}#jsjVUS~9U`gSXp3vl^6*q&Qz|3O`&5s>z62k544<6Lg!C%@yFFMZ8*(z@KZj zL=XZPJU4mnt5g1^$(hL)r>^3`_}QzI(=-01%jd6OoSOB|PhXunckS}k*MVhZx;Y<6 zdgHlPGYalT$u_^%yi=*yL?sIRDy<2_#wHab&eA?(xl>Yt+R^msbYrO{BYuXl7L#nX zqguUOOiDAYS>CG)HLP@}!ss_!vVnKRfxlFV7W`!AJbLls`IcHE)=M49F!6PqcL4Zerw(b|9St}bevHAS-&l77%q?6**-DOsa@yQbomTl44ky4}5y#lRzFiXbj!aOL|^69?IkRS;c45AFb;JS{KZN7HFOh z8);m}I$#wI&#GxP?Y1UNVFtN-T9Ch|3G2HBuOM=PE%MK4qTm&U4Y&ySRZ$Xyuq;k6 zAcn;7hu9&n1b9SjV|Wno4Y6H}eQ2R)NW3O?iQO1KT-;OKTQtS%!V^ct(GPRpNO6yN zL%b&Vgk^1;fpikGl0fuwzwrK;&b9@jNT#U#53Xx=-DZ% z;#u)!K;ytCL?FH*p2vt?fak?IaUSq)?zt^q5-;P|9cttm~?n z1+*W~HE|u#0kH?xaxod&EQ7HRsoQAVl#xt1<+3>=i4NVC%&gUf{9tLg%V|KPB zZ@W*BeX9o%#KnbD!c;XUcvL);;UeV;tJ{t(5yAMoDgtbns&VI3CQ* znN1meQG&K`w%0+pC;4{?x z{NeX?*yEr+&kC-ZW0;xPJ~p5h`TlwQ3P;hDj1qK{{w>|m^AAVNczjY>{nV&UWOKIc z57{KzpC6L~ceF*Ucvicw&y)?OIT@9~ZCK(!ZeY^qFtm><`9(atf=@^rZkzF;J_5F) zc`PaN8N&YsG#L?N?dI0`@=;`b3A3)_qsTDgBYk8%3ekfSyWfdR9C>UZt1Cfd25E;# zg1~cQCb2nQs5Rlb6+<6EQZk$kN`2Jp8F`KoALt{mZ)jo>Wf^@lfM;Hm2Qa@%L}h;j zoA|JpmjDovYkEgt2P?~Z{6+S4Y!$kS7IOSkSz4;EP)EZ>07Yiwb`1{0JxQ-UIgxFD z?hZLi{CXP5^pF#O z;6RGqj!T-2F$lWm5F#YjT&q=2@+u;z<}f4s%L5=m=B@Y(0I>rP3!N9nN5(3?SFIab zv&g=7d**AK`m)wBgxQ9!#zkSR8Ijr1?_v8^4U8VZXlvz^8r{LO*EKZ*+nl?j$>-_2 z152`)@91wCz2CE1$C8&tPUI=}U(M-SCr93Xt=Q2!#=3!iQ@++Q@X^*BJOR6+0Z{&csVV87U8O4XTVd$fPZ3HlmIifp;rI(Bm!{)Fi-Z#0~ zTy8>`V8IBfD^&|fvp%e72a+2JyLLu2V*2#y1r&L&RxW4pN1h zA!l(bE?y5;-DPbp3f*c;B8Nc~ppqU%AbW4}^C`o-znR5y8id?8rB64Lrhh0(2Mt8efo>ttdQP2`Q*2cWxANSv`fq!3U( zSSu(**_!DsL|(;cc@0h3RD?6lk0N(eEzl36c9s|X8s;gA!R9UQXzO_SGA2A2%(A#Q zu^L#kja>LQfc0`lSzG(3~7!nSl$s>TV zRS=_F597oA3)wm~DOFYSt8&a@J4`d*P0H#3H#tUT-H)(VatSc^cBBd8p8f$=h*jw@ z=3_9)V+42D$zz-elfEAY8Y?FQ4Rd`eGS{qiZPmheE;1MMYXvgi>$sW+m7XQur-MPbz zVPxI_g+J^*9RbD_VBAKOg#fJ@r}m$rT7w{&gQ*0s18jR_0% zf-aH!$n4l37;u#KyY@0UMs00J2QFzHu8^tx!DhT&YIcH}KLaK>!3-1jHCz2SdjB4{ zc5(0SrN6qZbus?kV=(T)oKG1S@#^Eg_5FL_ENyWwjRnUFaGz#M?I(SsXpO-3O&z=+ z6L7@BAy*5IKVmjU?cF>d`-ZtISJRz4iFy0ZYd4Rs7US^_uu&>+Ac4Q3E$d4`KJE%3GBB00R<`9-qXA{d-Im5BrqUfge1?zJ7!uNqXHGVO;C2wK=S1K z@$rjD?Wn%>P8vB+hMUty7 zh?-`l$cSLh8C ztCXD$_Md`h`870Np;Z??HU@!HtDTh;^9r$7qTR_VUx^+h7Nz8UK0{Jc_I-T9AEB`e zwmy_|U}POOwWFx$l=LAEj9`2}UqX0f{EcPi@jU<2p&W%vCDVG6pZ^1mH2B}rt)Cc{ z@u~fu@o*?_9j5-Ff64mtKfyD+A^*_Y#XbK)wIgdg!DIhrjnH@LzYS23e>i64i}ZWs ze;r`nqvvxx<5Q|MSqAVw$Rmt19&X9xx-mz(&9oU0wr|Yj(!^ntpCeCD#D_h>Ujl#! z&|qEil*Y3|M@fIR8=0({kqP~NY1N8hS=OwM73CK5i-mENveu0^Vc%C_y*Z(ogvHj+~B#OYOj zS%os$?gpDlAx#Pr6A6k}Kt+{OjKoH~%LV7eR`dqavt#g=cqW^H)*!auQVgV#1zDd5!&DhhD+IFuH${e& z2MprFLiJq$aS@IIK}N@zM_#xJXVm;6T!+3gsTdd!L~zw>I4=UL4bDwz%sz~W1J~9atYQyM%*J|d}H#=#w_rB*ag7VX-&@m(Xo*^$nuowf} z9AzT88I}>)W3n^xGZ(n3M>(L{^ev{F{e{ckqU$xNHb8D8$?;B|h0C6n)GWc!q+x7E&$E zFe$ww3*_j|!y(f^!e{8VF-kV-r=zyVIlPaw|_{Do#9P zgOqO+Hsq9PV96Qf(`j{}nR2e{r@MJ1m2_Yz`5-RM7<>5@j(89)kZ$?DO5O33x5Jma zXurujp=J;vH=S!o$_VsK2o5gU>#Fo3%Pm<;nSEV#@8{bh(4HW^k&|^S@C%&ELv4o) z>!lCIeu3Fr*AW7mLpa^P3n&MIo~Lte#5%pmG#Z9*T2{ zUD*6_R!^Mmt|FNu^%PK0RR*Hc&_`euN5$s5W*QY+6!WjbBOqqi7h$snipHxss9i3y z7mN3d@R^r1ihxPwV)w-jr;`*P^@?p(TE)ane5x0F!GLC3NMm_~`wo9GzfhJj6SG)VP6qUBo4wr#T{S%Djunzi%xDhAV>;$1r7wH{1tliOVrR7rKghE!K?=J zb?RbGhpnzA4zQ*Im6)hQ_3<{La|Km5V8WgwHj~;?{l)2q4{+|f^{J6FKA`}@DU9eN zu-5VZNhPXT(Rwp3KJQBMN{o|2YMmd9cTeilW6;#?KiHie&A!ncfm0Qn5oF*Vo9GX8NELEI zE;K#~sVb~|8B&GfA4-vyKp)1!0FXKFfHTsgoyjg?K23XvKaNdCuG4 zqT~KeeFf@U8(i18|9gBLpco%!9&~Ndqck8X`o5B8KR&uy7sw8)qGV6pS10I<;v*8z zUq=%k-#kT0|JF(I+3U^VE=+j@YstO~R}Cm>Az`iscPL?c%-pW?i;r!77n#s4Z+g~= zU-Q#PWjS$A?lma0=DrI z>Hb~JHQpPuDB*zCvr|TD@e>0{NR~_>@ko=2p&X|W2A*`SgHiYyBY`uUOLoMD9YGX` z12Bs9;uC%L-3NK%uBq>1F`elCk*^=!(4EZr}=xdkgYRjJ!pXUR~&xjLCwcR6ryI zE(;=Vz!03uKRizw*QZ3b+BhOe=}ZH3q0WHWzhZhyzUb=I` z%6$v+Ls3c^Y~4E5rLwyfr`#I6BCQ^$!#L%>m2&s&#)~btdi0QaI0@b)c^q>EO@W^* z?ZoVUA>P|PUfg=d{XWStaeTy%PxeXF&zQDFU@V|uff)mk3Ctpu?Dz&52~GUmIlhV1 zJ@2W_W1BL5Q0&b7;d@fduv+N8)od*{-IXAMJv3Dq=Y&Bdg82%3ouqUmTRF#On}cZ7 zPw9bBM3e zz*;F9T-T$a#bJTl5&lTDZEci#5Tb04#-bgIJ3GeWc*k1YHJ?N1kf)OP+HM;0_Lq?Z z?O`l?*Y>Sz=siqj@x}e3fYNV0I)D%*zj*NXwLd_S9-&Afyh$N-Upq zY(Q&=J2sWh-+oCHp-WDD`&=EBH|8HqY9Q+?Bn&LZ;i(ORvr!~6Rm0`Lu5`%Ybf)HR z@BDl#$9Grhed=-w-OBTE&rw~SfjA6Y<^$SGIPj~}&x^3-?WIe#yVG=&>s#OlU$=-& zx=fZ`&Y9qQFwpBG-i}mUCfJ8%=;a?{qIa;@hkF{h_=t8wg~^cYpf3M}M(xQ)DYr(g z3b$~7=KdoFgw@s(s*5~Y5jaFtQm&0MEiE-cg`{3bBn2N7CIhL(5w&WRSaf@@ciY8t zdK)JP=w%~nv!JnRi%B~NcK{h`>^Y0_xGOW zH$0{KqkN5;UjLR^Ovf7-gje^7<>EQN@M|=`k63HN0vR>c1CZqKb=M6B^+n}4)t@e{d)wt)O;Ha*us&?_qtD+ah7^3 zy+MuTrw3JpPoaNO^8L5r`bblJKPmXWXjM_rA;(W8+(_=Dxo7C-u#V>SSbivq~^D&`9o^fsrf!N ztcQP2(9zA!G5UD|4XrDrS2!9ZKBrOzN(V^(hyJfrbPS_}N)hTs2Eu#CGz!#P`ouU? zdgu%|c?SxD-=8|KID3uVrH7>*#wdE8b{xkVa`+wCW99*s?bL1(%gdjYKf)K)Oy=9T zSwrP8gGT%*HMgiM$CW@S2_D{H^(HEFRcX>Na>p`9{X;6;#hu#;x=77-CbclY0w2V; zge5s-`9o@``rvhKeri(KN@iCwClIQ`o{}B&x)*EG0*D+W9Aull(agl7QloAOhbm8` z6vf+{_2MFB*G;5nV|d~;l z;*$XO7MO0rewsp-M~2iKr-tOq*dv Qeo8M5prm9t=4j#n0fwF)NdN!< literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/mixins.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/mixins.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e80b14ac9500ce0f79c45ca2107c7b6af5eecc4 GIT binary patch literal 904 zcmY*X%WB&|6qRH-mgQ&dl+rHB>_Qf?9I`5uwn>{nXkv;J2xuc@&)A-3G$Url&f^EV zD)cuBUG{6V?JB=eDD;jb=OLk^qcc~!=N^q{wfu@@S=T>)yT9Il+x!Fk$x(%;4{)h# z0BnU8wz0$P(1v@3IY}jSZKJustKmk@tH5iam-7wa_0Z3G4R|AL=G+6`3fnoa1Mh@g z;C}dw*k60NLHf9fTi+|7IcL^(`}WQGf+~~JkyC*2eDeq{&A8Dsmr3?>5^%B zLOD5LVtQGsukO_gsuzb$Jy~s!#K#3?7;KdF-7m56R9MKhTGn|mbZTbEI(dh2%;yAz zW1e*%87xZ*Z%0xjh0wn@lD}M5J@hYx=a1W)1akRyd=7za#Y#&-@gT{A+*+p$d1I1F zGL1FCDCQVlQO3}OOik*kq$^lJl%w)}v^N+IhIbCc4cYoi$J0wjR)lSDX0<57Vj4x6 zcNI%c`CNrB*KK+Jo1zK)fGFqEd_vX@n7t_*23!M817=IgmVpfezJZ#7wgJyT2f*}< z8H1j#>6!IDmBUcMFA5VsE&0Nf8~FPAa+073aFE_)-rHiUzO&)e>NSAtdQQ`6+7GAexV~eX)BpD$ Dq}2@x literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/modutils.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/modutils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be3cac2ad9f5e70e888bfa47a8d5cb0646913e50 GIT binary patch literal 19002 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

_B}gt zk=k$yxnU1gz*iS3N`Q}U(#yA8?O}_7?m87?wv18h5 z>Xh|5#At_#42PhbQ0B5wujy5NPA6lj8kb-`3wm9z>E%ygM#d7LmMLBZ;)D^AaZ@6q zjOZQ3`#~3_=CAX$oa#)cT*itwtp29638Sn}-@CqeaZW#wJ>Bv`g?ISR04;Fq> z0qd$@-5XdjleG+<23`k#$Eo#ESJ9E%4p@5l=e0KXc5R;woZCA-iY2xx(kSzw8p4nP zNatnSzD|B)f&WCd5yvAxddwc(Q3-xIBD5lx<90{0WvOHkx8#AbP`CfSp(n|AJA48kBY86Fe|) z18G7L=y4k=!e20uqzZV8)uU1&t*0?FA-c>$%#H;MS)!T4*JJ_WEiynvgL<7(r+frE zLazc*8((Ow&^N!(zBG@_=n~-7P8IV;XGT2=MAhnBotnarkuxtiM1G;KTK; zcgH+HL5V-L=rpMbSD2~Oz*Ca%omPYE<1PWUHx%JAA5H#X^0I%$1roY$oxCNyB(wo- z)hI(V%2r)p(#xjtuX1JKKjbFFdqADg4f31xA}GH}&W)S|(@7H`NodGLKpc`bYKd7O zfiYlINj&`1_b})d%6V+eoF^~vf466)9%2HQq)RN#7a)fVZ*yd|GlG7JH79mMK@; z6K*$)N=td(N$c~To^#{GB&{wD1<$dP4STS$OF1)YbGwy;iUc3mUy(S##w( j<=Og+p|k7>CDt5P5Lob&ulhcDILkapls zf<^`QljJg*f?D(qs=ftlh0%dfslhBbFV%JtA4zU)u#QlC2KcnFd#o6efH9#(#@Nxu z>OB@@@^H^G7CIgbjfQ=50nY~OlKVcMXC{%koeth(el5@YBBPYZ2CulZ*Sv6<3It{} zTgUthAar7G=%?44%{P5_x1;)@5V9O~`CGhRjvsL;-T1}CL9Zu`GqBnG#@xTZ_Ncp$ z5*eL{Nsh3A(J=oX$TqcXXa}_D(o^?}V8eZi=hw$@Y7~T+YYiB_JbU+gc>IQsPr?h( z7oim6FkNI*qo4Fo9)(t9aGdgJ=J;hpUeYZbBNw`S*$#Qq#p;l)xxq5z+9r-qZBIa7 zzCtUs_8UDHKi}O++u_`>+Z^3lSLqj3`csf8pheH+(d~^d7t$>Q`rX@FRk;UPch;iL ecI;AWI>)N@tX!#6w*{m5u~_!t)xAlpNY$`H<7A%(n{L9+jH42L*P(C2?A(5RuYpbiWo`skpOD| z$*ZlqXxE8DXLjWDe#9Taz=RD`H&fKItttmwPMC z6)}I(UG1$k*I>NN*00OKO0fFA(tMiD)`E4IZ3It)jrU4(lU3N-J0;j;o9~u@V#`%_ zp1u8r7AHLF1nO-ReI2XU5m%F2rp9qs?RKtsi$CoC3(lqNlm<`wEgmx%{DiZcPMk1K zdr@%LWt6>1SQs$AQy#1}E)QSPhUvS5br|ly5MvRL2g{r#cRXw(^Wm=q zgEIVe`2YI{@CZuZDv82Zzfpqnm&&)wHwqkj$$I4cf33clT+$tr>L)}$r6$qpfU!RtLqE|B3s4RwQ7%4z z@fCGF$Ix+)!@_0H@m-J9Xx(sJ#CrMGo5a&h(>|vS$G*6vI&nM~&_16;5_>f?$1^lM zd3vHRMp!!~{sd(AU1?BZ;a%@Lg+GPqf4sfhsK@sBT^KUHM>NNCA`)$Hz z@hUtjrOL``sZ!wxnW<-vsG!r;hyQ_c|6y!j!i;qC)9Uw@vDMGqK}sMr4^^!>-HHicU{9q^W2}5jA!Vl1Z{4AQZ{fJ za%_Vsc^T>9+wJ_`#L|x7U}r|HW|AZOg5pk^VD%C#4ZRm%!v`8!`q+TcV3S6v28B`l z6hK3xcm_sM=34+6GYXh1OYq0bALHdu;QA+}cgl~Iq>RsZCAj=$tM&f-nV~#ajb1rta?HM;seYbUW9u~UjgwY#7gtp=X$3(xx_U_15ZaH~T@X6mlN|TJdXa!!-w|ht@)8 z`IM?4MLy%dDGwpI4E<$(ayXxb@Rvh;F`@h8(}Ot-#$22r%OFF)wlm{8ZEGglPmQ>` zV+hNkny!Ph1CV8qT2-A!IMQk&fEsl}*E}-oSRW*$Cz^XgUu&lSfADZU>If{<&dW z?t+XQqT5c5o@x5yUji>#_U4paH1KYH9I-=Q+ovB(>|3XneQtf+&c0u_ldVtJ6Z=)Plkmy3|YZs6G$eOd5EW0}a~cZ6iw zvvqqEZ68mW-7FizbRE*}#}oP%Tq>etE`J7YNIPD@7_v)2b#0OT#6_YF_mmpo^Sp&r z;#>Hl$ClBA^IBjJi)`%rjfU;uo92AV$1xxm9;8JO_ZJ|Cycr|~`7#)EZANmj4Y4&f zHwp=fNOiKQVS(c|YS|2Lets3mW}QTGbT3_9#9awG*WhO8wq=0@L$sN$c7nw@ z+^n$!2?nCLGj03SZ{(RbiGw%9^Brr37_vfFR(L7hj7AGPQ z529s7{&6$E%Bo2ThK*(j_d(L7BF=i4py?pv)HHk!)&%I+R(eVtlNh+AIF|yb91-` z%|B>Xi>@R#!JE&93%&Ha17A*eN_g(vxO?H@SAUg$;rI=HnTS7yN2Rh+-Y9)i+9+); MZGE!(qfdMP1BEq|82|tP literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_subprocess.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_subprocess.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f0c84ff342a80bf71207b9f3fcd1bd39d0cb602 GIT binary patch literal 3013 zcmai0Uys{F5Vto@;y9Npw0GB|@L=^RsnX<5MM6})sucwZsXY}6m2jyn$GgdG&;QtU zdUuv1fv#TyRh6!fJReETjs)=GA=7(j>2Wb-!UX{HE3P zbxW7By4Ugz%K*NCn@<$0O%O2-6|9r?VGX3}J*C%r0sfWko|>&QGNC*s%=SY(^@vUO zV-jG(V5}ZFjFVn1Yu)|o%7^yd+h5+x3}81mD*UG8L3{Zok6B3Z9Vc)mgt=md`O^mG z47?w~%YOk9LmU_#qWS+A&0u9S6>BpTt867jxc-3xJYpAsZ%DqzOyHY>$9jsMD!BEm zHmhM{rs4Lij+bT)+&R*oE3;-?KWgCRv2`~@z!=2kiHpHpM=F%&-qMM6tj48U58D0 z-yBWHoF-)J@@C&8`^25b&d4K$3m#({Ecm&%z6k?_v3$gsyNwtT9_;bl#Pvc>>@ntB zU$7}e#CM42ZGGZ+96sDVTzDqI;}f1>QI84Zj%NpC&!Yk1We^UFrx6XtVIgrDabg+< zW6zoJt&P6P2#-TXY)&Tu%#=@E#>iuEAiUa~a1M6!a3Y6u8EUuJH!ndh0yl)kPv$W) z7P5I1F@RXgllS}Pl#?P6=7fdQXl}3{Gsl*ax!Kfr_%0+m>GaKrMx@AlvI3thbRnKx zKX<)W#w@nlwrN0P+wLakdRNO4k$Dk#@}AJyb7)-P;Mm?L_e+D^6$wN^+ETZ76*3l2 zSzroOoK)PGbLM!tBme{IVnV5xw1mXmG9Ns26r?Cp=oAu46Ch^KTeauS7}SCm{S7p{u6zR8qB%PbDGqQLXh zt&#-csjN)#A*O^f_h~S15C5mVOHU8*nA=332cO)L+zq)mK8bfiECu-)Bc=9)#55*8 zoHeco%|`H*D2_SKRKtZHRX%W_DB?21#k&sVJ0(>fHlc?rsd`?yuc*p5NZvM3qKO4> z|Dg0xh6Wp%CRzp)mjX%tc`)1weKKUz0K~(OZ+`yi_T}5oXmj`&N_yzg(J(rI@PjLZ z&5a?4ATLLby9>7rK6LU+$8f|P8syaG(@}9=52Aytb!|cdvLCVQSVStWSm@g|CFxf5 zZ0H36ABW5zT=PN~+S2twY1T8c`sg4goC#Z27o-6stBaN&Wx687 zkH)euX4<2W223QX*Us9N8-cZ2`N+Wo$2`e2aTaHqXeZXPXc>z!tL?`7wx3_HEIm57 zVhd$!t$L_0)H6-goMp()B%`r96z+D=U9fCdi!ETwVnM5?rlbQyd>hD$s)=7i2b#YK zAyt2+)j+Btq^+ahwF^i^s`d)Cw3n!@{f(Bizfec}6P<6o&|Ycp>gsZ11*~WM3kNUYVFOWiPlJvqKj3!5TwtO+)9 i_R9Jt7-bUlYxzz1x&S*DB3)ZTOX`Zcr0TV^U;hi5+ea?| literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_threading.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_threading.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87c3c9f8de1a554e6d81447d547023f7f591d43f GIT binary patch literal 866 zcmaJf(Ema2sX%aVbT&K37;x@5~34w$(dH_zjL~iohW_6tK?2PSP?i~0P z`%Aqd4qQ1QF7TXG+ZrS+`T5y?-}~OPzkF}6*J6x)`5OOx@*RJDBY$VOw0l8QpO8sd z!X?Xi$hq|$>13_2RrxLHW?tx#?k z%JQU?5W%GZl>lDzjaLZNKtcCUwZS}1-U=lafU(8i9S&_?($rlthALZg;&7(ooHN$* zX~a@!?aMq~9ptlfh|S=rI=6QT%zY7mEK`I74RSv8XErcZi{lSi!q7Kq26<_YN0U1! zi$pLbD*v^R8g|klND#VC*T581$WCk&fwKKa6?r3i%V6thf-Y0D#SHyJfeYP${zGJ& zg5*CebsrUveUmf$T2*EuI9z>daBNGf-gHob(8}kUVVjo9{0@Up$(|2#C zqcbs^1Q(z#0-4T&;>s*@^=v$O8tBx(s1Wgr{#Xa1{_-dC}$F!}e@Ai40cUzD4{{j@%-$4KX literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_type.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_type.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6b83b720a294a1d7f9662b0cc7c96b054594fad GIT binary patch literal 2509 zcmbuB&u`l{6vri7ava6^QKwytq5}x*uo`IOX8F-37={(?)&@wkqDc!(T_I2sZ7Y^U zjillxNPuDKar+;V<8C|buhDg1n5K7{*4? z{iF8N_WYmF|KMZ8=xf6;nOKw)MAjmEHp7&I73gk0UbRd?-ne3!?UOMr4uaTqxIZwiOjB&ibS$ zcuMkpHQ?EjyLPAYRjx6Fy>l zOrYZk{4=gd&ZUflgb~GwjMF^XCp3zP8pLuujl`LZBX9t5pGy+(X#Wo3YQV%Omdv3^ zq8~{z;zbe>nn(^Z_F%%r8ZOz$s&Pmq)B9^@?H4eXo$GKw$4G!~0?~ODXX>@fqTZd7wnQLCUU``U3Ugb<#N5-?Z;|R1a8RF zZWYjOIQ|V19&}glv8A=;mDMkz)q7zOMt5m=e{pe{tt^9iZJFI$U0w<9_g1>!>FCQY z4L~Oil^cGxxp;qZ0h(pU*+ChBprEA3lZ20?RwQZ4NW%MZ2mw(9d@?vKL=jJbVb7UJ zX~r@IX}}|VER`4~e6E41K)?`7#UTG9MnYifVpT{t&tS!ITyzR}4}vF)K!zgD73heV zGaAI<;4Ix4YDF{3#C=@n5l0wxh|!?4gHHhg01Gw-CKzyambvPHNb(M(2N(y{o5hgI z1F}i8KGn?kL=mfAk&q~sVF57m%ys_4o7^$WDVhPKRDn@;>Sc?)(ZTjnS2-PLJ=ib{ znXlr!w9zPG(&V%6m)87en=iIuFt>5$^pFD&Zxq<(Ur2Ute#CmTNYFepzK~C8M*B>Z z4M3+5S!o5FC!vXw#vkm%4K^NPdASW8WgHsH+^rqgL>v3Nbr@MVg1#M@!x~(D_;%_C ze>(&|I|35SNiXgff)QQ-449Cu%Rw)Y@bTrNRjLI`r~>PG;vlxT+apeozGr#>Y6s3qVs)OXH^_NrcWv`ldgx?AN$Sh4i(`Z-2py2v5f;u#BT;CJ@HgPzm! z1O|u3iE(P2n2~vE{!lxr9o1Fsu%_yom}`f%6Z;fs8P>%O)i^eOhF8^*r6vxoWAg~v zY95-A^{WXq*$2Pt0BaS14{Cqqy6)@$21txoFR(<#j zcX$P10Th$CIufrHdu_q`F}z}g4@EeW@DEEWX7DNA%}b3AMDxp3hxaS2mGTxemep!s Vt+mYR&#AYjt!oV!HQ!tB{{fO(^iBW( literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_typing.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_typing.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63736b7aa75821af2176f340cb6e566c0d3a5c97 GIT binary patch literal 10016 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_unittest.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_unittest.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11e102b85b802e3f23316e9c7bd9647667cb11d5 GIT binary patch literal 1125 zcmaJ=&2G~`5VjpBaY9Qa1c(dLic1@b+O1k4s1RyY^$@94g%+gx;%w|myy|*4+FiG# z*K$BS2vVPbSKt|P<-{v+DPudK^bpqG+1a1@=G&baxxC!2S(df4`{moi?H^x%qJF2j zINQapKcYyi&`RvY;dbVPj$Pr99JQC>6;CGX}IFnM`sH{x9@zb?oUA1tX>nsHobA z;FAH7fV#G)^)Xc%@KEdMbn9hwbnxLAC--OIZ>gXoP;mkDZ*y?6hh2Lp3|{KWKDIgz z{cc-Un_%k+Vp6zeG^X(xB0Voxds=d8AnEFfh?zV=%6n7;i8 zj3upJqOc_u$lP#tu?3`O@3f`?NNUVj?*zdJZ<-JMSZ2Y|Wba)!7*9A8CSY3Upo8s= z7aN_D$mOeY7%G_&pB9mc;vy(jEXV?vrH!g#7F=7Zi9;!Vp9ZPSAW*pwpo0DG``+RD z0Uc}x=OE4l&IU*WBPF){&5b}a1M9N{(E+W}Iv6O*L?xqnV*BIC^yva7y)tK(ill6y zaPB#_d!t&YhTh!%u+yG4qbQMa6orpwp8V32p8_9)(yB=9aOLk_&Nvo|Dr!1hp0CDI yAj|rllUY?Ns&HPqy?u^KD@tYRy{>Zc4Hk-}AER*HCA<2(n)|@9J=?o+Z~g$~s7@dN literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_uuid.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_uuid.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91b1a07e34364deacef627e390cb91e77d3c98aa GIT binary patch literal 743 zcmZWnJ#X7E5Tz(tk{!EgG6kK4ZXROQ=o$nKoD2b44=D^3S_E38ZPgN~9O(cFvNdb} zLo#N`57OGH|Df&C9wis(2L(R9qmI0LcT|Hx&n1L>_%{CThSAd(YOSM%g2=2yG@G5DMy2ALLX5s*Y%+A}XIs~IOtPf_-04h|)CNg7 zDVWx$Vo`fiaZ&pq%m(B%bL`peu-wBr!Kn`r3`)2qoPMTDTtA|mBNT~gc~h{?c(GqG z5Yp6cF3pgFEmrLpDr1FybfAOgBY_=Ue$3*PDn$$%DFwu5Cl}|_!?$ccj<1Bgii><6 zSJ!5xR?K9p#!fS<(nix1;ef&b zm;W@{e~rdIl3Q|59#H3+qAohU={6VJ^4j`cN>&Q!pDofL3cboaBY+C|0bn@c&u5E=LS!^>Gx+&nl4mwkn;A!Ixwn2@oWFN#b p*G52UfJu!nqx>UDTLsu=+P;%x+cNze!Sni#{q|kI({sX~zW^Kaw<7=m literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/helpers.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/helpers.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a35af06c630de1000e8cae834a716c8df7b4a64 GIT binary patch literal 1162 zcmah|O;6iE5Z$#M#|cUJYJnnE>alK1T+}OyN@NQVd~e|9TSBOA z0pNtwkVMp{6tNK+k?ET`HbW~a`K26Np&ga|GT=F0=Z$mAcld0Fxbwe|+NIeHlQK?N z(vPKvrSqPJA?t<$aAQ*^D(>?wCfR{d;IX%2J_P^9d-bf~*~@Gtl97^`)sCg;VS$r@%w?G1qxv}jUb!Iql$W@D zUK^V!xgrTo%?k>?GI!3M>%4d7-13F-vPKJ-^rM! zbU?1?HTgjHmUfM?0dXMGfTYF-Nloxp$5v_$jFgUudYY2d3XJ2$V~3LtxuI>>%it+na}Y!?fU)TUtx^Z3O^t8Ht#y0$Qi+4UPK3h7L6Su$LD1$#QC+J!<+-OS zDr~^aRjmR*?JmiY(IKhlDQ3EhrpBc?gu{-=%abSv3guNAL(l5GX7 bool: + if ( + builtin_name == "type" + and node.root().name == "re" + and isinstance(node.func, nodes.Name) + and node.func.name == "type" + and isinstance(node.parent, nodes.Assign) + and len(node.parent.targets) == 1 + and isinstance(node.parent.targets[0], nodes.AssignName) + and node.parent.targets[0].name in {"Pattern", "Match"} + ): + # Handle re.Pattern and re.Match in brain_re + # Match these patterns from stdlib/re.py + # ```py + # Pattern = type(...) + # Match = type(...) + # ``` + return False + if isinstance(node.func, nodes.Name) and node.func.name == builtin_name: + return True + if isinstance(node.func, nodes.Attribute): + return ( + node.func.attrname == "fromkeys" + and isinstance(node.func.expr, nodes.Name) + and node.func.expr.name == "dict" + ) + return False + + +def register_builtin_transform(transform, builtin_name) -> None: + """Register a new transform function for the given *builtin_name*. + + The transform function must accept two parameters, a node and + an optional context. + """ + + def _transform_wrapper(node, context: InferenceContext | None = None): + result = transform(node, context=context) + if result: + if not result.parent: + # Let the transformation function determine + # the parent for its result. Otherwise, + # we set it to be the node we transformed from. + result.parent = node + + if result.lineno is None: + result.lineno = node.lineno + # Can be a 'Module' see https://github.com/PyCQA/pylint/issues/4671 + # We don't have a regression test on this one: tread carefully + if hasattr(result, "col_offset") and result.col_offset is None: + result.col_offset = node.col_offset + return iter([result]) + + AstroidManager().register_transform( + nodes.Call, + inference_tip(_transform_wrapper), + partial(_builtin_filter_predicate, builtin_name=builtin_name), + ) + + +def _container_generic_inference(node, context, node_type, transform): + args = node.args + if not args: + return node_type() + if len(node.args) > 1: + raise UseInferenceDefault() + + (arg,) = args + transformed = transform(arg) + if not transformed: + try: + inferred = next(arg.infer(context=context)) + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc + if isinstance(inferred, util.UninferableBase): + raise UseInferenceDefault + transformed = transform(inferred) + if not transformed or isinstance(transformed, util.UninferableBase): + raise UseInferenceDefault + return transformed + + +def _container_generic_transform( # pylint: disable=inconsistent-return-statements + arg, context, klass, iterables, build_elts +): + if isinstance(arg, klass): + return arg + if isinstance(arg, iterables): + if all(isinstance(elt, nodes.Const) for elt in arg.elts): + elts = [elt.value for elt in arg.elts] + else: + # TODO: Does not handle deduplication for sets. + elts = [] + for element in arg.elts: + if not element: + continue + inferred = helpers.safe_infer(element, context=context) + if inferred: + evaluated_object = nodes.EvaluatedObject( + original=element, value=inferred + ) + elts.append(evaluated_object) + elif isinstance(arg, nodes.Dict): + # Dicts need to have consts as strings already. + if not all(isinstance(elt[0], nodes.Const) for elt in arg.items): + raise UseInferenceDefault() + elts = [item[0].value for item in arg.items] + elif isinstance(arg, nodes.Const) and isinstance(arg.value, (str, bytes)): + elts = arg.value + else: + return + return klass.from_elements(elts=build_elts(elts)) + + +def _infer_builtin_container( + node, context, klass=None, iterables=None, build_elts=None +): + transform_func = partial( + _container_generic_transform, + context=context, + klass=klass, + iterables=iterables, + build_elts=build_elts, + ) + + return _container_generic_inference(node, context, klass, transform_func) + + +# pylint: disable=invalid-name +infer_tuple = partial( + _infer_builtin_container, + klass=nodes.Tuple, + iterables=( + nodes.List, + nodes.Set, + objects.FrozenSet, + objects.DictItems, + objects.DictKeys, + objects.DictValues, + ), + build_elts=tuple, +) + +infer_list = partial( + _infer_builtin_container, + klass=nodes.List, + iterables=( + nodes.Tuple, + nodes.Set, + objects.FrozenSet, + objects.DictItems, + objects.DictKeys, + objects.DictValues, + ), + build_elts=list, +) + +infer_set = partial( + _infer_builtin_container, + klass=nodes.Set, + iterables=(nodes.List, nodes.Tuple, objects.FrozenSet, objects.DictKeys), + build_elts=set, +) + +infer_frozenset = partial( + _infer_builtin_container, + klass=objects.FrozenSet, + iterables=(nodes.List, nodes.Tuple, nodes.Set, objects.FrozenSet, objects.DictKeys), + build_elts=frozenset, +) + + +def _get_elts(arg, context): + def is_iterable(n): + return isinstance(n, (nodes.List, nodes.Tuple, nodes.Set)) + + try: + inferred = next(arg.infer(context)) + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc + if isinstance(inferred, nodes.Dict): + items = inferred.items + elif is_iterable(inferred): + items = [] + for elt in inferred.elts: + # If an item is not a pair of two items, + # then fallback to the default inference. + # Also, take in consideration only hashable items, + # tuples and consts. We are choosing Names as well. + if not is_iterable(elt): + raise UseInferenceDefault() + if len(elt.elts) != 2: + raise UseInferenceDefault() + if not isinstance(elt.elts[0], (nodes.Tuple, nodes.Const, nodes.Name)): + raise UseInferenceDefault() + items.append(tuple(elt.elts)) + else: + raise UseInferenceDefault() + return items + + +def infer_dict(node, context: InferenceContext | None = None): + """Try to infer a dict call to a Dict node. + + The function treats the following cases: + + * dict() + * dict(mapping) + * dict(iterable) + * dict(iterable, **kwargs) + * dict(mapping, **kwargs) + * dict(**kwargs) + + If a case can't be inferred, we'll fallback to default inference. + """ + call = arguments.CallSite.from_call(node, context=context) + if call.has_invalid_arguments() or call.has_invalid_keywords(): + raise UseInferenceDefault + + args = call.positional_arguments + kwargs = list(call.keyword_arguments.items()) + + if not args and not kwargs: + # dict() + return nodes.Dict() + if kwargs and not args: + # dict(a=1, b=2, c=4) + items = [(nodes.Const(key), value) for key, value in kwargs] + elif len(args) == 1 and kwargs: + # dict(some_iterable, b=2, c=4) + elts = _get_elts(args[0], context) + keys = [(nodes.Const(key), value) for key, value in kwargs] + items = elts + keys + elif len(args) == 1: + items = _get_elts(args[0], context) + else: + raise UseInferenceDefault() + value = nodes.Dict( + col_offset=node.col_offset, lineno=node.lineno, parent=node.parent + ) + value.postinit(items) + return value + + +def infer_super(node, context: InferenceContext | None = None): + """Understand super calls. + + There are some restrictions for what can be understood: + + * unbounded super (one argument form) is not understood. + + * if the super call is not inside a function (classmethod or method), + then the default inference will be used. + + * if the super arguments can't be inferred, the default inference + will be used. + """ + if len(node.args) == 1: + # Ignore unbounded super. + raise UseInferenceDefault + + scope = node.scope() + if not isinstance(scope, nodes.FunctionDef): + # Ignore non-method uses of super. + raise UseInferenceDefault + if scope.type not in ("classmethod", "method"): + # Not interested in staticmethods. + raise UseInferenceDefault + + cls = scoped_nodes.get_wrapping_class(scope) + if not node.args: + mro_pointer = cls + # In we are in a classmethod, the interpreter will fill + # automatically the class as the second argument, not an instance. + if scope.type == "classmethod": + mro_type = cls + else: + mro_type = cls.instantiate_class() + else: + try: + mro_pointer = next(node.args[0].infer(context=context)) + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc + try: + mro_type = next(node.args[1].infer(context=context)) + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc + + if isinstance(mro_pointer, util.UninferableBase) or isinstance( + mro_type, util.UninferableBase + ): + # No way we could understand this. + raise UseInferenceDefault + + super_obj = objects.Super( + mro_pointer=mro_pointer, mro_type=mro_type, self_class=cls, scope=scope + ) + super_obj.parent = node + return super_obj + + +def _infer_getattr_args(node, context): + if len(node.args) not in (2, 3): + # Not a valid getattr call. + raise UseInferenceDefault + + try: + obj = next(node.args[0].infer(context=context)) + attr = next(node.args[1].infer(context=context)) + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc + + if isinstance(obj, util.UninferableBase) or isinstance(attr, util.UninferableBase): + # If one of the arguments is something we can't infer, + # then also make the result of the getattr call something + # which is unknown. + return util.Uninferable, util.Uninferable + + is_string = isinstance(attr, nodes.Const) and isinstance(attr.value, str) + if not is_string: + raise UseInferenceDefault + + return obj, attr.value + + +def infer_getattr(node, context: InferenceContext | None = None): + """Understand getattr calls. + + If one of the arguments is an Uninferable object, then the + result will be an Uninferable object. Otherwise, the normal attribute + lookup will be done. + """ + obj, attr = _infer_getattr_args(node, context) + if ( + isinstance(obj, util.UninferableBase) + or isinstance(attr, util.UninferableBase) + or not hasattr(obj, "igetattr") + ): + return util.Uninferable + + try: + return next(obj.igetattr(attr, context=context)) + except (StopIteration, InferenceError, AttributeInferenceError): + if len(node.args) == 3: + # Try to infer the default and return it instead. + try: + return next(node.args[2].infer(context=context)) + except (StopIteration, InferenceError) as exc: + raise UseInferenceDefault from exc + + raise UseInferenceDefault + + +def infer_hasattr(node, context: InferenceContext | None = None): + """Understand hasattr calls. + + This always guarantees three possible outcomes for calling + hasattr: Const(False) when we are sure that the object + doesn't have the intended attribute, Const(True) when + we know that the object has the attribute and Uninferable + when we are unsure of the outcome of the function call. + """ + try: + obj, attr = _infer_getattr_args(node, context) + if ( + isinstance(obj, util.UninferableBase) + or isinstance(attr, util.UninferableBase) + or not hasattr(obj, "getattr") + ): + return util.Uninferable + obj.getattr(attr, context=context) + except UseInferenceDefault: + # Can't infer something from this function call. + return util.Uninferable + except AttributeInferenceError: + # Doesn't have it. + return nodes.Const(False) + return nodes.Const(True) + + +def infer_callable(node, context: InferenceContext | None = None): + """Understand callable calls. + + This follows Python's semantics, where an object + is callable if it provides an attribute __call__, + even though that attribute is something which can't be + called. + """ + if len(node.args) != 1: + # Invalid callable call. + raise UseInferenceDefault + + argument = node.args[0] + try: + inferred = next(argument.infer(context=context)) + except (InferenceError, StopIteration): + return util.Uninferable + if isinstance(inferred, util.UninferableBase): + return util.Uninferable + return nodes.Const(inferred.callable()) + + +def infer_property( + node: nodes.Call, context: InferenceContext | None = None +) -> objects.Property: + """Understand `property` class. + + This only infers the output of `property` + call, not the arguments themselves. + """ + if len(node.args) < 1: + # Invalid property call. + raise UseInferenceDefault + + getter = node.args[0] + try: + inferred = next(getter.infer(context=context)) + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc + + if not isinstance(inferred, (nodes.FunctionDef, nodes.Lambda)): + raise UseInferenceDefault + + prop_func = objects.Property( + function=inferred, + name=inferred.name, + lineno=node.lineno, + parent=node, + col_offset=node.col_offset, + ) + prop_func.postinit( + body=[], + args=inferred.args, + doc_node=getattr(inferred, "doc_node", None), + ) + return prop_func + + +def infer_bool(node, context: InferenceContext | None = None): + """Understand bool calls.""" + if len(node.args) > 1: + # Invalid bool call. + raise UseInferenceDefault + + if not node.args: + return nodes.Const(False) + + argument = node.args[0] + try: + inferred = next(argument.infer(context=context)) + except (InferenceError, StopIteration): + return util.Uninferable + if isinstance(inferred, util.UninferableBase): + return util.Uninferable + + bool_value = inferred.bool_value(context=context) + if isinstance(bool_value, util.UninferableBase): + return util.Uninferable + return nodes.Const(bool_value) + + +def infer_type(node, context: InferenceContext | None = None): + """Understand the one-argument form of *type*.""" + if len(node.args) != 1: + raise UseInferenceDefault + + return helpers.object_type(node.args[0], context) + + +def infer_slice(node, context: InferenceContext | None = None): + """Understand `slice` calls.""" + args = node.args + if not 0 < len(args) <= 3: + raise UseInferenceDefault + + infer_func = partial(helpers.safe_infer, context=context) + args = [infer_func(arg) for arg in args] + for arg in args: + if not arg or isinstance(arg, util.UninferableBase): + raise UseInferenceDefault + if not isinstance(arg, nodes.Const): + raise UseInferenceDefault + if not isinstance(arg.value, (type(None), int)): + raise UseInferenceDefault + + if len(args) < 3: + # Make sure we have 3 arguments. + args.extend([None] * (3 - len(args))) + + slice_node = nodes.Slice( + lineno=node.lineno, col_offset=node.col_offset, parent=node.parent + ) + slice_node.postinit(*args) + return slice_node + + +def _infer_object__new__decorator(node, context: InferenceContext | None = None): + # Instantiate class immediately + # since that's what @object.__new__ does + return iter((node.instantiate_class(),)) + + +def _infer_object__new__decorator_check(node) -> bool: + """Predicate before inference_tip. + + Check if the given ClassDef has an @object.__new__ decorator + """ + if not node.decorators: + return False + + for decorator in node.decorators.nodes: + if isinstance(decorator, nodes.Attribute): + if decorator.as_string() == OBJECT_DUNDER_NEW: + return True + return False + + +def infer_issubclass(callnode, context: InferenceContext | None = None): + """Infer issubclass() calls. + + :param nodes.Call callnode: an `issubclass` call + :param InferenceContext context: the context for the inference + :rtype nodes.Const: Boolean Const value of the `issubclass` call + :raises UseInferenceDefault: If the node cannot be inferred + """ + call = arguments.CallSite.from_call(callnode, context=context) + if call.keyword_arguments: + # issubclass doesn't support keyword arguments + raise UseInferenceDefault("TypeError: issubclass() takes no keyword arguments") + if len(call.positional_arguments) != 2: + raise UseInferenceDefault( + f"Expected two arguments, got {len(call.positional_arguments)}" + ) + # The left hand argument is the obj to be checked + obj_node, class_or_tuple_node = call.positional_arguments + + try: + obj_type = next(obj_node.infer(context=context)) + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc + if not isinstance(obj_type, nodes.ClassDef): + raise UseInferenceDefault("TypeError: arg 1 must be class") + + # The right hand argument is the class(es) that the given + # object is to be checked against. + try: + class_container = _class_or_tuple_to_container( + class_or_tuple_node, context=context + ) + except InferenceError as exc: + raise UseInferenceDefault from exc + try: + issubclass_bool = helpers.object_issubclass(obj_type, class_container, context) + except AstroidTypeError as exc: + raise UseInferenceDefault("TypeError: " + str(exc)) from exc + except MroError as exc: + raise UseInferenceDefault from exc + return nodes.Const(issubclass_bool) + + +def infer_isinstance(callnode, context: InferenceContext | None = None): + """Infer isinstance calls. + + :param nodes.Call callnode: an isinstance call + :rtype nodes.Const: Boolean Const value of isinstance call + + :raises UseInferenceDefault: If the node cannot be inferred + """ + call = arguments.CallSite.from_call(callnode, context=context) + if call.keyword_arguments: + # isinstance doesn't support keyword arguments + raise UseInferenceDefault("TypeError: isinstance() takes no keyword arguments") + if len(call.positional_arguments) != 2: + raise UseInferenceDefault( + f"Expected two arguments, got {len(call.positional_arguments)}" + ) + # The left hand argument is the obj to be checked + obj_node, class_or_tuple_node = call.positional_arguments + # The right hand argument is the class(es) that the given + # obj is to be check is an instance of + try: + class_container = _class_or_tuple_to_container( + class_or_tuple_node, context=context + ) + except InferenceError as exc: + raise UseInferenceDefault from exc + try: + isinstance_bool = helpers.object_isinstance(obj_node, class_container, context) + except AstroidTypeError as exc: + raise UseInferenceDefault("TypeError: " + str(exc)) from exc + except MroError as exc: + raise UseInferenceDefault from exc + if isinstance(isinstance_bool, util.UninferableBase): + raise UseInferenceDefault + return nodes.Const(isinstance_bool) + + +def _class_or_tuple_to_container(node, context: InferenceContext | None = None): + # Move inferences results into container + # to simplify later logic + # raises InferenceError if any of the inferences fall through + try: + node_infer = next(node.infer(context=context)) + except StopIteration as e: + raise InferenceError(node=node, context=context) from e + # arg2 MUST be a type or a TUPLE of types + # for isinstance + if isinstance(node_infer, nodes.Tuple): + try: + class_container = [ + next(node.infer(context=context)) for node in node_infer.elts + ] + except StopIteration as e: + raise InferenceError(node=node, context=context) from e + class_container = [ + klass_node for klass_node in class_container if klass_node is not None + ] + else: + class_container = [node_infer] + return class_container + + +def infer_len(node, context: InferenceContext | None = None): + """Infer length calls. + + :param nodes.Call node: len call to infer + :param context.InferenceContext: node context + :rtype nodes.Const: a Const node with the inferred length, if possible + """ + call = arguments.CallSite.from_call(node, context=context) + if call.keyword_arguments: + raise UseInferenceDefault("TypeError: len() must take no keyword arguments") + if len(call.positional_arguments) != 1: + raise UseInferenceDefault( + "TypeError: len() must take exactly one argument " + "({len}) given".format(len=len(call.positional_arguments)) + ) + [argument_node] = call.positional_arguments + + try: + return nodes.Const(helpers.object_len(argument_node, context=context)) + except (AstroidTypeError, InferenceError) as exc: + raise UseInferenceDefault(str(exc)) from exc + + +def infer_str(node, context: InferenceContext | None = None): + """Infer str() calls. + + :param nodes.Call node: str() call to infer + :param context.InferenceContext: node context + :rtype nodes.Const: a Const containing an empty string + """ + call = arguments.CallSite.from_call(node, context=context) + if call.keyword_arguments: + raise UseInferenceDefault("TypeError: str() must take no keyword arguments") + try: + return nodes.Const("") + except (AstroidTypeError, InferenceError) as exc: + raise UseInferenceDefault(str(exc)) from exc + + +def infer_int(node, context: InferenceContext | None = None): + """Infer int() calls. + + :param nodes.Call node: int() call to infer + :param context.InferenceContext: node context + :rtype nodes.Const: a Const containing the integer value of the int() call + """ + call = arguments.CallSite.from_call(node, context=context) + if call.keyword_arguments: + raise UseInferenceDefault("TypeError: int() must take no keyword arguments") + + if call.positional_arguments: + try: + first_value = next(call.positional_arguments[0].infer(context=context)) + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault(str(exc)) from exc + + if isinstance(first_value, util.UninferableBase): + raise UseInferenceDefault + + if isinstance(first_value, nodes.Const) and isinstance( + first_value.value, (int, str) + ): + try: + actual_value = int(first_value.value) + except ValueError: + return nodes.Const(0) + return nodes.Const(actual_value) + + return nodes.Const(0) + + +def infer_dict_fromkeys(node, context: InferenceContext | None = None): + """Infer dict.fromkeys. + + :param nodes.Call node: dict.fromkeys() call to infer + :param context.InferenceContext context: node context + :rtype nodes.Dict: + a Dictionary containing the values that astroid was able to infer. + In case the inference failed for any reason, an empty dictionary + will be inferred instead. + """ + + def _build_dict_with_elements(elements): + new_node = nodes.Dict( + col_offset=node.col_offset, lineno=node.lineno, parent=node.parent + ) + new_node.postinit(elements) + return new_node + + call = arguments.CallSite.from_call(node, context=context) + if call.keyword_arguments: + raise UseInferenceDefault("TypeError: int() must take no keyword arguments") + if len(call.positional_arguments) not in {1, 2}: + raise UseInferenceDefault( + "TypeError: Needs between 1 and 2 positional arguments" + ) + + default = nodes.Const(None) + values = call.positional_arguments[0] + try: + inferred_values = next(values.infer(context=context)) + except (InferenceError, StopIteration): + return _build_dict_with_elements([]) + if inferred_values is util.Uninferable: + return _build_dict_with_elements([]) + + # Limit to a couple of potential values, as this can become pretty complicated + accepted_iterable_elements = (nodes.Const,) + if isinstance(inferred_values, (nodes.List, nodes.Set, nodes.Tuple)): + elements = inferred_values.elts + for element in elements: + if not isinstance(element, accepted_iterable_elements): + # Fallback to an empty dict + return _build_dict_with_elements([]) + + elements_with_value = [(element, default) for element in elements] + return _build_dict_with_elements(elements_with_value) + if isinstance(inferred_values, nodes.Const) and isinstance( + inferred_values.value, (str, bytes) + ): + elements = [ + (nodes.Const(element), default) for element in inferred_values.value + ] + return _build_dict_with_elements(elements) + if isinstance(inferred_values, nodes.Dict): + keys = inferred_values.itered() + for key in keys: + if not isinstance(key, accepted_iterable_elements): + # Fallback to an empty dict + return _build_dict_with_elements([]) + + elements_with_value = [(element, default) for element in keys] + return _build_dict_with_elements(elements_with_value) + + # Fallback to an empty dictionary + return _build_dict_with_elements([]) + + +def _infer_copy_method( + node: nodes.Call, context: InferenceContext | None = None +) -> Iterator[nodes.NodeNG]: + assert isinstance(node.func, nodes.Attribute) + inferred_orig, inferred_copy = itertools.tee(node.func.expr.infer(context=context)) + if all( + isinstance( + inferred_node, (nodes.Dict, nodes.List, nodes.Set, objects.FrozenSet) + ) + for inferred_node in inferred_orig + ): + return inferred_copy + + raise UseInferenceDefault() + + +def _is_str_format_call(node: nodes.Call) -> bool: + """Catch calls to str.format().""" + if not isinstance(node.func, nodes.Attribute) or not node.func.attrname == "format": + return False + + if isinstance(node.func.expr, nodes.Name): + value = helpers.safe_infer(node.func.expr) + else: + value = node.func.expr + + return isinstance(value, nodes.Const) and isinstance(value.value, str) + + +def _infer_str_format_call( + node: nodes.Call, context: InferenceContext | None = None +) -> Iterator[nodes.Const | util.UninferableBase]: + """Return a Const node based on the template and passed arguments.""" + call = arguments.CallSite.from_call(node, context=context) + if isinstance(node.func.expr, nodes.Name): + value: nodes.Const | None = helpers.safe_infer(node.func.expr) + if value is None: + return iter([util.Uninferable]) + else: + value = node.func.expr + + format_template = value.value + + # Get the positional arguments passed + inferred_positional = [ + helpers.safe_infer(i, context) for i in call.positional_arguments + ] + if not all(isinstance(i, nodes.Const) for i in inferred_positional): + return iter([util.Uninferable]) + pos_values: list[str] = [i.value for i in inferred_positional] + + # Get the keyword arguments passed + inferred_keyword = { + k: helpers.safe_infer(v, context) for k, v in call.keyword_arguments.items() + } + if not all(isinstance(i, nodes.Const) for i in inferred_keyword.values()): + return iter([util.Uninferable]) + keyword_values: dict[str, str] = {k: v.value for k, v in inferred_keyword.items()} + + try: + formatted_string = format_template.format(*pos_values, **keyword_values) + except (AttributeError, IndexError, KeyError, TypeError, ValueError): + # AttributeError: named field in format string was not found in the arguments + # IndexError: there are too few arguments to interpolate + # TypeError: Unsupported format string + # ValueError: Unknown format code + return iter([util.Uninferable]) + + return iter([nodes.const_factory(formatted_string)]) + + +# Builtins inference +register_builtin_transform(infer_bool, "bool") +register_builtin_transform(infer_super, "super") +register_builtin_transform(infer_callable, "callable") +register_builtin_transform(infer_property, "property") +register_builtin_transform(infer_getattr, "getattr") +register_builtin_transform(infer_hasattr, "hasattr") +register_builtin_transform(infer_tuple, "tuple") +register_builtin_transform(infer_set, "set") +register_builtin_transform(infer_list, "list") +register_builtin_transform(infer_dict, "dict") +register_builtin_transform(infer_frozenset, "frozenset") +register_builtin_transform(infer_type, "type") +register_builtin_transform(infer_slice, "slice") +register_builtin_transform(infer_isinstance, "isinstance") +register_builtin_transform(infer_issubclass, "issubclass") +register_builtin_transform(infer_len, "len") +register_builtin_transform(infer_str, "str") +register_builtin_transform(infer_int, "int") +register_builtin_transform(infer_dict_fromkeys, "dict.fromkeys") + + +# Infer object.__new__ calls +AstroidManager().register_transform( + nodes.ClassDef, + inference_tip(_infer_object__new__decorator), + _infer_object__new__decorator_check, +) + +AstroidManager().register_transform( + nodes.Call, + inference_tip(_infer_copy_method), + lambda node: isinstance(node.func, nodes.Attribute) + and node.func.attrname == "copy", +) + +AstroidManager().register_transform( + nodes.Call, inference_tip(_infer_str_format_call), _is_str_format_call +) diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_collections.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_collections.py new file mode 120000 index 00000000..da3b19b3 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_collections.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/ff/fb/e1/fd2529df2998ebc8bf5185b538c9408c337e1e2bff34774342cf7c1d5e \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_crypt.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_crypt.py new file mode 120000 index 00000000..433ec781 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_crypt.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/66/8e/ba/cfde1c40e2fe1cd39c01048f36cfc86ffc4d2cb63da84b716755646c03 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_ctypes.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_ctypes.py new file mode 120000 index 00000000..f069d0ca --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_ctypes.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/e7/97/e5/9c0223fd387f7aaa86d4744c0d1e5cb6def8c30d6f0ec485e36176e84b \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_curses.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_curses.py new file mode 120000 index 00000000..bb30bbdf --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_curses.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/5d/7c/82/78b01214592c3b6cd26eb66007f00898606520667b3e08dd9b4e31fa38 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_dataclasses.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_dataclasses.py new file mode 100644 index 00000000..1397ed14 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_dataclasses.py @@ -0,0 +1,636 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +""" +Astroid hook for the dataclasses library. + +Support built-in dataclasses, pydantic.dataclasses, and marshmallow_dataclass-annotated +dataclasses. References: +- https://docs.python.org/3/library/dataclasses.html +- https://pydantic-docs.helpmanual.io/usage/dataclasses/ +- https://lovasoa.github.io/marshmallow_dataclass/ +""" + +from __future__ import annotations + +import sys +from collections.abc import Iterator +from typing import Tuple, Union + +from astroid import bases, context, helpers, nodes +from astroid.builder import parse +from astroid.const import PY39_PLUS, PY310_PLUS +from astroid.exceptions import AstroidSyntaxError, InferenceError, UseInferenceDefault +from astroid.inference_tip import inference_tip +from astroid.manager import AstroidManager +from astroid.typing import InferenceResult +from astroid.util import Uninferable, UninferableBase + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from typing_extensions import Literal + +_FieldDefaultReturn = Union[ + None, + Tuple[Literal["default"], nodes.NodeNG], + Tuple[Literal["default_factory"], nodes.Call], +] + +DATACLASSES_DECORATORS = frozenset(("dataclass",)) +FIELD_NAME = "field" +DATACLASS_MODULES = frozenset( + ("dataclasses", "marshmallow_dataclass", "pydantic.dataclasses") +) +DEFAULT_FACTORY = "_HAS_DEFAULT_FACTORY" # based on typing.py + + +def is_decorated_with_dataclass( + node: nodes.ClassDef, decorator_names: frozenset[str] = DATACLASSES_DECORATORS +) -> bool: + """Return True if a decorated node has a `dataclass` decorator applied.""" + if not isinstance(node, nodes.ClassDef) or not node.decorators: + return False + + return any( + _looks_like_dataclass_decorator(decorator_attribute, decorator_names) + for decorator_attribute in node.decorators.nodes + ) + + +def dataclass_transform(node: nodes.ClassDef) -> None: + """Rewrite a dataclass to be easily understood by pylint.""" + node.is_dataclass = True + + for assign_node in _get_dataclass_attributes(node): + name = assign_node.target.name + + rhs_node = nodes.Unknown( + lineno=assign_node.lineno, + col_offset=assign_node.col_offset, + parent=assign_node, + ) + rhs_node = AstroidManager().visit_transforms(rhs_node) + node.instance_attrs[name] = [rhs_node] + + if not _check_generate_dataclass_init(node): + return + + kw_only_decorated = False + if PY310_PLUS and node.decorators.nodes: + for decorator in node.decorators.nodes: + if not isinstance(decorator, nodes.Call): + kw_only_decorated = False + break + for keyword in decorator.keywords: + if keyword.arg == "kw_only": + kw_only_decorated = keyword.value.bool_value() + + init_str = _generate_dataclass_init( + node, + list(_get_dataclass_attributes(node, init=True)), + kw_only_decorated, + ) + + try: + init_node = parse(init_str)["__init__"] + except AstroidSyntaxError: + pass + else: + init_node.parent = node + init_node.lineno, init_node.col_offset = None, None + node.locals["__init__"] = [init_node] + + root = node.root() + if DEFAULT_FACTORY not in root.locals: + new_assign = parse(f"{DEFAULT_FACTORY} = object()").body[0] + new_assign.parent = root + root.locals[DEFAULT_FACTORY] = [new_assign.targets[0]] + + +def _get_dataclass_attributes( + node: nodes.ClassDef, init: bool = False +) -> Iterator[nodes.AnnAssign]: + """Yield the AnnAssign nodes of dataclass attributes for the node. + + If init is True, also include InitVars. + """ + for assign_node in node.body: + if not isinstance(assign_node, nodes.AnnAssign) or not isinstance( + assign_node.target, nodes.AssignName + ): + continue + + # Annotation is never None + if _is_class_var(assign_node.annotation): # type: ignore[arg-type] + continue + + if _is_keyword_only_sentinel(assign_node.annotation): + continue + + # Annotation is never None + if not init and _is_init_var(assign_node.annotation): # type: ignore[arg-type] + continue + + yield assign_node + + +def _check_generate_dataclass_init(node: nodes.ClassDef) -> bool: + """Return True if we should generate an __init__ method for node. + + This is True when: + - node doesn't define its own __init__ method + - the dataclass decorator was called *without* the keyword argument init=False + """ + if "__init__" in node.locals: + return False + + found = None + + for decorator_attribute in node.decorators.nodes: + if not isinstance(decorator_attribute, nodes.Call): + continue + + if _looks_like_dataclass_decorator(decorator_attribute): + found = decorator_attribute + + if found is None: + return True + + # Check for keyword arguments of the form init=False + return not any( + keyword.arg == "init" + and not keyword.value.bool_value() # type: ignore[union-attr] # value is never None + for keyword in found.keywords + ) + + +def _find_arguments_from_base_classes( + node: nodes.ClassDef, +) -> tuple[ + dict[str, tuple[str | None, str | None]], dict[str, tuple[str | None, str | None]] +]: + """Iterate through all bases and get their typing and defaults.""" + pos_only_store: dict[str, tuple[str | None, str | None]] = {} + kw_only_store: dict[str, tuple[str | None, str | None]] = {} + # See TODO down below + # all_have_defaults = True + + for base in reversed(node.mro()): + if not base.is_dataclass: + continue + try: + base_init: nodes.FunctionDef = base.locals["__init__"][0] + except KeyError: + continue + + pos_only, kw_only = base_init.args._get_arguments_data() + for posarg, data in pos_only.items(): + # if data[1] is None: + # if all_have_defaults and pos_only_store: + # # TODO: This should return an Uninferable as this would raise + # # a TypeError at runtime. However, transforms can't return + # # Uninferables currently. + # pass + # all_have_defaults = False + pos_only_store[posarg] = data + + for kwarg, data in kw_only.items(): + kw_only_store[kwarg] = data + return pos_only_store, kw_only_store + + +def _parse_arguments_into_strings( + pos_only_store: dict[str, tuple[str | None, str | None]], + kw_only_store: dict[str, tuple[str | None, str | None]], +) -> tuple[str, str]: + """Parse positional and keyword arguments into strings for an __init__ method.""" + pos_only, kw_only = "", "" + for pos_arg, data in pos_only_store.items(): + pos_only += pos_arg + if data[0]: + pos_only += ": " + data[0] + if data[1]: + pos_only += " = " + data[1] + pos_only += ", " + for kw_arg, data in kw_only_store.items(): + kw_only += kw_arg + if data[0]: + kw_only += ": " + data[0] + if data[1]: + kw_only += " = " + data[1] + kw_only += ", " + + return pos_only, kw_only + + +def _get_previous_field_default(node: nodes.ClassDef, name: str) -> nodes.NodeNG | None: + """Get the default value of a previously defined field.""" + for base in reversed(node.mro()): + if not base.is_dataclass: + continue + if name in base.locals: + for assign in base.locals[name]: + if ( + isinstance(assign.parent, nodes.AnnAssign) + and assign.parent.value + and isinstance(assign.parent.value, nodes.Call) + and _looks_like_dataclass_field_call(assign.parent.value) + ): + default = _get_field_default(assign.parent.value) + if default: + return default[1] + return None + + +def _generate_dataclass_init( # pylint: disable=too-many-locals + node: nodes.ClassDef, assigns: list[nodes.AnnAssign], kw_only_decorated: bool +) -> str: + """Return an init method for a dataclass given the targets.""" + params: list[str] = [] + kw_only_params: list[str] = [] + assignments: list[str] = [] + + prev_pos_only_store, prev_kw_only_store = _find_arguments_from_base_classes(node) + + for assign in assigns: + name, annotation, value = assign.target.name, assign.annotation, assign.value + + # Check whether this assign is overriden by a property assignment + property_node: nodes.FunctionDef | None = None + for additional_assign in node.locals[name]: + if not isinstance(additional_assign, nodes.FunctionDef): + continue + if not additional_assign.decorators: + continue + if "builtins.property" in additional_assign.decoratornames(): + property_node = additional_assign + break + + is_field = isinstance(value, nodes.Call) and _looks_like_dataclass_field_call( + value, check_scope=False + ) + + if is_field: + # Skip any fields that have `init=False` + if any( + keyword.arg == "init" and not keyword.value.bool_value() + for keyword in value.keywords # type: ignore[union-attr] # value is never None + ): + # Also remove the name from the previous arguments to be inserted later + prev_pos_only_store.pop(name, None) + prev_kw_only_store.pop(name, None) + continue + + if _is_init_var(annotation): # type: ignore[arg-type] # annotation is never None + init_var = True + if isinstance(annotation, nodes.Subscript): + annotation = annotation.slice + else: + # Cannot determine type annotation for parameter from InitVar + annotation = None + assignment_str = "" + else: + init_var = False + assignment_str = f"self.{name} = {name}" + + ann_str, default_str = None, None + if annotation is not None: + ann_str = annotation.as_string() + + if value: + if is_field: + result = _get_field_default(value) # type: ignore[arg-type] + if result: + default_type, default_node = result + if default_type == "default": + default_str = default_node.as_string() + elif default_type == "default_factory": + default_str = DEFAULT_FACTORY + assignment_str = ( + f"self.{name} = {default_node.as_string()} " + f"if {name} is {DEFAULT_FACTORY} else {name}" + ) + else: + default_str = value.as_string() + elif property_node: + # We set the result of the property call as default + # This hides the fact that this would normally be a 'property object' + # But we can't represent those as string + try: + # Call str to make sure also Uninferable gets stringified + default_str = str(next(property_node.infer_call_result()).as_string()) + except (InferenceError, StopIteration): + pass + else: + # Even with `init=False` the default value still can be propogated to + # later assignments. Creating weird signatures like: + # (self, a: str = 1) -> None + previous_default = _get_previous_field_default(node, name) + if previous_default: + default_str = previous_default.as_string() + + # Construct the param string to add to the init if necessary + param_str = name + if ann_str is not None: + param_str += f": {ann_str}" + if default_str is not None: + param_str += f" = {default_str}" + + # If the field is a kw_only field, we need to add it to the kw_only_params + # This overwrites whether or not the class is kw_only decorated + if is_field: + kw_only = [k for k in value.keywords if k.arg == "kw_only"] # type: ignore[union-attr] + if kw_only: + if kw_only[0].value.bool_value(): + kw_only_params.append(param_str) + else: + params.append(param_str) + continue + # If kw_only decorated, we need to add all parameters to the kw_only_params + if kw_only_decorated: + if name in prev_kw_only_store: + prev_kw_only_store[name] = (ann_str, default_str) + else: + kw_only_params.append(param_str) + else: + # If the name was previously seen, overwrite that data + # pylint: disable-next=else-if-used + if name in prev_pos_only_store: + prev_pos_only_store[name] = (ann_str, default_str) + elif name in prev_kw_only_store: + params = [name] + params + prev_kw_only_store.pop(name) + else: + params.append(param_str) + + if not init_var: + assignments.append(assignment_str) + + prev_pos_only, prev_kw_only = _parse_arguments_into_strings( + prev_pos_only_store, prev_kw_only_store + ) + + # Construct the new init method paramter string + # First we do the positional only parameters, making sure to add the + # the self parameter and the comma to allow adding keyword only parameters + params_string = "" if "self" in prev_pos_only else "self, " + params_string += prev_pos_only + ", ".join(params) + if not params_string.endswith(", "): + params_string += ", " + + # Then we add the keyword only parameters + if prev_kw_only or kw_only_params: + params_string += "*, " + params_string += f"{prev_kw_only}{', '.join(kw_only_params)}" + + assignments_string = "\n ".join(assignments) if assignments else "pass" + return f"def __init__({params_string}) -> None:\n {assignments_string}" + + +def infer_dataclass_attribute( + node: nodes.Unknown, ctx: context.InferenceContext | None = None +) -> Iterator[InferenceResult]: + """Inference tip for an Unknown node that was dynamically generated to + represent a dataclass attribute. + + In the case that a default value is provided, that is inferred first. + Then, an Instance of the annotated class is yielded. + """ + assign = node.parent + if not isinstance(assign, nodes.AnnAssign): + yield Uninferable + return + + annotation, value = assign.annotation, assign.value + if value is not None: + yield from value.infer(context=ctx) + if annotation is not None: + yield from _infer_instance_from_annotation(annotation, ctx=ctx) + else: + yield Uninferable + + +def infer_dataclass_field_call( + node: nodes.Call, ctx: context.InferenceContext | None = None +) -> Iterator[InferenceResult]: + """Inference tip for dataclass field calls.""" + if not isinstance(node.parent, (nodes.AnnAssign, nodes.Assign)): + raise UseInferenceDefault + result = _get_field_default(node) + if not result: + yield Uninferable + else: + default_type, default = result + if default_type == "default": + yield from default.infer(context=ctx) + else: + new_call = parse(default.as_string()).body[0].value + new_call.parent = node.parent + yield from new_call.infer(context=ctx) + + +def _looks_like_dataclass_decorator( + node: nodes.NodeNG, decorator_names: frozenset[str] = DATACLASSES_DECORATORS +) -> bool: + """Return True if node looks like a dataclass decorator. + + Uses inference to lookup the value of the node, and if that fails, + matches against specific names. + """ + if isinstance(node, nodes.Call): # decorator with arguments + node = node.func + try: + inferred = next(node.infer()) + except (InferenceError, StopIteration): + inferred = Uninferable + + if isinstance(inferred, UninferableBase): + if isinstance(node, nodes.Name): + return node.name in decorator_names + if isinstance(node, nodes.Attribute): + return node.attrname in decorator_names + + return False + + return ( + isinstance(inferred, nodes.FunctionDef) + and inferred.name in decorator_names + and inferred.root().name in DATACLASS_MODULES + ) + + +def _looks_like_dataclass_attribute(node: nodes.Unknown) -> bool: + """Return True if node was dynamically generated as the child of an AnnAssign + statement. + """ + parent = node.parent + if not parent: + return False + + scope = parent.scope() + return ( + isinstance(parent, nodes.AnnAssign) + and isinstance(scope, nodes.ClassDef) + and is_decorated_with_dataclass(scope) + ) + + +def _looks_like_dataclass_field_call( + node: nodes.Call, check_scope: bool = True +) -> bool: + """Return True if node is calling dataclasses field or Field + from an AnnAssign statement directly in the body of a ClassDef. + + If check_scope is False, skips checking the statement and body. + """ + if check_scope: + stmt = node.statement(future=True) + scope = stmt.scope() + if not ( + isinstance(stmt, nodes.AnnAssign) + and stmt.value is not None + and isinstance(scope, nodes.ClassDef) + and is_decorated_with_dataclass(scope) + ): + return False + + try: + inferred = next(node.func.infer()) + except (InferenceError, StopIteration): + return False + + if not isinstance(inferred, nodes.FunctionDef): + return False + + return inferred.name == FIELD_NAME and inferred.root().name in DATACLASS_MODULES + + +def _get_field_default(field_call: nodes.Call) -> _FieldDefaultReturn: + """Return a the default value of a field call, and the corresponding keyword + argument name. + + field(default=...) results in the ... node + field(default_factory=...) results in a Call node with func ... and no arguments + + If neither or both arguments are present, return ("", None) instead, + indicating that there is not a valid default value. + """ + default, default_factory = None, None + for keyword in field_call.keywords: + if keyword.arg == "default": + default = keyword.value + elif keyword.arg == "default_factory": + default_factory = keyword.value + + if default is not None and default_factory is None: + return "default", default + + if default is None and default_factory is not None: + new_call = nodes.Call( + lineno=field_call.lineno, + col_offset=field_call.col_offset, + parent=field_call.parent, + ) + new_call.postinit(func=default_factory) + return "default_factory", new_call + + return None + + +def _is_class_var(node: nodes.NodeNG) -> bool: + """Return True if node is a ClassVar, with or without subscripting.""" + if PY39_PLUS: + try: + inferred = next(node.infer()) + except (InferenceError, StopIteration): + return False + + return getattr(inferred, "name", "") == "ClassVar" + + # Before Python 3.9, inference returns typing._SpecialForm instead of ClassVar. + # Our backup is to inspect the node's structure. + return isinstance(node, nodes.Subscript) and ( + isinstance(node.value, nodes.Name) + and node.value.name == "ClassVar" + or isinstance(node.value, nodes.Attribute) + and node.value.attrname == "ClassVar" + ) + + +def _is_keyword_only_sentinel(node: nodes.NodeNG) -> bool: + """Return True if node is the KW_ONLY sentinel.""" + if not PY310_PLUS: + return False + inferred = helpers.safe_infer(node) + return ( + isinstance(inferred, bases.Instance) + and inferred.qname() == "dataclasses._KW_ONLY_TYPE" + ) + + +def _is_init_var(node: nodes.NodeNG) -> bool: + """Return True if node is an InitVar, with or without subscripting.""" + try: + inferred = next(node.infer()) + except (InferenceError, StopIteration): + return False + + return getattr(inferred, "name", "") == "InitVar" + + +# Allowed typing classes for which we support inferring instances +_INFERABLE_TYPING_TYPES = frozenset( + ( + "Dict", + "FrozenSet", + "List", + "Set", + "Tuple", + ) +) + + +def _infer_instance_from_annotation( + node: nodes.NodeNG, ctx: context.InferenceContext | None = None +) -> Iterator[UninferableBase | bases.Instance]: + """Infer an instance corresponding to the type annotation represented by node. + + Currently has limited support for the typing module. + """ + klass = None + try: + klass = next(node.infer(context=ctx)) + except (InferenceError, StopIteration): + yield Uninferable + if not isinstance(klass, nodes.ClassDef): + yield Uninferable + elif klass.root().name in { + "typing", + "_collections_abc", + "", + }: # "" because of synthetic nodes in brain_typing.py + if klass.name in _INFERABLE_TYPING_TYPES: + yield klass.instantiate_class() + else: + yield Uninferable + else: + yield klass.instantiate_class() + + +AstroidManager().register_transform( + nodes.ClassDef, dataclass_transform, is_decorated_with_dataclass +) + +AstroidManager().register_transform( + nodes.Call, + inference_tip(infer_dataclass_field_call, raise_on_overwrite=True), + _looks_like_dataclass_field_call, +) + +AstroidManager().register_transform( + nodes.Unknown, + inference_tip(infer_dataclass_attribute, raise_on_overwrite=True), + _looks_like_dataclass_attribute, +) diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_dateutil.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_dateutil.py new file mode 120000 index 00000000..ac23e5f9 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_dateutil.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/d4/83/6d/f3b5416bd42dd03cc4b88d6bedc12d7728390af3435087550affa3fe67 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_fstrings.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_fstrings.py new file mode 100644 index 00000000..c0df22e8 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_fstrings.py @@ -0,0 +1,61 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +from __future__ import annotations + +import collections.abc +from typing import TypeVar + +from astroid import nodes +from astroid.manager import AstroidManager + +_NodeT = TypeVar("_NodeT", bound=nodes.NodeNG) + + +def _clone_node_with_lineno( + node: _NodeT, parent: nodes.NodeNG, lineno: int | None +) -> _NodeT: + cls = node.__class__ + other_fields = node._other_fields + _astroid_fields = node._astroid_fields + init_params = {"lineno": lineno, "col_offset": node.col_offset, "parent": parent} + postinit_params = {param: getattr(node, param) for param in _astroid_fields} + if other_fields: + init_params.update({param: getattr(node, param) for param in other_fields}) + new_node = cls(**init_params) + if hasattr(node, "postinit") and _astroid_fields: + for param, child in postinit_params.items(): + if child and not isinstance(child, collections.abc.Sequence): + cloned_child = _clone_node_with_lineno( + node=child, lineno=new_node.lineno, parent=new_node + ) + postinit_params[param] = cloned_child + new_node.postinit(**postinit_params) + return new_node + + +def _transform_formatted_value( # pylint: disable=inconsistent-return-statements + node: nodes.FormattedValue, +) -> nodes.FormattedValue | None: + if node.value and node.value.lineno == 1: + if node.lineno != node.value.lineno: + new_node = nodes.FormattedValue( + lineno=node.lineno, col_offset=node.col_offset, parent=node.parent + ) + new_value = _clone_node_with_lineno( + node=node.value, lineno=node.lineno, parent=new_node + ) + new_node.postinit( + value=new_value, + conversion=node.conversion, + format_spec=node.format_spec, + ) + return new_node + + +# TODO: this fix tries to *patch* http://bugs.python.org/issue29051 +# The problem is that FormattedValue.value, which is a Name node, +# has wrong line numbers, usually 1. This creates problems for pylint, +# which expects correct line numbers for things such as message control. +AstroidManager().register_transform(nodes.FormattedValue, _transform_formatted_value) diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_functools.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_functools.py new file mode 100644 index 00000000..f6a9830d --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_functools.py @@ -0,0 +1,164 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""Astroid hooks for understanding functools library module.""" + +from __future__ import annotations + +from collections.abc import Iterator +from functools import partial +from itertools import chain + +from astroid import BoundMethod, arguments, extract_node, helpers, nodes, objects +from astroid.context import InferenceContext +from astroid.exceptions import InferenceError, UseInferenceDefault +from astroid.inference_tip import inference_tip +from astroid.interpreter import objectmodel +from astroid.manager import AstroidManager +from astroid.nodes.node_classes import AssignName, Attribute, Call, Name +from astroid.nodes.scoped_nodes import FunctionDef +from astroid.util import UninferableBase + +LRU_CACHE = "functools.lru_cache" + + +class LruWrappedModel(objectmodel.FunctionModel): + """Special attribute model for functions decorated with functools.lru_cache. + + The said decorators patches at decoration time some functions onto + the decorated function. + """ + + @property + def attr___wrapped__(self): + return self._instance + + @property + def attr_cache_info(self): + cache_info = extract_node( + """ + from functools import _CacheInfo + _CacheInfo(0, 0, 0, 0) + """ + ) + + class CacheInfoBoundMethod(BoundMethod): + def infer_call_result( + self, caller, context: InferenceContext | None = None + ): + yield helpers.safe_infer(cache_info) + + return CacheInfoBoundMethod(proxy=self._instance, bound=self._instance) + + @property + def attr_cache_clear(self): + node = extract_node("""def cache_clear(self): pass""") + return BoundMethod(proxy=node, bound=self._instance.parent.scope()) + + +def _transform_lru_cache(node, context: InferenceContext | None = None) -> None: + # TODO: this is not ideal, since the node should be immutable, + # but due to https://github.com/PyCQA/astroid/issues/354, + # there's not much we can do now. + # Replacing the node would work partially, because, + # in pylint, the old node would still be available, leading + # to spurious false positives. + node.special_attributes = LruWrappedModel()(node) + + +def _functools_partial_inference( + node: nodes.Call, context: InferenceContext | None = None +) -> Iterator[objects.PartialFunction]: + call = arguments.CallSite.from_call(node, context=context) + number_of_positional = len(call.positional_arguments) + if number_of_positional < 1: + raise UseInferenceDefault("functools.partial takes at least one argument") + if number_of_positional == 1 and not call.keyword_arguments: + raise UseInferenceDefault( + "functools.partial needs at least to have some filled arguments" + ) + + partial_function = call.positional_arguments[0] + try: + inferred_wrapped_function = next(partial_function.infer(context=context)) + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc + if isinstance(inferred_wrapped_function, UninferableBase): + raise UseInferenceDefault("Cannot infer the wrapped function") + if not isinstance(inferred_wrapped_function, FunctionDef): + raise UseInferenceDefault("The wrapped function is not a function") + + # Determine if the passed keywords into the callsite are supported + # by the wrapped function. + if not inferred_wrapped_function.args: + function_parameters = [] + else: + function_parameters = chain( + inferred_wrapped_function.args.args or (), + inferred_wrapped_function.args.posonlyargs or (), + inferred_wrapped_function.args.kwonlyargs or (), + ) + parameter_names = { + param.name for param in function_parameters if isinstance(param, AssignName) + } + if set(call.keyword_arguments) - parameter_names: + raise UseInferenceDefault("wrapped function received unknown parameters") + + partial_function = objects.PartialFunction( + call, + name=inferred_wrapped_function.name, + lineno=inferred_wrapped_function.lineno, + col_offset=inferred_wrapped_function.col_offset, + parent=node.parent, + ) + partial_function.postinit( + args=inferred_wrapped_function.args, + body=inferred_wrapped_function.body, + decorators=inferred_wrapped_function.decorators, + returns=inferred_wrapped_function.returns, + type_comment_returns=inferred_wrapped_function.type_comment_returns, + type_comment_args=inferred_wrapped_function.type_comment_args, + doc_node=inferred_wrapped_function.doc_node, + ) + return iter((partial_function,)) + + +def _looks_like_lru_cache(node) -> bool: + """Check if the given function node is decorated with lru_cache.""" + if not node.decorators: + return False + for decorator in node.decorators.nodes: + if not isinstance(decorator, Call): + continue + if _looks_like_functools_member(decorator, "lru_cache"): + return True + return False + + +def _looks_like_functools_member(node, member) -> bool: + """Check if the given Call node is a functools.partial call.""" + if isinstance(node.func, Name): + return node.func.name == member + if isinstance(node.func, Attribute): + return ( + node.func.attrname == member + and isinstance(node.func.expr, Name) + and node.func.expr.name == "functools" + ) + return False + + +_looks_like_partial = partial(_looks_like_functools_member, member="partial") + + +AstroidManager().register_transform( + FunctionDef, _transform_lru_cache, _looks_like_lru_cache +) + + +AstroidManager().register_transform( + Call, + inference_tip(_functools_partial_inference), + _looks_like_partial, +) diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_gi.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_gi.py new file mode 120000 index 00000000..407fd209 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_gi.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/2d/8b/6f/6dee3caa6cae8133f7d4272ba9f33a5f4adafe1ea7b5306e286088adc3 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_hashlib.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_hashlib.py new file mode 120000 index 00000000..65abac63 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_hashlib.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/58/4e/df/409080dd1a756450c8b1e42386b2c472c62139fae46b63dcbefb99e938 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_http.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_http.py new file mode 120000 index 00000000..eab14dbd --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_http.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/99/82/dc/31d87f91ae5dd7522975683a5ab1b747b476c0de1b28e2d51b45b7bcf9 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_hypothesis.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_hypothesis.py new file mode 120000 index 00000000..6f2fe7ec --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_hypothesis.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/2b/82/df/45bd8a4fa1f907ba06c405d02dc24597d6e478a7c55bc20471e1806dfc \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_io.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_io.py new file mode 120000 index 00000000..98140154 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_io.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/97/8f/7d/7db562e4751b3d6a32427d714c768f81171fd21b0a8e323dd01747cf24 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_mechanize.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_mechanize.py new file mode 120000 index 00000000..41a361a7 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_mechanize.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/e3/9b/32/5634c69256234b8ebdbcfb2e1e6ca2734f4e4d9b5c26e33b1445dc3182 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_multiprocessing.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_multiprocessing.py new file mode 120000 index 00000000..826c5ae9 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_multiprocessing.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/86/d1/d9/df34b2bf87aa87a73e00544fb761a5cb23dbe0983c3907c0a25a2347c4 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_namedtuple_enum.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_namedtuple_enum.py new file mode 100644 index 00000000..36b70361 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_namedtuple_enum.py @@ -0,0 +1,639 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""Astroid hooks for the Python standard library.""" + +from __future__ import annotations + +import functools +import keyword +import sys +from collections.abc import Iterator +from textwrap import dedent + +import astroid +from astroid import arguments, bases, inference_tip, nodes, util +from astroid.builder import AstroidBuilder, _extract_single_node, extract_node +from astroid.context import InferenceContext +from astroid.exceptions import ( + AstroidTypeError, + AstroidValueError, + InferenceError, + MroError, + UseInferenceDefault, +) +from astroid.manager import AstroidManager + +if sys.version_info >= (3, 8): + from typing import Final +else: + from typing_extensions import Final + + +ENUM_BASE_NAMES = { + "Enum", + "IntEnum", + "enum.Enum", + "enum.IntEnum", + "IntFlag", + "enum.IntFlag", +} +ENUM_QNAME: Final[str] = "enum.Enum" +TYPING_NAMEDTUPLE_QUALIFIED: Final = { + "typing.NamedTuple", + "typing_extensions.NamedTuple", +} +TYPING_NAMEDTUPLE_BASENAMES: Final = { + "NamedTuple", + "typing.NamedTuple", + "typing_extensions.NamedTuple", +} + + +def _infer_first(node, context): + if isinstance(node, util.UninferableBase): + raise UseInferenceDefault + try: + value = next(node.infer(context=context)) + except StopIteration as exc: + raise InferenceError from exc + if isinstance(value, util.UninferableBase): + raise UseInferenceDefault() + return value + + +def _find_func_form_arguments(node, context): + def _extract_namedtuple_arg_or_keyword( # pylint: disable=inconsistent-return-statements + position, key_name=None + ): + if len(args) > position: + return _infer_first(args[position], context) + if key_name and key_name in found_keywords: + return _infer_first(found_keywords[key_name], context) + + args = node.args + keywords = node.keywords + found_keywords = ( + {keyword.arg: keyword.value for keyword in keywords} if keywords else {} + ) + + name = _extract_namedtuple_arg_or_keyword(position=0, key_name="typename") + names = _extract_namedtuple_arg_or_keyword(position=1, key_name="field_names") + if name and names: + return name.value, names + + raise UseInferenceDefault() + + +def infer_func_form( + node: nodes.Call, + base_type: list[nodes.NodeNG], + context: InferenceContext | None = None, + enum: bool = False, +) -> tuple[nodes.ClassDef, str, list[str]]: + """Specific inference function for namedtuple or Python 3 enum.""" + # node is a Call node, class name as first argument and generated class + # attributes as second argument + + # namedtuple or enums list of attributes can be a list of strings or a + # whitespace-separate string + try: + name, names = _find_func_form_arguments(node, context) + try: + attributes: list[str] = names.value.replace(",", " ").split() + except AttributeError as exc: + # Handle attributes of NamedTuples + if not enum: + attributes = [] + fields = _get_namedtuple_fields(node) + if fields: + fields_node = extract_node(fields) + attributes = [ + _infer_first(const, context).value for const in fields_node.elts + ] + + # Handle attributes of Enums + else: + # Enums supports either iterator of (name, value) pairs + # or mappings. + if hasattr(names, "items") and isinstance(names.items, list): + attributes = [ + _infer_first(const[0], context).value + for const in names.items + if isinstance(const[0], nodes.Const) + ] + elif hasattr(names, "elts"): + # Enums can support either ["a", "b", "c"] + # or [("a", 1), ("b", 2), ...], but they can't + # be mixed. + if all(isinstance(const, nodes.Tuple) for const in names.elts): + attributes = [ + _infer_first(const.elts[0], context).value + for const in names.elts + if isinstance(const, nodes.Tuple) + ] + else: + attributes = [ + _infer_first(const, context).value for const in names.elts + ] + else: + raise AttributeError from exc + if not attributes: + raise AttributeError from exc + except (AttributeError, InferenceError) as exc: + raise UseInferenceDefault from exc + + if not enum: + # namedtuple maps sys.intern(str()) over over field_names + attributes = [str(attr) for attr in attributes] + # XXX this should succeed *unless* __str__/__repr__ is incorrect or throws + # in which case we should not have inferred these values and raised earlier + attributes = [attr for attr in attributes if " " not in attr] + + # If we can't infer the name of the class, don't crash, up to this point + # we know it is a namedtuple anyway. + name = name or "Uninferable" + # we want to return a Class node instance with proper attributes set + class_node = nodes.ClassDef(name) + # A typical ClassDef automatically adds its name to the parent scope, + # but doing so causes problems, so defer setting parent until after init + # see: https://github.com/PyCQA/pylint/issues/5982 + class_node.parent = node.parent + class_node.postinit( + # set base class=tuple + bases=base_type, + body=[], + decorators=None, + ) + # XXX add __init__(*attributes) method + for attr in attributes: + fake_node = nodes.EmptyNode() + fake_node.parent = class_node + fake_node.attrname = attr + class_node.instance_attrs[attr] = [fake_node] + return class_node, name, attributes + + +def _has_namedtuple_base(node): + """Predicate for class inference tip. + + :type node: ClassDef + :rtype: bool + """ + return set(node.basenames) & TYPING_NAMEDTUPLE_BASENAMES + + +def _looks_like(node, name) -> bool: + func = node.func + if isinstance(func, nodes.Attribute): + return func.attrname == name + if isinstance(func, nodes.Name): + return func.name == name + return False + + +_looks_like_namedtuple = functools.partial(_looks_like, name="namedtuple") +_looks_like_enum = functools.partial(_looks_like, name="Enum") +_looks_like_typing_namedtuple = functools.partial(_looks_like, name="NamedTuple") + + +def infer_named_tuple( + node: nodes.Call, context: InferenceContext | None = None +) -> Iterator[nodes.ClassDef]: + """Specific inference function for namedtuple Call node.""" + tuple_base_name: list[nodes.NodeNG] = [nodes.Name(name="tuple", parent=node.root())] + class_node, name, attributes = infer_func_form( + node, tuple_base_name, context=context + ) + call_site = arguments.CallSite.from_call(node, context=context) + node = extract_node("import collections; collections.namedtuple") + try: + func = next(node.infer()) + except StopIteration as e: + raise InferenceError(node=node) from e + try: + rename = next(call_site.infer_argument(func, "rename", context)).bool_value() + except (InferenceError, StopIteration): + rename = False + + try: + attributes = _check_namedtuple_attributes(name, attributes, rename) + except AstroidTypeError as exc: + raise UseInferenceDefault("TypeError: " + str(exc)) from exc + except AstroidValueError as exc: + raise UseInferenceDefault("ValueError: " + str(exc)) from exc + + replace_args = ", ".join(f"{arg}=None" for arg in attributes) + field_def = ( + " {name} = property(lambda self: self[{index:d}], " + "doc='Alias for field number {index:d}')" + ) + field_defs = "\n".join( + field_def.format(name=name, index=index) + for index, name in enumerate(attributes) + ) + fake = AstroidBuilder(AstroidManager()).string_build( + f""" +class {name}(tuple): + __slots__ = () + _fields = {attributes!r} + def _asdict(self): + return self.__dict__ + @classmethod + def _make(cls, iterable, new=tuple.__new__, len=len): + return new(cls, iterable) + def _replace(self, {replace_args}): + return self + def __getnewargs__(self): + return tuple(self) +{field_defs} + """ + ) + class_node.locals["_asdict"] = fake.body[0].locals["_asdict"] + class_node.locals["_make"] = fake.body[0].locals["_make"] + class_node.locals["_replace"] = fake.body[0].locals["_replace"] + class_node.locals["_fields"] = fake.body[0].locals["_fields"] + for attr in attributes: + class_node.locals[attr] = fake.body[0].locals[attr] + # we use UseInferenceDefault, we can't be a generator so return an iterator + return iter([class_node]) + + +def _get_renamed_namedtuple_attributes(field_names): + names = list(field_names) + seen = set() + for i, name in enumerate(field_names): + if ( + not all(c.isalnum() or c == "_" for c in name) + or keyword.iskeyword(name) + or not name + or name[0].isdigit() + or name.startswith("_") + or name in seen + ): + names[i] = "_%d" % i + seen.add(name) + return tuple(names) + + +def _check_namedtuple_attributes(typename, attributes, rename=False): + attributes = tuple(attributes) + if rename: + attributes = _get_renamed_namedtuple_attributes(attributes) + + # The following snippet is derived from the CPython Lib/collections/__init__.py sources + # + for name in (typename,) + attributes: + if not isinstance(name, str): + raise AstroidTypeError("Type names and field names must be strings") + if not name.isidentifier(): + raise AstroidValueError( + "Type names and field names must be valid" + f"identifiers: {name!r}" + ) + if keyword.iskeyword(name): + raise AstroidValueError( + f"Type names and field names cannot be a keyword: {name!r}" + ) + + seen = set() + for name in attributes: + if name.startswith("_") and not rename: + raise AstroidValueError( + f"Field names cannot start with an underscore: {name!r}" + ) + if name in seen: + raise AstroidValueError(f"Encountered duplicate field name: {name!r}") + seen.add(name) + # + + return attributes + + +def infer_enum( + node: nodes.Call, context: InferenceContext | None = None +) -> Iterator[bases.Instance]: + """Specific inference function for enum Call node.""" + # Raise `UseInferenceDefault` if `node` is a call to a a user-defined Enum. + try: + inferred = node.func.infer(context) + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc + + if not any( + isinstance(item, nodes.ClassDef) and item.qname() == ENUM_QNAME + for item in inferred + ): + raise UseInferenceDefault + + enum_meta = _extract_single_node( + """ + class EnumMeta(object): + 'docstring' + def __call__(self, node): + class EnumAttribute(object): + name = '' + value = 0 + return EnumAttribute() + def __iter__(self): + class EnumAttribute(object): + name = '' + value = 0 + return [EnumAttribute()] + def __reversed__(self): + class EnumAttribute(object): + name = '' + value = 0 + return (EnumAttribute, ) + def __next__(self): + return next(iter(self)) + def __getitem__(self, attr): + class Value(object): + @property + def name(self): + return '' + @property + def value(self): + return attr + + return Value() + __members__ = [''] + """ + ) + class_node = infer_func_form(node, [enum_meta], context=context, enum=True)[0] + return iter([class_node.instantiate_class()]) + + +INT_FLAG_ADDITION_METHODS = """ + def __or__(self, other): + return {name}(self.value | other.value) + def __and__(self, other): + return {name}(self.value & other.value) + def __xor__(self, other): + return {name}(self.value ^ other.value) + def __add__(self, other): + return {name}(self.value + other.value) + def __div__(self, other): + return {name}(self.value / other.value) + def __invert__(self): + return {name}(~self.value) + def __mul__(self, other): + return {name}(self.value * other.value) +""" + + +def infer_enum_class(node: nodes.ClassDef) -> nodes.ClassDef: + """Specific inference for enums.""" + for basename in (b for cls in node.mro() for b in cls.basenames): + if node.root().name == "enum": + # Skip if the class is directly from enum module. + break + dunder_members = {} + target_names = set() + for local, values in node.locals.items(): + if any(not isinstance(value, nodes.AssignName) for value in values): + continue + + stmt = values[0].statement(future=True) + if isinstance(stmt, nodes.Assign): + if isinstance(stmt.targets[0], nodes.Tuple): + targets = stmt.targets[0].itered() + else: + targets = stmt.targets + elif isinstance(stmt, nodes.AnnAssign): + targets = [stmt.target] + else: + continue + + inferred_return_value = None + if stmt.value is not None: + if isinstance(stmt.value, nodes.Const): + if isinstance(stmt.value.value, str): + inferred_return_value = repr(stmt.value.value) + else: + inferred_return_value = stmt.value.value + else: + inferred_return_value = stmt.value.as_string() + + new_targets = [] + for target in targets: + if isinstance(target, nodes.Starred): + continue + target_names.add(target.name) + # Replace all the assignments with our mocked class. + classdef = dedent( + """ + class {name}({types}): + @property + def value(self): + return {return_value} + @property + def name(self): + return "{name}" + """.format( + name=target.name, + types=", ".join(node.basenames), + return_value=inferred_return_value, + ) + ) + if "IntFlag" in basename: + # Alright, we need to add some additional methods. + # Unfortunately we still can't infer the resulting objects as + # Enum members, but once we'll be able to do that, the following + # should result in some nice symbolic execution + classdef += INT_FLAG_ADDITION_METHODS.format(name=target.name) + + fake = AstroidBuilder( + AstroidManager(), apply_transforms=False + ).string_build(classdef)[target.name] + fake.parent = target.parent + for method in node.mymethods(): + fake.locals[method.name] = [method] + new_targets.append(fake.instantiate_class()) + dunder_members[local] = fake + node.locals[local] = new_targets + + # The undocumented `_value2member_map_` member: + node.locals["_value2member_map_"] = [nodes.Dict(parent=node)] + + members = nodes.Dict(parent=node) + members.postinit( + [ + (nodes.Const(k, parent=members), nodes.Name(v.name, parent=members)) + for k, v in dunder_members.items() + ] + ) + node.locals["__members__"] = [members] + # The enum.Enum class itself defines two @DynamicClassAttribute data-descriptors + # "name" and "value" (which we override in the mocked class for each enum member + # above). When dealing with inference of an arbitrary instance of the enum + # class, e.g. in a method defined in the class body like: + # class SomeEnum(enum.Enum): + # def method(self): + # self.name # <- here + # In the absence of an enum member called "name" or "value", these attributes + # should resolve to the descriptor on that particular instance, i.e. enum member. + # For "value", we have no idea what that should be, but for "name", we at least + # know that it should be a string, so infer that as a guess. + if "name" not in target_names: + code = dedent( + """ + @property + def name(self): + return '' + """ + ) + name_dynamicclassattr = AstroidBuilder(AstroidManager()).string_build(code)[ + "name" + ] + node.locals["name"] = [name_dynamicclassattr] + break + return node + + +def infer_typing_namedtuple_class(class_node, context: InferenceContext | None = None): + """Infer a subclass of typing.NamedTuple.""" + # Check if it has the corresponding bases + annassigns_fields = [ + annassign.target.name + for annassign in class_node.body + if isinstance(annassign, nodes.AnnAssign) + ] + code = dedent( + """ + from collections import namedtuple + namedtuple({typename!r}, {fields!r}) + """ + ).format(typename=class_node.name, fields=",".join(annassigns_fields)) + node = extract_node(code) + try: + generated_class_node = next(infer_named_tuple(node, context)) + except StopIteration as e: + raise InferenceError(node=node, context=context) from e + for method in class_node.mymethods(): + generated_class_node.locals[method.name] = [method] + + for body_node in class_node.body: + if isinstance(body_node, nodes.Assign): + for target in body_node.targets: + attr = target.name + generated_class_node.locals[attr] = class_node.locals[attr] + elif isinstance(body_node, nodes.ClassDef): + generated_class_node.locals[body_node.name] = [body_node] + + return iter((generated_class_node,)) + + +def infer_typing_namedtuple_function(node, context: InferenceContext | None = None): + """ + Starting with python3.9, NamedTuple is a function of the typing module. + The class NamedTuple is build dynamically through a call to `type` during + initialization of the `_NamedTuple` variable. + """ + klass = extract_node( + """ + from typing import _NamedTuple + _NamedTuple + """ + ) + return klass.infer(context) + + +def infer_typing_namedtuple( + node: nodes.Call, context: InferenceContext | None = None +) -> Iterator[nodes.ClassDef]: + """Infer a typing.NamedTuple(...) call.""" + # This is essentially a namedtuple with different arguments + # so we extract the args and infer a named tuple. + try: + func = next(node.func.infer()) + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc + + if func.qname() not in TYPING_NAMEDTUPLE_QUALIFIED: + raise UseInferenceDefault + + if len(node.args) != 2: + raise UseInferenceDefault + + if not isinstance(node.args[1], (nodes.List, nodes.Tuple)): + raise UseInferenceDefault + + return infer_named_tuple(node, context) + + +def _get_namedtuple_fields(node: nodes.Call) -> str: + """Get and return fields of a NamedTuple in code-as-a-string. + + Because the fields are represented in their code form we can + extract a node from them later on. + """ + names = [] + container = None + try: + container = next(node.args[1].infer()) + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc + # We pass on IndexError as we'll try to infer 'field_names' from the keywords + except IndexError: + pass + if not container: + for keyword_node in node.keywords: + if keyword_node.arg == "field_names": + try: + container = next(keyword_node.value.infer()) + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc + break + if not isinstance(container, nodes.BaseContainer): + raise UseInferenceDefault + for elt in container.elts: + if isinstance(elt, nodes.Const): + names.append(elt.as_string()) + continue + if not isinstance(elt, (nodes.List, nodes.Tuple)): + raise UseInferenceDefault + if len(elt.elts) != 2: + raise UseInferenceDefault + names.append(elt.elts[0].as_string()) + + if names: + field_names = f"({','.join(names)},)" + else: + field_names = "" + return field_names + + +def _is_enum_subclass(cls: astroid.ClassDef) -> bool: + """Return whether cls is a subclass of an Enum.""" + try: + return any( + klass.name in ENUM_BASE_NAMES + and getattr(klass.root(), "name", None) == "enum" + for klass in cls.mro() + ) + except MroError: + return False + + +AstroidManager().register_transform( + nodes.Call, inference_tip(infer_named_tuple), _looks_like_namedtuple +) +AstroidManager().register_transform( + nodes.Call, inference_tip(infer_enum), _looks_like_enum +) +AstroidManager().register_transform( + nodes.ClassDef, infer_enum_class, predicate=_is_enum_subclass +) +AstroidManager().register_transform( + nodes.ClassDef, inference_tip(infer_typing_namedtuple_class), _has_namedtuple_base +) +AstroidManager().register_transform( + nodes.FunctionDef, + inference_tip(infer_typing_namedtuple_function), + lambda node: node.name == "NamedTuple" + and getattr(node.root(), "name", None) == "typing", +) +AstroidManager().register_transform( + nodes.Call, inference_tip(infer_typing_namedtuple), _looks_like_typing_namedtuple +) diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_nose.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_nose.py new file mode 120000 index 00000000..6a28d34a --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_nose.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/0c/25/30/2b3475e127b9b45face7800cc05a11be1b071ff9dfe9a82b87deba5694 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_einsumfunc.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_einsumfunc.py new file mode 120000 index 00000000..20cbc20d --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_einsumfunc.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/0a/e6/6d/6586460e13f3578ea5d71c8d97fed17cc09a4386d8c99809f5ff0ac5c4 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_fromnumeric.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_fromnumeric.py new file mode 120000 index 00000000..950dd190 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_fromnumeric.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/dd/41/51/b4ae54e7501540dc5ac1ff4496116fdad8b3863e517f20929cf4f7bb9e \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_function_base.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_function_base.py new file mode 120000 index 00000000..3d546a11 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_function_base.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/fe/4f/96/450ff1d1010786fafd230b932e7a46a0260e54ed06007ededc3ca81cd4 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_multiarray.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_multiarray.py new file mode 120000 index 00000000..f157b8a8 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_multiarray.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/34/8c/67/be7a3e9a1a7e3fa20a7f245a28e16d887c7c1fd7047218e0c7af6886dd \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_numeric.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_numeric.py new file mode 120000 index 00000000..6cccf0f6 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_numeric.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/54/07/39/d5477c403ba3b21dbd7be4502b948170a5bf8f38d92059a7b42b2508a5 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_numerictypes.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_numerictypes.py new file mode 120000 index 00000000..c88bca1f --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_numerictypes.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/1d/52/7f/a5a4308e1d95f2acf426e7a2e9bd99466fdd9832687620ca7c0704fa61 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_umath.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_umath.py new file mode 120000 index 00000000..b7bd98f5 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_core_umath.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/d8/48/57/9ad8b0f3041c754b5b9e52cb4e31c0387a50d5cf415c775cea41c919b0 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_ma.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_ma.py new file mode 120000 index 00000000..06f8b337 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_ma.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/d5/71/ef/647d42dc21174e2447dc1271a458b3b60a8160419df490c5aae1ac50c9 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_ndarray.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_ndarray.py new file mode 120000 index 00000000..a178f9d9 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_ndarray.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/1e/88/5a/c266adce934c38902161b10f24665d09336660ed4ecfe20fc580dde663 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_random_mtrand.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_random_mtrand.py new file mode 120000 index 00000000..e6b8c872 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_random_mtrand.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/5a/ba/66/f525fc907d17b24f5bdeaa51d2b86cf8c11bd08e5a37813eebac242e43 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_utils.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_utils.py new file mode 120000 index 00000000..3004c436 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_numpy_utils.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/c2/04/91/52019d9fc228d00a137ba6af965df9a1c791ab64ba657a8dbe2963bc62 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_pathlib.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_pathlib.py new file mode 120000 index 00000000..55ddc609 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_pathlib.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/11/cf/17/ba8fb82081b6c07e3cef973c7365defc8d1fa8f6cfaa828224eb6d5651 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_pkg_resources.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_pkg_resources.py new file mode 120000 index 00000000..d509e629 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_pkg_resources.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/5b/74/38/1ba9984d8b4963d89642fdef10ef3f96998b1408a7f5a40bb4144bc407 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_pytest.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_pytest.py new file mode 120000 index 00000000..730108a5 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_pytest.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/b2/e4/c3/047089fe9e05ed31978f0549005b6200ff95964144da09dc5e32d140a3 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_qt.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_qt.py new file mode 120000 index 00000000..b23a0d96 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_qt.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/aa/f7/b1/5782056b860a2f4372a3aab19b3fc37c30cdc05570053246003b559222 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_random.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_random.py new file mode 120000 index 00000000..7b00c741 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_random.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/82/b5/c9/ad82f7ad9a739bc4a6b849d690bc1636a58ab5de589b06c1a15ea68cde \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_re.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_re.py new file mode 120000 index 00000000..09b3aab2 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_re.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/69/25/3e/1f2116b02adcd6c7a2168859c39e22bdc36d0befc0ca20a124e494fbb4 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_regex.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_regex.py new file mode 120000 index 00000000..6b7f5130 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_regex.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/53/35/b6/945d9cb5b743f015f87e40bb3c5b570dd18d51c741299c7bb0988ee19d \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_responses.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_responses.py new file mode 120000 index 00000000..c20c3bf7 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_responses.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/26/7e/e3/4bc2f6e93e619d4c0e7075f8ebd153915b37fd8cfc3a25513c0c77063a \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_scipy_signal.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_scipy_signal.py new file mode 120000 index 00000000..8c2f8c62 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_scipy_signal.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/32/2f/77/0fafa3f78b6a86a0c709b69b56cdff783021b62f3c08bd7facebe71bf2 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_signal.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_signal.py new file mode 120000 index 00000000..207536e5 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_signal.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/d7/ca/ce/0a02d598cd6bb5ce811583f1e2ace24ab7cfb7a0ab3fe0367c9c8c5816 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_six.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_six.py new file mode 120000 index 00000000..318ea6d1 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_six.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/31/64/26/f35b3d65bfe2d4d22a6373275ee6b096c5ea80ad410e3d6f04367e31d1 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_sqlalchemy.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_sqlalchemy.py new file mode 120000 index 00000000..b8c81fdd --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_sqlalchemy.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/a2/72/80/c60298f8660b7b6bfa3d52b700f067ff3f2dc6890465f0dc5eddf71ae1 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_ssl.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_ssl.py new file mode 120000 index 00000000..d9fff5ac --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_ssl.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/f0/c7/57/865f59bd855ee94fe0b524ed8279bf0e779dd8873d31b81f4a3e7a4475 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_subprocess.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_subprocess.py new file mode 120000 index 00000000..56908feb --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_subprocess.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/29/ac/ab/8b874cab0b576d94ce841d04d39a7672429cee12063edd63037cefdb10 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_threading.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_threading.py new file mode 120000 index 00000000..c758daa7 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_threading.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/ac/df/9d/43fe19a3401938e88f4228311773448260c2ec363eaf4ba32cde96e767 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_type.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_type.py new file mode 120000 index 00000000..d0261860 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_type.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/55/4c/10/b1e84521286f2ab9bdf32c1ae7e806cfb78bc099c11c2a5076b7863863 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_typing.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_typing.py new file mode 100644 index 00000000..e0a9dfd1 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_typing.py @@ -0,0 +1,438 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""Astroid hooks for typing.py support.""" + +from __future__ import annotations + +import sys +import typing +from collections.abc import Iterator +from functools import partial + +from astroid import context, extract_node, inference_tip +from astroid.builder import _extract_single_node +from astroid.const import PY38_PLUS, PY39_PLUS +from astroid.exceptions import ( + AttributeInferenceError, + InferenceError, + UseInferenceDefault, +) +from astroid.manager import AstroidManager +from astroid.nodes.node_classes import ( + Assign, + AssignName, + Attribute, + Call, + Const, + JoinedStr, + Name, + NodeNG, + Subscript, + Tuple, +) +from astroid.nodes.scoped_nodes import ClassDef, FunctionDef + +if sys.version_info >= (3, 8): + from typing import Final +else: + from typing_extensions import Final + +TYPING_TYPEVARS = {"TypeVar", "NewType"} +TYPING_TYPEVARS_QUALIFIED: Final = { + "typing.TypeVar", + "typing.NewType", + "typing_extensions.TypeVar", +} +TYPING_TYPEDDICT_QUALIFIED: Final = {"typing.TypedDict", "typing_extensions.TypedDict"} +TYPING_TYPE_TEMPLATE = """ +class Meta(type): + def __getitem__(self, item): + return self + + @property + def __args__(self): + return () + +class {0}(metaclass=Meta): + pass +""" +TYPING_MEMBERS = set(getattr(typing, "__all__", [])) + +TYPING_ALIAS = frozenset( + ( + "typing.Hashable", + "typing.Awaitable", + "typing.Coroutine", + "typing.AsyncIterable", + "typing.AsyncIterator", + "typing.Iterable", + "typing.Iterator", + "typing.Reversible", + "typing.Sized", + "typing.Container", + "typing.Collection", + "typing.Callable", + "typing.AbstractSet", + "typing.MutableSet", + "typing.Mapping", + "typing.MutableMapping", + "typing.Sequence", + "typing.MutableSequence", + "typing.ByteString", + "typing.Tuple", + "typing.List", + "typing.Deque", + "typing.Set", + "typing.FrozenSet", + "typing.MappingView", + "typing.KeysView", + "typing.ItemsView", + "typing.ValuesView", + "typing.ContextManager", + "typing.AsyncContextManager", + "typing.Dict", + "typing.DefaultDict", + "typing.OrderedDict", + "typing.Counter", + "typing.ChainMap", + "typing.Generator", + "typing.AsyncGenerator", + "typing.Type", + "typing.Pattern", + "typing.Match", + ) +) + +CLASS_GETITEM_TEMPLATE = """ +@classmethod +def __class_getitem__(cls, item): + return cls +""" + + +def looks_like_typing_typevar_or_newtype(node) -> bool: + func = node.func + if isinstance(func, Attribute): + return func.attrname in TYPING_TYPEVARS + if isinstance(func, Name): + return func.name in TYPING_TYPEVARS + return False + + +def infer_typing_typevar_or_newtype(node, context_itton=None): + """Infer a typing.TypeVar(...) or typing.NewType(...) call.""" + try: + func = next(node.func.infer(context=context_itton)) + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc + + if func.qname() not in TYPING_TYPEVARS_QUALIFIED: + raise UseInferenceDefault + if not node.args: + raise UseInferenceDefault + # Cannot infer from a dynamic class name (f-string) + if isinstance(node.args[0], JoinedStr): + raise UseInferenceDefault + + typename = node.args[0].as_string().strip("'") + node = extract_node(TYPING_TYPE_TEMPLATE.format(typename)) + return node.infer(context=context_itton) + + +def _looks_like_typing_subscript(node) -> bool: + """Try to figure out if a Subscript node *might* be a typing-related subscript.""" + if isinstance(node, Name): + return node.name in TYPING_MEMBERS + if isinstance(node, Attribute): + return node.attrname in TYPING_MEMBERS + if isinstance(node, Subscript): + return _looks_like_typing_subscript(node.value) + return False + + +def infer_typing_attr( + node: Subscript, ctx: context.InferenceContext | None = None +) -> Iterator[ClassDef]: + """Infer a typing.X[...] subscript.""" + try: + value = next(node.value.infer()) # type: ignore[union-attr] # value shouldn't be None for Subscript. + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc + + if not value.qname().startswith("typing.") or value.qname() in TYPING_ALIAS: + # If typing subscript belongs to an alias handle it separately. + raise UseInferenceDefault + + if isinstance(value, ClassDef) and value.qname() in { + "typing.Generic", + "typing.Annotated", + "typing_extensions.Annotated", + }: + # typing.Generic and typing.Annotated (PY39) are subscriptable + # through __class_getitem__. Since astroid can't easily + # infer the native methods, replace them for an easy inference tip + func_to_add = _extract_single_node(CLASS_GETITEM_TEMPLATE) + value.locals["__class_getitem__"] = [func_to_add] + if ( + isinstance(node.parent, ClassDef) + and node in node.parent.bases + and getattr(node.parent, "__cache", None) + ): + # node.parent.slots is evaluated and cached before the inference tip + # is first applied. Remove the last result to allow a recalculation of slots + cache = node.parent.__cache # type: ignore[attr-defined] # Unrecognized getattr + if cache.get(node.parent.slots) is not None: + del cache[node.parent.slots] + return iter([value]) + + node = extract_node(TYPING_TYPE_TEMPLATE.format(value.qname().split(".")[-1])) + return node.infer(context=ctx) + + +def _looks_like_typedDict( # pylint: disable=invalid-name + node: FunctionDef | ClassDef, +) -> bool: + """Check if node is TypedDict FunctionDef.""" + return node.qname() in TYPING_TYPEDDICT_QUALIFIED + + +def infer_old_typedDict( # pylint: disable=invalid-name + node: ClassDef, ctx: context.InferenceContext | None = None +) -> Iterator[ClassDef]: + func_to_add = _extract_single_node("dict") + node.locals["__call__"] = [func_to_add] + return iter([node]) + + +def infer_typedDict( # pylint: disable=invalid-name + node: FunctionDef, ctx: context.InferenceContext | None = None +) -> Iterator[ClassDef]: + """Replace TypedDict FunctionDef with ClassDef.""" + class_def = ClassDef( + name="TypedDict", + lineno=node.lineno, + col_offset=node.col_offset, + parent=node.parent, + ) + class_def.postinit(bases=[extract_node("dict")], body=[], decorators=None) + func_to_add = _extract_single_node("dict") + class_def.locals["__call__"] = [func_to_add] + return iter([class_def]) + + +def _looks_like_typing_alias(node: Call) -> bool: + """ + Returns True if the node corresponds to a call to _alias function. + + For example : + + MutableSet = _alias(collections.abc.MutableSet, T) + + :param node: call node + """ + return ( + isinstance(node.func, Name) + and node.func.name == "_alias" + and ( + # _alias function works also for builtins object such as list and dict + isinstance(node.args[0], (Attribute, Name)) + ) + ) + + +def _forbid_class_getitem_access(node: ClassDef) -> None: + """Disable the access to __class_getitem__ method for the node in parameters.""" + + def full_raiser(origin_func, attr, *args, **kwargs): + """ + Raises an AttributeInferenceError in case of access to __class_getitem__ method. + Otherwise, just call origin_func. + """ + if attr == "__class_getitem__": + raise AttributeInferenceError("__class_getitem__ access is not allowed") + return origin_func(attr, *args, **kwargs) + + try: + node.getattr("__class_getitem__") + # If we are here, then we are sure to modify an object that does have + # __class_getitem__ method (which origin is the protocol defined in + # collections module) whereas the typing module considers it should not. + # We do not want __class_getitem__ to be found in the classdef + partial_raiser = partial(full_raiser, node.getattr) + node.getattr = partial_raiser + except AttributeInferenceError: + pass + + +def infer_typing_alias( + node: Call, ctx: context.InferenceContext | None = None +) -> Iterator[ClassDef]: + """ + Infers the call to _alias function + Insert ClassDef, with same name as aliased class, + in mro to simulate _GenericAlias. + + :param node: call node + :param context: inference context + """ + if ( + not isinstance(node.parent, Assign) + or not len(node.parent.targets) == 1 + or not isinstance(node.parent.targets[0], AssignName) + ): + raise UseInferenceDefault + try: + res = next(node.args[0].infer(context=ctx)) + except StopIteration as e: + raise InferenceError(node=node.args[0], context=ctx) from e + + assign_name = node.parent.targets[0] + + class_def = ClassDef( + name=assign_name.name, + lineno=assign_name.lineno, + col_offset=assign_name.col_offset, + parent=node.parent, + ) + if isinstance(res, ClassDef): + # Only add `res` as base if it's a `ClassDef` + # This isn't the case for `typing.Pattern` and `typing.Match` + class_def.postinit(bases=[res], body=[], decorators=None) + + maybe_type_var = node.args[1] + if ( + not PY39_PLUS + and not (isinstance(maybe_type_var, Tuple) and not maybe_type_var.elts) + or PY39_PLUS + and isinstance(maybe_type_var, Const) + and maybe_type_var.value > 0 + ): + # If typing alias is subscriptable, add `__class_getitem__` to ClassDef + func_to_add = _extract_single_node(CLASS_GETITEM_TEMPLATE) + class_def.locals["__class_getitem__"] = [func_to_add] + else: + # If not, make sure that `__class_getitem__` access is forbidden. + # This is an issue in cases where the aliased class implements it, + # but the typing alias isn't subscriptable. E.g., `typing.ByteString` for PY39+ + _forbid_class_getitem_access(class_def) + return iter([class_def]) + + +def _looks_like_special_alias(node: Call) -> bool: + """Return True if call is for Tuple or Callable alias. + + In PY37 and PY38 the call is to '_VariadicGenericAlias' with 'tuple' as + first argument. In PY39+ it is replaced by a call to '_TupleType'. + + PY37: Tuple = _VariadicGenericAlias(tuple, (), inst=False, special=True) + PY39: Tuple = _TupleType(tuple, -1, inst=False, name='Tuple') + + PY37: Callable = _VariadicGenericAlias(collections.abc.Callable, (), special=True) + PY39: Callable = _CallableType(collections.abc.Callable, 2) + """ + return isinstance(node.func, Name) and ( + not PY39_PLUS + and node.func.name == "_VariadicGenericAlias" + and ( + isinstance(node.args[0], Name) + and node.args[0].name == "tuple" + or isinstance(node.args[0], Attribute) + and node.args[0].as_string() == "collections.abc.Callable" + ) + or PY39_PLUS + and ( + node.func.name == "_TupleType" + and isinstance(node.args[0], Name) + and node.args[0].name == "tuple" + or node.func.name == "_CallableType" + and isinstance(node.args[0], Attribute) + and node.args[0].as_string() == "collections.abc.Callable" + ) + ) + + +def infer_special_alias( + node: Call, ctx: context.InferenceContext | None = None +) -> Iterator[ClassDef]: + """Infer call to tuple alias as new subscriptable class typing.Tuple.""" + if not ( + isinstance(node.parent, Assign) + and len(node.parent.targets) == 1 + and isinstance(node.parent.targets[0], AssignName) + ): + raise UseInferenceDefault + try: + res = next(node.args[0].infer(context=ctx)) + except StopIteration as e: + raise InferenceError(node=node.args[0], context=ctx) from e + + assign_name = node.parent.targets[0] + class_def = ClassDef( + name=assign_name.name, + parent=node.parent, + ) + class_def.postinit(bases=[res], body=[], decorators=None) + func_to_add = _extract_single_node(CLASS_GETITEM_TEMPLATE) + class_def.locals["__class_getitem__"] = [func_to_add] + return iter([class_def]) + + +def _looks_like_typing_cast(node: Call) -> bool: + return isinstance(node, Call) and ( + isinstance(node.func, Name) + and node.func.name == "cast" + or isinstance(node.func, Attribute) + and node.func.attrname == "cast" + ) + + +def infer_typing_cast( + node: Call, ctx: context.InferenceContext | None = None +) -> Iterator[NodeNG]: + """Infer call to cast() returning same type as casted-from var.""" + if not isinstance(node.func, (Name, Attribute)): + raise UseInferenceDefault + + try: + func = next(node.func.infer(context=ctx)) + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc + if ( + not isinstance(func, FunctionDef) + or func.qname() != "typing.cast" + or len(node.args) != 2 + ): + raise UseInferenceDefault + + return node.args[1].infer(context=ctx) + + +AstroidManager().register_transform( + Call, + inference_tip(infer_typing_typevar_or_newtype), + looks_like_typing_typevar_or_newtype, +) +AstroidManager().register_transform( + Subscript, inference_tip(infer_typing_attr), _looks_like_typing_subscript +) +AstroidManager().register_transform( + Call, inference_tip(infer_typing_cast), _looks_like_typing_cast +) + +if PY39_PLUS: + AstroidManager().register_transform( + FunctionDef, inference_tip(infer_typedDict), _looks_like_typedDict + ) +elif PY38_PLUS: + AstroidManager().register_transform( + ClassDef, inference_tip(infer_old_typedDict), _looks_like_typedDict + ) + +AstroidManager().register_transform( + Call, inference_tip(infer_typing_alias), _looks_like_typing_alias +) +AstroidManager().register_transform( + Call, inference_tip(infer_special_alias), _looks_like_special_alias +) diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_unittest.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_unittest.py new file mode 120000 index 00000000..bddfa19b --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_unittest.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/5f/fc/6a/23bd1bafb26022b5225303f81e6f664300b1f6305fbcd5b9874c26a7ed \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/brain_uuid.py b/venv/lib/python3.10/site-packages/astroid/brain/brain_uuid.py new file mode 120000 index 00000000..05b44b33 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/brain_uuid.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/b7/47/e3/fd078dcdb3e06b4dc64b460ff76b238c49b1374e2b96067876df362471 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/helpers.py b/venv/lib/python3.10/site-packages/astroid/brain/helpers.py new file mode 120000 index 00000000..6a5a7472 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/helpers.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/aa/d4/e1/5c6db39656859bc46297c3236dbeb2b913d4ab2f9e957cf842ef14297d \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/builder.py b/venv/lib/python3.10/site-packages/astroid/builder.py new file mode 100644 index 00000000..d115feb4 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/builder.py @@ -0,0 +1,494 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""The AstroidBuilder makes astroid from living object and / or from _ast. + +The builder is not thread safe and can't be used to parse different sources +at the same time. +""" + +from __future__ import annotations + +import ast +import os +import textwrap +import types +from collections.abc import Iterator, Sequence +from io import TextIOWrapper +from tokenize import detect_encoding +from typing import TYPE_CHECKING + +from astroid import bases, modutils, nodes, raw_building, rebuilder, util +from astroid._ast import ParserModule, get_parser_module +from astroid.exceptions import AstroidBuildingError, AstroidSyntaxError, InferenceError +from astroid.manager import AstroidManager + +if TYPE_CHECKING: + from astroid import objects +else: + objects = util.lazy_import("objects") + + +# The name of the transient function that is used to +# wrap expressions to be extracted when calling +# extract_node. +_TRANSIENT_FUNCTION = "__" + +# The comment used to select a statement to be extracted +# when calling extract_node. +_STATEMENT_SELECTOR = "#@" +MISPLACED_TYPE_ANNOTATION_ERROR = "misplaced type annotation" + + +def open_source_file(filename: str) -> tuple[TextIOWrapper, str, str]: + # pylint: disable=consider-using-with + with open(filename, "rb") as byte_stream: + encoding = detect_encoding(byte_stream.readline)[0] + stream = open(filename, newline=None, encoding=encoding) + data = stream.read() + return stream, encoding, data + + +def _can_assign_attr(node: nodes.ClassDef, attrname: str | None) -> bool: + try: + slots = node.slots() + except NotImplementedError: + pass + else: + if slots and attrname not in {slot.value for slot in slots}: + return False + return node.qname() != "builtins.object" + + +class AstroidBuilder(raw_building.InspectBuilder): + """Class for building an astroid tree from source code or from a live module. + + The param *manager* specifies the manager class which should be used. + If no manager is given, then the default one will be used. The + param *apply_transforms* determines if the transforms should be + applied after the tree was built from source or from a live object, + by default being True. + """ + + def __init__( + self, manager: AstroidManager | None = None, apply_transforms: bool = True + ) -> None: + super().__init__(manager) + self._apply_transforms = apply_transforms + + def module_build( + self, module: types.ModuleType, modname: str | None = None + ) -> nodes.Module: + """Build an astroid from a living module instance.""" + node = None + path = getattr(module, "__file__", None) + loader = getattr(module, "__loader__", None) + # Prefer the loader to get the source rather than assuming we have a + # filesystem to read the source file from ourselves. + if loader: + modname = modname or module.__name__ + source = loader.get_source(modname) + if source: + node = self.string_build(source, modname, path=path) + if node is None and path is not None: + path_, ext = os.path.splitext(modutils._path_from_filename(path)) + if ext in {".py", ".pyc", ".pyo"} and os.path.exists(path_ + ".py"): + node = self.file_build(path_ + ".py", modname) + if node is None: + # this is a built-in module + # get a partial representation by introspection + node = self.inspect_build(module, modname=modname, path=path) + if self._apply_transforms: + # We have to handle transformation by ourselves since the + # rebuilder isn't called for builtin nodes + node = self._manager.visit_transforms(node) + assert isinstance(node, nodes.Module) + return node + + def file_build(self, path: str, modname: str | None = None) -> nodes.Module: + """Build astroid from a source code file (i.e. from an ast). + + *path* is expected to be a python source file + """ + try: + stream, encoding, data = open_source_file(path) + except OSError as exc: + raise AstroidBuildingError( + "Unable to load file {path}:\n{error}", + modname=modname, + path=path, + error=exc, + ) from exc + except (SyntaxError, LookupError) as exc: + raise AstroidSyntaxError( + "Python 3 encoding specification error or unknown encoding:\n" + "{error}", + modname=modname, + path=path, + error=exc, + ) from exc + except UnicodeError as exc: # wrong encoding + # detect_encoding returns utf-8 if no encoding specified + raise AstroidBuildingError( + "Wrong or no encoding specified for {filename}.", filename=path + ) from exc + with stream: + # get module name if necessary + if modname is None: + try: + modname = ".".join(modutils.modpath_from_file(path)) + except ImportError: + modname = os.path.splitext(os.path.basename(path))[0] + # build astroid representation + module, builder = self._data_build(data, modname, path) + return self._post_build(module, builder, encoding) + + def string_build( + self, data: str, modname: str = "", path: str | None = None + ) -> nodes.Module: + """Build astroid from source code string.""" + module, builder = self._data_build(data, modname, path) + module.file_bytes = data.encode("utf-8") + return self._post_build(module, builder, "utf-8") + + def _post_build( + self, module: nodes.Module, builder: rebuilder.TreeRebuilder, encoding: str + ) -> nodes.Module: + """Handles encoding and delayed nodes after a module has been built.""" + module.file_encoding = encoding + self._manager.cache_module(module) + # post tree building steps after we stored the module in the cache: + for from_node in builder._import_from_nodes: + if from_node.modname == "__future__": + for symbol, _ in from_node.names: + module.future_imports.add(symbol) + self.add_from_names_to_locals(from_node) + # handle delayed assattr nodes + for delayed in builder._delayed_assattr: + self.delayed_assattr(delayed) + + # Visit the transforms + if self._apply_transforms: + module = self._manager.visit_transforms(module) + return module + + def _data_build( + self, data: str, modname: str, path: str | None + ) -> tuple[nodes.Module, rebuilder.TreeRebuilder]: + """Build tree node from data and add some informations.""" + try: + node, parser_module = _parse_string(data, type_comments=True) + except (TypeError, ValueError, SyntaxError) as exc: + raise AstroidSyntaxError( + "Parsing Python code failed:\n{error}", + source=data, + modname=modname, + path=path, + error=exc, + ) from exc + + if path is not None: + node_file = os.path.abspath(path) + else: + node_file = "" + if modname.endswith(".__init__"): + modname = modname[:-9] + package = True + else: + package = ( + path is not None + and os.path.splitext(os.path.basename(path))[0] == "__init__" + ) + builder = rebuilder.TreeRebuilder(self._manager, parser_module, data) + module = builder.visit_module(node, modname, node_file, package) + return module, builder + + def add_from_names_to_locals(self, node: nodes.ImportFrom) -> None: + """Store imported names to the locals. + + Resort the locals if coming from a delayed node + """ + + def _key_func(node: nodes.NodeNG) -> int: + return node.fromlineno or 0 + + def sort_locals(my_list: list[nodes.NodeNG]) -> None: + my_list.sort(key=_key_func) + + assert node.parent # It should always default to the module + for name, asname in node.names: + if name == "*": + try: + imported = node.do_import_module() + except AstroidBuildingError: + continue + for name in imported.public_names(): + node.parent.set_local(name, node) + sort_locals(node.parent.scope().locals[name]) # type: ignore[arg-type] + else: + node.parent.set_local(asname or name, node) + sort_locals(node.parent.scope().locals[asname or name]) # type: ignore[arg-type] + + def delayed_assattr(self, node: nodes.AssignAttr) -> None: + """Visit a AssAttr node. + + This adds name to locals and handle members definition. + """ + try: + frame = node.frame(future=True) + for inferred in node.expr.infer(): + if isinstance(inferred, util.UninferableBase): + continue + try: + # pylint: disable=unidiomatic-typecheck # We want a narrow check on the + # parent type, not all of its subclasses + if ( + type(inferred) == bases.Instance + or type(inferred) == objects.ExceptionInstance + ): + inferred = inferred._proxied + iattrs = inferred.instance_attrs + if not _can_assign_attr(inferred, node.attrname): + continue + elif isinstance(inferred, bases.Instance): + # Const, Tuple or other containers that inherit from + # `Instance` + continue + elif isinstance(inferred, (bases.Proxy, util.UninferableBase)): + continue + elif inferred.is_function: + iattrs = inferred.instance_attrs + else: + iattrs = inferred.locals + except AttributeError: + # XXX log error + continue + values = iattrs.setdefault(node.attrname, []) + if node in values: + continue + # get assign in __init__ first XXX useful ? + if ( + frame.name == "__init__" + and values + and values[0].frame(future=True).name != "__init__" + ): + values.insert(0, node) + else: + values.append(node) + except InferenceError: + pass + + +def build_namespace_package_module(name: str, path: Sequence[str]) -> nodes.Module: + # TODO: Typing: Remove the cast to list and just update typing to accept Sequence + return nodes.Module(name, path=list(path), package=True) + + +def parse( + code: str, + module_name: str = "", + path: str | None = None, + apply_transforms: bool = True, +) -> nodes.Module: + """Parses a source string in order to obtain an astroid AST from it. + + :param str code: The code for the module. + :param str module_name: The name for the module, if any + :param str path: The path for the module + :param bool apply_transforms: + Apply the transforms for the give code. Use it if you + don't want the default transforms to be applied. + """ + code = textwrap.dedent(code) + builder = AstroidBuilder( + manager=AstroidManager(), apply_transforms=apply_transforms + ) + return builder.string_build(code, modname=module_name, path=path) + + +def _extract_expressions(node: nodes.NodeNG) -> Iterator[nodes.NodeNG]: + """Find expressions in a call to _TRANSIENT_FUNCTION and extract them. + + The function walks the AST recursively to search for expressions that + are wrapped into a call to _TRANSIENT_FUNCTION. If it finds such an + expression, it completely removes the function call node from the tree, + replacing it by the wrapped expression inside the parent. + + :param node: An astroid node. + :type node: astroid.bases.NodeNG + :yields: The sequence of wrapped expressions on the modified tree + expression can be found. + """ + if ( + isinstance(node, nodes.Call) + and isinstance(node.func, nodes.Name) + and node.func.name == _TRANSIENT_FUNCTION + ): + real_expr = node.args[0] + assert node.parent + real_expr.parent = node.parent + # Search for node in all _astng_fields (the fields checked when + # get_children is called) of its parent. Some of those fields may + # be lists or tuples, in which case the elements need to be checked. + # When we find it, replace it by real_expr, so that the AST looks + # like no call to _TRANSIENT_FUNCTION ever took place. + for name in node.parent._astroid_fields: + child = getattr(node.parent, name) + if isinstance(child, list): + for idx, compound_child in enumerate(child): + if compound_child is node: + child[idx] = real_expr + elif child is node: + setattr(node.parent, name, real_expr) + yield real_expr + else: + for child in node.get_children(): + yield from _extract_expressions(child) + + +def _find_statement_by_line(node: nodes.NodeNG, line: int) -> nodes.NodeNG | None: + """Extracts the statement on a specific line from an AST. + + If the line number of node matches line, it will be returned; + otherwise its children are iterated and the function is called + recursively. + + :param node: An astroid node. + :type node: astroid.bases.NodeNG + :param line: The line number of the statement to extract. + :type line: int + :returns: The statement on the line, or None if no statement for the line + can be found. + :rtype: astroid.bases.NodeNG or None + """ + if isinstance(node, (nodes.ClassDef, nodes.FunctionDef, nodes.MatchCase)): + # This is an inaccuracy in the AST: the nodes that can be + # decorated do not carry explicit information on which line + # the actual definition (class/def), but .fromline seems to + # be close enough. + node_line = node.fromlineno + else: + node_line = node.lineno + + if node_line == line: + return node + + for child in node.get_children(): + result = _find_statement_by_line(child, line) + if result: + return result + + return None + + +def extract_node(code: str, module_name: str = "") -> nodes.NodeNG | list[nodes.NodeNG]: + """Parses some Python code as a module and extracts a designated AST node. + + Statements: + To extract one or more statement nodes, append #@ to the end of the line + + Examples: + >>> def x(): + >>> def y(): + >>> return 1 #@ + + The return statement will be extracted. + + >>> class X(object): + >>> def meth(self): #@ + >>> pass + + The function object 'meth' will be extracted. + + Expressions: + To extract arbitrary expressions, surround them with the fake + function call __(...). After parsing, the surrounded expression + will be returned and the whole AST (accessible via the returned + node's parent attribute) will look like the function call was + never there in the first place. + + Examples: + >>> a = __(1) + + The const node will be extracted. + + >>> def x(d=__(foo.bar)): pass + + The node containing the default argument will be extracted. + + >>> def foo(a, b): + >>> return 0 < __(len(a)) < b + + The node containing the function call 'len' will be extracted. + + If no statements or expressions are selected, the last toplevel + statement will be returned. + + If the selected statement is a discard statement, (i.e. an expression + turned into a statement), the wrapped expression is returned instead. + + For convenience, singleton lists are unpacked. + + :param str code: A piece of Python code that is parsed as + a module. Will be passed through textwrap.dedent first. + :param str module_name: The name of the module. + :returns: The designated node from the parse tree, or a list of nodes. + """ + + def _extract(node: nodes.NodeNG | None) -> nodes.NodeNG | None: + if isinstance(node, nodes.Expr): + return node.value + + return node + + requested_lines: list[int] = [] + for idx, line in enumerate(code.splitlines()): + if line.strip().endswith(_STATEMENT_SELECTOR): + requested_lines.append(idx + 1) + + tree = parse(code, module_name=module_name) + if not tree.body: + raise ValueError("Empty tree, cannot extract from it") + + extracted: list[nodes.NodeNG | None] = [] + if requested_lines: + extracted = [_find_statement_by_line(tree, line) for line in requested_lines] + + # Modifies the tree. + extracted.extend(_extract_expressions(tree)) + + if not extracted: + extracted.append(tree.body[-1]) + + extracted = [_extract(node) for node in extracted] + extracted_without_none = [node for node in extracted if node is not None] + if len(extracted_without_none) == 1: + return extracted_without_none[0] + return extracted_without_none + + +def _extract_single_node(code: str, module_name: str = "") -> nodes.NodeNG: + """Call extract_node while making sure that only one value is returned.""" + ret = extract_node(code, module_name) + if isinstance(ret, list): + return ret[0] + return ret + + +def _parse_string( + data: str, type_comments: bool = True +) -> tuple[ast.Module, ParserModule]: + parser_module = get_parser_module(type_comments=type_comments) + try: + parsed = parser_module.parse(data + "\n", type_comments=type_comments) + except SyntaxError as exc: + # If the type annotations are misplaced for some reason, we do not want + # to fail the entire parsing of the file, so we need to retry the parsing without + # type comment support. + if exc.args[0] != MISPLACED_TYPE_ANNOTATION_ERROR or not type_comments: + raise + + parser_module = get_parser_module(type_comments=False) + parsed = parser_module.parse(data + "\n", type_comments=False) + return parsed, parser_module diff --git a/venv/lib/python3.10/site-packages/astroid/const.py b/venv/lib/python3.10/site-packages/astroid/const.py new file mode 120000 index 00000000..a7fd290f --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/const.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/f8/2f/60/644540829f376298e71b893a04a0654e49f6d89dd4791e7d2333f30beb \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/constraint.py b/venv/lib/python3.10/site-packages/astroid/constraint.py new file mode 100644 index 00000000..b6dc35cb --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/constraint.py @@ -0,0 +1,137 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""Classes representing different types of constraints on inference values.""" +from __future__ import annotations + +import sys +from abc import ABC, abstractmethod +from collections.abc import Iterator +from typing import Union + +from astroid import bases, nodes, util +from astroid.typing import InferenceResult + +if sys.version_info >= (3, 11): + from typing import Self +else: + from typing_extensions import Self + +_NameNodes = Union[nodes.AssignAttr, nodes.Attribute, nodes.AssignName, nodes.Name] + + +class Constraint(ABC): + """Represents a single constraint on a variable.""" + + def __init__(self, node: nodes.NodeNG, negate: bool) -> None: + self.node = node + """The node that this constraint applies to.""" + self.negate = negate + """True if this constraint is negated. E.g., "is not" instead of "is".""" + + @classmethod + @abstractmethod + def match( + cls: type[Self], node: _NameNodes, expr: nodes.NodeNG, negate: bool = False + ) -> Self | None: + """Return a new constraint for node matched from expr, if expr matches + the constraint pattern. + + If negate is True, negate the constraint. + """ + + @abstractmethod + def satisfied_by(self, inferred: InferenceResult) -> bool: + """Return True if this constraint is satisfied by the given inferred value.""" + + +class NoneConstraint(Constraint): + """Represents an "is None" or "is not None" constraint.""" + + CONST_NONE: nodes.Const = nodes.Const(None) + + @classmethod + def match( + cls: type[Self], node: _NameNodes, expr: nodes.NodeNG, negate: bool = False + ) -> Self | None: + """Return a new constraint for node matched from expr, if expr matches + the constraint pattern. + + Negate the constraint based on the value of negate. + """ + if isinstance(expr, nodes.Compare) and len(expr.ops) == 1: + left = expr.left + op, right = expr.ops[0] + if op in {"is", "is not"} and ( + _matches(left, node) and _matches(right, cls.CONST_NONE) + ): + negate = (op == "is" and negate) or (op == "is not" and not negate) + return cls(node=node, negate=negate) + + return None + + def satisfied_by(self, inferred: InferenceResult) -> bool: + """Return True if this constraint is satisfied by the given inferred value.""" + # Assume true if uninferable + if isinstance(inferred, util.UninferableBase): + return True + + # Return the XOR of self.negate and matches(inferred, self.CONST_NONE) + return self.negate ^ _matches(inferred, self.CONST_NONE) + + +def get_constraints( + expr: _NameNodes, frame: nodes.LocalsDictNodeNG +) -> dict[nodes.If, set[Constraint]]: + """Returns the constraints for the given expression. + + The returned dictionary maps the node where the constraint was generated to the + corresponding constraint(s). + + Constraints are computed statically by analysing the code surrounding expr. + Currently this only supports constraints generated from if conditions. + """ + current_node: nodes.NodeNG | None = expr + constraints_mapping: dict[nodes.If, set[Constraint]] = {} + while current_node is not None and current_node is not frame: + parent = current_node.parent + if isinstance(parent, nodes.If): + branch, _ = parent.locate_child(current_node) + constraints: set[Constraint] | None = None + if branch == "body": + constraints = set(_match_constraint(expr, parent.test)) + elif branch == "orelse": + constraints = set(_match_constraint(expr, parent.test, invert=True)) + + if constraints: + constraints_mapping[parent] = constraints + current_node = parent + + return constraints_mapping + + +ALL_CONSTRAINT_CLASSES = frozenset((NoneConstraint,)) +"""All supported constraint types.""" + + +def _matches(node1: nodes.NodeNG | bases.Proxy, node2: nodes.NodeNG) -> bool: + """Returns True if the two nodes match.""" + if isinstance(node1, nodes.Name) and isinstance(node2, nodes.Name): + return node1.name == node2.name + if isinstance(node1, nodes.Attribute) and isinstance(node2, nodes.Attribute): + return node1.attrname == node2.attrname and _matches(node1.expr, node2.expr) + if isinstance(node1, nodes.Const) and isinstance(node2, nodes.Const): + return node1.value == node2.value + + return False + + +def _match_constraint( + node: _NameNodes, expr: nodes.NodeNG, invert: bool = False +) -> Iterator[Constraint]: + """Yields all constraint patterns for node that match.""" + for constraint_cls in ALL_CONSTRAINT_CLASSES: + constraint = constraint_cls.match(node, expr, invert) + if constraint: + yield constraint diff --git a/venv/lib/python3.10/site-packages/astroid/context.py b/venv/lib/python3.10/site-packages/astroid/context.py new file mode 120000 index 00000000..61777258 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/context.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/07/07/59/9dd18531e3fd95dc6df9ce0b3f6d4deb56460858f248d0804a21875a1c \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/decorators.py b/venv/lib/python3.10/site-packages/astroid/decorators.py new file mode 100644 index 00000000..6bba37b6 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/decorators.py @@ -0,0 +1,290 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""A few useful function/method decorators.""" + +from __future__ import annotations + +import functools +import inspect +import sys +import warnings +from collections.abc import Callable, Generator +from typing import TypeVar + +import wrapt + +from astroid import _cache, util +from astroid.context import InferenceContext +from astroid.exceptions import InferenceError + +if sys.version_info >= (3, 10): + from typing import ParamSpec +else: + from typing_extensions import ParamSpec + +_R = TypeVar("_R") +_P = ParamSpec("_P") + + +@wrapt.decorator +def cached(func, instance, args, kwargs): + """Simple decorator to cache result of method calls without args.""" + cache = getattr(instance, "__cache", None) + if cache is None: + instance.__cache = cache = {} + _cache.CACHE_MANAGER.add_dict_cache(cache) + try: + return cache[func] + except KeyError: + cache[func] = result = func(*args, **kwargs) + return result + + +# TODO: Remove when support for 3.7 is dropped +# TODO: astroid 3.0 -> move class behind sys.version_info < (3, 8) guard +class cachedproperty: + """Provides a cached property equivalent to the stacking of + @cached and @property, but more efficient. + + After first usage, the becomes part of the object's + __dict__. Doing: + + del obj. empties the cache. + + Idea taken from the pyramid_ framework and the mercurial_ project. + + .. _pyramid: http://pypi.python.org/pypi/pyramid + .. _mercurial: http://pypi.python.org/pypi/Mercurial + """ + + __slots__ = ("wrapped",) + + def __init__(self, wrapped): + if sys.version_info >= (3, 8): + warnings.warn( + "cachedproperty has been deprecated and will be removed in astroid 3.0 for Python 3.8+. " + "Use functools.cached_property instead.", + DeprecationWarning, + stacklevel=2, + ) + try: + wrapped.__name__ + except AttributeError as exc: + raise TypeError(f"{wrapped} must have a __name__ attribute") from exc + self.wrapped = wrapped + + @property + def __doc__(self): + doc = getattr(self.wrapped, "__doc__", None) + return "%s" % ( + "\n%s" % doc if doc else "" + ) + + def __get__(self, inst, objtype=None): + if inst is None: + return self + val = self.wrapped(inst) + setattr(inst, self.wrapped.__name__, val) + return val + + +def path_wrapper(func): + """Return the given infer function wrapped to handle the path. + + Used to stop inference if the node has already been looked + at for a given `InferenceContext` to prevent infinite recursion + """ + + @functools.wraps(func) + def wrapped( + node, context: InferenceContext | None = None, _func=func, **kwargs + ) -> Generator: + """Wrapper function handling context.""" + if context is None: + context = InferenceContext() + if context.push(node): + return + + yielded = set() + + for res in _func(node, context, **kwargs): + # unproxy only true instance, not const, tuple, dict... + if res.__class__.__name__ == "Instance": + ares = res._proxied + else: + ares = res + if ares not in yielded: + yield res + yielded.add(ares) + + return wrapped + + +@wrapt.decorator +def yes_if_nothing_inferred(func, instance, args, kwargs): + generator = func(*args, **kwargs) + + try: + yield next(generator) + except StopIteration: + # generator is empty + yield util.Uninferable + return + + yield from generator + + +@wrapt.decorator +def raise_if_nothing_inferred(func, instance, args, kwargs): + generator = func(*args, **kwargs) + try: + yield next(generator) + except StopIteration as error: + # generator is empty + if error.args: + # pylint: disable=not-a-mapping + raise InferenceError(**error.args[0]) from error + raise InferenceError( + "StopIteration raised without any error information." + ) from error + except RecursionError as error: + raise InferenceError( + f"RecursionError raised with limit {sys.getrecursionlimit()}." + ) from error + + yield from generator + + +# Expensive decorators only used to emit Deprecation warnings. +# If no other than the default DeprecationWarning are enabled, +# fall back to passthrough implementations. +if util.check_warnings_filter(): # noqa: C901 + + def deprecate_default_argument_values( + astroid_version: str = "3.0", **arguments: str + ) -> Callable[[Callable[_P, _R]], Callable[_P, _R]]: + """Decorator which emits a DeprecationWarning if any arguments specified + are None or not passed at all. + + Arguments should be a key-value mapping, with the key being the argument to check + and the value being a type annotation as string for the value of the argument. + + To improve performance, only used when DeprecationWarnings other than + the default one are enabled. + """ + # Helpful links + # Decorator for DeprecationWarning: https://stackoverflow.com/a/49802489 + # Typing of stacked decorators: https://stackoverflow.com/a/68290080 + + def deco(func: Callable[_P, _R]) -> Callable[_P, _R]: + """Decorator function.""" + + @functools.wraps(func) + def wrapper(*args: _P.args, **kwargs: _P.kwargs) -> _R: + """Emit DeprecationWarnings if conditions are met.""" + + keys = list(inspect.signature(func).parameters.keys()) + for arg, type_annotation in arguments.items(): + try: + index = keys.index(arg) + except ValueError: + raise ValueError( + f"Can't find argument '{arg}' for '{args[0].__class__.__qualname__}'" + ) from None + if ( + # Check kwargs + # - if found, check it's not None + (arg in kwargs and kwargs[arg] is None) + # Check args + # - make sure not in kwargs + # - len(args) needs to be long enough, if too short + # arg can't be in args either + # - args[index] should not be None + or arg not in kwargs + and ( + index == -1 + or len(args) <= index + or (len(args) > index and args[index] is None) + ) + ): + warnings.warn( + f"'{arg}' will be a required argument for " + f"'{args[0].__class__.__qualname__}.{func.__name__}'" + f" in astroid {astroid_version} " + f"('{arg}' should be of type: '{type_annotation}')", + DeprecationWarning, + stacklevel=2, + ) + return func(*args, **kwargs) + + return wrapper + + return deco + + def deprecate_arguments( + astroid_version: str = "3.0", **arguments: str + ) -> Callable[[Callable[_P, _R]], Callable[_P, _R]]: + """Decorator which emits a DeprecationWarning if any arguments specified + are passed. + + Arguments should be a key-value mapping, with the key being the argument to check + and the value being a string that explains what to do instead of passing the argument. + + To improve performance, only used when DeprecationWarnings other than + the default one are enabled. + """ + + def deco(func: Callable[_P, _R]) -> Callable[_P, _R]: + @functools.wraps(func) + def wrapper(*args: _P.args, **kwargs: _P.kwargs) -> _R: + keys = list(inspect.signature(func).parameters.keys()) + for arg, note in arguments.items(): + try: + index = keys.index(arg) + except ValueError: + raise ValueError( + f"Can't find argument '{arg}' for '{args[0].__class__.__qualname__}'" + ) from None + if arg in kwargs or len(args) > index: + warnings.warn( + f"The argument '{arg}' for " + f"'{args[0].__class__.__qualname__}.{func.__name__}' is deprecated " + f"and will be removed in astroid {astroid_version} ({note})", + DeprecationWarning, + stacklevel=2, + ) + return func(*args, **kwargs) + + return wrapper + + return deco + +else: + + def deprecate_default_argument_values( + astroid_version: str = "3.0", **arguments: str + ) -> Callable[[Callable[_P, _R]], Callable[_P, _R]]: + """Passthrough decorator to improve performance if DeprecationWarnings are + disabled. + """ + + def deco(func: Callable[_P, _R]) -> Callable[_P, _R]: + """Decorator function.""" + return func + + return deco + + def deprecate_arguments( + astroid_version: str = "3.0", **arguments: str + ) -> Callable[[Callable[_P, _R]], Callable[_P, _R]]: + """Passthrough decorator to improve performance if DeprecationWarnings are + disabled. + """ + + def deco(func: Callable[_P, _R]) -> Callable[_P, _R]: + """Decorator function.""" + return func + + return deco diff --git a/venv/lib/python3.10/site-packages/astroid/exceptions.py b/venv/lib/python3.10/site-packages/astroid/exceptions.py new file mode 120000 index 00000000..94a69445 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/exceptions.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/c1/c2/45/a3192e594b2540cb238c1b2f41a7654e5f8208b8a7e08e4c83d100e174 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/filter_statements.py b/venv/lib/python3.10/site-packages/astroid/filter_statements.py new file mode 120000 index 00000000..483fe48c --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/filter_statements.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/cd/de/79/bc66a5d56ea4d43651b19a1342876d4d90ad2ab99e6d45641027a8512e \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/helpers.py b/venv/lib/python3.10/site-packages/astroid/helpers.py new file mode 100644 index 00000000..24dba6d7 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/helpers.py @@ -0,0 +1,320 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""Various helper utilities.""" + +from __future__ import annotations + +from collections.abc import Generator + +from astroid import bases, manager, nodes, raw_building, util +from astroid.context import CallContext, InferenceContext +from astroid.exceptions import ( + AstroidTypeError, + AttributeInferenceError, + InferenceError, + MroError, + _NonDeducibleTypeHierarchy, +) +from astroid.nodes import scoped_nodes +from astroid.typing import InferenceResult, SuccessfulInferenceResult + + +def _build_proxy_class(cls_name: str, builtins: nodes.Module) -> nodes.ClassDef: + proxy = raw_building.build_class(cls_name) + proxy.parent = builtins + return proxy + + +def _function_type( + function: nodes.Lambda | bases.UnboundMethod, builtins: nodes.Module +) -> nodes.ClassDef: + if isinstance(function, scoped_nodes.Lambda): + if function.root().name == "builtins": + cls_name = "builtin_function_or_method" + else: + cls_name = "function" + elif isinstance(function, bases.BoundMethod): + cls_name = "method" + else: + cls_name = "function" + return _build_proxy_class(cls_name, builtins) + + +def _object_type( + node: SuccessfulInferenceResult, context: InferenceContext | None = None +) -> Generator[InferenceResult | None, None, None]: + astroid_manager = manager.AstroidManager() + builtins = astroid_manager.builtins_module + context = context or InferenceContext() + + for inferred in node.infer(context=context): + if isinstance(inferred, scoped_nodes.ClassDef): + if inferred.newstyle: + metaclass = inferred.metaclass(context=context) + if metaclass: + yield metaclass + continue + yield builtins.getattr("type")[0] + elif isinstance(inferred, (scoped_nodes.Lambda, bases.UnboundMethod)): + yield _function_type(inferred, builtins) + elif isinstance(inferred, scoped_nodes.Module): + yield _build_proxy_class("module", builtins) + elif isinstance(inferred, nodes.Unknown): + raise InferenceError + elif isinstance(inferred, util.UninferableBase): + yield inferred + elif isinstance(inferred, (bases.Proxy, nodes.Slice)): + yield inferred._proxied + else: # pragma: no cover + raise AssertionError(f"We don't handle {type(inferred)} currently") + + +def object_type( + node: SuccessfulInferenceResult, context: InferenceContext | None = None +) -> InferenceResult | None: + """Obtain the type of the given node. + + This is used to implement the ``type`` builtin, which means that it's + used for inferring type calls, as well as used in a couple of other places + in the inference. + The node will be inferred first, so this function can support all + sorts of objects, as long as they support inference. + """ + + try: + types = set(_object_type(node, context)) + except InferenceError: + return util.Uninferable + if len(types) > 1 or not types: + return util.Uninferable + return list(types)[0] + + +def _object_type_is_subclass( + obj_type, class_or_seq, context: InferenceContext | None = None +): + if not isinstance(class_or_seq, (tuple, list)): + class_seq = (class_or_seq,) + else: + class_seq = class_or_seq + + if isinstance(obj_type, util.UninferableBase): + return util.Uninferable + + # Instances are not types + class_seq = [ + item if not isinstance(item, bases.Instance) else util.Uninferable + for item in class_seq + ] + # strict compatibility with issubclass + # issubclass(type, (object, 1)) evaluates to true + # issubclass(object, (1, type)) raises TypeError + for klass in class_seq: + if isinstance(klass, util.UninferableBase): + raise AstroidTypeError("arg 2 must be a type or tuple of types") + + for obj_subclass in obj_type.mro(): + if obj_subclass == klass: + return True + return False + + +def object_isinstance(node, class_or_seq, context: InferenceContext | None = None): + """Check if a node 'isinstance' any node in class_or_seq. + + :param node: A given node + :param class_or_seq: Union[nodes.NodeNG, Sequence[nodes.NodeNG]] + :rtype: bool + + :raises AstroidTypeError: if the given ``classes_or_seq`` are not types + """ + obj_type = object_type(node, context) + if isinstance(obj_type, util.UninferableBase): + return util.Uninferable + return _object_type_is_subclass(obj_type, class_or_seq, context=context) + + +def object_issubclass(node, class_or_seq, context: InferenceContext | None = None): + """Check if a type is a subclass of any node in class_or_seq. + + :param node: A given node + :param class_or_seq: Union[Nodes.NodeNG, Sequence[nodes.NodeNG]] + :rtype: bool + + :raises AstroidTypeError: if the given ``classes_or_seq`` are not types + :raises AstroidError: if the type of the given node cannot be inferred + or its type's mro doesn't work + """ + if not isinstance(node, nodes.ClassDef): + raise TypeError(f"{node} needs to be a ClassDef node") + return _object_type_is_subclass(node, class_or_seq, context=context) + + +def safe_infer( + node: nodes.NodeNG | bases.Proxy, context: InferenceContext | None = None +) -> InferenceResult | None: + """Return the inferred value for the given node. + + Return None if inference failed or if there is some ambiguity (more than + one node has been inferred). + """ + try: + inferit = node.infer(context=context) + value = next(inferit) + except (InferenceError, StopIteration): + return None + try: + next(inferit) + return None # None if there is ambiguity on the inferred node + except InferenceError: + return None # there is some kind of ambiguity + except StopIteration: + return value + + +def has_known_bases(klass, context: InferenceContext | None = None) -> bool: + """Return whether all base classes of a class could be inferred.""" + try: + return klass._all_bases_known + except AttributeError: + pass + for base in klass.bases: + result = safe_infer(base, context=context) + # TODO: check for A->B->A->B pattern in class structure too? + if ( + not isinstance(result, scoped_nodes.ClassDef) + or result is klass + or not has_known_bases(result, context=context) + ): + klass._all_bases_known = False + return False + klass._all_bases_known = True + return True + + +def _type_check(type1, type2) -> bool: + if not all(map(has_known_bases, (type1, type2))): + raise _NonDeducibleTypeHierarchy + + if not all([type1.newstyle, type2.newstyle]): + return False + try: + return type1 in type2.mro()[:-1] + except MroError as e: + # The MRO is invalid. + raise _NonDeducibleTypeHierarchy from e + + +def is_subtype(type1, type2) -> bool: + """Check if *type1* is a subtype of *type2*.""" + return _type_check(type1=type2, type2=type1) + + +def is_supertype(type1, type2) -> bool: + """Check if *type2* is a supertype of *type1*.""" + return _type_check(type1, type2) + + +def class_instance_as_index(node: SuccessfulInferenceResult) -> nodes.Const | None: + """Get the value as an index for the given instance. + + If an instance provides an __index__ method, then it can + be used in some scenarios where an integer is expected, + for instance when multiplying or subscripting a list. + """ + context = InferenceContext() + try: + for inferred in node.igetattr("__index__", context=context): + if not isinstance(inferred, bases.BoundMethod): + continue + + context.boundnode = node + context.callcontext = CallContext(args=[], callee=inferred) + for result in inferred.infer_call_result(node, context=context): + if isinstance(result, nodes.Const) and isinstance(result.value, int): + return result + except InferenceError: + pass + return None + + +def object_len(node, context: InferenceContext | None = None): + """Infer length of given node object. + + :param Union[nodes.ClassDef, nodes.Instance] node: + :param node: Node to infer length of + + :raises AstroidTypeError: If an invalid node is returned + from __len__ method or no __len__ method exists + :raises InferenceError: If the given node cannot be inferred + or if multiple nodes are inferred or if the code executed in python + would result in a infinite recursive check for length + :rtype int: Integer length of node + """ + # pylint: disable=import-outside-toplevel; circular import + from astroid.objects import FrozenSet + + inferred_node = safe_infer(node, context=context) + + # prevent self referential length calls from causing a recursion error + # see https://github.com/PyCQA/astroid/issues/777 + node_frame = node.frame(future=True) + if ( + isinstance(node_frame, scoped_nodes.FunctionDef) + and node_frame.name == "__len__" + and hasattr(inferred_node, "_proxied") + and inferred_node._proxied == node_frame.parent + ): + message = ( + "Self referential __len__ function will " + "cause a RecursionError on line {} of {}".format( + node.lineno, node.root().file + ) + ) + raise InferenceError(message) + + if inferred_node is None or isinstance(inferred_node, util.UninferableBase): + raise InferenceError(node=node) + if isinstance(inferred_node, nodes.Const) and isinstance( + inferred_node.value, (bytes, str) + ): + return len(inferred_node.value) + if isinstance(inferred_node, (nodes.List, nodes.Set, nodes.Tuple, FrozenSet)): + return len(inferred_node.elts) + if isinstance(inferred_node, nodes.Dict): + return len(inferred_node.items) + + node_type = object_type(inferred_node, context=context) + if not node_type: + raise InferenceError(node=node) + + try: + len_call = next(node_type.igetattr("__len__", context=context)) + except StopIteration as e: + raise AstroidTypeError(str(e)) from e + except AttributeInferenceError as e: + raise AstroidTypeError( + f"object of type '{node_type.pytype()}' has no len()" + ) from e + + inferred = len_call.infer_call_result(node, context) + if isinstance(inferred, util.UninferableBase): + raise InferenceError(node=node, context=context) + result_of_len = next(inferred, None) + if ( + isinstance(result_of_len, nodes.Const) + and result_of_len.pytype() == "builtins.int" + ): + return result_of_len.value + if ( + result_of_len is None + or isinstance(result_of_len, bases.Instance) + and result_of_len.is_subtype_of("builtins.int") + ): + # Fake a result as we don't know the arguments of the instance call. + return 0 + raise AstroidTypeError( + f"'{result_of_len}' object cannot be interpreted as an integer" + ) diff --git a/venv/lib/python3.10/site-packages/astroid/inference.py b/venv/lib/python3.10/site-packages/astroid/inference.py new file mode 100644 index 00000000..65d03d30 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/inference.py @@ -0,0 +1,1273 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""This module contains a set of functions to handle inference on astroid trees.""" + +from __future__ import annotations + +import ast +import functools +import itertools +import operator +import typing +from collections.abc import Callable, Generator, Iterable, Iterator +from typing import TYPE_CHECKING, Any, Optional, TypeVar, Union + +from astroid import bases, constraint, decorators, helpers, nodes, protocols, util +from astroid.const import PY310_PLUS +from astroid.context import ( + CallContext, + InferenceContext, + bind_context_to_node, + copy_context, +) +from astroid.exceptions import ( + AstroidBuildingError, + AstroidError, + AstroidIndexError, + AstroidTypeError, + AstroidValueError, + AttributeInferenceError, + InferenceError, + NameInferenceError, + _NonDeducibleTypeHierarchy, +) +from astroid.interpreter import dunder_lookup +from astroid.manager import AstroidManager +from astroid.typing import ( + InferenceErrorInfo, + InferenceResult, + SuccessfulInferenceResult, +) + +if TYPE_CHECKING: + from astroid.objects import Property + +# Prevents circular imports +objects = util.lazy_import("objects") + +_T = TypeVar("_T") +_BaseContainerT = TypeVar("_BaseContainerT", bound=nodes.BaseContainer) +_FunctionDefT = TypeVar("_FunctionDefT", bound=nodes.FunctionDef) + +GetFlowFactory = typing.Callable[ + [ + InferenceResult, + Optional[InferenceResult], + Union[nodes.AugAssign, nodes.BinOp], + InferenceResult, + Optional[InferenceResult], + InferenceContext, + InferenceContext, + ], + "list[functools.partial[Generator[InferenceResult, None, None]]]", +] + +# .infer method ############################################################### + + +def infer_end( + self: _T, context: InferenceContext | None = None, **kwargs: Any +) -> Iterator[_T]: + """Inference's end for nodes that yield themselves on inference. + + These are objects for which inference does not have any semantic, + such as Module or Consts. + """ + yield self + + +# We add ignores to all assignments to methods +# See https://github.com/python/mypy/issues/2427 +nodes.Module._infer = infer_end +nodes.ClassDef._infer = infer_end +nodes.Lambda._infer = infer_end # type: ignore[assignment] +nodes.Const._infer = infer_end # type: ignore[assignment] +nodes.Slice._infer = infer_end # type: ignore[assignment] + + +def _infer_sequence_helper( + node: _BaseContainerT, context: InferenceContext | None = None +) -> list[SuccessfulInferenceResult]: + """Infer all values based on _BaseContainer.elts.""" + values = [] + + for elt in node.elts: + if isinstance(elt, nodes.Starred): + starred = helpers.safe_infer(elt.value, context) + if not starred: + raise InferenceError(node=node, context=context) + if not hasattr(starred, "elts"): + raise InferenceError(node=node, context=context) + values.extend(_infer_sequence_helper(starred)) + elif isinstance(elt, nodes.NamedExpr): + value = helpers.safe_infer(elt.value, context) + if not value: + raise InferenceError(node=node, context=context) + values.append(value) + else: + values.append(elt) + return values + + +@decorators.raise_if_nothing_inferred +def infer_sequence( + self: _BaseContainerT, + context: InferenceContext | None = None, + **kwargs: Any, +) -> Iterator[_BaseContainerT]: + has_starred_named_expr = any( + isinstance(e, (nodes.Starred, nodes.NamedExpr)) for e in self.elts + ) + if has_starred_named_expr: + values = _infer_sequence_helper(self, context) + new_seq = type(self)( + lineno=self.lineno, col_offset=self.col_offset, parent=self.parent + ) + new_seq.postinit(values) + + yield new_seq + else: + yield self + + +nodes.List._infer = infer_sequence # type: ignore[assignment] +nodes.Tuple._infer = infer_sequence # type: ignore[assignment] +nodes.Set._infer = infer_sequence # type: ignore[assignment] + + +def infer_map( + self: nodes.Dict, context: InferenceContext | None = None +) -> Iterator[nodes.Dict]: + if not any(isinstance(k, nodes.DictUnpack) for k, _ in self.items): + yield self + else: + items = _infer_map(self, context) + new_seq = type(self)(self.lineno, self.col_offset, self.parent) + new_seq.postinit(list(items.items())) + yield new_seq + + +def _update_with_replacement( + lhs_dict: dict[SuccessfulInferenceResult, SuccessfulInferenceResult], + rhs_dict: dict[SuccessfulInferenceResult, SuccessfulInferenceResult], +) -> dict[SuccessfulInferenceResult, SuccessfulInferenceResult]: + """Delete nodes that equate to duplicate keys. + + Since an astroid node doesn't 'equal' another node with the same value, + this function uses the as_string method to make sure duplicate keys + don't get through + + Note that both the key and the value are astroid nodes + + Fixes issue with DictUnpack causing duplicate keys + in inferred Dict items + + :param lhs_dict: Dictionary to 'merge' nodes into + :param rhs_dict: Dictionary with nodes to pull from + :return : merged dictionary of nodes + """ + combined_dict = itertools.chain(lhs_dict.items(), rhs_dict.items()) + # Overwrite keys which have the same string values + string_map = {key.as_string(): (key, value) for key, value in combined_dict} + # Return to dictionary + return dict(string_map.values()) + + +def _infer_map( + node: nodes.Dict, context: InferenceContext | None +) -> dict[SuccessfulInferenceResult, SuccessfulInferenceResult]: + """Infer all values based on Dict.items.""" + values: dict[SuccessfulInferenceResult, SuccessfulInferenceResult] = {} + for name, value in node.items: + if isinstance(name, nodes.DictUnpack): + double_starred = helpers.safe_infer(value, context) + if not double_starred: + raise InferenceError + if not isinstance(double_starred, nodes.Dict): + raise InferenceError(node=node, context=context) + unpack_items = _infer_map(double_starred, context) + values = _update_with_replacement(values, unpack_items) + else: + key = helpers.safe_infer(name, context=context) + safe_value = helpers.safe_infer(value, context=context) + if any(not elem for elem in (key, safe_value)): + raise InferenceError(node=node, context=context) + # safe_value is SuccessfulInferenceResult as bool(Uninferable) == False + values = _update_with_replacement(values, {key: safe_value}) + return values + + +nodes.Dict._infer = infer_map # type: ignore[assignment] + + +def _higher_function_scope(node: nodes.NodeNG) -> nodes.FunctionDef | None: + """Search for the first function which encloses the given + scope. This can be used for looking up in that function's + scope, in case looking up in a lower scope for a particular + name fails. + + :param node: A scope node. + :returns: + ``None``, if no parent function scope was found, + otherwise an instance of :class:`astroid.nodes.scoped_nodes.Function`, + which encloses the given node. + """ + current = node + while current.parent and not isinstance(current.parent, nodes.FunctionDef): + current = current.parent + if current and current.parent: + return current.parent # type: ignore[no-any-return] + return None + + +def infer_name( + self: nodes.Name | nodes.AssignName, + context: InferenceContext | None = None, + **kwargs: Any, +) -> Generator[InferenceResult, None, None]: + """Infer a Name: use name lookup rules.""" + frame, stmts = self.lookup(self.name) + if not stmts: + # Try to see if the name is enclosed in a nested function + # and use the higher (first function) scope for searching. + parent_function = _higher_function_scope(self.scope()) + if parent_function: + _, stmts = parent_function.lookup(self.name) + + if not stmts: + raise NameInferenceError( + name=self.name, scope=self.scope(), context=context + ) + context = copy_context(context) + context.lookupname = self.name + context.constraints[self.name] = constraint.get_constraints(self, frame) + + return bases._infer_stmts(stmts, context, frame) + + +# pylint: disable=no-value-for-parameter +# The order of the decorators here is important +# See https://github.com/PyCQA/astroid/commit/0a8a75db30da060a24922e05048bc270230f5 +nodes.Name._infer = decorators.raise_if_nothing_inferred( + decorators.path_wrapper(infer_name) +) +nodes.AssignName.infer_lhs = infer_name # won't work with a path wrapper + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_call( + self: nodes.Call, context: InferenceContext | None = None, **kwargs: Any +) -> Generator[InferenceResult, None, InferenceErrorInfo]: + """Infer a Call node by trying to guess what the function returns.""" + callcontext = copy_context(context) + callcontext.boundnode = None + if context is not None: + callcontext.extra_context = _populate_context_lookup(self, context.clone()) + + for callee in self.func.infer(context): + if isinstance(callee, util.UninferableBase): + yield callee + continue + try: + if hasattr(callee, "infer_call_result"): + callcontext.callcontext = CallContext( + args=self.args, keywords=self.keywords, callee=callee + ) + yield from callee.infer_call_result(caller=self, context=callcontext) + except InferenceError: + continue + return InferenceErrorInfo(node=self, context=context) + + +nodes.Call._infer = infer_call # type: ignore[assignment] + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_import( + self: nodes.Import, + context: InferenceContext | None = None, + asname: bool = True, + **kwargs: Any, +) -> Generator[nodes.Module, None, None]: + """Infer an Import node: return the imported module/object.""" + context = context or InferenceContext() + name = context.lookupname + if name is None: + raise InferenceError(node=self, context=context) + + try: + if asname: + yield self.do_import_module(self.real_name(name)) + else: + yield self.do_import_module(name) + except AstroidBuildingError as exc: + raise InferenceError(node=self, context=context) from exc + + +nodes.Import._infer = infer_import + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_import_from( + self: nodes.ImportFrom, + context: InferenceContext | None = None, + asname: bool = True, + **kwargs: Any, +) -> Generator[InferenceResult, None, None]: + """Infer a ImportFrom node: return the imported module/object.""" + context = context or InferenceContext() + name = context.lookupname + if name is None: + raise InferenceError(node=self, context=context) + if asname: + try: + name = self.real_name(name) + except AttributeInferenceError as exc: + # See https://github.com/PyCQA/pylint/issues/4692 + raise InferenceError(node=self, context=context) from exc + try: + module = self.do_import_module() + except AstroidBuildingError as exc: + raise InferenceError(node=self, context=context) from exc + + try: + context = copy_context(context) + context.lookupname = name + stmts = module.getattr(name, ignore_locals=module is self.root()) + return bases._infer_stmts(stmts, context) + except AttributeInferenceError as error: + raise InferenceError( + str(error), target=self, attribute=name, context=context + ) from error + + +nodes.ImportFrom._infer = infer_import_from # type: ignore[assignment] + + +def infer_attribute( + self: nodes.Attribute | nodes.AssignAttr, + context: InferenceContext | None = None, + **kwargs: Any, +) -> Generator[InferenceResult, None, InferenceErrorInfo]: + """Infer an Attribute node by using getattr on the associated object.""" + for owner in self.expr.infer(context): + if isinstance(owner, util.UninferableBase): + yield owner + continue + + context = copy_context(context) + old_boundnode = context.boundnode + try: + context.boundnode = owner + if isinstance(owner, (nodes.ClassDef, bases.Instance)): + frame = owner if isinstance(owner, nodes.ClassDef) else owner._proxied + context.constraints[self.attrname] = constraint.get_constraints( + self, frame=frame + ) + yield from owner.igetattr(self.attrname, context) + except ( + AttributeInferenceError, + InferenceError, + AttributeError, + ): + pass + finally: + context.boundnode = old_boundnode + return InferenceErrorInfo(node=self, context=context) + + +# The order of the decorators here is important +# See https://github.com/PyCQA/astroid/commit/0a8a75db30da060a24922e05048bc270230f5 +nodes.Attribute._infer = decorators.raise_if_nothing_inferred( + decorators.path_wrapper(infer_attribute) +) +# won't work with a path wrapper +nodes.AssignAttr.infer_lhs = decorators.raise_if_nothing_inferred(infer_attribute) + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_global( + self: nodes.Global, context: InferenceContext | None = None, **kwargs: Any +) -> Generator[InferenceResult, None, None]: + if context is None or context.lookupname is None: + raise InferenceError(node=self, context=context) + try: + return bases._infer_stmts(self.root().getattr(context.lookupname), context) + except AttributeInferenceError as error: + raise InferenceError( + str(error), target=self, attribute=context.lookupname, context=context + ) from error + + +nodes.Global._infer = infer_global # type: ignore[assignment] + + +_SUBSCRIPT_SENTINEL = object() + + +def infer_subscript( + self: nodes.Subscript, context: InferenceContext | None = None, **kwargs: Any +) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: + """Inference for subscripts. + + We're understanding if the index is a Const + or a slice, passing the result of inference + to the value's `getitem` method, which should + handle each supported index type accordingly. + """ + + found_one = False + for value in self.value.infer(context): + if isinstance(value, util.UninferableBase): + yield util.Uninferable + return None + for index in self.slice.infer(context): + if isinstance(index, util.UninferableBase): + yield util.Uninferable + return None + + # Try to deduce the index value. + index_value = _SUBSCRIPT_SENTINEL + if value.__class__ == bases.Instance: + index_value = index + elif index.__class__ == bases.Instance: + instance_as_index = helpers.class_instance_as_index(index) + if instance_as_index: + index_value = instance_as_index + else: + index_value = index + + if index_value is _SUBSCRIPT_SENTINEL: + raise InferenceError(node=self, context=context) + + try: + assigned = value.getitem(index_value, context) + except ( + AstroidTypeError, + AstroidIndexError, + AstroidValueError, + AttributeInferenceError, + AttributeError, + ) as exc: + raise InferenceError(node=self, context=context) from exc + + # Prevent inferring if the inferred subscript + # is the same as the original subscripted object. + if self is assigned or isinstance(assigned, util.UninferableBase): + yield util.Uninferable + return None + yield from assigned.infer(context) + found_one = True + + if found_one: + return InferenceErrorInfo(node=self, context=context) + return None + + +# The order of the decorators here is important +# See https://github.com/PyCQA/astroid/commit/0a8a75db30da060a24922e05048bc270230f5 +nodes.Subscript._infer = decorators.raise_if_nothing_inferred( # type: ignore[assignment] + decorators.path_wrapper(infer_subscript) +) +nodes.Subscript.infer_lhs = decorators.raise_if_nothing_inferred(infer_subscript) + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def _infer_boolop( + self: nodes.BoolOp, context: InferenceContext | None = None, **kwargs: Any +) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: + """Infer a boolean operation (and / or / not). + + The function will calculate the boolean operation + for all pairs generated through inference for each component + node. + """ + values = self.values + if self.op == "or": + predicate = operator.truth + else: + predicate = operator.not_ + + try: + inferred_values = [value.infer(context=context) for value in values] + except InferenceError: + yield util.Uninferable + return None + + for pair in itertools.product(*inferred_values): + if any(isinstance(item, util.UninferableBase) for item in pair): + # Can't infer the final result, just yield Uninferable. + yield util.Uninferable + continue + + bool_values = [item.bool_value() for item in pair] + if any(isinstance(item, util.UninferableBase) for item in bool_values): + # Can't infer the final result, just yield Uninferable. + yield util.Uninferable + continue + + # Since the boolean operations are short circuited operations, + # this code yields the first value for which the predicate is True + # and if no value respected the predicate, then the last value will + # be returned (or Uninferable if there was no last value). + # This is conforming to the semantics of `and` and `or`: + # 1 and 0 -> 1 + # 0 and 1 -> 0 + # 1 or 0 -> 1 + # 0 or 1 -> 1 + value = util.Uninferable + for value, bool_value in zip(pair, bool_values): + if predicate(bool_value): + yield value + break + else: + yield value + + return InferenceErrorInfo(node=self, context=context) + + +nodes.BoolOp._infer = _infer_boolop + + +# UnaryOp, BinOp and AugAssign inferences + + +def _filter_operation_errors( + self: _T, + infer_callable: Callable[ + [_T, InferenceContext | None], + Generator[InferenceResult | util.BadOperationMessage, None, None], + ], + context: InferenceContext | None, + error: type[util.BadOperationMessage], +) -> Generator[InferenceResult, None, None]: + for result in infer_callable(self, context): + if isinstance(result, error): + # For the sake of .infer(), we don't care about operation + # errors, which is the job of pylint. So return something + # which shows that we can't infer the result. + yield util.Uninferable + else: + yield result + + +def _infer_unaryop( + self: nodes.UnaryOp, context: InferenceContext | None = None +) -> Generator[InferenceResult | util.BadUnaryOperationMessage, None, None]: + """Infer what an UnaryOp should return when evaluated.""" + for operand in self.operand.infer(context): + try: + yield operand.infer_unary_op(self.op) + except TypeError as exc: + # The operand doesn't support this operation. + yield util.BadUnaryOperationMessage(operand, self.op, exc) + except AttributeError as exc: + meth = protocols.UNARY_OP_METHOD[self.op] + if meth is None: + # `not node`. Determine node's boolean + # value and negate its result, unless it is + # Uninferable, which will be returned as is. + bool_value = operand.bool_value() + if not isinstance(bool_value, util.UninferableBase): + yield nodes.const_factory(not bool_value) + else: + yield util.Uninferable + else: + if not isinstance(operand, (bases.Instance, nodes.ClassDef)): + # The operation was used on something which + # doesn't support it. + yield util.BadUnaryOperationMessage(operand, self.op, exc) + continue + + try: + try: + methods = dunder_lookup.lookup(operand, meth) + except AttributeInferenceError: + yield util.BadUnaryOperationMessage(operand, self.op, exc) + continue + + meth = methods[0] + inferred = next(meth.infer(context=context), None) + if ( + isinstance(inferred, util.UninferableBase) + or not inferred.callable() + ): + continue + + context = copy_context(context) + context.boundnode = operand + context.callcontext = CallContext(args=[], callee=inferred) + + call_results = inferred.infer_call_result(self, context=context) + result = next(call_results, None) + if result is None: + # Failed to infer, return the same type. + yield operand + else: + yield result + except AttributeInferenceError as inner_exc: + # The unary operation special method was not found. + yield util.BadUnaryOperationMessage(operand, self.op, inner_exc) + except InferenceError: + yield util.Uninferable + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_unaryop( + self: nodes.UnaryOp, context: InferenceContext | None = None, **kwargs: Any +) -> Generator[InferenceResult, None, InferenceErrorInfo]: + """Infer what an UnaryOp should return when evaluated.""" + yield from _filter_operation_errors( + self, _infer_unaryop, context, util.BadUnaryOperationMessage + ) + return InferenceErrorInfo(node=self, context=context) + + +nodes.UnaryOp._infer_unaryop = _infer_unaryop +nodes.UnaryOp._infer = infer_unaryop + + +def _is_not_implemented(const) -> bool: + """Check if the given const node is NotImplemented.""" + return isinstance(const, nodes.Const) and const.value is NotImplemented + + +def _infer_old_style_string_formatting( + instance: nodes.Const, other: nodes.NodeNG, context: InferenceContext +) -> tuple[util.UninferableBase | nodes.Const]: + """Infer the result of '"string" % ...'. + + TODO: Instead of returning Uninferable we should rely + on the call to '%' to see if the result is actually uninferable. + """ + if isinstance(other, nodes.Tuple): + if util.Uninferable in other.elts: + return (util.Uninferable,) + inferred_positional = [helpers.safe_infer(i, context) for i in other.elts] + if all(isinstance(i, nodes.Const) for i in inferred_positional): + values = tuple(i.value for i in inferred_positional) + else: + values = None + elif isinstance(other, nodes.Dict): + values: dict[Any, Any] = {} + for pair in other.items: + key = helpers.safe_infer(pair[0], context) + if not isinstance(key, nodes.Const): + return (util.Uninferable,) + value = helpers.safe_infer(pair[1], context) + if not isinstance(value, nodes.Const): + return (util.Uninferable,) + values[key.value] = value.value + elif isinstance(other, nodes.Const): + values = other.value + else: + return (util.Uninferable,) + + try: + return (nodes.const_factory(instance.value % values),) + except (TypeError, KeyError, ValueError): + return (util.Uninferable,) + + +def _invoke_binop_inference( + instance: InferenceResult, + opnode: nodes.AugAssign | nodes.BinOp, + op: str, + other: InferenceResult, + context: InferenceContext, + method_name: str, +) -> Generator[InferenceResult, None, None]: + """Invoke binary operation inference on the given instance.""" + methods = dunder_lookup.lookup(instance, method_name) + context = bind_context_to_node(context, instance) + method = methods[0] + context.callcontext.callee = method + + if ( + isinstance(instance, nodes.Const) + and isinstance(instance.value, str) + and op == "%" + ): + return iter(_infer_old_style_string_formatting(instance, other, context)) + + try: + inferred = next(method.infer(context=context)) + except StopIteration as e: + raise InferenceError(node=method, context=context) from e + if isinstance(inferred, util.UninferableBase): + raise InferenceError + if not isinstance( + instance, (nodes.Const, nodes.Tuple, nodes.List, nodes.ClassDef, bases.Instance) + ): + raise InferenceError # pragma: no cover # Used as a failsafe + return instance.infer_binary_op(opnode, op, other, context, inferred) + + +def _aug_op( + instance: InferenceResult, + opnode: nodes.AugAssign, + op: str, + other: InferenceResult, + context: InferenceContext, + reverse: bool = False, +) -> functools.partial[Generator[InferenceResult, None, None]]: + """Get an inference callable for an augmented binary operation.""" + method_name = protocols.AUGMENTED_OP_METHOD[op] + return functools.partial( + _invoke_binop_inference, + instance=instance, + op=op, + opnode=opnode, + other=other, + context=context, + method_name=method_name, + ) + + +def _bin_op( + instance: InferenceResult, + opnode: nodes.AugAssign | nodes.BinOp, + op: str, + other: InferenceResult, + context: InferenceContext, + reverse: bool = False, +) -> functools.partial[Generator[InferenceResult, None, None]]: + """Get an inference callable for a normal binary operation. + + If *reverse* is True, then the reflected method will be used instead. + """ + if reverse: + method_name = protocols.REFLECTED_BIN_OP_METHOD[op] + else: + method_name = protocols.BIN_OP_METHOD[op] + return functools.partial( + _invoke_binop_inference, + instance=instance, + op=op, + opnode=opnode, + other=other, + context=context, + method_name=method_name, + ) + + +def _bin_op_or_union_type( + left: bases.UnionType | nodes.ClassDef | nodes.Const, + right: bases.UnionType | nodes.ClassDef | nodes.Const, +) -> Generator[InferenceResult, None, None]: + """Create a new UnionType instance for binary or, e.g. int | str.""" + yield bases.UnionType(left, right) + + +def _get_binop_contexts(context, left, right): + """Get contexts for binary operations. + + This will return two inference contexts, the first one + for x.__op__(y), the other one for y.__rop__(x), where + only the arguments are inversed. + """ + # The order is important, since the first one should be + # left.__op__(right). + for arg in (right, left): + new_context = context.clone() + new_context.callcontext = CallContext(args=[arg]) + new_context.boundnode = None + yield new_context + + +def _same_type(type1, type2) -> bool: + """Check if type1 is the same as type2.""" + return type1.qname() == type2.qname() + + +def _get_binop_flow( + left: InferenceResult, + left_type: InferenceResult | None, + binary_opnode: nodes.AugAssign | nodes.BinOp, + right: InferenceResult, + right_type: InferenceResult | None, + context: InferenceContext, + reverse_context: InferenceContext, +) -> list[functools.partial[Generator[InferenceResult, None, None]]]: + """Get the flow for binary operations. + + The rules are a bit messy: + + * if left and right have the same type, then only one + method will be called, left.__op__(right) + * if left and right are unrelated typewise, then first + left.__op__(right) is tried and if this does not exist + or returns NotImplemented, then right.__rop__(left) is tried. + * if left is a subtype of right, then only left.__op__(right) + is tried. + * if left is a supertype of right, then right.__rop__(left) + is first tried and then left.__op__(right) + """ + op = binary_opnode.op + if _same_type(left_type, right_type): + methods = [_bin_op(left, binary_opnode, op, right, context)] + elif helpers.is_subtype(left_type, right_type): + methods = [_bin_op(left, binary_opnode, op, right, context)] + elif helpers.is_supertype(left_type, right_type): + methods = [ + _bin_op(right, binary_opnode, op, left, reverse_context, reverse=True), + _bin_op(left, binary_opnode, op, right, context), + ] + else: + methods = [ + _bin_op(left, binary_opnode, op, right, context), + _bin_op(right, binary_opnode, op, left, reverse_context, reverse=True), + ] + + if ( + PY310_PLUS + and op == "|" + and ( + isinstance(left, (bases.UnionType, nodes.ClassDef)) + or isinstance(left, nodes.Const) + and left.value is None + ) + and ( + isinstance(right, (bases.UnionType, nodes.ClassDef)) + or isinstance(right, nodes.Const) + and right.value is None + ) + ): + methods.extend([functools.partial(_bin_op_or_union_type, left, right)]) + return methods + + +def _get_aug_flow( + left: InferenceResult, + left_type: InferenceResult | None, + aug_opnode: nodes.AugAssign, + right: InferenceResult, + right_type: InferenceResult | None, + context: InferenceContext, + reverse_context: InferenceContext, +) -> list[functools.partial[Generator[InferenceResult, None, None]]]: + """Get the flow for augmented binary operations. + + The rules are a bit messy: + + * if left and right have the same type, then left.__augop__(right) + is first tried and then left.__op__(right). + * if left and right are unrelated typewise, then + left.__augop__(right) is tried, then left.__op__(right) + is tried and then right.__rop__(left) is tried. + * if left is a subtype of right, then left.__augop__(right) + is tried and then left.__op__(right). + * if left is a supertype of right, then left.__augop__(right) + is tried, then right.__rop__(left) and then + left.__op__(right) + """ + bin_op = aug_opnode.op.strip("=") + aug_op = aug_opnode.op + if _same_type(left_type, right_type): + methods = [ + _aug_op(left, aug_opnode, aug_op, right, context), + _bin_op(left, aug_opnode, bin_op, right, context), + ] + elif helpers.is_subtype(left_type, right_type): + methods = [ + _aug_op(left, aug_opnode, aug_op, right, context), + _bin_op(left, aug_opnode, bin_op, right, context), + ] + elif helpers.is_supertype(left_type, right_type): + methods = [ + _aug_op(left, aug_opnode, aug_op, right, context), + _bin_op(right, aug_opnode, bin_op, left, reverse_context, reverse=True), + _bin_op(left, aug_opnode, bin_op, right, context), + ] + else: + methods = [ + _aug_op(left, aug_opnode, aug_op, right, context), + _bin_op(left, aug_opnode, bin_op, right, context), + _bin_op(right, aug_opnode, bin_op, left, reverse_context, reverse=True), + ] + return methods + + +def _infer_binary_operation( + left: InferenceResult, + right: InferenceResult, + binary_opnode: nodes.AugAssign | nodes.BinOp, + context: InferenceContext, + flow_factory: GetFlowFactory, +) -> Generator[InferenceResult | util.BadBinaryOperationMessage, None, None]: + """Infer a binary operation between a left operand and a right operand. + + This is used by both normal binary operations and augmented binary + operations, the only difference is the flow factory used. + """ + + context, reverse_context = _get_binop_contexts(context, left, right) + left_type = helpers.object_type(left) + right_type = helpers.object_type(right) + methods = flow_factory( + left, left_type, binary_opnode, right, right_type, context, reverse_context + ) + for method in methods: + try: + results = list(method()) + except AttributeError: + continue + except AttributeInferenceError: + continue + except InferenceError: + yield util.Uninferable + return + else: + if any(isinstance(result, util.UninferableBase) for result in results): + yield util.Uninferable + return + + if all(map(_is_not_implemented, results)): + continue + not_implemented = sum( + 1 for result in results if _is_not_implemented(result) + ) + if not_implemented and not_implemented != len(results): + # Can't infer yet what this is. + yield util.Uninferable + return + + yield from results + return + # The operation doesn't seem to be supported so let the caller know about it + yield util.BadBinaryOperationMessage(left_type, binary_opnode.op, right_type) + + +def _infer_binop( + self: nodes.BinOp, context: InferenceContext | None = None +) -> Generator[InferenceResult | util.BadBinaryOperationMessage, None, None]: + """Binary operation inference logic.""" + left = self.left + right = self.right + + # we use two separate contexts for evaluating lhs and rhs because + # 1. evaluating lhs may leave some undesired entries in context.path + # which may not let us infer right value of rhs + context = context or InferenceContext() + lhs_context = copy_context(context) + rhs_context = copy_context(context) + lhs_iter = left.infer(context=lhs_context) + rhs_iter = right.infer(context=rhs_context) + for lhs, rhs in itertools.product(lhs_iter, rhs_iter): + if any(isinstance(value, util.UninferableBase) for value in (rhs, lhs)): + # Don't know how to process this. + yield util.Uninferable + return + + try: + yield from _infer_binary_operation(lhs, rhs, self, context, _get_binop_flow) + except _NonDeducibleTypeHierarchy: + yield util.Uninferable + + +@decorators.yes_if_nothing_inferred +@decorators.path_wrapper +def infer_binop( + self: nodes.BinOp, context: InferenceContext | None = None, **kwargs: Any +) -> Generator[InferenceResult, None, None]: + return _filter_operation_errors( + self, _infer_binop, context, util.BadBinaryOperationMessage + ) + + +nodes.BinOp._infer_binop = _infer_binop +nodes.BinOp._infer = infer_binop + +COMPARE_OPS: dict[str, Callable[[Any, Any], bool]] = { + "==": operator.eq, + "!=": operator.ne, + "<": operator.lt, + "<=": operator.le, + ">": operator.gt, + ">=": operator.ge, + "in": lambda a, b: a in b, + "not in": lambda a, b: a not in b, +} +UNINFERABLE_OPS = { + "is", + "is not", +} + + +def _to_literal(node: nodes.NodeNG) -> Any: + # Can raise SyntaxError or ValueError from ast.literal_eval + # Can raise AttributeError from node.as_string() as not all nodes have a visitor + # Is this the stupidest idea or the simplest idea? + return ast.literal_eval(node.as_string()) + + +def _do_compare( + left_iter: Iterable[nodes.NodeNG], op: str, right_iter: Iterable[nodes.NodeNG] +) -> bool | util.UninferableBase: + """ + If all possible combinations are either True or False, return that: + >>> _do_compare([1, 2], '<=', [3, 4]) + True + >>> _do_compare([1, 2], '==', [3, 4]) + False + + If any item is uninferable, or if some combinations are True and some + are False, return Uninferable: + >>> _do_compare([1, 3], '<=', [2, 4]) + util.Uninferable + """ + retval: bool | None = None + if op in UNINFERABLE_OPS: + return util.Uninferable + op_func = COMPARE_OPS[op] + + for left, right in itertools.product(left_iter, right_iter): + if isinstance(left, util.UninferableBase) or isinstance( + right, util.UninferableBase + ): + return util.Uninferable + + try: + left, right = _to_literal(left), _to_literal(right) + except (SyntaxError, ValueError, AttributeError): + return util.Uninferable + + try: + expr = op_func(left, right) + except TypeError as exc: + raise AstroidTypeError from exc + + if retval is None: + retval = expr + elif retval != expr: + return util.Uninferable + # (or both, but "True | False" is basically the same) + + assert retval is not None + return retval # it was all the same value + + +def _infer_compare( + self: nodes.Compare, context: InferenceContext | None = None, **kwargs: Any +) -> Generator[nodes.Const | util.UninferableBase, None, None]: + """Chained comparison inference logic.""" + retval: bool | util.UninferableBase = True + + ops = self.ops + left_node = self.left + lhs = list(left_node.infer(context=context)) + # should we break early if first element is uninferable? + for op, right_node in ops: + # eagerly evaluate rhs so that values can be re-used as lhs + rhs = list(right_node.infer(context=context)) + try: + retval = _do_compare(lhs, op, rhs) + except AstroidTypeError: + retval = util.Uninferable + break + if retval is not True: + break # short-circuit + lhs = rhs # continue + if retval is util.Uninferable: + yield retval # type: ignore[misc] + else: + yield nodes.Const(retval) + + +nodes.Compare._infer = _infer_compare # type: ignore[assignment] + + +def _infer_augassign( + self: nodes.AugAssign, context: InferenceContext | None = None +) -> Generator[InferenceResult | util.BadBinaryOperationMessage, None, None]: + """Inference logic for augmented binary operations.""" + context = context or InferenceContext() + + rhs_context = context.clone() + + lhs_iter = self.target.infer_lhs(context=context) + rhs_iter = self.value.infer(context=rhs_context) + for lhs, rhs in itertools.product(lhs_iter, rhs_iter): + if any(isinstance(value, util.UninferableBase) for value in (rhs, lhs)): + # Don't know how to process this. + yield util.Uninferable + return + + try: + yield from _infer_binary_operation( + left=lhs, + right=rhs, + binary_opnode=self, + context=context, + flow_factory=_get_aug_flow, + ) + except _NonDeducibleTypeHierarchy: + yield util.Uninferable + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_augassign( + self: nodes.AugAssign, context: InferenceContext | None = None, **kwargs: Any +) -> Generator[InferenceResult, None, None]: + return _filter_operation_errors( + self, _infer_augassign, context, util.BadBinaryOperationMessage + ) + + +nodes.AugAssign._infer_augassign = _infer_augassign +nodes.AugAssign._infer = infer_augassign + +# End of binary operation inference. + + +@decorators.raise_if_nothing_inferred +def infer_arguments( + self: nodes.Arguments, context: InferenceContext | None = None, **kwargs: Any +) -> Generator[InferenceResult, None, None]: + if context is None or context.lookupname is None: + raise InferenceError(node=self, context=context) + return protocols._arguments_infer_argname(self, context.lookupname, context) + + +nodes.Arguments._infer = infer_arguments # type: ignore[assignment] + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_assign( + self: nodes.AssignName | nodes.AssignAttr, + context: InferenceContext | None = None, + **kwargs: Any, +) -> Generator[InferenceResult, None, None]: + """Infer a AssignName/AssignAttr: need to inspect the RHS part of the + assign node. + """ + if isinstance(self.parent, nodes.AugAssign): + return self.parent.infer(context) + + stmts = list(self.assigned_stmts(context=context)) + return bases._infer_stmts(stmts, context) + + +nodes.AssignName._infer = infer_assign +nodes.AssignAttr._infer = infer_assign + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_empty_node( + self: nodes.EmptyNode, context: InferenceContext | None = None, **kwargs: Any +) -> Generator[InferenceResult, None, None]: + if not self.has_underlying_object(): + yield util.Uninferable + else: + try: + yield from AstroidManager().infer_ast_from_something( + self.object, context=context + ) + except AstroidError: + yield util.Uninferable + + +nodes.EmptyNode._infer = infer_empty_node # type: ignore[assignment] + + +def _populate_context_lookup(call: nodes.Call, context: InferenceContext | None): + # Allows context to be saved for later + # for inference inside a function + context_lookup: dict[InferenceResult, InferenceContext] = {} + if context is None: + return context_lookup + for arg in call.args: + if isinstance(arg, nodes.Starred): + context_lookup[arg.value] = context + else: + context_lookup[arg] = context + keywords = call.keywords if call.keywords is not None else [] + for keyword in keywords: + context_lookup[keyword.value] = context + return context_lookup + + +@decorators.raise_if_nothing_inferred +def infer_ifexp( + self: nodes.IfExp, context: InferenceContext | None = None, **kwargs: Any +) -> Generator[InferenceResult, None, None]: + """Support IfExp inference. + + If we can't infer the truthiness of the condition, we default + to inferring both branches. Otherwise, we infer either branch + depending on the condition. + """ + both_branches = False + # We use two separate contexts for evaluating lhs and rhs because + # evaluating lhs may leave some undesired entries in context.path + # which may not let us infer right value of rhs. + + context = context or InferenceContext() + lhs_context = copy_context(context) + rhs_context = copy_context(context) + try: + test = next(self.test.infer(context=context.clone())) + except (InferenceError, StopIteration): + both_branches = True + else: + if not isinstance(test, util.UninferableBase): + if test.bool_value(): + yield from self.body.infer(context=lhs_context) + else: + yield from self.orelse.infer(context=rhs_context) + else: + both_branches = True + if both_branches: + yield from self.body.infer(context=lhs_context) + yield from self.orelse.infer(context=rhs_context) + + +nodes.IfExp._infer = infer_ifexp # type: ignore[assignment] + + +def infer_functiondef( + self: _FunctionDefT, context: InferenceContext | None = None, **kwargs: Any +) -> Generator[Property | _FunctionDefT, None, InferenceErrorInfo]: + if not self.decorators or not bases._is_property(self): + yield self + return InferenceErrorInfo(node=self, context=context) + + # When inferring a property, we instantiate a new `objects.Property` object, + # which in turn, because it inherits from `FunctionDef`, sets itself in the locals + # of the wrapping frame. This means that every time we infer a property, the locals + # are mutated with a new instance of the property. To avoid this, we detect this + # scenario and avoid passing the `parent` argument to the constructor. + parent_frame = self.parent.frame(future=True) + property_already_in_parent_locals = self.name in parent_frame.locals and any( + isinstance(val, objects.Property) for val in parent_frame.locals[self.name] + ) + # We also don't want to pass parent if the definition is within a Try node + if isinstance(self.parent, (nodes.TryExcept, nodes.TryFinally, nodes.If)): + property_already_in_parent_locals = True + + prop_func = objects.Property( + function=self, + name=self.name, + lineno=self.lineno, + parent=self.parent if not property_already_in_parent_locals else None, + col_offset=self.col_offset, + ) + if property_already_in_parent_locals: + prop_func.parent = self.parent + prop_func.postinit(body=[], args=self.args, doc_node=self.doc_node) + yield prop_func + return InferenceErrorInfo(node=self, context=context) + + +nodes.FunctionDef._infer = infer_functiondef diff --git a/venv/lib/python3.10/site-packages/astroid/inference_tip.py b/venv/lib/python3.10/site-packages/astroid/inference_tip.py new file mode 100644 index 00000000..9f315a53 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/inference_tip.py @@ -0,0 +1,85 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""Transform utilities (filters and decorator).""" + +from __future__ import annotations + +import typing +from collections.abc import Iterator + +import wrapt + +from astroid.exceptions import InferenceOverwriteError, UseInferenceDefault +from astroid.nodes import NodeNG +from astroid.typing import InferenceResult, InferFn + +_cache: dict[tuple[InferFn, NodeNG], list[InferenceResult] | None] = {} + + +def clear_inference_tip_cache() -> None: + """Clear the inference tips cache.""" + _cache.clear() + + +@wrapt.decorator +def _inference_tip_cached( + func: InferFn, instance: None, args: typing.Any, kwargs: typing.Any +) -> Iterator[InferenceResult]: + """Cache decorator used for inference tips.""" + node = args[0] + try: + result = _cache[func, node] + # If through recursion we end up trying to infer the same + # func + node we raise here. + if result is None: + raise UseInferenceDefault() + except KeyError: + _cache[func, node] = None + result = _cache[func, node] = list(func(*args, **kwargs)) + assert result + return iter(result) + + +def inference_tip(infer_function: InferFn, raise_on_overwrite: bool = False) -> InferFn: + """Given an instance specific inference function, return a function to be + given to AstroidManager().register_transform to set this inference function. + + :param bool raise_on_overwrite: Raise an `InferenceOverwriteError` + if the inference tip will overwrite another. Used for debugging + + Typical usage + + .. sourcecode:: python + + AstroidManager().register_transform(Call, inference_tip(infer_named_tuple), + predicate) + + .. Note:: + + Using an inference tip will override + any previously set inference tip for the given + node. Use a predicate in the transform to prevent + excess overwrites. + """ + + def transform(node: NodeNG, infer_function: InferFn = infer_function) -> NodeNG: + if ( + raise_on_overwrite + and node._explicit_inference is not None + and node._explicit_inference is not infer_function + ): + raise InferenceOverwriteError( + "Inference already set to {existing_inference}. " + "Trying to overwrite with {new_inference} for {node}".format( + existing_inference=infer_function, + new_inference=node._explicit_inference, + node=node, + ) + ) + # pylint: disable=no-value-for-parameter + node._explicit_inference = _inference_tip_cached(infer_function) + return node + + return transform diff --git a/venv/lib/python3.10/site-packages/astroid/interpreter/__init__.py b/venv/lib/python3.10/site-packages/astroid/interpreter/__init__.py new file mode 120000 index 00000000..05b4099d --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/interpreter/__init__.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/e3/b0/c4/4298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/interpreter/__pycache__/__init__.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/interpreter/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1231bd9a008621017ed1e798924cb3d8ca4cd28b GIT binary patch literal 182 zcmd1j<>g{#U|{Gua8_0I`Cs+NKsE|s1o9k!xR?bci27d35gqD#o~a(iLZc!%5TQm-R?@Y^v0eyZ{FYEdls!$;5v@e|LgZJ z|M=#=?Z5GT>M@63fYf(b5~uGZB%vAU6Z@upinp7&Q?Kt4C-Hb~M3Y)lf9Cb;%UvV! zv1=@M%_P9iU+&H&E7&y?`q1gLqTh()+!eWw(p<4jjMJEngk+Lyney#4A2T)MaT;Z8 z%JoDfsuu*ClT@*EI?MQ!3 z@t7xUp6ZDe(K|EFR3@|vR(C|f;wWdM6t<@V($P>9Ruz;_U^19!J^L&Svm!30vNsd4 z5IrHs;fFWYJ_OUcPgb+x2{zuKQ97S=Ld$Lgq0w zlFO%tcO7KFr8coFoJY<+dG3sz1G-B!edO+Yzd9oevS&U{Yl)k9FUUP-j~tL)SJyS& zcNcWw9?(6q>n%LBsvFOtC#k)lzmSCoK-D*50P6TL4j98XLFyeWKSTWcV3#b&iSch8 z;`~Sx2iM6)hnDqB#8IY77qGyV_HOk32vAU3$U{qcK-uq_h-i5~jK4a)x9 zjcaAin81C*QDuEQ$_lPz)7WU3B``wm(|*4Rp1OdgO)k)Y_%AQG9$6tCm6yRh1s`M3 z=(!70TUazIsmUV>azP%b2C9#0dsM!m8w+Pa_Aq0Xaz424>gE}40PZz??wGr>Ab=Aw zaO%*fe?F*s$F#yYMOn{u4>L$GBjiNjnhF0JW)#D-KC&mLTaL{mRSh58pE-+|$tV+} zlToGY^?90Q7(ZqfqM3NoV_(6LoTrLkXIo1Q^!+gfhyO+kgbRTkEo*xX0G}8cI1=qg6zEoig zSNeCeNU3{#RJI1O`CQ6Xu%Yr2Ok31c_^=?c_(1EKY4sk?)kQ3{afNs<19yc4zy*lP zt6-l(h8ZXZ$`%1)iL9U2K^sHI zeZ|Z7q4kWbl7aUz$Tp@=eB&Rr+}C?&;;P2pf>dK~LDhNqbnM>(h?PbR_K*9sO53Xr zy#=xImkNHCd)=L+)hw727^SzgMmD6ZoZABfAI)G{7KAb<|nGE@J-@v4s5P% mNYbcz#o$TB{999z6dAv5#;)yU&+`MHu8_9dZnZC6^#2DOl{-`b literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/interpreter/__pycache__/objectmodel.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/interpreter/__pycache__/objectmodel.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..245d3430f946c0cc6ce5ab0997d8382b643ce957 GIT binary patch literal 31392 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�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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/interpreter/_import/__init__.py b/venv/lib/python3.10/site-packages/astroid/interpreter/_import/__init__.py new file mode 120000 index 00000000..05b4099d --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/interpreter/_import/__init__.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/e3/b0/c4/4298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/interpreter/_import/__pycache__/__init__.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/interpreter/_import/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94e9b49fe546ef0d6285b3ce4d4c74ee068432ff GIT binary patch literal 190 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/interpreter/_import/__pycache__/util.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/interpreter/_import/__pycache__/util.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..158954119c49d095ff29ef33fcfe3626c2a1afb3 GIT binary patch literal 2033 zcmah~UvJb#5Z_&|eLkOaIp|Rcw2Jyt=^k%YEVU2*>a{)30Z=nF!q^nvk-Pa_gjhf?HO#2i-rHAjQL7V%hj^h(AfBd$5Miq|7E zt~>RLHzF%;I1Ney-LLuPbLubp3x4yMA5q8l*%s-vUZDXUS~k2SNtLIeP3H>Y8xNVdJ(nGP2B+Hv_vsQ@B4e{K_ZEDT zlXR$>g$ZzzBM4J9UWBoE#6Z%r$$esgeg-F0`p=C<^E2m~D@%_5J-d(AoE!Zzvql#` z9~fYN9nP+U{fi(yKl*VloqTjcrm}64(0!uXlM6-tgcimXGPVkRQd1un))C-{-acC1 zCxs?n7TVrL@lsv-f$UJ<@*Bq{&a9CmdPK!V&^wy`j^i_K2|b3ivNr?< zwZlsL);D+E+v{JtYwLHmN_*?>+S%xWG^2D-70?Uv`ay4)#z9ZyNfLh9D1X9 z$*4oc1=#(9I&F;2&5bqp{fLQ+AQT9VxB|q3Pg+3OAt#KrPp#8~<^MUebJ=OleCk3I zKo_LI5*G_VNlS?2wjoigymVCc@{FU2Rgz(_^78z!BGFk$%4Wyjh{ z^I7wB+L=fPfs}#o4pInm5+q7G%Ml>v{`Uc8{cN$bxSxuLVX}*$O*(tgvYEu(lMw>N@ zH7Pqa8GFk$`)}K@KxS#|jm^2mn9Xe30(p}+DW~jD>yoW;X1+DJLD``RnyS5T1XLmE z@F`e`u)stUcp-EaN(;I|4tECh1%YKNR*)vaA2V!%R MAuQF)Osz%#0eiq1(EtDd literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/interpreter/_import/spec.py b/venv/lib/python3.10/site-packages/astroid/interpreter/_import/spec.py new file mode 100644 index 00000000..f000468e --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/interpreter/_import/spec.py @@ -0,0 +1,472 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +from __future__ import annotations + +import abc +import enum +import importlib +import importlib.machinery +import importlib.util +import os +import pathlib +import sys +import types +import zipimport +from collections.abc import Iterator, Sequence +from pathlib import Path +from typing import Any, NamedTuple + +from astroid.const import PY310_PLUS +from astroid.modutils import EXT_LIB_DIRS + +from . import util + +if sys.version_info >= (3, 8): + from typing import Literal, Protocol +else: + from typing_extensions import Literal, Protocol + + +# The MetaPathFinder protocol comes from typeshed, which says: +# Intentionally omits one deprecated and one optional method of `importlib.abc.MetaPathFinder` +class _MetaPathFinder(Protocol): + def find_spec( + self, + fullname: str, + path: Sequence[str] | None, + target: types.ModuleType | None = ..., + ) -> importlib.machinery.ModuleSpec | None: + ... # pragma: no cover + + +class ModuleType(enum.Enum): + """Python module types used for ModuleSpec.""" + + C_BUILTIN = enum.auto() + C_EXTENSION = enum.auto() + PKG_DIRECTORY = enum.auto() + PY_CODERESOURCE = enum.auto() + PY_COMPILED = enum.auto() + PY_FROZEN = enum.auto() + PY_RESOURCE = enum.auto() + PY_SOURCE = enum.auto() + PY_ZIPMODULE = enum.auto() + PY_NAMESPACE = enum.auto() + + +_MetaPathFinderModuleTypes: dict[str, ModuleType] = { + # Finders created by setuptools editable installs + "_EditableFinder": ModuleType.PY_SOURCE, + "_EditableNamespaceFinder": ModuleType.PY_NAMESPACE, + # Finders create by six + "_SixMetaPathImporter": ModuleType.PY_SOURCE, +} + +_EditableFinderClasses: set[str] = { + "_EditableFinder", + "_EditableNamespaceFinder", +} + + +class ModuleSpec(NamedTuple): + """Defines a class similar to PEP 420's ModuleSpec. + + A module spec defines a name of a module, its type, location + and where submodules can be found, if the module is a package. + """ + + name: str + type: ModuleType | None + location: str | None = None + origin: str | None = None + submodule_search_locations: Sequence[str] | None = None + + +class Finder: + """A finder is a class which knows how to find a particular module.""" + + def __init__(self, path: Sequence[str] | None = None) -> None: + self._path = path or sys.path + + @abc.abstractmethod + def find_module( + self, + modname: str, + module_parts: Sequence[str], + processed: list[str], + submodule_path: Sequence[str] | None, + ) -> ModuleSpec | None: + """Find the given module. + + Each finder is responsible for each protocol of finding, as long as + they all return a ModuleSpec. + + :param modname: The module which needs to be searched. + :param module_parts: It should be a list of strings, + where each part contributes to the module's + namespace. + :param processed: What parts from the module parts were processed + so far. + :param submodule_path: A list of paths where the module + can be looked into. + :returns: A ModuleSpec, describing how and where the module was found, + None, otherwise. + """ + + def contribute_to_path( + self, spec: ModuleSpec, processed: list[str] + ) -> Sequence[str] | None: + """Get a list of extra paths where this finder can search.""" + + +class ImportlibFinder(Finder): + """A finder based on the importlib module.""" + + _SUFFIXES: Sequence[tuple[str, ModuleType]] = ( + [(s, ModuleType.C_EXTENSION) for s in importlib.machinery.EXTENSION_SUFFIXES] + + [(s, ModuleType.PY_SOURCE) for s in importlib.machinery.SOURCE_SUFFIXES] + + [(s, ModuleType.PY_COMPILED) for s in importlib.machinery.BYTECODE_SUFFIXES] + ) + + def find_module( + self, + modname: str, + module_parts: Sequence[str], + processed: list[str], + submodule_path: Sequence[str] | None, + ) -> ModuleSpec | None: + if submodule_path is not None: + submodule_path = list(submodule_path) + elif modname in sys.builtin_module_names: + return ModuleSpec( + name=modname, + location=None, + type=ModuleType.C_BUILTIN, + ) + else: + try: + spec = importlib.util.find_spec(modname) + if ( + spec + and spec.loader # type: ignore[comparison-overlap] # noqa: E501 + is importlib.machinery.FrozenImporter + ): + # No need for BuiltinImporter; builtins handled above + return ModuleSpec( + name=modname, + location=getattr(spec.loader_state, "filename", None), + type=ModuleType.PY_FROZEN, + ) + except ValueError: + pass + submodule_path = sys.path + + for entry in submodule_path: + package_directory = os.path.join(entry, modname) + for suffix in (".py", importlib.machinery.BYTECODE_SUFFIXES[0]): + package_file_name = "__init__" + suffix + file_path = os.path.join(package_directory, package_file_name) + if os.path.isfile(file_path): + return ModuleSpec( + name=modname, + location=package_directory, + type=ModuleType.PKG_DIRECTORY, + ) + for suffix, type_ in ImportlibFinder._SUFFIXES: + file_name = modname + suffix + file_path = os.path.join(entry, file_name) + if os.path.isfile(file_path): + return ModuleSpec(name=modname, location=file_path, type=type_) + return None + + def contribute_to_path( + self, spec: ModuleSpec, processed: list[str] + ) -> Sequence[str] | None: + if spec.location is None: + # Builtin. + return None + + if _is_setuptools_namespace(Path(spec.location)): + # extend_path is called, search sys.path for module/packages + # of this name see pkgutil.extend_path documentation + path = [ + os.path.join(p, *processed) + for p in sys.path + if os.path.isdir(os.path.join(p, *processed)) + ] + elif spec.name == "distutils" and not any( + spec.location.lower().startswith(ext_lib_dir.lower()) + for ext_lib_dir in EXT_LIB_DIRS + ): + # virtualenv below 20.0 patches distutils in an unexpected way + # so we just find the location of distutils that will be + # imported to avoid spurious import-error messages + # https://github.com/PyCQA/pylint/issues/5645 + # A regression test to create this scenario exists in release-tests.yml + # and can be triggered manually from GitHub Actions + distutils_spec = importlib.util.find_spec("distutils") + if distutils_spec and distutils_spec.origin: + origin_path = Path( + distutils_spec.origin + ) # e.g. .../distutils/__init__.py + path = [str(origin_path.parent)] # e.g. .../distutils + else: + path = [spec.location] + else: + path = [spec.location] + return path + + +class ExplicitNamespacePackageFinder(ImportlibFinder): + """A finder for the explicit namespace packages.""" + + def find_module( + self, + modname: str, + module_parts: Sequence[str], + processed: list[str], + submodule_path: Sequence[str] | None, + ) -> ModuleSpec | None: + if processed: + modname = ".".join(processed + [modname]) + if util.is_namespace(modname) and modname in sys.modules: + submodule_path = sys.modules[modname].__path__ + return ModuleSpec( + name=modname, + location="", + origin="namespace", + type=ModuleType.PY_NAMESPACE, + submodule_search_locations=submodule_path, + ) + return None + + def contribute_to_path( + self, spec: ModuleSpec, processed: list[str] + ) -> Sequence[str] | None: + return spec.submodule_search_locations + + +class ZipFinder(Finder): + """Finder that knows how to find a module inside zip files.""" + + def __init__(self, path: Sequence[str]) -> None: + super().__init__(path) + for entry_path in path: + if entry_path not in sys.path_importer_cache: + try: + sys.path_importer_cache[entry_path] = zipimport.zipimporter( # type: ignore[assignment] + entry_path + ) + except zipimport.ZipImportError: + continue + + def find_module( + self, + modname: str, + module_parts: Sequence[str], + processed: list[str], + submodule_path: Sequence[str] | None, + ) -> ModuleSpec | None: + try: + file_type, filename, path = _search_zip(module_parts) + except ImportError: + return None + + return ModuleSpec( + name=modname, + location=filename, + origin="egg", + type=file_type, + submodule_search_locations=path, + ) + + +class PathSpecFinder(Finder): + """Finder based on importlib.machinery.PathFinder.""" + + def find_module( + self, + modname: str, + module_parts: Sequence[str], + processed: list[str], + submodule_path: Sequence[str] | None, + ) -> ModuleSpec | None: + spec = importlib.machinery.PathFinder.find_spec(modname, path=submodule_path) + if spec is not None: + is_namespace_pkg = spec.origin is None + location = spec.origin if not is_namespace_pkg else None + module_type = ModuleType.PY_NAMESPACE if is_namespace_pkg else None + return ModuleSpec( + name=spec.name, + location=location, + origin=spec.origin, + type=module_type, + submodule_search_locations=list(spec.submodule_search_locations or []), + ) + return spec + + def contribute_to_path( + self, spec: ModuleSpec, processed: list[str] + ) -> Sequence[str] | None: + if spec.type == ModuleType.PY_NAMESPACE: + return spec.submodule_search_locations + return None + + +_SPEC_FINDERS = ( + ImportlibFinder, + ZipFinder, + PathSpecFinder, + ExplicitNamespacePackageFinder, +) + + +def _is_setuptools_namespace(location: pathlib.Path) -> bool: + try: + with open(location / "__init__.py", "rb") as stream: + data = stream.read(4096) + except OSError: + return False + extend_path = b"pkgutil" in data and b"extend_path" in data + declare_namespace = ( + b"pkg_resources" in data and b"declare_namespace(__name__)" in data + ) + return extend_path or declare_namespace + + +def _get_zipimporters() -> Iterator[tuple[str, zipimport.zipimporter]]: + for filepath, importer in sys.path_importer_cache.items(): + if isinstance(importer, zipimport.zipimporter): + yield filepath, importer + + +def _search_zip( + modpath: Sequence[str], +) -> tuple[Literal[ModuleType.PY_ZIPMODULE], str, str]: + for filepath, importer in _get_zipimporters(): + if PY310_PLUS: + found: Any = importer.find_spec(modpath[0]) + else: + found = importer.find_module(modpath[0]) + if found: + if PY310_PLUS: + if not importer.find_spec(os.path.sep.join(modpath)): + raise ImportError( + "No module named %s in %s/%s" + % (".".join(modpath[1:]), filepath, modpath) + ) + elif not importer.find_module(os.path.sep.join(modpath)): + raise ImportError( + "No module named %s in %s/%s" + % (".".join(modpath[1:]), filepath, modpath) + ) + return ( + ModuleType.PY_ZIPMODULE, + os.path.abspath(filepath) + os.path.sep + os.path.sep.join(modpath), + filepath, + ) + raise ImportError(f"No module named {'.'.join(modpath)}") + + +def _find_spec_with_path( + search_path: Sequence[str], + modname: str, + module_parts: list[str], + processed: list[str], + submodule_path: Sequence[str] | None, +) -> tuple[Finder | _MetaPathFinder, ModuleSpec]: + for finder in _SPEC_FINDERS: + finder_instance = finder(search_path) + spec = finder_instance.find_module( + modname, module_parts, processed, submodule_path + ) + if spec is None: + continue + return finder_instance, spec + + # Support for custom finders + for meta_finder in sys.meta_path: + # See if we support the customer import hook of the meta_finder + meta_finder_name = meta_finder.__class__.__name__ + if meta_finder_name not in _MetaPathFinderModuleTypes: + # Setuptools>62 creates its EditableFinders dynamically and have + # "type" as their __class__.__name__. We check __name__ as well + # to see if we can support the finder. + try: + meta_finder_name = meta_finder.__name__ + except AttributeError: + continue + if meta_finder_name not in _MetaPathFinderModuleTypes: + continue + + module_type = _MetaPathFinderModuleTypes[meta_finder_name] + + # Meta path finders are supposed to have a find_spec method since + # Python 3.4. However, some third-party finders do not implement it. + # PEP302 does not refer to find_spec as well. + # See: https://github.com/PyCQA/astroid/pull/1752/ + if not hasattr(meta_finder, "find_spec"): + continue + + spec = meta_finder.find_spec(modname, submodule_path) + if spec: + return ( + meta_finder, + ModuleSpec( + spec.name, + module_type, + spec.origin, + spec.origin, + spec.submodule_search_locations, + ), + ) + + raise ImportError(f"No module named {'.'.join(module_parts)}") + + +def find_spec(modpath: list[str], path: Sequence[str] | None = None) -> ModuleSpec: + """Find a spec for the given module. + + :type modpath: list or tuple + :param modpath: + split module's name (i.e name of a module or package split + on '.'), with leading empty strings for explicit relative import + + :type path: list or None + :param path: + optional list of path where the module or package should be + searched (use sys.path if nothing or None is given) + + :rtype: ModuleSpec + :return: A module spec, which describes how the module was + found and where. + """ + _path = path or sys.path + + # Need a copy for not mutating the argument. + modpath = modpath[:] + + submodule_path = None + module_parts = modpath[:] + processed: list[str] = [] + + while modpath: + modname = modpath.pop(0) + finder, spec = _find_spec_with_path( + _path, modname, module_parts, processed, submodule_path or path + ) + processed.append(modname) + if modpath: + if isinstance(finder, Finder): + submodule_path = finder.contribute_to_path(spec, processed) + # If modname is a package from an editable install, update submodule_path + # so that the next module in the path will be found inside of it using importlib. + elif finder.__name__ in _EditableFinderClasses: + submodule_path = spec.submodule_search_locations + + if spec.type == ModuleType.PKG_DIRECTORY: + spec = spec._replace(submodule_search_locations=submodule_path) + + return spec diff --git a/venv/lib/python3.10/site-packages/astroid/interpreter/_import/util.py b/venv/lib/python3.10/site-packages/astroid/interpreter/_import/util.py new file mode 120000 index 00000000..30185708 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/interpreter/_import/util.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/6f/98/20/2114ad87f239530bf7b38e233307f73a59c5016215fb9ef05f75caf723 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/interpreter/dunder_lookup.py b/venv/lib/python3.10/site-packages/astroid/interpreter/dunder_lookup.py new file mode 120000 index 00000000..b11abdc8 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/interpreter/dunder_lookup.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/ef/b6/0d/9a0a7a976b0f03b508694a6368febee31dba34ff7722284f479104bfe7 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/interpreter/objectmodel.py b/venv/lib/python3.10/site-packages/astroid/interpreter/objectmodel.py new file mode 100644 index 00000000..b7dac7f7 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/interpreter/objectmodel.py @@ -0,0 +1,940 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +""" +Data object model, as per https://docs.python.org/3/reference/datamodel.html. + +This module describes, at least partially, a data object model for some +of astroid's nodes. The model contains special attributes that nodes such +as functions, classes, modules etc have, such as __doc__, __class__, +__module__ etc, being used when doing attribute lookups over nodes. + +For instance, inferring `obj.__class__` will first trigger an inference +of the `obj` variable. If it was successfully inferred, then an attribute +`__class__ will be looked for in the inferred object. This is the part +where the data model occurs. The model is attached to those nodes +and the lookup mechanism will try to see if attributes such as +`__class__` are defined by the model or not. If they are defined, +the model will be requested to return the corresponding value of that +attribute. Thus the model can be viewed as a special part of the lookup +mechanism. +""" + +from __future__ import annotations + +import itertools +import os +import pprint +import sys +import types +from functools import lru_cache +from typing import TYPE_CHECKING, Any + +import astroid +from astroid import bases, nodes, util +from astroid.context import InferenceContext, copy_context +from astroid.exceptions import AttributeInferenceError, InferenceError, NoDefault +from astroid.manager import AstroidManager +from astroid.nodes import node_classes + +objects = util.lazy_import("objects") +builder = util.lazy_import("builder") + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from typing_extensions import Literal + +if TYPE_CHECKING: + from astroid import builder + from astroid.objects import Property + +IMPL_PREFIX = "attr_" +LEN_OF_IMPL_PREFIX = len(IMPL_PREFIX) + + +def _dunder_dict(instance, attributes): + obj = node_classes.Dict(parent=instance) + + # Convert the keys to node strings + keys = [ + node_classes.Const(value=value, parent=obj) for value in list(attributes.keys()) + ] + + # The original attribute has a list of elements for each key, + # but that is not useful for retrieving the special attribute's value. + # In this case, we're picking the last value from each list. + values = [elem[-1] for elem in attributes.values()] + + obj.postinit(list(zip(keys, values))) + return obj + + +def _get_bound_node(model: ObjectModel) -> Any: + # TODO: Use isinstance instead of try ... except after _instance has typing + try: + return model._instance._proxied + except AttributeError: + return model._instance + + +class ObjectModel: + def __init__(self): + self._instance = None + + def __repr__(self): + result = [] + cname = type(self).__name__ + string = "%(cname)s(%(fields)s)" + alignment = len(cname) + 1 + for field in sorted(self.attributes()): + width = 80 - len(field) - alignment + lines = pprint.pformat(field, indent=2, width=width).splitlines(True) + + inner = [lines[0]] + for line in lines[1:]: + inner.append(" " * alignment + line) + result.append(field) + + return string % { + "cname": cname, + "fields": (",\n" + " " * alignment).join(result), + } + + def __call__(self, instance): + self._instance = instance + return self + + def __get__(self, instance, cls=None): + # ObjectModel needs to be a descriptor so that just doing + # `special_attributes = SomeObjectModel` should be enough in the body of a node. + # But at the same time, node.special_attributes should return an object + # which can be used for manipulating the special attributes. That's the reason + # we pass the instance through which it got accessed to ObjectModel.__call__, + # returning itself afterwards, so we can still have access to the + # underlying data model and to the instance for which it got accessed. + return self(instance) + + def __contains__(self, name) -> bool: + return name in self.attributes() + + @lru_cache() # noqa + def attributes(self) -> list[str]: + """Get the attributes which are exported by this object model.""" + return [o[LEN_OF_IMPL_PREFIX:] for o in dir(self) if o.startswith(IMPL_PREFIX)] + + def lookup(self, name): + """Look up the given *name* in the current model. + + It should return an AST or an interpreter object, + but if the name is not found, then an AttributeInferenceError will be raised. + """ + if name in self.attributes(): + return getattr(self, IMPL_PREFIX + name) + raise AttributeInferenceError(target=self._instance, attribute=name) + + @property + def attr___new__(self) -> bases.BoundMethod: + """Calling cls.__new__(type) on an object returns an instance of 'type'.""" + node: nodes.FunctionDef = builder.extract_node( + """def __new__(self, cls): return cls()""" + ) + # We set the parent as being the ClassDef of 'object' as that + # triggers correct inference as a call to __new__ in bases.py + node.parent = AstroidManager().builtins_module["object"] + + return bases.BoundMethod(proxy=node, bound=_get_bound_node(self)) + + @property + def attr___init__(self) -> bases.BoundMethod: + """Calling cls.__init__() normally returns None.""" + # The *args and **kwargs are necessary not to trigger warnings about missing + # or extra parameters for '__init__' methods we don't infer correctly. + # This BoundMethod is the fallback value for those. + node: nodes.FunctionDef = builder.extract_node( + """def __init__(self, *args, **kwargs): return None""" + ) + # We set the parent as being the ClassDef of 'object' as that + # is where this method originally comes from + node.parent = AstroidManager().builtins_module["object"] + + return bases.BoundMethod(proxy=node, bound=_get_bound_node(self)) + + +class ModuleModel(ObjectModel): + def _builtins(self): + builtins_ast_module = AstroidManager().builtins_module + return builtins_ast_module.special_attributes.lookup("__dict__") + + @property + def attr_builtins(self): + return self._builtins() + + @property + def attr___path__(self): + if not self._instance.package: + raise AttributeInferenceError(target=self._instance, attribute="__path__") + + path_objs = [ + node_classes.Const( + value=path + if not path.endswith("__init__.py") + else os.path.dirname(path), + parent=self._instance, + ) + for path in self._instance.path + ] + + container = node_classes.List(parent=self._instance) + container.postinit(path_objs) + + return container + + @property + def attr___name__(self): + return node_classes.Const(value=self._instance.name, parent=self._instance) + + @property + def attr___doc__(self): + return node_classes.Const( + value=getattr(self._instance.doc_node, "value", None), + parent=self._instance, + ) + + @property + def attr___file__(self): + return node_classes.Const(value=self._instance.file, parent=self._instance) + + @property + def attr___dict__(self): + return _dunder_dict(self._instance, self._instance.globals) + + @property + def attr___package__(self): + if not self._instance.package: + value = "" + else: + value = self._instance.name + + return node_classes.Const(value=value, parent=self._instance) + + # These are related to the Python 3 implementation of the + # import system, + # https://docs.python.org/3/reference/import.html#import-related-module-attributes + + @property + def attr___spec__(self): + # No handling for now. + return node_classes.Unknown() + + @property + def attr___loader__(self): + # No handling for now. + return node_classes.Unknown() + + @property + def attr___cached__(self): + # No handling for now. + return node_classes.Unknown() + + +class FunctionModel(ObjectModel): + @property + def attr___name__(self): + return node_classes.Const(value=self._instance.name, parent=self._instance) + + @property + def attr___doc__(self): + return node_classes.Const( + value=getattr(self._instance.doc_node, "value", None), + parent=self._instance, + ) + + @property + def attr___qualname__(self): + return node_classes.Const(value=self._instance.qname(), parent=self._instance) + + @property + def attr___defaults__(self): + func = self._instance + if not func.args.defaults: + return node_classes.Const(value=None, parent=func) + + defaults_obj = node_classes.Tuple(parent=func) + defaults_obj.postinit(func.args.defaults) + return defaults_obj + + @property + def attr___annotations__(self): + obj = node_classes.Dict(parent=self._instance) + + if not self._instance.returns: + returns = None + else: + returns = self._instance.returns + + args = self._instance.args + pair_annotations = itertools.chain( + zip(args.args or [], args.annotations), + zip(args.kwonlyargs, args.kwonlyargs_annotations), + zip(args.posonlyargs or [], args.posonlyargs_annotations), + ) + + annotations = { + arg.name: annotation for (arg, annotation) in pair_annotations if annotation + } + if args.varargannotation: + annotations[args.vararg] = args.varargannotation + if args.kwargannotation: + annotations[args.kwarg] = args.kwargannotation + if returns: + annotations["return"] = returns + + items = [ + (node_classes.Const(key, parent=obj), value) + for (key, value) in annotations.items() + ] + + obj.postinit(items) + return obj + + @property + def attr___dict__(self): + return node_classes.Dict(parent=self._instance) + + attr___globals__ = attr___dict__ + + @property + def attr___kwdefaults__(self): + def _default_args(args, parent): + for arg in args.kwonlyargs: + try: + default = args.default_value(arg.name) + except NoDefault: + continue + + name = node_classes.Const(arg.name, parent=parent) + yield name, default + + args = self._instance.args + obj = node_classes.Dict(parent=self._instance) + defaults = dict(_default_args(args, obj)) + + obj.postinit(list(defaults.items())) + return obj + + @property + def attr___module__(self): + return node_classes.Const(self._instance.root().qname()) + + @property + def attr___get__(self): + func = self._instance + + class DescriptorBoundMethod(bases.BoundMethod): + """Bound method which knows how to understand calling descriptor + binding. + """ + + def implicit_parameters(self) -> Literal[0]: + # Different than BoundMethod since the signature + # is different. + return 0 + + def infer_call_result( + self, caller, context: InferenceContext | None = None + ): + if len(caller.args) > 2 or len(caller.args) < 1: + raise InferenceError( + "Invalid arguments for descriptor binding", + target=self, + context=context, + ) + + context = copy_context(context) + try: + cls = next(caller.args[0].infer(context=context)) + except StopIteration as e: + raise InferenceError(context=context, node=caller.args[0]) from e + + if isinstance(cls, util.UninferableBase): + raise InferenceError( + "Invalid class inferred", target=self, context=context + ) + + # For some reason func is a Node that the below + # code is not expecting + if isinstance(func, bases.BoundMethod): + yield func + return + + # Rebuild the original value, but with the parent set as the + # class where it will be bound. + new_func = func.__class__( + name=func.name, + lineno=func.lineno, + col_offset=func.col_offset, + parent=func.parent, + ) + # pylint: disable=no-member + new_func.postinit( + func.args, + func.body, + func.decorators, + func.returns, + doc_node=func.doc_node, + ) + + # Build a proper bound method that points to our newly built function. + proxy = bases.UnboundMethod(new_func) + yield bases.BoundMethod(proxy=proxy, bound=cls) + + @property + def args(self): + """Overwrite the underlying args to match those of the underlying func. + + Usually the underlying *func* is a function/method, as in: + + def test(self): + pass + + This has only the *self* parameter but when we access test.__get__ + we get a new object which has two parameters, *self* and *type*. + """ + nonlocal func + positional_or_keyword_params = func.args.args.copy() + positional_or_keyword_params.append(astroid.AssignName(name="type")) + + positional_only_params = func.args.posonlyargs.copy() + + arguments = astroid.Arguments(parent=func.args.parent) + arguments.postinit( + args=positional_or_keyword_params, + posonlyargs=positional_only_params, + defaults=[], + kwonlyargs=[], + kw_defaults=[], + annotations=[], + ) + return arguments + + return DescriptorBoundMethod(proxy=self._instance, bound=self._instance) + + # These are here just for completion. + @property + def attr___ne__(self): + return node_classes.Unknown() + + attr___subclasshook__ = attr___ne__ + attr___str__ = attr___ne__ + attr___sizeof__ = attr___ne__ + attr___setattr___ = attr___ne__ + attr___repr__ = attr___ne__ + attr___reduce__ = attr___ne__ + attr___reduce_ex__ = attr___ne__ + attr___lt__ = attr___ne__ + attr___eq__ = attr___ne__ + attr___gt__ = attr___ne__ + attr___format__ = attr___ne__ + attr___delattr___ = attr___ne__ + attr___getattribute__ = attr___ne__ + attr___hash__ = attr___ne__ + attr___dir__ = attr___ne__ + attr___call__ = attr___ne__ + attr___class__ = attr___ne__ + attr___closure__ = attr___ne__ + attr___code__ = attr___ne__ + + +class ClassModel(ObjectModel): + def __init__(self): + # Add a context so that inferences called from an instance don't recurse endlessly + self.context = InferenceContext() + + super().__init__() + + @property + def attr___module__(self): + return node_classes.Const(self._instance.root().qname()) + + @property + def attr___name__(self): + return node_classes.Const(self._instance.name) + + @property + def attr___qualname__(self): + return node_classes.Const(self._instance.qname()) + + @property + def attr___doc__(self): + return node_classes.Const(getattr(self._instance.doc_node, "value", None)) + + @property + def attr___mro__(self): + if not self._instance.newstyle: + raise AttributeInferenceError(target=self._instance, attribute="__mro__") + + mro = self._instance.mro() + obj = node_classes.Tuple(parent=self._instance) + obj.postinit(mro) + return obj + + @property + def attr_mro(self): + if not self._instance.newstyle: + raise AttributeInferenceError(target=self._instance, attribute="mro") + + other_self = self + + # Cls.mro is a method and we need to return one in order to have a proper inference. + # The method we're returning is capable of inferring the underlying MRO though. + class MroBoundMethod(bases.BoundMethod): + def infer_call_result( + self, caller, context: InferenceContext | None = None + ): + yield other_self.attr___mro__ + + implicit_metaclass = self._instance.implicit_metaclass() + mro_method = implicit_metaclass.locals["mro"][0] + return MroBoundMethod(proxy=mro_method, bound=implicit_metaclass) + + @property + def attr___bases__(self): + obj = node_classes.Tuple() + context = InferenceContext() + elts = list(self._instance._inferred_bases(context)) + obj.postinit(elts=elts) + return obj + + @property + def attr___class__(self): + # pylint: disable=import-outside-toplevel; circular import + from astroid import helpers + + return helpers.object_type(self._instance) + + @property + def attr___subclasses__(self): + """Get the subclasses of the underlying class. + + This looks only in the current module for retrieving the subclasses, + thus it might miss a couple of them. + """ + if not self._instance.newstyle: + raise AttributeInferenceError( + target=self._instance, attribute="__subclasses__" + ) + + qname = self._instance.qname() + root = self._instance.root() + classes = [ + cls + for cls in root.nodes_of_class(nodes.ClassDef) + if cls != self._instance and cls.is_subtype_of(qname, context=self.context) + ] + + obj = node_classes.List(parent=self._instance) + obj.postinit(classes) + + class SubclassesBoundMethod(bases.BoundMethod): + def infer_call_result( + self, caller, context: InferenceContext | None = None + ): + yield obj + + implicit_metaclass = self._instance.implicit_metaclass() + subclasses_method = implicit_metaclass.locals["__subclasses__"][0] + return SubclassesBoundMethod(proxy=subclasses_method, bound=implicit_metaclass) + + @property + def attr___dict__(self): + return node_classes.Dict(parent=self._instance) + + @property + def attr___call__(self): + """Calling a class A() returns an instance of A.""" + return self._instance.instantiate_class() + + +class SuperModel(ObjectModel): + @property + def attr___thisclass__(self): + return self._instance.mro_pointer + + @property + def attr___self_class__(self): + return self._instance._self_class + + @property + def attr___self__(self): + return self._instance.type + + @property + def attr___class__(self): + return self._instance._proxied + + +class UnboundMethodModel(ObjectModel): + @property + def attr___class__(self): + # pylint: disable=import-outside-toplevel; circular import + from astroid import helpers + + return helpers.object_type(self._instance) + + @property + def attr___func__(self): + return self._instance._proxied + + @property + def attr___self__(self): + return node_classes.Const(value=None, parent=self._instance) + + attr_im_func = attr___func__ + attr_im_class = attr___class__ + attr_im_self = attr___self__ + + +class ContextManagerModel(ObjectModel): + """Model for context managers. + + Based on 3.3.9 of the Data Model documentation: + https://docs.python.org/3/reference/datamodel.html#with-statement-context-managers + """ + + @property + def attr___enter__(self) -> bases.BoundMethod: + """Representation of the base implementation of __enter__. + + As per Python documentation: + Enter the runtime context related to this object. The with statement + will bind this method's return value to the target(s) specified in the + as clause of the statement, if any. + """ + node: nodes.FunctionDef = builder.extract_node("""def __enter__(self): ...""") + # We set the parent as being the ClassDef of 'object' as that + # is where this method originally comes from + node.parent = AstroidManager().builtins_module["object"] + + return bases.BoundMethod(proxy=node, bound=_get_bound_node(self)) + + @property + def attr___exit__(self) -> bases.BoundMethod: + """Representation of the base implementation of __exit__. + + As per Python documentation: + Exit the runtime context related to this object. The parameters describe the + exception that caused the context to be exited. If the context was exited + without an exception, all three arguments will be None. + """ + node: nodes.FunctionDef = builder.extract_node( + """def __exit__(self, exc_type, exc_value, traceback): ...""" + ) + # We set the parent as being the ClassDef of 'object' as that + # is where this method originally comes from + node.parent = AstroidManager().builtins_module["object"] + + return bases.BoundMethod(proxy=node, bound=_get_bound_node(self)) + + +class BoundMethodModel(FunctionModel): + @property + def attr___func__(self): + return self._instance._proxied._proxied + + @property + def attr___self__(self): + return self._instance.bound + + +class GeneratorModel(FunctionModel, ContextManagerModel): + def __new__(cls, *args, **kwargs): + # Append the values from the GeneratorType unto this object. + ret = super().__new__(cls, *args, **kwargs) + generator = AstroidManager().builtins_module["generator"] + for name, values in generator.locals.items(): + method = values[0] + + def patched(cls, meth=method): + return meth + + setattr(type(ret), IMPL_PREFIX + name, property(patched)) + + return ret + + @property + def attr___name__(self): + return node_classes.Const( + value=self._instance.parent.name, parent=self._instance + ) + + @property + def attr___doc__(self): + return node_classes.Const( + value=getattr(self._instance.parent.doc_node, "value", None), + parent=self._instance, + ) + + +class AsyncGeneratorModel(GeneratorModel): + def __new__(cls, *args, **kwargs): + # Append the values from the AGeneratorType unto this object. + ret = super().__new__(cls, *args, **kwargs) + astroid_builtins = AstroidManager().builtins_module + generator = astroid_builtins.get("async_generator") + if generator is None: + # Make it backward compatible. + generator = astroid_builtins.get("generator") + + for name, values in generator.locals.items(): + method = values[0] + + def patched(cls, meth=method): + return meth + + setattr(type(ret), IMPL_PREFIX + name, property(patched)) + + return ret + + +class InstanceModel(ObjectModel): + @property + def attr___class__(self): + return self._instance._proxied + + @property + def attr___module__(self): + return node_classes.Const(self._instance.root().qname()) + + @property + def attr___doc__(self): + return node_classes.Const(getattr(self._instance.doc_node, "value", None)) + + @property + def attr___dict__(self): + return _dunder_dict(self._instance, self._instance.instance_attrs) + + +# Exception instances + + +class ExceptionInstanceModel(InstanceModel): + @property + def attr_args(self) -> nodes.Tuple: + return nodes.Tuple(parent=self._instance) + + @property + def attr___traceback__(self): + builtins_ast_module = AstroidManager().builtins_module + traceback_type = builtins_ast_module[types.TracebackType.__name__] + return traceback_type.instantiate_class() + + +class SyntaxErrorInstanceModel(ExceptionInstanceModel): + @property + def attr_text(self): + return node_classes.Const("") + + +class OSErrorInstanceModel(ExceptionInstanceModel): + @property + def attr_filename(self): + return node_classes.Const("") + + @property + def attr_errno(self): + return node_classes.Const(0) + + @property + def attr_strerror(self): + return node_classes.Const("") + + attr_filename2 = attr_filename + + +class ImportErrorInstanceModel(ExceptionInstanceModel): + @property + def attr_name(self): + return node_classes.Const("") + + @property + def attr_path(self): + return node_classes.Const("") + + +class UnicodeDecodeErrorInstanceModel(ExceptionInstanceModel): + @property + def attr_object(self): + return node_classes.Const("") + + +BUILTIN_EXCEPTIONS = { + "builtins.SyntaxError": SyntaxErrorInstanceModel, + "builtins.ImportError": ImportErrorInstanceModel, + "builtins.UnicodeDecodeError": UnicodeDecodeErrorInstanceModel, + # These are all similar to OSError in terms of attributes + "builtins.OSError": OSErrorInstanceModel, + "builtins.BlockingIOError": OSErrorInstanceModel, + "builtins.BrokenPipeError": OSErrorInstanceModel, + "builtins.ChildProcessError": OSErrorInstanceModel, + "builtins.ConnectionAbortedError": OSErrorInstanceModel, + "builtins.ConnectionError": OSErrorInstanceModel, + "builtins.ConnectionRefusedError": OSErrorInstanceModel, + "builtins.ConnectionResetError": OSErrorInstanceModel, + "builtins.FileExistsError": OSErrorInstanceModel, + "builtins.FileNotFoundError": OSErrorInstanceModel, + "builtins.InterruptedError": OSErrorInstanceModel, + "builtins.IsADirectoryError": OSErrorInstanceModel, + "builtins.NotADirectoryError": OSErrorInstanceModel, + "builtins.PermissionError": OSErrorInstanceModel, + "builtins.ProcessLookupError": OSErrorInstanceModel, + "builtins.TimeoutError": OSErrorInstanceModel, +} + + +class DictModel(ObjectModel): + @property + def attr___class__(self): + return self._instance._proxied + + def _generic_dict_attribute(self, obj, name): + """Generate a bound method that can infer the given *obj*.""" + + class DictMethodBoundMethod(astroid.BoundMethod): + def infer_call_result( + self, caller, context: InferenceContext | None = None + ): + yield obj + + meth = next(self._instance._proxied.igetattr(name), None) + return DictMethodBoundMethod(proxy=meth, bound=self._instance) + + @property + def attr_items(self): + elems = [] + obj = node_classes.List(parent=self._instance) + for key, value in self._instance.items: + elem = node_classes.Tuple(parent=obj) + elem.postinit((key, value)) + elems.append(elem) + obj.postinit(elts=elems) + + obj = objects.DictItems(obj) + return self._generic_dict_attribute(obj, "items") + + @property + def attr_keys(self): + keys = [key for (key, _) in self._instance.items] + obj = node_classes.List(parent=self._instance) + obj.postinit(elts=keys) + + obj = objects.DictKeys(obj) + return self._generic_dict_attribute(obj, "keys") + + @property + def attr_values(self): + values = [value for (_, value) in self._instance.items] + obj = node_classes.List(parent=self._instance) + obj.postinit(values) + + obj = objects.DictValues(obj) + return self._generic_dict_attribute(obj, "values") + + +class PropertyModel(ObjectModel): + """Model for a builtin property.""" + + def _init_function(self, name): + function = nodes.FunctionDef(name=name, parent=self._instance) + + args = nodes.Arguments(parent=function) + args.postinit( + args=[], + defaults=[], + kwonlyargs=[], + kw_defaults=[], + annotations=[], + posonlyargs=[], + posonlyargs_annotations=[], + kwonlyargs_annotations=[], + ) + + function.postinit(args=args, body=[]) + return function + + @property + def attr_fget(self): + func = self._instance + + class PropertyFuncAccessor(nodes.FunctionDef): + def infer_call_result( + self, caller=None, context: InferenceContext | None = None + ): + nonlocal func + if caller and len(caller.args) != 1: + raise InferenceError( + "fget() needs a single argument", target=self, context=context + ) + + yield from func.function.infer_call_result( + caller=caller, context=context + ) + + property_accessor = PropertyFuncAccessor(name="fget", parent=self._instance) + property_accessor.postinit(args=func.args, body=func.body) + return property_accessor + + @property + def attr_fset(self): + func = self._instance + + def find_setter(func: Property) -> astroid.FunctionDef | None: + """ + Given a property, find the corresponding setter function and returns it. + + :param func: property for which the setter has to be found + :return: the setter function or None + """ + for target in [ + t for t in func.parent.get_children() if t.name == func.function.name + ]: + for dec_name in target.decoratornames(): + if dec_name.endswith(func.function.name + ".setter"): + return target + return None + + func_setter = find_setter(func) + if not func_setter: + raise InferenceError( + f"Unable to find the setter of property {func.function.name}" + ) + + class PropertyFuncAccessor(nodes.FunctionDef): + def infer_call_result( + self, caller=None, context: InferenceContext | None = None + ): + nonlocal func_setter + if caller and len(caller.args) != 2: + raise InferenceError( + "fset() needs two arguments", target=self, context=context + ) + yield from func_setter.infer_call_result(caller=caller, context=context) + + property_accessor = PropertyFuncAccessor(name="fset", parent=self._instance) + property_accessor.postinit(args=func_setter.args, body=func_setter.body) + return property_accessor + + @property + def attr_setter(self): + return self._init_function("setter") + + @property + def attr_deleter(self): + return self._init_function("deleter") + + @property + def attr_getter(self): + return self._init_function("getter") + + # pylint: enable=import-outside-toplevel diff --git a/venv/lib/python3.10/site-packages/astroid/manager.py b/venv/lib/python3.10/site-packages/astroid/manager.py new file mode 100644 index 00000000..965dd5a5 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/manager.py @@ -0,0 +1,447 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""astroid manager: avoid multiple astroid build of a same module when +possible by providing a class responsible to get astroid representation +from various source and using a cache of built modules) +""" + +from __future__ import annotations + +import collections +import os +import types +import zipimport +from collections.abc import Callable, Iterator, Sequence +from importlib.util import find_spec, module_from_spec +from typing import Any, ClassVar + +from astroid import nodes +from astroid._cache import CACHE_MANAGER +from astroid.const import BRAIN_MODULES_DIRECTORY +from astroid.context import InferenceContext, _invalidate_cache +from astroid.exceptions import AstroidBuildingError, AstroidImportError +from astroid.interpreter._import import spec, util +from astroid.modutils import ( + NoSourceFile, + _cache_normalize_path_, + file_info_from_modpath, + get_source_file, + is_module_name_part_of_extension_package_whitelist, + is_python_source, + is_stdlib_module, + load_module_from_name, + modpath_from_file, +) +from astroid.transforms import TransformVisitor +from astroid.typing import AstroidManagerBrain, InferenceResult + +ZIP_IMPORT_EXTS = (".zip", ".egg", ".whl", ".pyz", ".pyzw") + + +def safe_repr(obj: Any) -> str: + try: + return repr(obj) + except Exception: # pylint: disable=broad-except + return "???" + + +class AstroidManager: + """Responsible to build astroid from files or modules. + + Use the Borg (singleton) pattern. + """ + + name = "astroid loader" + brain: AstroidManagerBrain = { + "astroid_cache": {}, + "_mod_file_cache": {}, + "_failed_import_hooks": [], + "always_load_extensions": False, + "optimize_ast": False, + "extension_package_whitelist": set(), + "_transform": TransformVisitor(), + } + max_inferable_values: ClassVar[int] = 100 + + def __init__(self) -> None: + # NOTE: cache entries are added by the [re]builder + self.astroid_cache = AstroidManager.brain["astroid_cache"] + self._mod_file_cache = AstroidManager.brain["_mod_file_cache"] + self._failed_import_hooks = AstroidManager.brain["_failed_import_hooks"] + self.always_load_extensions = AstroidManager.brain["always_load_extensions"] + self.optimize_ast = AstroidManager.brain["optimize_ast"] + self.extension_package_whitelist = AstroidManager.brain[ + "extension_package_whitelist" + ] + self._transform = AstroidManager.brain["_transform"] + + @property + def register_transform(self): + # This and unregister_transform below are exported for convenience + return self._transform.register_transform + + @property + def unregister_transform(self): + return self._transform.unregister_transform + + @property + def builtins_module(self) -> nodes.Module: + return self.astroid_cache["builtins"] + + def visit_transforms(self, node: nodes.NodeNG) -> InferenceResult: + """Visit the transforms and apply them to the given *node*.""" + return self._transform.visit(node) + + def ast_from_file( + self, + filepath: str, + modname: str | None = None, + fallback: bool = True, + source: bool = False, + ) -> nodes.Module: + """Given a module name, return the astroid object.""" + try: + filepath = get_source_file(filepath, include_no_ext=True) + source = True + except NoSourceFile: + pass + if modname is None: + try: + modname = ".".join(modpath_from_file(filepath)) + except ImportError: + modname = filepath + if ( + modname in self.astroid_cache + and self.astroid_cache[modname].file == filepath + ): + return self.astroid_cache[modname] + if source: + # pylint: disable=import-outside-toplevel; circular import + from astroid.builder import AstroidBuilder + + return AstroidBuilder(self).file_build(filepath, modname) + if fallback and modname: + return self.ast_from_module_name(modname) + raise AstroidBuildingError("Unable to build an AST for {path}.", path=filepath) + + def ast_from_string( + self, data: str, modname: str = "", filepath: str | None = None + ) -> nodes.Module: + """Given some source code as a string, return its corresponding astroid + object. + """ + # pylint: disable=import-outside-toplevel; circular import + from astroid.builder import AstroidBuilder + + return AstroidBuilder(self).string_build(data, modname, filepath) + + def _build_stub_module(self, modname: str) -> nodes.Module: + # pylint: disable=import-outside-toplevel; circular import + from astroid.builder import AstroidBuilder + + return AstroidBuilder(self).string_build("", modname) + + def _build_namespace_module( + self, modname: str, path: Sequence[str] + ) -> nodes.Module: + # pylint: disable=import-outside-toplevel; circular import + from astroid.builder import build_namespace_package_module + + return build_namespace_package_module(modname, path) + + def _can_load_extension(self, modname: str) -> bool: + if self.always_load_extensions: + return True + if is_stdlib_module(modname): + return True + return is_module_name_part_of_extension_package_whitelist( + modname, self.extension_package_whitelist + ) + + def ast_from_module_name( # noqa: C901 + self, + modname: str | None, + context_file: str | None = None, + use_cache: bool = True, + ) -> nodes.Module: + """Given a module name, return the astroid object.""" + if modname is None: + raise AstroidBuildingError("No module name given.") + # Sometimes we don't want to use the cache. For example, when we're + # importing a module with the same name as the file that is importing + # we want to fallback on the import system to make sure we get the correct + # module. + if modname in self.astroid_cache and use_cache: + return self.astroid_cache[modname] + if modname == "__main__": + return self._build_stub_module(modname) + if context_file: + old_cwd = os.getcwd() + os.chdir(os.path.dirname(context_file)) + try: + found_spec = self.file_from_module_name(modname, context_file) + if found_spec.type == spec.ModuleType.PY_ZIPMODULE: + module = self.zip_import_data(found_spec.location) + if module is not None: + return module + + elif found_spec.type in ( + spec.ModuleType.C_BUILTIN, + spec.ModuleType.C_EXTENSION, + ): + if ( + found_spec.type == spec.ModuleType.C_EXTENSION + and not self._can_load_extension(modname) + ): + return self._build_stub_module(modname) + try: + named_module = load_module_from_name(modname) + except Exception as e: + raise AstroidImportError( + "Loading {modname} failed with:\n{error}", + modname=modname, + path=found_spec.location, + ) from e + return self.ast_from_module(named_module, modname) + + elif found_spec.type == spec.ModuleType.PY_COMPILED: + raise AstroidImportError( + "Unable to load compiled module {modname}.", + modname=modname, + path=found_spec.location, + ) + + elif found_spec.type == spec.ModuleType.PY_NAMESPACE: + return self._build_namespace_module( + modname, found_spec.submodule_search_locations or [] + ) + elif found_spec.type == spec.ModuleType.PY_FROZEN: + if found_spec.location is None: + return self._build_stub_module(modname) + # For stdlib frozen modules we can determine the location and + # can therefore create a module from the source file + return self.ast_from_file(found_spec.location, modname, fallback=False) + + if found_spec.location is None: + raise AstroidImportError( + "Can't find a file for module {modname}.", modname=modname + ) + + return self.ast_from_file(found_spec.location, modname, fallback=False) + except AstroidBuildingError as e: + for hook in self._failed_import_hooks: + try: + return hook(modname) + except AstroidBuildingError: + pass + raise e + finally: + if context_file: + os.chdir(old_cwd) + + def zip_import_data(self, filepath: str) -> nodes.Module | None: + if zipimport is None: + return None + + # pylint: disable=import-outside-toplevel; circular import + from astroid.builder import AstroidBuilder + + builder = AstroidBuilder(self) + for ext in ZIP_IMPORT_EXTS: + try: + eggpath, resource = filepath.rsplit(ext + os.path.sep, 1) + except ValueError: + continue + try: + # pylint: disable-next=no-member + importer = zipimport.zipimporter(eggpath + ext) + zmodname = resource.replace(os.path.sep, ".") + if importer.is_package(resource): + zmodname = zmodname + ".__init__" + module = builder.string_build( + importer.get_source(resource), zmodname, filepath + ) + return module + except Exception: # pylint: disable=broad-except + continue + return None + + def file_from_module_name( + self, modname: str, contextfile: str | None + ) -> spec.ModuleSpec: + try: + value = self._mod_file_cache[(modname, contextfile)] + except KeyError: + try: + value = file_info_from_modpath( + modname.split("."), context_file=contextfile + ) + except ImportError as e: + # pylint: disable-next=redefined-variable-type + value = AstroidImportError( + "Failed to import module {modname} with error:\n{error}.", + modname=modname, + # we remove the traceback here to save on memory usage (since these exceptions are cached) + error=e.with_traceback(None), + ) + self._mod_file_cache[(modname, contextfile)] = value + if isinstance(value, AstroidBuildingError): + # we remove the traceback here to save on memory usage (since these exceptions are cached) + raise value.with_traceback(None) # pylint: disable=no-member + return value + + def ast_from_module( + self, module: types.ModuleType, modname: str | None = None + ) -> nodes.Module: + """Given an imported module, return the astroid object.""" + modname = modname or module.__name__ + if modname in self.astroid_cache: + return self.astroid_cache[modname] + try: + # some builtin modules don't have __file__ attribute + filepath = module.__file__ + if is_python_source(filepath): + # Type is checked in is_python_source + return self.ast_from_file(filepath, modname) # type: ignore[arg-type] + except AttributeError: + pass + + # pylint: disable=import-outside-toplevel; circular import + from astroid.builder import AstroidBuilder + + return AstroidBuilder(self).module_build(module, modname) + + def ast_from_class(self, klass: type, modname: str | None = None) -> nodes.ClassDef: + """Get astroid for the given class.""" + if modname is None: + try: + modname = klass.__module__ + except AttributeError as exc: + raise AstroidBuildingError( + "Unable to get module for class {class_name}.", + cls=klass, + class_repr=safe_repr(klass), + modname=modname, + ) from exc + modastroid = self.ast_from_module_name(modname) + ret = modastroid.getattr(klass.__name__)[0] + assert isinstance(ret, nodes.ClassDef) + return ret + + def infer_ast_from_something( + self, obj: object, context: InferenceContext | None = None + ) -> Iterator[InferenceResult]: + """Infer astroid for the given class.""" + if hasattr(obj, "__class__") and not isinstance(obj, type): + klass = obj.__class__ + elif isinstance(obj, type): + klass = obj + else: + raise AstroidBuildingError( # pragma: no cover + "Unable to get type for {class_repr}.", + cls=None, + class_repr=safe_repr(obj), + ) + try: + modname = klass.__module__ + except AttributeError as exc: + raise AstroidBuildingError( + "Unable to get module for {class_repr}.", + cls=klass, + class_repr=safe_repr(klass), + ) from exc + except Exception as exc: + raise AstroidImportError( + "Unexpected error while retrieving module for {class_repr}:\n" + "{error}", + cls=klass, + class_repr=safe_repr(klass), + ) from exc + try: + name = klass.__name__ + except AttributeError as exc: + raise AstroidBuildingError( + "Unable to get name for {class_repr}:\n", + cls=klass, + class_repr=safe_repr(klass), + ) from exc + except Exception as exc: + raise AstroidImportError( + "Unexpected error while retrieving name for {class_repr}:\n{error}", + cls=klass, + class_repr=safe_repr(klass), + ) from exc + # take care, on living object __module__ is regularly wrong :( + modastroid = self.ast_from_module_name(modname) + if klass is obj: + for inferred in modastroid.igetattr(name, context): + yield inferred + else: + for inferred in modastroid.igetattr(name, context): + yield inferred.instantiate_class() + + def register_failed_import_hook(self, hook: Callable[[str], nodes.Module]) -> None: + """Registers a hook to resolve imports that cannot be found otherwise. + + `hook` must be a function that accepts a single argument `modname` which + contains the name of the module or package that could not be imported. + If `hook` can resolve the import, must return a node of type `astroid.Module`, + otherwise, it must raise `AstroidBuildingError`. + """ + self._failed_import_hooks.append(hook) + + def cache_module(self, module: nodes.Module) -> None: + """Cache a module if no module with the same name is known yet.""" + self.astroid_cache.setdefault(module.name, module) + + def bootstrap(self) -> None: + """Bootstrap the required AST modules needed for the manager to work. + + The bootstrap usually involves building the AST for the builtins + module, which is required by the rest of astroid to work correctly. + """ + from astroid import raw_building # pylint: disable=import-outside-toplevel + + raw_building._astroid_bootstrapping() + + def clear_cache(self) -> None: + """Clear the underlying caches, bootstrap the builtins module and + re-register transforms. + """ + # import here because of cyclic imports + # pylint: disable=import-outside-toplevel + from astroid.inference_tip import clear_inference_tip_cache + from astroid.interpreter.objectmodel import ObjectModel + from astroid.nodes.node_classes import LookupMixIn + from astroid.nodes.scoped_nodes import ClassDef + + clear_inference_tip_cache() + _invalidate_cache() # inference context cache + + self.astroid_cache.clear() + # NB: not a new TransformVisitor() + AstroidManager.brain["_transform"].transforms = collections.defaultdict(list) + + CACHE_MANAGER.clear_all_caches() + + for lru_cache in ( + LookupMixIn.lookup, + _cache_normalize_path_, + util.is_namespace, + ObjectModel.attributes, + ClassDef._metaclass_lookup_attribute, + ): + lru_cache.cache_clear() # type: ignore[attr-defined] + + self.bootstrap() + + # Reload brain plugins. During initialisation this is done in astroid.__init__.py + for module in BRAIN_MODULES_DIRECTORY.iterdir(): + if module.suffix == ".py": + module_spec = find_spec(f"astroid.brain.{module.stem}") + assert module_spec + module_object = module_from_spec(module_spec) + assert module_spec.loader + module_spec.loader.exec_module(module_object) diff --git a/venv/lib/python3.10/site-packages/astroid/mixins.py b/venv/lib/python3.10/site-packages/astroid/mixins.py new file mode 100644 index 00000000..942e824a --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/mixins.py @@ -0,0 +1,31 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""This module contains some mixins for the different nodes.""" + +import warnings + +from astroid.nodes._base_nodes import AssignTypeNode as AssignTypeMixin +from astroid.nodes._base_nodes import FilterStmtsBaseNode as FilterStmtsMixin +from astroid.nodes._base_nodes import ImportNode as ImportFromMixin +from astroid.nodes._base_nodes import MultiLineBlockNode as MultiLineBlockMixin +from astroid.nodes._base_nodes import MultiLineWithElseBlockNode as BlockRangeMixIn +from astroid.nodes._base_nodes import NoChildrenNode as NoChildrenMixin +from astroid.nodes._base_nodes import ParentAssignNode as ParentAssignTypeMixin + +__all__ = ( + "AssignTypeMixin", + "BlockRangeMixIn", + "FilterStmtsMixin", + "ImportFromMixin", + "MultiLineBlockMixin", + "NoChildrenMixin", + "ParentAssignTypeMixin", +) + +warnings.warn( + "The 'astroid.mixins' module is deprecated and will become private in astroid 3.0.0", + DeprecationWarning, + stacklevel=2, +) diff --git a/venv/lib/python3.10/site-packages/astroid/modutils.py b/venv/lib/python3.10/site-packages/astroid/modutils.py new file mode 100644 index 00000000..f05b5f89 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/modutils.py @@ -0,0 +1,701 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""Python modules manipulation utility functions. + +:type PY_SOURCE_EXTS: tuple(str) +:var PY_SOURCE_EXTS: list of possible python source file extension + +:type STD_LIB_DIRS: set of str +:var STD_LIB_DIRS: directories where standard modules are located + +:type BUILTIN_MODULES: dict +:var BUILTIN_MODULES: dictionary with builtin module names has key +""" + +from __future__ import annotations + +import importlib +import importlib.machinery +import importlib.util +import io +import itertools +import logging +import os +import sys +import sysconfig +import types +import warnings +from collections.abc import Callable, Iterable, Sequence +from contextlib import redirect_stderr, redirect_stdout +from functools import lru_cache +from pathlib import Path + +from astroid.const import IS_JYTHON, IS_PYPY, PY310_PLUS +from astroid.interpreter._import import spec, util + +if PY310_PLUS: + from sys import stdlib_module_names +else: + from astroid._backport_stdlib_names import stdlib_module_names + +logger = logging.getLogger(__name__) + + +if sys.platform.startswith("win"): + PY_SOURCE_EXTS = ("py", "pyw") + PY_COMPILED_EXTS = ("dll", "pyd") +else: + PY_SOURCE_EXTS = ("py",) + PY_COMPILED_EXTS = ("so",) + + +# TODO: Adding `platstdlib` is a fix for a workaround in virtualenv. At some point we should +# revisit whether this is still necessary. See https://github.com/PyCQA/astroid/pull/1323. +STD_LIB_DIRS = {sysconfig.get_path("stdlib"), sysconfig.get_path("platstdlib")} + +if os.name == "nt": + STD_LIB_DIRS.add(os.path.join(sys.prefix, "dlls")) + try: + # real_prefix is defined when running inside virtual environments, + # created with the **virtualenv** library. + # Deprecated in virtualenv==16.7.9 + # See: https://github.com/pypa/virtualenv/issues/1622 + STD_LIB_DIRS.add(os.path.join(sys.real_prefix, "dlls")) # type: ignore[attr-defined] + except AttributeError: + # sys.base_exec_prefix is always defined, but in a virtual environment + # created with the stdlib **venv** module, it points to the original + # installation, if the virtual env is activated. + try: + STD_LIB_DIRS.add(os.path.join(sys.base_exec_prefix, "dlls")) + except AttributeError: + pass + +if IS_PYPY and sys.version_info < (3, 8): + # PyPy stores the stdlib in two places: sys.prefix/lib_pypy and sys.prefix/lib-python/3 + # sysconfig.get_path on PyPy returns the first, but without an underscore so we patch this manually. + # Beginning with 3.8 the stdlib is only stored in: sys.prefix/pypy{py_version_short} + STD_LIB_DIRS.add(str(Path(sysconfig.get_path("stdlib")).parent / "lib_pypy")) + STD_LIB_DIRS.add(str(Path(sysconfig.get_path("stdlib")).parent / "lib-python/3")) + + # TODO: This is a fix for a workaround in virtualenv. At some point we should revisit + # whether this is still necessary. See https://github.com/PyCQA/astroid/pull/1324. + STD_LIB_DIRS.add(str(Path(sysconfig.get_path("platstdlib")).parent / "lib_pypy")) + STD_LIB_DIRS.add( + str(Path(sysconfig.get_path("platstdlib")).parent / "lib-python/3") + ) + +if os.name == "posix": + # Need the real prefix if we're in a virtualenv, otherwise + # the usual one will do. + # Deprecated in virtualenv==16.7.9 + # See: https://github.com/pypa/virtualenv/issues/1622 + try: + prefix: str = sys.real_prefix # type: ignore[attr-defined] + except AttributeError: + prefix = sys.prefix + + def _posix_path(path: str) -> str: + base_python = "python%d.%d" % sys.version_info[:2] + return os.path.join(prefix, path, base_python) + + STD_LIB_DIRS.add(_posix_path("lib")) + if sys.maxsize > 2**32: + # This tries to fix a problem with /usr/lib64 builds, + # where systems are running both 32-bit and 64-bit code + # on the same machine, which reflects into the places where + # standard library could be found. More details can be found + # here http://bugs.python.org/issue1294959. + # An easy reproducing case would be + # https://github.com/PyCQA/pylint/issues/712#issuecomment-163178753 + STD_LIB_DIRS.add(_posix_path("lib64")) + +EXT_LIB_DIRS = {sysconfig.get_path("purelib"), sysconfig.get_path("platlib")} +BUILTIN_MODULES = dict.fromkeys(sys.builtin_module_names, True) + + +class NoSourceFile(Exception): + """Exception raised when we are not able to get a python + source file for a precompiled file. + """ + + +def _normalize_path(path: str) -> str: + """Resolve symlinks in path and convert to absolute path. + + Note that environment variables and ~ in the path need to be expanded in + advance. + + This can be cached by using _cache_normalize_path. + """ + return os.path.normcase(os.path.realpath(path)) + + +def _path_from_filename(filename: str, is_jython: bool = IS_JYTHON) -> str: + if not is_jython: + return filename + head, has_pyclass, _ = filename.partition("$py.class") + if has_pyclass: + return head + ".py" + return filename + + +def _handle_blacklist( + blacklist: Sequence[str], dirnames: list[str], filenames: list[str] +) -> None: + """Remove files/directories in the black list. + + dirnames/filenames are usually from os.walk + """ + for norecurs in blacklist: + if norecurs in dirnames: + dirnames.remove(norecurs) + elif norecurs in filenames: + filenames.remove(norecurs) + + +@lru_cache() +def _cache_normalize_path_(path: str) -> str: + return _normalize_path(path) + + +def _cache_normalize_path(path: str) -> str: + """Normalize path with caching.""" + # _module_file calls abspath on every path in sys.path every time it's + # called; on a larger codebase this easily adds up to half a second just + # assembling path components. This cache alleviates that. + if not path: # don't cache result for '' + return _normalize_path(path) + return _cache_normalize_path_(path) + + +def load_module_from_name(dotted_name: str) -> types.ModuleType: + """Load a Python module from its name. + + :type dotted_name: str + :param dotted_name: python name of a module or package + + :raise ImportError: if the module or package is not found + + :rtype: module + :return: the loaded module + """ + try: + return sys.modules[dotted_name] + except KeyError: + pass + + # Capture and log anything emitted during import to avoid + # contaminating JSON reports in pylint + with redirect_stderr(io.StringIO()) as stderr, redirect_stdout( + io.StringIO() + ) as stdout: + module = importlib.import_module(dotted_name) + + stderr_value = stderr.getvalue() + if stderr_value: + logger.error( + "Captured stderr while importing %s:\n%s", dotted_name, stderr_value + ) + stdout_value = stdout.getvalue() + if stdout_value: + logger.info( + "Captured stdout while importing %s:\n%s", dotted_name, stdout_value + ) + + return module + + +def load_module_from_modpath(parts: Sequence[str]) -> types.ModuleType: + """Load a python module from its split name. + + :param parts: + python name of a module or package split on '.' + + :raise ImportError: if the module or package is not found + + :return: the loaded module + """ + return load_module_from_name(".".join(parts)) + + +def load_module_from_file(filepath: str) -> types.ModuleType: + """Load a Python module from it's path. + + :type filepath: str + :param filepath: path to the python module or package + + :raise ImportError: if the module or package is not found + + :rtype: module + :return: the loaded module + """ + modpath = modpath_from_file(filepath) + return load_module_from_modpath(modpath) + + +def check_modpath_has_init(path: str, mod_path: list[str]) -> bool: + """Check there are some __init__.py all along the way.""" + modpath: list[str] = [] + for part in mod_path: + modpath.append(part) + path = os.path.join(path, part) + if not _has_init(path): + old_namespace = util.is_namespace(".".join(modpath)) + if not old_namespace: + return False + return True + + +def _get_relative_base_path(filename: str, path_to_check: str) -> list[str] | None: + """Extracts the relative mod path of the file to import from. + + Check if a file is within the passed in path and if so, returns the + relative mod path from the one passed in. + + If the filename is no in path_to_check, returns None + + Note this function will look for both abs and realpath of the file, + this allows to find the relative base path even if the file is a + symlink of a file in the passed in path + + Examples: + _get_relative_base_path("/a/b/c/d.py", "/a/b") -> ["c","d"] + _get_relative_base_path("/a/b/c/d.py", "/dev") -> None + """ + importable_path = None + path_to_check = os.path.normcase(path_to_check) + abs_filename = os.path.abspath(filename) + if os.path.normcase(abs_filename).startswith(path_to_check): + importable_path = abs_filename + + real_filename = os.path.realpath(filename) + if os.path.normcase(real_filename).startswith(path_to_check): + importable_path = real_filename + + # if "var" in path_to_check: + # breakpoint() + + if importable_path: + base_path = os.path.splitext(importable_path)[0] + relative_base_path = base_path[len(path_to_check) :] + return [pkg for pkg in relative_base_path.split(os.sep) if pkg] + + return None + + +def modpath_from_file_with_callback( + filename: str, + path: Sequence[str] | None = None, + is_package_cb: Callable[[str, list[str]], bool] | None = None, +) -> list[str]: + filename = os.path.expanduser(_path_from_filename(filename)) + paths_to_check = sys.path.copy() + if path: + paths_to_check += path + for pathname in itertools.chain( + paths_to_check, map(_cache_normalize_path, paths_to_check) + ): + if not pathname: + continue + modpath = _get_relative_base_path(filename, pathname) + if not modpath: + continue + assert is_package_cb is not None + if is_package_cb(pathname, modpath[:-1]): + return modpath + + raise ImportError( + "Unable to find module for {} in {}".format(filename, ", \n".join(sys.path)) + ) + + +def modpath_from_file(filename: str, path: Sequence[str] | None = None) -> list[str]: + """Get the corresponding split module's name from a filename. + + This function will return the name of a module or package split on `.`. + + :type filename: str + :param filename: file's path for which we want the module's name + + :type Optional[List[str]] path: + Optional list of path where the module or package should be + searched (use sys.path if nothing or None is given) + + :raise ImportError: + if the corresponding module's name has not been found + + :rtype: list(str) + :return: the corresponding split module's name + """ + return modpath_from_file_with_callback(filename, path, check_modpath_has_init) + + +def file_from_modpath( + modpath: list[str], + path: Sequence[str] | None = None, + context_file: str | None = None, +) -> str | None: + return file_info_from_modpath(modpath, path, context_file).location + + +def file_info_from_modpath( + modpath: list[str], + path: Sequence[str] | None = None, + context_file: str | None = None, +) -> spec.ModuleSpec: + """Given a mod path (i.e. split module / package name), return the + corresponding file. + + Giving priority to source file over precompiled file if it exists. + + :param modpath: + split module's name (i.e name of a module or package split + on '.') + (this means explicit relative imports that start with dots have + empty strings in this list!) + + :param path: + optional list of path where the module or package should be + searched (use sys.path if nothing or None is given) + + :param context_file: + context file to consider, necessary if the identifier has been + introduced using a relative import unresolvable in the actual + context (i.e. modutils) + + :raise ImportError: if there is no such module in the directory + + :return: + the path to the module's file or None if it's an integrated + builtin module such as 'sys' + """ + if context_file is not None: + context: str | None = os.path.dirname(context_file) + else: + context = context_file + if modpath[0] == "xml": + # handle _xmlplus + try: + return _spec_from_modpath(["_xmlplus"] + modpath[1:], path, context) + except ImportError: + return _spec_from_modpath(modpath, path, context) + elif modpath == ["os", "path"]: + # FIXME: currently ignoring search_path... + return spec.ModuleSpec( + name="os.path", + location=os.path.__file__, + type=spec.ModuleType.PY_SOURCE, + ) + return _spec_from_modpath(modpath, path, context) + + +def get_module_part(dotted_name: str, context_file: str | None = None) -> str: + """Given a dotted name return the module part of the name : + + >>> get_module_part('astroid.as_string.dump') + 'astroid.as_string' + + :param dotted_name: full name of the identifier we are interested in + + :param context_file: + context file to consider, necessary if the identifier has been + introduced using a relative import unresolvable in the actual + context (i.e. modutils) + + :raise ImportError: if there is no such module in the directory + + :return: + the module part of the name or None if we have not been able at + all to import the given name + + XXX: deprecated, since it doesn't handle package precedence over module + (see #10066) + """ + # os.path trick + if dotted_name.startswith("os.path"): + return "os.path" + parts = dotted_name.split(".") + if context_file is not None: + # first check for builtin module which won't be considered latter + # in that case (path != None) + if parts[0] in BUILTIN_MODULES: + if len(parts) > 2: + raise ImportError(dotted_name) + return parts[0] + # don't use += or insert, we want a new list to be created ! + path: list[str] | None = None + starti = 0 + if parts[0] == "": + assert ( + context_file is not None + ), "explicit relative import, but no context_file?" + path = [] # prevent resolving the import non-relatively + starti = 1 + while parts[starti] == "": # for all further dots: change context + starti += 1 + assert ( + context_file is not None + ), "explicit relative import, but no context_file?" + context_file = os.path.dirname(context_file) + for i in range(starti, len(parts)): + try: + file_from_modpath( + parts[starti : i + 1], path=path, context_file=context_file + ) + except ImportError: + if i < max(1, len(parts) - 2): + raise + return ".".join(parts[:i]) + return dotted_name + + +def get_module_files( + src_directory: str, blacklist: Sequence[str], list_all: bool = False +) -> list[str]: + """Given a package directory return a list of all available python + module's files in the package and its subpackages. + + :param src_directory: + path of the directory corresponding to the package + + :param blacklist: iterable + list of files or directories to ignore. + + :param list_all: + get files from all paths, including ones without __init__.py + + :return: + the list of all available python module's files in the package and + its subpackages + """ + files: list[str] = [] + for directory, dirnames, filenames in os.walk(src_directory): + if directory in blacklist: + continue + _handle_blacklist(blacklist, dirnames, filenames) + # check for __init__.py + if not list_all and "__init__.py" not in filenames: + dirnames[:] = () + continue + for filename in filenames: + if _is_python_file(filename): + src = os.path.join(directory, filename) + files.append(src) + return files + + +def get_source_file(filename: str, include_no_ext: bool = False) -> str: + """Given a python module's file name return the matching source file + name (the filename will be returned identically if it's already an. + + absolute path to a python source file...) + + :param filename: python module's file name + + :raise NoSourceFile: if no source file exists on the file system + + :return: the absolute path of the source file if it exists + """ + filename = os.path.abspath(_path_from_filename(filename)) + base, orig_ext = os.path.splitext(filename) + for ext in PY_SOURCE_EXTS: + source_path = f"{base}.{ext}" + if os.path.exists(source_path): + return source_path + if include_no_ext and not orig_ext and os.path.exists(base): + return base + raise NoSourceFile(filename) + + +def is_python_source(filename: str | None) -> bool: + """Return: True if the filename is a python source file.""" + if not filename: + return False + return os.path.splitext(filename)[1][1:] in PY_SOURCE_EXTS + + +def is_stdlib_module(modname: str) -> bool: + """Return: True if the modname is in the standard library""" + return modname.split(".")[0] in stdlib_module_names + + +def module_in_path(modname: str, path: str | Iterable[str]) -> bool: + """Try to determine if a module is imported from one of the specified paths + + :param modname: name of the module + + :param path: paths to consider + + :return: + true if the module: + - is located on the path listed in one of the directory in `paths` + """ + + modname = modname.split(".")[0] + try: + filename = file_from_modpath([modname]) + except ImportError: + # Import failed, we can't check path if we don't know it + return False + + if filename is None: + # No filename likely means it's compiled in, or potentially a namespace + return False + filename = _normalize_path(filename) + + if isinstance(path, str): + return filename.startswith(_cache_normalize_path(path)) + + return any(filename.startswith(_cache_normalize_path(entry)) for entry in path) + + +def is_standard_module(modname: str, std_path: Iterable[str] | None = None) -> bool: + """Try to guess if a module is a standard python module (by default, + see `std_path` parameter's description). + + :param modname: name of the module we are interested in + + :param std_path: list of path considered has standard + + :return: + true if the module: + - is located on the path listed in one of the directory in `std_path` + - is a built-in module + """ + warnings.warn( + "is_standard_module() is deprecated. Use, is_stdlib_module() or module_in_path() instead", + DeprecationWarning, + stacklevel=2, + ) + + modname = modname.split(".")[0] + try: + filename = file_from_modpath([modname]) + except ImportError: + # import failed, i'm probably not so wrong by supposing it's + # not standard... + return False + # modules which are not living in a file are considered standard + # (sys and __builtin__ for instance) + if filename is None: + # we assume there are no namespaces in stdlib + return not util.is_namespace(modname) + filename = _normalize_path(filename) + for path in EXT_LIB_DIRS: + if filename.startswith(_cache_normalize_path(path)): + return False + if std_path is None: + std_path = STD_LIB_DIRS + + return any(filename.startswith(_cache_normalize_path(path)) for path in std_path) + + +def is_relative(modname: str, from_file: str) -> bool: + """Return true if the given module name is relative to the given + file name. + + :param modname: name of the module we are interested in + + :param from_file: + path of the module from which modname has been imported + + :return: + true if the module has been imported relatively to `from_file` + """ + if not os.path.isdir(from_file): + from_file = os.path.dirname(from_file) + if from_file in sys.path: + return False + return bool( + importlib.machinery.PathFinder.find_spec( + modname.split(".", maxsplit=1)[0], [from_file] + ) + ) + + +# internal only functions ##################################################### + + +def _spec_from_modpath( + modpath: list[str], + path: Sequence[str] | None = None, + context: str | None = None, +) -> spec.ModuleSpec: + """Given a mod path (i.e. split module / package name), return the + corresponding spec. + + this function is used internally, see `file_from_modpath`'s + documentation for more information + """ + assert modpath + location = None + if context is not None: + try: + found_spec = spec.find_spec(modpath, [context]) + location = found_spec.location + except ImportError: + found_spec = spec.find_spec(modpath, path) + location = found_spec.location + else: + found_spec = spec.find_spec(modpath, path) + if found_spec.type == spec.ModuleType.PY_COMPILED: + try: + assert found_spec.location is not None + location = get_source_file(found_spec.location) + return found_spec._replace( + location=location, type=spec.ModuleType.PY_SOURCE + ) + except NoSourceFile: + return found_spec._replace(location=location) + elif found_spec.type == spec.ModuleType.C_BUILTIN: + # integrated builtin module + return found_spec._replace(location=None) + elif found_spec.type == spec.ModuleType.PKG_DIRECTORY: + assert found_spec.location is not None + location = _has_init(found_spec.location) + return found_spec._replace(location=location, type=spec.ModuleType.PY_SOURCE) + return found_spec + + +def _is_python_file(filename: str) -> bool: + """Return true if the given filename should be considered as a python file. + + .pyc and .pyo are ignored + """ + return filename.endswith((".py", ".so", ".pyd", ".pyw")) + + +def _has_init(directory: str) -> str | None: + """If the given directory has a valid __init__ file, return its path, + else return None. + """ + mod_or_pack = os.path.join(directory, "__init__") + for ext in PY_SOURCE_EXTS + ("pyc", "pyo"): + if os.path.exists(mod_or_pack + "." + ext): + return mod_or_pack + "." + ext + return None + + +def is_namespace(specobj: spec.ModuleSpec) -> bool: + return specobj.type == spec.ModuleType.PY_NAMESPACE + + +def is_directory(specobj: spec.ModuleSpec) -> bool: + return specobj.type == spec.ModuleType.PKG_DIRECTORY + + +def is_module_name_part_of_extension_package_whitelist( + module_name: str, package_whitelist: set[str] +) -> bool: + """ + Returns True if one part of the module name is in the package whitelist. + + >>> is_module_name_part_of_extension_package_whitelist('numpy.core.umath', {'numpy'}) + True + """ + parts = module_name.split(".") + return any( + ".".join(parts[:x]) in package_whitelist for x in range(1, len(parts) + 1) + ) diff --git a/venv/lib/python3.10/site-packages/astroid/node_classes.py b/venv/lib/python3.10/site-packages/astroid/node_classes.py new file mode 100644 index 00000000..9ea1e8d2 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/node_classes.py @@ -0,0 +1,99 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +# pylint: disable=unused-import + +import warnings + +from astroid.nodes.node_classes import ( # pylint: disable=redefined-builtin (Ellipsis) + CONST_CLS, + AnnAssign, + Arguments, + Assert, + Assign, + AssignAttr, + AssignName, + AsyncFor, + AsyncWith, + Attribute, + AugAssign, + Await, + BaseContainer, + BinOp, + BoolOp, + Break, + Call, + Compare, + Comprehension, + Const, + Continue, + Decorators, + DelAttr, + Delete, + DelName, + Dict, + DictUnpack, + Ellipsis, + EmptyNode, + EvaluatedObject, + ExceptHandler, + Expr, + ExtSlice, + For, + FormattedValue, + Global, + If, + IfExp, + Import, + ImportFrom, + Index, + JoinedStr, + Keyword, + List, + LookupMixIn, + Match, + MatchAs, + MatchCase, + MatchClass, + MatchMapping, + MatchOr, + MatchSequence, + MatchSingleton, + MatchStar, + MatchValue, + Name, + NamedExpr, + NodeNG, + Nonlocal, + Pass, + Pattern, + Raise, + Return, + Set, + Slice, + Starred, + Subscript, + TryExcept, + TryFinally, + Tuple, + UnaryOp, + Unknown, + While, + With, + Yield, + YieldFrom, + are_exclusive, + const_factory, + unpack_infer, +) + +# We cannot create a __all__ here because it would create a circular import +# Please remove astroid/scoped_nodes.py|astroid/node_classes.py in autoflake +# exclude when removing this file. +warnings.warn( + "The 'astroid.node_classes' module is deprecated and will be replaced by " + "'astroid.nodes' in astroid 3.0.0", + DeprecationWarning, + stacklevel=2, +) diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/__init__.py b/venv/lib/python3.10/site-packages/astroid/nodes/__init__.py new file mode 100644 index 00000000..b527ff7c --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/nodes/__init__.py @@ -0,0 +1,302 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""Every available node class. + +.. seealso:: + :doc:`ast documentation ` + +All nodes inherit from :class:`~astroid.nodes.node_classes.NodeNG`. +""" + +# Nodes not present in the builtin ast module: DictUnpack, Unknown, and EvaluatedObject. + +# This is the only node we re-export from the private _base_nodes module. This +# is because it was originally part of the public API and hasn't been deprecated. +from astroid.nodes._base_nodes import Statement +from astroid.nodes.node_classes import ( # pylint: disable=redefined-builtin (Ellipsis) + CONST_CLS, + AnnAssign, + Arguments, + Assert, + Assign, + AssignAttr, + AssignName, + AsyncFor, + AsyncWith, + Attribute, + AugAssign, + Await, + BaseContainer, + BinOp, + BoolOp, + Break, + Call, + Compare, + Comprehension, + Const, + Continue, + Decorators, + DelAttr, + Delete, + DelName, + Dict, + DictUnpack, + Ellipsis, + EmptyNode, + EvaluatedObject, + ExceptHandler, + Expr, + ExtSlice, + For, + FormattedValue, + Global, + If, + IfExp, + Import, + ImportFrom, + Index, + JoinedStr, + Keyword, + List, + Match, + MatchAs, + MatchCase, + MatchClass, + MatchMapping, + MatchOr, + MatchSequence, + MatchSingleton, + MatchStar, + MatchValue, + Name, + NamedExpr, + NodeNG, + Nonlocal, + Pass, + Pattern, + Raise, + Return, + Set, + Slice, + Starred, + Subscript, + TryExcept, + TryFinally, + TryStar, + Tuple, + UnaryOp, + Unknown, + While, + With, + Yield, + YieldFrom, + are_exclusive, + const_factory, + unpack_infer, +) +from astroid.nodes.scoped_nodes import ( + AsyncFunctionDef, + ClassDef, + ComprehensionScope, + DictComp, + FunctionDef, + GeneratorExp, + Lambda, + ListComp, + LocalsDictNodeNG, + Module, + SetComp, + builtin_lookup, + function_to_method, + get_wrapping_class, +) +from astroid.nodes.utils import Position + +_BaseContainer = BaseContainer # TODO Remove for astroid 3.0 + +ALL_NODE_CLASSES = ( + _BaseContainer, + BaseContainer, + AnnAssign, + Arguments, + Assert, + Assign, + AssignAttr, + AssignName, + AsyncFor, + AsyncFunctionDef, + AsyncWith, + Attribute, + AugAssign, + Await, + BinOp, + BoolOp, + Break, + Call, + ClassDef, + Compare, + Comprehension, + ComprehensionScope, + Const, + const_factory, + Continue, + Decorators, + DelAttr, + Delete, + DelName, + Dict, + DictComp, + DictUnpack, + Ellipsis, + EmptyNode, + EvaluatedObject, + ExceptHandler, + Expr, + ExtSlice, + For, + FormattedValue, + FunctionDef, + GeneratorExp, + Global, + If, + IfExp, + Import, + ImportFrom, + Index, + JoinedStr, + Keyword, + Lambda, + List, + ListComp, + LocalsDictNodeNG, + Match, + MatchAs, + MatchCase, + MatchClass, + MatchMapping, + MatchOr, + MatchSequence, + MatchSingleton, + MatchStar, + MatchValue, + Module, + Name, + NamedExpr, + NodeNG, + Nonlocal, + Pass, + Pattern, + Raise, + Return, + Set, + SetComp, + Slice, + Starred, + Subscript, + TryExcept, + TryFinally, + Tuple, + UnaryOp, + Unknown, + While, + With, + Yield, + YieldFrom, +) + +__all__ = ( + "AnnAssign", + "are_exclusive", + "Arguments", + "Assert", + "Assign", + "AssignAttr", + "AssignName", + "AsyncFor", + "AsyncFunctionDef", + "AsyncWith", + "Attribute", + "AugAssign", + "Await", + "BinOp", + "BoolOp", + "Break", + "builtin_lookup", + "Call", + "ClassDef", + "CONST_CLS", + "Compare", + "Comprehension", + "ComprehensionScope", + "Const", + "const_factory", + "Continue", + "Decorators", + "DelAttr", + "Delete", + "DelName", + "Dict", + "DictComp", + "DictUnpack", + "Ellipsis", + "EmptyNode", + "EvaluatedObject", + "ExceptHandler", + "Expr", + "ExtSlice", + "For", + "FormattedValue", + "FunctionDef", + "function_to_method", + "GeneratorExp", + "get_wrapping_class", + "Global", + "If", + "IfExp", + "Import", + "ImportFrom", + "Index", + "JoinedStr", + "Keyword", + "Lambda", + "List", + "ListComp", + "LocalsDictNodeNG", + "Match", + "MatchAs", + "MatchCase", + "MatchClass", + "MatchMapping", + "MatchOr", + "MatchSequence", + "MatchSingleton", + "MatchStar", + "MatchValue", + "Module", + "Name", + "NamedExpr", + "NodeNG", + "Nonlocal", + "Pass", + "Position", + "Raise", + "Return", + "Set", + "SetComp", + "Slice", + "Starred", + "Statement", + "Subscript", + "TryExcept", + "TryFinally", + "Tuple", + "UnaryOp", + "Unknown", + "unpack_infer", + "While", + "With", + "Yield", + "YieldFrom", +) diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/__pycache__/__init__.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/nodes/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c306edb14d46320f729cb36b630a70e27dc2979 GIT binary patch literal 3574 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 km0x#+%xozc_V_6#xJL literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/__pycache__/node_classes.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/nodes/__pycache__/node_classes.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..528d28c6015bfa308426dd113c4a5c4b37f513a6 GIT binary patch literal 122590 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 TK=U=IVKSCIo0*@ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/__pycache__/node_ng.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/nodes/__pycache__/node_ng.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8efa696379b92c6089bf4ee19720c208d0d99e5 GIT binary patch literal 23166 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/__pycache__/utils.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/nodes/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b16a0da01e4e7939ad1d353a484283dcdb0d988 GIT binary patch literal 542 zcmY*W%}(4f5Vqs&5=9GKcz_^r*-ETSdtFs_1xI5A$fq8({wzL{_2`LW&H%o!o%>2B|#__

BK}WOj1EyDw>#nitN`yHaXPiQnLsUl_a1D`IL zPW3<~Q?l}G?bEd%OoYBy<@UA$!$Z#hDflayvjMl(91D`qxkVd$5wfy*w5 bQ^fN3dEU@A=0Y}o+wKd+$i+_|r912uQm&2h literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/_base_nodes.py b/venv/lib/python3.10/site-packages/astroid/nodes/_base_nodes.py new file mode 120000 index 00000000..c8cb813f --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/nodes/_base_nodes.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/a1/0e/2e/79ac5be7e2409c6d70d7b94af13468e31b3729ab47ad8f7ce4cd2a82cb \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/as_string.py b/venv/lib/python3.10/site-packages/astroid/nodes/as_string.py new file mode 120000 index 00000000..0d6c5483 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/nodes/as_string.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/8b/8b/39/3371a169e7f477e260aa2e4d90fcfc0187171b764becddc73d866ca7fd \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/const.py b/venv/lib/python3.10/site-packages/astroid/nodes/const.py new file mode 120000 index 00000000..b367eaf1 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/nodes/const.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/8b/24/27/feffb01332bab9773e7443289623d5491cb4359f13dd79afbcf5cbb8fe \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/node_classes.py b/venv/lib/python3.10/site-packages/astroid/nodes/node_classes.py new file mode 100644 index 00000000..b7772c3c --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/nodes/node_classes.py @@ -0,0 +1,5643 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""Module for some node classes. More nodes in scoped_nodes.py""" + +from __future__ import annotations + +import abc +import itertools +import sys +import typing +import warnings +from collections.abc import Generator, Iterable, Mapping +from functools import lru_cache +from typing import TYPE_CHECKING, Any, Callable, ClassVar, Optional, TypeVar, Union + +from astroid import decorators, util +from astroid.bases import Instance, _infer_stmts +from astroid.const import _EMPTY_OBJECT_MARKER, Context +from astroid.context import InferenceContext +from astroid.exceptions import ( + AstroidIndexError, + AstroidTypeError, + AstroidValueError, + InferenceError, + NoDefault, + ParentMissingError, +) +from astroid.manager import AstroidManager +from astroid.nodes import _base_nodes +from astroid.nodes.const import OP_PRECEDENCE +from astroid.nodes.node_ng import NodeNG +from astroid.typing import ( + ConstFactoryResult, + InferBinaryOp, + InferenceErrorInfo, + InferenceResult, + SuccessfulInferenceResult, +) + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from typing_extensions import Literal + +if TYPE_CHECKING: + from astroid import nodes + from astroid.nodes import LocalsDictNodeNG + +if sys.version_info >= (3, 8): + from functools import cached_property +else: + from astroid.decorators import cachedproperty as cached_property + + +def _is_const(value) -> bool: + return isinstance(value, tuple(CONST_CLS)) + + +_NodesT = TypeVar("_NodesT", bound=NodeNG) +_BadOpMessageT = TypeVar("_BadOpMessageT", bound=util.BadOperationMessage) + +AssignedStmtsPossibleNode = Union["List", "Tuple", "AssignName", "AssignAttr", None] +AssignedStmtsCall = Callable[ + [ + _NodesT, + AssignedStmtsPossibleNode, + Optional[InferenceContext], + Optional[typing.List[int]], + ], + Any, +] +InferBinaryOperation = Callable[ + [_NodesT, Optional[InferenceContext]], + typing.Generator[Union[InferenceResult, _BadOpMessageT], None, None], +] +InferLHS = Callable[ + [_NodesT, Optional[InferenceContext]], + typing.Generator[InferenceResult, None, Optional[InferenceErrorInfo]], +] +InferUnaryOp = Callable[[_NodesT, str], ConstFactoryResult] + + +@decorators.raise_if_nothing_inferred +def unpack_infer(stmt, context: InferenceContext | None = None): + """recursively generate nodes inferred by the given statement. + If the inferred value is a list or a tuple, recurse on the elements + """ + if isinstance(stmt, (List, Tuple)): + for elt in stmt.elts: + if elt is util.Uninferable: + yield elt + continue + yield from unpack_infer(elt, context) + return {"node": stmt, "context": context} + # if inferred is a final node, return it and stop + inferred = next(stmt.infer(context), util.Uninferable) + if inferred is stmt: + yield inferred + return {"node": stmt, "context": context} + # else, infer recursively, except Uninferable object that should be returned as is + for inferred in stmt.infer(context): + if isinstance(inferred, util.UninferableBase): + yield inferred + else: + yield from unpack_infer(inferred, context) + + return {"node": stmt, "context": context} + + +def are_exclusive(stmt1, stmt2, exceptions: list[str] | None = None) -> bool: + """return true if the two given statements are mutually exclusive + + `exceptions` may be a list of exception names. If specified, discard If + branches and check one of the statement is in an exception handler catching + one of the given exceptions. + + algorithm : + 1) index stmt1's parents + 2) climb among stmt2's parents until we find a common parent + 3) if the common parent is a If or TryExcept statement, look if nodes are + in exclusive branches + """ + # index stmt1's parents + stmt1_parents = {} + children = {} + previous = stmt1 + for node in stmt1.node_ancestors(): + stmt1_parents[node] = 1 + children[node] = previous + previous = node + # climb among stmt2's parents until we find a common parent + previous = stmt2 + for node in stmt2.node_ancestors(): + if node in stmt1_parents: + # if the common parent is a If or TryExcept statement, look if + # nodes are in exclusive branches + if isinstance(node, If) and exceptions is None: + c2attr, c2node = node.locate_child(previous) + c1attr, c1node = node.locate_child(children[node]) + if "test" in (c1attr, c2attr): + # If any node is `If.test`, then it must be inclusive with + # the other node (`If.body` and `If.orelse`) + return False + if c1attr != c2attr: + # different `If` branches (`If.body` and `If.orelse`) + return True + elif isinstance(node, TryExcept): + c2attr, c2node = node.locate_child(previous) + c1attr, c1node = node.locate_child(children[node]) + if c1node is not c2node: + first_in_body_caught_by_handlers = ( + c2attr == "handlers" + and c1attr == "body" + and previous.catch(exceptions) + ) + second_in_body_caught_by_handlers = ( + c2attr == "body" + and c1attr == "handlers" + and children[node].catch(exceptions) + ) + first_in_else_other_in_handlers = ( + c2attr == "handlers" and c1attr == "orelse" + ) + second_in_else_other_in_handlers = ( + c2attr == "orelse" and c1attr == "handlers" + ) + if any( + ( + first_in_body_caught_by_handlers, + second_in_body_caught_by_handlers, + first_in_else_other_in_handlers, + second_in_else_other_in_handlers, + ) + ): + return True + elif c2attr == "handlers" and c1attr == "handlers": + return previous is not children[node] + return False + previous = node + return False + + +# getitem() helpers. + +_SLICE_SENTINEL = object() + + +def _slice_value(index, context: InferenceContext | None = None): + """Get the value of the given slice index.""" + + if isinstance(index, Const): + if isinstance(index.value, (int, type(None))): + return index.value + elif index is None: + return None + else: + # Try to infer what the index actually is. + # Since we can't return all the possible values, + # we'll stop at the first possible value. + try: + inferred = next(index.infer(context=context)) + except (InferenceError, StopIteration): + pass + else: + if isinstance(inferred, Const): + if isinstance(inferred.value, (int, type(None))): + return inferred.value + + # Use a sentinel, because None can be a valid + # value that this function can return, + # as it is the case for unspecified bounds. + return _SLICE_SENTINEL + + +def _infer_slice(node, context: InferenceContext | None = None): + lower = _slice_value(node.lower, context) + upper = _slice_value(node.upper, context) + step = _slice_value(node.step, context) + if all(elem is not _SLICE_SENTINEL for elem in (lower, upper, step)): + return slice(lower, upper, step) + + raise AstroidTypeError( + message="Could not infer slice used in subscript", + node=node, + index=node.parent, + context=context, + ) + + +def _container_getitem(instance, elts, index, context: InferenceContext | None = None): + """Get a slice or an item, using the given *index*, for the given sequence.""" + try: + if isinstance(index, Slice): + index_slice = _infer_slice(index, context=context) + new_cls = instance.__class__() + new_cls.elts = elts[index_slice] + new_cls.parent = instance.parent + return new_cls + if isinstance(index, Const): + return elts[index.value] + except ValueError as exc: + raise AstroidValueError( + message="Slice {index!r} cannot index container", + node=instance, + index=index, + context=context, + ) from exc + except IndexError as exc: + raise AstroidIndexError( + message="Index {index!s} out of range", + node=instance, + index=index, + context=context, + ) from exc + except TypeError as exc: + raise AstroidTypeError( + message="Type error {error!r}", node=instance, index=index, context=context + ) from exc + + raise AstroidTypeError(f"Could not use {index} as subscript index") + + +class BaseContainer(_base_nodes.ParentAssignNode, Instance, metaclass=abc.ABCMeta): + """Base class for Set, FrozenSet, Tuple and List.""" + + _astroid_fields = ("elts",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.elts: list[NodeNG] = [] + """The elements in the node.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, elts: list[NodeNG]) -> None: + """Do some setup after initialisation. + + :param elts: The list of elements the that node contains. + """ + self.elts = elts + + @classmethod + def from_elements(cls, elts=None): + """Create a node of this type from the given list of elements. + + :param elts: The list of elements that the node should contain. + :type elts: list(NodeNG) + + :returns: A new node containing the given elements. + :rtype: NodeNG + """ + node = cls() + if elts is None: + node.elts = [] + else: + node.elts = [const_factory(e) if _is_const(e) else e for e in elts] + return node + + def itered(self): + """An iterator over the elements this node contains. + + :returns: The contents of this node. + :rtype: iterable(NodeNG) + """ + return self.elts + + def bool_value(self, context: InferenceContext | None = None) -> bool: + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + """ + return bool(self.elts) + + @abc.abstractmethod + def pytype(self) -> str: + """Get the name of the type that this node represents. + + :returns: The name of the type. + """ + + def get_children(self): + yield from self.elts + + +# TODO: Move into _base_nodes. Blocked by import of _infer_stmts from bases. +class LookupMixIn(NodeNG): + """Mixin to look up a name in the right scope.""" + + @lru_cache() # noqa + def lookup(self, name: str) -> tuple[LocalsDictNodeNG, list[NodeNG]]: + """Lookup where the given variable is assigned. + + The lookup starts from self's scope. If self is not a frame itself + and the name is found in the inner frame locals, statements will be + filtered to remove ignorable statements according to self's location. + + :param name: The name of the variable to find assignments for. + + :returns: The scope node and the list of assignments associated to the + given name according to the scope where it has been found (locals, + globals or builtin). + """ + return self.scope().scope_lookup(self, name) + + def ilookup(self, name): + """Lookup the inferred values of the given variable. + + :param name: The variable name to find values for. + :type name: str + + :returns: The inferred values of the statements returned from + :meth:`lookup`. + :rtype: iterable + """ + frame, stmts = self.lookup(name) + context = InferenceContext() + return _infer_stmts(stmts, context, frame) + + +# Name classes + + +class AssignName(_base_nodes.NoChildrenNode, LookupMixIn, _base_nodes.ParentAssignNode): + """Variation of :class:`ast.Assign` representing assignment to a name. + + An :class:`AssignName` is the name of something that is assigned to. + This includes variables defined in a function signature or in a loop. + + >>> import astroid + >>> node = astroid.extract_node('variable = range(10)') + >>> node + + >>> list(node.get_children()) + [, ] + >>> list(node.get_children())[0].as_string() + 'variable' + """ + + _other_fields = ("name",) + + infer_lhs: ClassVar[InferLHS[AssignName]] + + @decorators.deprecate_default_argument_values(name="str") + def __init__( + self, + name: str | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param name: The name that is assigned to. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.name: str | None = name + """The name that is assigned to.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + assigned_stmts: ClassVar[AssignedStmtsCall[AssignName]] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + +class DelName(_base_nodes.NoChildrenNode, LookupMixIn, _base_nodes.ParentAssignNode): + """Variation of :class:`ast.Delete` representing deletion of a name. + + A :class:`DelName` is the name of something that is deleted. + + >>> import astroid + >>> node = astroid.extract_node("del variable #@") + >>> list(node.get_children()) + [] + >>> list(node.get_children())[0].as_string() + 'variable' + """ + + _other_fields = ("name",) + + @decorators.deprecate_default_argument_values(name="str") + def __init__( + self, + name: str | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param name: The name that is being deleted. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.name: str | None = name + """The name that is being deleted.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + +class Name(_base_nodes.NoChildrenNode, LookupMixIn): + """Class representing an :class:`ast.Name` node. + + A :class:`Name` node is something that is named, but not covered by + :class:`AssignName` or :class:`DelName`. + + >>> import astroid + >>> node = astroid.extract_node('range(10)') + >>> node + + >>> list(node.get_children()) + [, ] + >>> list(node.get_children())[0].as_string() + 'range' + """ + + _other_fields = ("name",) + + @decorators.deprecate_default_argument_values(name="str") + def __init__( + self, + name: str | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param name: The name that this node refers to. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.name: str | None = name + """The name that this node refers to.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def _get_name_nodes(self): + yield self + + for child_node in self.get_children(): + yield from child_node._get_name_nodes() + + +class Arguments(_base_nodes.AssignTypeNode): + """Class representing an :class:`ast.arguments` node. + + An :class:`Arguments` node represents that arguments in a + function definition. + + >>> import astroid + >>> node = astroid.extract_node('def foo(bar): pass') + >>> node + + >>> node.args + + """ + + # Python 3.4+ uses a different approach regarding annotations, + # each argument is a new class, _ast.arg, which exposes an + # 'annotation' attribute. In astroid though, arguments are exposed + # as is in the Arguments node and the only way to expose annotations + # is by using something similar with Python 3.3: + # - we expose 'varargannotation' and 'kwargannotation' of annotations + # of varargs and kwargs. + # - we expose 'annotation', a list with annotations for + # for each normal argument. If an argument doesn't have an + # annotation, its value will be None. + _astroid_fields = ( + "args", + "defaults", + "kwonlyargs", + "posonlyargs", + "posonlyargs_annotations", + "kw_defaults", + "annotations", + "varargannotation", + "kwargannotation", + "kwonlyargs_annotations", + "type_comment_args", + "type_comment_kwonlyargs", + "type_comment_posonlyargs", + ) + + _other_fields = ("vararg", "kwarg") + + lineno: None + col_offset: None + end_lineno: None + end_col_offset: None + + def __init__( + self, + vararg: str | None = None, + kwarg: str | None = None, + parent: NodeNG | None = None, + ) -> None: + """ + :param vararg: The name of the variable length arguments. + + :param kwarg: The name of the variable length keyword arguments. + + :param parent: The parent node in the syntax tree. + """ + super().__init__(parent=parent) + + self.vararg: str | None = vararg # can be None + """The name of the variable length arguments.""" + + self.kwarg: str | None = kwarg # can be None + """The name of the variable length keyword arguments.""" + + self.args: list[AssignName] | None + """The names of the required arguments. + + Can be None if the associated function does not have a retrievable + signature and the arguments are therefore unknown. + This can happen with (builtin) functions implemented in C that have + incomplete signature information. + """ + # TODO: Check if other attributes should also be None when + # .args is None. + + self.defaults: list[NodeNG] | None + """The default values for arguments that can be passed positionally.""" + + self.kwonlyargs: list[AssignName] + """The keyword arguments that cannot be passed positionally.""" + + self.posonlyargs: list[AssignName] = [] + """The arguments that can only be passed positionally.""" + + self.kw_defaults: list[NodeNG | None] | None + """ + The default values for keyword arguments that cannot be passed positionally. + + See .args for why this can be None. + """ + + self.annotations: list[NodeNG | None] + """The type annotations of arguments that can be passed positionally.""" + + self.posonlyargs_annotations: list[NodeNG | None] = [] + """The type annotations of arguments that can only be passed positionally.""" + + self.kwonlyargs_annotations: list[NodeNG | None] = [] + """The type annotations of arguments that cannot be passed positionally.""" + + self.type_comment_args: list[NodeNG | None] = [] + """The type annotation, passed by a type comment, of each argument. + + If an argument does not have a type comment, + the value for that argument will be None. + """ + + self.type_comment_kwonlyargs: list[NodeNG | None] = [] + """The type annotation, passed by a type comment, of each keyword only argument. + + If an argument does not have a type comment, + the value for that argument will be None. + """ + + self.type_comment_posonlyargs: list[NodeNG | None] = [] + """The type annotation, passed by a type comment, of each positional argument. + + If an argument does not have a type comment, + the value for that argument will be None. + """ + + self.varargannotation: NodeNG | None = None # can be None + """The type annotation for the variable length arguments.""" + + self.kwargannotation: NodeNG | None = None # can be None + """The type annotation for the variable length keyword arguments.""" + + # pylint: disable=too-many-arguments + def postinit( + self, + args: list[AssignName] | None, + defaults: list[NodeNG] | None, + kwonlyargs: list[AssignName], + kw_defaults: list[NodeNG | None] | None, + annotations: list[NodeNG | None], + posonlyargs: list[AssignName] | None = None, + kwonlyargs_annotations: list[NodeNG | None] | None = None, + posonlyargs_annotations: list[NodeNG | None] | None = None, + varargannotation: NodeNG | None = None, + kwargannotation: NodeNG | None = None, + type_comment_args: list[NodeNG | None] | None = None, + type_comment_kwonlyargs: list[NodeNG | None] | None = None, + type_comment_posonlyargs: list[NodeNG | None] | None = None, + ) -> None: + """Do some setup after initialisation. + + :param args: The names of the required arguments. + + :param defaults: The default values for arguments that can be passed + positionally. + + :param kwonlyargs: The keyword arguments that cannot be passed + positionally. + + :param posonlyargs: The arguments that can only be passed + positionally. + + :param kw_defaults: The default values for keyword arguments that + cannot be passed positionally. + + :param annotations: The type annotations of arguments that can be + passed positionally. + + :param kwonlyargs_annotations: The type annotations of arguments that + cannot be passed positionally. This should always be passed in + Python 3. + + :param posonlyargs_annotations: The type annotations of arguments that + can only be passed positionally. This should always be passed in + Python 3. + + :param varargannotation: The type annotation for the variable length + arguments. + + :param kwargannotation: The type annotation for the variable length + keyword arguments. + + :param type_comment_args: The type annotation, + passed by a type comment, of each argument. + + :param type_comment_args: The type annotation, + passed by a type comment, of each keyword only argument. + + :param type_comment_args: The type annotation, + passed by a type comment, of each positional argument. + """ + self.args = args + self.defaults = defaults + self.kwonlyargs = kwonlyargs + if posonlyargs is not None: + self.posonlyargs = posonlyargs + self.kw_defaults = kw_defaults + self.annotations = annotations + if kwonlyargs_annotations is not None: + self.kwonlyargs_annotations = kwonlyargs_annotations + if posonlyargs_annotations is not None: + self.posonlyargs_annotations = posonlyargs_annotations + self.varargannotation = varargannotation + self.kwargannotation = kwargannotation + if type_comment_args is not None: + self.type_comment_args = type_comment_args + if type_comment_kwonlyargs is not None: + self.type_comment_kwonlyargs = type_comment_kwonlyargs + if type_comment_posonlyargs is not None: + self.type_comment_posonlyargs = type_comment_posonlyargs + + assigned_stmts: ClassVar[AssignedStmtsCall[Arguments]] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + def _infer_name(self, frame, name): + if self.parent is frame: + return name + return None + + @cached_property + def fromlineno(self): + """The first line that this node appears on in the source code. + + :type: int or None + """ + lineno = super().fromlineno + return max(lineno, self.parent.fromlineno or 0) + + @cached_property + def arguments(self): + """Get all the arguments for this node, including positional only and positional and keyword""" + return list(itertools.chain((self.posonlyargs or ()), self.args or ())) + + def format_args(self, *, skippable_names: set[str] | None = None) -> str: + """Get the arguments formatted as string. + + :returns: The formatted arguments. + :rtype: str + """ + result = [] + positional_only_defaults = [] + positional_or_keyword_defaults = self.defaults + if self.defaults: + args = self.args or [] + positional_or_keyword_defaults = self.defaults[-len(args) :] + positional_only_defaults = self.defaults[: len(self.defaults) - len(args)] + + if self.posonlyargs: + result.append( + _format_args( + self.posonlyargs, + positional_only_defaults, + self.posonlyargs_annotations, + skippable_names=skippable_names, + ) + ) + result.append("/") + if self.args: + result.append( + _format_args( + self.args, + positional_or_keyword_defaults, + getattr(self, "annotations", None), + skippable_names=skippable_names, + ) + ) + if self.vararg: + result.append(f"*{self.vararg}") + if self.kwonlyargs: + if not self.vararg: + result.append("*") + result.append( + _format_args( + self.kwonlyargs, + self.kw_defaults, + self.kwonlyargs_annotations, + skippable_names=skippable_names, + ) + ) + if self.kwarg: + result.append(f"**{self.kwarg}") + return ", ".join(result) + + def _get_arguments_data( + self, + ) -> tuple[ + dict[str, tuple[str | None, str | None]], + dict[str, tuple[str | None, str | None]], + ]: + """Get the arguments as dictionary with information about typing and defaults. + + The return tuple contains a dictionary for positional and keyword arguments with their typing + and their default value, if any. + The method follows a similar order as format_args but instead of formatting into a string it + returns the data that is used to do so. + """ + pos_only: dict[str, tuple[str | None, str | None]] = {} + kw_only: dict[str, tuple[str | None, str | None]] = {} + + # Setup and match defaults with arguments + positional_only_defaults = [] + positional_or_keyword_defaults = self.defaults + if self.defaults: + args = self.args or [] + positional_or_keyword_defaults = self.defaults[-len(args) :] + positional_only_defaults = self.defaults[: len(self.defaults) - len(args)] + + for index, posonly in enumerate(self.posonlyargs): + annotation, default = self.posonlyargs_annotations[index], None + if annotation is not None: + annotation = annotation.as_string() + if positional_only_defaults: + default = positional_only_defaults[index].as_string() + pos_only[posonly.name] = (annotation, default) + + for index, arg in enumerate(self.args): + annotation, default = self.annotations[index], None + if annotation is not None: + annotation = annotation.as_string() + if positional_or_keyword_defaults: + defaults_offset = len(self.args) - len(positional_or_keyword_defaults) + default_index = index - defaults_offset + if ( + default_index > -1 + and positional_or_keyword_defaults[default_index] is not None + ): + default = positional_or_keyword_defaults[default_index].as_string() + pos_only[arg.name] = (annotation, default) + + if self.vararg: + annotation = self.varargannotation + if annotation is not None: + annotation = annotation.as_string() + pos_only[self.vararg] = (annotation, None) + + for index, kwarg in enumerate(self.kwonlyargs): + annotation = self.kwonlyargs_annotations[index] + if annotation is not None: + annotation = annotation.as_string() + default = self.kw_defaults[index] + if default is not None: + default = default.as_string() + kw_only[kwarg.name] = (annotation, default) + + if self.kwarg: + annotation = self.kwargannotation + if annotation is not None: + annotation = annotation.as_string() + kw_only[self.kwarg] = (annotation, None) + + return pos_only, kw_only + + def default_value(self, argname): + """Get the default value for an argument. + + :param argname: The name of the argument to get the default value for. + :type argname: str + + :raises NoDefault: If there is no default value defined for the + given argument. + """ + args = self.arguments + index = _find_arg(argname, args)[0] + if index is not None: + idx = index - (len(args) - len(self.defaults)) + if idx >= 0: + return self.defaults[idx] + index = _find_arg(argname, self.kwonlyargs)[0] + if index is not None and self.kw_defaults[index] is not None: + return self.kw_defaults[index] + raise NoDefault(func=self.parent, name=argname) + + def is_argument(self, name) -> bool: + """Check if the given name is defined in the arguments. + + :param name: The name to check for. + :type name: str + + :returns: Whether the given name is defined in the arguments, + """ + if name == self.vararg: + return True + if name == self.kwarg: + return True + return ( + self.find_argname(name, rec=True)[1] is not None + or self.kwonlyargs + and _find_arg(name, self.kwonlyargs, rec=True)[1] is not None + ) + + def find_argname(self, argname, rec=False): + """Get the index and :class:`AssignName` node for given name. + + :param argname: The name of the argument to search for. + :type argname: str + + :param rec: Whether or not to include arguments in unpacked tuples + in the search. + :type rec: bool + + :returns: The index and node for the argument. + :rtype: tuple(str or None, AssignName or None) + """ + if self.arguments: + return _find_arg(argname, self.arguments, rec) + return None, None + + def get_children(self): + yield from self.posonlyargs or () + + for elt in self.posonlyargs_annotations: + if elt is not None: + yield elt + + yield from self.args or () + + if self.defaults is not None: + yield from self.defaults + yield from self.kwonlyargs + + for elt in self.kw_defaults or (): + if elt is not None: + yield elt + + for elt in self.annotations: + if elt is not None: + yield elt + + if self.varargannotation is not None: + yield self.varargannotation + + if self.kwargannotation is not None: + yield self.kwargannotation + + for elt in self.kwonlyargs_annotations: + if elt is not None: + yield elt + + +def _find_arg(argname, args, rec=False): + for i, arg in enumerate(args): + if isinstance(arg, Tuple): + if rec: + found = _find_arg(argname, arg.elts) + if found[0] is not None: + return found + elif arg.name == argname: + return i, arg + return None, None + + +def _format_args( + args, defaults=None, annotations=None, skippable_names: set[str] | None = None +) -> str: + if skippable_names is None: + skippable_names = set() + values = [] + if args is None: + return "" + if annotations is None: + annotations = [] + if defaults is not None: + default_offset = len(args) - len(defaults) + packed = itertools.zip_longest(args, annotations) + for i, (arg, annotation) in enumerate(packed): + if arg.name in skippable_names: + continue + if isinstance(arg, Tuple): + values.append(f"({_format_args(arg.elts)})") + else: + argname = arg.name + default_sep = "=" + if annotation is not None: + argname += ": " + annotation.as_string() + default_sep = " = " + values.append(argname) + + if defaults is not None and i >= default_offset: + if defaults[i - default_offset] is not None: + values[-1] += default_sep + defaults[i - default_offset].as_string() + return ", ".join(values) + + +class AssignAttr(_base_nodes.ParentAssignNode): + """Variation of :class:`ast.Assign` representing assignment to an attribute. + + >>> import astroid + >>> node = astroid.extract_node('self.attribute = range(10)') + >>> node + + >>> list(node.get_children()) + [, ] + >>> list(node.get_children())[0].as_string() + 'self.attribute' + """ + + _astroid_fields = ("expr",) + _other_fields = ("attrname",) + + infer_lhs: ClassVar[InferLHS[AssignAttr]] + + @decorators.deprecate_default_argument_values(attrname="str") + def __init__( + self, + attrname: str | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param attrname: The name of the attribute being assigned to. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.expr: NodeNG | None = None + """What has the attribute that is being assigned to.""" + + self.attrname: str | None = attrname + """The name of the attribute being assigned to.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, expr: NodeNG | None = None) -> None: + """Do some setup after initialisation. + + :param expr: What has the attribute that is being assigned to. + """ + self.expr = expr + + assigned_stmts: ClassVar[AssignedStmtsCall[AssignAttr]] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + def get_children(self): + yield self.expr + + +class Assert(_base_nodes.Statement): + """Class representing an :class:`ast.Assert` node. + + An :class:`Assert` node represents an assert statement. + + >>> import astroid + >>> node = astroid.extract_node('assert len(things) == 10, "Not enough things"') + >>> node + + """ + + _astroid_fields = ("test", "fail") + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.test: NodeNG | None = None + """The test that passes or fails the assertion.""" + + self.fail: NodeNG | None = None # can be None + """The message shown when the assertion fails.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, test: NodeNG | None = None, fail: NodeNG | None = None) -> None: + """Do some setup after initialisation. + + :param test: The test that passes or fails the assertion. + + :param fail: The message shown when the assertion fails. + """ + self.fail = fail + self.test = test + + def get_children(self): + yield self.test + + if self.fail is not None: + yield self.fail + + +class Assign(_base_nodes.AssignTypeNode, _base_nodes.Statement): + """Class representing an :class:`ast.Assign` node. + + An :class:`Assign` is a statement where something is explicitly + asssigned to. + + >>> import astroid + >>> node = astroid.extract_node('variable = range(10)') + >>> node + + """ + + _astroid_fields = ("targets", "value") + _other_other_fields = ("type_annotation",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.targets: list[NodeNG] = [] + """What is being assigned to.""" + + self.value: NodeNG | None = None + """The value being assigned to the variables.""" + + self.type_annotation: NodeNG | None = None # can be None + """If present, this will contain the type annotation passed by a type comment""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + targets: list[NodeNG] | None = None, + value: NodeNG | None = None, + type_annotation: NodeNG | None = None, + ) -> None: + """Do some setup after initialisation. + + :param targets: What is being assigned to. + :param value: The value being assigned to the variables. + :param type_annotation: + """ + if targets is not None: + self.targets = targets + self.value = value + self.type_annotation = type_annotation + + assigned_stmts: ClassVar[AssignedStmtsCall[Assign]] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + def get_children(self): + yield from self.targets + + yield self.value + + @decorators.cached + def _get_assign_nodes(self): + return [self] + list(self.value._get_assign_nodes()) + + def _get_yield_nodes_skip_lambdas(self): + yield from self.value._get_yield_nodes_skip_lambdas() + + +class AnnAssign(_base_nodes.AssignTypeNode, _base_nodes.Statement): + """Class representing an :class:`ast.AnnAssign` node. + + An :class:`AnnAssign` is an assignment with a type annotation. + + >>> import astroid + >>> node = astroid.extract_node('variable: List[int] = range(10)') + >>> node + + """ + + _astroid_fields = ("target", "annotation", "value") + _other_fields = ("simple",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.target: NodeNG | None = None + """What is being assigned to.""" + + self.annotation: NodeNG | None = None + """The type annotation of what is being assigned to.""" + + self.value: NodeNG | None = None # can be None + """The value being assigned to the variables.""" + + self.simple: int | None = None + """Whether :attr:`target` is a pure name or a complex statement.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + target: NodeNG, + annotation: NodeNG, + simple: int, + value: NodeNG | None = None, + ) -> None: + """Do some setup after initialisation. + + :param target: What is being assigned to. + + :param annotation: The type annotation of what is being assigned to. + + :param simple: Whether :attr:`target` is a pure name + or a complex statement. + + :param value: The value being assigned to the variables. + """ + self.target = target + self.annotation = annotation + self.value = value + self.simple = simple + + assigned_stmts: ClassVar[AssignedStmtsCall[AnnAssign]] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + def get_children(self): + yield self.target + yield self.annotation + + if self.value is not None: + yield self.value + + +class AugAssign(_base_nodes.AssignTypeNode, _base_nodes.Statement): + """Class representing an :class:`ast.AugAssign` node. + + An :class:`AugAssign` is an assignment paired with an operator. + + >>> import astroid + >>> node = astroid.extract_node('variable += 1') + >>> node + + """ + + _astroid_fields = ("target", "value") + _other_fields = ("op",) + + @decorators.deprecate_default_argument_values(op="str") + def __init__( + self, + op: str | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param op: The operator that is being combined with the assignment. + This includes the equals sign. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.target: NodeNG | None = None + """What is being assigned to.""" + + self.op: str | None = op + """The operator that is being combined with the assignment. + + This includes the equals sign. + """ + + self.value: NodeNG | None = None + """The value being assigned to the variable.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, target: NodeNG | None = None, value: NodeNG | None = None + ) -> None: + """Do some setup after initialisation. + + :param target: What is being assigned to. + + :param value: The value being assigned to the variable. + """ + self.target = target + self.value = value + + assigned_stmts: ClassVar[AssignedStmtsCall[AugAssign]] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + # This is set by inference.py + _infer_augassign: ClassVar[ + InferBinaryOperation[AugAssign, util.BadBinaryOperationMessage] + ] + + def type_errors(self, context: InferenceContext | None = None): + """Get a list of type errors which can occur during inference. + + Each TypeError is represented by a :class:`BadBinaryOperationMessage` , + which holds the original exception. + + :returns: The list of possible type errors. + :rtype: list(BadBinaryOperationMessage) + """ + try: + results = self._infer_augassign(context=context) + return [ + result + for result in results + if isinstance(result, util.BadBinaryOperationMessage) + ] + except InferenceError: + return [] + + def get_children(self): + yield self.target + yield self.value + + def _get_yield_nodes_skip_lambdas(self): + """An AugAssign node can contain a Yield node in the value""" + yield from self.value._get_yield_nodes_skip_lambdas() + yield from super()._get_yield_nodes_skip_lambdas() + + +class BinOp(NodeNG): + """Class representing an :class:`ast.BinOp` node. + + A :class:`BinOp` node is an application of a binary operator. + + >>> import astroid + >>> node = astroid.extract_node('a + b') + >>> node + + """ + + _astroid_fields = ("left", "right") + _other_fields = ("op",) + + @decorators.deprecate_default_argument_values(op="str") + def __init__( + self, + op: str | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param op: The operator. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.left: NodeNG | None = None + """What is being applied to the operator on the left side.""" + + self.op: str | None = op + """The operator.""" + + self.right: NodeNG | None = None + """What is being applied to the operator on the right side.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, left: NodeNG | None = None, right: NodeNG | None = None) -> None: + """Do some setup after initialisation. + + :param left: What is being applied to the operator on the left side. + + :param right: What is being applied to the operator on the right side. + """ + self.left = left + self.right = right + + # This is set by inference.py + _infer_binop: ClassVar[InferBinaryOperation[BinOp, util.BadBinaryOperationMessage]] + + def type_errors(self, context: InferenceContext | None = None): + """Get a list of type errors which can occur during inference. + + Each TypeError is represented by a :class:`BadBinaryOperationMessage`, + which holds the original exception. + + :returns: The list of possible type errors. + :rtype: list(BadBinaryOperationMessage) + """ + try: + results = self._infer_binop(context=context) + return [ + result + for result in results + if isinstance(result, util.BadBinaryOperationMessage) + ] + except InferenceError: + return [] + + def get_children(self): + yield self.left + yield self.right + + def op_precedence(self): + return OP_PRECEDENCE[self.op] + + def op_left_associative(self) -> bool: + # 2**3**4 == 2**(3**4) + return self.op != "**" + + +class BoolOp(NodeNG): + """Class representing an :class:`ast.BoolOp` node. + + A :class:`BoolOp` is an application of a boolean operator. + + >>> import astroid + >>> node = astroid.extract_node('a and b') + >>> node + + """ + + _astroid_fields = ("values",) + _other_fields = ("op",) + + @decorators.deprecate_default_argument_values(op="str") + def __init__( + self, + op: str | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param op: The operator. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.op: str | None = op + """The operator.""" + + self.values: list[NodeNG] = [] + """The values being applied to the operator.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, values: list[NodeNG] | None = None) -> None: + """Do some setup after initialisation. + + :param values: The values being applied to the operator. + """ + if values is not None: + self.values = values + + def get_children(self): + yield from self.values + + def op_precedence(self): + return OP_PRECEDENCE[self.op] + + +class Break(_base_nodes.NoChildrenNode, _base_nodes.Statement): + """Class representing an :class:`ast.Break` node. + + >>> import astroid + >>> node = astroid.extract_node('break') + >>> node + + """ + + +class Call(NodeNG): + """Class representing an :class:`ast.Call` node. + + A :class:`Call` node is a call to a function, method, etc. + + >>> import astroid + >>> node = astroid.extract_node('function()') + >>> node + + """ + + _astroid_fields = ("func", "args", "keywords") + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.func: NodeNG | None = None + """What is being called.""" + + self.args: list[NodeNG] = [] + """The positional arguments being given to the call.""" + + self.keywords: list[Keyword] = [] + """The keyword arguments being given to the call.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + func: NodeNG | None = None, + args: list[NodeNG] | None = None, + keywords: list[Keyword] | None = None, + ) -> None: + """Do some setup after initialisation. + + :param func: What is being called. + + :param args: The positional arguments being given to the call. + + :param keywords: The keyword arguments being given to the call. + """ + self.func = func + if args is not None: + self.args = args + if keywords is not None: + self.keywords = keywords + + @property + def starargs(self) -> list[Starred]: + """The positional arguments that unpack something.""" + return [arg for arg in self.args if isinstance(arg, Starred)] + + @property + def kwargs(self) -> list[Keyword]: + """The keyword arguments that unpack something.""" + return [keyword for keyword in self.keywords if keyword.arg is None] + + def get_children(self): + yield self.func + + yield from self.args + + yield from self.keywords + + +class Compare(NodeNG): + """Class representing an :class:`ast.Compare` node. + + A :class:`Compare` node indicates a comparison. + + >>> import astroid + >>> node = astroid.extract_node('a <= b <= c') + >>> node + + >>> node.ops + [('<=', ), ('<=', )] + """ + + _astroid_fields = ("left", "ops") + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.left: NodeNG | None = None + """The value at the left being applied to a comparison operator.""" + + self.ops: list[tuple[str, NodeNG]] = [] + """The remainder of the operators and their relevant right hand value.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + left: NodeNG | None = None, + ops: list[tuple[str, NodeNG]] | None = None, + ) -> None: + """Do some setup after initialisation. + + :param left: The value at the left being applied to a comparison + operator. + + :param ops: The remainder of the operators + and their relevant right hand value. + """ + self.left = left + if ops is not None: + self.ops = ops + + def get_children(self): + """Get the child nodes below this node. + + Overridden to handle the tuple fields and skip returning the operator + strings. + + :returns: The children. + :rtype: iterable(NodeNG) + """ + yield self.left + for _, comparator in self.ops: + yield comparator # we don't want the 'op' + + def last_child(self): + """An optimized version of list(get_children())[-1] + + :returns: The last child. + :rtype: NodeNG + """ + # XXX maybe if self.ops: + return self.ops[-1][1] + # return self.left + + +class Comprehension(NodeNG): + """Class representing an :class:`ast.comprehension` node. + + A :class:`Comprehension` indicates the loop inside any type of + comprehension including generator expressions. + + >>> import astroid + >>> node = astroid.extract_node('[x for x in some_values]') + >>> list(node.get_children()) + [, ] + >>> list(node.get_children())[1].as_string() + 'for x in some_values' + """ + + _astroid_fields = ("target", "iter", "ifs") + _other_fields = ("is_async",) + + optional_assign = True + """Whether this node optionally assigns a variable.""" + + lineno: None + col_offset: None + end_lineno: None + end_col_offset: None + + def __init__(self, parent: NodeNG | None = None) -> None: + """ + :param parent: The parent node in the syntax tree. + """ + self.target: NodeNG | None = None + """What is assigned to by the comprehension.""" + + self.iter: NodeNG | None = None + """What is iterated over by the comprehension.""" + + self.ifs: list[NodeNG] = [] + """The contents of any if statements that filter the comprehension.""" + + self.is_async: bool | None = None + """Whether this is an asynchronous comprehension or not.""" + + super().__init__(parent=parent) + + # pylint: disable=redefined-builtin; same name as builtin ast module. + def postinit( + self, + target: NodeNG | None = None, + iter: NodeNG | None = None, + ifs: list[NodeNG] | None = None, + is_async: bool | None = None, + ) -> None: + """Do some setup after initialisation. + + :param target: What is assigned to by the comprehension. + + :param iter: What is iterated over by the comprehension. + + :param ifs: The contents of any if statements that filter + the comprehension. + + :param is_async: Whether this is an asynchronous comprehension or not. + """ + self.target = target + self.iter = iter + if ifs is not None: + self.ifs = ifs + self.is_async = is_async + + assigned_stmts: ClassVar[AssignedStmtsCall[Comprehension]] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + def assign_type(self): + """The type of assignment that this node performs. + + :returns: The assignment type. + :rtype: NodeNG + """ + return self + + def _get_filtered_stmts( + self, lookup_node, node, stmts, mystmt: _base_nodes.Statement | None + ): + """method used in filter_stmts""" + if self is mystmt: + if isinstance(lookup_node, (Const, Name)): + return [lookup_node], True + + elif self.statement(future=True) is mystmt: + # original node's statement is the assignment, only keeps + # current node (gen exp, list comp) + + return [node], True + + return stmts, False + + def get_children(self): + yield self.target + yield self.iter + + yield from self.ifs + + +class Const(_base_nodes.NoChildrenNode, Instance): + """Class representing any constant including num, str, bool, None, bytes. + + >>> import astroid + >>> node = astroid.extract_node('(5, "This is a string.", True, None, b"bytes")') + >>> node + + >>> list(node.get_children()) + [, + , + , + , + ] + """ + + _other_fields = ("value", "kind") + + def __init__( + self, + value: Any, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + kind: str | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param value: The value that the constant represents. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param kind: The string prefix. "u" for u-prefixed strings and ``None`` otherwise. Python 3.8+ only. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.value: Any = value + """The value that the constant represents.""" + + self.kind: str | None = kind # can be None + """"The string prefix. "u" for u-prefixed strings and ``None`` otherwise. Python 3.8+ only.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + Instance.__init__(self, None) + + infer_unary_op: ClassVar[InferUnaryOp[Const]] + infer_binary_op: ClassVar[InferBinaryOp[Const]] + + def __getattr__(self, name): + # This is needed because of Proxy's __getattr__ method. + # Calling object.__new__ on this class without calling + # __init__ would result in an infinite loop otherwise + # since __getattr__ is called when an attribute doesn't + # exist and self._proxied indirectly calls self.value + # and Proxy __getattr__ calls self.value + if name == "value": + raise AttributeError + return super().__getattr__(name) + + def getitem(self, index, context: InferenceContext | None = None): + """Get an item from this node if subscriptable. + + :param index: The node to use as a subscript index. + :type index: Const or Slice + + :raises AstroidTypeError: When the given index cannot be used as a + subscript index, or if this node is not subscriptable. + """ + if isinstance(index, Const): + index_value = index.value + elif isinstance(index, Slice): + index_value = _infer_slice(index, context=context) + + else: + raise AstroidTypeError( + f"Could not use type {type(index)} as subscript index" + ) + + try: + if isinstance(self.value, (str, bytes)): + return Const(self.value[index_value]) + except ValueError as exc: + raise AstroidValueError( + f"Could not index {self.value!r} with {index_value!r}" + ) from exc + except IndexError as exc: + raise AstroidIndexError( + message="Index {index!r} out of range", + node=self, + index=index, + context=context, + ) from exc + except TypeError as exc: + raise AstroidTypeError( + message="Type error {error!r}", node=self, index=index, context=context + ) from exc + + raise AstroidTypeError(f"{self!r} (value={self.value})") + + def has_dynamic_getattr(self) -> bool: + """Check if the node has a custom __getattr__ or __getattribute__. + + :returns: Whether the class has a custom __getattr__ or __getattribute__. + For a :class:`Const` this is always ``False``. + """ + return False + + def itered(self): + """An iterator over the elements this node contains. + + :returns: The contents of this node. + :rtype: iterable(Const) + + :raises TypeError: If this node does not represent something that is iterable. + """ + if isinstance(self.value, str): + return [const_factory(elem) for elem in self.value] + raise TypeError(f"Cannot iterate over type {type(self.value)!r}") + + def pytype(self) -> str: + """Get the name of the type that this node represents. + + :returns: The name of the type. + """ + return self._proxied.qname() + + def bool_value(self, context: InferenceContext | None = None): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + :rtype: bool + """ + return bool(self.value) + + +class Continue(_base_nodes.NoChildrenNode, _base_nodes.Statement): + """Class representing an :class:`ast.Continue` node. + + >>> import astroid + >>> node = astroid.extract_node('continue') + >>> node + + """ + + +class Decorators(NodeNG): + """A node representing a list of decorators. + + A :class:`Decorators` is the decorators that are applied to + a method or function. + + >>> import astroid + >>> node = astroid.extract_node(''' + @property + def my_property(self): + return 3 + ''') + >>> node + + >>> list(node.get_children())[0] + + """ + + _astroid_fields = ("nodes",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.nodes: list[NodeNG] + """The decorators that this node contains. + + :type: list(Name or Call) or None + """ + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, nodes: list[NodeNG]) -> None: + """Do some setup after initialisation. + + :param nodes: The decorators that this node contains. + :type nodes: list(Name or Call) + """ + self.nodes = nodes + + def scope(self) -> LocalsDictNodeNG: + """The first parent node defining a new scope. + These can be Module, FunctionDef, ClassDef, Lambda, or GeneratorExp nodes. + + :returns: The first parent scope node. + """ + # skip the function node to go directly to the upper level scope + if not self.parent: + raise ParentMissingError(target=self) + if not self.parent.parent: + raise ParentMissingError(target=self.parent) + return self.parent.parent.scope() + + def get_children(self): + yield from self.nodes + + +class DelAttr(_base_nodes.ParentAssignNode): + """Variation of :class:`ast.Delete` representing deletion of an attribute. + + >>> import astroid + >>> node = astroid.extract_node('del self.attr') + >>> node + + >>> list(node.get_children())[0] + + """ + + _astroid_fields = ("expr",) + _other_fields = ("attrname",) + + @decorators.deprecate_default_argument_values(attrname="str") + def __init__( + self, + attrname: str | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param attrname: The name of the attribute that is being deleted. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.expr: NodeNG | None = None + """The name that this node represents. + + :type: Name or None + """ + + self.attrname: str | None = attrname + """The name of the attribute that is being deleted.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, expr: NodeNG | None = None) -> None: + """Do some setup after initialisation. + + :param expr: The name that this node represents. + :type expr: Name or None + """ + self.expr = expr + + def get_children(self): + yield self.expr + + +class Delete(_base_nodes.AssignTypeNode, _base_nodes.Statement): + """Class representing an :class:`ast.Delete` node. + + A :class:`Delete` is a ``del`` statement this is deleting something. + + >>> import astroid + >>> node = astroid.extract_node('del self.attr') + >>> node + + """ + + _astroid_fields = ("targets",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.targets: list[NodeNG] = [] + """What is being deleted.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, targets: list[NodeNG] | None = None) -> None: + """Do some setup after initialisation. + + :param targets: What is being deleted. + """ + if targets is not None: + self.targets = targets + + def get_children(self): + yield from self.targets + + +class Dict(NodeNG, Instance): + """Class representing an :class:`ast.Dict` node. + + A :class:`Dict` is a dictionary that is created with ``{}`` syntax. + + >>> import astroid + >>> node = astroid.extract_node('{1: "1"}') + >>> node + + """ + + _astroid_fields = ("items",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.items: list[ + tuple[SuccessfulInferenceResult, SuccessfulInferenceResult] + ] = [] + """The key-value pairs contained in the dictionary.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, items: list[tuple[SuccessfulInferenceResult, SuccessfulInferenceResult]] + ) -> None: + """Do some setup after initialisation. + + :param items: The key-value pairs contained in the dictionary. + """ + self.items = items + + infer_unary_op: ClassVar[InferUnaryOp[Dict]] + + @classmethod + def from_elements(cls, items=None): + """Create a :class:`Dict` of constants from a live dictionary. + + :param items: The items to store in the node. + :type items: dict + + :returns: The created dictionary node. + :rtype: Dict + """ + node = cls() + if items is None: + node.items = [] + else: + node.items = [ + (const_factory(k), const_factory(v) if _is_const(v) else v) + for k, v in items.items() + # The keys need to be constants + if _is_const(k) + ] + return node + + def pytype(self) -> Literal["builtins.dict"]: + """Get the name of the type that this node represents. + + :returns: The name of the type. + """ + return "builtins.dict" + + def get_children(self): + """Get the key and value nodes below this node. + + Children are returned in the order that they are defined in the source + code, key first then the value. + + :returns: The children. + :rtype: iterable(NodeNG) + """ + for key, value in self.items: + yield key + yield value + + def last_child(self): + """An optimized version of list(get_children())[-1] + + :returns: The last child, or None if no children exist. + :rtype: NodeNG or None + """ + if self.items: + return self.items[-1][1] + return None + + def itered(self): + """An iterator over the keys this node contains. + + :returns: The keys of this node. + :rtype: iterable(NodeNG) + """ + return [key for (key, _) in self.items] + + def getitem( + self, index: Const | Slice, context: InferenceContext | None = None + ) -> NodeNG: + """Get an item from this node. + + :param index: The node to use as a subscript index. + + :raises AstroidTypeError: When the given index cannot be used as a + subscript index, or if this node is not subscriptable. + :raises AstroidIndexError: If the given index does not exist in the + dictionary. + """ + # pylint: disable-next=import-outside-toplevel; circular import + from astroid.helpers import safe_infer + + for key, value in self.items: + # TODO(cpopa): no support for overriding yet, {1:2, **{1: 3}}. + if isinstance(key, DictUnpack): + inferred_value = safe_infer(value, context) + if not isinstance(inferred_value, Dict): + continue + + try: + return inferred_value.getitem(index, context) + except (AstroidTypeError, AstroidIndexError): + continue + + for inferredkey in key.infer(context): + if isinstance(inferredkey, util.UninferableBase): + continue + if isinstance(inferredkey, Const) and isinstance(index, Const): + if inferredkey.value == index.value: + return value + + raise AstroidIndexError(index) + + def bool_value(self, context: InferenceContext | None = None): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + :rtype: bool + """ + return bool(self.items) + + +class Expr(_base_nodes.Statement): + """Class representing an :class:`ast.Expr` node. + + An :class:`Expr` is any expression that does not have its value used or + stored. + + >>> import astroid + >>> node = astroid.extract_node('method()') + >>> node + + >>> node.parent + + """ + + _astroid_fields = ("value",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.value: NodeNG | None = None + """What the expression does.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, value: NodeNG | None = None) -> None: + """Do some setup after initialisation. + + :param value: What the expression does. + """ + self.value = value + + def get_children(self): + yield self.value + + def _get_yield_nodes_skip_lambdas(self): + if not self.value.is_lambda: + yield from self.value._get_yield_nodes_skip_lambdas() + + +class Ellipsis(_base_nodes.NoChildrenNode): # pylint: disable=redefined-builtin + """Class representing an :class:`ast.Ellipsis` node. + + An :class:`Ellipsis` is the ``...`` syntax. + + Deprecated since v2.6.0 - Use :class:`Const` instead. + Will be removed with the release v2.7.0 + """ + + +class EmptyNode(_base_nodes.NoChildrenNode): + """Holds an arbitrary object in the :attr:`LocalsDictNodeNG.locals`.""" + + object = None + + def has_underlying_object(self) -> bool: + return self.object is not None and self.object is not _EMPTY_OBJECT_MARKER + + +class ExceptHandler( + _base_nodes.MultiLineBlockNode, _base_nodes.AssignTypeNode, _base_nodes.Statement +): + """Class representing an :class:`ast.ExceptHandler`. node. + + An :class:`ExceptHandler` is an ``except`` block on a try-except. + + >>> import astroid + >>> node = astroid.extract_node(''' + try: + do_something() + except Exception as error: + print("Error!") + ''') + >>> node + + >>> node.handlers + [] + """ + + _astroid_fields = ("type", "name", "body") + _multi_line_block_fields = ("body",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.type: NodeNG | None = None # can be None + """The types that the block handles. + + :type: Tuple or NodeNG or None + """ + + self.name: AssignName | None = None # can be None + """The name that the caught exception is assigned to.""" + + self.body: list[NodeNG] = [] + """The contents of the block.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + assigned_stmts: ClassVar[AssignedStmtsCall[ExceptHandler]] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + def get_children(self): + if self.type is not None: + yield self.type + + if self.name is not None: + yield self.name + + yield from self.body + + # pylint: disable=redefined-builtin; had to use the same name as builtin ast module. + def postinit( + self, + type: NodeNG | None = None, + name: AssignName | None = None, + body: list[NodeNG] | None = None, + ) -> None: + """Do some setup after initialisation. + + :param type: The types that the block handles. + :type type: Tuple or NodeNG or None + + :param name: The name that the caught exception is assigned to. + + :param body:The contents of the block. + """ + self.type = type + self.name = name + if body is not None: + self.body = body + + @cached_property + def blockstart_tolineno(self): + """The line on which the beginning of this block ends. + + :type: int + """ + if self.name: + return self.name.tolineno + if self.type: + return self.type.tolineno + return self.lineno + + def catch(self, exceptions: list[str] | None) -> bool: + """Check if this node handles any of the given + + :param exceptions: The names of the exceptions to check for. + """ + if self.type is None or exceptions is None: + return True + return any(node.name in exceptions for node in self.type._get_name_nodes()) + + +class ExtSlice(NodeNG): + """Class representing an :class:`ast.ExtSlice` node. + + An :class:`ExtSlice` is a complex slice expression. + + Deprecated since v2.6.0 - Now part of the :class:`Subscript` node. + Will be removed with the release of v2.7.0 + """ + + +class For( + _base_nodes.MultiLineWithElseBlockNode, + _base_nodes.AssignTypeNode, + _base_nodes.Statement, +): + """Class representing an :class:`ast.For` node. + + >>> import astroid + >>> node = astroid.extract_node('for thing in things: print(thing)') + >>> node + + """ + + _astroid_fields = ("target", "iter", "body", "orelse") + _other_other_fields = ("type_annotation",) + _multi_line_block_fields = ("body", "orelse") + + optional_assign = True + """Whether this node optionally assigns a variable. + + This is always ``True`` for :class:`For` nodes. + """ + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.target: NodeNG | None = None + """What the loop assigns to.""" + + self.iter: NodeNG | None = None + """What the loop iterates over.""" + + self.body: list[NodeNG] = [] + """The contents of the body of the loop.""" + + self.orelse: list[NodeNG] = [] + """The contents of the ``else`` block of the loop.""" + + self.type_annotation: NodeNG | None = None # can be None + """If present, this will contain the type annotation passed by a type comment""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + # pylint: disable=redefined-builtin; had to use the same name as builtin ast module. + def postinit( + self, + target: NodeNG | None = None, + iter: NodeNG | None = None, + body: list[NodeNG] | None = None, + orelse: list[NodeNG] | None = None, + type_annotation: NodeNG | None = None, + ) -> None: + """Do some setup after initialisation. + + :param target: What the loop assigns to. + + :param iter: What the loop iterates over. + + :param body: The contents of the body of the loop. + + :param orelse: The contents of the ``else`` block of the loop. + """ + self.target = target + self.iter = iter + if body is not None: + self.body = body + if orelse is not None: + self.orelse = orelse + self.type_annotation = type_annotation + + assigned_stmts: ClassVar[AssignedStmtsCall[For]] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + @cached_property + def blockstart_tolineno(self): + """The line on which the beginning of this block ends. + + :type: int + """ + return self.iter.tolineno + + def get_children(self): + yield self.target + yield self.iter + + yield from self.body + yield from self.orelse + + +class AsyncFor(For): + """Class representing an :class:`ast.AsyncFor` node. + + An :class:`AsyncFor` is an asynchronous :class:`For` built with + the ``async`` keyword. + + >>> import astroid + >>> node = astroid.extract_node(''' + async def func(things): + async for thing in things: + print(thing) + ''') + >>> node + + >>> node.body[0] + + """ + + +class Await(NodeNG): + """Class representing an :class:`ast.Await` node. + + An :class:`Await` is the ``await`` keyword. + + >>> import astroid + >>> node = astroid.extract_node(''' + async def func(things): + await other_func() + ''') + >>> node + + >>> node.body[0] + + >>> list(node.body[0].get_children())[0] + + """ + + _astroid_fields = ("value",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.value: NodeNG | None = None + """What to wait for.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, value: NodeNG | None = None) -> None: + """Do some setup after initialisation. + + :param value: What to wait for. + """ + self.value = value + + def get_children(self): + yield self.value + + +class ImportFrom(_base_nodes.ImportNode): + """Class representing an :class:`ast.ImportFrom` node. + + >>> import astroid + >>> node = astroid.extract_node('from my_package import my_module') + >>> node + + """ + + _other_fields = ("modname", "names", "level") + + def __init__( + self, + fromname: str | None, + names: list[tuple[str, str | None]], + level: int | None = 0, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param fromname: The module that is being imported from. + + :param names: What is being imported from the module. + + :param level: The level of relative import. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.modname: str | None = fromname # can be None + """The module that is being imported from. + + This is ``None`` for relative imports. + """ + + self.names: list[tuple[str, str | None]] = names + """What is being imported from the module. + + Each entry is a :class:`tuple` of the name being imported, + and the alias that the name is assigned to (if any). + """ + + # TODO When is 'level' None? + self.level: int | None = level # can be None + """The level of relative import. + + Essentially this is the number of dots in the import. + This is always 0 for absolute imports. + """ + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + +class Attribute(NodeNG): + """Class representing an :class:`ast.Attribute` node.""" + + _astroid_fields = ("expr",) + _other_fields = ("attrname",) + + @decorators.deprecate_default_argument_values(attrname="str") + def __init__( + self, + attrname: str | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param attrname: The name of the attribute. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.expr: NodeNG | None = None + """The name that this node represents. + + :type: Name or None + """ + + self.attrname: str | None = attrname + """The name of the attribute.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, expr: NodeNG | None = None) -> None: + """Do some setup after initialisation. + + :param expr: The name that this node represents. + :type expr: Name or None + """ + self.expr = expr + + def get_children(self): + yield self.expr + + +class Global(_base_nodes.NoChildrenNode, _base_nodes.Statement): + """Class representing an :class:`ast.Global` node. + + >>> import astroid + >>> node = astroid.extract_node('global a_global') + >>> node + + """ + + _other_fields = ("names",) + + def __init__( + self, + names: list[str], + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param names: The names being declared as global. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.names: list[str] = names + """The names being declared as global.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def _infer_name(self, frame, name): + return name + + +class If(_base_nodes.MultiLineWithElseBlockNode, _base_nodes.Statement): + """Class representing an :class:`ast.If` node. + + >>> import astroid + >>> node = astroid.extract_node('if condition: print(True)') + >>> node + + """ + + _astroid_fields = ("test", "body", "orelse") + _multi_line_block_fields = ("body", "orelse") + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.test: NodeNG | None = None + """The condition that the statement tests.""" + + self.body: list[NodeNG] = [] + """The contents of the block.""" + + self.orelse: list[NodeNG] = [] + """The contents of the ``else`` block.""" + + self.is_orelse: bool = False + """Whether the if-statement is the orelse-block of another if statement.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + test: NodeNG | None = None, + body: list[NodeNG] | None = None, + orelse: list[NodeNG] | None = None, + ) -> None: + """Do some setup after initialisation. + + :param test: The condition that the statement tests. + + :param body: The contents of the block. + + :param orelse: The contents of the ``else`` block. + """ + self.test = test + if body is not None: + self.body = body + if orelse is not None: + self.orelse = orelse + if isinstance(self.parent, If) and self in self.parent.orelse: + self.is_orelse = True + + @cached_property + def blockstart_tolineno(self): + """The line on which the beginning of this block ends. + + :type: int + """ + return self.test.tolineno + + def block_range(self, lineno): + """Get a range from the given line number to where this node ends. + + :param lineno: The line number to start the range at. + :type lineno: int + + :returns: The range of line numbers that this node belongs to, + starting at the given line number. + :rtype: tuple(int, int) + """ + if lineno == self.body[0].fromlineno: + return lineno, lineno + if lineno <= self.body[-1].tolineno: + return lineno, self.body[-1].tolineno + return self._elsed_block_range(lineno, self.orelse, self.body[0].fromlineno - 1) + + def get_children(self): + yield self.test + + yield from self.body + yield from self.orelse + + def has_elif_block(self): + return len(self.orelse) == 1 and isinstance(self.orelse[0], If) + + def _get_yield_nodes_skip_lambdas(self): + """An If node can contain a Yield node in the test""" + yield from self.test._get_yield_nodes_skip_lambdas() + yield from super()._get_yield_nodes_skip_lambdas() + + def is_sys_guard(self) -> bool: + """Return True if IF stmt is a sys.version_info guard. + + >>> import astroid + >>> node = astroid.extract_node(''' + import sys + if sys.version_info > (3, 8): + from typing import Literal + else: + from typing_extensions import Literal + ''') + >>> node.is_sys_guard() + True + """ + warnings.warn( + "The 'is_sys_guard' function is deprecated and will be removed in astroid 3.0.0 " + "It has been moved to pylint and can be imported from 'pylint.checkers.utils' " + "starting with pylint 2.12", + DeprecationWarning, + stacklevel=2, + ) + if isinstance(self.test, Compare): + value = self.test.left + if isinstance(value, Subscript): + value = value.value + if isinstance(value, Attribute) and value.as_string() == "sys.version_info": + return True + + return False + + def is_typing_guard(self) -> bool: + """Return True if IF stmt is a typing guard. + + >>> import astroid + >>> node = astroid.extract_node(''' + from typing import TYPE_CHECKING + if TYPE_CHECKING: + from xyz import a + ''') + >>> node.is_typing_guard() + True + """ + warnings.warn( + "The 'is_typing_guard' function is deprecated and will be removed in astroid 3.0.0 " + "It has been moved to pylint and can be imported from 'pylint.checkers.utils' " + "starting with pylint 2.12", + DeprecationWarning, + stacklevel=2, + ) + return isinstance( + self.test, (Name, Attribute) + ) and self.test.as_string().endswith("TYPE_CHECKING") + + +class IfExp(NodeNG): + """Class representing an :class:`ast.IfExp` node. + >>> import astroid + >>> node = astroid.extract_node('value if condition else other') + >>> node + + """ + + _astroid_fields = ("test", "body", "orelse") + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.test: NodeNG | None = None + """The condition that the statement tests.""" + + self.body: NodeNG | None = None + """The contents of the block.""" + + self.orelse: NodeNG | None = None + """The contents of the ``else`` block.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + test: NodeNG | None = None, + body: NodeNG | None = None, + orelse: NodeNG | None = None, + ) -> None: + """Do some setup after initialisation. + + :param test: The condition that the statement tests. + + :param body: The contents of the block. + + :param orelse: The contents of the ``else`` block. + """ + self.test = test + self.body = body + self.orelse = orelse + + def get_children(self): + yield self.test + yield self.body + yield self.orelse + + def op_left_associative(self) -> Literal[False]: + # `1 if True else 2 if False else 3` is parsed as + # `1 if True else (2 if False else 3)` + return False + + +class Import(_base_nodes.ImportNode): + """Class representing an :class:`ast.Import` node. + >>> import astroid + >>> node = astroid.extract_node('import astroid') + >>> node + + """ + + _other_fields = ("names",) + + @decorators.deprecate_default_argument_values(names="list[tuple[str, str | None]]") + def __init__( + self, + names: list[tuple[str, str | None]] | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param names: The names being imported. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.names: list[tuple[str, str | None]] = names or [] + """The names being imported. + + Each entry is a :class:`tuple` of the name being imported, + and the alias that the name is assigned to (if any). + """ + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + +class Index(NodeNG): + """Class representing an :class:`ast.Index` node. + + An :class:`Index` is a simple subscript. + + Deprecated since v2.6.0 - Now part of the :class:`Subscript` node. + Will be removed with the release of v2.7.0 + """ + + +class Keyword(NodeNG): + """Class representing an :class:`ast.keyword` node. + + >>> import astroid + >>> node = astroid.extract_node('function(a_kwarg=True)') + >>> node + + >>> node.keywords + [] + """ + + _astroid_fields = ("value",) + _other_fields = ("arg",) + + def __init__( + self, + arg: str | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param arg: The argument being assigned to. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.arg: str | None = arg # can be None + """The argument being assigned to.""" + + self.value: NodeNG | None = None + """The value being assigned to the keyword argument.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, value: NodeNG | None = None) -> None: + """Do some setup after initialisation. + + :param value: The value being assigned to the keyword argument. + """ + self.value = value + + def get_children(self): + yield self.value + + +class List(BaseContainer): + """Class representing an :class:`ast.List` node. + + >>> import astroid + >>> node = astroid.extract_node('[1, 2, 3]') + >>> node + + """ + + _other_fields = ("ctx",) + + def __init__( + self, + ctx: Context | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param ctx: Whether the list is assigned to or loaded from. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.ctx: Context | None = ctx + """Whether the list is assigned to or loaded from.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + assigned_stmts: ClassVar[AssignedStmtsCall[List]] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + infer_unary_op: ClassVar[InferUnaryOp[List]] + infer_binary_op: ClassVar[InferBinaryOp[List]] + + def pytype(self) -> Literal["builtins.list"]: + """Get the name of the type that this node represents. + + :returns: The name of the type. + """ + return "builtins.list" + + def getitem(self, index, context: InferenceContext | None = None): + """Get an item from this node. + + :param index: The node to use as a subscript index. + :type index: Const or Slice + """ + return _container_getitem(self, self.elts, index, context=context) + + +class Nonlocal(_base_nodes.NoChildrenNode, _base_nodes.Statement): + """Class representing an :class:`ast.Nonlocal` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + def function(): + nonlocal var + ''') + >>> node + + >>> node.body[0] + + """ + + _other_fields = ("names",) + + def __init__( + self, + names: list[str], + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param names: The names being declared as not local. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.names: list[str] = names + """The names being declared as not local.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def _infer_name(self, frame, name): + return name + + +class Pass(_base_nodes.NoChildrenNode, _base_nodes.Statement): + """Class representing an :class:`ast.Pass` node. + + >>> import astroid + >>> node = astroid.extract_node('pass') + >>> node + + """ + + +class Raise(_base_nodes.Statement): + """Class representing an :class:`ast.Raise` node. + + >>> import astroid + >>> node = astroid.extract_node('raise RuntimeError("Something bad happened!")') + >>> node + + """ + + _astroid_fields = ("exc", "cause") + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.exc: NodeNG | None = None # can be None + """What is being raised.""" + + self.cause: NodeNG | None = None # can be None + """The exception being used to raise this one.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + exc: NodeNG | None = None, + cause: NodeNG | None = None, + ) -> None: + """Do some setup after initialisation. + + :param exc: What is being raised. + + :param cause: The exception being used to raise this one. + """ + self.exc = exc + self.cause = cause + + def raises_not_implemented(self) -> bool: + """Check if this node raises a :class:`NotImplementedError`. + + :returns: Whether this node raises a :class:`NotImplementedError`. + """ + if not self.exc: + return False + return any( + name.name == "NotImplementedError" for name in self.exc._get_name_nodes() + ) + + def get_children(self): + if self.exc is not None: + yield self.exc + + if self.cause is not None: + yield self.cause + + +class Return(_base_nodes.Statement): + """Class representing an :class:`ast.Return` node. + + >>> import astroid + >>> node = astroid.extract_node('return True') + >>> node + + """ + + _astroid_fields = ("value",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.value: NodeNG | None = None # can be None + """The value being returned.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, value: NodeNG | None = None) -> None: + """Do some setup after initialisation. + + :param value: The value being returned. + """ + self.value = value + + def get_children(self): + if self.value is not None: + yield self.value + + def is_tuple_return(self): + return isinstance(self.value, Tuple) + + def _get_return_nodes_skip_functions(self): + yield self + + +class Set(BaseContainer): + """Class representing an :class:`ast.Set` node. + + >>> import astroid + >>> node = astroid.extract_node('{1, 2, 3}') + >>> node + + """ + + infer_unary_op: ClassVar[InferUnaryOp[Set]] + + def pytype(self) -> Literal["builtins.set"]: + """Get the name of the type that this node represents. + + :returns: The name of the type. + """ + return "builtins.set" + + +class Slice(NodeNG): + """Class representing an :class:`ast.Slice` node. + + >>> import astroid + >>> node = astroid.extract_node('things[1:3]') + >>> node + + >>> node.slice + + """ + + _astroid_fields = ("lower", "upper", "step") + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.lower: NodeNG | None = None # can be None + """The lower index in the slice.""" + + self.upper: NodeNG | None = None # can be None + """The upper index in the slice.""" + + self.step: NodeNG | None = None # can be None + """The step to take between indexes.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + lower: NodeNG | None = None, + upper: NodeNG | None = None, + step: NodeNG | None = None, + ) -> None: + """Do some setup after initialisation. + + :param lower: The lower index in the slice. + + :param upper: The upper index in the slice. + + :param step: The step to take between index. + """ + self.lower = lower + self.upper = upper + self.step = step + + def _wrap_attribute(self, attr): + """Wrap the empty attributes of the Slice in a Const node.""" + if not attr: + const = const_factory(attr) + const.parent = self + return const + return attr + + @cached_property + def _proxied(self) -> nodes.ClassDef: + builtins = AstroidManager().builtins_module + return builtins.getattr("slice")[0] + + def pytype(self) -> Literal["builtins.slice"]: + """Get the name of the type that this node represents. + + :returns: The name of the type. + """ + return "builtins.slice" + + def igetattr(self, attrname, context: InferenceContext | None = None): + """Infer the possible values of the given attribute on the slice. + + :param attrname: The name of the attribute to infer. + :type attrname: str + + :returns: The inferred possible values. + :rtype: iterable(NodeNG) + """ + if attrname == "start": + yield self._wrap_attribute(self.lower) + elif attrname == "stop": + yield self._wrap_attribute(self.upper) + elif attrname == "step": + yield self._wrap_attribute(self.step) + else: + yield from self.getattr(attrname, context=context) + + def getattr(self, attrname, context: InferenceContext | None = None): + return self._proxied.getattr(attrname, context) + + def get_children(self): + if self.lower is not None: + yield self.lower + + if self.upper is not None: + yield self.upper + + if self.step is not None: + yield self.step + + +class Starred(_base_nodes.ParentAssignNode): + """Class representing an :class:`ast.Starred` node. + + >>> import astroid + >>> node = astroid.extract_node('*args') + >>> node + + """ + + _astroid_fields = ("value",) + _other_fields = ("ctx",) + + def __init__( + self, + ctx: Context | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param ctx: Whether the list is assigned to or loaded from. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.value: NodeNG | None = None + """What is being unpacked.""" + + self.ctx: Context | None = ctx + """Whether the starred item is assigned to or loaded from.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, value: NodeNG | None = None) -> None: + """Do some setup after initialisation. + + :param value: What is being unpacked. + """ + self.value = value + + assigned_stmts: ClassVar[AssignedStmtsCall[Starred]] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + def get_children(self): + yield self.value + + +class Subscript(NodeNG): + """Class representing an :class:`ast.Subscript` node. + + >>> import astroid + >>> node = astroid.extract_node('things[1:3]') + >>> node + + """ + + _astroid_fields = ("value", "slice") + _other_fields = ("ctx",) + + infer_lhs: ClassVar[InferLHS[Subscript]] + + def __init__( + self, + ctx: Context | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param ctx: Whether the subscripted item is assigned to or loaded from. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.value: NodeNG | None = None + """What is being indexed.""" + + self.slice: NodeNG | None = None + """The slice being used to lookup.""" + + self.ctx: Context | None = ctx + """Whether the subscripted item is assigned to or loaded from.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + # pylint: disable=redefined-builtin; had to use the same name as builtin ast module. + def postinit( + self, value: NodeNG | None = None, slice: NodeNG | None = None + ) -> None: + """Do some setup after initialisation. + + :param value: What is being indexed. + + :param slice: The slice being used to lookup. + """ + self.value = value + self.slice = slice + + def get_children(self): + yield self.value + yield self.slice + + +class TryExcept(_base_nodes.MultiLineWithElseBlockNode, _base_nodes.Statement): + """Class representing an :class:`ast.TryExcept` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + try: + do_something() + except Exception as error: + print("Error!") + ''') + >>> node + + """ + + _astroid_fields = ("body", "handlers", "orelse") + _multi_line_block_fields = ("body", "handlers", "orelse") + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.body: list[NodeNG] = [] + """The contents of the block to catch exceptions from.""" + + self.handlers: list[ExceptHandler] = [] + """The exception handlers.""" + + self.orelse: list[NodeNG] = [] + """The contents of the ``else`` block.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + body: list[NodeNG] | None = None, + handlers: list[ExceptHandler] | None = None, + orelse: list[NodeNG] | None = None, + ) -> None: + """Do some setup after initialisation. + + :param body: The contents of the block to catch exceptions from. + + :param handlers: The exception handlers. + + :param orelse: The contents of the ``else`` block. + """ + if body is not None: + self.body = body + if handlers is not None: + self.handlers = handlers + if orelse is not None: + self.orelse = orelse + + def _infer_name(self, frame, name): + return name + + def block_range(self, lineno): + """Get a range from the given line number to where this node ends. + + :param lineno: The line number to start the range at. + :type lineno: int + + :returns: The range of line numbers that this node belongs to, + starting at the given line number. + :rtype: tuple(int, int) + """ + last = None + for exhandler in self.handlers: + if exhandler.type and lineno == exhandler.type.fromlineno: + return lineno, lineno + if exhandler.body[0].fromlineno <= lineno <= exhandler.body[-1].tolineno: + return lineno, exhandler.body[-1].tolineno + if last is None: + last = exhandler.body[0].fromlineno - 1 + return self._elsed_block_range(lineno, self.orelse, last) + + def get_children(self): + yield from self.body + + yield from self.handlers or () + yield from self.orelse or () + + +class TryFinally(_base_nodes.MultiLineWithElseBlockNode, _base_nodes.Statement): + """Class representing an :class:`ast.TryFinally` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + try: + do_something() + except Exception as error: + print("Error!") + finally: + print("Cleanup!") + ''') + >>> node + + """ + + _astroid_fields = ("body", "finalbody") + _multi_line_block_fields = ("body", "finalbody") + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.body: list[NodeNG | TryExcept] = [] + """The try-except that the finally is attached to.""" + + self.finalbody: list[NodeNG] = [] + """The contents of the ``finally`` block.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + body: list[NodeNG | TryExcept] | None = None, + finalbody: list[NodeNG] | None = None, + ) -> None: + """Do some setup after initialisation. + + :param body: The try-except that the finally is attached to. + + :param finalbody: The contents of the ``finally`` block. + """ + if body is not None: + self.body = body + if finalbody is not None: + self.finalbody = finalbody + + def block_range(self, lineno): + """Get a range from the given line number to where this node ends. + + :param lineno: The line number to start the range at. + :type lineno: int + + :returns: The range of line numbers that this node belongs to, + starting at the given line number. + :rtype: tuple(int, int) + """ + child = self.body[0] + # py2.5 try: except: finally: + if ( + isinstance(child, TryExcept) + and child.fromlineno == self.fromlineno + and child.tolineno >= lineno > self.fromlineno + ): + return child.block_range(lineno) + return self._elsed_block_range(lineno, self.finalbody) + + def get_children(self): + yield from self.body + yield from self.finalbody + + +class TryStar(_base_nodes.MultiLineWithElseBlockNode, _base_nodes.Statement): + """Class representing an :class:`ast.TryStar` node.""" + + _astroid_fields = ("body", "handlers", "orelse", "finalbody") + _multi_line_block_fields = ("body", "handlers", "orelse", "finalbody") + + def __init__( + self, + *, + lineno: int | None = None, + col_offset: int | None = None, + end_lineno: int | None = None, + end_col_offset: int | None = None, + parent: NodeNG | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + :param col_offset: The column that this node appears on in the + source code. + :param parent: The parent node in the syntax tree. + :param end_lineno: The last line this node appears on in the source code. + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.body: list[NodeNG] = [] + """The contents of the block to catch exceptions from.""" + + self.handlers: list[ExceptHandler] = [] + """The exception handlers.""" + + self.orelse: list[NodeNG] = [] + """The contents of the ``else`` block.""" + + self.finalbody: list[NodeNG] = [] + """The contents of the ``finally`` block.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + *, + body: list[NodeNG] | None = None, + handlers: list[ExceptHandler] | None = None, + orelse: list[NodeNG] | None = None, + finalbody: list[NodeNG] | None = None, + ) -> None: + """Do some setup after initialisation. + :param body: The contents of the block to catch exceptions from. + :param handlers: The exception handlers. + :param orelse: The contents of the ``else`` block. + :param finalbody: The contents of the ``finally`` block. + """ + if body: + self.body = body + if handlers: + self.handlers = handlers + if orelse: + self.orelse = orelse + if finalbody: + self.finalbody = finalbody + + def _infer_name(self, frame, name): + return name + + def block_range(self, lineno: int) -> tuple[int, int]: + """Get a range from a given line number to where this node ends.""" + if lineno == self.fromlineno: + return lineno, lineno + if self.body and self.body[0].fromlineno <= lineno <= self.body[-1].tolineno: + # Inside try body - return from lineno till end of try body + return lineno, self.body[-1].tolineno + for exhandler in self.handlers: + if exhandler.type and lineno == exhandler.type.fromlineno: + return lineno, lineno + if exhandler.body[0].fromlineno <= lineno <= exhandler.body[-1].tolineno: + return lineno, exhandler.body[-1].tolineno + if self.orelse: + if self.orelse[0].fromlineno - 1 == lineno: + return lineno, lineno + if self.orelse[0].fromlineno <= lineno <= self.orelse[-1].tolineno: + return lineno, self.orelse[-1].tolineno + if self.finalbody: + if self.finalbody[0].fromlineno - 1 == lineno: + return lineno, lineno + if self.finalbody[0].fromlineno <= lineno <= self.finalbody[-1].tolineno: + return lineno, self.finalbody[-1].tolineno + return lineno, self.tolineno + + def get_children(self): + yield from self.body + yield from self.handlers + yield from self.orelse + yield from self.finalbody + + +class Tuple(BaseContainer): + """Class representing an :class:`ast.Tuple` node. + + >>> import astroid + >>> node = astroid.extract_node('(1, 2, 3)') + >>> node + + """ + + _other_fields = ("ctx",) + + def __init__( + self, + ctx: Context | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param ctx: Whether the tuple is assigned to or loaded from. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.ctx: Context | None = ctx + """Whether the tuple is assigned to or loaded from.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + assigned_stmts: ClassVar[AssignedStmtsCall[Tuple]] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + infer_unary_op: ClassVar[InferUnaryOp[Tuple]] + infer_binary_op: ClassVar[InferBinaryOp[Tuple]] + + def pytype(self) -> Literal["builtins.tuple"]: + """Get the name of the type that this node represents. + + :returns: The name of the type. + """ + return "builtins.tuple" + + def getitem(self, index, context: InferenceContext | None = None): + """Get an item from this node. + + :param index: The node to use as a subscript index. + :type index: Const or Slice + """ + return _container_getitem(self, self.elts, index, context=context) + + +class UnaryOp(NodeNG): + """Class representing an :class:`ast.UnaryOp` node. + + >>> import astroid + >>> node = astroid.extract_node('-5') + >>> node + + """ + + _astroid_fields = ("operand",) + _other_fields = ("op",) + + @decorators.deprecate_default_argument_values(op="str") + def __init__( + self, + op: str | None = None, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param op: The operator. + + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.op: str | None = op + """The operator.""" + + self.operand: NodeNG | None = None + """What the unary operator is applied to.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, operand: NodeNG | None = None) -> None: + """Do some setup after initialisation. + + :param operand: What the unary operator is applied to. + """ + self.operand = operand + + # This is set by inference.py + _infer_unaryop: ClassVar[ + InferBinaryOperation[UnaryOp, util.BadUnaryOperationMessage] + ] + + def type_errors(self, context: InferenceContext | None = None): + """Get a list of type errors which can occur during inference. + + Each TypeError is represented by a :class:`BadBinaryOperationMessage`, + which holds the original exception. + + :returns: The list of possible type errors. + :rtype: list(BadBinaryOperationMessage) + """ + try: + results = self._infer_unaryop(context=context) + return [ + result + for result in results + if isinstance(result, util.BadUnaryOperationMessage) + ] + except InferenceError: + return [] + + def get_children(self): + yield self.operand + + def op_precedence(self): + if self.op == "not": + return OP_PRECEDENCE[self.op] + + return super().op_precedence() + + +class While(_base_nodes.MultiLineWithElseBlockNode, _base_nodes.Statement): + """Class representing an :class:`ast.While` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + while condition(): + print("True") + ''') + >>> node + + """ + + _astroid_fields = ("test", "body", "orelse") + _multi_line_block_fields = ("body", "orelse") + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.test: NodeNG | None = None + """The condition that the loop tests.""" + + self.body: list[NodeNG] = [] + """The contents of the loop.""" + + self.orelse: list[NodeNG] = [] + """The contents of the ``else`` block.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + test: NodeNG | None = None, + body: list[NodeNG] | None = None, + orelse: list[NodeNG] | None = None, + ) -> None: + """Do some setup after initialisation. + + :param test: The condition that the loop tests. + + :param body: The contents of the loop. + + :param orelse: The contents of the ``else`` block. + """ + self.test = test + if body is not None: + self.body = body + if orelse is not None: + self.orelse = orelse + + @cached_property + def blockstart_tolineno(self): + """The line on which the beginning of this block ends. + + :type: int + """ + return self.test.tolineno + + def block_range(self, lineno): + """Get a range from the given line number to where this node ends. + + :param lineno: The line number to start the range at. + :type lineno: int + + :returns: The range of line numbers that this node belongs to, + starting at the given line number. + :rtype: tuple(int, int) + """ + return self._elsed_block_range(lineno, self.orelse) + + def get_children(self): + yield self.test + + yield from self.body + yield from self.orelse + + def _get_yield_nodes_skip_lambdas(self): + """A While node can contain a Yield node in the test""" + yield from self.test._get_yield_nodes_skip_lambdas() + yield from super()._get_yield_nodes_skip_lambdas() + + +class With( + _base_nodes.MultiLineWithElseBlockNode, + _base_nodes.AssignTypeNode, + _base_nodes.Statement, +): + """Class representing an :class:`ast.With` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + with open(file_path) as file_: + print(file_.read()) + ''') + >>> node + + """ + + _astroid_fields = ("items", "body") + _other_other_fields = ("type_annotation",) + _multi_line_block_fields = ("body",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.items: list[tuple[NodeNG, NodeNG | None]] = [] + """The pairs of context managers and the names they are assigned to.""" + + self.body: list[NodeNG] = [] + """The contents of the ``with`` block.""" + + self.type_annotation: NodeNG | None = None # can be None + """If present, this will contain the type annotation passed by a type comment""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + items: list[tuple[NodeNG, NodeNG | None]] | None = None, + body: list[NodeNG] | None = None, + type_annotation: NodeNG | None = None, + ) -> None: + """Do some setup after initialisation. + + :param items: The pairs of context managers and the names + they are assigned to. + + :param body: The contents of the ``with`` block. + """ + if items is not None: + self.items = items + if body is not None: + self.body = body + self.type_annotation = type_annotation + + assigned_stmts: ClassVar[AssignedStmtsCall[With]] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + @cached_property + def blockstart_tolineno(self): + """The line on which the beginning of this block ends. + + :type: int + """ + return self.items[-1][0].tolineno + + def get_children(self): + """Get the child nodes below this node. + + :returns: The children. + :rtype: iterable(NodeNG) + """ + for expr, var in self.items: + yield expr + if var: + yield var + yield from self.body + + +class AsyncWith(With): + """Asynchronous ``with`` built with the ``async`` keyword.""" + + +class Yield(NodeNG): + """Class representing an :class:`ast.Yield` node. + + >>> import astroid + >>> node = astroid.extract_node('yield True') + >>> node + + """ + + _astroid_fields = ("value",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.value: NodeNG | None = None # can be None + """The value to yield.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, value: NodeNG | None = None) -> None: + """Do some setup after initialisation. + + :param value: The value to yield. + """ + self.value = value + + def get_children(self): + if self.value is not None: + yield self.value + + def _get_yield_nodes_skip_lambdas(self): + yield self + + +class YieldFrom(Yield): # TODO value is required, not optional + """Class representing an :class:`ast.YieldFrom` node.""" + + +class DictUnpack(_base_nodes.NoChildrenNode): + """Represents the unpacking of dicts into dicts using :pep:`448`.""" + + +class FormattedValue(NodeNG): + """Class representing an :class:`ast.FormattedValue` node. + + Represents a :pep:`498` format string. + + >>> import astroid + >>> node = astroid.extract_node('f"Format {type_}"') + >>> node + + >>> node.values + [, ] + """ + + _astroid_fields = ("value", "format_spec") + _other_fields = ("conversion",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.value: NodeNG + """The value to be formatted into the string.""" + + self.conversion: int + """The type of formatting to be applied to the value. + + .. seealso:: + :class:`ast.FormattedValue` + """ + + self.format_spec: JoinedStr | None = None + """The formatting to be applied to the value. + + .. seealso:: + :class:`ast.FormattedValue` + """ + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + *, + value: NodeNG, + conversion: int, + format_spec: JoinedStr | None = None, + ) -> None: + """Do some setup after initialisation. + + :param value: The value to be formatted into the string. + + :param conversion: The type of formatting to be applied to the value. + + :param format_spec: The formatting to be applied to the value. + :type format_spec: JoinedStr or None + """ + self.value = value + self.conversion = conversion + self.format_spec = format_spec + + def get_children(self): + yield self.value + + if self.format_spec is not None: + yield self.format_spec + + +class JoinedStr(NodeNG): + """Represents a list of string expressions to be joined. + + >>> import astroid + >>> node = astroid.extract_node('f"Format {type_}"') + >>> node + + """ + + _astroid_fields = ("values",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.values: list[NodeNG] = [] + """The string expressions to be joined. + + :type: list(FormattedValue or Const) + """ + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, values: list[NodeNG] | None = None) -> None: + """Do some setup after initialisation. + + :param value: The string expressions to be joined. + + :type: list(FormattedValue or Const) + """ + if values is not None: + self.values = values + + def get_children(self): + yield from self.values + + +class NamedExpr(_base_nodes.AssignTypeNode): + """Represents the assignment from the assignment expression + + >>> import astroid + >>> module = astroid.parse('if a := 1: pass') + >>> module.body[0].test + + """ + + _astroid_fields = ("target", "value") + + optional_assign = True + """Whether this node optionally assigns a variable. + + Since NamedExpr are not always called they do not always assign.""" + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.target: NodeNG + """The assignment target + + :type: Name + """ + + self.value: NodeNG + """The value that gets assigned in the expression""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, target: NodeNG, value: NodeNG) -> None: + self.target = target + self.value = value + + assigned_stmts: ClassVar[AssignedStmtsCall[NamedExpr]] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + def frame( + self, *, future: Literal[None, True] = None + ) -> nodes.FunctionDef | nodes.Module | nodes.ClassDef | nodes.Lambda: + """The first parent frame node. + + A frame node is a :class:`Module`, :class:`FunctionDef`, + or :class:`ClassDef`. + + :returns: The first parent frame node. + """ + if not self.parent: + raise ParentMissingError(target=self) + + # For certain parents NamedExpr evaluate to the scope of the parent + if isinstance(self.parent, (Arguments, Keyword, Comprehension)): + if not self.parent.parent: + raise ParentMissingError(target=self.parent) + if not self.parent.parent.parent: + raise ParentMissingError(target=self.parent.parent) + return self.parent.parent.parent.frame(future=True) + + return self.parent.frame(future=True) + + def scope(self) -> LocalsDictNodeNG: + """The first parent node defining a new scope. + These can be Module, FunctionDef, ClassDef, Lambda, or GeneratorExp nodes. + + :returns: The first parent scope node. + """ + if not self.parent: + raise ParentMissingError(target=self) + + # For certain parents NamedExpr evaluate to the scope of the parent + if isinstance(self.parent, (Arguments, Keyword, Comprehension)): + if not self.parent.parent: + raise ParentMissingError(target=self.parent) + if not self.parent.parent.parent: + raise ParentMissingError(target=self.parent.parent) + return self.parent.parent.parent.scope() + + return self.parent.scope() + + def set_local(self, name: str, stmt: NodeNG) -> None: + """Define that the given name is declared in the given statement node. + NamedExpr's in Arguments, Keyword or Comprehension are evaluated in their + parent's parent scope. So we add to their frame's locals. + + .. seealso:: :meth:`scope` + + :param name: The name that is being defined. + + :param stmt: The statement that defines the given name. + """ + self.frame(future=True).set_local(name, stmt) + + +class Unknown(_base_nodes.AssignTypeNode): + """This node represents a node in a constructed AST where + introspection is not possible. At the moment, it's only used in + the args attribute of FunctionDef nodes where function signature + introspection failed. + """ + + name = "Unknown" + + def qname(self) -> Literal["Unknown"]: + return "Unknown" + + def _infer(self, context: InferenceContext | None = None, **kwargs): + """Inference on an Unknown node immediately terminates.""" + yield util.Uninferable + + +class EvaluatedObject(NodeNG): + """Contains an object that has already been inferred + + This class is useful to pre-evaluate a particular node, + with the resulting class acting as the non-evaluated node. + """ + + name = "EvaluatedObject" + _astroid_fields = ("original",) + _other_fields = ("value",) + + def __init__(self, original: NodeNG, value: NodeNG | util.UninferableBase) -> None: + self.original: NodeNG = original + """The original node that has already been evaluated""" + + self.value: NodeNG | util.UninferableBase = value + """The inferred value""" + + super().__init__( + lineno=self.original.lineno, + col_offset=self.original.col_offset, + parent=self.original.parent, + ) + + def _infer( + self, context: InferenceContext | None = None, **kwargs: Any + ) -> Generator[NodeNG | util.UninferableBase, None, None]: + yield self.value + + +# Pattern matching ####################################################### + + +class Match(_base_nodes.Statement, _base_nodes.MultiLineBlockNode): + """Class representing a :class:`ast.Match` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + match x: + case 200: + ... + case _: + ... + ''') + >>> node + + """ + + _astroid_fields = ("subject", "cases") + _multi_line_block_fields = ("cases",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + self.subject: NodeNG + self.cases: list[MatchCase] + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + *, + subject: NodeNG, + cases: list[MatchCase], + ) -> None: + self.subject = subject + self.cases = cases + + +class Pattern(NodeNG): + """Base class for all Pattern nodes.""" + + +class MatchCase(_base_nodes.MultiLineBlockNode): + """Class representing a :class:`ast.match_case` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + match x: + case 200: + ... + ''') + >>> node.cases[0] + + """ + + _astroid_fields = ("pattern", "guard", "body") + _multi_line_block_fields = ("body",) + + lineno: None + col_offset: None + end_lineno: None + end_col_offset: None + + def __init__(self, *, parent: NodeNG | None = None) -> None: + self.pattern: Pattern + self.guard: NodeNG | None + self.body: list[NodeNG] + super().__init__(parent=parent) + + def postinit( + self, + *, + pattern: Pattern, + guard: NodeNG | None, + body: list[NodeNG], + ) -> None: + self.pattern = pattern + self.guard = guard + self.body = body + + +class MatchValue(Pattern): + """Class representing a :class:`ast.MatchValue` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + match x: + case 200: + ... + ''') + >>> node.cases[0].pattern + + """ + + _astroid_fields = ("value",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + self.value: NodeNG + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, *, value: NodeNG) -> None: + self.value = value + + +class MatchSingleton(Pattern): + """Class representing a :class:`ast.MatchSingleton` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + match x: + case True: + ... + case False: + ... + case None: + ... + ''') + >>> node.cases[0].pattern + + >>> node.cases[1].pattern + + >>> node.cases[2].pattern + + """ + + _other_fields = ("value",) + + def __init__( + self, + *, + value: Literal[True, False, None], + lineno: int | None = None, + col_offset: int | None = None, + end_lineno: int | None = None, + end_col_offset: int | None = None, + parent: NodeNG | None = None, + ) -> None: + self.value = value + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + +class MatchSequence(Pattern): + """Class representing a :class:`ast.MatchSequence` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + match x: + case [1, 2]: + ... + case (1, 2, *_): + ... + ''') + >>> node.cases[0].pattern + + >>> node.cases[1].pattern + + """ + + _astroid_fields = ("patterns",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + self.patterns: list[Pattern] + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, *, patterns: list[Pattern]) -> None: + self.patterns = patterns + + +class MatchMapping(_base_nodes.AssignTypeNode, Pattern): + """Class representing a :class:`ast.MatchMapping` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + match x: + case {1: "Hello", 2: "World", 3: _, **rest}: + ... + ''') + >>> node.cases[0].pattern + + """ + + _astroid_fields = ("keys", "patterns", "rest") + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + self.keys: list[NodeNG] + self.patterns: list[Pattern] + self.rest: AssignName | None + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + *, + keys: list[NodeNG], + patterns: list[Pattern], + rest: AssignName | None, + ) -> None: + self.keys = keys + self.patterns = patterns + self.rest = rest + + assigned_stmts: ClassVar[ + Callable[ + [ + MatchMapping, + AssignName, + InferenceContext | None, + None, + ], + Generator[NodeNG, None, None], + ] + ] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + +class MatchClass(Pattern): + """Class representing a :class:`ast.MatchClass` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + match x: + case Point2D(0, 0): + ... + case Point3D(x=0, y=0, z=0): + ... + ''') + >>> node.cases[0].pattern + + >>> node.cases[1].pattern + + """ + + _astroid_fields = ("cls", "patterns", "kwd_patterns") + _other_fields = ("kwd_attrs",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + self.cls: NodeNG + self.patterns: list[Pattern] + self.kwd_attrs: list[str] + self.kwd_patterns: list[Pattern] + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + *, + cls: NodeNG, + patterns: list[Pattern], + kwd_attrs: list[str], + kwd_patterns: list[Pattern], + ) -> None: + self.cls = cls + self.patterns = patterns + self.kwd_attrs = kwd_attrs + self.kwd_patterns = kwd_patterns + + +class MatchStar(_base_nodes.AssignTypeNode, Pattern): + """Class representing a :class:`ast.MatchStar` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + match x: + case [1, *_]: + ... + ''') + >>> node.cases[0].pattern.patterns[1] + + """ + + _astroid_fields = ("name",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + self.name: AssignName | None + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, *, name: AssignName | None) -> None: + self.name = name + + assigned_stmts: ClassVar[ + Callable[ + [ + MatchStar, + AssignName, + InferenceContext | None, + None, + ], + Generator[NodeNG, None, None], + ] + ] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + +class MatchAs(_base_nodes.AssignTypeNode, Pattern): + """Class representing a :class:`ast.MatchAs` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + match x: + case [1, a]: + ... + case {'key': b}: + ... + case Point2D(0, 0) as c: + ... + case d: + ... + ''') + >>> node.cases[0].pattern.patterns[1] + + >>> node.cases[1].pattern.patterns[0] + + >>> node.cases[2].pattern + + >>> node.cases[3].pattern + + """ + + _astroid_fields = ("pattern", "name") + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + self.pattern: Pattern | None + self.name: AssignName | None + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + *, + pattern: Pattern | None, + name: AssignName | None, + ) -> None: + self.pattern = pattern + self.name = name + + assigned_stmts: ClassVar[ + Callable[ + [ + MatchAs, + AssignName, + InferenceContext | None, + None, + ], + Generator[NodeNG, None, None], + ] + ] + """Returns the assigned statement (non inferred) according to the assignment type. + See astroid/protocols.py for actual implementation. + """ + + +class MatchOr(Pattern): + """Class representing a :class:`ast.MatchOr` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + match x: + case 400 | 401 | 402: + ... + ''') + >>> node.cases[0].pattern + + """ + + _astroid_fields = ("patterns",) + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + self.patterns: list[Pattern] + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, *, patterns: list[Pattern]) -> None: + self.patterns = patterns + + +# constants ############################################################## + +# The _proxied attribute of all container types (List, Tuple, etc.) +# are set during bootstrapping by _astroid_bootstrapping(). +CONST_CLS: dict[type, type[NodeNG]] = { + list: List, + tuple: Tuple, + dict: Dict, + set: Set, + type(None): Const, + type(NotImplemented): Const, + type(...): Const, + bool: Const, + int: Const, + float: Const, + complex: Const, + str: Const, + bytes: Const, +} + + +def _create_basic_elements( + value: Iterable[Any], node: List | Set | Tuple +) -> list[NodeNG]: + """Create a list of nodes to function as the elements of a new node.""" + elements: list[NodeNG] = [] + for element in value: + element_node = const_factory(element) + element_node.parent = node + elements.append(element_node) + return elements + + +def _create_dict_items( + values: Mapping[Any, Any], node: Dict +) -> list[tuple[SuccessfulInferenceResult, SuccessfulInferenceResult]]: + """Create a list of node pairs to function as the items of a new dict node.""" + elements: list[tuple[SuccessfulInferenceResult, SuccessfulInferenceResult]] = [] + for key, value in values.items(): + key_node = const_factory(key) + key_node.parent = node + value_node = const_factory(value) + value_node.parent = node + elements.append((key_node, value_node)) + return elements + + +def const_factory(value: Any) -> ConstFactoryResult: + """Return an astroid node for a python value.""" + assert not isinstance(value, NodeNG) + + # This only handles instances of the CONST types. Any + # subclasses get inferred as EmptyNode. + # TODO: See if we should revisit these with the normal builder. + if value.__class__ not in CONST_CLS: + node = EmptyNode() + node.object = value + return node + + instance: List | Set | Tuple | Dict + initializer_cls = CONST_CLS[value.__class__] + if issubclass(initializer_cls, (List, Set, Tuple)): + instance = initializer_cls() + instance.postinit(_create_basic_elements(value, instance)) + return instance + if issubclass(initializer_cls, Dict): + instance = initializer_cls() + instance.postinit(_create_dict_items(value, instance)) + return instance + return Const(value) diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/node_ng.py b/venv/lib/python3.10/site-packages/astroid/nodes/node_ng.py new file mode 100644 index 00000000..617f8ba4 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/nodes/node_ng.py @@ -0,0 +1,814 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +from __future__ import annotations + +import pprint +import sys +import warnings +from collections.abc import Generator, Iterator +from functools import singledispatch as _singledispatch +from typing import ( + TYPE_CHECKING, + Any, + ClassVar, + Tuple, + Type, + TypeVar, + Union, + cast, + overload, +) + +from astroid import decorators, util +from astroid.context import InferenceContext +from astroid.exceptions import ( + AstroidError, + InferenceError, + ParentMissingError, + StatementMissing, + UseInferenceDefault, +) +from astroid.manager import AstroidManager +from astroid.nodes.as_string import AsStringVisitor +from astroid.nodes.const import OP_PRECEDENCE +from astroid.nodes.utils import Position +from astroid.typing import InferenceErrorInfo, InferenceResult, InferFn + +if TYPE_CHECKING: + from astroid import nodes + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from typing_extensions import Literal + +if sys.version_info >= (3, 8): + from functools import cached_property +else: + from astroid.decorators import cachedproperty as cached_property + +# Types for 'NodeNG.nodes_of_class()' +_NodesT = TypeVar("_NodesT", bound="NodeNG") +_NodesT2 = TypeVar("_NodesT2", bound="NodeNG") +_NodesT3 = TypeVar("_NodesT3", bound="NodeNG") +SkipKlassT = Union[None, Type["NodeNG"], Tuple[Type["NodeNG"], ...]] + + +class NodeNG: + """A node of the new Abstract Syntax Tree (AST). + + This is the base class for all Astroid node classes. + """ + + is_statement: ClassVar[bool] = False + """Whether this node indicates a statement.""" + optional_assign: ClassVar[ + bool + ] = False # True for For (and for Comprehension if py <3.0) + """Whether this node optionally assigns a variable. + + This is for loop assignments because loop won't necessarily perform an + assignment if the loop has no iterations. + This is also the case from comprehensions in Python 2. + """ + is_function: ClassVar[bool] = False # True for FunctionDef nodes + """Whether this node indicates a function.""" + is_lambda: ClassVar[bool] = False + + # Attributes below are set by the builder module or by raw factories + _astroid_fields: ClassVar[tuple[str, ...]] = () + """Node attributes that contain child nodes. + + This is redefined in most concrete classes. + """ + _other_fields: ClassVar[tuple[str, ...]] = () + """Node attributes that do not contain child nodes.""" + _other_other_fields: ClassVar[tuple[str, ...]] = () + """Attributes that contain AST-dependent fields.""" + # instance specific inference function infer(node, context) + _explicit_inference: InferFn | None = None + + def __init__( + self, + lineno: int | None = None, + col_offset: int | None = None, + parent: NodeNG | None = None, + *, + end_lineno: int | None = None, + end_col_offset: int | None = None, + ) -> None: + """ + :param lineno: The line that this node appears on in the source code. + + :param col_offset: The column that this node appears on in the + source code. + + :param parent: The parent node in the syntax tree. + + :param end_lineno: The last line this node appears on in the source code. + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + """ + self.lineno: int | None = lineno + """The line that this node appears on in the source code.""" + + self.col_offset: int | None = col_offset + """The column that this node appears on in the source code.""" + + self.parent: NodeNG | None = parent + """The parent node in the syntax tree.""" + + self.end_lineno: int | None = end_lineno + """The last line this node appears on in the source code.""" + + self.end_col_offset: int | None = end_col_offset + """The end column this node appears on in the source code. + + Note: This is after the last symbol. + """ + + self.position: Position | None = None + """Position of keyword(s) and name. + + Used as fallback for block nodes which might not provide good + enough positional information. E.g. ClassDef, FunctionDef. + """ + + def infer( + self, context: InferenceContext | None = None, **kwargs: Any + ) -> Generator[InferenceResult, None, None]: + """Get a generator of the inferred values. + + This is the main entry point to the inference system. + + .. seealso:: :ref:`inference` + + If the instance has some explicit inference function set, it will be + called instead of the default interface. + + :returns: The inferred values. + :rtype: iterable + """ + if context is not None: + context = context.extra_context.get(self, context) + if self._explicit_inference is not None: + # explicit_inference is not bound, give it self explicitly + try: + # pylint: disable=not-callable + results = list(self._explicit_inference(self, context, **kwargs)) + if context is not None: + context.nodes_inferred += len(results) + yield from results + return + except UseInferenceDefault: + pass + + if not context: + # nodes_inferred? + yield from self._infer(context=context, **kwargs) + return + + key = (self, context.lookupname, context.callcontext, context.boundnode) + if key in context.inferred: + yield from context.inferred[key] + return + + results = [] + + # Limit inference amount to help with performance issues with + # exponentially exploding possible results. + limit = AstroidManager.max_inferable_values + for i, result in enumerate(self._infer(context=context, **kwargs)): + if i >= limit or (context.nodes_inferred > context.max_inferred): + results.append(util.Uninferable) + yield util.Uninferable + break + results.append(result) + yield result + context.nodes_inferred += 1 + + # Cache generated results for subsequent inferences of the + # same node using the same context + context.inferred[key] = tuple(results) + return + + def _repr_name(self) -> str: + """Get a name for nice representation. + + This is either :attr:`name`, :attr:`attrname`, or the empty string. + + :returns: The nice name. + :rtype: str + """ + if all(name not in self._astroid_fields for name in ("name", "attrname")): + return getattr(self, "name", "") or getattr(self, "attrname", "") + return "" + + def __str__(self) -> str: + rname = self._repr_name() + cname = type(self).__name__ + if rname: + string = "%(cname)s.%(rname)s(%(fields)s)" + alignment = len(cname) + len(rname) + 2 + else: + string = "%(cname)s(%(fields)s)" + alignment = len(cname) + 1 + result = [] + for field in self._other_fields + self._astroid_fields: + value = getattr(self, field) + width = 80 - len(field) - alignment + lines = pprint.pformat(value, indent=2, width=width).splitlines(True) + + inner = [lines[0]] + for line in lines[1:]: + inner.append(" " * alignment + line) + result.append(f"{field}={''.join(inner)}") + + return string % { + "cname": cname, + "rname": rname, + "fields": (",\n" + " " * alignment).join(result), + } + + def __repr__(self) -> str: + rname = self._repr_name() + if rname: + string = "<%(cname)s.%(rname)s l.%(lineno)s at 0x%(id)x>" + else: + string = "<%(cname)s l.%(lineno)s at 0x%(id)x>" + return string % { + "cname": type(self).__name__, + "rname": rname, + "lineno": self.fromlineno, + "id": id(self), + } + + def accept(self, visitor): + """Visit this node using the given visitor.""" + func = getattr(visitor, "visit_" + self.__class__.__name__.lower()) + return func(self) + + def get_children(self) -> Iterator[NodeNG]: + """Get the child nodes below this node.""" + for field in self._astroid_fields: + attr = getattr(self, field) + if attr is None: + continue + if isinstance(attr, (list, tuple)): + yield from attr + else: + yield attr + yield from () + + def last_child(self) -> NodeNG | None: + """An optimized version of list(get_children())[-1].""" + for field in self._astroid_fields[::-1]: + attr = getattr(self, field) + if not attr: # None or empty list / tuple + continue + if isinstance(attr, (list, tuple)): + return attr[-1] + return attr + return None + + def node_ancestors(self) -> Iterator[NodeNG]: + """Yield parent, grandparent, etc until there are no more.""" + parent = self.parent + while parent is not None: + yield parent + parent = parent.parent + + def parent_of(self, node) -> bool: + """Check if this node is the parent of the given node. + + :param node: The node to check if it is the child. + :type node: NodeNG + + :returns: Whether this node is the parent of the given node. + """ + return any(self is parent for parent in node.node_ancestors()) + + @overload + def statement(self, *, future: None = ...) -> nodes.Statement | nodes.Module: + ... + + @overload + def statement(self, *, future: Literal[True]) -> nodes.Statement: + ... + + def statement( + self, *, future: Literal[None, True] = None + ) -> nodes.Statement | nodes.Module: + """The first parent node, including self, marked as statement node. + + TODO: Deprecate the future parameter and only raise StatementMissing and return + nodes.Statement + + :raises AttributeError: If self has no parent attribute + :raises StatementMissing: If self has no parent attribute and future is True + """ + if self.is_statement: + return cast("nodes.Statement", self) + if not self.parent: + if future: + raise StatementMissing(target=self) + warnings.warn( + "In astroid 3.0.0 NodeNG.statement() will return either a nodes.Statement " + "or raise a StatementMissing exception. AttributeError will no longer be raised. " + "This behaviour can already be triggered " + "by passing 'future=True' to a statement() call.", + DeprecationWarning, + stacklevel=2, + ) + raise AttributeError(f"{self} object has no attribute 'parent'") + return self.parent.statement(future=future) + + def frame( + self, *, future: Literal[None, True] = None + ) -> nodes.FunctionDef | nodes.Module | nodes.ClassDef | nodes.Lambda: + """The first parent frame node. + + A frame node is a :class:`Module`, :class:`FunctionDef`, + :class:`ClassDef` or :class:`Lambda`. + + :returns: The first parent frame node. + """ + if self.parent is None: + if future: + raise ParentMissingError(target=self) + warnings.warn( + "In astroid 3.0.0 NodeNG.frame() will return either a Frame node, " + "or raise ParentMissingError. AttributeError will no longer be raised. " + "This behaviour can already be triggered " + "by passing 'future=True' to a frame() call.", + DeprecationWarning, + stacklevel=2, + ) + raise AttributeError(f"{self} object has no attribute 'parent'") + + return self.parent.frame(future=future) + + def scope(self) -> nodes.LocalsDictNodeNG: + """The first parent node defining a new scope. + + These can be Module, FunctionDef, ClassDef, Lambda, or GeneratorExp nodes. + + :returns: The first parent scope node. + """ + if not self.parent: + raise ParentMissingError(target=self) + return self.parent.scope() + + def root(self) -> nodes.Module: + """Return the root node of the syntax tree. + + :returns: The root node. + """ + if self.parent: + return self.parent.root() + return self # type: ignore[return-value] # Only 'Module' does not have a parent node. + + def child_sequence(self, child): + """Search for the sequence that contains this child. + + :param child: The child node to search sequences for. + :type child: NodeNG + + :returns: The sequence containing the given child node. + :rtype: iterable(NodeNG) + + :raises AstroidError: If no sequence could be found that contains + the given child. + """ + for field in self._astroid_fields: + node_or_sequence = getattr(self, field) + if node_or_sequence is child: + return [node_or_sequence] + # /!\ compiler.ast Nodes have an __iter__ walking over child nodes + if ( + isinstance(node_or_sequence, (tuple, list)) + and child in node_or_sequence + ): + return node_or_sequence + + msg = "Could not find %s in %s's children" + raise AstroidError(msg % (repr(child), repr(self))) + + def locate_child(self, child): + """Find the field of this node that contains the given child. + + :param child: The child node to search fields for. + :type child: NodeNG + + :returns: A tuple of the name of the field that contains the child, + and the sequence or node that contains the child node. + :rtype: tuple(str, iterable(NodeNG) or NodeNG) + + :raises AstroidError: If no field could be found that contains + the given child. + """ + for field in self._astroid_fields: + node_or_sequence = getattr(self, field) + # /!\ compiler.ast Nodes have an __iter__ walking over child nodes + if child is node_or_sequence: + return field, child + if ( + isinstance(node_or_sequence, (tuple, list)) + and child in node_or_sequence + ): + return field, node_or_sequence + msg = "Could not find %s in %s's children" + raise AstroidError(msg % (repr(child), repr(self))) + + # FIXME : should we merge child_sequence and locate_child ? locate_child + # is only used in are_exclusive, child_sequence one time in pylint. + + def next_sibling(self): + """The next sibling statement node. + + :returns: The next sibling statement node. + :rtype: NodeNG or None + """ + return self.parent.next_sibling() + + def previous_sibling(self): + """The previous sibling statement. + + :returns: The previous sibling statement node. + :rtype: NodeNG or None + """ + return self.parent.previous_sibling() + + # these are lazy because they're relatively expensive to compute for every + # single node, and they rarely get looked at + + @cached_property + def fromlineno(self) -> int | None: + """The first line that this node appears on in the source code.""" + if self.lineno is None: + return self._fixed_source_line() + return self.lineno + + @cached_property + def tolineno(self) -> int | None: + """The last line that this node appears on in the source code.""" + if self.end_lineno is not None: + return self.end_lineno + if not self._astroid_fields: + # can't have children + last_child = None + else: + last_child = self.last_child() + if last_child is None: + return self.fromlineno + return last_child.tolineno + + def _fixed_source_line(self) -> int | None: + """Attempt to find the line that this node appears on. + + We need this method since not all nodes have :attr:`lineno` set. + """ + line = self.lineno + _node = self + try: + while line is None: + _node = next(_node.get_children()) + line = _node.lineno + except StopIteration: + parent = self.parent + while parent and line is None: + line = parent.lineno + parent = parent.parent + return line + + def block_range(self, lineno): + """Get a range from the given line number to where this node ends. + + :param lineno: The line number to start the range at. + :type lineno: int + + :returns: The range of line numbers that this node belongs to, + starting at the given line number. + :rtype: tuple(int, int or None) + """ + return lineno, self.tolineno + + def set_local(self, name: str, stmt: NodeNG) -> None: + """Define that the given name is declared in the given statement node. + + This definition is stored on the parent scope node. + + .. seealso:: :meth:`scope` + + :param name: The name that is being defined. + + :param stmt: The statement that defines the given name. + """ + assert self.parent + self.parent.set_local(name, stmt) + + @overload + def nodes_of_class( + self, + klass: type[_NodesT], + skip_klass: SkipKlassT = ..., + ) -> Iterator[_NodesT]: + ... + + @overload + def nodes_of_class( + self, + klass: tuple[type[_NodesT], type[_NodesT2]], + skip_klass: SkipKlassT = ..., + ) -> Iterator[_NodesT] | Iterator[_NodesT2]: + ... + + @overload + def nodes_of_class( + self, + klass: tuple[type[_NodesT], type[_NodesT2], type[_NodesT3]], + skip_klass: SkipKlassT = ..., + ) -> Iterator[_NodesT] | Iterator[_NodesT2] | Iterator[_NodesT3]: + ... + + @overload + def nodes_of_class( + self, + klass: tuple[type[_NodesT], ...], + skip_klass: SkipKlassT = ..., + ) -> Iterator[_NodesT]: + ... + + def nodes_of_class( # type: ignore[misc] # mypy doesn't correctly recognize the overloads + self, + klass: ( + type[_NodesT] + | tuple[type[_NodesT], type[_NodesT2]] + | tuple[type[_NodesT], type[_NodesT2], type[_NodesT3]] + | tuple[type[_NodesT], ...] + ), + skip_klass: SkipKlassT = None, + ) -> Iterator[_NodesT] | Iterator[_NodesT2] | Iterator[_NodesT3]: + """Get the nodes (including this one or below) of the given types. + + :param klass: The types of node to search for. + + :param skip_klass: The types of node to ignore. This is useful to ignore + subclasses of :attr:`klass`. + + :returns: The node of the given types. + """ + if isinstance(self, klass): + yield self + + if skip_klass is None: + for child_node in self.get_children(): + yield from child_node.nodes_of_class(klass, skip_klass) + + return + + for child_node in self.get_children(): + if isinstance(child_node, skip_klass): + continue + yield from child_node.nodes_of_class(klass, skip_klass) + + @decorators.cached + def _get_assign_nodes(self): + return [] + + def _get_name_nodes(self): + for child_node in self.get_children(): + yield from child_node._get_name_nodes() + + def _get_return_nodes_skip_functions(self): + yield from () + + def _get_yield_nodes_skip_lambdas(self): + yield from () + + def _infer_name(self, frame, name): + # overridden for ImportFrom, Import, Global, TryExcept and Arguments + pass + + def _infer( + self, context: InferenceContext | None = None, **kwargs: Any + ) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: + """We don't know how to resolve a statement by default.""" + # this method is overridden by most concrete classes + raise InferenceError( + "No inference function for {node!r}.", node=self, context=context + ) + + def inferred(self): + """Get a list of the inferred values. + + .. seealso:: :ref:`inference` + + :returns: The inferred values. + :rtype: list + """ + return list(self.infer()) + + def instantiate_class(self): + """Instantiate an instance of the defined class. + + .. note:: + + On anything other than a :class:`ClassDef` this will return self. + + :returns: An instance of the defined class. + :rtype: object + """ + return self + + def has_base(self, node) -> bool: + """Check if this node inherits from the given type. + + :param node: The node defining the base to look for. + Usually this is a :class:`Name` node. + :type node: NodeNG + """ + return False + + def callable(self) -> bool: + """Whether this node defines something that is callable. + + :returns: Whether this defines something that is callable. + """ + return False + + def eq(self, value) -> bool: + return False + + def as_string(self) -> str: + """Get the source code that this node represents.""" + return AsStringVisitor()(self) + + def repr_tree( + self, + ids=False, + include_linenos=False, + ast_state=False, + indent=" ", + max_depth=0, + max_width=80, + ) -> str: + """Get a string representation of the AST from this node. + + :param ids: If true, includes the ids with the node type names. + :type ids: bool + + :param include_linenos: If true, includes the line numbers and + column offsets. + :type include_linenos: bool + + :param ast_state: If true, includes information derived from + the whole AST like local and global variables. + :type ast_state: bool + + :param indent: A string to use to indent the output string. + :type indent: str + + :param max_depth: If set to a positive integer, won't return + nodes deeper than max_depth in the string. + :type max_depth: int + + :param max_width: Attempt to format the output string to stay + within this number of characters, but can exceed it under some + circumstances. Only positive integer values are valid, the default is 80. + :type max_width: int + + :returns: The string representation of the AST. + :rtype: str + """ + + @_singledispatch + def _repr_tree(node, result, done, cur_indent="", depth=1): + """Outputs a representation of a non-tuple/list, non-node that's + contained within an AST, including strings. + """ + lines = pprint.pformat( + node, width=max(max_width - len(cur_indent), 1) + ).splitlines(True) + result.append(lines[0]) + result.extend([cur_indent + line for line in lines[1:]]) + return len(lines) != 1 + + # pylint: disable=unused-variable,useless-suppression; doesn't understand singledispatch + @_repr_tree.register(tuple) + @_repr_tree.register(list) + def _repr_seq(node, result, done, cur_indent="", depth=1): + """Outputs a representation of a sequence that's contained within an + AST. + """ + cur_indent += indent + result.append("[") + if not node: + broken = False + elif len(node) == 1: + broken = _repr_tree(node[0], result, done, cur_indent, depth) + elif len(node) == 2: + broken = _repr_tree(node[0], result, done, cur_indent, depth) + if not broken: + result.append(", ") + else: + result.append(",\n") + result.append(cur_indent) + broken = _repr_tree(node[1], result, done, cur_indent, depth) or broken + else: + result.append("\n") + result.append(cur_indent) + for child in node[:-1]: + _repr_tree(child, result, done, cur_indent, depth) + result.append(",\n") + result.append(cur_indent) + _repr_tree(node[-1], result, done, cur_indent, depth) + broken = True + result.append("]") + return broken + + # pylint: disable=unused-variable,useless-suppression; doesn't understand singledispatch + @_repr_tree.register(NodeNG) + def _repr_node(node, result, done, cur_indent="", depth=1): + """Outputs a strings representation of an astroid node.""" + if node in done: + result.append( + indent + f" max_depth: + result.append("...") + return False + depth += 1 + cur_indent += indent + if ids: + result.append(f"{type(node).__name__}<0x{id(node):x}>(\n") + else: + result.append(f"{type(node).__name__}(") + fields = [] + if include_linenos: + fields.extend(("lineno", "col_offset")) + fields.extend(node._other_fields) + fields.extend(node._astroid_fields) + if ast_state: + fields.extend(node._other_other_fields) + if not fields: + broken = False + elif len(fields) == 1: + result.append(f"{fields[0]}=") + broken = _repr_tree( + getattr(node, fields[0]), result, done, cur_indent, depth + ) + else: + result.append("\n") + result.append(cur_indent) + for field in fields[:-1]: + # TODO: Remove this after removal of the 'doc' attribute + if field == "doc": + continue + result.append(f"{field}=") + _repr_tree(getattr(node, field), result, done, cur_indent, depth) + result.append(",\n") + result.append(cur_indent) + result.append(f"{fields[-1]}=") + _repr_tree(getattr(node, fields[-1]), result, done, cur_indent, depth) + broken = True + result.append(")") + return broken + + result: list[str] = [] + _repr_tree(self, result, set()) + return "".join(result) + + def bool_value(self, context: InferenceContext | None = None): + """Determine the boolean value of this node. + + The boolean value of a node can have three + possible values: + + * False: For instance, empty data structures, + False, empty strings, instances which return + explicitly False from the __nonzero__ / __bool__ + method. + * True: Most of constructs are True by default: + classes, functions, modules etc + * Uninferable: The inference engine is uncertain of the + node's value. + + :returns: The boolean value of this node. + :rtype: bool or Uninferable + """ + return util.Uninferable + + def op_precedence(self): + # Look up by class name or default to highest precedence + return OP_PRECEDENCE.get(self.__class__.__name__, len(OP_PRECEDENCE)) + + def op_left_associative(self) -> Literal[True]: + # Everything is left associative except `**` and IfExp + return True diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__init__.py b/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__init__.py new file mode 120000 index 00000000..ee4132b9 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__init__.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/09/17/53/85efcb896ed281c273de91d22fca05a8728d2095a0d569103a4c2cf7de \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__pycache__/__init__.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac8db0710c7bb0c63327e67e4351c1216ba572db GIT binary patch literal 1057 zcmaKr%Wl*#6oxa`q?s#I_Lwe!k%kEs8-x&|YDx8$l5K`1a)c<43>0{Pg30p1PmC^RGGc zk_9-(YFS;>WF6OK12<|gZ-}OB;g)RUwhVD7BOJ*cydz^A%MR|yF7C=6?#Vvx%K;w9 zAs&|dn&N>R;gKJ=@NU*V4aOnu)PmsiiW?+#wiXPfT3O1KK~xBo3Tg~9$gZeGv?#wC zp0R>uh@w4{>YQbJNa>6rs{ER|u`8~Yalr(&EStvh0V<=a7+;1~qcWr44TX?mS4ilT zicKt6z9K_{s^yw48Oqo>SKM-~UdJCx%n3RKv?F#tLGRZpg>Qa>o&m*-%0)&e=!7X& zP^*jM>wJQacxn%|%uCQyR*kJjMoWg+wPnhVr|~a;>cP0~Mi5%Cl?U{xPr;}g&VbQC zqPcfGKN)x3@W9-tbPK^nw`4B5E$KSj0o`pb*RE(?G~=dZa_!2Z3pbFiN4O!9Sz7)M zH#*-KCRW4pN@s4gWR_eNG|&C%lQM2xbN$7d3(FM|T3@X5@t|mWcSQ>X`mAV!gdh>f z4oD2r0O^2qL53iGkO4@~%Y6LMg@j}}B?KdCY@vBJg-$TjsxL@2k^GvgsvKm+Pw$D{ z-nhm3U(7o~K)NHm7iev{Fr_6h;M<&#uR*a32|)gwB`e<&NwHSGeUjsYPao#bXLPZj zTrzc;2);;i-{o4pobJC!47cogPSXqDrzY80OG@X-wwr_yXkkL8`HhR-RG00ozk7j! P18+8m;j3D=AJzW?TV6U| literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__pycache__/mixin.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__pycache__/mixin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3566160ac47f01df6af597bb1d7115ec512431e9 GIT binary patch literal 7044 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 B5(xkR literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__pycache__/scoped_nodes.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__pycache__/scoped_nodes.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..462bed47af9d29ac2a2504bef21d02529b54be79 GIT binary patch literal 74249 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__pycache__/utils.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8af4c20df0a72198ad044ca09eeb7dbb21d2f337 GIT binary patch literal 1055 zcmZWo&2H2%5VoCcHchubaDtoRwt{XzTtGsoRaKR$?FzL>s6kbfCSEqJV=uPTveoVh z9)uow8qVa(iC3sZ#W)Edgrkf<&rD{<-%RAvQs5wj*1oE%xnBSF9q>QP8rKoR`T#(N zB9!5ba9ogxV2d5@6mI0!*yWwVi@X|lc(?E)A0y_e`{3vCg(8Rouq|hcS?`k@EoMuH zsK0Xg^z}H`w2)cJ8BL`yNiH-kP0n*OrK3`$CYPWYNkw%kCoH2vW=s!$*h2fbT1m~*AGlN;p}abY`?DWA^jb^RS%((;r8)yifu9Na$)!3-L$+J00wijGmM^H-H<)2SGq#9n@E@?L60p$`LIR zla6!oj%whR6-*dS6Oq+E3AosP{2#B5R{3$9<*A9|FR0&99iSjuY4hs1NnH86Y`UeC zRMle2S)$@JNyn`6xJ(nS`>yK3XH~aoIu)(PZGae(+ZIM0Z3?4R58P^TeH@Nu!9rCE z!Bn`laj-L7+e=O!hv!V3hde(CCsQ+);>qCgqfqCDtxb~j4CX+GZOpK4cG!$r+#KvA z>cM1ME&ncn*R;92gymQ?9W(vW;%hkC_81*N?Z7#rK#q+>b6?t jflrd<8xNeWYgL}jUx$OJ`BGVyZ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/mixin.py b/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/mixin.py new file mode 120000 index 00000000..6a7b15b3 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/mixin.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/98/dd/e8/a8aa52d8058eb6b0631c30df45e54eecec4032197f7acfa3cec9fcf49b \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/scoped_nodes.py b/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/scoped_nodes.py new file mode 100644 index 00000000..bec817d7 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/scoped_nodes.py @@ -0,0 +1,3084 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +""" +This module contains the classes for "scoped" node, i.e. which are opening a +new local scope in the language definition : Module, ClassDef, FunctionDef (and +Lambda, GeneratorExp, DictComp and SetComp to some extent). +""" + +from __future__ import annotations + +import io +import itertools +import os +import sys +import warnings +from collections.abc import Generator, Iterator +from functools import lru_cache +from typing import TYPE_CHECKING, ClassVar, NoReturn, TypeVar, overload + +from astroid import bases +from astroid import decorators as decorators_mod +from astroid import util +from astroid.const import IS_PYPY, PY38, PY38_PLUS, PY39_PLUS, PYPY_7_3_11_PLUS +from astroid.context import ( + CallContext, + InferenceContext, + bind_context_to_node, + copy_context, +) +from astroid.exceptions import ( + AstroidBuildingError, + AstroidTypeError, + AttributeInferenceError, + DuplicateBasesError, + InconsistentMroError, + InferenceError, + MroError, + StatementMissing, + TooManyLevelsError, +) +from astroid.interpreter.dunder_lookup import lookup +from astroid.interpreter.objectmodel import ClassModel, FunctionModel, ModuleModel +from astroid.manager import AstroidManager +from astroid.nodes import Arguments, Const, NodeNG, _base_nodes, node_classes +from astroid.nodes.scoped_nodes.mixin import ComprehensionScope, LocalsDictNodeNG +from astroid.nodes.scoped_nodes.utils import builtin_lookup +from astroid.nodes.utils import Position +from astroid.typing import InferBinaryOp, InferenceResult, SuccessfulInferenceResult + +if sys.version_info >= (3, 8): + from functools import cached_property + from typing import Literal +else: + from typing_extensions import Literal + + from astroid.decorators import cachedproperty as cached_property + +if TYPE_CHECKING: + from astroid import nodes + + +ITER_METHODS = ("__iter__", "__getitem__") +EXCEPTION_BASE_CLASSES = frozenset({"Exception", "BaseException"}) +objects = util.lazy_import("objects") +BUILTIN_DESCRIPTORS = frozenset( + {"classmethod", "staticmethod", "builtins.classmethod", "builtins.staticmethod"} +) + +_T = TypeVar("_T") + + +def _c3_merge(sequences, cls, context): + """Merges MROs in *sequences* to a single MRO using the C3 algorithm. + + Adapted from http://www.python.org/download/releases/2.3/mro/. + + """ + result = [] + while True: + sequences = [s for s in sequences if s] # purge empty sequences + if not sequences: + return result + for s1 in sequences: # find merge candidates among seq heads + candidate = s1[0] + for s2 in sequences: + if candidate in s2[1:]: + candidate = None + break # reject the current head, it appears later + else: + break + if not candidate: + # Show all the remaining bases, which were considered as + # candidates for the next mro sequence. + raise InconsistentMroError( + message="Cannot create a consistent method resolution order " + "for MROs {mros} of class {cls!r}.", + mros=sequences, + cls=cls, + context=context, + ) + + result.append(candidate) + # remove the chosen candidate + for seq in sequences: + if seq[0] == candidate: + del seq[0] + return None + + +def clean_typing_generic_mro(sequences: list[list[ClassDef]]) -> None: + """A class can inherit from typing.Generic directly, as base, + and as base of bases. The merged MRO must however only contain the last entry. + To prepare for _c3_merge, remove some typing.Generic entries from + sequences if multiple are present. + + This method will check if Generic is in inferred_bases and also + part of bases_mro. If true, remove it from inferred_bases + as well as its entry the bases_mro. + + Format sequences: [[self]] + bases_mro + [inferred_bases] + """ + bases_mro = sequences[1:-1] + inferred_bases = sequences[-1] + # Check if Generic is part of inferred_bases + for i, base in enumerate(inferred_bases): + if base.qname() == "typing.Generic": + position_in_inferred_bases = i + break + else: + return + # Check if also part of bases_mro + # Ignore entry for typing.Generic + for i, seq in enumerate(bases_mro): + if i == position_in_inferred_bases: + continue + if any(base.qname() == "typing.Generic" for base in seq): + break + else: + return + # Found multiple Generics in mro, remove entry from inferred_bases + # and the corresponding one from bases_mro + inferred_bases.pop(position_in_inferred_bases) + bases_mro.pop(position_in_inferred_bases) + + +def clean_duplicates_mro(sequences, cls, context): + for sequence in sequences: + names = [ + (node.lineno, node.qname()) if node.name else None for node in sequence + ] + last_index = dict(map(reversed, enumerate(names))) + if names and names[0] is not None and last_index[names[0]] != 0: + raise DuplicateBasesError( + message="Duplicates found in MROs {mros} for {cls!r}.", + mros=sequences, + cls=cls, + context=context, + ) + yield [ + node + for i, (node, name) in enumerate(zip(sequence, names)) + if name is None or last_index[name] == i + ] + + +def function_to_method(n, klass): + if isinstance(n, FunctionDef): + if n.type == "classmethod": + return bases.BoundMethod(n, klass) + if n.type == "property": + return n + if n.type != "staticmethod": + return bases.UnboundMethod(n) + return n + + +class Module(LocalsDictNodeNG): + """Class representing an :class:`ast.Module` node. + + >>> import astroid + >>> node = astroid.extract_node('import astroid') + >>> node + + >>> node.parent + + """ + + _astroid_fields = ("doc_node", "body") + + fromlineno: Literal[0] = 0 + """The first line that this node appears on in the source code.""" + + lineno: Literal[0] = 0 + """The line that this node appears on in the source code.""" + + # attributes below are set by the builder module or by raw factories + + file_bytes: str | bytes | None = None + """The string/bytes that this ast was built from.""" + + file_encoding: str | None = None + """The encoding of the source file. + + This is used to get unicode out of a source file. + Python 2 only. + """ + + special_attributes = ModuleModel() + """The names of special attributes that this module has.""" + + # names of module attributes available through the global scope + scope_attrs = {"__name__", "__doc__", "__file__", "__path__", "__package__"} + """The names of module attributes available through the global scope.""" + + _other_fields = ( + "name", + "doc", + "file", + "path", + "package", + "pure_python", + "future_imports", + ) + _other_other_fields = ("locals", "globals") + + col_offset: None + end_lineno: None + end_col_offset: None + parent: None + + @decorators_mod.deprecate_arguments(doc="Use the postinit arg 'doc_node' instead") + def __init__( + self, + name: str, + doc: str | None = None, + file: str | None = None, + path: list[str] | None = None, + package: bool | None = None, + parent: None = None, + pure_python: bool | None = True, + ) -> None: + """ + :param name: The name of the module. + + :param doc: The module docstring. + + :param file: The path to the file that this ast has been extracted from. + + :param path: + + :param package: Whether the node represents a package or a module. + + :param parent: The parent node in the syntax tree. + + :param pure_python: Whether the ast was built from source. + """ + self.name = name + """The name of the module.""" + + self._doc = doc + """The module docstring.""" + + self.file = file + """The path to the file that this ast has been extracted from. + + This will be ``None`` when the representation has been built from a + built-in module. + """ + + self.path = path + + self.package = package + """Whether the node represents a package or a module.""" + + self.pure_python = pure_python + """Whether the ast was built from source.""" + + self.globals: dict[str, list[node_classes.NodeNG]] + """A map of the name of a global variable to the node defining the global.""" + + self.locals = self.globals = {} + """A map of the name of a local variable to the node defining the local.""" + + self.body: list[node_classes.NodeNG] | None = [] + """The contents of the module.""" + + self.doc_node: Const | None = None + """The doc node associated with this node.""" + + self.future_imports: set[str] = set() + """The imports from ``__future__``.""" + + super().__init__(lineno=0, parent=parent) + + # pylint: enable=redefined-builtin + + def postinit(self, body=None, *, doc_node: Const | None = None): + """Do some setup after initialisation. + + :param body: The contents of the module. + :type body: list(NodeNG) or None + :param doc_node: The doc node associated with this node. + """ + self.body = body + self.doc_node = doc_node + if doc_node: + self._doc = doc_node.value + + @property + def doc(self) -> str | None: + """The module docstring.""" + warnings.warn( + "The 'Module.doc' attribute is deprecated, " + "use 'Module.doc_node' instead.", + DeprecationWarning, + stacklevel=2, + ) + return self._doc + + @doc.setter + def doc(self, value: str | None) -> None: + warnings.warn( + "Setting the 'Module.doc' attribute is deprecated, " + "use 'Module.doc_node' instead.", + DeprecationWarning, + stacklevel=2, + ) + self._doc = value + + def _get_stream(self): + if self.file_bytes is not None: + return io.BytesIO(self.file_bytes) + if self.file is not None: + # pylint: disable=consider-using-with + stream = open(self.file, "rb") + return stream + return None + + def stream(self): + """Get a stream to the underlying file or bytes. + + :type: file or io.BytesIO or None + """ + return self._get_stream() + + def block_range(self, lineno): + """Get a range from where this node starts to where this node ends. + + :param lineno: Unused. + :type lineno: int + + :returns: The range of line numbers that this node belongs to. + :rtype: tuple(int, int) + """ + return self.fromlineno, self.tolineno + + def scope_lookup(self, node, name, offset=0): + """Lookup where the given variable is assigned. + + :param node: The node to look for assignments up to. + Any assignments after the given node are ignored. + :type node: NodeNG + + :param name: The name of the variable to find assignments for. + :type name: str + + :param offset: The line offset to filter statements up to. + :type offset: int + + :returns: This scope node and the list of assignments associated to the + given name according to the scope where it has been found (locals, + globals or builtin). + :rtype: tuple(str, list(NodeNG)) + """ + if name in self.scope_attrs and name not in self.locals: + try: + return self, self.getattr(name) + except AttributeInferenceError: + return self, () + return self._scope_lookup(node, name, offset) + + def pytype(self) -> Literal["builtins.module"]: + """Get the name of the type that this node represents. + + :returns: The name of the type. + """ + return "builtins.module" + + def display_type(self) -> str: + """A human readable type of this node. + + :returns: The type of this node. + :rtype: str + """ + return "Module" + + def getattr( + self, name, context: InferenceContext | None = None, ignore_locals=False + ): + if not name: + raise AttributeInferenceError(target=self, attribute=name, context=context) + + result = [] + name_in_locals = name in self.locals + + if name in self.special_attributes and not ignore_locals and not name_in_locals: + result = [self.special_attributes.lookup(name)] + elif not ignore_locals and name_in_locals: + result = self.locals[name] + elif self.package: + try: + result = [self.import_module(name, relative_only=True)] + except (AstroidBuildingError, SyntaxError) as exc: + raise AttributeInferenceError( + target=self, attribute=name, context=context + ) from exc + result = [n for n in result if not isinstance(n, node_classes.DelName)] + if result: + return result + raise AttributeInferenceError(target=self, attribute=name, context=context) + + def igetattr(self, name, context: InferenceContext | None = None): + """Infer the possible values of the given variable. + + :param name: The name of the variable to infer. + :type name: str + + :returns: The inferred possible values. + :rtype: iterable(NodeNG) or None + """ + # set lookup name since this is necessary to infer on import nodes for + # instance + context = copy_context(context) + context.lookupname = name + try: + return bases._infer_stmts(self.getattr(name, context), context, frame=self) + except AttributeInferenceError as error: + raise InferenceError( + str(error), target=self, attribute=name, context=context + ) from error + + def fully_defined(self) -> bool: + """Check if this module has been build from a .py file. + + If so, the module contains a complete representation, + including the code. + + :returns: Whether the module has been built from a .py file. + """ + return self.file is not None and self.file.endswith(".py") + + @overload + def statement(self, *, future: None = ...) -> Module: + ... + + @overload + def statement(self, *, future: Literal[True]) -> NoReturn: + ... + + def statement(self, *, future: Literal[None, True] = None) -> Module | NoReturn: + """The first parent node, including self, marked as statement node. + + When called on a :class:`Module` with the future parameter this raises an error. + + TODO: Deprecate the future parameter and only raise StatementMissing + + :raises StatementMissing: If no self has no parent attribute and future is True + """ + if future: + raise StatementMissing(target=self) + warnings.warn( + "In astroid 3.0.0 NodeNG.statement() will return either a nodes.Statement " + "or raise a StatementMissing exception. nodes.Module will no longer be " + "considered a statement. This behaviour can already be triggered " + "by passing 'future=True' to a statement() call.", + DeprecationWarning, + stacklevel=2, + ) + return self + + def previous_sibling(self): + """The previous sibling statement. + + :returns: The previous sibling statement node. + :rtype: NodeNG or None + """ + + def next_sibling(self): + """The next sibling statement node. + + :returns: The next sibling statement node. + :rtype: NodeNG or None + """ + + _absolute_import_activated = True + + def absolute_import_activated(self) -> bool: + """Whether :pep:`328` absolute import behaviour has been enabled. + + :returns: Whether :pep:`328` has been enabled. + """ + return self._absolute_import_activated + + def import_module( + self, + modname: str | None, + relative_only: bool = False, + level: int | None = None, + use_cache: bool = True, + ) -> Module: + """Get the ast for a given module as if imported from this module. + + :param modname: The name of the module to "import". + + :param relative_only: Whether to only consider relative imports. + + :param level: The level of relative import. + + :param use_cache: Whether to use the astroid_cache of modules. + + :returns: The imported module ast. + """ + if relative_only and level is None: + level = 0 + absmodname = self.relative_to_absolute_name(modname, level) + + try: + return AstroidManager().ast_from_module_name( + absmodname, use_cache=use_cache + ) + except AstroidBuildingError: + # we only want to import a sub module or package of this module, + # skip here + if relative_only: + raise + return AstroidManager().ast_from_module_name(modname) + + def relative_to_absolute_name( + self, modname: str | None, level: int | None + ) -> str | None: + """Get the absolute module name for a relative import. + + The relative import can be implicit or explicit. + + :param modname: The module name to convert. + + :param level: The level of relative import. + + :returns: The absolute module name. + + :raises TooManyLevelsError: When the relative import refers to a + module too far above this one. + """ + # XXX this returns non sens when called on an absolute import + # like 'pylint.checkers.astroid.utils' + # XXX doesn't return absolute name if self.name isn't absolute name + if self.absolute_import_activated() and level is None: + return modname + if level: + if self.package: + level = level - 1 + package_name = self.name.rsplit(".", level)[0] + elif ( + self.path + and not os.path.exists(os.path.dirname(self.path[0]) + "/__init__.py") + and os.path.exists( + os.path.dirname(self.path[0]) + "/" + modname.split(".")[0] + ) + ): + level = level - 1 + package_name = "" + else: + package_name = self.name.rsplit(".", level)[0] + if level and self.name.count(".") < level: + raise TooManyLevelsError(level=level, name=self.name) + + elif self.package: + package_name = self.name + else: + package_name = self.name.rsplit(".", 1)[0] + + if package_name: + if not modname: + return package_name + return f"{package_name}.{modname}" + return modname + + def wildcard_import_names(self): + """The list of imported names when this module is 'wildcard imported'. + + It doesn't include the '__builtins__' name which is added by the + current CPython implementation of wildcard imports. + + :returns: The list of imported names. + :rtype: list(str) + """ + # We separate the different steps of lookup in try/excepts + # to avoid catching too many Exceptions + default = [name for name in self.keys() if not name.startswith("_")] + try: + all_values = self["__all__"] + except KeyError: + return default + + try: + explicit = next(all_values.assigned_stmts()) + except (InferenceError, StopIteration): + return default + except AttributeError: + # not an assignment node + # XXX infer? + return default + + # Try our best to detect the exported name. + inferred = [] + try: + explicit = next(explicit.infer()) + except (InferenceError, StopIteration): + return default + if not isinstance(explicit, (node_classes.Tuple, node_classes.List)): + return default + + def str_const(node) -> bool: + return isinstance(node, node_classes.Const) and isinstance(node.value, str) + + for node in explicit.elts: + if str_const(node): + inferred.append(node.value) + else: + try: + inferred_node = next(node.infer()) + except (InferenceError, StopIteration): + continue + if str_const(inferred_node): + inferred.append(inferred_node.value) + return inferred + + def public_names(self): + """The list of the names that are publicly available in this module. + + :returns: The list of public names. + :rtype: list(str) + """ + return [name for name in self.keys() if not name.startswith("_")] + + def bool_value(self, context: InferenceContext | None = None) -> bool: + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`Module` this is always ``True``. + """ + return True + + def get_children(self): + yield from self.body + + def frame(self: _T, *, future: Literal[None, True] = None) -> _T: + """The node's frame node. + + A frame node is a :class:`Module`, :class:`FunctionDef`, + :class:`ClassDef` or :class:`Lambda`. + + :returns: The node itself. + """ + return self + + +class GeneratorExp(ComprehensionScope): + """Class representing an :class:`ast.GeneratorExp` node. + + >>> import astroid + >>> node = astroid.extract_node('(thing for thing in things if thing)') + >>> node + + """ + + _astroid_fields = ("elt", "generators") + _other_other_fields = ("locals",) + elt = None + """The element that forms the output of the expression. + + :type: NodeNG or None + """ + + def __init__( + self, + lineno=None, + col_offset=None, + parent=None, + *, + end_lineno=None, + end_col_offset=None, + ): + """ + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + + :param end_lineno: The last line this node appears on in the source code. + :type end_lineno: Optional[int] + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + :type end_col_offset: Optional[int] + """ + self.locals = {} + """A map of the name of a local variable to the node defining the local.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, elt=None, generators: list[nodes.Comprehension] | None = None): + """Do some setup after initialisation. + + :param elt: The element that forms the output of the expression. + :type elt: NodeNG or None + + :param generators: The generators that are looped through. + """ + self.elt = elt + if generators is None: + self.generators = [] + else: + self.generators = generators + + def bool_value(self, context: InferenceContext | None = None) -> Literal[True]: + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`GeneratorExp` this is always ``True``. + """ + return True + + def get_children(self): + yield self.elt + + yield from self.generators + + +class DictComp(ComprehensionScope): + """Class representing an :class:`ast.DictComp` node. + + >>> import astroid + >>> node = astroid.extract_node('{k:v for k, v in things if k > v}') + >>> node + + """ + + _astroid_fields = ("key", "value", "generators") + _other_other_fields = ("locals",) + key = None + """What produces the keys. + + :type: NodeNG or None + """ + value = None + """What produces the values. + + :type: NodeNG or None + """ + + def __init__( + self, + lineno=None, + col_offset=None, + parent=None, + *, + end_lineno=None, + end_col_offset=None, + ): + """ + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + + :param end_lineno: The last line this node appears on in the source code. + :type end_lineno: Optional[int] + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + :type end_col_offset: Optional[int] + """ + self.locals = {} + """A map of the name of a local variable to the node defining the local.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit( + self, + key=None, + value=None, + generators: list[nodes.Comprehension] | None = None, + ): + """Do some setup after initialisation. + + :param key: What produces the keys. + :type key: NodeNG or None + + :param value: What produces the values. + :type value: NodeNG or None + + :param generators: The generators that are looped through. + """ + self.key = key + self.value = value + if generators is None: + self.generators = [] + else: + self.generators = generators + + def bool_value(self, context: InferenceContext | None = None): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`DictComp` this is always :class:`Uninferable`. + :rtype: Uninferable + """ + return util.Uninferable + + def get_children(self): + yield self.key + yield self.value + + yield from self.generators + + +class SetComp(ComprehensionScope): + """Class representing an :class:`ast.SetComp` node. + + >>> import astroid + >>> node = astroid.extract_node('{thing for thing in things if thing}') + >>> node + + """ + + _astroid_fields = ("elt", "generators") + _other_other_fields = ("locals",) + elt = None + """The element that forms the output of the expression. + + :type: NodeNG or None + """ + + def __init__( + self, + lineno=None, + col_offset=None, + parent=None, + *, + end_lineno=None, + end_col_offset=None, + ): + """ + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + + :param end_lineno: The last line this node appears on in the source code. + :type end_lineno: Optional[int] + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + :type end_col_offset: Optional[int] + """ + self.locals = {} + """A map of the name of a local variable to the node defining the local.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, elt=None, generators: list[nodes.Comprehension] | None = None): + """Do some setup after initialisation. + + :param elt: The element that forms the output of the expression. + :type elt: NodeNG or None + + :param generators: The generators that are looped through. + """ + self.elt = elt + if generators is None: + self.generators = [] + else: + self.generators = generators + + def bool_value(self, context: InferenceContext | None = None): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`SetComp` this is always :class:`Uninferable`. + :rtype: Uninferable + """ + return util.Uninferable + + def get_children(self): + yield self.elt + + yield from self.generators + + +class ListComp(ComprehensionScope): + """Class representing an :class:`ast.ListComp` node. + + >>> import astroid + >>> node = astroid.extract_node('[thing for thing in things if thing]') + >>> node + + """ + + _astroid_fields = ("elt", "generators") + _other_other_fields = ("locals",) + + elt = None + """The element that forms the output of the expression. + + :type: NodeNG or None + """ + + def __init__( + self, + lineno=None, + col_offset=None, + parent=None, + *, + end_lineno=None, + end_col_offset=None, + ): + self.locals = {} + """A map of the name of a local variable to the node defining it.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, elt=None, generators: list[nodes.Comprehension] | None = None): + """Do some setup after initialisation. + + :param elt: The element that forms the output of the expression. + :type elt: NodeNG or None + + :param generators: The generators that are looped through. + :type generators: list(Comprehension) or None + """ + self.elt = elt + if generators is None: + self.generators = [] + else: + self.generators = generators + + def bool_value(self, context: InferenceContext | None = None): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`ListComp` this is always :class:`Uninferable`. + :rtype: Uninferable + """ + return util.Uninferable + + def get_children(self): + yield self.elt + + yield from self.generators + + +def _infer_decorator_callchain(node): + """Detect decorator call chaining and see if the end result is a + static or a classmethod. + """ + if not isinstance(node, FunctionDef): + return None + if not node.parent: + return None + try: + result = next(node.infer_call_result(node.parent), None) + except InferenceError: + return None + if isinstance(result, bases.Instance): + result = result._proxied + if isinstance(result, ClassDef): + if result.is_subtype_of("builtins.classmethod"): + return "classmethod" + if result.is_subtype_of("builtins.staticmethod"): + return "staticmethod" + if isinstance(result, FunctionDef): + if not result.decorators: + return None + # Determine if this function is decorated with one of the builtin descriptors we want. + for decorator in result.decorators.nodes: + if isinstance(decorator, node_classes.Name): + if decorator.name in BUILTIN_DESCRIPTORS: + return decorator.name + if ( + isinstance(decorator, node_classes.Attribute) + and isinstance(decorator.expr, node_classes.Name) + and decorator.expr.name == "builtins" + and decorator.attrname in BUILTIN_DESCRIPTORS + ): + return decorator.attrname + return None + + +class Lambda(_base_nodes.FilterStmtsBaseNode, LocalsDictNodeNG): + """Class representing an :class:`ast.Lambda` node. + + >>> import astroid + >>> node = astroid.extract_node('lambda arg: arg + 1') + >>> node + l.1 at 0x7f23b2e41518> + """ + + _astroid_fields = ("args", "body") + _other_other_fields = ("locals",) + name = "" + is_lambda = True + special_attributes = FunctionModel() + """The names of special attributes that this function has.""" + + def implicit_parameters(self) -> Literal[0]: + return 0 + + @property + def type(self) -> Literal["method", "function"]: + """Whether this is a method or function. + + :returns: 'method' if this is a method, 'function' otherwise. + """ + if self.args.arguments and self.args.arguments[0].name == "self": + if isinstance(self.parent.scope(), ClassDef): + return "method" + return "function" + + def __init__( + self, + lineno=None, + col_offset=None, + parent=None, + *, + end_lineno=None, + end_col_offset=None, + ): + """ + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + + :param end_lineno: The last line this node appears on in the source code. + :type end_lineno: Optional[int] + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + :type end_col_offset: Optional[int] + """ + self.locals = {} + """A map of the name of a local variable to the node defining it.""" + + self.args: Arguments + """The arguments that the function takes.""" + + self.body = [] + """The contents of the function body. + + :type: list(NodeNG) + """ + + self.instance_attrs: dict[str, list[NodeNG]] = {} + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + + def postinit(self, args: Arguments, body): + """Do some setup after initialisation. + + :param args: The arguments that the function takes. + + :param body: The contents of the function body. + :type body: list(NodeNG) + """ + self.args = args + self.body = body + + def pytype(self) -> Literal["bultins.instancemethod", "builtins.function"]: + """Get the name of the type that this node represents. + + :returns: The name of the type. + """ + if "method" in self.type: + return "builtins.instancemethod" + return "builtins.function" + + def display_type(self) -> str: + """A human readable type of this node. + + :returns: The type of this node. + :rtype: str + """ + if "method" in self.type: + return "Method" + return "Function" + + def callable(self) -> Literal[True]: + """Whether this node defines something that is callable. + + :returns: Whether this defines something that is callable + For a :class:`Lambda` this is always ``True``. + """ + return True + + def argnames(self) -> list[str]: + """Get the names of each of the arguments, including that + of the collections of variable-length arguments ("args", "kwargs", + etc.), as well as positional-only and keyword-only arguments. + + :returns: The names of the arguments. + :rtype: list(str) + """ + if self.args.arguments: # maybe None with builtin functions + names = _rec_get_names(self.args.arguments) + else: + names = [] + if self.args.vararg: + names.append(self.args.vararg) + names += [elt.name for elt in self.args.kwonlyargs] + if self.args.kwarg: + names.append(self.args.kwarg) + return names + + def infer_call_result(self, caller, context: InferenceContext | None = None): + """Infer what the function returns when called. + + :param caller: Unused + :type caller: object + """ + # pylint: disable=no-member; github.com/pycqa/astroid/issues/291 + # args is in fact redefined later on by postinit. Can't be changed + # to None due to a strong interaction between Lambda and FunctionDef. + return self.body.infer(context) + + def scope_lookup(self, node, name, offset=0): + """Lookup where the given names is assigned. + + :param node: The node to look for assignments up to. + Any assignments after the given node are ignored. + :type node: NodeNG + + :param name: The name to find assignments for. + :type name: str + + :param offset: The line offset to filter statements up to. + :type offset: int + + :returns: This scope node and the list of assignments associated to the + given name according to the scope where it has been found (locals, + globals or builtin). + :rtype: tuple(str, list(NodeNG)) + """ + if node in self.args.defaults or node in self.args.kw_defaults: + frame = self.parent.frame(future=True) + # line offset to avoid that def func(f=func) resolve the default + # value to the defined function + offset = -1 + else: + # check this is not used in function decorators + frame = self + return frame._scope_lookup(node, name, offset) + + def bool_value(self, context: InferenceContext | None = None) -> Literal[True]: + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`Lambda` this is always ``True``. + """ + return True + + def get_children(self): + yield self.args + yield self.body + + def frame(self: _T, *, future: Literal[None, True] = None) -> _T: + """The node's frame node. + + A frame node is a :class:`Module`, :class:`FunctionDef`, + :class:`ClassDef` or :class:`Lambda`. + + :returns: The node itself. + """ + return self + + def getattr( + self, name: str, context: InferenceContext | None = None + ) -> list[NodeNG]: + if not name: + raise AttributeInferenceError(target=self, attribute=name, context=context) + + found_attrs = [] + if name in self.instance_attrs: + found_attrs = self.instance_attrs[name] + if name in self.special_attributes: + found_attrs.append(self.special_attributes.lookup(name)) + if found_attrs: + return found_attrs + raise AttributeInferenceError(target=self, attribute=name) + + +class FunctionDef(_base_nodes.MultiLineBlockNode, _base_nodes.Statement, Lambda): + """Class representing an :class:`ast.FunctionDef`. + + >>> import astroid + >>> node = astroid.extract_node(''' + ... def my_func(arg): + ... return arg + 1 + ... ''') + >>> node + + """ + + _astroid_fields = ("decorators", "args", "returns", "doc_node", "body") + _multi_line_block_fields = ("body",) + returns = None + decorators: node_classes.Decorators | None = None + """The decorators that are applied to this method or function.""" + + is_function = True + """Whether this node indicates a function. + + For a :class:`FunctionDef` this is always ``True``. + + :type: bool + """ + type_annotation = None + """If present, this will contain the type annotation passed by a type comment + + :type: NodeNG or None + """ + type_comment_args = None + """ + If present, this will contain the type annotation for arguments + passed by a type comment + """ + type_comment_returns = None + """If present, this will contain the return type annotation, passed by a type comment""" + # attributes below are set by the builder module or by raw factories + _other_fields = ("name", "doc", "position") + _other_other_fields = ( + "locals", + "_type", + "type_comment_returns", + "type_comment_args", + ) + _type = None + + @decorators_mod.deprecate_arguments(doc="Use the postinit arg 'doc_node' instead") + def __init__( + self, + name=None, + doc: str | None = None, + lineno=None, + col_offset=None, + parent=None, + *, + end_lineno=None, + end_col_offset=None, + ): + """ + :param name: The name of the function. + :type name: str or None + + :param doc: The function docstring. + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + + :param end_lineno: The last line this node appears on in the source code. + :type end_lineno: Optional[int] + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + :type end_col_offset: Optional[int] + """ + self.name = name + """The name of the function. + + :type name: str or None + """ + + self._doc = doc + """The function docstring.""" + + self.doc_node: Const | None = None + """The doc node associated with this node.""" + + self.instance_attrs = {} + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + if parent: + frame = parent.frame(future=True) + frame.set_local(name, self) + + def postinit( + self, + args: Arguments, + body, + decorators: node_classes.Decorators | None = None, + returns=None, + type_comment_returns=None, + type_comment_args=None, + *, + position: Position | None = None, + doc_node: Const | None = None, + ): + """Do some setup after initialisation. + + :param args: The arguments that the function takes. + + :param body: The contents of the function body. + :type body: list(NodeNG) + + :param decorators: The decorators that are applied to this + method or function. + :type decorators: Decorators or None + :params type_comment_returns: + The return type annotation passed via a type comment. + :params type_comment_args: + The args type annotation passed via a type comment. + :params position: + Position of function keyword(s) and name. + :param doc_node: + The doc node associated with this node. + """ + self.args = args + self.body = body + self.decorators = decorators + self.returns = returns + self.type_comment_returns = type_comment_returns + self.type_comment_args = type_comment_args + self.position = position + self.doc_node = doc_node + if doc_node: + self._doc = doc_node.value + + @property + def doc(self) -> str | None: + """The function docstring.""" + warnings.warn( + "The 'FunctionDef.doc' attribute is deprecated, " + "use 'FunctionDef.doc_node' instead.", + DeprecationWarning, + stacklevel=2, + ) + return self._doc + + @doc.setter + def doc(self, value: str | None) -> None: + warnings.warn( + "Setting the 'FunctionDef.doc' attribute is deprecated, " + "use 'FunctionDef.doc_node' instead.", + DeprecationWarning, + stacklevel=2, + ) + self._doc = value + + @cached_property + def extra_decorators(self) -> list[node_classes.Call]: + """The extra decorators that this function can have. + + Additional decorators are considered when they are used as + assignments, as in ``method = staticmethod(method)``. + The property will return all the callables that are used for + decoration. + """ + frame = self.parent.frame(future=True) + if not isinstance(frame, ClassDef): + return [] + + decorators: list[node_classes.Call] = [] + for assign in frame._get_assign_nodes(): + if isinstance(assign.value, node_classes.Call) and isinstance( + assign.value.func, node_classes.Name + ): + for assign_node in assign.targets: + if not isinstance(assign_node, node_classes.AssignName): + # Support only `name = callable(name)` + continue + + if assign_node.name != self.name: + # Interested only in the assignment nodes that + # decorates the current method. + continue + try: + meth = frame[self.name] + except KeyError: + continue + else: + # Must be a function and in the same frame as the + # original method. + if ( + isinstance(meth, FunctionDef) + and assign_node.frame(future=True) == frame + ): + decorators.append(assign.value) + return decorators + + @cached_property + def type(self) -> str: # pylint: disable=too-many-return-statements # noqa: C901 + """The function type for this node. + + Possible values are: method, function, staticmethod, classmethod. + """ + for decorator in self.extra_decorators: + if decorator.func.name in BUILTIN_DESCRIPTORS: + return decorator.func.name + + frame = self.parent.frame(future=True) + type_name = "function" + if isinstance(frame, ClassDef): + if self.name == "__new__": + return "classmethod" + if self.name == "__init_subclass__": + return "classmethod" + if self.name == "__class_getitem__": + return "classmethod" + + type_name = "method" + + if not self.decorators: + return type_name + + for node in self.decorators.nodes: + if isinstance(node, node_classes.Name): + if node.name in BUILTIN_DESCRIPTORS: + return node.name + if ( + isinstance(node, node_classes.Attribute) + and isinstance(node.expr, node_classes.Name) + and node.expr.name == "builtins" + and node.attrname in BUILTIN_DESCRIPTORS + ): + return node.attrname + + if isinstance(node, node_classes.Call): + # Handle the following case: + # @some_decorator(arg1, arg2) + # def func(...) + # + try: + current = next(node.func.infer()) + except (InferenceError, StopIteration): + continue + _type = _infer_decorator_callchain(current) + if _type is not None: + return _type + + try: + for inferred in node.infer(): + # Check to see if this returns a static or a class method. + _type = _infer_decorator_callchain(inferred) + if _type is not None: + return _type + + if not isinstance(inferred, ClassDef): + continue + for ancestor in inferred.ancestors(): + if not isinstance(ancestor, ClassDef): + continue + if ancestor.is_subtype_of("builtins.classmethod"): + return "classmethod" + if ancestor.is_subtype_of("builtins.staticmethod"): + return "staticmethod" + except InferenceError: + pass + return type_name + + @cached_property + def fromlineno(self) -> int | None: + """The first line that this node appears on in the source code.""" + # lineno is the line number of the first decorator, we want the def + # statement lineno. Similar to 'ClassDef.fromlineno' + lineno = self.lineno + if self.decorators is not None: + lineno += sum( + node.tolineno - node.lineno + 1 for node in self.decorators.nodes + ) + + return lineno + + @cached_property + def blockstart_tolineno(self): + """The line on which the beginning of this block ends. + + :type: int + """ + return self.args.tolineno + + def implicit_parameters(self) -> Literal[0, 1]: + return 1 if self.is_bound() else 0 + + def block_range(self, lineno): + """Get a range from the given line number to where this node ends. + + :param lineno: Unused. + :type lineno: int + + :returns: The range of line numbers that this node belongs to, + :rtype: tuple(int, int) + """ + return self.fromlineno, self.tolineno + + def igetattr(self, name, context: InferenceContext | None = None): + """Inferred getattr, which returns an iterator of inferred statements.""" + try: + return bases._infer_stmts(self.getattr(name, context), context, frame=self) + except AttributeInferenceError as error: + raise InferenceError( + str(error), target=self, attribute=name, context=context + ) from error + + def is_method(self) -> bool: + """Check if this function node represents a method. + + :returns: Whether this is a method. + """ + # check we are defined in a ClassDef, because this is usually expected + # (e.g. pylint...) when is_method() return True + return self.type != "function" and isinstance( + self.parent.frame(future=True), ClassDef + ) + + @decorators_mod.cached + def decoratornames(self, context: InferenceContext | None = None): + """Get the qualified names of each of the decorators on this function. + + :param context: + An inference context that can be passed to inference functions + :returns: The names of the decorators. + :rtype: set(str) + """ + result = set() + decoratornodes = [] + if self.decorators is not None: + decoratornodes += self.decorators.nodes + decoratornodes += self.extra_decorators + for decnode in decoratornodes: + try: + for infnode in decnode.infer(context=context): + result.add(infnode.qname()) + except InferenceError: + continue + return result + + def is_bound(self) -> bool: + """Check if the function is bound to an instance or class. + + :returns: Whether the function is bound to an instance or class. + """ + return self.type in {"method", "classmethod"} + + def is_abstract(self, pass_is_abstract=True, any_raise_is_abstract=False) -> bool: + """Check if the method is abstract. + + A method is considered abstract if any of the following is true: + * The only statement is 'raise NotImplementedError' + * The only statement is 'raise ' and any_raise_is_abstract is True + * The only statement is 'pass' and pass_is_abstract is True + * The method is annotated with abc.astractproperty/abc.abstractmethod + + :returns: Whether the method is abstract. + """ + if self.decorators: + for node in self.decorators.nodes: + try: + inferred = next(node.infer()) + except (InferenceError, StopIteration): + continue + if inferred and inferred.qname() in { + "abc.abstractproperty", + "abc.abstractmethod", + }: + return True + + for child_node in self.body: + if isinstance(child_node, node_classes.Raise): + if any_raise_is_abstract: + return True + if child_node.raises_not_implemented(): + return True + return pass_is_abstract and isinstance(child_node, node_classes.Pass) + # empty function is the same as function with a single "pass" statement + if pass_is_abstract: + return True + + return False + + def is_generator(self) -> bool: + """Check if this is a generator function. + + :returns: Whether this is a generator function. + """ + return bool(next(self._get_yield_nodes_skip_lambdas(), False)) + + def infer_yield_result(self, context: InferenceContext | None = None): + """Infer what the function yields when called + + :returns: What the function yields + :rtype: iterable(NodeNG or Uninferable) or None + """ + # pylint: disable=not-an-iterable + # https://github.com/PyCQA/astroid/issues/1015 + for yield_ in self.nodes_of_class(node_classes.Yield): + if yield_.value is None: + const = node_classes.Const(None) + const.parent = yield_ + const.lineno = yield_.lineno + yield const + elif yield_.scope() == self: + yield from yield_.value.infer(context=context) + + def infer_call_result(self, caller=None, context: InferenceContext | None = None): + """Infer what the function returns when called. + + :returns: What the function returns. + :rtype: iterable(NodeNG or Uninferable) or None + """ + if self.is_generator(): + if isinstance(self, AsyncFunctionDef): + generator_cls = bases.AsyncGenerator + else: + generator_cls = bases.Generator + result = generator_cls(self, generator_initial_context=context) + yield result + return + # This is really a gigantic hack to work around metaclass generators + # that return transient class-generating functions. Pylint's AST structure + # cannot handle a base class object that is only used for calling __new__, + # but does not contribute to the inheritance structure itself. We inject + # a fake class into the hierarchy here for several well-known metaclass + # generators, and filter it out later. + if ( + self.name == "with_metaclass" + and len(self.args.args) == 1 + and self.args.vararg is not None + ): + metaclass = next(caller.args[0].infer(context), None) + if isinstance(metaclass, ClassDef): + try: + class_bases = [next(arg.infer(context)) for arg in caller.args[1:]] + except StopIteration as e: + raise InferenceError(node=caller.args[1:], context=context) from e + new_class = ClassDef(name="temporary_class") + new_class.hide = True + new_class.parent = self + new_class.postinit( + bases=[ + base + for base in class_bases + if not isinstance(base, util.UninferableBase) + ], + body=[], + decorators=[], + metaclass=metaclass, + ) + yield new_class + return + returns = self._get_return_nodes_skip_functions() + + first_return = next(returns, None) + if not first_return: + if self.body: + if self.is_abstract(pass_is_abstract=True, any_raise_is_abstract=True): + yield util.Uninferable + else: + yield node_classes.Const(None) + return + + raise InferenceError("The function does not have any return statements") + + for returnnode in itertools.chain((first_return,), returns): + if returnnode.value is None: + yield node_classes.Const(None) + else: + try: + yield from returnnode.value.infer(context) + except InferenceError: + yield util.Uninferable + + def bool_value(self, context: InferenceContext | None = None) -> bool: + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`FunctionDef` this is always ``True``. + """ + return True + + def get_children(self): + if self.decorators is not None: + yield self.decorators + + yield self.args + + if self.returns is not None: + yield self.returns + + yield from self.body + + def scope_lookup(self, node, name, offset=0): + """Lookup where the given name is assigned.""" + if name == "__class__": + # __class__ is an implicit closure reference created by the compiler + # if any methods in a class body refer to either __class__ or super. + # In our case, we want to be able to look it up in the current scope + # when `__class__` is being used. + frame = self.parent.frame(future=True) + if isinstance(frame, ClassDef): + return self, [frame] + return super().scope_lookup(node, name, offset) + + def frame(self: _T, *, future: Literal[None, True] = None) -> _T: + """The node's frame node. + + A frame node is a :class:`Module`, :class:`FunctionDef`, + :class:`ClassDef` or :class:`Lambda`. + + :returns: The node itself. + """ + return self + + +class AsyncFunctionDef(FunctionDef): + """Class representing an :class:`ast.FunctionDef` node. + + A :class:`AsyncFunctionDef` is an asynchronous function + created with the `async` keyword. + + >>> import astroid + >>> node = astroid.extract_node(''' + async def func(things): + async for thing in things: + print(thing) + ''') + >>> node + + >>> node.body[0] + + """ + + +def _rec_get_names(args, names: list[str] | None = None) -> list[str]: + """return a list of all argument names""" + if names is None: + names = [] + for arg in args: + if isinstance(arg, node_classes.Tuple): + _rec_get_names(arg.elts, names) + else: + names.append(arg.name) + return names + + +def _is_metaclass(klass, seen=None) -> bool: + """Return if the given class can be + used as a metaclass. + """ + if klass.name == "type": + return True + if seen is None: + seen = set() + for base in klass.bases: + try: + for baseobj in base.infer(): + baseobj_name = baseobj.qname() + if baseobj_name in seen: + continue + + seen.add(baseobj_name) + if isinstance(baseobj, bases.Instance): + # not abstract + return False + if baseobj is klass: + continue + if not isinstance(baseobj, ClassDef): + continue + if baseobj._type == "metaclass": + return True + if _is_metaclass(baseobj, seen): + return True + except InferenceError: + continue + return False + + +def _class_type(klass, ancestors=None): + """return a ClassDef node type to differ metaclass and exception + from 'regular' classes + """ + # XXX we have to store ancestors in case we have an ancestor loop + if klass._type is not None: + return klass._type + if _is_metaclass(klass): + klass._type = "metaclass" + elif klass.name.endswith("Exception"): + klass._type = "exception" + else: + if ancestors is None: + ancestors = set() + klass_name = klass.qname() + if klass_name in ancestors: + # XXX we are in loop ancestors, and have found no type + klass._type = "class" + return "class" + ancestors.add(klass_name) + for base in klass.ancestors(recurs=False): + name = _class_type(base, ancestors) + if name != "class": + if name == "metaclass" and not _is_metaclass(klass): + # don't propagate it if the current class + # can't be a metaclass + continue + klass._type = base.type + break + if klass._type is None: + klass._type = "class" + return klass._type + + +def get_wrapping_class(node): + """Get the class that wraps the given node. + + We consider that a class wraps a node if the class + is a parent for the said node. + + :returns: The class that wraps the given node + :rtype: ClassDef or None + """ + + klass = node.frame(future=True) + while klass is not None and not isinstance(klass, ClassDef): + if klass.parent is None: + klass = None + else: + klass = klass.parent.frame(future=True) + return klass + + +# pylint: disable=too-many-instance-attributes +class ClassDef( + _base_nodes.FilterStmtsBaseNode, LocalsDictNodeNG, _base_nodes.Statement +): + """Class representing an :class:`ast.ClassDef` node. + + >>> import astroid + >>> node = astroid.extract_node(''' + class Thing: + def my_meth(self, arg): + return arg + self.offset + ''') + >>> node + + """ + + # some of the attributes below are set by the builder module or + # by a raw factories + + # a dictionary of class instances attributes + _astroid_fields = ("decorators", "bases", "keywords", "doc_node", "body") # name + + decorators = None + """The decorators that are applied to this class. + + :type: Decorators or None + """ + special_attributes = ClassModel() + """The names of special attributes that this class has. + + :type: objectmodel.ClassModel + """ + + _type = None + _metaclass: NodeNG | None = None + _metaclass_hack = False + hide = False + type = property( + _class_type, + doc=( + "The class type for this node.\n\n" + "Possible values are: class, metaclass, exception.\n\n" + ":type: str" + ), + ) + _other_fields = ("name", "doc", "is_dataclass", "position") + _other_other_fields = ("locals", "_newstyle") + _newstyle = None + + @decorators_mod.deprecate_arguments(doc="Use the postinit arg 'doc_node' instead") + def __init__( + self, + name=None, + doc: str | None = None, + lineno=None, + col_offset=None, + parent=None, + *, + end_lineno=None, + end_col_offset=None, + ): + """ + :param name: The name of the class. + :type name: str or None + + :param doc: The class docstring. + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + + :param end_lineno: The last line this node appears on in the source code. + :type end_lineno: Optional[int] + + :param end_col_offset: The end column this node appears on in the + source code. Note: This is after the last symbol. + :type end_col_offset: Optional[int] + """ + self.instance_attrs = {} + self.locals = {} + """A map of the name of a local variable to the node defining it.""" + + self.keywords = [] + """The keywords given to the class definition. + + This is usually for :pep:`3115` style metaclass declaration. + + :type: list(Keyword) or None + """ + + self.bases: list[NodeNG] = [] + """What the class inherits from.""" + + self.body = [] + """The contents of the class body. + + :type: list(NodeNG) + """ + + self.name = name + """The name of the class. + + :type name: str or None + """ + + self._doc = doc + """The class docstring.""" + + self.doc_node: Const | None = None + """The doc node associated with this node.""" + + self.is_dataclass: bool = False + """Whether this class is a dataclass.""" + + super().__init__( + lineno=lineno, + col_offset=col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + if parent is not None: + parent.frame(future=True).set_local(name, self) + + for local_name, node in self.implicit_locals(): + self.add_local_node(node, local_name) + + infer_binary_op: ClassVar[InferBinaryOp[ClassDef]] + + @property + def doc(self) -> str | None: + """The class docstring.""" + warnings.warn( + "The 'ClassDef.doc' attribute is deprecated, " + "use 'ClassDef.doc_node' instead.", + DeprecationWarning, + stacklevel=2, + ) + return self._doc + + @doc.setter + def doc(self, value: str | None) -> None: + warnings.warn( + "Setting the 'ClassDef.doc' attribute is deprecated, " + "use 'ClassDef.doc_node.value' instead.", + DeprecationWarning, + stacklevel=2, + ) + self._doc = value + + def implicit_parameters(self) -> Literal[1]: + return 1 + + def implicit_locals(self): + """Get implicitly defined class definition locals. + + :returns: the the name and Const pair for each local + :rtype: tuple(tuple(str, node_classes.Const), ...) + """ + locals_ = (("__module__", self.special_attributes.attr___module__),) + # __qualname__ is defined in PEP3155 + locals_ += (("__qualname__", self.special_attributes.attr___qualname__),) + return locals_ + + # pylint: disable=redefined-outer-name + def postinit( + self, + bases, + body, + decorators, + newstyle=None, + metaclass: NodeNG | None = None, + keywords=None, + *, + position: Position | None = None, + doc_node: Const | None = None, + ): + """Do some setup after initialisation. + + :param bases: What the class inherits from. + :type bases: list(NodeNG) + + :param body: The contents of the class body. + :type body: list(NodeNG) + + :param decorators: The decorators that are applied to this class. + :type decorators: Decorators or None + + :param newstyle: Whether this is a new style class or not. + :type newstyle: bool or None + + :param metaclass: The metaclass of this class. + + :param keywords: The keywords given to the class definition. + :type keywords: list(Keyword) or None + + :param position: Position of class keyword and name. + + :param doc_node: The doc node associated with this node. + """ + if keywords is not None: + self.keywords = keywords + self.bases = bases + self.body = body + self.decorators = decorators + if newstyle is not None: + self._newstyle = newstyle + if metaclass is not None: + self._metaclass = metaclass + self.position = position + self.doc_node = doc_node + if doc_node: + self._doc = doc_node.value + + def _newstyle_impl(self, context: InferenceContext | None = None): + if context is None: + context = InferenceContext() + if self._newstyle is not None: + return self._newstyle + for base in self.ancestors(recurs=False, context=context): + if base._newstyle_impl(context): + self._newstyle = True + break + klass = self.declared_metaclass() + # could be any callable, we'd need to infer the result of klass(name, + # bases, dict). punt if it's not a class node. + if klass is not None and isinstance(klass, ClassDef): + self._newstyle = klass._newstyle_impl(context) + if self._newstyle is None: + self._newstyle = False + return self._newstyle + + _newstyle = None + newstyle = property( + _newstyle_impl, + doc=("Whether this is a new style class or not\n\n" ":type: bool or None"), + ) + + @cached_property + def fromlineno(self) -> int | None: + """The first line that this node appears on in the source code.""" + if not PY38_PLUS or IS_PYPY and PY38 and not PYPY_7_3_11_PLUS: + # For Python < 3.8 the lineno is the line number of the first decorator. + # We want the class statement lineno. Similar to 'FunctionDef.fromlineno' + # PyPy (3.8): Fixed with version v7.3.11 + lineno = self.lineno + if self.decorators is not None: + lineno += sum( + node.tolineno - node.lineno + 1 for node in self.decorators.nodes + ) + + return lineno + return super().fromlineno + + @cached_property + def blockstart_tolineno(self): + """The line on which the beginning of this block ends. + + :type: int + """ + if self.bases: + return self.bases[-1].tolineno + + return self.fromlineno + + def block_range(self, lineno): + """Get a range from the given line number to where this node ends. + + :param lineno: Unused. + :type lineno: int + + :returns: The range of line numbers that this node belongs to, + :rtype: tuple(int, int) + """ + return self.fromlineno, self.tolineno + + def pytype(self) -> Literal["builtins.type", "builtins.classobj"]: + """Get the name of the type that this node represents. + + :returns: The name of the type. + """ + if self.newstyle: + return "builtins.type" + return "builtins.classobj" + + def display_type(self) -> str: + """A human readable type of this node. + + :returns: The type of this node. + :rtype: str + """ + return "Class" + + def callable(self) -> bool: + """Whether this node defines something that is callable. + + :returns: Whether this defines something that is callable. + For a :class:`ClassDef` this is always ``True``. + """ + return True + + def is_subtype_of(self, type_name, context: InferenceContext | None = None) -> bool: + """Whether this class is a subtype of the given type. + + :param type_name: The name of the type of check against. + :type type_name: str + + :returns: Whether this class is a subtype of the given type. + """ + if self.qname() == type_name: + return True + + return any(anc.qname() == type_name for anc in self.ancestors(context=context)) + + def _infer_type_call(self, caller, context): + try: + name_node = next(caller.args[0].infer(context)) + except StopIteration as e: + raise InferenceError(node=caller.args[0], context=context) from e + if isinstance(name_node, node_classes.Const) and isinstance( + name_node.value, str + ): + name = name_node.value + else: + return util.Uninferable + + result = ClassDef(name) + + # Get the bases of the class. + try: + class_bases = next(caller.args[1].infer(context)) + except StopIteration as e: + raise InferenceError(node=caller.args[1], context=context) from e + if isinstance(class_bases, (node_classes.Tuple, node_classes.List)): + bases = [] + for base in class_bases.itered(): + inferred = next(base.infer(context=context), None) + if inferred: + bases.append( + node_classes.EvaluatedObject(original=base, value=inferred) + ) + result.bases = bases + else: + # There is currently no AST node that can represent an 'unknown' + # node (Uninferable is not an AST node), therefore we simply return Uninferable here + # although we know at least the name of the class. + return util.Uninferable + + # Get the members of the class + try: + members = next(caller.args[2].infer(context)) + except (InferenceError, StopIteration): + members = None + + if members and isinstance(members, node_classes.Dict): + for attr, value in members.items: + if isinstance(attr, node_classes.Const) and isinstance(attr.value, str): + result.locals[attr.value] = [value] + + result.parent = caller.parent + return result + + def infer_call_result(self, caller, context: InferenceContext | None = None): + """infer what a class is returning when called""" + if self.is_subtype_of("builtins.type", context) and len(caller.args) == 3: + result = self._infer_type_call(caller, context) + yield result + return + + dunder_call = None + try: + metaclass = self.metaclass(context=context) + if metaclass is not None: + # Only get __call__ if it's defined locally for the metaclass. + # Otherwise we will find ObjectModel.__call__ which will + # return an instance of the metaclass. Instantiating the class is + # handled later. + if "__call__" in metaclass.locals: + dunder_call = next(metaclass.igetattr("__call__", context)) + except (AttributeInferenceError, StopIteration): + pass + + if dunder_call and dunder_call.qname() != "builtins.type.__call__": + # Call type.__call__ if not set metaclass + # (since type is the default metaclass) + context = bind_context_to_node(context, self) + context.callcontext.callee = dunder_call + yield from dunder_call.infer_call_result(caller, context) + else: + yield self.instantiate_class() + + def scope_lookup(self, node, name, offset=0): + """Lookup where the given name is assigned. + + :param node: The node to look for assignments up to. + Any assignments after the given node are ignored. + :type node: NodeNG + + :param name: The name to find assignments for. + :type name: str + + :param offset: The line offset to filter statements up to. + :type offset: int + + :returns: This scope node and the list of assignments associated to the + given name according to the scope where it has been found (locals, + globals or builtin). + :rtype: tuple(str, list(NodeNG)) + """ + # If the name looks like a builtin name, just try to look + # into the upper scope of this class. We might have a + # decorator that it's poorly named after a builtin object + # inside this class. + lookup_upper_frame = ( + isinstance(node.parent, node_classes.Decorators) + and name in AstroidManager().builtins_module + ) + if ( + any(node == base or base.parent_of(node) for base in self.bases) + or lookup_upper_frame + ): + # Handle the case where we have either a name + # in the bases of a class, which exists before + # the actual definition or the case where we have + # a Getattr node, with that name. + # + # name = ... + # class A(name): + # def name(self): ... + # + # import name + # class A(name.Name): + # def name(self): ... + + frame = self.parent.frame(future=True) + # line offset to avoid that class A(A) resolve the ancestor to + # the defined class + offset = -1 + else: + frame = self + return frame._scope_lookup(node, name, offset) + + @property + def basenames(self): + """The names of the parent classes + + Names are given in the order they appear in the class definition. + + :type: list(str) + """ + return [bnode.as_string() for bnode in self.bases] + + def ancestors( + self, recurs: bool = True, context: InferenceContext | None = None + ) -> Generator[ClassDef, None, None]: + """Iterate over the base classes in prefixed depth first order. + + :param recurs: Whether to recurse or return direct ancestors only. + + :returns: The base classes + """ + # FIXME: should be possible to choose the resolution order + # FIXME: inference make infinite loops possible here + yielded = {self} + if context is None: + context = InferenceContext() + if not self.bases and self.qname() != "builtins.object": + yield builtin_lookup("object")[1][0] + return + + for stmt in self.bases: + with context.restore_path(): + try: + for baseobj in stmt.infer(context): + if not isinstance(baseobj, ClassDef): + if isinstance(baseobj, bases.Instance): + baseobj = baseobj._proxied + else: + continue + if not baseobj.hide: + if baseobj in yielded: + continue + yielded.add(baseobj) + yield baseobj + if not recurs: + continue + for grandpa in baseobj.ancestors(recurs=True, context=context): + if grandpa is self: + # This class is the ancestor of itself. + break + if grandpa in yielded: + continue + yielded.add(grandpa) + yield grandpa + except InferenceError: + continue + + def local_attr_ancestors(self, name, context: InferenceContext | None = None): + """Iterate over the parents that define the given name. + + :param name: The name to find definitions for. + :type name: str + + :returns: The parents that define the given name. + :rtype: iterable(NodeNG) + """ + # Look up in the mro if we can. This will result in the + # attribute being looked up just as Python does it. + try: + ancestors = self.mro(context)[1:] + except MroError: + # Fallback to use ancestors, we can't determine + # a sane MRO. + ancestors = self.ancestors(context=context) + for astroid in ancestors: + if name in astroid: + yield astroid + + def instance_attr_ancestors(self, name, context: InferenceContext | None = None): + """Iterate over the parents that define the given name as an attribute. + + :param name: The name to find definitions for. + :type name: str + + :returns: The parents that define the given name as + an instance attribute. + :rtype: iterable(NodeNG) + """ + for astroid in self.ancestors(context=context): + if name in astroid.instance_attrs: + yield astroid + + def has_base(self, node) -> bool: + """Whether this class directly inherits from the given node. + + :param node: The node to check for. + :type node: NodeNG + + :returns: Whether this class directly inherits from the given node. + """ + return node in self.bases + + def local_attr(self, name, context: InferenceContext | None = None): + """Get the list of assign nodes associated to the given name. + + Assignments are looked for in both this class and in parents. + + :returns: The list of assignments to the given name. + :rtype: list(NodeNG) + + :raises AttributeInferenceError: If no attribute with this name + can be found in this class or parent classes. + """ + result = [] + if name in self.locals: + result = self.locals[name] + else: + class_node = next(self.local_attr_ancestors(name, context), None) + if class_node: + result = class_node.locals[name] + result = [n for n in result if not isinstance(n, node_classes.DelAttr)] + if result: + return result + raise AttributeInferenceError(target=self, attribute=name, context=context) + + def instance_attr(self, name, context: InferenceContext | None = None): + """Get the list of nodes associated to the given attribute name. + + Assignments are looked for in both this class and in parents. + + :returns: The list of assignments to the given name. + :rtype: list(NodeNG) + + :raises AttributeInferenceError: If no attribute with this name + can be found in this class or parent classes. + """ + # Return a copy, so we don't modify self.instance_attrs, + # which could lead to infinite loop. + values = list(self.instance_attrs.get(name, [])) + # get all values from parents + for class_node in self.instance_attr_ancestors(name, context): + values += class_node.instance_attrs[name] + values = [n for n in values if not isinstance(n, node_classes.DelAttr)] + if values: + return values + raise AttributeInferenceError(target=self, attribute=name, context=context) + + def instantiate_class(self) -> bases.Instance: + """Get an :class:`Instance` of the :class:`ClassDef` node. + + :returns: An :class:`Instance` of the :class:`ClassDef` node + """ + try: + if any(cls.name in EXCEPTION_BASE_CLASSES for cls in self.mro()): + # Subclasses of exceptions can be exception instances + return objects.ExceptionInstance(self) + except MroError: + pass + return bases.Instance(self) + + def getattr( + self, + name: str, + context: InferenceContext | None = None, + class_context: bool = True, + ) -> list[SuccessfulInferenceResult]: + """Get an attribute from this class, using Python's attribute semantic. + + This method doesn't look in the :attr:`instance_attrs` dictionary + since it is done by an :class:`Instance` proxy at inference time. + It may return an :class:`Uninferable` object if + the attribute has not been + found, but a ``__getattr__`` or ``__getattribute__`` method is defined. + If ``class_context`` is given, then it is considered that the + attribute is accessed from a class context, + e.g. ClassDef.attribute, otherwise it might have been accessed + from an instance as well. If ``class_context`` is used in that + case, then a lookup in the implicit metaclass and the explicit + metaclass will be done. + + :param name: The attribute to look for. + + :param class_context: Whether the attribute can be accessed statically. + + :returns: The attribute. + + :raises AttributeInferenceError: If the attribute cannot be inferred. + """ + if not name: + raise AttributeInferenceError(target=self, attribute=name, context=context) + + # don't modify the list in self.locals! + values: list[SuccessfulInferenceResult] = list(self.locals.get(name, [])) + for classnode in self.ancestors(recurs=True, context=context): + values += classnode.locals.get(name, []) + + if name in self.special_attributes and class_context and not values: + result = [self.special_attributes.lookup(name)] + if name == "__bases__": + # Need special treatment, since they are mutable + # and we need to return all the values. + result += values + return result + + if class_context: + values += self._metaclass_lookup_attribute(name, context) + + # Remove AnnAssigns without value, which are not attributes in the purest sense. + for value in values.copy(): + if isinstance(value, node_classes.AssignName): + stmt = value.statement(future=True) + if isinstance(stmt, node_classes.AnnAssign) and stmt.value is None: + values.pop(values.index(value)) + + if not values: + raise AttributeInferenceError(target=self, attribute=name, context=context) + + return values + + @lru_cache(maxsize=1024) # noqa + def _metaclass_lookup_attribute(self, name, context): + """Search the given name in the implicit and the explicit metaclass.""" + attrs = set() + implicit_meta = self.implicit_metaclass() + context = copy_context(context) + metaclass = self.metaclass(context=context) + for cls in (implicit_meta, metaclass): + if cls and cls != self and isinstance(cls, ClassDef): + cls_attributes = self._get_attribute_from_metaclass(cls, name, context) + attrs.update(set(cls_attributes)) + return attrs + + def _get_attribute_from_metaclass(self, cls, name, context): + try: + attrs = cls.getattr(name, context=context, class_context=True) + except AttributeInferenceError: + return + + for attr in bases._infer_stmts(attrs, context, frame=cls): + if not isinstance(attr, FunctionDef): + yield attr + continue + + if isinstance(attr, objects.Property): + yield attr + continue + if attr.type == "classmethod": + # If the method is a classmethod, then it will + # be bound to the metaclass, not to the class + # from where the attribute is retrieved. + # get_wrapping_class could return None, so just + # default to the current class. + frame = get_wrapping_class(attr) or self + yield bases.BoundMethod(attr, frame) + elif attr.type == "staticmethod": + yield attr + else: + yield bases.BoundMethod(attr, self) + + def igetattr( + self, + name: str, + context: InferenceContext | None = None, + class_context: bool = True, + ) -> Iterator[InferenceResult]: + """Infer the possible values of the given variable. + + :param name: The name of the variable to infer. + + :returns: The inferred possible values. + """ + # set lookup name since this is necessary to infer on import nodes for + # instance + context = copy_context(context) + context.lookupname = name + + metaclass = self.metaclass(context=context) + try: + attributes = self.getattr(name, context, class_context=class_context) + # If we have more than one attribute, make sure that those starting from + # the second one are from the same scope. This is to account for modifications + # to the attribute happening *after* the attribute's definition (e.g. AugAssigns on lists) + if len(attributes) > 1: + first_attr, attributes = attributes[0], attributes[1:] + first_scope = first_attr.scope() + attributes = [first_attr] + [ + attr + for attr in attributes + if attr.parent and attr.parent.scope() == first_scope + ] + + for inferred in bases._infer_stmts(attributes, context, frame=self): + # yield Uninferable object instead of descriptors when necessary + if not isinstance(inferred, node_classes.Const) and isinstance( + inferred, bases.Instance + ): + try: + inferred._proxied.getattr("__get__", context) + except AttributeInferenceError: + yield inferred + else: + yield util.Uninferable + elif isinstance(inferred, objects.Property): + function = inferred.function + if not class_context: + # Through an instance so we can solve the property + yield from function.infer_call_result( + caller=self, context=context + ) + # If we're in a class context, we need to determine if the property + # was defined in the metaclass (a derived class must be a subclass of + # the metaclass of all its bases), in which case we can resolve the + # property. If not, i.e. the property is defined in some base class + # instead, then we return the property object + elif metaclass and function.parent.scope() is metaclass: + # Resolve a property as long as it is not accessed through + # the class itself. + yield from function.infer_call_result( + caller=self, context=context + ) + else: + yield inferred + else: + yield function_to_method(inferred, self) + except AttributeInferenceError as error: + if not name.startswith("__") and self.has_dynamic_getattr(context): + # class handle some dynamic attributes, return a Uninferable object + yield util.Uninferable + else: + raise InferenceError( + str(error), target=self, attribute=name, context=context + ) from error + + def has_dynamic_getattr(self, context: InferenceContext | None = None) -> bool: + """Check if the class has a custom __getattr__ or __getattribute__. + + If any such method is found and it is not from + builtins, nor from an extension module, then the function + will return True. + + :returns: Whether the class has a custom __getattr__ or __getattribute__. + """ + + def _valid_getattr(node): + root = node.root() + return root.name != "builtins" and getattr(root, "pure_python", None) + + try: + return _valid_getattr(self.getattr("__getattr__", context)[0]) + except AttributeInferenceError: + # if self.newstyle: XXX cause an infinite recursion error + try: + getattribute = self.getattr("__getattribute__", context)[0] + return _valid_getattr(getattribute) + except AttributeInferenceError: + pass + return False + + def getitem(self, index, context: InferenceContext | None = None): + """Return the inference of a subscript. + + This is basically looking up the method in the metaclass and calling it. + + :returns: The inferred value of a subscript to this class. + :rtype: NodeNG + + :raises AstroidTypeError: If this class does not define a + ``__getitem__`` method. + """ + try: + methods = lookup(self, "__getitem__") + except AttributeInferenceError as exc: + if isinstance(self, ClassDef): + # subscripting a class definition may be + # achieved thanks to __class_getitem__ method + # which is a classmethod defined in the class + # that supports subscript and not in the metaclass + try: + methods = self.getattr("__class_getitem__") + # Here it is assumed that the __class_getitem__ node is + # a FunctionDef. One possible improvement would be to deal + # with more generic inference. + except AttributeInferenceError: + raise AstroidTypeError(node=self, context=context) from exc + else: + raise AstroidTypeError(node=self, context=context) from exc + + method = methods[0] + + # Create a new callcontext for providing index as an argument. + new_context = bind_context_to_node(context, self) + new_context.callcontext = CallContext(args=[index], callee=method) + + try: + return next(method.infer_call_result(self, new_context), util.Uninferable) + except AttributeError: + # Starting with python3.9, builtin types list, dict etc... + # are subscriptable thanks to __class_getitem___ classmethod. + # However in such case the method is bound to an EmptyNode and + # EmptyNode doesn't have infer_call_result method yielding to + # AttributeError + if ( + isinstance(method, node_classes.EmptyNode) + and self.pytype() == "builtins.type" + and PY39_PLUS + ): + return self + raise + except InferenceError: + return util.Uninferable + + def methods(self): + """Iterate over all of the method defined in this class and its parents. + + :returns: The methods defined on the class. + :rtype: iterable(FunctionDef) + """ + done = {} + for astroid in itertools.chain(iter((self,)), self.ancestors()): + for meth in astroid.mymethods(): + if meth.name in done: + continue + done[meth.name] = None + yield meth + + def mymethods(self): + """Iterate over all of the method defined in this class only. + + :returns: The methods defined on the class. + :rtype: iterable(FunctionDef) + """ + for member in self.values(): + if isinstance(member, FunctionDef): + yield member + + def implicit_metaclass(self): + """Get the implicit metaclass of the current class. + + For newstyle classes, this will return an instance of builtins.type. + For oldstyle classes, it will simply return None, since there's + no implicit metaclass there. + + :returns: The metaclass. + :rtype: builtins.type or None + """ + if self.newstyle: + return builtin_lookup("type")[1][0] + return None + + def declared_metaclass( + self, context: InferenceContext | None = None + ) -> NodeNG | None: + """Return the explicit declared metaclass for the current class. + + An explicit declared metaclass is defined + either by passing the ``metaclass`` keyword argument + in the class definition line (Python 3) or (Python 2) by + having a ``__metaclass__`` class attribute, or if there are + no explicit bases but there is a global ``__metaclass__`` variable. + + :returns: The metaclass of this class, + or None if one could not be found. + """ + for base in self.bases: + try: + for baseobj in base.infer(context=context): + if isinstance(baseobj, ClassDef) and baseobj.hide: + self._metaclass = baseobj._metaclass + self._metaclass_hack = True + break + except InferenceError: + pass + + if self._metaclass: + # Expects this from Py3k TreeRebuilder + try: + return next( + node + for node in self._metaclass.infer(context=context) + if not isinstance(node, util.UninferableBase) + ) + except (InferenceError, StopIteration): + return None + + return None + + def _find_metaclass( + self, seen: set[ClassDef] | None = None, context: InferenceContext | None = None + ) -> NodeNG | None: + if seen is None: + seen = set() + seen.add(self) + + klass = self.declared_metaclass(context=context) + if klass is None: + for parent in self.ancestors(context=context): + if parent not in seen: + klass = parent._find_metaclass(seen) + if klass is not None: + break + return klass + + def metaclass(self, context: InferenceContext | None = None) -> NodeNG | None: + """Get the metaclass of this class. + + If this class does not define explicitly a metaclass, + then the first defined metaclass in ancestors will be used + instead. + + :returns: The metaclass of this class. + """ + return self._find_metaclass(context=context) + + def has_metaclass_hack(self): + return self._metaclass_hack + + def _islots(self): + """Return an iterator with the inferred slots.""" + if "__slots__" not in self.locals: + return None + for slots in self.igetattr("__slots__"): + # check if __slots__ is a valid type + for meth in ITER_METHODS: + try: + slots.getattr(meth) + break + except AttributeInferenceError: + continue + else: + continue + + if isinstance(slots, node_classes.Const): + # a string. Ignore the following checks, + # but yield the node, only if it has a value + if slots.value: + yield slots + continue + if not hasattr(slots, "itered"): + # we can't obtain the values, maybe a .deque? + continue + + if isinstance(slots, node_classes.Dict): + values = [item[0] for item in slots.items] + else: + values = slots.itered() + if isinstance(values, util.UninferableBase): + continue + if not values: + # Stop the iteration, because the class + # has an empty list of slots. + return values + + for elt in values: + try: + for inferred in elt.infer(): + if not isinstance( + inferred, node_classes.Const + ) or not isinstance(inferred.value, str): + continue + if not inferred.value: + continue + yield inferred + except InferenceError: + continue + + return None + + def _slots(self): + if not self.newstyle: + raise NotImplementedError( + "The concept of slots is undefined for old-style classes." + ) + + slots = self._islots() + try: + first = next(slots) + except StopIteration as exc: + # The class doesn't have a __slots__ definition or empty slots. + if exc.args and exc.args[0] not in ("", None): + return exc.args[0] + return None + return [first] + list(slots) + + # Cached, because inferring them all the time is expensive + @decorators_mod.cached + def slots(self): + """Get all the slots for this node. + + :returns: The names of slots for this class. + If the class doesn't define any slot, through the ``__slots__`` + variable, then this function will return a None. + Also, it will return None in the case the slots were not inferred. + :rtype: list(str) or None + """ + + def grouped_slots( + mro: list[ClassDef], + ) -> Iterator[node_classes.NodeNG | None]: + for cls in mro: + # Not interested in object, since it can't have slots. + if cls.qname() == "builtins.object": + continue + try: + cls_slots = cls._slots() + except NotImplementedError: + continue + if cls_slots is not None: + yield from cls_slots + else: + yield None + + if not self.newstyle: + raise NotImplementedError( + "The concept of slots is undefined for old-style classes." + ) + + try: + mro = self.mro() + except MroError as e: + raise NotImplementedError( + "Cannot get slots while parsing mro fails." + ) from e + + slots = list(grouped_slots(mro)) + if not all(slot is not None for slot in slots): + return None + + return sorted(set(slots), key=lambda item: item.value) + + def _inferred_bases(self, context: InferenceContext | None = None): + # Similar with .ancestors, but the difference is when one base is inferred, + # only the first object is wanted. That's because + # we aren't interested in superclasses, as in the following + # example: + # + # class SomeSuperClass(object): pass + # class SomeClass(SomeSuperClass): pass + # class Test(SomeClass): pass + # + # Inferring SomeClass from the Test's bases will give + # us both SomeClass and SomeSuperClass, but we are interested + # only in SomeClass. + + if context is None: + context = InferenceContext() + if not self.bases and self.qname() != "builtins.object": + yield builtin_lookup("object")[1][0] + return + + for stmt in self.bases: + try: + # Find the first non-None inferred base value + baseobj = next( + b + for b in stmt.infer(context=context.clone()) + if not (isinstance(b, Const) and b.value is None) + ) + except (InferenceError, StopIteration): + continue + if isinstance(baseobj, bases.Instance): + baseobj = baseobj._proxied + if not isinstance(baseobj, ClassDef): + continue + if not baseobj.hide: + yield baseobj + else: + yield from baseobj.bases + + def _compute_mro(self, context: InferenceContext | None = None): + inferred_bases = list(self._inferred_bases(context=context)) + bases_mro = [] + for base in inferred_bases: + if base is self: + continue + + try: + mro = base._compute_mro(context=context) + bases_mro.append(mro) + except NotImplementedError: + # Some classes have in their ancestors both newstyle and + # old style classes. For these we can't retrieve the .mro, + # although in Python it's possible, since the class we are + # currently working is in fact new style. + # So, we fallback to ancestors here. + ancestors = list(base.ancestors(context=context)) + bases_mro.append(ancestors) + + unmerged_mro = [[self]] + bases_mro + [inferred_bases] + unmerged_mro = list(clean_duplicates_mro(unmerged_mro, self, context)) + clean_typing_generic_mro(unmerged_mro) + return _c3_merge(unmerged_mro, self, context) + + def mro(self, context: InferenceContext | None = None) -> list[ClassDef]: + """Get the method resolution order, using C3 linearization. + + :returns: The list of ancestors, sorted by the mro. + :rtype: list(NodeNG) + :raises DuplicateBasesError: Duplicate bases in the same class base + :raises InconsistentMroError: A class' MRO is inconsistent + """ + return self._compute_mro(context=context) + + def bool_value(self, context: InferenceContext | None = None) -> Literal[True]: + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`ClassDef` this is always ``True``. + """ + return True + + def get_children(self): + if self.decorators is not None: + yield self.decorators + + yield from self.bases + if self.keywords is not None: + yield from self.keywords + yield from self.body + + @decorators_mod.cached + def _get_assign_nodes(self): + children_assign_nodes = ( + child_node._get_assign_nodes() for child_node in self.body + ) + return list(itertools.chain.from_iterable(children_assign_nodes)) + + def frame(self: _T, *, future: Literal[None, True] = None) -> _T: + """The node's frame node. + + A frame node is a :class:`Module`, :class:`FunctionDef`, + :class:`ClassDef` or :class:`Lambda`. + + :returns: The node itself. + """ + return self diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/utils.py b/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/utils.py new file mode 120000 index 00000000..8ea53675 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/nodes/scoped_nodes/utils.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/36/78/dd/91c6e6f73b3bd8772857d6ff844e8ff922d9ecc081f6ead4f965033558 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/nodes/utils.py b/venv/lib/python3.10/site-packages/astroid/nodes/utils.py new file mode 120000 index 00000000..07645464 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/nodes/utils.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/53/2e/b1/a28c272f25b00edb99e6a5298dbab5f4fda9508723d09d389216c7e476 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/objects.py b/venv/lib/python3.10/site-packages/astroid/objects.py new file mode 120000 index 00000000..d1651651 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/objects.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/f2/ba/0c/e77b16c05ceeb0022fcf79ce8f42da4045ddcc9c3400d7dbea60cccb9c \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/protocols.py b/venv/lib/python3.10/site-packages/astroid/protocols.py new file mode 100644 index 00000000..dcc9e2b8 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/protocols.py @@ -0,0 +1,980 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""This module contains a set of functions to handle python protocols for nodes +where it makes sense. +""" + +from __future__ import annotations + +import collections +import itertools +import operator as operator_mod +from collections.abc import Callable, Generator, Iterator, Sequence +from typing import Any, TypeVar + +from astroid import arguments, bases, decorators, helpers, nodes, util +from astroid.const import Context +from astroid.context import InferenceContext, copy_context +from astroid.exceptions import ( + AstroidIndexError, + AstroidTypeError, + AttributeInferenceError, + InferenceError, + NoDefault, +) +from astroid.nodes import node_classes +from astroid.typing import ( + ConstFactoryResult, + InferenceResult, + SuccessfulInferenceResult, +) + +raw_building = util.lazy_import("raw_building") +objects = util.lazy_import("objects") + + +_TupleListNodeT = TypeVar("_TupleListNodeT", nodes.Tuple, nodes.List) + + +def _reflected_name(name) -> str: + return "__r" + name[2:] + + +def _augmented_name(name) -> str: + return "__i" + name[2:] + + +_CONTEXTLIB_MGR = "contextlib.contextmanager" +BIN_OP_METHOD = { + "+": "__add__", + "-": "__sub__", + "/": "__truediv__", + "//": "__floordiv__", + "*": "__mul__", + "**": "__pow__", + "%": "__mod__", + "&": "__and__", + "|": "__or__", + "^": "__xor__", + "<<": "__lshift__", + ">>": "__rshift__", + "@": "__matmul__", +} + +REFLECTED_BIN_OP_METHOD = { + key: _reflected_name(value) for (key, value) in BIN_OP_METHOD.items() +} +AUGMENTED_OP_METHOD = { + key + "=": _augmented_name(value) for (key, value) in BIN_OP_METHOD.items() +} + +UNARY_OP_METHOD = { + "+": "__pos__", + "-": "__neg__", + "~": "__invert__", + "not": None, # XXX not '__nonzero__' +} +_UNARY_OPERATORS: dict[str, Callable[[Any], Any]] = { + "+": operator_mod.pos, + "-": operator_mod.neg, + "~": operator_mod.invert, + "not": operator_mod.not_, +} + + +def _infer_unary_op(obj: Any, op: str) -> ConstFactoryResult: + """Perform unary operation on `obj`, unless it is `NotImplemented`. + + Can raise TypeError if operation is unsupported. + """ + if obj is NotImplemented: + value = obj + else: + func = _UNARY_OPERATORS[op] + value = func(obj) + return nodes.const_factory(value) + + +nodes.Tuple.infer_unary_op = lambda self, op: _infer_unary_op(tuple(self.elts), op) +nodes.List.infer_unary_op = lambda self, op: _infer_unary_op(self.elts, op) +nodes.Set.infer_unary_op = lambda self, op: _infer_unary_op(set(self.elts), op) +nodes.Const.infer_unary_op = lambda self, op: _infer_unary_op(self.value, op) +nodes.Dict.infer_unary_op = lambda self, op: _infer_unary_op(dict(self.items), op) + +# Binary operations + +BIN_OP_IMPL = { + "+": lambda a, b: a + b, + "-": lambda a, b: a - b, + "/": lambda a, b: a / b, + "//": lambda a, b: a // b, + "*": lambda a, b: a * b, + "**": lambda a, b: a**b, + "%": lambda a, b: a % b, + "&": lambda a, b: a & b, + "|": lambda a, b: a | b, + "^": lambda a, b: a ^ b, + "<<": lambda a, b: a << b, + ">>": lambda a, b: a >> b, + "@": operator_mod.matmul, +} +for _KEY, _IMPL in list(BIN_OP_IMPL.items()): + BIN_OP_IMPL[_KEY + "="] = _IMPL + + +@decorators.yes_if_nothing_inferred +def const_infer_binary_op( + self: nodes.Const, + opnode: nodes.AugAssign | nodes.BinOp, + operator: str, + other: InferenceResult, + context: InferenceContext, + _: SuccessfulInferenceResult, +) -> Generator[ConstFactoryResult | util.UninferableBase, None, None]: + not_implemented = nodes.Const(NotImplemented) + if isinstance(other, nodes.Const): + if ( + operator == "**" + and isinstance(self.value, (int, float)) + and isinstance(other.value, (int, float)) + and (self.value > 1e5 or other.value > 1e5) + ): + yield not_implemented + return + try: + impl = BIN_OP_IMPL[operator] + try: + yield nodes.const_factory(impl(self.value, other.value)) + except TypeError: + # ArithmeticError is not enough: float >> float is a TypeError + yield not_implemented + except Exception: # pylint: disable=broad-except + yield util.Uninferable + except TypeError: + yield not_implemented + elif isinstance(self.value, str) and operator == "%": + # TODO(cpopa): implement string interpolation later on. + yield util.Uninferable + else: + yield not_implemented + + +nodes.Const.infer_binary_op = const_infer_binary_op + + +def _multiply_seq_by_int( + self: _TupleListNodeT, + opnode: nodes.AugAssign | nodes.BinOp, + other: nodes.Const, + context: InferenceContext, +) -> _TupleListNodeT: + node = self.__class__(parent=opnode) + filtered_elts = ( + helpers.safe_infer(elt, context) or util.Uninferable + for elt in self.elts + if not isinstance(elt, util.UninferableBase) + ) + node.elts = list(filtered_elts) * other.value + return node + + +def _filter_uninferable_nodes( + elts: Sequence[InferenceResult], context: InferenceContext +) -> Iterator[SuccessfulInferenceResult]: + for elt in elts: + if isinstance(elt, util.UninferableBase): + yield nodes.Unknown() + else: + for inferred in elt.infer(context): + if not isinstance(inferred, util.UninferableBase): + yield inferred + else: + yield nodes.Unknown() + + +@decorators.yes_if_nothing_inferred +def tl_infer_binary_op( + self: _TupleListNodeT, + opnode: nodes.AugAssign | nodes.BinOp, + operator: str, + other: InferenceResult, + context: InferenceContext, + method: SuccessfulInferenceResult, +) -> Generator[_TupleListNodeT | nodes.Const | util.UninferableBase, None, None]: + """Infer a binary operation on a tuple or list. + + The instance on which the binary operation is performed is a tuple + or list. This refers to the left-hand side of the operation, so: + 'tuple() + 1' or '[] + A()' + """ + # For tuples and list the boundnode is no longer the tuple or list instance + context.boundnode = None + not_implemented = nodes.Const(NotImplemented) + if isinstance(other, self.__class__) and operator == "+": + node = self.__class__(parent=opnode) + node.elts = list( + itertools.chain( + _filter_uninferable_nodes(self.elts, context), + _filter_uninferable_nodes(other.elts, context), + ) + ) + yield node + elif isinstance(other, nodes.Const) and operator == "*": + if not isinstance(other.value, int): + yield not_implemented + return + yield _multiply_seq_by_int(self, opnode, other, context) + elif isinstance(other, bases.Instance) and operator == "*": + # Verify if the instance supports __index__. + as_index = helpers.class_instance_as_index(other) + if not as_index: + yield util.Uninferable + else: + yield _multiply_seq_by_int(self, opnode, as_index, context) + else: + yield not_implemented + + +nodes.Tuple.infer_binary_op = tl_infer_binary_op +nodes.List.infer_binary_op = tl_infer_binary_op + + +@decorators.yes_if_nothing_inferred +def instance_class_infer_binary_op( + self: bases.Instance | nodes.ClassDef, + opnode: nodes.AugAssign | nodes.BinOp, + operator: str, + other: InferenceResult, + context: InferenceContext, + method: SuccessfulInferenceResult, +) -> Generator[InferenceResult, None, None]: + return method.infer_call_result(self, context) + + +bases.Instance.infer_binary_op = instance_class_infer_binary_op +nodes.ClassDef.infer_binary_op = instance_class_infer_binary_op + + +# assignment ################################################################## + +"""The assigned_stmts method is responsible to return the assigned statement +(e.g. not inferred) according to the assignment type. + +The `assign_path` argument is used to record the lhs path of the original node. +For instance if we want assigned statements for 'c' in 'a, (b,c)', assign_path +will be [1, 1] once arrived to the Assign node. + +The `context` argument is the current inference context which should be given +to any intermediary inference necessary. +""" + + +def _resolve_looppart(parts, assign_path, context): + """Recursive function to resolve multiple assignments on loops.""" + assign_path = assign_path[:] + index = assign_path.pop(0) + for part in parts: + if isinstance(part, util.UninferableBase): + continue + if not hasattr(part, "itered"): + continue + try: + itered = part.itered() + except TypeError: + continue + try: + if isinstance(itered[index], (nodes.Const, nodes.Name)): + itered = [part] + except IndexError: + pass + for stmt in itered: + index_node = nodes.Const(index) + try: + assigned = stmt.getitem(index_node, context) + except (AttributeError, AstroidTypeError, AstroidIndexError): + continue + if not assign_path: + # we achieved to resolved the assignment path, + # don't infer the last part + yield assigned + elif isinstance(assigned, util.UninferableBase): + break + else: + # we are not yet on the last part of the path + # search on each possibly inferred value + try: + yield from _resolve_looppart( + assigned.infer(context), assign_path, context + ) + except InferenceError: + break + + +@decorators.raise_if_nothing_inferred +def for_assigned_stmts( + self: nodes.For | nodes.Comprehension, + node: node_classes.AssignedStmtsPossibleNode = None, + context: InferenceContext | None = None, + assign_path: list[int] | None = None, +) -> Any: + if isinstance(self, nodes.AsyncFor) or getattr(self, "is_async", False): + # Skip inferring of async code for now + return { + "node": self, + "unknown": node, + "assign_path": assign_path, + "context": context, + } + if assign_path is None: + for lst in self.iter.infer(context): + if isinstance(lst, (nodes.Tuple, nodes.List)): + yield from lst.elts + else: + yield from _resolve_looppart(self.iter.infer(context), assign_path, context) + return { + "node": self, + "unknown": node, + "assign_path": assign_path, + "context": context, + } + + +nodes.For.assigned_stmts = for_assigned_stmts +nodes.Comprehension.assigned_stmts = for_assigned_stmts + + +def sequence_assigned_stmts( + self: nodes.Tuple | nodes.List, + node: node_classes.AssignedStmtsPossibleNode = None, + context: InferenceContext | None = None, + assign_path: list[int] | None = None, +) -> Any: + if assign_path is None: + assign_path = [] + try: + index = self.elts.index(node) # type: ignore[arg-type] + except ValueError as exc: + raise InferenceError( + "Tried to retrieve a node {node!r} which does not exist", + node=self, + assign_path=assign_path, + context=context, + ) from exc + + assign_path.insert(0, index) + return self.parent.assigned_stmts( + node=self, context=context, assign_path=assign_path + ) + + +nodes.Tuple.assigned_stmts = sequence_assigned_stmts +nodes.List.assigned_stmts = sequence_assigned_stmts + + +def assend_assigned_stmts( + self: nodes.AssignName | nodes.AssignAttr, + node: node_classes.AssignedStmtsPossibleNode = None, + context: InferenceContext | None = None, + assign_path: list[int] | None = None, +) -> Any: + return self.parent.assigned_stmts(node=self, context=context) + + +nodes.AssignName.assigned_stmts = assend_assigned_stmts +nodes.AssignAttr.assigned_stmts = assend_assigned_stmts + + +def _arguments_infer_argname( + self, name: str | None, context: InferenceContext +) -> Generator[InferenceResult, None, None]: + # arguments information may be missing, in which case we can't do anything + # more + if not (self.arguments or self.vararg or self.kwarg): + yield util.Uninferable + return + + functype = self.parent.type + # first argument of instance/class method + if ( + self.arguments + and getattr(self.arguments[0], "name", None) == name + and functype != "staticmethod" + ): + cls = self.parent.parent.scope() + is_metaclass = isinstance(cls, nodes.ClassDef) and cls.type == "metaclass" + # If this is a metaclass, then the first argument will always + # be the class, not an instance. + if context.boundnode and isinstance(context.boundnode, bases.Instance): + cls = context.boundnode._proxied + if is_metaclass or functype == "classmethod": + yield cls + return + if functype == "method": + yield cls.instantiate_class() + return + + if context and context.callcontext: + callee = context.callcontext.callee + while hasattr(callee, "_proxied"): + callee = callee._proxied + if getattr(callee, "name", None) == self.parent.name: + call_site = arguments.CallSite(context.callcontext, context.extra_context) + yield from call_site.infer_argument(self.parent, name, context) + return + + if name == self.vararg: + vararg = nodes.const_factory(()) + vararg.parent = self + if not self.arguments and self.parent.name == "__init__": + cls = self.parent.parent.scope() + vararg.elts = [cls.instantiate_class()] + yield vararg + return + if name == self.kwarg: + kwarg = nodes.const_factory({}) + kwarg.parent = self + yield kwarg + return + # if there is a default value, yield it. And then yield Uninferable to reflect + # we can't guess given argument value + try: + context = copy_context(context) + yield from self.default_value(name).infer(context) + yield util.Uninferable + except NoDefault: + yield util.Uninferable + + +def arguments_assigned_stmts( + self: nodes.Arguments, + node: node_classes.AssignedStmtsPossibleNode = None, + context: InferenceContext | None = None, + assign_path: list[int] | None = None, +) -> Any: + try: + node_name = node.name # type: ignore[union-attr] + except AttributeError: + # Added to handle edge cases where node.name is not defined. + # https://github.com/PyCQA/astroid/pull/1644#discussion_r901545816 + node_name = None # pragma: no cover + + if context and context.callcontext: + callee = context.callcontext.callee + while hasattr(callee, "_proxied"): + callee = callee._proxied + else: + return _arguments_infer_argname(self, node_name, context) + if node and getattr(callee, "name", None) == node.frame(future=True).name: + # reset call context/name + callcontext = context.callcontext + context = copy_context(context) + context.callcontext = None + args = arguments.CallSite(callcontext, context=context) + return args.infer_argument(self.parent, node_name, context) + return _arguments_infer_argname(self, node_name, context) + + +nodes.Arguments.assigned_stmts = arguments_assigned_stmts + + +@decorators.raise_if_nothing_inferred +def assign_assigned_stmts( + self: nodes.AugAssign | nodes.Assign | nodes.AnnAssign, + node: node_classes.AssignedStmtsPossibleNode = None, + context: InferenceContext | None = None, + assign_path: list[int] | None = None, +) -> Any: + if not assign_path: + yield self.value + return None + yield from _resolve_assignment_parts( + self.value.infer(context), assign_path, context + ) + + return { + "node": self, + "unknown": node, + "assign_path": assign_path, + "context": context, + } + + +def assign_annassigned_stmts( + self: nodes.AnnAssign, + node: node_classes.AssignedStmtsPossibleNode = None, + context: InferenceContext | None = None, + assign_path: list[int] | None = None, +) -> Any: + for inferred in assign_assigned_stmts(self, node, context, assign_path): + if inferred is None: + yield util.Uninferable + else: + yield inferred + + +nodes.Assign.assigned_stmts = assign_assigned_stmts +nodes.AnnAssign.assigned_stmts = assign_annassigned_stmts +nodes.AugAssign.assigned_stmts = assign_assigned_stmts + + +def _resolve_assignment_parts(parts, assign_path, context): + """Recursive function to resolve multiple assignments.""" + assign_path = assign_path[:] + index = assign_path.pop(0) + for part in parts: + assigned = None + if isinstance(part, nodes.Dict): + # A dictionary in an iterating context + try: + assigned, _ = part.items[index] + except IndexError: + return + + elif hasattr(part, "getitem"): + index_node = nodes.Const(index) + try: + assigned = part.getitem(index_node, context) + except (AstroidTypeError, AstroidIndexError): + return + + if not assigned: + return + + if not assign_path: + # we achieved to resolved the assignment path, don't infer the + # last part + yield assigned + elif isinstance(assigned, util.UninferableBase): + return + else: + # we are not yet on the last part of the path search on each + # possibly inferred value + try: + yield from _resolve_assignment_parts( + assigned.infer(context), assign_path, context + ) + except InferenceError: + return + + +@decorators.raise_if_nothing_inferred +def excepthandler_assigned_stmts( + self: nodes.ExceptHandler, + node: node_classes.AssignedStmtsPossibleNode = None, + context: InferenceContext | None = None, + assign_path: list[int] | None = None, +) -> Any: + for assigned in node_classes.unpack_infer(self.type): + if isinstance(assigned, nodes.ClassDef): + assigned = objects.ExceptionInstance(assigned) + + yield assigned + return { + "node": self, + "unknown": node, + "assign_path": assign_path, + "context": context, + } + + +nodes.ExceptHandler.assigned_stmts = excepthandler_assigned_stmts + + +def _infer_context_manager(self, mgr, context): + try: + inferred = next(mgr.infer(context=context)) + except StopIteration as e: + raise InferenceError(node=mgr) from e + if isinstance(inferred, bases.Generator): + # Check if it is decorated with contextlib.contextmanager. + func = inferred.parent + if not func.decorators: + raise InferenceError( + "No decorators found on inferred generator %s", node=func + ) + + for decorator_node in func.decorators.nodes: + decorator = next(decorator_node.infer(context=context), None) + if isinstance(decorator, nodes.FunctionDef): + if decorator.qname() == _CONTEXTLIB_MGR: + break + else: + # It doesn't interest us. + raise InferenceError(node=func) + try: + yield next(inferred.infer_yield_types()) + except StopIteration as e: + raise InferenceError(node=func) from e + + elif isinstance(inferred, bases.Instance): + try: + enter = next(inferred.igetattr("__enter__", context=context)) + except (InferenceError, AttributeInferenceError, StopIteration) as exc: + raise InferenceError(node=inferred) from exc + if not isinstance(enter, bases.BoundMethod): + raise InferenceError(node=enter) + yield from enter.infer_call_result(self, context) + else: + raise InferenceError(node=mgr) + + +@decorators.raise_if_nothing_inferred +def with_assigned_stmts( + self: nodes.With, + node: node_classes.AssignedStmtsPossibleNode = None, + context: InferenceContext | None = None, + assign_path: list[int] | None = None, +) -> Any: + """Infer names and other nodes from a *with* statement. + + This enables only inference for name binding in a *with* statement. + For instance, in the following code, inferring `func` will return + the `ContextManager` class, not whatever ``__enter__`` returns. + We are doing this intentionally, because we consider that the context + manager result is whatever __enter__ returns and what it is binded + using the ``as`` keyword. + + class ContextManager(object): + def __enter__(self): + return 42 + with ContextManager() as f: + pass + + # ContextManager().infer() will return ContextManager + # f.infer() will return 42. + + Arguments: + self: nodes.With + node: The target of the assignment, `as (a, b)` in `with foo as (a, b)`. + context: Inference context used for caching already inferred objects + assign_path: + A list of indices, where each index specifies what item to fetch from + the inference results. + """ + try: + mgr = next(mgr for (mgr, vars) in self.items if vars == node) + except StopIteration: + return None + if assign_path is None: + yield from _infer_context_manager(self, mgr, context) + else: + for result in _infer_context_manager(self, mgr, context): + # Walk the assign_path and get the item at the final index. + obj = result + for index in assign_path: + if not hasattr(obj, "elts"): + raise InferenceError( + "Wrong type ({targets!r}) for {node!r} assignment", + node=self, + targets=node, + assign_path=assign_path, + context=context, + ) + try: + obj = obj.elts[index] + except IndexError as exc: + raise InferenceError( + "Tried to infer a nonexistent target with index {index} " + "in {node!r}.", + node=self, + targets=node, + assign_path=assign_path, + context=context, + ) from exc + except TypeError as exc: + raise InferenceError( + "Tried to unpack a non-iterable value in {node!r}.", + node=self, + targets=node, + assign_path=assign_path, + context=context, + ) from exc + yield obj + return { + "node": self, + "unknown": node, + "assign_path": assign_path, + "context": context, + } + + +nodes.With.assigned_stmts = with_assigned_stmts + + +@decorators.raise_if_nothing_inferred +def named_expr_assigned_stmts( + self: nodes.NamedExpr, + node: node_classes.AssignedStmtsPossibleNode, + context: InferenceContext | None = None, + assign_path: list[int] | None = None, +) -> Any: + """Infer names and other nodes from an assignment expression.""" + if self.target == node: + yield from self.value.infer(context=context) + else: + raise InferenceError( + "Cannot infer NamedExpr node {node!r}", + node=self, + assign_path=assign_path, + context=context, + ) + + +nodes.NamedExpr.assigned_stmts = named_expr_assigned_stmts + + +@decorators.yes_if_nothing_inferred +def starred_assigned_stmts( # noqa: C901 + self: nodes.Starred, + node: node_classes.AssignedStmtsPossibleNode = None, + context: InferenceContext | None = None, + assign_path: list[int] | None = None, +) -> Any: + """ + Arguments: + self: nodes.Starred + node: a node related to the current underlying Node. + context: Inference context used for caching already inferred objects + assign_path: + A list of indices, where each index specifies what item to fetch from + the inference results. + """ + + # pylint: disable=too-many-locals,too-many-statements + def _determine_starred_iteration_lookups( + starred: nodes.Starred, target: nodes.Tuple, lookups: list[tuple[int, int]] + ) -> None: + # Determine the lookups for the rhs of the iteration + itered = target.itered() + for index, element in enumerate(itered): + if ( + isinstance(element, nodes.Starred) + and element.value.name == starred.value.name + ): + lookups.append((index, len(itered))) + break + if isinstance(element, nodes.Tuple): + lookups.append((index, len(element.itered()))) + _determine_starred_iteration_lookups(starred, element, lookups) + + stmt = self.statement(future=True) + if not isinstance(stmt, (nodes.Assign, nodes.For)): + raise InferenceError( + "Statement {stmt!r} enclosing {node!r} must be an Assign or For node.", + node=self, + stmt=stmt, + unknown=node, + context=context, + ) + + if context is None: + context = InferenceContext() + + if isinstance(stmt, nodes.Assign): + value = stmt.value + lhs = stmt.targets[0] + if not isinstance(lhs, nodes.BaseContainer): + yield util.Uninferable + return + + if sum(1 for _ in lhs.nodes_of_class(nodes.Starred)) > 1: + raise InferenceError( + "Too many starred arguments in the assignment targets {lhs!r}.", + node=self, + targets=lhs, + unknown=node, + context=context, + ) + + try: + rhs = next(value.infer(context)) + except (InferenceError, StopIteration): + yield util.Uninferable + return + if isinstance(rhs, util.UninferableBase) or not hasattr(rhs, "itered"): + yield util.Uninferable + return + + try: + elts = collections.deque(rhs.itered()) # type: ignore[union-attr] + except TypeError: + yield util.Uninferable + return + + # Unpack iteratively the values from the rhs of the assignment, + # until the find the starred node. What will remain will + # be the list of values which the Starred node will represent + # This is done in two steps, from left to right to remove + # anything before the starred node and from right to left + # to remove anything after the starred node. + + for index, left_node in enumerate(lhs.elts): + if not isinstance(left_node, nodes.Starred): + if not elts: + break + elts.popleft() + continue + lhs_elts = collections.deque(reversed(lhs.elts[index:])) + for right_node in lhs_elts: + if not isinstance(right_node, nodes.Starred): + if not elts: + break + elts.pop() + continue + + # We're done unpacking. + packed = nodes.List( + ctx=Context.Store, + parent=self, + lineno=lhs.lineno, + col_offset=lhs.col_offset, + ) + packed.postinit(elts=list(elts)) + yield packed + break + + if isinstance(stmt, nodes.For): + try: + inferred_iterable = next(stmt.iter.infer(context=context)) + except (InferenceError, StopIteration): + yield util.Uninferable + return + if isinstance(inferred_iterable, util.UninferableBase) or not hasattr( + inferred_iterable, "itered" + ): + yield util.Uninferable + return + try: + itered = inferred_iterable.itered() # type: ignore[union-attr] + except TypeError: + yield util.Uninferable + return + + target = stmt.target + + if not isinstance(target, nodes.Tuple): + raise InferenceError( + "Could not make sense of this, the target must be a tuple", + context=context, + ) + + lookups: list[tuple[int, int]] = [] + _determine_starred_iteration_lookups(self, target, lookups) + if not lookups: + raise InferenceError( + "Could not make sense of this, needs at least a lookup", context=context + ) + + # Make the last lookup a slice, since that what we want for a Starred node + last_element_index, last_element_length = lookups[-1] + is_starred_last = last_element_index == (last_element_length - 1) + + lookup_slice = slice( + last_element_index, + None if is_starred_last else (last_element_length - last_element_index), + ) + last_lookup = lookup_slice + + for element in itered: + # We probably want to infer the potential values *for each* element in an + # iterable, but we can't infer a list of all values, when only a list of + # step values are expected: + # + # for a, *b in [...]: + # b + # + # *b* should now point to just the elements at that particular iteration step, + # which astroid can't know about. + + found_element = None + for index, lookup in enumerate(lookups): + if not hasattr(element, "itered"): + break + if index + 1 is len(lookups): + cur_lookup: slice | int = last_lookup + else: + # Grab just the index, not the whole length + cur_lookup = lookup[0] + try: + itered_inner_element = element.itered() + element = itered_inner_element[cur_lookup] + except IndexError: + break + except TypeError: + # Most likely the itered() call failed, cannot make sense of this + yield util.Uninferable + return + else: + found_element = element + + unpacked = nodes.List( + ctx=Context.Store, + parent=self, + lineno=self.lineno, + col_offset=self.col_offset, + ) + unpacked.postinit(elts=found_element or []) + yield unpacked + return + + yield util.Uninferable + + +nodes.Starred.assigned_stmts = starred_assigned_stmts + + +@decorators.yes_if_nothing_inferred +def match_mapping_assigned_stmts( + self: nodes.MatchMapping, + node: nodes.AssignName, + context: InferenceContext | None = None, + assign_path: None = None, +) -> Generator[nodes.NodeNG, None, None]: + """Return empty generator (return -> raises StopIteration) so inferred value + is Uninferable. + """ + return + yield + + +nodes.MatchMapping.assigned_stmts = match_mapping_assigned_stmts + + +@decorators.yes_if_nothing_inferred +def match_star_assigned_stmts( + self: nodes.MatchStar, + node: nodes.AssignName, + context: InferenceContext | None = None, + assign_path: None = None, +) -> Generator[nodes.NodeNG, None, None]: + """Return empty generator (return -> raises StopIteration) so inferred value + is Uninferable. + """ + return + yield + + +nodes.MatchStar.assigned_stmts = match_star_assigned_stmts + + +@decorators.yes_if_nothing_inferred +def match_as_assigned_stmts( + self: nodes.MatchAs, + node: nodes.AssignName, + context: InferenceContext | None = None, + assign_path: None = None, +) -> Generator[nodes.NodeNG, None, None]: + """Infer MatchAs as the Match subject if it's the only MatchCase pattern + else raise StopIteration to yield Uninferable. + """ + if ( + isinstance(self.parent, nodes.MatchCase) + and isinstance(self.parent.parent, nodes.Match) + and self.pattern is None + ): + yield self.parent.parent.subject + + +nodes.MatchAs.assigned_stmts = match_as_assigned_stmts diff --git a/venv/lib/python3.10/site-packages/astroid/raw_building.py b/venv/lib/python3.10/site-packages/astroid/raw_building.py new file mode 100644 index 00000000..4409a639 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/raw_building.py @@ -0,0 +1,643 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""this module contains a set of functions to create astroid trees from scratch +(build_* functions) or from living object (object_build_* functions) +""" + +from __future__ import annotations + +import builtins +import inspect +import io +import logging +import os +import sys +import types +import warnings +from collections.abc import Iterable +from contextlib import redirect_stderr, redirect_stdout +from typing import Any, Union + +from astroid import bases, nodes +from astroid.const import _EMPTY_OBJECT_MARKER, IS_PYPY +from astroid.manager import AstroidManager +from astroid.nodes import node_classes + +logger = logging.getLogger(__name__) + + +_FunctionTypes = Union[ + types.FunctionType, + types.MethodType, + types.BuiltinFunctionType, + types.WrapperDescriptorType, + types.MethodDescriptorType, + types.ClassMethodDescriptorType, +] + +# the keys of CONST_CLS eg python builtin types +_CONSTANTS = tuple(node_classes.CONST_CLS) +_BUILTINS = vars(builtins) +TYPE_NONE = type(None) +TYPE_NOTIMPLEMENTED = type(NotImplemented) +TYPE_ELLIPSIS = type(...) + + +def _attach_local_node(parent, node, name: str) -> None: + node.name = name # needed by add_local_node + parent.add_local_node(node) + + +def _add_dunder_class(func, member) -> None: + """Add a __class__ member to the given func node, if we can determine it.""" + python_cls = member.__class__ + cls_name = getattr(python_cls, "__name__", None) + if not cls_name: + return + cls_bases = [ancestor.__name__ for ancestor in python_cls.__bases__] + ast_klass = build_class(cls_name, cls_bases, python_cls.__doc__) + func.instance_attrs["__class__"] = [ast_klass] + + +def attach_dummy_node(node, name: str, runtime_object=_EMPTY_OBJECT_MARKER) -> None: + """create a dummy node and register it in the locals of the given + node with the specified name + """ + enode = nodes.EmptyNode() + enode.object = runtime_object + _attach_local_node(node, enode, name) + + +def attach_const_node(node, name: str, value) -> None: + """create a Const node and register it in the locals of the given + node with the specified name + """ + if name not in node.special_attributes: + _attach_local_node(node, nodes.const_factory(value), name) + + +def attach_import_node(node, modname: str, membername: str) -> None: + """create a ImportFrom node and register it in the locals of the given + node with the specified name + """ + from_node = nodes.ImportFrom(modname, [(membername, None)]) + _attach_local_node(node, from_node, membername) + + +def build_module(name: str, doc: str | None = None) -> nodes.Module: + """create and initialize an astroid Module node""" + node = nodes.Module(name, pure_python=False, package=False) + node.postinit( + body=[], + doc_node=nodes.Const(value=doc) if doc else None, + ) + return node + + +def build_class( + name: str, basenames: Iterable[str] = (), doc: str | None = None +) -> nodes.ClassDef: + """Create and initialize an astroid ClassDef node.""" + node = nodes.ClassDef(name) + node.postinit( + bases=[nodes.Name(name=base, parent=node) for base in basenames], + body=[], + decorators=None, + doc_node=nodes.Const(value=doc) if doc else None, + ) + return node + + +def build_function( + name: str, + args: list[str] | None = None, + posonlyargs: list[str] | None = None, + defaults: list[Any] | None = None, + doc: str | None = None, + kwonlyargs: list[str] | None = None, + kwonlydefaults: list[Any] | None = None, +) -> nodes.FunctionDef: + """create and initialize an astroid FunctionDef node""" + # first argument is now a list of decorators + func = nodes.FunctionDef(name) + argsnode = nodes.Arguments(parent=func) + + # If args is None we don't have any information about the signature + # (in contrast to when there are no arguments and args == []). We pass + # this to the builder to indicate this. + if args is not None: + arguments = [nodes.AssignName(name=arg, parent=argsnode) for arg in args] + else: + arguments = None + + default_nodes: list[nodes.NodeNG] | None = [] + if defaults is not None: + for default in defaults: + default_node = nodes.const_factory(default) + default_node.parent = argsnode + default_nodes.append(default_node) + else: + default_nodes = None + + kwonlydefault_nodes: list[nodes.NodeNG | None] | None = [] + if kwonlydefaults is not None: + for kwonlydefault in kwonlydefaults: + kwonlydefault_node = nodes.const_factory(kwonlydefault) + kwonlydefault_node.parent = argsnode + kwonlydefault_nodes.append(kwonlydefault_node) + else: + kwonlydefault_nodes = None + + argsnode.postinit( + args=arguments, + defaults=default_nodes, + kwonlyargs=[ + nodes.AssignName(name=arg, parent=argsnode) for arg in kwonlyargs or () + ], + kw_defaults=kwonlydefault_nodes, + annotations=[], + posonlyargs=[ + nodes.AssignName(name=arg, parent=argsnode) for arg in posonlyargs or () + ], + ) + func.postinit( + args=argsnode, + body=[], + doc_node=nodes.Const(value=doc) if doc else None, + ) + if args: + register_arguments(func) + return func + + +def build_from_import(fromname: str, names: list[str]) -> nodes.ImportFrom: + """create and initialize an astroid ImportFrom import statement""" + return nodes.ImportFrom(fromname, [(name, None) for name in names]) + + +def register_arguments(func: nodes.FunctionDef, args: list | None = None) -> None: + """add given arguments to local + + args is a list that may contains nested lists + (i.e. def func(a, (b, c, d)): ...) + """ + # If no args are passed in, get the args from the function. + if args is None: + if func.args.vararg: + func.set_local(func.args.vararg, func.args) + if func.args.kwarg: + func.set_local(func.args.kwarg, func.args) + args = func.args.args + # If the function has no args, there is nothing left to do. + if args is None: + return + for arg in args: + if isinstance(arg, nodes.AssignName): + func.set_local(arg.name, arg) + else: + register_arguments(func, arg.elts) + + +def object_build_class( + node: nodes.Module | nodes.ClassDef, member: type, localname: str +) -> nodes.ClassDef: + """create astroid for a living class object""" + basenames = [base.__name__ for base in member.__bases__] + return _base_class_object_build(node, member, basenames, localname=localname) + + +def _get_args_info_from_callable( + member: _FunctionTypes, +) -> tuple[list[str], list[str], list[Any], list[str], list[Any]]: + """Returns args, posonlyargs, defaults, kwonlyargs. + + :note: currently ignores the return annotation. + """ + signature = inspect.signature(member) + args: list[str] = [] + defaults: list[Any] = [] + posonlyargs: list[str] = [] + kwonlyargs: list[str] = [] + kwonlydefaults: list[Any] = [] + + for param_name, param in signature.parameters.items(): + if param.kind == inspect.Parameter.POSITIONAL_ONLY: + posonlyargs.append(param_name) + elif param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD: + args.append(param_name) + elif param.kind == inspect.Parameter.VAR_POSITIONAL: + args.append(param_name) + elif param.kind == inspect.Parameter.VAR_KEYWORD: + args.append(param_name) + elif param.kind == inspect.Parameter.KEYWORD_ONLY: + kwonlyargs.append(param_name) + if param.default is not inspect.Parameter.empty: + kwonlydefaults.append(param.default) + continue + if param.default is not inspect.Parameter.empty: + defaults.append(param.default) + + return args, posonlyargs, defaults, kwonlyargs, kwonlydefaults + + +def object_build_function( + node: nodes.Module | nodes.ClassDef, member: _FunctionTypes, localname: str +) -> None: + """create astroid for a living function object""" + ( + args, + posonlyargs, + defaults, + kwonlyargs, + kwonly_defaults, + ) = _get_args_info_from_callable(member) + + func = build_function( + getattr(member, "__name__", None) or localname, + args, + posonlyargs, + defaults, + member.__doc__, + kwonlyargs=kwonlyargs, + kwonlydefaults=kwonly_defaults, + ) + + node.add_local_node(func, localname) + + +def object_build_datadescriptor( + node: nodes.Module | nodes.ClassDef, member: type, name: str +) -> nodes.ClassDef: + """create astroid for a living data descriptor object""" + return _base_class_object_build(node, member, [], name) + + +def object_build_methoddescriptor( + node: nodes.Module | nodes.ClassDef, + member: _FunctionTypes, + localname: str, +) -> None: + """create astroid for a living method descriptor object""" + # FIXME get arguments ? + func = build_function( + getattr(member, "__name__", None) or localname, doc=member.__doc__ + ) + node.add_local_node(func, localname) + _add_dunder_class(func, member) + + +def _base_class_object_build( + node: nodes.Module | nodes.ClassDef, + member: type, + basenames: list[str], + name: str | None = None, + localname: str | None = None, +) -> nodes.ClassDef: + """create astroid for a living class object, with a given set of base names + (e.g. ancestors) + """ + class_name = name or getattr(member, "__name__", None) or localname + assert isinstance(class_name, str) + klass = build_class( + class_name, + basenames, + member.__doc__, + ) + klass._newstyle = isinstance(member, type) + node.add_local_node(klass, localname) + try: + # limit the instantiation trick since it's too dangerous + # (such as infinite test execution...) + # this at least resolves common case such as Exception.args, + # OSError.errno + if issubclass(member, Exception): + instdict = member().__dict__ + else: + raise TypeError + except TypeError: + pass + else: + for item_name, obj in instdict.items(): + valnode = nodes.EmptyNode() + valnode.object = obj + valnode.parent = klass + valnode.lineno = 1 + klass.instance_attrs[item_name] = [valnode] + return klass + + +def _build_from_function( + node: nodes.Module | nodes.ClassDef, + name: str, + member: _FunctionTypes, + module: types.ModuleType, +) -> None: + # verify this is not an imported function + try: + code = member.__code__ # type: ignore[union-attr] + except AttributeError: + # Some implementations don't provide the code object, + # such as Jython. + code = None + filename = getattr(code, "co_filename", None) + if filename is None: + assert isinstance(member, object) + object_build_methoddescriptor(node, member, name) + elif filename != getattr(module, "__file__", None): + attach_dummy_node(node, name, member) + else: + object_build_function(node, member, name) + + +def _safe_has_attribute(obj, member: str) -> bool: + """Required because unexpected RunTimeError can be raised. + + See https://github.com/PyCQA/astroid/issues/1958 + """ + try: + return hasattr(obj, member) + except Exception: # pylint: disable=broad-except + return False + + +class InspectBuilder: + """class for building nodes from living object + + this is actually a really minimal representation, including only Module, + FunctionDef and ClassDef nodes and some others as guessed. + """ + + def __init__(self, manager_instance: AstroidManager | None = None) -> None: + self._manager = manager_instance or AstroidManager() + self._done: dict[types.ModuleType | type, nodes.Module | nodes.ClassDef] = {} + self._module: types.ModuleType + + def inspect_build( + self, + module: types.ModuleType, + modname: str | None = None, + path: str | None = None, + ) -> nodes.Module: + """build astroid from a living module (i.e. using inspect) + this is used when there is no python source code available (either + because it's a built-in module or because the .py is not available) + """ + self._module = module + if modname is None: + modname = module.__name__ + try: + node = build_module(modname, module.__doc__) + except AttributeError: + # in jython, java modules have no __doc__ (see #109562) + node = build_module(modname) + if path is None: + node.path = node.file = path + else: + node.path = [os.path.abspath(path)] + node.file = node.path[0] + node.name = modname + self._manager.cache_module(node) + node.package = hasattr(module, "__path__") + self._done = {} + self.object_build(node, module) + return node + + def object_build( + self, node: nodes.Module | nodes.ClassDef, obj: types.ModuleType | type + ) -> None: + """recursive method which create a partial ast from real objects + (only function, class, and method are handled) + """ + if obj in self._done: + return None + self._done[obj] = node + for name in dir(obj): + # inspect.ismethod() and inspect.isbuiltin() in PyPy return + # the opposite of what they do in CPython for __class_getitem__. + pypy__class_getitem__ = IS_PYPY and name == "__class_getitem__" + try: + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + member = getattr(obj, name) + except AttributeError: + # damned ExtensionClass.Base, I know you're there ! + attach_dummy_node(node, name) + continue + if inspect.ismethod(member) and not pypy__class_getitem__: + member = member.__func__ + if inspect.isfunction(member): + _build_from_function(node, name, member, self._module) + elif inspect.isbuiltin(member) or pypy__class_getitem__: + if self.imported_member(node, member, name): + continue + object_build_methoddescriptor(node, member, name) + elif inspect.isclass(member): + if self.imported_member(node, member, name): + continue + if member in self._done: + class_node = self._done[member] + assert isinstance(class_node, nodes.ClassDef) + if class_node not in node.locals.get(name, ()): + node.add_local_node(class_node, name) + else: + class_node = object_build_class(node, member, name) + # recursion + self.object_build(class_node, member) + if name == "__class__" and class_node.parent is None: + class_node.parent = self._done[self._module] + elif inspect.ismethoddescriptor(member): + object_build_methoddescriptor(node, member, name) + elif inspect.isdatadescriptor(member): + object_build_datadescriptor(node, member, name) + elif isinstance(member, _CONSTANTS): + attach_const_node(node, name, member) + elif inspect.isroutine(member): + # This should be called for Jython, where some builtin + # methods aren't caught by isbuiltin branch. + _build_from_function(node, name, member, self._module) + elif _safe_has_attribute(member, "__all__"): + module = build_module(name) + _attach_local_node(node, module, name) + # recursion + self.object_build(module, member) + else: + # create an empty node so that the name is actually defined + attach_dummy_node(node, name, member) + return None + + def imported_member(self, node, member, name: str) -> bool: + """verify this is not an imported class or handle it""" + # /!\ some classes like ExtensionClass doesn't have a __module__ + # attribute ! Also, this may trigger an exception on badly built module + # (see http://www.logilab.org/ticket/57299 for instance) + try: + modname = getattr(member, "__module__", None) + except TypeError: + modname = None + if modname is None: + if name in {"__new__", "__subclasshook__"}: + # Python 2.5.1 (r251:54863, Sep 1 2010, 22:03:14) + # >>> print object.__new__.__module__ + # None + modname = builtins.__name__ + else: + attach_dummy_node(node, name, member) + return True + + # On PyPy during bootstrapping we infer _io while _module is + # builtins. In CPython _io names itself io, see http://bugs.python.org/issue18602 + # Therefore, this basically checks whether we are not in PyPy. + if modname == "_io" and not self._module.__name__ == "builtins": + return False + + real_name = {"gtk": "gtk_gtk"}.get(modname, modname) + + if real_name != self._module.__name__: + # check if it sounds valid and then add an import node, else use a + # dummy node + try: + with redirect_stderr(io.StringIO()) as stderr, redirect_stdout( + io.StringIO() + ) as stdout: + getattr(sys.modules[modname], name) + stderr_value = stderr.getvalue() + if stderr_value: + logger.error( + "Captured stderr while getting %s from %s:\n%s", + name, + sys.modules[modname], + stderr_value, + ) + stdout_value = stdout.getvalue() + if stdout_value: + logger.info( + "Captured stdout while getting %s from %s:\n%s", + name, + sys.modules[modname], + stdout_value, + ) + except (KeyError, AttributeError): + attach_dummy_node(node, name, member) + else: + attach_import_node(node, modname, name) + return True + return False + + +# astroid bootstrapping ###################################################### + +_CONST_PROXY: dict[type, nodes.ClassDef] = {} + + +def _set_proxied(const) -> nodes.ClassDef: + # TODO : find a nicer way to handle this situation; + return _CONST_PROXY[const.value.__class__] + + +def _astroid_bootstrapping() -> None: + """astroid bootstrapping the builtins module""" + # this boot strapping is necessary since we need the Const nodes to + # inspect_build builtins, and then we can proxy Const + builder = InspectBuilder() + astroid_builtin = builder.inspect_build(builtins) + + for cls, node_cls in node_classes.CONST_CLS.items(): + if cls is TYPE_NONE: + proxy = build_class("NoneType") + proxy.parent = astroid_builtin + elif cls is TYPE_NOTIMPLEMENTED: + proxy = build_class("NotImplementedType") + proxy.parent = astroid_builtin + elif cls is TYPE_ELLIPSIS: + proxy = build_class("Ellipsis") + proxy.parent = astroid_builtin + else: + proxy = astroid_builtin.getattr(cls.__name__)[0] + assert isinstance(proxy, nodes.ClassDef) + if cls in (dict, list, set, tuple): + node_cls._proxied = proxy + else: + _CONST_PROXY[cls] = proxy + + # Set the builtin module as parent for some builtins. + nodes.Const._proxied = property(_set_proxied) + + _GeneratorType = nodes.ClassDef(types.GeneratorType.__name__) + _GeneratorType.parent = astroid_builtin + generator_doc_node = ( + nodes.Const(value=types.GeneratorType.__doc__) + if types.GeneratorType.__doc__ + else None + ) + _GeneratorType.postinit( + bases=[], + body=[], + decorators=None, + doc_node=generator_doc_node, + ) + bases.Generator._proxied = _GeneratorType + builder.object_build(bases.Generator._proxied, types.GeneratorType) + + if hasattr(types, "AsyncGeneratorType"): + _AsyncGeneratorType = nodes.ClassDef(types.AsyncGeneratorType.__name__) + _AsyncGeneratorType.parent = astroid_builtin + async_generator_doc_node = ( + nodes.Const(value=types.AsyncGeneratorType.__doc__) + if types.AsyncGeneratorType.__doc__ + else None + ) + _AsyncGeneratorType.postinit( + bases=[], + body=[], + decorators=None, + doc_node=async_generator_doc_node, + ) + bases.AsyncGenerator._proxied = _AsyncGeneratorType + builder.object_build(bases.AsyncGenerator._proxied, types.AsyncGeneratorType) + + if hasattr(types, "UnionType"): + _UnionTypeType = nodes.ClassDef(types.UnionType.__name__) + _UnionTypeType.parent = astroid_builtin + union_type_doc_node = ( + nodes.Const(value=types.UnionType.__doc__) + if types.UnionType.__doc__ + else None + ) + _UnionTypeType.postinit( + bases=[], + body=[], + decorators=None, + doc_node=union_type_doc_node, + ) + bases.UnionType._proxied = _UnionTypeType + builder.object_build(bases.UnionType._proxied, types.UnionType) + + builtin_types = ( + types.GetSetDescriptorType, + types.GeneratorType, + types.MemberDescriptorType, + TYPE_NONE, + TYPE_NOTIMPLEMENTED, + types.FunctionType, + types.MethodType, + types.BuiltinFunctionType, + types.ModuleType, + types.TracebackType, + ) + for _type in builtin_types: + if _type.__name__ not in astroid_builtin: + klass = nodes.ClassDef(_type.__name__) + klass.parent = astroid_builtin + klass.postinit( + bases=[], + body=[], + decorators=None, + doc_node=nodes.Const(value=_type.__doc__) if _type.__doc__ else None, + ) + builder.object_build(klass, _type) + astroid_builtin[_type.__name__] = klass + + +_astroid_bootstrapping() diff --git a/venv/lib/python3.10/site-packages/astroid/rebuilder.py b/venv/lib/python3.10/site-packages/astroid/rebuilder.py new file mode 100644 index 00000000..6e996def --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/rebuilder.py @@ -0,0 +1,2110 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""This module contains utilities for rebuilding an _ast tree in +order to get a single Astroid representation. +""" + +from __future__ import annotations + +import ast +import sys +import token +from collections.abc import Callable, Generator +from io import StringIO +from tokenize import TokenInfo, generate_tokens +from typing import TYPE_CHECKING, TypeVar, Union, cast, overload + +from astroid import nodes +from astroid._ast import ParserModule, get_parser_module, parse_function_type_comment +from astroid.const import IS_PYPY, PY38, PY38_PLUS, PY39_PLUS, Context +from astroid.manager import AstroidManager +from astroid.nodes import NodeNG +from astroid.nodes.utils import Position +from astroid.typing import SuccessfulInferenceResult + +if sys.version_info >= (3, 8): + from typing import Final +else: + from typing_extensions import Final + + +REDIRECT: Final[dict[str, str]] = { + "arguments": "Arguments", + "comprehension": "Comprehension", + "ListCompFor": "Comprehension", + "GenExprFor": "Comprehension", + "excepthandler": "ExceptHandler", + "keyword": "Keyword", + "match_case": "MatchCase", +} + + +T_Doc = TypeVar( + "T_Doc", + "ast.Module", + "ast.ClassDef", + Union["ast.FunctionDef", "ast.AsyncFunctionDef"], +) +_FunctionT = TypeVar("_FunctionT", nodes.FunctionDef, nodes.AsyncFunctionDef) +_ForT = TypeVar("_ForT", nodes.For, nodes.AsyncFor) +_WithT = TypeVar("_WithT", nodes.With, nodes.AsyncWith) +NodesWithDocsType = Union[nodes.Module, nodes.ClassDef, nodes.FunctionDef] + + +# noinspection PyMethodMayBeStatic +class TreeRebuilder: + """Rebuilds the _ast tree to become an Astroid tree.""" + + def __init__( + self, + manager: AstroidManager, + parser_module: ParserModule | None = None, + data: str | None = None, + ) -> None: + self._manager = manager + self._data = data.split("\n") if data else None + self._global_names: list[dict[str, list[nodes.Global]]] = [] + self._import_from_nodes: list[nodes.ImportFrom] = [] + self._delayed_assattr: list[nodes.AssignAttr] = [] + self._visit_meths: dict[type[ast.AST], Callable[[ast.AST, NodeNG], NodeNG]] = {} + + if parser_module is None: + self._parser_module = get_parser_module() + else: + self._parser_module = parser_module + self._module = self._parser_module.module + + def _get_doc(self, node: T_Doc) -> tuple[T_Doc, ast.Constant | ast.Str | None]: + """Return the doc ast node.""" + try: + if node.body and isinstance(node.body[0], self._module.Expr): + first_value = node.body[0].value + if isinstance(first_value, self._module.Str) or ( + PY38_PLUS + and isinstance(first_value, self._module.Constant) + and isinstance(first_value.value, str) + ): + doc_ast_node = first_value + node.body = node.body[1:] + # The ast parser of python < 3.8 sets col_offset of multi-line strings to -1 + # as it is unable to determine the value correctly. We reset this to None. + if doc_ast_node.col_offset == -1: + doc_ast_node.col_offset = None + return node, doc_ast_node + except IndexError: + pass # ast built from scratch + return node, None + + def _get_context( + self, + node: ( + ast.Attribute + | ast.List + | ast.Name + | ast.Subscript + | ast.Starred + | ast.Tuple + ), + ) -> Context: + return self._parser_module.context_classes.get(type(node.ctx), Context.Load) + + def _get_position_info( + self, + node: ast.ClassDef | ast.FunctionDef | ast.AsyncFunctionDef, + parent: nodes.ClassDef | nodes.FunctionDef | nodes.AsyncFunctionDef, + ) -> Position | None: + """Return position information for ClassDef and FunctionDef nodes. + + In contrast to AST positions, these only include the actual keyword(s) + and the class / function name. + + >>> @decorator + >>> async def some_func(var: int) -> None: + >>> ^^^^^^^^^^^^^^^^^^^ + """ + if not self._data: + return None + end_lineno: int | None = getattr(node, "end_lineno", None) + if node.body: + end_lineno = node.body[0].lineno + # pylint: disable-next=unsubscriptable-object + data = "\n".join(self._data[node.lineno - 1 : end_lineno]) + + start_token: TokenInfo | None = None + keyword_tokens: tuple[int, ...] = (token.NAME,) + if isinstance(parent, nodes.AsyncFunctionDef): + search_token = "async" + elif isinstance(parent, nodes.FunctionDef): + search_token = "def" + else: + search_token = "class" + + for t in generate_tokens(StringIO(data).readline): + if ( + start_token is not None + and t.type == token.NAME + and t.string == node.name + ): + break + if t.type in keyword_tokens: + if t.string == search_token: + start_token = t + continue + if t.string in {"def"}: + continue + start_token = None + else: + return None + + return Position( + lineno=node.lineno + start_token.start[0] - 1, + col_offset=start_token.start[1], + end_lineno=node.lineno + t.end[0] - 1, + end_col_offset=t.end[1], + ) + + def _fix_doc_node_position(self, node: NodesWithDocsType) -> None: + """Fix start and end position of doc nodes for Python < 3.8.""" + if not self._data or not node.doc_node or node.lineno is None: + return + if PY38_PLUS: + return + + lineno = node.lineno or 1 # lineno of modules is 0 + end_range: int | None = node.doc_node.lineno + if IS_PYPY and not PY39_PLUS: + end_range = None + # pylint: disable-next=unsubscriptable-object + data = "\n".join(self._data[lineno - 1 : end_range]) + + found_start, found_end = False, False + open_brackets = 0 + skip_token: set[int] = {token.NEWLINE, token.INDENT, token.NL, token.COMMENT} + + if isinstance(node, nodes.Module): + found_end = True + + for t in generate_tokens(StringIO(data).readline): + if found_end is False: + if ( + found_start is False + and t.type == token.NAME + and t.string in {"def", "class"} + ): + found_start = True + elif found_start is True and t.type == token.OP: + if t.exact_type == token.COLON and open_brackets == 0: + found_end = True + elif t.exact_type == token.LPAR: + open_brackets += 1 + elif t.exact_type == token.RPAR: + open_brackets -= 1 + continue + if t.type in skip_token: + continue + if t.type == token.STRING: + break + return + else: + return + + node.doc_node.lineno = lineno + t.start[0] - 1 + node.doc_node.col_offset = t.start[1] + node.doc_node.end_lineno = lineno + t.end[0] - 1 + node.doc_node.end_col_offset = t.end[1] + + def _reset_end_lineno(self, newnode: nodes.NodeNG) -> None: + """Reset end_lineno and end_col_offset attributes for PyPy 3.8. + + For some nodes, these are either set to -1 or only partially assigned. + To keep consistency across astroid and pylint, reset all. + + This has been fixed in PyPy 3.9. + For reference, an (incomplete) list of nodes with issues: + - ClassDef - For + - FunctionDef - While + - Call - If + - Decorators - TryExcept + - With - TryFinally + - Assign + """ + newnode.end_lineno = None + newnode.end_col_offset = None + for child_node in newnode.get_children(): + self._reset_end_lineno(child_node) + + def visit_module( + self, node: ast.Module, modname: str, modpath: str, package: bool + ) -> nodes.Module: + """Visit a Module node by returning a fresh instance of it. + + Note: Method not called by 'visit' + """ + node, doc_ast_node = self._get_doc(node) + newnode = nodes.Module( + name=modname, + file=modpath, + path=[modpath], + package=package, + parent=None, + ) + newnode.postinit( + [self.visit(child, newnode) for child in node.body], + doc_node=self.visit(doc_ast_node, newnode), + ) + self._fix_doc_node_position(newnode) + if IS_PYPY and PY38: + self._reset_end_lineno(newnode) + return newnode + + if TYPE_CHECKING: # noqa: C901 + + @overload + def visit(self, node: ast.arg, parent: NodeNG) -> nodes.AssignName: + ... + + @overload + def visit(self, node: ast.arguments, parent: NodeNG) -> nodes.Arguments: + ... + + @overload + def visit(self, node: ast.Assert, parent: NodeNG) -> nodes.Assert: + ... + + @overload + def visit( + self, node: ast.AsyncFunctionDef, parent: NodeNG + ) -> nodes.AsyncFunctionDef: + ... + + @overload + def visit(self, node: ast.AsyncFor, parent: NodeNG) -> nodes.AsyncFor: + ... + + @overload + def visit(self, node: ast.Await, parent: NodeNG) -> nodes.Await: + ... + + @overload + def visit(self, node: ast.AsyncWith, parent: NodeNG) -> nodes.AsyncWith: + ... + + @overload + def visit(self, node: ast.Assign, parent: NodeNG) -> nodes.Assign: + ... + + @overload + def visit(self, node: ast.AnnAssign, parent: NodeNG) -> nodes.AnnAssign: + ... + + @overload + def visit(self, node: ast.AugAssign, parent: NodeNG) -> nodes.AugAssign: + ... + + @overload + def visit(self, node: ast.BinOp, parent: NodeNG) -> nodes.BinOp: + ... + + @overload + def visit(self, node: ast.BoolOp, parent: NodeNG) -> nodes.BoolOp: + ... + + @overload + def visit(self, node: ast.Break, parent: NodeNG) -> nodes.Break: + ... + + @overload + def visit(self, node: ast.Call, parent: NodeNG) -> nodes.Call: + ... + + @overload + def visit(self, node: ast.ClassDef, parent: NodeNG) -> nodes.ClassDef: + ... + + @overload + def visit(self, node: ast.Continue, parent: NodeNG) -> nodes.Continue: + ... + + @overload + def visit(self, node: ast.Compare, parent: NodeNG) -> nodes.Compare: + ... + + @overload + def visit(self, node: ast.comprehension, parent: NodeNG) -> nodes.Comprehension: + ... + + @overload + def visit(self, node: ast.Delete, parent: NodeNG) -> nodes.Delete: + ... + + @overload + def visit(self, node: ast.Dict, parent: NodeNG) -> nodes.Dict: + ... + + @overload + def visit(self, node: ast.DictComp, parent: NodeNG) -> nodes.DictComp: + ... + + @overload + def visit(self, node: ast.Expr, parent: NodeNG) -> nodes.Expr: + ... + + @overload + def visit(self, node: ast.ExceptHandler, parent: NodeNG) -> nodes.ExceptHandler: + ... + + @overload + def visit(self, node: ast.For, parent: NodeNG) -> nodes.For: + ... + + @overload + def visit(self, node: ast.ImportFrom, parent: NodeNG) -> nodes.ImportFrom: + ... + + @overload + def visit(self, node: ast.FunctionDef, parent: NodeNG) -> nodes.FunctionDef: + ... + + @overload + def visit(self, node: ast.GeneratorExp, parent: NodeNG) -> nodes.GeneratorExp: + ... + + @overload + def visit(self, node: ast.Attribute, parent: NodeNG) -> nodes.Attribute: + ... + + @overload + def visit(self, node: ast.Global, parent: NodeNG) -> nodes.Global: + ... + + @overload + def visit(self, node: ast.If, parent: NodeNG) -> nodes.If: + ... + + @overload + def visit(self, node: ast.IfExp, parent: NodeNG) -> nodes.IfExp: + ... + + @overload + def visit(self, node: ast.Import, parent: NodeNG) -> nodes.Import: + ... + + @overload + def visit(self, node: ast.JoinedStr, parent: NodeNG) -> nodes.JoinedStr: + ... + + @overload + def visit( + self, node: ast.FormattedValue, parent: NodeNG + ) -> nodes.FormattedValue: + ... + + if sys.version_info >= (3, 8): + + @overload + def visit(self, node: ast.NamedExpr, parent: NodeNG) -> nodes.NamedExpr: + ... + + if sys.version_info < (3, 9): + # Not used in Python 3.9+ + @overload + def visit(self, node: ast.ExtSlice, parent: nodes.Subscript) -> nodes.Tuple: + ... + + @overload + def visit(self, node: ast.Index, parent: nodes.Subscript) -> NodeNG: + ... + + @overload + def visit(self, node: ast.keyword, parent: NodeNG) -> nodes.Keyword: + ... + + @overload + def visit(self, node: ast.Lambda, parent: NodeNG) -> nodes.Lambda: + ... + + @overload + def visit(self, node: ast.List, parent: NodeNG) -> nodes.List: + ... + + @overload + def visit(self, node: ast.ListComp, parent: NodeNG) -> nodes.ListComp: + ... + + @overload + def visit( + self, node: ast.Name, parent: NodeNG + ) -> nodes.Name | nodes.Const | nodes.AssignName | nodes.DelName: + ... + + @overload + def visit(self, node: ast.Nonlocal, parent: NodeNG) -> nodes.Nonlocal: + ... + + if sys.version_info < (3, 8): + # Not used in Python 3.8+ + @overload + def visit(self, node: ast.Ellipsis, parent: NodeNG) -> nodes.Const: + ... + + @overload + def visit(self, node: ast.NameConstant, parent: NodeNG) -> nodes.Const: + ... + + @overload + def visit(self, node: ast.Str, parent: NodeNG) -> nodes.Const: + ... + + @overload + def visit(self, node: ast.Bytes, parent: NodeNG) -> nodes.Const: + ... + + @overload + def visit(self, node: ast.Num, parent: NodeNG) -> nodes.Const: + ... + + @overload + def visit(self, node: ast.Constant, parent: NodeNG) -> nodes.Const: + ... + + @overload + def visit(self, node: ast.Pass, parent: NodeNG) -> nodes.Pass: + ... + + @overload + def visit(self, node: ast.Raise, parent: NodeNG) -> nodes.Raise: + ... + + @overload + def visit(self, node: ast.Return, parent: NodeNG) -> nodes.Return: + ... + + @overload + def visit(self, node: ast.Set, parent: NodeNG) -> nodes.Set: + ... + + @overload + def visit(self, node: ast.SetComp, parent: NodeNG) -> nodes.SetComp: + ... + + @overload + def visit(self, node: ast.Slice, parent: nodes.Subscript) -> nodes.Slice: + ... + + @overload + def visit(self, node: ast.Subscript, parent: NodeNG) -> nodes.Subscript: + ... + + @overload + def visit(self, node: ast.Starred, parent: NodeNG) -> nodes.Starred: + ... + + @overload + def visit( + self, node: ast.Try, parent: NodeNG + ) -> nodes.TryExcept | nodes.TryFinally: + ... + + @overload + def visit(self, node: ast.Tuple, parent: NodeNG) -> nodes.Tuple: + ... + + @overload + def visit(self, node: ast.UnaryOp, parent: NodeNG) -> nodes.UnaryOp: + ... + + @overload + def visit(self, node: ast.While, parent: NodeNG) -> nodes.While: + ... + + @overload + def visit(self, node: ast.With, parent: NodeNG) -> nodes.With: + ... + + @overload + def visit(self, node: ast.Yield, parent: NodeNG) -> nodes.Yield: + ... + + @overload + def visit(self, node: ast.YieldFrom, parent: NodeNG) -> nodes.YieldFrom: + ... + + if sys.version_info >= (3, 10): + + @overload + def visit(self, node: ast.Match, parent: NodeNG) -> nodes.Match: + ... + + @overload + def visit(self, node: ast.match_case, parent: NodeNG) -> nodes.MatchCase: + ... + + @overload + def visit(self, node: ast.MatchValue, parent: NodeNG) -> nodes.MatchValue: + ... + + @overload + def visit( + self, node: ast.MatchSingleton, parent: NodeNG + ) -> nodes.MatchSingleton: + ... + + @overload + def visit( + self, node: ast.MatchSequence, parent: NodeNG + ) -> nodes.MatchSequence: + ... + + @overload + def visit( + self, node: ast.MatchMapping, parent: NodeNG + ) -> nodes.MatchMapping: + ... + + @overload + def visit(self, node: ast.MatchClass, parent: NodeNG) -> nodes.MatchClass: + ... + + @overload + def visit(self, node: ast.MatchStar, parent: NodeNG) -> nodes.MatchStar: + ... + + @overload + def visit(self, node: ast.MatchAs, parent: NodeNG) -> nodes.MatchAs: + ... + + @overload + def visit(self, node: ast.MatchOr, parent: NodeNG) -> nodes.MatchOr: + ... + + @overload + def visit(self, node: ast.pattern, parent: NodeNG) -> nodes.Pattern: + ... + + @overload + def visit(self, node: ast.AST, parent: NodeNG) -> NodeNG: + ... + + @overload + def visit(self, node: None, parent: NodeNG) -> None: + ... + + def visit(self, node: ast.AST | None, parent: NodeNG) -> NodeNG | None: + if node is None: + return None + cls = node.__class__ + if cls in self._visit_meths: + visit_method = self._visit_meths[cls] + else: + cls_name = cls.__name__ + visit_name = "visit_" + REDIRECT.get(cls_name, cls_name).lower() + visit_method = getattr(self, visit_name) + self._visit_meths[cls] = visit_method + return visit_method(node, parent) + + def _save_assignment(self, node: nodes.AssignName | nodes.DelName) -> None: + """Save assignment situation since node.parent is not available yet.""" + if self._global_names and node.name in self._global_names[-1]: + node.root().set_local(node.name, node) + else: + assert node.parent + assert node.name + node.parent.set_local(node.name, node) + + def visit_arg(self, node: ast.arg, parent: NodeNG) -> nodes.AssignName: + """Visit an arg node by returning a fresh AssName instance.""" + return self.visit_assignname(node, parent, node.arg) + + def visit_arguments(self, node: ast.arguments, parent: NodeNG) -> nodes.Arguments: + """Visit an Arguments node by returning a fresh instance of it.""" + vararg: str | None = None + kwarg: str | None = None + newnode = nodes.Arguments( + node.vararg.arg if node.vararg else None, + node.kwarg.arg if node.kwarg else None, + parent, + ) + args = [self.visit(child, newnode) for child in node.args] + defaults = [self.visit(child, newnode) for child in node.defaults] + varargannotation: NodeNG | None = None + kwargannotation: NodeNG | None = None + posonlyargs: list[nodes.AssignName] = [] + if node.vararg: + vararg = node.vararg.arg + varargannotation = self.visit(node.vararg.annotation, newnode) + if node.kwarg: + kwarg = node.kwarg.arg + kwargannotation = self.visit(node.kwarg.annotation, newnode) + + if PY38: + # In Python 3.8 'end_lineno' and 'end_col_offset' + # for 'kwonlyargs' don't include the annotation. + for arg in node.kwonlyargs: + if arg.annotation is not None: + arg.end_lineno = arg.annotation.end_lineno + arg.end_col_offset = arg.annotation.end_col_offset + + kwonlyargs = [self.visit(child, newnode) for child in node.kwonlyargs] + kw_defaults = [self.visit(child, newnode) for child in node.kw_defaults] + annotations = [self.visit(arg.annotation, newnode) for arg in node.args] + kwonlyargs_annotations = [ + self.visit(arg.annotation, newnode) for arg in node.kwonlyargs + ] + + posonlyargs_annotations: list[NodeNG | None] = [] + if PY38_PLUS: + posonlyargs = [self.visit(child, newnode) for child in node.posonlyargs] + posonlyargs_annotations = [ + self.visit(arg.annotation, newnode) for arg in node.posonlyargs + ] + type_comment_args = [ + self.check_type_comment(child, parent=newnode) for child in node.args + ] + type_comment_kwonlyargs = [ + self.check_type_comment(child, parent=newnode) for child in node.kwonlyargs + ] + type_comment_posonlyargs: list[NodeNG | None] = [] + if PY38_PLUS: + type_comment_posonlyargs = [ + self.check_type_comment(child, parent=newnode) + for child in node.posonlyargs + ] + + newnode.postinit( + args=args, + defaults=defaults, + kwonlyargs=kwonlyargs, + posonlyargs=posonlyargs, + kw_defaults=kw_defaults, + annotations=annotations, + kwonlyargs_annotations=kwonlyargs_annotations, + posonlyargs_annotations=posonlyargs_annotations, + varargannotation=varargannotation, + kwargannotation=kwargannotation, + type_comment_args=type_comment_args, + type_comment_kwonlyargs=type_comment_kwonlyargs, + type_comment_posonlyargs=type_comment_posonlyargs, + ) + # save argument names in locals: + assert newnode.parent + if vararg: + newnode.parent.set_local(vararg, newnode) + if kwarg: + newnode.parent.set_local(kwarg, newnode) + return newnode + + def visit_assert(self, node: ast.Assert, parent: NodeNG) -> nodes.Assert: + """Visit a Assert node by returning a fresh instance of it.""" + newnode = nodes.Assert( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + msg: NodeNG | None = None + if node.msg: + msg = self.visit(node.msg, newnode) + newnode.postinit(self.visit(node.test, newnode), msg) + return newnode + + def check_type_comment( + self, + node: ( + ast.Assign | ast.arg | ast.For | ast.AsyncFor | ast.With | ast.AsyncWith + ), + parent: ( + nodes.Assign + | nodes.Arguments + | nodes.For + | nodes.AsyncFor + | nodes.With + | nodes.AsyncWith + ), + ) -> NodeNG | None: + type_comment = getattr(node, "type_comment", None) # Added in Python 3.8 + if not type_comment: + return None + + try: + type_comment_ast = self._parser_module.parse(type_comment) + except SyntaxError: + # Invalid type comment, just skip it. + return None + + # For '# type: # any comment' ast.parse returns a Module node, + # without any nodes in the body. + if not type_comment_ast.body: + return None + + type_object = self.visit(type_comment_ast.body[0], parent=parent) + if not isinstance(type_object, nodes.Expr): + return None + + return type_object.value + + def check_function_type_comment( + self, node: ast.FunctionDef | ast.AsyncFunctionDef, parent: NodeNG + ) -> tuple[NodeNG | None, list[NodeNG]] | None: + type_comment = getattr(node, "type_comment", None) # Added in Python 3.8 + if not type_comment: + return None + + try: + type_comment_ast = parse_function_type_comment(type_comment) + except SyntaxError: + # Invalid type comment, just skip it. + return None + + if not type_comment_ast: + return None + + returns: NodeNG | None = None + argtypes: list[NodeNG] = [ + self.visit(elem, parent) for elem in (type_comment_ast.argtypes or []) + ] + if type_comment_ast.returns: + returns = self.visit(type_comment_ast.returns, parent) + + return returns, argtypes + + def visit_asyncfunctiondef( + self, node: ast.AsyncFunctionDef, parent: NodeNG + ) -> nodes.AsyncFunctionDef: + return self._visit_functiondef(nodes.AsyncFunctionDef, node, parent) + + def visit_asyncfor(self, node: ast.AsyncFor, parent: NodeNG) -> nodes.AsyncFor: + return self._visit_for(nodes.AsyncFor, node, parent) + + def visit_await(self, node: ast.Await, parent: NodeNG) -> nodes.Await: + newnode = nodes.Await( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit(value=self.visit(node.value, newnode)) + return newnode + + def visit_asyncwith(self, node: ast.AsyncWith, parent: NodeNG) -> nodes.AsyncWith: + return self._visit_with(nodes.AsyncWith, node, parent) + + def visit_assign(self, node: ast.Assign, parent: NodeNG) -> nodes.Assign: + """Visit a Assign node by returning a fresh instance of it.""" + newnode = nodes.Assign( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + type_annotation = self.check_type_comment(node, parent=newnode) + newnode.postinit( + targets=[self.visit(child, newnode) for child in node.targets], + value=self.visit(node.value, newnode), + type_annotation=type_annotation, + ) + return newnode + + def visit_annassign(self, node: ast.AnnAssign, parent: NodeNG) -> nodes.AnnAssign: + """Visit an AnnAssign node by returning a fresh instance of it.""" + newnode = nodes.AnnAssign( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + target=self.visit(node.target, newnode), + annotation=self.visit(node.annotation, newnode), + simple=node.simple, + value=self.visit(node.value, newnode), + ) + return newnode + + @overload + def visit_assignname( + self, node: ast.AST, parent: NodeNG, node_name: str + ) -> nodes.AssignName: + ... + + @overload + def visit_assignname(self, node: ast.AST, parent: NodeNG, node_name: None) -> None: + ... + + def visit_assignname( + self, node: ast.AST, parent: NodeNG, node_name: str | None + ) -> nodes.AssignName | None: + """Visit a node and return a AssignName node. + + Note: Method not called by 'visit' + """ + if node_name is None: + return None + newnode = nodes.AssignName( + name=node_name, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + self._save_assignment(newnode) + return newnode + + def visit_augassign(self, node: ast.AugAssign, parent: NodeNG) -> nodes.AugAssign: + """Visit a AugAssign node by returning a fresh instance of it.""" + newnode = nodes.AugAssign( + op=self._parser_module.bin_op_classes[type(node.op)] + "=", + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + self.visit(node.target, newnode), self.visit(node.value, newnode) + ) + return newnode + + def visit_binop(self, node: ast.BinOp, parent: NodeNG) -> nodes.BinOp: + """Visit a BinOp node by returning a fresh instance of it.""" + newnode = nodes.BinOp( + op=self._parser_module.bin_op_classes[type(node.op)], + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + self.visit(node.left, newnode), self.visit(node.right, newnode) + ) + return newnode + + def visit_boolop(self, node: ast.BoolOp, parent: NodeNG) -> nodes.BoolOp: + """Visit a BoolOp node by returning a fresh instance of it.""" + newnode = nodes.BoolOp( + op=self._parser_module.bool_op_classes[type(node.op)], + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit([self.visit(child, newnode) for child in node.values]) + return newnode + + def visit_break(self, node: ast.Break, parent: NodeNG) -> nodes.Break: + """Visit a Break node by returning a fresh instance of it.""" + return nodes.Break( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + + def visit_call(self, node: ast.Call, parent: NodeNG) -> nodes.Call: + """Visit a CallFunc node by returning a fresh instance of it.""" + newnode = nodes.Call( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + func=self.visit(node.func, newnode), + args=[self.visit(child, newnode) for child in node.args], + keywords=[self.visit(child, newnode) for child in node.keywords], + ) + return newnode + + def visit_classdef( + self, node: ast.ClassDef, parent: NodeNG, newstyle: bool = True + ) -> nodes.ClassDef: + """Visit a ClassDef node to become astroid.""" + node, doc_ast_node = self._get_doc(node) + newnode = nodes.ClassDef( + name=node.name, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + metaclass = None + for keyword in node.keywords: + if keyword.arg == "metaclass": + metaclass = self.visit(keyword, newnode).value + break + decorators = self.visit_decorators(node, newnode) + newnode.postinit( + [self.visit(child, newnode) for child in node.bases], + [self.visit(child, newnode) for child in node.body], + decorators, + newstyle, + metaclass, + [ + self.visit(kwd, newnode) + for kwd in node.keywords + if kwd.arg != "metaclass" + ], + position=self._get_position_info(node, newnode), + doc_node=self.visit(doc_ast_node, newnode), + ) + self._fix_doc_node_position(newnode) + return newnode + + def visit_continue(self, node: ast.Continue, parent: NodeNG) -> nodes.Continue: + """Visit a Continue node by returning a fresh instance of it.""" + return nodes.Continue( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + + def visit_compare(self, node: ast.Compare, parent: NodeNG) -> nodes.Compare: + """Visit a Compare node by returning a fresh instance of it.""" + newnode = nodes.Compare( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + self.visit(node.left, newnode), + [ + ( + self._parser_module.cmp_op_classes[op.__class__], + self.visit(expr, newnode), + ) + for (op, expr) in zip(node.ops, node.comparators) + ], + ) + return newnode + + def visit_comprehension( + self, node: ast.comprehension, parent: NodeNG + ) -> nodes.Comprehension: + """Visit a Comprehension node by returning a fresh instance of it.""" + newnode = nodes.Comprehension(parent) + newnode.postinit( + self.visit(node.target, newnode), + self.visit(node.iter, newnode), + [self.visit(child, newnode) for child in node.ifs], + bool(node.is_async), + ) + return newnode + + def visit_decorators( + self, + node: ast.ClassDef | ast.FunctionDef | ast.AsyncFunctionDef, + parent: NodeNG, + ) -> nodes.Decorators | None: + """Visit a Decorators node by returning a fresh instance of it. + + Note: Method not called by 'visit' + """ + if not node.decorator_list: + return None + # /!\ node is actually an _ast.FunctionDef node while + # parent is an astroid.nodes.FunctionDef node + if sys.version_info >= (3, 8): + # Set the line number of the first decorator for Python 3.8+. + lineno = node.decorator_list[0].lineno + end_lineno = node.decorator_list[-1].end_lineno + end_col_offset = node.decorator_list[-1].end_col_offset + else: + lineno = node.lineno + end_lineno = None + end_col_offset = None + newnode = nodes.Decorators( + lineno=lineno, + col_offset=node.col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + newnode.postinit([self.visit(child, newnode) for child in node.decorator_list]) + return newnode + + def visit_delete(self, node: ast.Delete, parent: NodeNG) -> nodes.Delete: + """Visit a Delete node by returning a fresh instance of it.""" + newnode = nodes.Delete( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit([self.visit(child, newnode) for child in node.targets]) + return newnode + + def _visit_dict_items( + self, node: ast.Dict, parent: NodeNG, newnode: nodes.Dict + ) -> Generator[tuple[NodeNG, NodeNG], None, None]: + for key, value in zip(node.keys, node.values): + rebuilt_key: NodeNG + rebuilt_value = self.visit(value, newnode) + if not key: + # Extended unpacking + rebuilt_key = nodes.DictUnpack( + lineno=rebuilt_value.lineno, + col_offset=rebuilt_value.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(rebuilt_value, "end_lineno", None), + end_col_offset=getattr(rebuilt_value, "end_col_offset", None), + parent=parent, + ) + else: + rebuilt_key = self.visit(key, newnode) + yield rebuilt_key, rebuilt_value + + def visit_dict(self, node: ast.Dict, parent: NodeNG) -> nodes.Dict: + """Visit a Dict node by returning a fresh instance of it.""" + newnode = nodes.Dict( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + items: list[tuple[SuccessfulInferenceResult, SuccessfulInferenceResult]] = list( + self._visit_dict_items(node, parent, newnode) + ) + newnode.postinit(items) + return newnode + + def visit_dictcomp(self, node: ast.DictComp, parent: NodeNG) -> nodes.DictComp: + """Visit a DictComp node by returning a fresh instance of it.""" + newnode = nodes.DictComp( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + self.visit(node.key, newnode), + self.visit(node.value, newnode), + [self.visit(child, newnode) for child in node.generators], + ) + return newnode + + def visit_expr(self, node: ast.Expr, parent: NodeNG) -> nodes.Expr: + """Visit a Expr node by returning a fresh instance of it.""" + newnode = nodes.Expr( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + def visit_excepthandler( + self, node: ast.ExceptHandler, parent: NodeNG + ) -> nodes.ExceptHandler: + """Visit an ExceptHandler node by returning a fresh instance of it.""" + newnode = nodes.ExceptHandler( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + self.visit(node.type, newnode), + self.visit_assignname(node, newnode, node.name), + [self.visit(child, newnode) for child in node.body], + ) + return newnode + + @overload + def _visit_for( + self, cls: type[nodes.For], node: ast.For, parent: NodeNG + ) -> nodes.For: + ... + + @overload + def _visit_for( + self, cls: type[nodes.AsyncFor], node: ast.AsyncFor, parent: NodeNG + ) -> nodes.AsyncFor: + ... + + def _visit_for( + self, cls: type[_ForT], node: ast.For | ast.AsyncFor, parent: NodeNG + ) -> _ForT: + """Visit a For node by returning a fresh instance of it.""" + col_offset = node.col_offset + if IS_PYPY and not PY39_PLUS and isinstance(node, ast.AsyncFor) and self._data: + # pylint: disable-next=unsubscriptable-object + col_offset = self._data[node.lineno - 1].index("async") + + newnode = cls( + lineno=node.lineno, + col_offset=col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + type_annotation = self.check_type_comment(node, parent=newnode) + newnode.postinit( + target=self.visit(node.target, newnode), + iter=self.visit(node.iter, newnode), + body=[self.visit(child, newnode) for child in node.body], + orelse=[self.visit(child, newnode) for child in node.orelse], + type_annotation=type_annotation, + ) + return newnode + + def visit_for(self, node: ast.For, parent: NodeNG) -> nodes.For: + return self._visit_for(nodes.For, node, parent) + + def visit_importfrom( + self, node: ast.ImportFrom, parent: NodeNG + ) -> nodes.ImportFrom: + """Visit an ImportFrom node by returning a fresh instance of it.""" + names = [(alias.name, alias.asname) for alias in node.names] + newnode = nodes.ImportFrom( + fromname=node.module or "", + names=names, + level=node.level or None, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + # store From names to add them to locals after building + self._import_from_nodes.append(newnode) + return newnode + + @overload + def _visit_functiondef( + self, cls: type[nodes.FunctionDef], node: ast.FunctionDef, parent: NodeNG + ) -> nodes.FunctionDef: + ... + + @overload + def _visit_functiondef( + self, + cls: type[nodes.AsyncFunctionDef], + node: ast.AsyncFunctionDef, + parent: NodeNG, + ) -> nodes.AsyncFunctionDef: + ... + + def _visit_functiondef( + self, + cls: type[_FunctionT], + node: ast.FunctionDef | ast.AsyncFunctionDef, + parent: NodeNG, + ) -> _FunctionT: + """Visit an FunctionDef node to become astroid.""" + self._global_names.append({}) + node, doc_ast_node = self._get_doc(node) + + lineno = node.lineno + if PY38_PLUS and node.decorator_list: + # Python 3.8 sets the line number of a decorated function + # to be the actual line number of the function, but the + # previous versions expected the decorator's line number instead. + # We reset the function's line number to that of the + # first decorator to maintain backward compatibility. + # It's not ideal but this discrepancy was baked into + # the framework for *years*. + lineno = node.decorator_list[0].lineno + + newnode = cls( + name=node.name, + lineno=lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + decorators = self.visit_decorators(node, newnode) + returns: NodeNG | None + if node.returns: + returns = self.visit(node.returns, newnode) + else: + returns = None + + type_comment_args = type_comment_returns = None + type_comment_annotation = self.check_function_type_comment(node, newnode) + if type_comment_annotation: + type_comment_returns, type_comment_args = type_comment_annotation + newnode.postinit( + args=self.visit(node.args, newnode), + body=[self.visit(child, newnode) for child in node.body], + decorators=decorators, + returns=returns, + type_comment_returns=type_comment_returns, + type_comment_args=type_comment_args, + position=self._get_position_info(node, newnode), + doc_node=self.visit(doc_ast_node, newnode), + ) + self._fix_doc_node_position(newnode) + self._global_names.pop() + return newnode + + def visit_functiondef( + self, node: ast.FunctionDef, parent: NodeNG + ) -> nodes.FunctionDef: + return self._visit_functiondef(nodes.FunctionDef, node, parent) + + def visit_generatorexp( + self, node: ast.GeneratorExp, parent: NodeNG + ) -> nodes.GeneratorExp: + """Visit a GeneratorExp node by returning a fresh instance of it.""" + newnode = nodes.GeneratorExp( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + self.visit(node.elt, newnode), + [self.visit(child, newnode) for child in node.generators], + ) + return newnode + + def visit_attribute( + self, node: ast.Attribute, parent: NodeNG + ) -> nodes.Attribute | nodes.AssignAttr | nodes.DelAttr: + """Visit an Attribute node by returning a fresh instance of it.""" + context = self._get_context(node) + newnode: nodes.Attribute | nodes.AssignAttr | nodes.DelAttr + if context == Context.Del: + # FIXME : maybe we should reintroduce and visit_delattr ? + # for instance, deactivating assign_ctx + newnode = nodes.DelAttr( + attrname=node.attr, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + elif context == Context.Store: + newnode = nodes.AssignAttr( + attrname=node.attr, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + # Prohibit a local save if we are in an ExceptHandler. + if not isinstance(parent, nodes.ExceptHandler): + # mypy doesn't recognize that newnode has to be AssignAttr because it + # doesn't support ParamSpec + # See https://github.com/python/mypy/issues/8645 + self._delayed_assattr.append(newnode) # type: ignore[arg-type] + else: + newnode = nodes.Attribute( + attrname=node.attr, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + def visit_global(self, node: ast.Global, parent: NodeNG) -> nodes.Global: + """Visit a Global node to become astroid.""" + newnode = nodes.Global( + names=node.names, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + if self._global_names: # global at the module level, no effect + for name in node.names: + self._global_names[-1].setdefault(name, []).append(newnode) + return newnode + + def visit_if(self, node: ast.If, parent: NodeNG) -> nodes.If: + """Visit an If node by returning a fresh instance of it.""" + newnode = nodes.If( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + self.visit(node.test, newnode), + [self.visit(child, newnode) for child in node.body], + [self.visit(child, newnode) for child in node.orelse], + ) + return newnode + + def visit_ifexp(self, node: ast.IfExp, parent: NodeNG) -> nodes.IfExp: + """Visit a IfExp node by returning a fresh instance of it.""" + newnode = nodes.IfExp( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + self.visit(node.test, newnode), + self.visit(node.body, newnode), + self.visit(node.orelse, newnode), + ) + return newnode + + def visit_import(self, node: ast.Import, parent: NodeNG) -> nodes.Import: + """Visit a Import node by returning a fresh instance of it.""" + names = [(alias.name, alias.asname) for alias in node.names] + newnode = nodes.Import( + names=names, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + # save import names in parent's locals: + for name, asname in newnode.names: + name = asname or name + parent.set_local(name.split(".")[0], newnode) + return newnode + + def visit_joinedstr(self, node: ast.JoinedStr, parent: NodeNG) -> nodes.JoinedStr: + newnode = nodes.JoinedStr( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit([self.visit(child, newnode) for child in node.values]) + return newnode + + def visit_formattedvalue( + self, node: ast.FormattedValue, parent: NodeNG + ) -> nodes.FormattedValue: + newnode = nodes.FormattedValue( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + value=self.visit(node.value, newnode), + conversion=node.conversion, + format_spec=self.visit(node.format_spec, newnode), + ) + return newnode + + if sys.version_info >= (3, 8): + + def visit_namedexpr( + self, node: ast.NamedExpr, parent: NodeNG + ) -> nodes.NamedExpr: + newnode = nodes.NamedExpr( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + self.visit(node.target, newnode), self.visit(node.value, newnode) + ) + return newnode + + if sys.version_info < (3, 9): + # Not used in Python 3.9+. + def visit_extslice( + self, node: ast.ExtSlice, parent: nodes.Subscript + ) -> nodes.Tuple: + """Visit an ExtSlice node by returning a fresh instance of Tuple.""" + # ExtSlice doesn't have lineno or col_offset information + newnode = nodes.Tuple(ctx=Context.Load, parent=parent) + newnode.postinit([self.visit(dim, newnode) for dim in node.dims]) + return newnode + + def visit_index(self, node: ast.Index, parent: nodes.Subscript) -> NodeNG: + """Visit a Index node by returning a fresh instance of NodeNG.""" + return self.visit(node.value, parent) + + def visit_keyword(self, node: ast.keyword, parent: NodeNG) -> nodes.Keyword: + """Visit a Keyword node by returning a fresh instance of it.""" + newnode = nodes.Keyword( + arg=node.arg, + # position attributes added in 3.9 + lineno=getattr(node, "lineno", None), + col_offset=getattr(node, "col_offset", None), + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + def visit_lambda(self, node: ast.Lambda, parent: NodeNG) -> nodes.Lambda: + """Visit a Lambda node by returning a fresh instance of it.""" + newnode = nodes.Lambda( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit(self.visit(node.args, newnode), self.visit(node.body, newnode)) + return newnode + + def visit_list(self, node: ast.List, parent: NodeNG) -> nodes.List: + """Visit a List node by returning a fresh instance of it.""" + context = self._get_context(node) + newnode = nodes.List( + ctx=context, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit([self.visit(child, newnode) for child in node.elts]) + return newnode + + def visit_listcomp(self, node: ast.ListComp, parent: NodeNG) -> nodes.ListComp: + """Visit a ListComp node by returning a fresh instance of it.""" + newnode = nodes.ListComp( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + self.visit(node.elt, newnode), + [self.visit(child, newnode) for child in node.generators], + ) + return newnode + + def visit_name( + self, node: ast.Name, parent: NodeNG + ) -> nodes.Name | nodes.AssignName | nodes.DelName: + """Visit a Name node by returning a fresh instance of it.""" + context = self._get_context(node) + newnode: nodes.Name | nodes.AssignName | nodes.DelName + if context == Context.Del: + newnode = nodes.DelName( + name=node.id, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + elif context == Context.Store: + newnode = nodes.AssignName( + name=node.id, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + else: + newnode = nodes.Name( + name=node.id, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + # XXX REMOVE me : + if context in (Context.Del, Context.Store): # 'Aug' ?? + newnode = cast(Union[nodes.AssignName, nodes.DelName], newnode) + self._save_assignment(newnode) + return newnode + + def visit_nonlocal(self, node: ast.Nonlocal, parent: NodeNG) -> nodes.Nonlocal: + """Visit a Nonlocal node and return a new instance of it.""" + return nodes.Nonlocal( + names=node.names, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + + def visit_constant(self, node: ast.Constant, parent: NodeNG) -> nodes.Const: + """Visit a Constant node by returning a fresh instance of Const.""" + return nodes.Const( + value=node.value, + kind=node.kind, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + + if sys.version_info < (3, 8): + # Not used in Python 3.8+. + def visit_ellipsis(self, node: ast.Ellipsis, parent: NodeNG) -> nodes.Const: + """Visit an Ellipsis node by returning a fresh instance of Const.""" + return nodes.Const( + value=Ellipsis, + lineno=node.lineno, + col_offset=node.col_offset, + parent=parent, + ) + + def visit_nameconstant( + self, node: ast.NameConstant, parent: NodeNG + ) -> nodes.Const: + # For singleton values True / False / None + return nodes.Const( + node.value, + node.lineno, + node.col_offset, + parent, + ) + + def visit_str(self, node: ast.Str | ast.Bytes, parent: NodeNG) -> nodes.Const: + """Visit a String/Bytes node by returning a fresh instance of Const.""" + return nodes.Const( + node.s, + node.lineno, + node.col_offset, + parent, + ) + + visit_bytes = visit_str + + def visit_num(self, node: ast.Num, parent: NodeNG) -> nodes.Const: + """Visit a Num node by returning a fresh instance of Const.""" + return nodes.Const( + node.n, + node.lineno, + node.col_offset, + parent, + ) + + def visit_pass(self, node: ast.Pass, parent: NodeNG) -> nodes.Pass: + """Visit a Pass node by returning a fresh instance of it.""" + return nodes.Pass( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + + def visit_raise(self, node: ast.Raise, parent: NodeNG) -> nodes.Raise: + """Visit a Raise node by returning a fresh instance of it.""" + newnode = nodes.Raise( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + # no traceback; anyway it is not used in Pylint + newnode.postinit( + exc=self.visit(node.exc, newnode), + cause=self.visit(node.cause, newnode), + ) + return newnode + + def visit_return(self, node: ast.Return, parent: NodeNG) -> nodes.Return: + """Visit a Return node by returning a fresh instance of it.""" + newnode = nodes.Return( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + if node.value is not None: + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + def visit_set(self, node: ast.Set, parent: NodeNG) -> nodes.Set: + """Visit a Set node by returning a fresh instance of it.""" + newnode = nodes.Set( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit([self.visit(child, newnode) for child in node.elts]) + return newnode + + def visit_setcomp(self, node: ast.SetComp, parent: NodeNG) -> nodes.SetComp: + """Visit a SetComp node by returning a fresh instance of it.""" + newnode = nodes.SetComp( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + self.visit(node.elt, newnode), + [self.visit(child, newnode) for child in node.generators], + ) + return newnode + + def visit_slice(self, node: ast.Slice, parent: nodes.Subscript) -> nodes.Slice: + """Visit a Slice node by returning a fresh instance of it.""" + newnode = nodes.Slice( + # position attributes added in 3.9 + lineno=getattr(node, "lineno", None), + col_offset=getattr(node, "col_offset", None), + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + lower=self.visit(node.lower, newnode), + upper=self.visit(node.upper, newnode), + step=self.visit(node.step, newnode), + ) + return newnode + + def visit_subscript(self, node: ast.Subscript, parent: NodeNG) -> nodes.Subscript: + """Visit a Subscript node by returning a fresh instance of it.""" + context = self._get_context(node) + newnode = nodes.Subscript( + ctx=context, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + self.visit(node.value, newnode), self.visit(node.slice, newnode) + ) + return newnode + + def visit_starred(self, node: ast.Starred, parent: NodeNG) -> nodes.Starred: + """Visit a Starred node and return a new instance of it.""" + context = self._get_context(node) + newnode = nodes.Starred( + ctx=context, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + def visit_tryexcept(self, node: ast.Try, parent: NodeNG) -> nodes.TryExcept: + """Visit a TryExcept node by returning a fresh instance of it.""" + if sys.version_info >= (3, 8): + # TryExcept excludes the 'finally' but that will be included in the + # end_lineno from 'node'. Therefore, we check all non 'finally' + # children to find the correct end_lineno and column. + end_lineno = node.end_lineno + end_col_offset = node.end_col_offset + all_children: list[ast.AST] = [*node.body, *node.handlers, *node.orelse] + for child in reversed(all_children): + end_lineno = child.end_lineno + end_col_offset = child.end_col_offset + break + newnode = nodes.TryExcept( + lineno=node.lineno, + col_offset=node.col_offset, + end_lineno=end_lineno, + end_col_offset=end_col_offset, + parent=parent, + ) + else: + newnode = nodes.TryExcept(node.lineno, node.col_offset, parent) + newnode.postinit( + [self.visit(child, newnode) for child in node.body], + [self.visit(child, newnode) for child in node.handlers], + [self.visit(child, newnode) for child in node.orelse], + ) + return newnode + + def visit_try( + self, node: ast.Try, parent: NodeNG + ) -> nodes.TryExcept | nodes.TryFinally | None: + # python 3.3 introduce a new Try node replacing + # TryFinally/TryExcept nodes + if node.finalbody: + newnode = nodes.TryFinally( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + body: list[NodeNG | nodes.TryExcept] + if node.handlers: + body = [self.visit_tryexcept(node, newnode)] + else: + body = [self.visit(child, newnode) for child in node.body] + newnode.postinit(body, [self.visit(n, newnode) for n in node.finalbody]) + return newnode + if node.handlers: + return self.visit_tryexcept(node, parent) + return None + + def visit_trystar(self, node: ast.TryStar, parent: NodeNG) -> nodes.TryStar: + newnode = nodes.TryStar( + lineno=node.lineno, + col_offset=node.col_offset, + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + body=[self.visit(n, newnode) for n in node.body], + handlers=[self.visit(n, newnode) for n in node.handlers], + orelse=[self.visit(n, newnode) for n in node.orelse], + finalbody=[self.visit(n, newnode) for n in node.finalbody], + ) + return newnode + + def visit_tuple(self, node: ast.Tuple, parent: NodeNG) -> nodes.Tuple: + """Visit a Tuple node by returning a fresh instance of it.""" + context = self._get_context(node) + newnode = nodes.Tuple( + ctx=context, + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit([self.visit(child, newnode) for child in node.elts]) + return newnode + + def visit_unaryop(self, node: ast.UnaryOp, parent: NodeNG) -> nodes.UnaryOp: + """Visit a UnaryOp node by returning a fresh instance of it.""" + newnode = nodes.UnaryOp( + op=self._parser_module.unary_op_classes[node.op.__class__], + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit(self.visit(node.operand, newnode)) + return newnode + + def visit_while(self, node: ast.While, parent: NodeNG) -> nodes.While: + """Visit a While node by returning a fresh instance of it.""" + newnode = nodes.While( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + newnode.postinit( + self.visit(node.test, newnode), + [self.visit(child, newnode) for child in node.body], + [self.visit(child, newnode) for child in node.orelse], + ) + return newnode + + @overload + def _visit_with( + self, cls: type[nodes.With], node: ast.With, parent: NodeNG + ) -> nodes.With: + ... + + @overload + def _visit_with( + self, cls: type[nodes.AsyncWith], node: ast.AsyncWith, parent: NodeNG + ) -> nodes.AsyncWith: + ... + + def _visit_with( + self, + cls: type[_WithT], + node: ast.With | ast.AsyncWith, + parent: NodeNG, + ) -> _WithT: + col_offset = node.col_offset + if IS_PYPY and not PY39_PLUS and isinstance(node, ast.AsyncWith) and self._data: + # pylint: disable-next=unsubscriptable-object + col_offset = self._data[node.lineno - 1].index("async") + + newnode = cls( + lineno=node.lineno, + col_offset=col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + + def visit_child(child: ast.withitem) -> tuple[NodeNG, NodeNG | None]: + expr = self.visit(child.context_expr, newnode) + var = self.visit(child.optional_vars, newnode) + return expr, var + + type_annotation = self.check_type_comment(node, parent=newnode) + newnode.postinit( + items=[visit_child(child) for child in node.items], + body=[self.visit(child, newnode) for child in node.body], + type_annotation=type_annotation, + ) + return newnode + + def visit_with(self, node: ast.With, parent: NodeNG) -> NodeNG: + return self._visit_with(nodes.With, node, parent) + + def visit_yield(self, node: ast.Yield, parent: NodeNG) -> NodeNG: + """Visit a Yield node by returning a fresh instance of it.""" + newnode = nodes.Yield( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + if node.value is not None: + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + def visit_yieldfrom(self, node: ast.YieldFrom, parent: NodeNG) -> NodeNG: + newnode = nodes.YieldFrom( + lineno=node.lineno, + col_offset=node.col_offset, + # end_lineno and end_col_offset added in 3.8 + end_lineno=getattr(node, "end_lineno", None), + end_col_offset=getattr(node, "end_col_offset", None), + parent=parent, + ) + if node.value is not None: + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + if sys.version_info >= (3, 10): + + def visit_match(self, node: ast.Match, parent: NodeNG) -> nodes.Match: + newnode = nodes.Match( + lineno=node.lineno, + col_offset=node.col_offset, + end_lineno=node.end_lineno, + end_col_offset=node.end_col_offset, + parent=parent, + ) + newnode.postinit( + subject=self.visit(node.subject, newnode), + cases=[self.visit(case, newnode) for case in node.cases], + ) + return newnode + + def visit_matchcase( + self, node: ast.match_case, parent: NodeNG + ) -> nodes.MatchCase: + newnode = nodes.MatchCase(parent=parent) + newnode.postinit( + pattern=self.visit(node.pattern, newnode), + guard=self.visit(node.guard, newnode), + body=[self.visit(child, newnode) for child in node.body], + ) + return newnode + + def visit_matchvalue( + self, node: ast.MatchValue, parent: NodeNG + ) -> nodes.MatchValue: + newnode = nodes.MatchValue( + lineno=node.lineno, + col_offset=node.col_offset, + end_lineno=node.end_lineno, + end_col_offset=node.end_col_offset, + parent=parent, + ) + newnode.postinit(value=self.visit(node.value, newnode)) + return newnode + + def visit_matchsingleton( + self, node: ast.MatchSingleton, parent: NodeNG + ) -> nodes.MatchSingleton: + return nodes.MatchSingleton( + value=node.value, + lineno=node.lineno, + col_offset=node.col_offset, + end_lineno=node.end_lineno, + end_col_offset=node.end_col_offset, + parent=parent, + ) + + def visit_matchsequence( + self, node: ast.MatchSequence, parent: NodeNG + ) -> nodes.MatchSequence: + newnode = nodes.MatchSequence( + lineno=node.lineno, + col_offset=node.col_offset, + end_lineno=node.end_lineno, + end_col_offset=node.end_col_offset, + parent=parent, + ) + newnode.postinit( + patterns=[self.visit(pattern, newnode) for pattern in node.patterns] + ) + return newnode + + def visit_matchmapping( + self, node: ast.MatchMapping, parent: NodeNG + ) -> nodes.MatchMapping: + newnode = nodes.MatchMapping( + lineno=node.lineno, + col_offset=node.col_offset, + end_lineno=node.end_lineno, + end_col_offset=node.end_col_offset, + parent=parent, + ) + # Add AssignName node for 'node.name' + # https://bugs.python.org/issue43994 + newnode.postinit( + keys=[self.visit(child, newnode) for child in node.keys], + patterns=[self.visit(pattern, newnode) for pattern in node.patterns], + rest=self.visit_assignname(node, newnode, node.rest), + ) + return newnode + + def visit_matchclass( + self, node: ast.MatchClass, parent: NodeNG + ) -> nodes.MatchClass: + newnode = nodes.MatchClass( + lineno=node.lineno, + col_offset=node.col_offset, + end_lineno=node.end_lineno, + end_col_offset=node.end_col_offset, + parent=parent, + ) + newnode.postinit( + cls=self.visit(node.cls, newnode), + patterns=[self.visit(pattern, newnode) for pattern in node.patterns], + kwd_attrs=node.kwd_attrs, + kwd_patterns=[ + self.visit(pattern, newnode) for pattern in node.kwd_patterns + ], + ) + return newnode + + def visit_matchstar( + self, node: ast.MatchStar, parent: NodeNG + ) -> nodes.MatchStar: + newnode = nodes.MatchStar( + lineno=node.lineno, + col_offset=node.col_offset, + end_lineno=node.end_lineno, + end_col_offset=node.end_col_offset, + parent=parent, + ) + # Add AssignName node for 'node.name' + # https://bugs.python.org/issue43994 + newnode.postinit(name=self.visit_assignname(node, newnode, node.name)) + return newnode + + def visit_matchas(self, node: ast.MatchAs, parent: NodeNG) -> nodes.MatchAs: + newnode = nodes.MatchAs( + lineno=node.lineno, + col_offset=node.col_offset, + end_lineno=node.end_lineno, + end_col_offset=node.end_col_offset, + parent=parent, + ) + # Add AssignName node for 'node.name' + # https://bugs.python.org/issue43994 + newnode.postinit( + pattern=self.visit(node.pattern, newnode), + name=self.visit_assignname(node, newnode, node.name), + ) + return newnode + + def visit_matchor(self, node: ast.MatchOr, parent: NodeNG) -> nodes.MatchOr: + newnode = nodes.MatchOr( + lineno=node.lineno, + col_offset=node.col_offset, + end_lineno=node.end_lineno, + end_col_offset=node.end_col_offset, + parent=parent, + ) + newnode.postinit( + patterns=[self.visit(pattern, newnode) for pattern in node.patterns] + ) + return newnode diff --git a/venv/lib/python3.10/site-packages/astroid/scoped_nodes.py b/venv/lib/python3.10/site-packages/astroid/scoped_nodes.py new file mode 100644 index 00000000..0e5ef130 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/scoped_nodes.py @@ -0,0 +1,35 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +# pylint: disable=unused-import + +import warnings + +from astroid.nodes.scoped_nodes import ( + AsyncFunctionDef, + ClassDef, + ComprehensionScope, + DictComp, + FunctionDef, + GeneratorExp, + Lambda, + ListComp, + LocalsDictNodeNG, + Module, + SetComp, + _is_metaclass, + builtin_lookup, + function_to_method, + get_wrapping_class, +) + +# We cannot create a __all__ here because it would create a circular import +# Please remove astroid/scoped_nodes.py|astroid/node_classes.py in autoflake +# exclude when removing this file. +warnings.warn( + "The 'astroid.scoped_nodes' module is deprecated and will be replaced by " + "'astroid.nodes' in astroid 3.0.0", + DeprecationWarning, + stacklevel=2, +) diff --git a/venv/lib/python3.10/site-packages/astroid/test_utils.py b/venv/lib/python3.10/site-packages/astroid/test_utils.py new file mode 120000 index 00000000..7dde9a13 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/test_utils.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/ef/0c/95/2fc03c5984176e2c75993d39961f323b89179358118c20aeab07d5e1ff \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/transforms.py b/venv/lib/python3.10/site-packages/astroid/transforms.py new file mode 120000 index 00000000..934188e7 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/transforms.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/7a/0e/db/d257a142efc6b051c2b0b754b0d36f6f160119c4c2d29eeb17610a2177 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/typing.py b/venv/lib/python3.10/site-packages/astroid/typing.py new file mode 100644 index 00000000..62d8995f --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/typing.py @@ -0,0 +1,71 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +from __future__ import annotations + +import sys +from typing import TYPE_CHECKING, Any, Callable, Generator, TypeVar, Union + +if TYPE_CHECKING: + from astroid import bases, exceptions, nodes, transforms, util + from astroid.context import InferenceContext + from astroid.interpreter._import import spec + +if sys.version_info >= (3, 8): + from typing import TypedDict +else: + from typing_extensions import TypedDict + +_NodesT = TypeVar("_NodesT", bound="nodes.NodeNG") + + +class InferenceErrorInfo(TypedDict): + """Store additional Inference error information + raised with StopIteration exception. + """ + + node: nodes.NodeNG + context: InferenceContext | None + + +InferFn = Callable[..., Any] + + +class AstroidManagerBrain(TypedDict): + """Dictionary to store relevant information for a AstroidManager class.""" + + astroid_cache: dict[str, nodes.Module] + _mod_file_cache: dict[ + tuple[str, str | None], spec.ModuleSpec | exceptions.AstroidImportError + ] + _failed_import_hooks: list[Callable[[str], nodes.Module]] + always_load_extensions: bool + optimize_ast: bool + extension_package_whitelist: set[str] + _transform: transforms.TransformVisitor + + +InferenceResult = Union["nodes.NodeNG", "util.UninferableBase", "bases.Proxy"] +SuccessfulInferenceResult = Union["nodes.NodeNG", "bases.Proxy"] + +ConstFactoryResult = Union[ + "nodes.List", + "nodes.Set", + "nodes.Tuple", + "nodes.Dict", + "nodes.Const", + "nodes.EmptyNode", +] + +InferBinaryOp = Callable[ + [ + Union[_NodesT, "bases.Instance"], + Union["nodes.AugAssign", "nodes.BinOp"], + str, + InferenceResult, + "InferenceContext", + SuccessfulInferenceResult, + ], + Generator[InferenceResult, None, None], +] diff --git a/venv/lib/python3.10/site-packages/astroid/util.py b/venv/lib/python3.10/site-packages/astroid/util.py new file mode 100644 index 00000000..20ff810f --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/util.py @@ -0,0 +1,162 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + + +from __future__ import annotations + +import importlib +import sys +import warnings +from typing import Any + +import lazy_object_proxy + +if sys.version_info >= (3, 8): + from typing import Final, Literal +else: + from typing_extensions import Final, Literal + + +def lazy_descriptor(obj): + class DescriptorProxy(lazy_object_proxy.Proxy): + def __get__(self, instance, owner=None): + return self.__class__.__get__(self, instance) + + return DescriptorProxy(obj) + + +def lazy_import(module_name: str) -> lazy_object_proxy.Proxy: + return lazy_object_proxy.Proxy( + lambda: importlib.import_module("." + module_name, "astroid") + ) + + +class UninferableBase: + """Special inference object, which is returned when inference fails. + + This is meant to be used as a singleton. Use astroid.util.Uninferable to access it. + """ + + def __repr__(self) -> Literal["Uninferable"]: + return "Uninferable" + + __str__ = __repr__ + + def __getattribute__(self, name: str) -> Any: + if name == "next": + raise AttributeError("next method should not be called") + if name.startswith("__") and name.endswith("__"): + return object.__getattribute__(self, name) + if name == "accept": + return object.__getattribute__(self, name) + return self + + def __call__(self, *args: Any, **kwargs: Any) -> UninferableBase: + return self + + def __bool__(self) -> Literal[False]: + return False + + __nonzero__ = __bool__ + + def accept(self, visitor): + return visitor.visit_uninferable(self) + + +Uninferable: Final = UninferableBase() + + +class BadOperationMessage: + """Object which describes a TypeError occurred somewhere in the inference chain. + + This is not an exception, but a container object which holds the types and + the error which occurred. + """ + + +class BadUnaryOperationMessage(BadOperationMessage): + """Object which describes operational failures on UnaryOps.""" + + def __init__(self, operand, op, error): + self.operand = operand + self.op = op + self.error = error + + @property + def _object_type_helper(self): + helpers = lazy_import("helpers") + return helpers.object_type + + def _object_type(self, obj): + objtype = self._object_type_helper(obj) + if isinstance(objtype, UninferableBase): + return None + + return objtype + + def __str__(self) -> str: + if hasattr(self.operand, "name"): + operand_type = self.operand.name + else: + object_type = self._object_type(self.operand) + if hasattr(object_type, "name"): + operand_type = object_type.name + else: + # Just fallback to as_string + operand_type = object_type.as_string() + + msg = "bad operand type for unary {}: {}" + return msg.format(self.op, operand_type) + + +class BadBinaryOperationMessage(BadOperationMessage): + """Object which describes type errors for BinOps.""" + + def __init__(self, left_type, op, right_type): + self.left_type = left_type + self.right_type = right_type + self.op = op + + def __str__(self) -> str: + msg = "unsupported operand type(s) for {}: {!r} and {!r}" + return msg.format(self.op, self.left_type.name, self.right_type.name) + + +def _instancecheck(cls, other) -> bool: + wrapped = cls.__wrapped__ + other_cls = other.__class__ + is_instance_of = wrapped is other_cls or issubclass(other_cls, wrapped) + warnings.warn( + "%r is deprecated and slated for removal in astroid " + "2.0, use %r instead" % (cls.__class__.__name__, wrapped.__name__), + PendingDeprecationWarning, + stacklevel=2, + ) + return is_instance_of + + +def proxy_alias(alias_name, node_type): + """Get a Proxy from the given name to the given node type.""" + proxy = type( + alias_name, + (lazy_object_proxy.Proxy,), + { + "__class__": object.__dict__["__class__"], + "__instancecheck__": _instancecheck, + }, + ) + return proxy(lambda: node_type) + + +def check_warnings_filter() -> bool: + """Return True if any other than the default DeprecationWarning filter is enabled. + + https://docs.python.org/3/library/warnings.html#default-warning-filter + """ + return any( + issubclass(DeprecationWarning, filter[2]) + and filter[0] != "ignore" + and filter[3] != "__main__" + for filter in warnings.filters + ) diff --git a/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/AUTHORS.rst b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/AUTHORS.rst new file mode 120000 index 00000000..3f46d909 --- /dev/null +++ b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/AUTHORS.rst @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/b6/24/cf/b1bcc697d76d5c23045976d6495d736a7d4cf81a16b628b1b38e862169 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/INSTALLER b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/LICENSE b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/LICENSE new file mode 120000 index 00000000..2f19f41b --- /dev/null +++ b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/LICENSE @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/8d/1d/02/38e48543441914cab0741d4de3e070a1b8367f787af5f209afb60b096a \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/METADATA b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/METADATA new file mode 100644 index 00000000..0da18781 --- /dev/null +++ b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/METADATA @@ -0,0 +1,460 @@ +Metadata-Version: 2.1 +Name: autopep8 +Version: 2.0.2 +Summary: A tool that automatically formats Python code to conform to the PEP 8 style guide +Home-page: https://github.com/hhatto/autopep8 +Author: Hideo Hattori +Author-email: hhatto.jp@gmail.com +License: Expat License +Keywords: automation,pep8,format,pycodestyle +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Software Development :: Quality Assurance +Requires-Python: >=3.6 +License-File: LICENSE +License-File: AUTHORS.rst +Requires-Dist: pycodestyle (>=2.10.0) +Requires-Dist: tomli ; python_version < "3.11" + +======== +autopep8 +======== + +.. image:: https://img.shields.io/pypi/v/autopep8.svg + :target: https://pypi.org/project/autopep8/ + :alt: PyPI Version + +.. image:: https://github.com/hhatto/autopep8/workflows/Python%20package/badge.svg + :target: https://github.com/hhatto/autopep8/actions + :alt: Build status + +.. image:: https://codecov.io/gh/hhatto/autopep8/branch/main/graph/badge.svg + :target: https://codecov.io/gh/hhatto/autopep8 + :alt: Code Coverage + +autopep8 automatically formats Python code to conform to the `PEP 8`_ style +guide. It uses the pycodestyle_ utility to determine what parts of the code +needs to be formatted. autopep8 is capable of fixing most of the formatting +issues_ that can be reported by pycodestyle. + +.. _PEP 8: https://www.python.org/dev/peps/pep-0008/ +.. _issues: https://pycodestyle.readthedocs.org/en/latest/intro.html#error-codes + +.. contents:: + + +Installation +============ + +From pip:: + + $ pip install --upgrade autopep8 + +Consider using the ``--user`` option_. + +.. _option: https://pip.pypa.io/en/latest/user_guide/#user-installs + + +Requirements +============ + +autopep8 requires pycodestyle_. + +.. _pycodestyle: https://github.com/PyCQA/pycodestyle + + +Usage +===== + +To modify a file in place (with aggressive level 2):: + + $ autopep8 --in-place --aggressive --aggressive + +Before running autopep8. + +.. code-block:: python + + import math, sys; + + def example1(): + ####This is a long comment. This should be wrapped to fit within 72 characters. + some_tuple=( 1,2, 3,'a' ); + some_variable={'long':'Long code lines should be wrapped within 79 characters.', + 'other':[math.pi, 100,200,300,9876543210,'This is a long string that goes on'], + 'more':{'inner':'This whole logical line should be wrapped.',some_tuple:[1, + 20,300,40000,500000000,60000000000000000]}} + return (some_tuple, some_variable) + def example2(): return {'has_key() is deprecated':True}.has_key({'f':2}.has_key('')); + class Example3( object ): + def __init__ ( self, bar ): + #Comments should have a space after the hash. + if bar : bar+=1; bar=bar* bar ; return bar + else: + some_string = """ + Indentation in multiline strings should not be touched. + Only actual code should be reindented. + """ + return (sys.path, some_string) + +After running autopep8. + +.. code-block:: python + + import math + import sys + + + def example1(): + # This is a long comment. This should be wrapped to fit within 72 + # characters. + some_tuple = (1, 2, 3, 'a') + some_variable = { + 'long': 'Long code lines should be wrapped within 79 characters.', + 'other': [ + math.pi, + 100, + 200, + 300, + 9876543210, + 'This is a long string that goes on'], + 'more': { + 'inner': 'This whole logical line should be wrapped.', + some_tuple: [ + 1, + 20, + 300, + 40000, + 500000000, + 60000000000000000]}} + return (some_tuple, some_variable) + + + def example2(): return ('' in {'f': 2}) in {'has_key() is deprecated': True} + + + class Example3(object): + def __init__(self, bar): + # Comments should have a space after the hash. + if bar: + bar += 1 + bar = bar * bar + return bar + else: + some_string = """ + Indentation in multiline strings should not be touched. + Only actual code should be reindented. + """ + return (sys.path, some_string) + +Options:: + + usage: autopep8 [-h] [--version] [-v] [-d] [-i] [--global-config filename] + [--ignore-local-config] [-r] [-j n] [-p n] [-a] + [--experimental] [--exclude globs] [--list-fixes] + [--ignore errors] [--select errors] [--max-line-length n] + [--line-range line line] [--hang-closing] [--exit-code] + [files [files ...]] + + Automatically formats Python code to conform to the PEP 8 style guide. + + positional arguments: + files files to format or '-' for standard in + + optional arguments: + -h, --help show this help message and exit + --version show program's version number and exit + -v, --verbose print verbose messages; multiple -v result in more + verbose messages + -d, --diff print the diff for the fixed source + -i, --in-place make changes to files in place + --global-config filename + path to a global pep8 config file; if this file does + not exist then this is ignored (default: + ~/.config/pep8) + --ignore-local-config + don't look for and apply local config files; if not + passed, defaults are updated with any config files in + the project's root directory + -r, --recursive run recursively over directories; must be used with + --in-place or --diff + -j n, --jobs n number of parallel jobs; match CPU count if value is + less than 1 + -p n, --pep8-passes n + maximum number of additional pep8 passes (default: + infinite) + -a, --aggressive enable non-whitespace changes; multiple -a result in + more aggressive changes + --experimental enable experimental fixes + --exclude globs exclude file/directory names that match these comma- + separated globs + --list-fixes list codes for fixes; used by --ignore and --select + --ignore errors do not fix these errors/warnings (default: + E226,E24,W50,W690) + --select errors fix only these errors/warnings (e.g. E4,W) + --max-line-length n set maximum allowed line length (default: 79) + --line-range line line, --range line line + only fix errors found within this inclusive range of + line numbers (e.g. 1 99); line numbers are indexed at + 1 + --hang-closing hang-closing option passed to pycodestyle + --exit-code change to behavior of exit code. default behavior of + return value, 0 is no differences, 1 is error exit. + return 2 when add this option. 2 is exists + differences. + + +Features +======== + +autopep8 fixes the following issues_ reported by pycodestyle_:: + + E101 - Reindent all lines. + E11 - Fix indentation. + E121 - Fix indentation to be a multiple of four. + E122 - Add absent indentation for hanging indentation. + E123 - Align closing bracket to match opening bracket. + E124 - Align closing bracket to match visual indentation. + E125 - Indent to distinguish line from next logical line. + E126 - Fix over-indented hanging indentation. + E127 - Fix visual indentation. + E128 - Fix visual indentation. + E129 - Fix visual indentation. + E131 - Fix hanging indent for unaligned continuation line. + E133 - Fix missing indentation for closing bracket. + E20 - Remove extraneous whitespace. + E211 - Remove extraneous whitespace. + E22 - Fix extraneous whitespace around keywords. + E224 - Remove extraneous whitespace around operator. + E225 - Fix missing whitespace around operator. + E226 - Fix missing whitespace around arithmetic operator. + E227 - Fix missing whitespace around bitwise/shift operator. + E228 - Fix missing whitespace around modulo operator. + E231 - Add missing whitespace. + E241 - Fix extraneous whitespace around keywords. + E242 - Remove extraneous whitespace around operator. + E251 - Remove whitespace around parameter '=' sign. + E252 - Missing whitespace around parameter equals. + E26 - Fix spacing after comment hash for inline comments. + E265 - Fix spacing after comment hash for block comments. + E266 - Fix too many leading '#' for block comments. + E27 - Fix extraneous whitespace around keywords. + E301 - Add missing blank line. + E302 - Add missing 2 blank lines. + E303 - Remove extra blank lines. + E304 - Remove blank line following function decorator. + E305 - Expected 2 blank lines after end of function or class. + E306 - Expected 1 blank line before a nested definition. + E401 - Put imports on separate lines. + E402 - Fix module level import not at top of file + E501 - Try to make lines fit within --max-line-length characters. + E502 - Remove extraneous escape of newline. + E701 - Put colon-separated compound statement on separate lines. + E70 - Put semicolon-separated compound statement on separate lines. + E711 - Fix comparison with None. + E712 - Fix comparison with boolean. + E713 - Use 'not in' for test for membership. + E714 - Use 'is not' test for object identity. + E721 - Use "isinstance()" instead of comparing types directly. + E722 - Fix bare except. + E731 - Use a def when use do not assign a lambda expression. + W291 - Remove trailing whitespace. + W292 - Add a single newline at the end of the file. + W293 - Remove trailing whitespace on blank line. + W391 - Remove trailing blank lines. + W503 - Fix line break before binary operator. + W504 - Fix line break after binary operator. + W605 - Fix invalid escape sequence 'x'. + W690 - Fix various deprecated code (via lib2to3). + +autopep8 also fixes some issues not found by pycodestyle_. + +- Correct deprecated or non-idiomatic Python code (via ``lib2to3``). Use this + for making Python 2.7 code more compatible with Python 3. (This is triggered + if ``W690`` is enabled.) +- Normalize files with mixed line endings. +- Put a blank line between a class docstring and its first method + declaration. (Enabled with ``E301``.) +- Remove blank lines between a function declaration and its docstring. (Enabled + with ``E303``.) + +autopep8 avoids fixing some issues found by pycodestyle_. + +- ``E112``/``E113`` for non comments are reports of bad indentation that break + syntax rules. These should not be modified at all. +- ``E265``, which refers to spacing after comment hash, is ignored if the + comment looks like code. autopep8 avoids modifying these since they are not + real comments. If you really want to get rid of the pycodestyle_ warning, + consider just removing the commented-out code. (This can be automated via + eradicate_.) + +.. _eradicate: https://github.com/myint/eradicate + + +More advanced usage +=================== + +By default autopep8 only makes whitespace changes. Thus, by default, it does +not fix ``E711`` and ``E712``. (Changing ``x == None`` to ``x is None`` may +change the meaning of the program if ``x`` has its ``__eq__`` method +overridden.) Nor does it correct deprecated code ``W6``. To enable these +more aggressive fixes, use the ``--aggressive`` option:: + + $ autopep8 --aggressive + +Use multiple ``--aggressive`` to increase the aggressiveness level. For +example, ``E712`` requires aggressiveness level 2 (since ``x == True`` could be +changed to either ``x`` or ``x is True``, but autopep8 chooses the former). + +``--aggressive`` will also shorten lines more aggressively. It will also remove +trailing whitespace more aggressively. (Usually, we don't touch trailing +whitespace in docstrings and other multiline strings. And to do even more +aggressive changes to docstrings, use docformatter_.) + +.. _docformatter: https://github.com/myint/docformatter + +To enable only a subset of the fixes, use the ``--select`` option. For example, +to fix various types of indentation issues:: + + $ autopep8 --select=E1,W1 + +If the file being fixed is large, you may want to enable verbose progress +messages:: + + $ autopep8 -v + +Passing in ``--experimental`` enables the following functionality: + +- Shortens code lines by taking its length into account + +:: + +$ autopep8 --experimental + +Disabling line-by-line +---------------------- + +It is possible to disable autopep8 untill it it turned back on again in the file, using ``autopep8: off`` and then renabling ``autopep8: on``. + +.. code-block:: python + + # autopep8: off + [ + [23, 23, 13, 43], + [32, 34, 34, 34], + [56, 34, 34, 11], + [10, 10, 10, 10], + ] + # autopep8: on + +``fmt: off`` and ``fmt: on`` are also valid. + +Use as a module +=============== + +The simplest way of using autopep8 as a module is via the ``fix_code()`` +function: + + >>> import autopep8 + >>> autopep8.fix_code('x= 123\n') + 'x = 123\n' + +Or with options: + + >>> import autopep8 + >>> autopep8.fix_code('print( 123 )\n', + ... options={'ignore': ['E']}) + 'print( 123 )\n' + + +Configuration +============= + +By default, if ``$HOME/.config/pycodestyle`` (``~\.pycodestyle`` in Windows +environment) exists, it will be used as global configuration file. +Alternatively, you can specify the global configuration file with the +``--global-config`` option. + +Also, if ``setup.cfg``, ``tox.ini``, ``.pep8`` and ``.flake8`` files exist +in the directory where the target file exists, it will be used as the +configuration file. + +``pep8``, ``pycodestyle``, and ``flake8`` can be used as a section. + +configuration file example:: + + [pycodestyle] + max_line_length = 120 + ignore = E501 + +pyproject.toml +-------------- + +autopep8 can also use ``pyproject.toml``. +The section must be ``[tool.autopep8]``, and ``pyproject.toml`` takes precedence +over any other configuration files. + +configuration file example:: + + [tool.autopep8] + max_line_length = 120 + ignore = "E501,W6" # or ["E501", "W6"] + in-place = true + recursive = true + aggressive = 3 + + +Testing +======= + +Test cases are in ``test/test_autopep8.py``. They can be run directly via +``python test/test_autopep8.py`` or via tox_. The latter is useful for +testing against multiple Python interpreters. (We currently test against +CPython versions 3.7, 3.8, 3.9 and 3.10. We also test against PyPy.) + +.. _`tox`: https://pypi.org/project/tox/ + +Broad spectrum testing is available via ``test/acid.py``. This script runs +autopep8 against Python code and checks for correctness and completeness of the +code fixes. It can check that the bytecode remains identical. +``test/acid_pypi.py`` makes use of ``acid.py`` to test against the latest +released packages on PyPI. + + +Troubleshooting +=============== + +``pkg_resources.DistributionNotFound`` +-------------------------------------- + +If you are using an ancient version of ``setuptools``, you might encounter +``pkg_resources.DistributionNotFound`` when trying to run ``autopep8``. Try +upgrading ``setuptools`` to workaround this ``setuptools`` problem:: + + $ pip install --upgrade setuptools + +Use ``sudo`` if you are installing to the system. + + +Links +===== + +* PyPI_ +* GitHub_ +* `Travis CI`_ +* Coveralls_ + +.. _PyPI: https://pypi.org/project/autopep8/ +.. _GitHub: https://github.com/hhatto/autopep8 +.. _`Travis CI`: https://travis-ci.org/hhatto/autopep8 +.. _`Coveralls`: https://coveralls.io/r/hhatto/autopep8 diff --git a/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/RECORD b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/RECORD new file mode 100644 index 00000000..4f7a208a --- /dev/null +++ b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/RECORD @@ -0,0 +1,12 @@ +../../../bin/autopep8,sha256=kASgTXagaDaKm6hNa55E5y800bn7BxtbjAOCP1CCbq4,211 +__pycache__/autopep8.cpython-310.pyc,, +autopep8-2.0.2.dist-info/AUTHORS.rst,sha256=tiTPsbzGl9dtXCMEWXbWSV1zan1M-BoWtiixs46GIWk,2003 +autopep8-2.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +autopep8-2.0.2.dist-info/LICENSE,sha256=jR0COOSFQ0QZFMqwdB1N4-Bwobg2f3h69fIJr7YLCWo,1181 +autopep8-2.0.2.dist-info/METADATA,sha256=QQGKbaNzesgwKoYJtqGOQe2xgMsbknKc__UVP8WCM5Y,16753 +autopep8-2.0.2.dist-info/RECORD,, +autopep8-2.0.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +autopep8-2.0.2.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110 +autopep8-2.0.2.dist-info/entry_points.txt,sha256=zEduLXzN3YzTTZBwxjhEKW7PVLqSqVG8-ocCaCR3P4A,43 +autopep8-2.0.2.dist-info/top_level.txt,sha256=s2x-di3QBwGxr7kd5xErt2pom8dsFRdINbmwsOEgLfU,9 +autopep8.py,sha256=NXLsph7X3O_afaGx0_kATNxa7RKSf_BgvcZ1aoV6aJA,155555 diff --git a/venv/lib/python3.10/site-packages/typing_extensions-3.10.0.2.dist-info/REQUESTED b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/REQUESTED similarity index 100% rename from venv/lib/python3.10/site-packages/typing_extensions-3.10.0.2.dist-info/REQUESTED rename to venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/REQUESTED diff --git a/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/WHEEL b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/WHEEL new file mode 120000 index 00000000..0d3db369 --- /dev/null +++ b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/WHEEL @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/6d/bd/8e/b7db1c7251ca30e2c310763a076b227163a0ba08c529a26c4fbbf0310a \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/entry_points.txt b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/entry_points.txt new file mode 120000 index 00000000..9504a7b4 --- /dev/null +++ b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/entry_points.txt @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/cc/47/6e/2d7ccddd8cd34d9070c63844296ecf54ba92a951bcfa87026824773f80 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/top_level.txt b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/top_level.txt new file mode 120000 index 00000000..f8bc10c6 --- /dev/null +++ b/venv/lib/python3.10/site-packages/autopep8-2.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/b3/6c/7e/762dd00701b1afb91de7112bb76a689bc76c15174835b9b0b0e1202df5 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/autopep8.py b/venv/lib/python3.10/site-packages/autopep8.py new file mode 100644 index 00000000..573f7acc --- /dev/null +++ b/venv/lib/python3.10/site-packages/autopep8.py @@ -0,0 +1,4570 @@ +#!/usr/bin/env python + +# Copyright (C) 2010-2011 Hideo Hattori +# Copyright (C) 2011-2013 Hideo Hattori, Steven Myint +# Copyright (C) 2013-2016 Hideo Hattori, Steven Myint, Bill Wendling +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# Copyright (C) 2006-2009 Johann C. Rocholl +# Copyright (C) 2009-2013 Florent Xicluna +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""Automatically formats Python code to conform to the PEP 8 style guide. + +Fixes that only need be done once can be added by adding a function of the form +"fix_(source)" to this module. They should return the fixed source code. +These fixes are picked up by apply_global_fixes(). + +Fixes that depend on pycodestyle should be added as methods to FixPEP8. See the +class documentation for more information. + +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +import argparse +import codecs +import collections +import copy +import difflib +import fnmatch +import inspect +import io +import itertools +import keyword +import locale +import os +import re +import signal +import sys +import textwrap +import token +import tokenize +import warnings +import ast +from configparser import ConfigParser as SafeConfigParser, Error + +import pycodestyle +from pycodestyle import STARTSWITH_INDENT_STATEMENT_REGEX + + +__version__ = '2.0.2' + + +CR = '\r' +LF = '\n' +CRLF = '\r\n' + + +PYTHON_SHEBANG_REGEX = re.compile(r'^#!.*\bpython[23]?\b\s*$') +LAMBDA_REGEX = re.compile(r'([\w.]+)\s=\slambda\s*([)(=\w,\s.]*):') +COMPARE_NEGATIVE_REGEX = re.compile(r'\b(not)\s+([^][)(}{]+?)\s+(in|is)\s') +COMPARE_NEGATIVE_REGEX_THROUGH = re.compile(r'\b(not\s+in|is\s+not)\s') +BARE_EXCEPT_REGEX = re.compile(r'except\s*:') +STARTSWITH_DEF_REGEX = re.compile(r'^(async\s+def|def)\s.*\):') +DOCSTRING_START_REGEX = re.compile(r'^u?r?(?P["\']{3})') +ENABLE_REGEX = re.compile(r'# *(fmt|autopep8): *on') +DISABLE_REGEX = re.compile(r'# *(fmt|autopep8): *off') + +EXIT_CODE_OK = 0 +EXIT_CODE_ERROR = 1 +EXIT_CODE_EXISTS_DIFF = 2 +EXIT_CODE_ARGPARSE_ERROR = 99 + +# For generating line shortening candidates. +SHORTEN_OPERATOR_GROUPS = frozenset([ + frozenset([',']), + frozenset(['%']), + frozenset([',', '(', '[', '{']), + frozenset(['%', '(', '[', '{']), + frozenset([',', '(', '[', '{', '%', '+', '-', '*', '/', '//']), + frozenset(['%', '+', '-', '*', '/', '//']), +]) + + +DEFAULT_IGNORE = 'E226,E24,W50,W690' # TODO: use pycodestyle.DEFAULT_IGNORE +DEFAULT_INDENT_SIZE = 4 +# these fixes conflict with each other, if the `--ignore` setting causes both +# to be enabled, disable both of them +CONFLICTING_CODES = ('W503', 'W504') + +# W602 is handled separately due to the need to avoid "with_traceback". +CODE_TO_2TO3 = { + 'E231': ['ws_comma'], + 'E721': ['idioms'], + 'W690': ['apply', + 'except', + 'exitfunc', + 'numliterals', + 'operator', + 'paren', + 'reduce', + 'renames', + 'standarderror', + 'sys_exc', + 'throw', + 'tuple_params', + 'xreadlines']} + + +if sys.platform == 'win32': # pragma: no cover + DEFAULT_CONFIG = os.path.expanduser(r'~\.pycodestyle') +else: + DEFAULT_CONFIG = os.path.join(os.getenv('XDG_CONFIG_HOME') or + os.path.expanduser('~/.config'), + 'pycodestyle') +# fallback, use .pep8 +if not os.path.exists(DEFAULT_CONFIG): # pragma: no cover + if sys.platform == 'win32': + DEFAULT_CONFIG = os.path.expanduser(r'~\.pep8') + else: + DEFAULT_CONFIG = os.path.join(os.path.expanduser('~/.config'), 'pep8') +PROJECT_CONFIG = ('setup.cfg', 'tox.ini', '.pep8', '.flake8') + + +MAX_PYTHON_FILE_DETECTION_BYTES = 1024 + + +def open_with_encoding(filename, mode='r', encoding=None, limit_byte_check=-1): + """Return opened file with a specific encoding.""" + if not encoding: + encoding = detect_encoding(filename, limit_byte_check=limit_byte_check) + + return io.open(filename, mode=mode, encoding=encoding, + newline='') # Preserve line endings + + +def detect_encoding(filename, limit_byte_check=-1): + """Return file encoding.""" + try: + with open(filename, 'rb') as input_file: + from lib2to3.pgen2 import tokenize as lib2to3_tokenize + encoding = lib2to3_tokenize.detect_encoding(input_file.readline)[0] + + with open_with_encoding(filename, encoding=encoding) as test_file: + test_file.read(limit_byte_check) + + return encoding + except (LookupError, SyntaxError, UnicodeDecodeError): + return 'latin-1' + + +def readlines_from_file(filename): + """Return contents of file.""" + with open_with_encoding(filename) as input_file: + return input_file.readlines() + + +def extended_blank_lines(logical_line, + blank_lines, + blank_before, + indent_level, + previous_logical): + """Check for missing blank lines after class declaration.""" + if previous_logical.startswith('def '): + if blank_lines and pycodestyle.DOCSTRING_REGEX.match(logical_line): + yield (0, 'E303 too many blank lines ({})'.format(blank_lines)) + elif pycodestyle.DOCSTRING_REGEX.match(previous_logical): + # Missing blank line between class docstring and method declaration. + if ( + indent_level and + not blank_lines and + not blank_before and + logical_line.startswith(('def ')) and + '(self' in logical_line + ): + yield (0, 'E301 expected 1 blank line, found 0') + + +pycodestyle.register_check(extended_blank_lines) + + +def continued_indentation(logical_line, tokens, indent_level, hang_closing, + indent_char, noqa): + """Override pycodestyle's function to provide indentation information.""" + first_row = tokens[0][2][0] + nrows = 1 + tokens[-1][2][0] - first_row + if noqa or nrows == 1: + return + + # indent_next tells us whether the next block is indented. Assuming + # that it is indented by 4 spaces, then we should not allow 4-space + # indents on the final continuation line. In turn, some other + # indents are allowed to have an extra 4 spaces. + indent_next = logical_line.endswith(':') + + row = depth = 0 + valid_hangs = ( + (DEFAULT_INDENT_SIZE,) + if indent_char != '\t' else (DEFAULT_INDENT_SIZE, + 2 * DEFAULT_INDENT_SIZE) + ) + + # Remember how many brackets were opened on each line. + parens = [0] * nrows + + # Relative indents of physical lines. + rel_indent = [0] * nrows + + # For each depth, collect a list of opening rows. + open_rows = [[0]] + # For each depth, memorize the hanging indentation. + hangs = [None] + + # Visual indents. + indent_chances = {} + last_indent = tokens[0][2] + indent = [last_indent[1]] + + last_token_multiline = None + line = None + last_line = '' + last_line_begins_with_multiline = False + for token_type, text, start, end, line in tokens: + + newline = row < start[0] - first_row + if newline: + row = start[0] - first_row + newline = (not last_token_multiline and + token_type not in (tokenize.NL, tokenize.NEWLINE)) + last_line_begins_with_multiline = last_token_multiline + + if newline: + # This is the beginning of a continuation line. + last_indent = start + + # Record the initial indent. + rel_indent[row] = pycodestyle.expand_indent(line) - indent_level + + # Identify closing bracket. + close_bracket = (token_type == tokenize.OP and text in ']})') + + # Is the indent relative to an opening bracket line? + for open_row in reversed(open_rows[depth]): + hang = rel_indent[row] - rel_indent[open_row] + hanging_indent = hang in valid_hangs + if hanging_indent: + break + if hangs[depth]: + hanging_indent = (hang == hangs[depth]) + + visual_indent = (not close_bracket and hang > 0 and + indent_chances.get(start[1])) + + if close_bracket and indent[depth]: + # Closing bracket for visual indent. + if start[1] != indent[depth]: + yield (start, 'E124 {}'.format(indent[depth])) + elif close_bracket and not hang: + # closing bracket matches indentation of opening bracket's line + if hang_closing: + yield (start, 'E133 {}'.format(indent[depth])) + elif indent[depth] and start[1] < indent[depth]: + if visual_indent is not True: + # Visual indent is broken. + yield (start, 'E128 {}'.format(indent[depth])) + elif (hanging_indent or + (indent_next and + rel_indent[row] == 2 * DEFAULT_INDENT_SIZE)): + # Hanging indent is verified. + if close_bracket and not hang_closing: + yield (start, 'E123 {}'.format(indent_level + + rel_indent[open_row])) + hangs[depth] = hang + elif visual_indent is True: + # Visual indent is verified. + indent[depth] = start[1] + elif visual_indent in (text, str): + # Ignore token lined up with matching one from a previous line. + pass + else: + one_indented = (indent_level + rel_indent[open_row] + + DEFAULT_INDENT_SIZE) + # Indent is broken. + if hang <= 0: + error = ('E122', one_indented) + elif indent[depth]: + error = ('E127', indent[depth]) + elif not close_bracket and hangs[depth]: + error = ('E131', one_indented) + elif hang > DEFAULT_INDENT_SIZE: + error = ('E126', one_indented) + else: + hangs[depth] = hang + error = ('E121', one_indented) + + yield (start, '{} {}'.format(*error)) + + # Look for visual indenting. + if ( + parens[row] and + token_type not in (tokenize.NL, tokenize.COMMENT) and + not indent[depth] + ): + indent[depth] = start[1] + indent_chances[start[1]] = True + # Deal with implicit string concatenation. + elif (token_type in (tokenize.STRING, tokenize.COMMENT) or + text in ('u', 'ur', 'b', 'br')): + indent_chances[start[1]] = str + # Special case for the "if" statement because len("if (") is equal to + # 4. + elif not indent_chances and not row and not depth and text == 'if': + indent_chances[end[1] + 1] = True + elif text == ':' and line[end[1]:].isspace(): + open_rows[depth].append(row) + + # Keep track of bracket depth. + if token_type == tokenize.OP: + if text in '([{': + depth += 1 + indent.append(0) + hangs.append(None) + if len(open_rows) == depth: + open_rows.append([]) + open_rows[depth].append(row) + parens[row] += 1 + elif text in ')]}' and depth > 0: + # Parent indents should not be more than this one. + prev_indent = indent.pop() or last_indent[1] + hangs.pop() + for d in range(depth): + if indent[d] > prev_indent: + indent[d] = 0 + for ind in list(indent_chances): + if ind >= prev_indent: + del indent_chances[ind] + del open_rows[depth + 1:] + depth -= 1 + if depth: + indent_chances[indent[depth]] = True + for idx in range(row, -1, -1): + if parens[idx]: + parens[idx] -= 1 + break + assert len(indent) == depth + 1 + if ( + start[1] not in indent_chances and + # This is for purposes of speeding up E121 (GitHub #90). + not last_line.rstrip().endswith(',') + ): + # Allow to line up tokens. + indent_chances[start[1]] = text + + last_token_multiline = (start[0] != end[0]) + if last_token_multiline: + rel_indent[end[0] - first_row] = rel_indent[row] + + last_line = line + + if ( + indent_next and + not last_line_begins_with_multiline and + pycodestyle.expand_indent(line) == indent_level + DEFAULT_INDENT_SIZE + ): + pos = (start[0], indent[0] + 4) + desired_indent = indent_level + 2 * DEFAULT_INDENT_SIZE + if visual_indent: + yield (pos, 'E129 {}'.format(desired_indent)) + else: + yield (pos, 'E125 {}'.format(desired_indent)) + + +del pycodestyle._checks['logical_line'][pycodestyle.continued_indentation] +pycodestyle.register_check(continued_indentation) + + +class FixPEP8(object): + + """Fix invalid code. + + Fixer methods are prefixed "fix_". The _fix_source() method looks for these + automatically. + + The fixer method can take either one or two arguments (in addition to + self). The first argument is "result", which is the error information from + pycodestyle. The second argument, "logical", is required only for + logical-line fixes. + + The fixer method can return the list of modified lines or None. An empty + list would mean that no changes were made. None would mean that only the + line reported in the pycodestyle error was modified. Note that the modified + line numbers that are returned are indexed at 1. This typically would + correspond with the line number reported in the pycodestyle error + information. + + [fixed method list] + - e111,e114,e115,e116 + - e121,e122,e123,e124,e125,e126,e127,e128,e129 + - e201,e202,e203 + - e211 + - e221,e222,e223,e224,e225 + - e231 + - e251,e252 + - e261,e262 + - e271,e272,e273,e274,e275 + - e301,e302,e303,e304,e305,e306 + - e401,e402 + - e502 + - e701,e702,e703,e704 + - e711,e712,e713,e714 + - e722 + - e731 + - w291 + - w503,504 + + """ + + def __init__(self, filename, + options, + contents=None, + long_line_ignore_cache=None): + self.filename = filename + if contents is None: + self.source = readlines_from_file(filename) + else: + sio = io.StringIO(contents) + self.source = sio.readlines() + self.options = options + self.indent_word = _get_indentword(''.join(self.source)) + + # collect imports line + self.imports = {} + for i, line in enumerate(self.source): + if (line.find("import ") == 0 or line.find("from ") == 0) and \ + line not in self.imports: + # collect only import statements that first appeared + self.imports[line] = i + + self.long_line_ignore_cache = ( + set() if long_line_ignore_cache is None + else long_line_ignore_cache) + + # Many fixers are the same even though pycodestyle categorizes them + # differently. + self.fix_e115 = self.fix_e112 + self.fix_e121 = self._fix_reindent + self.fix_e122 = self._fix_reindent + self.fix_e123 = self._fix_reindent + self.fix_e124 = self._fix_reindent + self.fix_e126 = self._fix_reindent + self.fix_e127 = self._fix_reindent + self.fix_e128 = self._fix_reindent + self.fix_e129 = self._fix_reindent + self.fix_e133 = self.fix_e131 + self.fix_e202 = self.fix_e201 + self.fix_e203 = self.fix_e201 + self.fix_e211 = self.fix_e201 + self.fix_e221 = self.fix_e271 + self.fix_e222 = self.fix_e271 + self.fix_e223 = self.fix_e271 + self.fix_e226 = self.fix_e225 + self.fix_e227 = self.fix_e225 + self.fix_e228 = self.fix_e225 + self.fix_e241 = self.fix_e271 + self.fix_e242 = self.fix_e224 + self.fix_e252 = self.fix_e225 + self.fix_e261 = self.fix_e262 + self.fix_e272 = self.fix_e271 + self.fix_e273 = self.fix_e271 + self.fix_e274 = self.fix_e271 + self.fix_e275 = self.fix_e271 + self.fix_e306 = self.fix_e301 + self.fix_e501 = ( + self.fix_long_line_logically if + options and (options.aggressive >= 2 or options.experimental) else + self.fix_long_line_physically) + self.fix_e703 = self.fix_e702 + self.fix_w292 = self.fix_w291 + self.fix_w293 = self.fix_w291 + + def _fix_source(self, results): + try: + (logical_start, logical_end) = _find_logical(self.source) + logical_support = True + except (SyntaxError, tokenize.TokenError): # pragma: no cover + logical_support = False + + completed_lines = set() + for result in sorted(results, key=_priority_key): + if result['line'] in completed_lines: + continue + + fixed_methodname = 'fix_' + result['id'].lower() + if hasattr(self, fixed_methodname): + fix = getattr(self, fixed_methodname) + + line_index = result['line'] - 1 + original_line = self.source[line_index] + + is_logical_fix = len(_get_parameters(fix)) > 2 + if is_logical_fix: + logical = None + if logical_support: + logical = _get_logical(self.source, + result, + logical_start, + logical_end) + if logical and set(range( + logical[0][0] + 1, + logical[1][0] + 1)).intersection( + completed_lines): + continue + + modified_lines = fix(result, logical) + else: + modified_lines = fix(result) + + if modified_lines is None: + # Force logical fixes to report what they modified. + assert not is_logical_fix + + if self.source[line_index] == original_line: + modified_lines = [] + + if modified_lines: + completed_lines.update(modified_lines) + elif modified_lines == []: # Empty list means no fix + if self.options.verbose >= 2: + print( + '---> Not fixing {error} on line {line}'.format( + error=result['id'], line=result['line']), + file=sys.stderr) + else: # We assume one-line fix when None. + completed_lines.add(result['line']) + else: + if self.options.verbose >= 3: + print( + "---> '{}' is not defined.".format(fixed_methodname), + file=sys.stderr) + + info = result['info'].strip() + print('---> {}:{}:{}:{}'.format(self.filename, + result['line'], + result['column'], + info), + file=sys.stderr) + + def fix(self): + """Return a version of the source code with PEP 8 violations fixed.""" + pep8_options = { + 'ignore': self.options.ignore, + 'select': self.options.select, + 'max_line_length': self.options.max_line_length, + 'hang_closing': self.options.hang_closing, + } + results = _execute_pep8(pep8_options, self.source) + + if self.options.verbose: + progress = {} + for r in results: + if r['id'] not in progress: + progress[r['id']] = set() + progress[r['id']].add(r['line']) + print('---> {n} issue(s) to fix {progress}'.format( + n=len(results), progress=progress), file=sys.stderr) + + if self.options.line_range: + start, end = self.options.line_range + results = [r for r in results + if start <= r['line'] <= end] + + self._fix_source(filter_results(source=''.join(self.source), + results=results, + aggressive=self.options.aggressive)) + + if self.options.line_range: + # If number of lines has changed then change line_range. + count = sum(sline.count('\n') + for sline in self.source[start - 1:end]) + self.options.line_range[1] = start + count - 1 + + return ''.join(self.source) + + def _fix_reindent(self, result): + """Fix a badly indented line. + + This is done by adding or removing from its initial indent only. + + """ + num_indent_spaces = int(result['info'].split()[1]) + line_index = result['line'] - 1 + target = self.source[line_index] + + self.source[line_index] = ' ' * num_indent_spaces + target.lstrip() + + def fix_e112(self, result): + """Fix under-indented comments.""" + line_index = result['line'] - 1 + target = self.source[line_index] + + if not target.lstrip().startswith('#'): + # Don't screw with invalid syntax. + return [] + + self.source[line_index] = self.indent_word + target + + def fix_e113(self, result): + """Fix unexpected indentation.""" + line_index = result['line'] - 1 + target = self.source[line_index] + indent = _get_indentation(target) + stripped = target.lstrip() + self.source[line_index] = indent[1:] + stripped + + def fix_e116(self, result): + """Fix over-indented comments.""" + line_index = result['line'] - 1 + target = self.source[line_index] + + indent = _get_indentation(target) + stripped = target.lstrip() + + if not stripped.startswith('#'): + # Don't screw with invalid syntax. + return [] + + self.source[line_index] = indent[1:] + stripped + + def fix_e117(self, result): + """Fix over-indented.""" + line_index = result['line'] - 1 + target = self.source[line_index] + + indent = _get_indentation(target) + if indent == '\t': + return [] + + stripped = target.lstrip() + + self.source[line_index] = indent[1:] + stripped + + def fix_e125(self, result): + """Fix indentation undistinguish from the next logical line.""" + num_indent_spaces = int(result['info'].split()[1]) + line_index = result['line'] - 1 + target = self.source[line_index] + + spaces_to_add = num_indent_spaces - len(_get_indentation(target)) + indent = len(_get_indentation(target)) + modified_lines = [] + + while len(_get_indentation(self.source[line_index])) >= indent: + self.source[line_index] = (' ' * spaces_to_add + + self.source[line_index]) + modified_lines.append(1 + line_index) # Line indexed at 1. + line_index -= 1 + + return modified_lines + + def fix_e131(self, result): + """Fix indentation undistinguish from the next logical line.""" + num_indent_spaces = int(result['info'].split()[1]) + line_index = result['line'] - 1 + target = self.source[line_index] + + spaces_to_add = num_indent_spaces - len(_get_indentation(target)) + + indent_length = len(_get_indentation(target)) + spaces_to_add = num_indent_spaces - indent_length + if num_indent_spaces == 0 and indent_length == 0: + spaces_to_add = 4 + + if spaces_to_add >= 0: + self.source[line_index] = (' ' * spaces_to_add + + self.source[line_index]) + else: + offset = abs(spaces_to_add) + self.source[line_index] = self.source[line_index][offset:] + + def fix_e201(self, result): + """Remove extraneous whitespace.""" + line_index = result['line'] - 1 + target = self.source[line_index] + offset = result['column'] - 1 + + fixed = fix_whitespace(target, + offset=offset, + replacement='') + + self.source[line_index] = fixed + + def fix_e224(self, result): + """Remove extraneous whitespace around operator.""" + target = self.source[result['line'] - 1] + offset = result['column'] - 1 + fixed = target[:offset] + target[offset:].replace('\t', ' ') + self.source[result['line'] - 1] = fixed + + def fix_e225(self, result): + """Fix missing whitespace around operator.""" + target = self.source[result['line'] - 1] + offset = result['column'] - 1 + fixed = target[:offset] + ' ' + target[offset:] + + # Only proceed if non-whitespace characters match. + # And make sure we don't break the indentation. + if ( + fixed.replace(' ', '') == target.replace(' ', '') and + _get_indentation(fixed) == _get_indentation(target) + ): + self.source[result['line'] - 1] = fixed + error_code = result.get('id', 0) + try: + ts = generate_tokens(fixed) + except (SyntaxError, tokenize.TokenError): + return + if not check_syntax(fixed.lstrip()): + return + errors = list( + pycodestyle.missing_whitespace_around_operator(fixed, ts)) + for e in reversed(errors): + if error_code != e[1].split()[0]: + continue + offset = e[0][1] + fixed = fixed[:offset] + ' ' + fixed[offset:] + self.source[result['line'] - 1] = fixed + else: + return [] + + def fix_e231(self, result): + """Add missing whitespace.""" + line_index = result['line'] - 1 + target = self.source[line_index] + offset = result['column'] + fixed = target[:offset].rstrip() + ' ' + target[offset:].lstrip() + self.source[line_index] = fixed + + def fix_e251(self, result): + """Remove whitespace around parameter '=' sign.""" + line_index = result['line'] - 1 + target = self.source[line_index] + + # This is necessary since pycodestyle sometimes reports columns that + # goes past the end of the physical line. This happens in cases like, + # foo(bar\n=None) + c = min(result['column'] - 1, + len(target) - 1) + + if target[c].strip(): + fixed = target + else: + fixed = target[:c].rstrip() + target[c:].lstrip() + + # There could be an escaped newline + # + # def foo(a=\ + # 1) + if fixed.endswith(('=\\\n', '=\\\r\n', '=\\\r')): + self.source[line_index] = fixed.rstrip('\n\r \t\\') + self.source[line_index + 1] = self.source[line_index + 1].lstrip() + return [line_index + 1, line_index + 2] # Line indexed at 1 + + self.source[result['line'] - 1] = fixed + + def fix_e262(self, result): + """Fix spacing after inline comment hash.""" + target = self.source[result['line'] - 1] + offset = result['column'] + + code = target[:offset].rstrip(' \t#') + comment = target[offset:].lstrip(' \t#') + + fixed = code + (' # ' + comment if comment.strip() else '\n') + + self.source[result['line'] - 1] = fixed + + def fix_e265(self, result): + """Fix spacing after block comment hash.""" + target = self.source[result['line'] - 1] + + indent = _get_indentation(target) + line = target.lstrip(' \t') + pos = next((index for index, c in enumerate(line) if c != '#')) + hashes = line[:pos] + comment = line[pos:].lstrip(' \t') + + # Ignore special comments, even in the middle of the file. + if comment.startswith('!'): + return + + fixed = indent + hashes + (' ' + comment if comment.strip() else '\n') + + self.source[result['line'] - 1] = fixed + + def fix_e266(self, result): + """Fix too many block comment hashes.""" + target = self.source[result['line'] - 1] + + # Leave stylistic outlined blocks alone. + if target.strip().endswith('#'): + return + + indentation = _get_indentation(target) + fixed = indentation + '# ' + target.lstrip('# \t') + + self.source[result['line'] - 1] = fixed + + def fix_e271(self, result): + """Fix extraneous whitespace around keywords.""" + line_index = result['line'] - 1 + target = self.source[line_index] + offset = result['column'] - 1 + + fixed = fix_whitespace(target, + offset=offset, + replacement=' ') + + if fixed == target: + return [] + else: + self.source[line_index] = fixed + + def fix_e301(self, result): + """Add missing blank line.""" + cr = '\n' + self.source[result['line'] - 1] = cr + self.source[result['line'] - 1] + + def fix_e302(self, result): + """Add missing 2 blank lines.""" + add_linenum = 2 - int(result['info'].split()[-1]) + offset = 1 + if self.source[result['line'] - 2].strip() == "\\": + offset = 2 + cr = '\n' * add_linenum + self.source[result['line'] - offset] = ( + cr + self.source[result['line'] - offset] + ) + + def fix_e303(self, result): + """Remove extra blank lines.""" + delete_linenum = int(result['info'].split('(')[1].split(')')[0]) - 2 + delete_linenum = max(1, delete_linenum) + + # We need to count because pycodestyle reports an offset line number if + # there are comments. + cnt = 0 + line = result['line'] - 2 + modified_lines = [] + while cnt < delete_linenum and line >= 0: + if not self.source[line].strip(): + self.source[line] = '' + modified_lines.append(1 + line) # Line indexed at 1 + cnt += 1 + line -= 1 + + return modified_lines + + def fix_e304(self, result): + """Remove blank line following function decorator.""" + line = result['line'] - 2 + if not self.source[line].strip(): + self.source[line] = '' + + def fix_e305(self, result): + """Add missing 2 blank lines after end of function or class.""" + add_delete_linenum = 2 - int(result['info'].split()[-1]) + cnt = 0 + offset = result['line'] - 2 + modified_lines = [] + if add_delete_linenum < 0: + # delete cr + add_delete_linenum = abs(add_delete_linenum) + while cnt < add_delete_linenum and offset >= 0: + if not self.source[offset].strip(): + self.source[offset] = '' + modified_lines.append(1 + offset) # Line indexed at 1 + cnt += 1 + offset -= 1 + else: + # add cr + cr = '\n' + # check comment line + while True: + if offset < 0: + break + line = self.source[offset].lstrip() + if not line: + break + if line[0] != '#': + break + offset -= 1 + offset += 1 + self.source[offset] = cr + self.source[offset] + modified_lines.append(1 + offset) # Line indexed at 1. + return modified_lines + + def fix_e401(self, result): + """Put imports on separate lines.""" + line_index = result['line'] - 1 + target = self.source[line_index] + offset = result['column'] - 1 + + if not target.lstrip().startswith('import'): + return [] + + indentation = re.split(pattern=r'\bimport\b', + string=target, maxsplit=1)[0] + fixed = (target[:offset].rstrip('\t ,') + '\n' + + indentation + 'import ' + target[offset:].lstrip('\t ,')) + self.source[line_index] = fixed + + def fix_e402(self, result): + (line_index, offset, target) = get_index_offset_contents(result, + self.source) + for i in range(1, 100): + line = "".join(self.source[line_index:line_index+i]) + try: + generate_tokens("".join(line)) + except (SyntaxError, tokenize.TokenError): + continue + break + if not (target in self.imports and self.imports[target] != line_index): + mod_offset = get_module_imports_on_top_of_file(self.source, + line_index) + self.source[mod_offset] = line + self.source[mod_offset] + for offset in range(i): + self.source[line_index+offset] = '' + + def fix_long_line_logically(self, result, logical): + """Try to make lines fit within --max-line-length characters.""" + if ( + not logical or + len(logical[2]) == 1 or + self.source[result['line'] - 1].lstrip().startswith('#') + ): + return self.fix_long_line_physically(result) + + start_line_index = logical[0][0] + end_line_index = logical[1][0] + logical_lines = logical[2] + + previous_line = get_item(self.source, start_line_index - 1, default='') + next_line = get_item(self.source, end_line_index + 1, default='') + + single_line = join_logical_line(''.join(logical_lines)) + + try: + fixed = self.fix_long_line( + target=single_line, + previous_line=previous_line, + next_line=next_line, + original=''.join(logical_lines)) + except (SyntaxError, tokenize.TokenError): + return self.fix_long_line_physically(result) + + if fixed: + for line_index in range(start_line_index, end_line_index + 1): + self.source[line_index] = '' + self.source[start_line_index] = fixed + return range(start_line_index + 1, end_line_index + 1) + + return [] + + def fix_long_line_physically(self, result): + """Try to make lines fit within --max-line-length characters.""" + line_index = result['line'] - 1 + target = self.source[line_index] + + previous_line = get_item(self.source, line_index - 1, default='') + next_line = get_item(self.source, line_index + 1, default='') + + try: + fixed = self.fix_long_line( + target=target, + previous_line=previous_line, + next_line=next_line, + original=target) + except (SyntaxError, tokenize.TokenError): + return [] + + if fixed: + self.source[line_index] = fixed + return [line_index + 1] + + return [] + + def fix_long_line(self, target, previous_line, + next_line, original): + cache_entry = (target, previous_line, next_line) + if cache_entry in self.long_line_ignore_cache: + return [] + + if target.lstrip().startswith('#'): + if self.options.aggressive: + # Wrap commented lines. + return shorten_comment( + line=target, + max_line_length=self.options.max_line_length, + last_comment=not next_line.lstrip().startswith('#')) + return [] + + fixed = get_fixed_long_line( + target=target, + previous_line=previous_line, + original=original, + indent_word=self.indent_word, + max_line_length=self.options.max_line_length, + aggressive=self.options.aggressive, + experimental=self.options.experimental, + verbose=self.options.verbose) + + if fixed and not code_almost_equal(original, fixed): + return fixed + + self.long_line_ignore_cache.add(cache_entry) + return None + + def fix_e502(self, result): + """Remove extraneous escape of newline.""" + (line_index, _, target) = get_index_offset_contents(result, + self.source) + self.source[line_index] = target.rstrip('\n\r \t\\') + '\n' + + def fix_e701(self, result): + """Put colon-separated compound statement on separate lines.""" + line_index = result['line'] - 1 + target = self.source[line_index] + c = result['column'] + + fixed_source = (target[:c] + '\n' + + _get_indentation(target) + self.indent_word + + target[c:].lstrip('\n\r \t\\')) + self.source[result['line'] - 1] = fixed_source + return [result['line'], result['line'] + 1] + + def fix_e702(self, result, logical): + """Put semicolon-separated compound statement on separate lines.""" + if not logical: + return [] # pragma: no cover + logical_lines = logical[2] + + # Avoid applying this when indented. + # https://docs.python.org/reference/compound_stmts.html + for line in logical_lines: + if (result['id'] == 'E702' and ':' in line + and STARTSWITH_INDENT_STATEMENT_REGEX.match(line)): + if self.options.verbose: + print( + '---> avoid fixing {error} with ' + 'other compound statements'.format(error=result['id']), + file=sys.stderr + ) + return [] + + line_index = result['line'] - 1 + target = self.source[line_index] + + if target.rstrip().endswith('\\'): + # Normalize '1; \\\n2' into '1; 2'. + self.source[line_index] = target.rstrip('\n \r\t\\') + self.source[line_index + 1] = self.source[line_index + 1].lstrip() + return [line_index + 1, line_index + 2] + + if target.rstrip().endswith(';'): + self.source[line_index] = target.rstrip('\n \r\t;') + '\n' + return [line_index + 1] + + offset = result['column'] - 1 + first = target[:offset].rstrip(';').rstrip() + second = (_get_indentation(logical_lines[0]) + + target[offset:].lstrip(';').lstrip()) + + # Find inline comment. + inline_comment = None + if target[offset:].lstrip(';').lstrip()[:2] == '# ': + inline_comment = target[offset:].lstrip(';') + + if inline_comment: + self.source[line_index] = first + inline_comment + else: + self.source[line_index] = first + '\n' + second + return [line_index + 1] + + def fix_e704(self, result): + """Fix multiple statements on one line def""" + (line_index, _, target) = get_index_offset_contents(result, + self.source) + match = STARTSWITH_DEF_REGEX.match(target) + if match: + self.source[line_index] = '{}\n{}{}'.format( + match.group(0), + _get_indentation(target) + self.indent_word, + target[match.end(0):].lstrip()) + + def fix_e711(self, result): + """Fix comparison with None.""" + (line_index, offset, target) = get_index_offset_contents(result, + self.source) + + right_offset = offset + 2 + if right_offset >= len(target): + return [] + + left = target[:offset].rstrip() + center = target[offset:right_offset] + right = target[right_offset:].lstrip() + + if center.strip() == '==': + new_center = 'is' + elif center.strip() == '!=': + new_center = 'is not' + else: + return [] + + self.source[line_index] = ' '.join([left, new_center, right]) + + def fix_e712(self, result): + """Fix (trivial case of) comparison with boolean.""" + (line_index, offset, target) = get_index_offset_contents(result, + self.source) + + # Handle very easy "not" special cases. + if re.match(r'^\s*if [\w."\'\[\]]+ == False:$', target): + self.source[line_index] = re.sub(r'if ([\w."\'\[\]]+) == False:', + r'if not \1:', target, count=1) + elif re.match(r'^\s*if [\w."\'\[\]]+ != True:$', target): + self.source[line_index] = re.sub(r'if ([\w."\'\[\]]+) != True:', + r'if not \1:', target, count=1) + else: + right_offset = offset + 2 + if right_offset >= len(target): + return [] + + left = target[:offset].rstrip() + center = target[offset:right_offset] + right = target[right_offset:].lstrip() + + # Handle simple cases only. + new_right = None + if center.strip() == '==': + if re.match(r'\bTrue\b', right): + new_right = re.sub(r'\bTrue\b *', '', right, count=1) + elif center.strip() == '!=': + if re.match(r'\bFalse\b', right): + new_right = re.sub(r'\bFalse\b *', '', right, count=1) + + if new_right is None: + return [] + + if new_right[0].isalnum(): + new_right = ' ' + new_right + + self.source[line_index] = left + new_right + + def fix_e713(self, result): + """Fix (trivial case of) non-membership check.""" + (line_index, offset, target) = get_index_offset_contents(result, + self.source) + + # to convert once 'not in' -> 'in' + before_target = target[:offset] + target = target[offset:] + match_notin = COMPARE_NEGATIVE_REGEX_THROUGH.search(target) + notin_pos_start, notin_pos_end = 0, 0 + if match_notin: + notin_pos_start = match_notin.start(1) + notin_pos_end = match_notin.end() + target = '{}{} {}'.format( + target[:notin_pos_start], 'in', target[notin_pos_end:]) + + # fix 'not in' + match = COMPARE_NEGATIVE_REGEX.search(target) + if match: + if match.group(3) == 'in': + pos_start = match.start(1) + new_target = '{5}{0}{1} {2} {3} {4}'.format( + target[:pos_start], match.group(2), match.group(1), + match.group(3), target[match.end():], before_target) + if match_notin: + # revert 'in' -> 'not in' + pos_start = notin_pos_start + offset + pos_end = notin_pos_end + offset - 4 # len('not ') + new_target = '{}{} {}'.format( + new_target[:pos_start], 'not in', new_target[pos_end:]) + self.source[line_index] = new_target + + def fix_e714(self, result): + """Fix object identity should be 'is not' case.""" + (line_index, offset, target) = get_index_offset_contents(result, + self.source) + + # to convert once 'is not' -> 'is' + before_target = target[:offset] + target = target[offset:] + match_isnot = COMPARE_NEGATIVE_REGEX_THROUGH.search(target) + isnot_pos_start, isnot_pos_end = 0, 0 + if match_isnot: + isnot_pos_start = match_isnot.start(1) + isnot_pos_end = match_isnot.end() + target = '{}{} {}'.format( + target[:isnot_pos_start], 'in', target[isnot_pos_end:]) + + match = COMPARE_NEGATIVE_REGEX.search(target) + if match: + if match.group(3).startswith('is'): + pos_start = match.start(1) + new_target = '{5}{0}{1} {2} {3} {4}'.format( + target[:pos_start], match.group(2), match.group(3), + match.group(1), target[match.end():], before_target) + if match_isnot: + # revert 'is' -> 'is not' + pos_start = isnot_pos_start + offset + pos_end = isnot_pos_end + offset - 4 # len('not ') + new_target = '{}{} {}'.format( + new_target[:pos_start], 'is not', new_target[pos_end:]) + self.source[line_index] = new_target + + def fix_e722(self, result): + """fix bare except""" + (line_index, _, target) = get_index_offset_contents(result, + self.source) + match = BARE_EXCEPT_REGEX.search(target) + if match: + self.source[line_index] = '{}{}{}'.format( + target[:result['column'] - 1], "except BaseException:", + target[match.end():]) + + def fix_e731(self, result): + """Fix do not assign a lambda expression check.""" + (line_index, _, target) = get_index_offset_contents(result, + self.source) + match = LAMBDA_REGEX.search(target) + if match: + end = match.end() + self.source[line_index] = '{}def {}({}): return {}'.format( + target[:match.start(0)], match.group(1), match.group(2), + target[end:].lstrip()) + + def fix_w291(self, result): + """Remove trailing whitespace.""" + fixed_line = self.source[result['line'] - 1].rstrip() + self.source[result['line'] - 1] = fixed_line + '\n' + + def fix_w391(self, _): + """Remove trailing blank lines.""" + blank_count = 0 + for line in reversed(self.source): + line = line.rstrip() + if line: + break + else: + blank_count += 1 + + original_length = len(self.source) + self.source = self.source[:original_length - blank_count] + return range(1, 1 + original_length) + + def fix_w503(self, result): + (line_index, _, target) = get_index_offset_contents(result, + self.source) + one_string_token = target.split()[0] + try: + ts = generate_tokens(one_string_token) + except (SyntaxError, tokenize.TokenError): + return + if not _is_binary_operator(ts[0][0], one_string_token): + return + # find comment + comment_index = 0 + found_not_comment_only_line = False + comment_only_linenum = 0 + for i in range(5): + # NOTE: try to parse code in 5 times + if (line_index - i) < 0: + break + from_index = line_index - i - 1 + if from_index < 0 or len(self.source) <= from_index: + break + to_index = line_index + 1 + strip_line = self.source[from_index].lstrip() + if ( + not found_not_comment_only_line and + strip_line and strip_line[0] == '#' + ): + comment_only_linenum += 1 + continue + found_not_comment_only_line = True + try: + ts = generate_tokens("".join(self.source[from_index:to_index])) + except (SyntaxError, tokenize.TokenError): + continue + newline_count = 0 + newline_index = [] + for index, t in enumerate(ts): + if t[0] in (tokenize.NEWLINE, tokenize.NL): + newline_index.append(index) + newline_count += 1 + if newline_count > 2: + tts = ts[newline_index[-3]:] + else: + tts = ts + old = [] + for t in tts: + if t[0] in (tokenize.NEWLINE, tokenize.NL): + newline_count -= 1 + if newline_count <= 1: + break + if tokenize.COMMENT == t[0] and old and old[0] != tokenize.NL: + comment_index = old[3][1] + break + old = t + break + i = target.index(one_string_token) + fix_target_line = line_index - 1 - comment_only_linenum + self.source[line_index] = '{}{}'.format( + target[:i], target[i + len(one_string_token):].lstrip()) + nl = find_newline(self.source[fix_target_line:line_index]) + before_line = self.source[fix_target_line] + bl = before_line.index(nl) + if comment_index: + self.source[fix_target_line] = '{} {} {}'.format( + before_line[:comment_index], one_string_token, + before_line[comment_index + 1:]) + else: + if before_line[:bl].endswith("#"): + # special case + # see: https://github.com/hhatto/autopep8/issues/503 + self.source[fix_target_line] = '{}{} {}'.format( + before_line[:bl-2], one_string_token, before_line[bl-2:]) + else: + self.source[fix_target_line] = '{} {}{}'.format( + before_line[:bl], one_string_token, before_line[bl:]) + + def fix_w504(self, result): + (line_index, _, target) = get_index_offset_contents(result, + self.source) + # NOTE: is not collect pointed out in pycodestyle==2.4.0 + comment_index = 0 + operator_position = None # (start_position, end_position) + for i in range(1, 6): + to_index = line_index + i + try: + ts = generate_tokens("".join(self.source[line_index:to_index])) + except (SyntaxError, tokenize.TokenError): + continue + newline_count = 0 + newline_index = [] + for index, t in enumerate(ts): + if _is_binary_operator(t[0], t[1]): + if t[2][0] == 1 and t[3][0] == 1: + operator_position = (t[2][1], t[3][1]) + elif t[0] == tokenize.NAME and t[1] in ("and", "or"): + if t[2][0] == 1 and t[3][0] == 1: + operator_position = (t[2][1], t[3][1]) + elif t[0] in (tokenize.NEWLINE, tokenize.NL): + newline_index.append(index) + newline_count += 1 + if newline_count > 2: + tts = ts[:newline_index[-3]] + else: + tts = ts + old = [] + for t in tts: + if tokenize.COMMENT == t[0] and old: + comment_row, comment_index = old[3] + break + old = t + break + if not operator_position: + return + target_operator = target[operator_position[0]:operator_position[1]] + + if comment_index and comment_row == 1: + self.source[line_index] = '{}{}'.format( + target[:operator_position[0]].rstrip(), + target[comment_index:]) + else: + self.source[line_index] = '{}{}{}'.format( + target[:operator_position[0]].rstrip(), + target[operator_position[1]:].lstrip(), + target[operator_position[1]:]) + + next_line = self.source[line_index + 1] + next_line_indent = 0 + m = re.match(r'\s*', next_line) + if m: + next_line_indent = m.span()[1] + self.source[line_index + 1] = '{}{} {}'.format( + next_line[:next_line_indent], target_operator, + next_line[next_line_indent:]) + + def fix_w605(self, result): + (line_index, offset, target) = get_index_offset_contents(result, + self.source) + self.source[line_index] = '{}\\{}'.format( + target[:offset + 1], target[offset + 1:]) + + +def get_module_imports_on_top_of_file(source, import_line_index): + """return import or from keyword position + + example: + > 0: import sys + 1: import os + 2: + 3: def function(): + """ + def is_string_literal(line): + if line[0] in 'uUbB': + line = line[1:] + if line and line[0] in 'rR': + line = line[1:] + return line and (line[0] == '"' or line[0] == "'") + + def is_future_import(line): + nodes = ast.parse(line) + for n in nodes.body: + if isinstance(n, ast.ImportFrom) and n.module == '__future__': + return True + return False + + def has_future_import(source): + offset = 0 + line = '' + for _, next_line in source: + for line_part in next_line.strip().splitlines(True): + line = line + line_part + try: + return is_future_import(line), offset + except SyntaxError: + continue + offset += 1 + return False, offset + + allowed_try_keywords = ('try', 'except', 'else', 'finally') + in_docstring = False + docstring_kind = '"""' + source_stream = iter(enumerate(source)) + for cnt, line in source_stream: + if not in_docstring: + m = DOCSTRING_START_REGEX.match(line.lstrip()) + if m is not None: + in_docstring = True + docstring_kind = m.group('kind') + remain = line[m.end(): m.endpos].rstrip() + if remain[-3:] == docstring_kind: # one line doc + in_docstring = False + continue + if in_docstring: + if line.rstrip()[-3:] == docstring_kind: + in_docstring = False + continue + + if not line.rstrip(): + continue + elif line.startswith('#'): + continue + + if line.startswith('import '): + if cnt == import_line_index: + continue + return cnt + elif line.startswith('from '): + if cnt == import_line_index: + continue + hit, offset = has_future_import( + itertools.chain([(cnt, line)], source_stream) + ) + if hit: + # move to the back + return cnt + offset + 1 + return cnt + elif pycodestyle.DUNDER_REGEX.match(line): + return cnt + elif any(line.startswith(kw) for kw in allowed_try_keywords): + continue + elif is_string_literal(line): + return cnt + else: + return cnt + return 0 + + +def get_index_offset_contents(result, source): + """Return (line_index, column_offset, line_contents).""" + line_index = result['line'] - 1 + return (line_index, + result['column'] - 1, + source[line_index]) + + +def get_fixed_long_line(target, previous_line, original, + indent_word=' ', max_line_length=79, + aggressive=False, experimental=False, verbose=False): + """Break up long line and return result. + + Do this by generating multiple reformatted candidates and then + ranking the candidates to heuristically select the best option. + + """ + indent = _get_indentation(target) + source = target[len(indent):] + assert source.lstrip() == source + assert not target.lstrip().startswith('#') + + # Check for partial multiline. + tokens = list(generate_tokens(source)) + + candidates = shorten_line( + tokens, source, indent, + indent_word, + max_line_length, + aggressive=aggressive, + experimental=experimental, + previous_line=previous_line) + + # Also sort alphabetically as a tie breaker (for determinism). + candidates = sorted( + sorted(set(candidates).union([target, original])), + key=lambda x: line_shortening_rank( + x, + indent_word, + max_line_length, + experimental=experimental)) + + if verbose >= 4: + print(('-' * 79 + '\n').join([''] + candidates + ['']), + file=wrap_output(sys.stderr, 'utf-8')) + + if candidates: + best_candidate = candidates[0] + + # Don't allow things to get longer. + if longest_line_length(best_candidate) > longest_line_length(original): + return None + + return best_candidate + + +def longest_line_length(code): + """Return length of longest line.""" + if len(code) == 0: + return 0 + return max(len(line) for line in code.splitlines()) + + +def join_logical_line(logical_line): + """Return single line based on logical line input.""" + indentation = _get_indentation(logical_line) + + return indentation + untokenize_without_newlines( + generate_tokens(logical_line.lstrip())) + '\n' + + +def untokenize_without_newlines(tokens): + """Return source code based on tokens.""" + text = '' + last_row = 0 + last_column = -1 + + for t in tokens: + token_string = t[1] + (start_row, start_column) = t[2] + (end_row, end_column) = t[3] + + if start_row > last_row: + last_column = 0 + if ( + (start_column > last_column or token_string == '\n') and + not text.endswith(' ') + ): + text += ' ' + + if token_string != '\n': + text += token_string + + last_row = end_row + last_column = end_column + + return text.rstrip() + + +def _find_logical(source_lines): + # Make a variable which is the index of all the starts of lines. + logical_start = [] + logical_end = [] + last_newline = True + parens = 0 + for t in generate_tokens(''.join(source_lines)): + if t[0] in [tokenize.COMMENT, tokenize.DEDENT, + tokenize.INDENT, tokenize.NL, + tokenize.ENDMARKER]: + continue + if not parens and t[0] in [tokenize.NEWLINE, tokenize.SEMI]: + last_newline = True + logical_end.append((t[3][0] - 1, t[2][1])) + continue + if last_newline and not parens: + logical_start.append((t[2][0] - 1, t[2][1])) + last_newline = False + if t[0] == tokenize.OP: + if t[1] in '([{': + parens += 1 + elif t[1] in '}])': + parens -= 1 + return (logical_start, logical_end) + + +def _get_logical(source_lines, result, logical_start, logical_end): + """Return the logical line corresponding to the result. + + Assumes input is already E702-clean. + + """ + row = result['line'] - 1 + col = result['column'] - 1 + ls = None + le = None + for i in range(0, len(logical_start), 1): + assert logical_end + x = logical_end[i] + if x[0] > row or (x[0] == row and x[1] > col): + le = x + ls = logical_start[i] + break + if ls is None: + return None + original = source_lines[ls[0]:le[0] + 1] + return ls, le, original + + +def get_item(items, index, default=None): + if 0 <= index < len(items): + return items[index] + + return default + + +def reindent(source, indent_size, leave_tabs=False): + """Reindent all lines.""" + reindenter = Reindenter(source, leave_tabs) + return reindenter.run(indent_size) + + +def code_almost_equal(a, b): + """Return True if code is similar. + + Ignore whitespace when comparing specific line. + + """ + split_a = split_and_strip_non_empty_lines(a) + split_b = split_and_strip_non_empty_lines(b) + + if len(split_a) != len(split_b): + return False + + for (index, _) in enumerate(split_a): + if ''.join(split_a[index].split()) != ''.join(split_b[index].split()): + return False + + return True + + +def split_and_strip_non_empty_lines(text): + """Return lines split by newline. + + Ignore empty lines. + + """ + return [line.strip() for line in text.splitlines() if line.strip()] + + +def refactor(source, fixer_names, ignore=None, filename=''): + """Return refactored code using lib2to3. + + Skip if ignore string is produced in the refactored code. + + """ + not_found_end_of_file_newline = source and source.rstrip("\r\n") == source + if not_found_end_of_file_newline: + input_source = source + "\n" + else: + input_source = source + + from lib2to3 import pgen2 + try: + new_text = refactor_with_2to3(input_source, + fixer_names=fixer_names, + filename=filename) + except (pgen2.parse.ParseError, + SyntaxError, + UnicodeDecodeError, + UnicodeEncodeError): + return source + + if ignore: + if ignore in new_text and ignore not in source: + return source + + if not_found_end_of_file_newline: + return new_text.rstrip("\r\n") + + return new_text + + +def code_to_2to3(select, ignore, where='', verbose=False): + fixes = set() + for code, fix in CODE_TO_2TO3.items(): + if code_match(code, select=select, ignore=ignore): + if verbose: + print('---> Applying {} fix for {}'.format(where, + code.upper()), + file=sys.stderr) + fixes |= set(fix) + return fixes + + +def fix_2to3(source, + aggressive=True, select=None, ignore=None, filename='', + where='global', verbose=False): + """Fix various deprecated code (via lib2to3).""" + if not aggressive: + return source + + select = select or [] + ignore = ignore or [] + + return refactor(source, + code_to_2to3(select=select, + ignore=ignore, + where=where, + verbose=verbose), + filename=filename) + + +def find_newline(source): + """Return type of newline used in source. + + Input is a list of lines. + + """ + assert not isinstance(source, str) + + counter = collections.defaultdict(int) + for line in source: + if line.endswith(CRLF): + counter[CRLF] += 1 + elif line.endswith(CR): + counter[CR] += 1 + elif line.endswith(LF): + counter[LF] += 1 + + return (sorted(counter, key=counter.get, reverse=True) or [LF])[0] + + +def _get_indentword(source): + """Return indentation type.""" + indent_word = ' ' # Default in case source has no indentation + try: + for t in generate_tokens(source): + if t[0] == token.INDENT: + indent_word = t[1] + break + except (SyntaxError, tokenize.TokenError): + pass + return indent_word + + +def _get_indentation(line): + """Return leading whitespace.""" + if line.strip(): + non_whitespace_index = len(line) - len(line.lstrip()) + return line[:non_whitespace_index] + + return '' + + +def get_diff_text(old, new, filename): + """Return text of unified diff between old and new.""" + newline = '\n' + diff = difflib.unified_diff( + old, new, + 'original/' + filename, + 'fixed/' + filename, + lineterm=newline) + + text = '' + for line in diff: + text += line + + # Work around missing newline (http://bugs.python.org/issue2142). + if text and not line.endswith(newline): + text += newline + r'\ No newline at end of file' + newline + + return text + + +def _priority_key(pep8_result): + """Key for sorting PEP8 results. + + Global fixes should be done first. This is important for things like + indentation. + + """ + priority = [ + # Fix multiline colon-based before semicolon based. + 'e701', + # Break multiline statements early. + 'e702', + # Things that make lines longer. + 'e225', 'e231', + # Remove extraneous whitespace before breaking lines. + 'e201', + # Shorten whitespace in comment before resorting to wrapping. + 'e262' + ] + middle_index = 10000 + lowest_priority = [ + # We need to shorten lines last since the logical fixer can get in a + # loop, which causes us to exit early. + 'e501', + ] + key = pep8_result['id'].lower() + try: + return priority.index(key) + except ValueError: + try: + return middle_index + lowest_priority.index(key) + 1 + except ValueError: + return middle_index + + +def shorten_line(tokens, source, indentation, indent_word, max_line_length, + aggressive=False, experimental=False, previous_line=''): + """Separate line at OPERATOR. + + Multiple candidates will be yielded. + + """ + for candidate in _shorten_line(tokens=tokens, + source=source, + indentation=indentation, + indent_word=indent_word, + aggressive=aggressive, + previous_line=previous_line): + yield candidate + + if aggressive: + for key_token_strings in SHORTEN_OPERATOR_GROUPS: + shortened = _shorten_line_at_tokens( + tokens=tokens, + source=source, + indentation=indentation, + indent_word=indent_word, + key_token_strings=key_token_strings, + aggressive=aggressive) + + if shortened is not None and shortened != source: + yield shortened + + if experimental: + for shortened in _shorten_line_at_tokens_new( + tokens=tokens, + source=source, + indentation=indentation, + max_line_length=max_line_length): + + yield shortened + + +def _shorten_line(tokens, source, indentation, indent_word, + aggressive=False, previous_line=''): + """Separate line at OPERATOR. + + The input is expected to be free of newlines except for inside multiline + strings and at the end. + + Multiple candidates will be yielded. + + """ + for (token_type, + token_string, + start_offset, + end_offset) in token_offsets(tokens): + + if ( + token_type == tokenize.COMMENT and + not is_probably_part_of_multiline(previous_line) and + not is_probably_part_of_multiline(source) and + not source[start_offset + 1:].strip().lower().startswith( + ('noqa', 'pragma:', 'pylint:')) + ): + # Move inline comments to previous line. + first = source[:start_offset] + second = source[start_offset:] + yield (indentation + second.strip() + '\n' + + indentation + first.strip() + '\n') + elif token_type == token.OP and token_string != '=': + # Don't break on '=' after keyword as this violates PEP 8. + + assert token_type != token.INDENT + + first = source[:end_offset] + + second_indent = indentation + if (first.rstrip().endswith('(') and + source[end_offset:].lstrip().startswith(')')): + pass + elif first.rstrip().endswith('('): + second_indent += indent_word + elif '(' in first: + second_indent += ' ' * (1 + first.find('(')) + else: + second_indent += indent_word + + second = (second_indent + source[end_offset:].lstrip()) + if ( + not second.strip() or + second.lstrip().startswith('#') + ): + continue + + # Do not begin a line with a comma + if second.lstrip().startswith(','): + continue + # Do end a line with a dot + if first.rstrip().endswith('.'): + continue + if token_string in '+-*/': + fixed = first + ' \\' + '\n' + second + else: + fixed = first + '\n' + second + + # Only fix if syntax is okay. + if check_syntax(normalize_multiline(fixed) + if aggressive else fixed): + yield indentation + fixed + + +def _is_binary_operator(token_type, text): + return ((token_type == tokenize.OP or text in ['and', 'or']) and + text not in '()[]{},:.;@=%~') + + +# A convenient way to handle tokens. +Token = collections.namedtuple('Token', ['token_type', 'token_string', + 'spos', 'epos', 'line']) + + +class ReformattedLines(object): + + """The reflowed lines of atoms. + + Each part of the line is represented as an "atom." They can be moved + around when need be to get the optimal formatting. + + """ + + ########################################################################### + # Private Classes + + class _Indent(object): + + """Represent an indentation in the atom stream.""" + + def __init__(self, indent_amt): + self._indent_amt = indent_amt + + def emit(self): + return ' ' * self._indent_amt + + @property + def size(self): + return self._indent_amt + + class _Space(object): + + """Represent a space in the atom stream.""" + + def emit(self): + return ' ' + + @property + def size(self): + return 1 + + class _LineBreak(object): + + """Represent a line break in the atom stream.""" + + def emit(self): + return '\n' + + @property + def size(self): + return 0 + + def __init__(self, max_line_length): + self._max_line_length = max_line_length + self._lines = [] + self._bracket_depth = 0 + self._prev_item = None + self._prev_prev_item = None + + def __repr__(self): + return self.emit() + + ########################################################################### + # Public Methods + + def add(self, obj, indent_amt, break_after_open_bracket): + if isinstance(obj, Atom): + self._add_item(obj, indent_amt) + return + + self._add_container(obj, indent_amt, break_after_open_bracket) + + def add_comment(self, item): + num_spaces = 2 + if len(self._lines) > 1: + if isinstance(self._lines[-1], self._Space): + num_spaces -= 1 + if len(self._lines) > 2: + if isinstance(self._lines[-2], self._Space): + num_spaces -= 1 + + while num_spaces > 0: + self._lines.append(self._Space()) + num_spaces -= 1 + self._lines.append(item) + + def add_indent(self, indent_amt): + self._lines.append(self._Indent(indent_amt)) + + def add_line_break(self, indent): + self._lines.append(self._LineBreak()) + self.add_indent(len(indent)) + + def add_line_break_at(self, index, indent_amt): + self._lines.insert(index, self._LineBreak()) + self._lines.insert(index + 1, self._Indent(indent_amt)) + + def add_space_if_needed(self, curr_text, equal=False): + if ( + not self._lines or isinstance( + self._lines[-1], (self._LineBreak, self._Indent, self._Space)) + ): + return + + prev_text = str(self._prev_item) + prev_prev_text = ( + str(self._prev_prev_item) if self._prev_prev_item else '') + + if ( + # The previous item was a keyword or identifier and the current + # item isn't an operator that doesn't require a space. + ((self._prev_item.is_keyword or self._prev_item.is_string or + self._prev_item.is_name or self._prev_item.is_number) and + (curr_text[0] not in '([{.,:}])' or + (curr_text[0] == '=' and equal))) or + + # Don't place spaces around a '.', unless it's in an 'import' + # statement. + ((prev_prev_text != 'from' and prev_text[-1] != '.' and + curr_text != 'import') and + + # Don't place a space before a colon. + curr_text[0] != ':' and + + # Don't split up ending brackets by spaces. + ((prev_text[-1] in '}])' and curr_text[0] not in '.,}])') or + + # Put a space after a colon or comma. + prev_text[-1] in ':,' or + + # Put space around '=' if asked to. + (equal and prev_text == '=') or + + # Put spaces around non-unary arithmetic operators. + ((self._prev_prev_item and + (prev_text not in '+-' and + (self._prev_prev_item.is_name or + self._prev_prev_item.is_number or + self._prev_prev_item.is_string)) and + prev_text in ('+', '-', '%', '*', '/', '//', '**', 'in'))))) + ): + self._lines.append(self._Space()) + + def previous_item(self): + """Return the previous non-whitespace item.""" + return self._prev_item + + def fits_on_current_line(self, item_extent): + return self.current_size() + item_extent <= self._max_line_length + + def current_size(self): + """The size of the current line minus the indentation.""" + size = 0 + for item in reversed(self._lines): + size += item.size + if isinstance(item, self._LineBreak): + break + + return size + + def line_empty(self): + return (self._lines and + isinstance(self._lines[-1], + (self._LineBreak, self._Indent))) + + def emit(self): + string = '' + for item in self._lines: + if isinstance(item, self._LineBreak): + string = string.rstrip() + string += item.emit() + + return string.rstrip() + '\n' + + ########################################################################### + # Private Methods + + def _add_item(self, item, indent_amt): + """Add an item to the line. + + Reflow the line to get the best formatting after the item is + inserted. The bracket depth indicates if the item is being + inserted inside of a container or not. + + """ + if self._prev_item and self._prev_item.is_string and item.is_string: + # Place consecutive string literals on separate lines. + self._lines.append(self._LineBreak()) + self._lines.append(self._Indent(indent_amt)) + + item_text = str(item) + if self._lines and self._bracket_depth: + # Adding the item into a container. + self._prevent_default_initializer_splitting(item, indent_amt) + + if item_text in '.,)]}': + self._split_after_delimiter(item, indent_amt) + + elif self._lines and not self.line_empty(): + # Adding the item outside of a container. + if self.fits_on_current_line(len(item_text)): + self._enforce_space(item) + + else: + # Line break for the new item. + self._lines.append(self._LineBreak()) + self._lines.append(self._Indent(indent_amt)) + + self._lines.append(item) + self._prev_item, self._prev_prev_item = item, self._prev_item + + if item_text in '([{': + self._bracket_depth += 1 + + elif item_text in '}])': + self._bracket_depth -= 1 + assert self._bracket_depth >= 0 + + def _add_container(self, container, indent_amt, break_after_open_bracket): + actual_indent = indent_amt + 1 + + if ( + str(self._prev_item) != '=' and + not self.line_empty() and + not self.fits_on_current_line( + container.size + self._bracket_depth + 2) + ): + + if str(container)[0] == '(' and self._prev_item.is_name: + # Don't split before the opening bracket of a call. + break_after_open_bracket = True + actual_indent = indent_amt + 4 + elif ( + break_after_open_bracket or + str(self._prev_item) not in '([{' + ): + # If the container doesn't fit on the current line and the + # current line isn't empty, place the container on the next + # line. + self._lines.append(self._LineBreak()) + self._lines.append(self._Indent(indent_amt)) + break_after_open_bracket = False + else: + actual_indent = self.current_size() + 1 + break_after_open_bracket = False + + if isinstance(container, (ListComprehension, IfExpression)): + actual_indent = indent_amt + + # Increase the continued indentation only if recursing on a + # container. + container.reflow(self, ' ' * actual_indent, + break_after_open_bracket=break_after_open_bracket) + + def _prevent_default_initializer_splitting(self, item, indent_amt): + """Prevent splitting between a default initializer. + + When there is a default initializer, it's best to keep it all on + the same line. It's nicer and more readable, even if it goes + over the maximum allowable line length. This goes back along the + current line to determine if we have a default initializer, and, + if so, to remove extraneous whitespaces and add a line + break/indent before it if needed. + + """ + if str(item) == '=': + # This is the assignment in the initializer. Just remove spaces for + # now. + self._delete_whitespace() + return + + if (not self._prev_item or not self._prev_prev_item or + str(self._prev_item) != '='): + return + + self._delete_whitespace() + prev_prev_index = self._lines.index(self._prev_prev_item) + + if ( + isinstance(self._lines[prev_prev_index - 1], self._Indent) or + self.fits_on_current_line(item.size + 1) + ): + # The default initializer is already the only item on this line. + # Don't insert a newline here. + return + + # Replace the space with a newline/indent combo. + if isinstance(self._lines[prev_prev_index - 1], self._Space): + del self._lines[prev_prev_index - 1] + + self.add_line_break_at(self._lines.index(self._prev_prev_item), + indent_amt) + + def _split_after_delimiter(self, item, indent_amt): + """Split the line only after a delimiter.""" + self._delete_whitespace() + + if self.fits_on_current_line(item.size): + return + + last_space = None + for current_item in reversed(self._lines): + if ( + last_space and + (not isinstance(current_item, Atom) or + not current_item.is_colon) + ): + break + else: + last_space = None + if isinstance(current_item, self._Space): + last_space = current_item + if isinstance(current_item, (self._LineBreak, self._Indent)): + return + + if not last_space: + return + + self.add_line_break_at(self._lines.index(last_space), indent_amt) + + def _enforce_space(self, item): + """Enforce a space in certain situations. + + There are cases where we will want a space where normally we + wouldn't put one. This just enforces the addition of a space. + + """ + if isinstance(self._lines[-1], + (self._Space, self._LineBreak, self._Indent)): + return + + if not self._prev_item: + return + + item_text = str(item) + prev_text = str(self._prev_item) + + # Prefer a space around a '.' in an import statement, and between the + # 'import' and '('. + if ( + (item_text == '.' and prev_text == 'from') or + (item_text == 'import' and prev_text == '.') or + (item_text == '(' and prev_text == 'import') + ): + self._lines.append(self._Space()) + + def _delete_whitespace(self): + """Delete all whitespace from the end of the line.""" + while isinstance(self._lines[-1], (self._Space, self._LineBreak, + self._Indent)): + del self._lines[-1] + + +class Atom(object): + + """The smallest unbreakable unit that can be reflowed.""" + + def __init__(self, atom): + self._atom = atom + + def __repr__(self): + return self._atom.token_string + + def __len__(self): + return self.size + + def reflow( + self, reflowed_lines, continued_indent, extent, + break_after_open_bracket=False, + is_list_comp_or_if_expr=False, + next_is_dot=False + ): + if self._atom.token_type == tokenize.COMMENT: + reflowed_lines.add_comment(self) + return + + total_size = extent if extent else self.size + + if self._atom.token_string not in ',:([{}])': + # Some atoms will need an extra 1-sized space token after them. + total_size += 1 + + prev_item = reflowed_lines.previous_item() + if ( + not is_list_comp_or_if_expr and + not reflowed_lines.fits_on_current_line(total_size) and + not (next_is_dot and + reflowed_lines.fits_on_current_line(self.size + 1)) and + not reflowed_lines.line_empty() and + not self.is_colon and + not (prev_item and prev_item.is_name and + str(self) == '(') + ): + # Start a new line if there is already something on the line and + # adding this atom would make it go over the max line length. + reflowed_lines.add_line_break(continued_indent) + else: + reflowed_lines.add_space_if_needed(str(self)) + + reflowed_lines.add(self, len(continued_indent), + break_after_open_bracket) + + def emit(self): + return self.__repr__() + + @property + def is_keyword(self): + return keyword.iskeyword(self._atom.token_string) + + @property + def is_string(self): + return self._atom.token_type == tokenize.STRING + + @property + def is_name(self): + return self._atom.token_type == tokenize.NAME + + @property + def is_number(self): + return self._atom.token_type == tokenize.NUMBER + + @property + def is_comma(self): + return self._atom.token_string == ',' + + @property + def is_colon(self): + return self._atom.token_string == ':' + + @property + def size(self): + return len(self._atom.token_string) + + +class Container(object): + + """Base class for all container types.""" + + def __init__(self, items): + self._items = items + + def __repr__(self): + string = '' + last_was_keyword = False + + for item in self._items: + if item.is_comma: + string += ', ' + elif item.is_colon: + string += ': ' + else: + item_string = str(item) + if ( + string and + (last_was_keyword or + (not string.endswith(tuple('([{,.:}]) ')) and + not item_string.startswith(tuple('([{,.:}])')))) + ): + string += ' ' + string += item_string + + last_was_keyword = item.is_keyword + return string + + def __iter__(self): + for element in self._items: + yield element + + def __getitem__(self, idx): + return self._items[idx] + + def reflow(self, reflowed_lines, continued_indent, + break_after_open_bracket=False): + last_was_container = False + for (index, item) in enumerate(self._items): + next_item = get_item(self._items, index + 1) + + if isinstance(item, Atom): + is_list_comp_or_if_expr = ( + isinstance(self, (ListComprehension, IfExpression))) + item.reflow(reflowed_lines, continued_indent, + self._get_extent(index), + is_list_comp_or_if_expr=is_list_comp_or_if_expr, + next_is_dot=(next_item and + str(next_item) == '.')) + if last_was_container and item.is_comma: + reflowed_lines.add_line_break(continued_indent) + last_was_container = False + else: # isinstance(item, Container) + reflowed_lines.add(item, len(continued_indent), + break_after_open_bracket) + last_was_container = not isinstance(item, (ListComprehension, + IfExpression)) + + if ( + break_after_open_bracket and index == 0 and + # Prefer to keep empty containers together instead of + # separating them. + str(item) == self.open_bracket and + (not next_item or str(next_item) != self.close_bracket) and + (len(self._items) != 3 or not isinstance(next_item, Atom)) + ): + reflowed_lines.add_line_break(continued_indent) + break_after_open_bracket = False + else: + next_next_item = get_item(self._items, index + 2) + if ( + str(item) not in ['.', '%', 'in'] and + next_item and not isinstance(next_item, Container) and + str(next_item) != ':' and + next_next_item and (not isinstance(next_next_item, Atom) or + str(next_item) == 'not') and + not reflowed_lines.line_empty() and + not reflowed_lines.fits_on_current_line( + self._get_extent(index + 1) + 2) + ): + reflowed_lines.add_line_break(continued_indent) + + def _get_extent(self, index): + """The extent of the full element. + + E.g., the length of a function call or keyword. + + """ + extent = 0 + prev_item = get_item(self._items, index - 1) + seen_dot = prev_item and str(prev_item) == '.' + while index < len(self._items): + item = get_item(self._items, index) + index += 1 + + if isinstance(item, (ListComprehension, IfExpression)): + break + + if isinstance(item, Container): + if prev_item and prev_item.is_name: + if seen_dot: + extent += 1 + else: + extent += item.size + + prev_item = item + continue + elif (str(item) not in ['.', '=', ':', 'not'] and + not item.is_name and not item.is_string): + break + + if str(item) == '.': + seen_dot = True + + extent += item.size + prev_item = item + + return extent + + @property + def is_string(self): + return False + + @property + def size(self): + return len(self.__repr__()) + + @property + def is_keyword(self): + return False + + @property + def is_name(self): + return False + + @property + def is_comma(self): + return False + + @property + def is_colon(self): + return False + + @property + def open_bracket(self): + return None + + @property + def close_bracket(self): + return None + + +class Tuple(Container): + + """A high-level representation of a tuple.""" + + @property + def open_bracket(self): + return '(' + + @property + def close_bracket(self): + return ')' + + +class List(Container): + + """A high-level representation of a list.""" + + @property + def open_bracket(self): + return '[' + + @property + def close_bracket(self): + return ']' + + +class DictOrSet(Container): + + """A high-level representation of a dictionary or set.""" + + @property + def open_bracket(self): + return '{' + + @property + def close_bracket(self): + return '}' + + +class ListComprehension(Container): + + """A high-level representation of a list comprehension.""" + + @property + def size(self): + length = 0 + for item in self._items: + if isinstance(item, IfExpression): + break + length += item.size + return length + + +class IfExpression(Container): + + """A high-level representation of an if-expression.""" + + +def _parse_container(tokens, index, for_or_if=None): + """Parse a high-level container, such as a list, tuple, etc.""" + + # Store the opening bracket. + items = [Atom(Token(*tokens[index]))] + index += 1 + + num_tokens = len(tokens) + while index < num_tokens: + tok = Token(*tokens[index]) + + if tok.token_string in ',)]}': + # First check if we're at the end of a list comprehension or + # if-expression. Don't add the ending token as part of the list + # comprehension or if-expression, because they aren't part of those + # constructs. + if for_or_if == 'for': + return (ListComprehension(items), index - 1) + + elif for_or_if == 'if': + return (IfExpression(items), index - 1) + + # We've reached the end of a container. + items.append(Atom(tok)) + + # If not, then we are at the end of a container. + if tok.token_string == ')': + # The end of a tuple. + return (Tuple(items), index) + + elif tok.token_string == ']': + # The end of a list. + return (List(items), index) + + elif tok.token_string == '}': + # The end of a dictionary or set. + return (DictOrSet(items), index) + + elif tok.token_string in '([{': + # A sub-container is being defined. + (container, index) = _parse_container(tokens, index) + items.append(container) + + elif tok.token_string == 'for': + (container, index) = _parse_container(tokens, index, 'for') + items.append(container) + + elif tok.token_string == 'if': + (container, index) = _parse_container(tokens, index, 'if') + items.append(container) + + else: + items.append(Atom(tok)) + + index += 1 + + return (None, None) + + +def _parse_tokens(tokens): + """Parse the tokens. + + This converts the tokens into a form where we can manipulate them + more easily. + + """ + + index = 0 + parsed_tokens = [] + + num_tokens = len(tokens) + while index < num_tokens: + tok = Token(*tokens[index]) + + assert tok.token_type != token.INDENT + if tok.token_type == tokenize.NEWLINE: + # There's only one newline and it's at the end. + break + + if tok.token_string in '([{': + (container, index) = _parse_container(tokens, index) + if not container: + return None + parsed_tokens.append(container) + else: + parsed_tokens.append(Atom(tok)) + + index += 1 + + return parsed_tokens + + +def _reflow_lines(parsed_tokens, indentation, max_line_length, + start_on_prefix_line): + """Reflow the lines so that it looks nice.""" + + if str(parsed_tokens[0]) == 'def': + # A function definition gets indented a bit more. + continued_indent = indentation + ' ' * 2 * DEFAULT_INDENT_SIZE + else: + continued_indent = indentation + ' ' * DEFAULT_INDENT_SIZE + + break_after_open_bracket = not start_on_prefix_line + + lines = ReformattedLines(max_line_length) + lines.add_indent(len(indentation.lstrip('\r\n'))) + + if not start_on_prefix_line: + # If splitting after the opening bracket will cause the first element + # to be aligned weirdly, don't try it. + first_token = get_item(parsed_tokens, 0) + second_token = get_item(parsed_tokens, 1) + + if ( + first_token and second_token and + str(second_token)[0] == '(' and + len(indentation) + len(first_token) + 1 == len(continued_indent) + ): + return None + + for item in parsed_tokens: + lines.add_space_if_needed(str(item), equal=True) + + save_continued_indent = continued_indent + if start_on_prefix_line and isinstance(item, Container): + start_on_prefix_line = False + continued_indent = ' ' * (lines.current_size() + 1) + + item.reflow(lines, continued_indent, break_after_open_bracket) + continued_indent = save_continued_indent + + return lines.emit() + + +def _shorten_line_at_tokens_new(tokens, source, indentation, + max_line_length): + """Shorten the line taking its length into account. + + The input is expected to be free of newlines except for inside + multiline strings and at the end. + + """ + # Yield the original source so to see if it's a better choice than the + # shortened candidate lines we generate here. + yield indentation + source + + parsed_tokens = _parse_tokens(tokens) + + if parsed_tokens: + # Perform two reflows. The first one starts on the same line as the + # prefix. The second starts on the line after the prefix. + fixed = _reflow_lines(parsed_tokens, indentation, max_line_length, + start_on_prefix_line=True) + if fixed and check_syntax(normalize_multiline(fixed.lstrip())): + yield fixed + + fixed = _reflow_lines(parsed_tokens, indentation, max_line_length, + start_on_prefix_line=False) + if fixed and check_syntax(normalize_multiline(fixed.lstrip())): + yield fixed + + +def _shorten_line_at_tokens(tokens, source, indentation, indent_word, + key_token_strings, aggressive): + """Separate line by breaking at tokens in key_token_strings. + + The input is expected to be free of newlines except for inside + multiline strings and at the end. + + """ + offsets = [] + for (index, _t) in enumerate(token_offsets(tokens)): + (token_type, + token_string, + start_offset, + end_offset) = _t + + assert token_type != token.INDENT + + if token_string in key_token_strings: + # Do not break in containers with zero or one items. + unwanted_next_token = { + '(': ')', + '[': ']', + '{': '}'}.get(token_string) + if unwanted_next_token: + if ( + get_item(tokens, + index + 1, + default=[None, None])[1] == unwanted_next_token or + get_item(tokens, + index + 2, + default=[None, None])[1] == unwanted_next_token + ): + continue + + if ( + index > 2 and token_string == '(' and + tokens[index - 1][1] in ',(%[' + ): + # Don't split after a tuple start, or before a tuple start if + # the tuple is in a list. + continue + + if end_offset < len(source) - 1: + # Don't split right before newline. + offsets.append(end_offset) + else: + # Break at adjacent strings. These were probably meant to be on + # separate lines in the first place. + previous_token = get_item(tokens, index - 1) + if ( + token_type == tokenize.STRING and + previous_token and previous_token[0] == tokenize.STRING + ): + offsets.append(start_offset) + + current_indent = None + fixed = None + for line in split_at_offsets(source, offsets): + if fixed: + fixed += '\n' + current_indent + line + + for symbol in '([{': + if line.endswith(symbol): + current_indent += indent_word + else: + # First line. + fixed = line + assert not current_indent + current_indent = indent_word + + assert fixed is not None + + if check_syntax(normalize_multiline(fixed) + if aggressive > 1 else fixed): + return indentation + fixed + + return None + + +def token_offsets(tokens): + """Yield tokens and offsets.""" + end_offset = 0 + previous_end_row = 0 + previous_end_column = 0 + for t in tokens: + token_type = t[0] + token_string = t[1] + (start_row, start_column) = t[2] + (end_row, end_column) = t[3] + + # Account for the whitespace between tokens. + end_offset += start_column + if previous_end_row == start_row: + end_offset -= previous_end_column + + # Record the start offset of the token. + start_offset = end_offset + + # Account for the length of the token itself. + end_offset += len(token_string) + + yield (token_type, + token_string, + start_offset, + end_offset) + + previous_end_row = end_row + previous_end_column = end_column + + +def normalize_multiline(line): + """Normalize multiline-related code that will cause syntax error. + + This is for purposes of checking syntax. + + """ + if line.startswith('def ') and line.rstrip().endswith(':'): + return line + ' pass' + elif line.startswith('return '): + return 'def _(): ' + line + elif line.startswith('@'): + return line + 'def _(): pass' + elif line.startswith('class '): + return line + ' pass' + elif line.startswith(('if ', 'elif ', 'for ', 'while ')): + return line + ' pass' + + return line + + +def fix_whitespace(line, offset, replacement): + """Replace whitespace at offset and return fixed line.""" + # Replace escaped newlines too + left = line[:offset].rstrip('\n\r \t\\') + right = line[offset:].lstrip('\n\r \t\\') + if right.startswith('#'): + return line + + return left + replacement + right + + +def _execute_pep8(pep8_options, source): + """Execute pycodestyle via python method calls.""" + class QuietReport(pycodestyle.BaseReport): + + """Version of checker that does not print.""" + + def __init__(self, options): + super(QuietReport, self).__init__(options) + self.__full_error_results = [] + + def error(self, line_number, offset, text, check): + """Collect errors.""" + code = super(QuietReport, self).error(line_number, + offset, + text, + check) + if code: + self.__full_error_results.append( + {'id': code, + 'line': line_number, + 'column': offset + 1, + 'info': text}) + + def full_error_results(self): + """Return error results in detail. + + Results are in the form of a list of dictionaries. Each + dictionary contains 'id', 'line', 'column', and 'info'. + + """ + return self.__full_error_results + + checker = pycodestyle.Checker('', lines=source, reporter=QuietReport, + **pep8_options) + checker.check_all() + return checker.report.full_error_results() + + +def _remove_leading_and_normalize(line, with_rstrip=True): + # ignore FF in first lstrip() + if with_rstrip: + return line.lstrip(' \t\v').rstrip(CR + LF) + '\n' + return line.lstrip(' \t\v') + + +class Reindenter(object): + + """Reindents badly-indented code to uniformly use four-space indentation. + + Released to the public domain, by Tim Peters, 03 October 2000. + + """ + + def __init__(self, input_text, leave_tabs=False): + sio = io.StringIO(input_text) + source_lines = sio.readlines() + + self.string_content_line_numbers = multiline_string_lines(input_text) + + # File lines, rstripped & tab-expanded. Dummy at start is so + # that we can use tokenize's 1-based line numbering easily. + # Note that a line is all-blank iff it is a newline. + self.lines = [] + for line_number, line in enumerate(source_lines, start=1): + # Do not modify if inside a multiline string. + if line_number in self.string_content_line_numbers: + self.lines.append(line) + else: + # Only expand leading tabs. + with_rstrip = line_number != len(source_lines) + if leave_tabs: + self.lines.append( + _get_indentation(line) + + _remove_leading_and_normalize(line, with_rstrip) + ) + else: + self.lines.append( + _get_indentation(line).expandtabs() + + _remove_leading_and_normalize(line, with_rstrip) + ) + + self.lines.insert(0, None) + self.index = 1 # index into self.lines of next line + self.input_text = input_text + + def run(self, indent_size=DEFAULT_INDENT_SIZE): + """Fix indentation and return modified line numbers. + + Line numbers are indexed at 1. + + """ + if indent_size < 1: + return self.input_text + + try: + stats = _reindent_stats(tokenize.generate_tokens(self.getline)) + except (SyntaxError, tokenize.TokenError): + return self.input_text + # Remove trailing empty lines. + lines = self.lines + # Sentinel. + stats.append((len(lines), 0)) + # Map count of leading spaces to # we want. + have2want = {} + # Program after transformation. + after = [] + # Copy over initial empty lines -- there's nothing to do until + # we see a line with *something* on it. + i = stats[0][0] + after.extend(lines[1:i]) + for i in range(len(stats) - 1): + thisstmt, thislevel = stats[i] + nextstmt = stats[i + 1][0] + have = _leading_space_count(lines[thisstmt]) + want = thislevel * indent_size + if want < 0: + # A comment line. + if have: + # An indented comment line. If we saw the same + # indentation before, reuse what it most recently + # mapped to. + want = have2want.get(have, -1) + if want < 0: + # Then it probably belongs to the next real stmt. + for j in range(i + 1, len(stats) - 1): + jline, jlevel = stats[j] + if jlevel >= 0: + if have == _leading_space_count(lines[jline]): + want = jlevel * indent_size + break + # Maybe it's a hanging comment like this one, + if want < 0: + # in which case we should shift it like its base + # line got shifted. + for j in range(i - 1, -1, -1): + jline, jlevel = stats[j] + if jlevel >= 0: + want = (have + _leading_space_count( + after[jline - 1]) - + _leading_space_count(lines[jline])) + break + if want < 0: + # Still no luck -- leave it alone. + want = have + else: + want = 0 + assert want >= 0 + have2want[have] = want + diff = want - have + if diff == 0 or have == 0: + after.extend(lines[thisstmt:nextstmt]) + else: + for line_number, line in enumerate(lines[thisstmt:nextstmt], + start=thisstmt): + if line_number in self.string_content_line_numbers: + after.append(line) + elif diff > 0: + if line == '\n': + after.append(line) + else: + after.append(' ' * diff + line) + else: + remove = min(_leading_space_count(line), -diff) + after.append(line[remove:]) + + return ''.join(after) + + def getline(self): + """Line-getter for tokenize.""" + if self.index >= len(self.lines): + line = '' + else: + line = self.lines[self.index] + self.index += 1 + return line + + +def _reindent_stats(tokens): + """Return list of (lineno, indentlevel) pairs. + + One for each stmt and comment line. indentlevel is -1 for comment + lines, as a signal that tokenize doesn't know what to do about them; + indeed, they're our headache! + + """ + find_stmt = 1 # Next token begins a fresh stmt? + level = 0 # Current indent level. + stats = [] + + for t in tokens: + token_type = t[0] + sline = t[2][0] + line = t[4] + + if token_type == tokenize.NEWLINE: + # A program statement, or ENDMARKER, will eventually follow, + # after some (possibly empty) run of tokens of the form + # (NL | COMMENT)* (INDENT | DEDENT+)? + find_stmt = 1 + + elif token_type == tokenize.INDENT: + find_stmt = 1 + level += 1 + + elif token_type == tokenize.DEDENT: + find_stmt = 1 + level -= 1 + + elif token_type == tokenize.COMMENT: + if find_stmt: + stats.append((sline, -1)) + # But we're still looking for a new stmt, so leave + # find_stmt alone. + + elif token_type == tokenize.NL: + pass + + elif find_stmt: + # This is the first "real token" following a NEWLINE, so it + # must be the first token of the next program statement, or an + # ENDMARKER. + find_stmt = 0 + if line: # Not endmarker. + stats.append((sline, level)) + + return stats + + +def _leading_space_count(line): + """Return number of leading spaces in line.""" + i = 0 + while i < len(line) and line[i] == ' ': + i += 1 + return i + + +def refactor_with_2to3(source_text, fixer_names, filename=''): + """Use lib2to3 to refactor the source. + + Return the refactored source code. + + """ + from lib2to3.refactor import RefactoringTool + fixers = ['lib2to3.fixes.fix_' + name for name in fixer_names] + tool = RefactoringTool(fixer_names=fixers, explicit=fixers) + + from lib2to3.pgen2 import tokenize as lib2to3_tokenize + try: + # The name parameter is necessary particularly for the "import" fixer. + return str(tool.refactor_string(source_text, name=filename)) + except lib2to3_tokenize.TokenError: + return source_text + + +def check_syntax(code): + """Return True if syntax is okay.""" + try: + return compile(code, '', 'exec', dont_inherit=True) + except (SyntaxError, TypeError, ValueError): + return False + + +def find_with_line_numbers(pattern, contents): + """A wrapper around 're.finditer' to find line numbers. + + Returns a list of line numbers where pattern was found in contents. + """ + matches = list(re.finditer(pattern, contents)) + if not matches: + return [] + + end = matches[-1].start() + + # -1 so a failed `rfind` maps to the first line. + newline_offsets = { + -1: 0 + } + for line_num, m in enumerate(re.finditer(r'\n', contents), 1): + offset = m.start() + if offset > end: + break + newline_offsets[offset] = line_num + + def get_line_num(match, contents): + """Get the line number of string in a files contents. + + Failing to find the newline is OK, -1 maps to 0 + + """ + newline_offset = contents.rfind('\n', 0, match.start()) + return newline_offsets[newline_offset] + + return [get_line_num(match, contents) + 1 for match in matches] + + +def get_disabled_ranges(source): + """Returns a list of tuples representing the disabled ranges. + + If disabled and no re-enable will disable for rest of file. + + """ + enable_line_nums = find_with_line_numbers(ENABLE_REGEX, source) + disable_line_nums = find_with_line_numbers(DISABLE_REGEX, source) + total_lines = len(re.findall("\n", source)) + 1 + + enable_commands = {} + for num in enable_line_nums: + enable_commands[num] = True + for num in disable_line_nums: + enable_commands[num] = False + + disabled_ranges = [] + currently_enabled = True + disabled_start = None + + for line, commanded_enabled in sorted(enable_commands.items()): + if commanded_enabled is False and currently_enabled is True: + disabled_start = line + currently_enabled = False + elif commanded_enabled is True and currently_enabled is False: + disabled_ranges.append((disabled_start, line)) + currently_enabled = True + + if currently_enabled is False: + disabled_ranges.append((disabled_start, total_lines)) + + return disabled_ranges + + +def filter_disabled_results(result, disabled_ranges): + """Filter out reports based on tuple of disabled ranges. + + """ + line = result['line'] + for disabled_range in disabled_ranges: + if disabled_range[0] <= line <= disabled_range[1]: + return False + return True + + +def filter_results(source, results, aggressive): + """Filter out spurious reports from pycodestyle. + + If aggressive is True, we allow possibly unsafe fixes (E711, E712). + + """ + non_docstring_string_line_numbers = multiline_string_lines( + source, include_docstrings=False) + all_string_line_numbers = multiline_string_lines( + source, include_docstrings=True) + + commented_out_code_line_numbers = commented_out_code_lines(source) + + # Filter out the disabled ranges + disabled_ranges = get_disabled_ranges(source) + if disabled_ranges: + results = [ + result for result in results if filter_disabled_results( + result, + disabled_ranges, + ) + ] + + has_e901 = any(result['id'].lower() == 'e901' for result in results) + + for r in results: + issue_id = r['id'].lower() + + if r['line'] in non_docstring_string_line_numbers: + if issue_id.startswith(('e1', 'e501', 'w191')): + continue + + if r['line'] in all_string_line_numbers: + if issue_id in ['e501']: + continue + + # We must offset by 1 for lines that contain the trailing contents of + # multiline strings. + if not aggressive and (r['line'] + 1) in all_string_line_numbers: + # Do not modify multiline strings in non-aggressive mode. Remove + # trailing whitespace could break doctests. + if issue_id.startswith(('w29', 'w39')): + continue + + if aggressive <= 0: + if issue_id.startswith(('e711', 'e72', 'w6')): + continue + + if aggressive <= 1: + if issue_id.startswith(('e712', 'e713', 'e714')): + continue + + if aggressive <= 2: + if issue_id.startswith(('e704')): + continue + + if r['line'] in commented_out_code_line_numbers: + if issue_id.startswith(('e261', 'e262', 'e501')): + continue + + # Do not touch indentation if there is a token error caused by + # incomplete multi-line statement. Otherwise, we risk screwing up the + # indentation. + if has_e901: + if issue_id.startswith(('e1', 'e7')): + continue + + yield r + + +def multiline_string_lines(source, include_docstrings=False): + """Return line numbers that are within multiline strings. + + The line numbers are indexed at 1. + + Docstrings are ignored. + + """ + line_numbers = set() + previous_token_type = '' + try: + for t in generate_tokens(source): + token_type = t[0] + start_row = t[2][0] + end_row = t[3][0] + + if token_type == tokenize.STRING and start_row != end_row: + if ( + include_docstrings or + previous_token_type != tokenize.INDENT + ): + # We increment by one since we want the contents of the + # string. + line_numbers |= set(range(1 + start_row, 1 + end_row)) + + previous_token_type = token_type + except (SyntaxError, tokenize.TokenError): + pass + + return line_numbers + + +def commented_out_code_lines(source): + """Return line numbers of comments that are likely code. + + Commented-out code is bad practice, but modifying it just adds even + more clutter. + + """ + line_numbers = [] + try: + for t in generate_tokens(source): + token_type = t[0] + token_string = t[1] + start_row = t[2][0] + line = t[4] + + # Ignore inline comments. + if not line.lstrip().startswith('#'): + continue + + if token_type == tokenize.COMMENT: + stripped_line = token_string.lstrip('#').strip() + with warnings.catch_warnings(): + # ignore SyntaxWarning in Python3.8+ + # refs: + # https://bugs.python.org/issue15248 + # https://docs.python.org/3.8/whatsnew/3.8.html#other-language-changes + warnings.filterwarnings("ignore", category=SyntaxWarning) + if ( + ' ' in stripped_line and + '#' not in stripped_line and + check_syntax(stripped_line) + ): + line_numbers.append(start_row) + except (SyntaxError, tokenize.TokenError): + pass + + return line_numbers + + +def shorten_comment(line, max_line_length, last_comment=False): + """Return trimmed or split long comment line. + + If there are no comments immediately following it, do a text wrap. + Doing this wrapping on all comments in general would lead to jagged + comment text. + + """ + assert len(line) > max_line_length + line = line.rstrip() + + # PEP 8 recommends 72 characters for comment text. + indentation = _get_indentation(line) + '# ' + max_line_length = min(max_line_length, + len(indentation) + 72) + + MIN_CHARACTER_REPEAT = 5 + if ( + len(line) - len(line.rstrip(line[-1])) >= MIN_CHARACTER_REPEAT and + not line[-1].isalnum() + ): + # Trim comments that end with things like --------- + return line[:max_line_length] + '\n' + elif last_comment and re.match(r'\s*#+\s*\w+', line): + split_lines = textwrap.wrap(line.lstrip(' \t#'), + initial_indent=indentation, + subsequent_indent=indentation, + width=max_line_length, + break_long_words=False, + break_on_hyphens=False) + return '\n'.join(split_lines) + '\n' + + return line + '\n' + + +def normalize_line_endings(lines, newline): + """Return fixed line endings. + + All lines will be modified to use the most common line ending. + """ + line = [line.rstrip('\n\r') + newline for line in lines] + if line and lines[-1] == lines[-1].rstrip('\n\r'): + line[-1] = line[-1].rstrip('\n\r') + return line + + +def mutual_startswith(a, b): + return b.startswith(a) or a.startswith(b) + + +def code_match(code, select, ignore): + if ignore: + assert not isinstance(ignore, str) + for ignored_code in [c.strip() for c in ignore]: + if mutual_startswith(code.lower(), ignored_code.lower()): + return False + + if select: + assert not isinstance(select, str) + for selected_code in [c.strip() for c in select]: + if mutual_startswith(code.lower(), selected_code.lower()): + return True + return False + + return True + + +def fix_code(source, options=None, encoding=None, apply_config=False): + """Return fixed source code. + + "encoding" will be used to decode "source" if it is a byte string. + + """ + options = _get_options(options, apply_config) + # normalize + options.ignore = [opt.upper() for opt in options.ignore] + options.select = [opt.upper() for opt in options.select] + + # check ignore args + # NOTE: If W50x is not included, add W50x because the code + # correction result is indefinite. + ignore_opt = options.ignore + if not {"W50", "W503", "W504"} & set(ignore_opt): + options.ignore.append("W50") + + if not isinstance(source, str): + source = source.decode(encoding or get_encoding()) + + sio = io.StringIO(source) + return fix_lines(sio.readlines(), options=options) + + +def _get_options(raw_options, apply_config): + """Return parsed options.""" + if not raw_options: + return parse_args([''], apply_config=apply_config) + + if isinstance(raw_options, dict): + options = parse_args([''], apply_config=apply_config) + for name, value in raw_options.items(): + if not hasattr(options, name): + raise ValueError("No such option '{}'".format(name)) + + # Check for very basic type errors. + expected_type = type(getattr(options, name)) + if not isinstance(expected_type, (str, )): + if isinstance(value, (str, )): + raise ValueError( + "Option '{}' should not be a string".format(name)) + setattr(options, name, value) + else: + options = raw_options + + return options + + +def fix_lines(source_lines, options, filename=''): + """Return fixed source code.""" + # Transform everything to line feed. Then change them back to original + # before returning fixed source code. + original_newline = find_newline(source_lines) + tmp_source = ''.join(normalize_line_endings(source_lines, '\n')) + + # Keep a history to break out of cycles. + previous_hashes = set() + + if options.line_range: + # Disable "apply_local_fixes()" for now due to issue #175. + fixed_source = tmp_source + else: + # Apply global fixes only once (for efficiency). + fixed_source = apply_global_fixes(tmp_source, + options, + filename=filename) + + passes = 0 + long_line_ignore_cache = set() + while hash(fixed_source) not in previous_hashes: + if options.pep8_passes >= 0 and passes > options.pep8_passes: + break + passes += 1 + + previous_hashes.add(hash(fixed_source)) + + tmp_source = copy.copy(fixed_source) + + fix = FixPEP8( + filename, + options, + contents=tmp_source, + long_line_ignore_cache=long_line_ignore_cache) + + fixed_source = fix.fix() + + sio = io.StringIO(fixed_source) + return ''.join(normalize_line_endings(sio.readlines(), original_newline)) + + +def fix_file(filename, options=None, output=None, apply_config=False): + if not options: + options = parse_args([filename], apply_config=apply_config) + + original_source = readlines_from_file(filename) + + fixed_source = original_source + + if options.in_place or options.diff or output: + encoding = detect_encoding(filename) + + if output: + output = LineEndingWrapper(wrap_output(output, encoding=encoding)) + + fixed_source = fix_lines(fixed_source, options, filename=filename) + + if options.diff: + new = io.StringIO(fixed_source) + new = new.readlines() + diff = get_diff_text(original_source, new, filename) + if output: + output.write(diff) + output.flush() + elif options.jobs > 1: + diff = diff.encode(encoding) + return diff + elif options.in_place: + original = "".join(original_source).splitlines() + fixed = fixed_source.splitlines() + original_source_last_line = ( + original_source[-1].split("\n")[-1] if original_source else "" + ) + fixed_source_last_line = fixed_source.split("\n")[-1] + if original != fixed or ( + original_source_last_line != fixed_source_last_line + ): + with open_with_encoding(filename, 'w', encoding=encoding) as fp: + fp.write(fixed_source) + return fixed_source + return None + else: + if output: + output.write(fixed_source) + output.flush() + return fixed_source + + +def global_fixes(): + """Yield multiple (code, function) tuples.""" + for function in list(globals().values()): + if inspect.isfunction(function): + arguments = _get_parameters(function) + if arguments[:1] != ['source']: + continue + + code = extract_code_from_function(function) + if code: + yield (code, function) + + +def _get_parameters(function): + # pylint: disable=deprecated-method + if sys.version_info.major >= 3: + # We need to match "getargspec()", which includes "self" as the first + # value for methods. + # https://bugs.python.org/issue17481#msg209469 + if inspect.ismethod(function): + function = function.__func__ + + return list(inspect.signature(function).parameters) + else: + return inspect.getargspec(function)[0] + + +def apply_global_fixes(source, options, where='global', filename='', + codes=None): + """Run global fixes on source code. + + These are fixes that only need be done once (unlike those in + FixPEP8, which are dependent on pycodestyle). + + """ + if codes is None: + codes = [] + if any(code_match(code, select=options.select, ignore=options.ignore) + for code in ['E101', 'E111']): + source = reindent(source, + indent_size=options.indent_size, + leave_tabs=not ( + code_match( + 'W191', + select=options.select, + ignore=options.ignore) + ) + ) + + for (code, function) in global_fixes(): + if code_match(code, select=options.select, ignore=options.ignore): + if options.verbose: + print('---> Applying {} fix for {}'.format(where, + code.upper()), + file=sys.stderr) + source = function(source, + aggressive=options.aggressive) + + source = fix_2to3(source, + aggressive=options.aggressive, + select=options.select, + ignore=options.ignore, + filename=filename, + where=where, + verbose=options.verbose) + + return source + + +def extract_code_from_function(function): + """Return code handled by function.""" + if not function.__name__.startswith('fix_'): + return None + + code = re.sub('^fix_', '', function.__name__) + if not code: + return None + + try: + int(code[1:]) + except ValueError: + return None + + return code + + +def _get_package_version(): + packages = ["pycodestyle: {}".format(pycodestyle.__version__)] + return ", ".join(packages) + + +def create_parser(): + """Return command-line parser.""" + parser = argparse.ArgumentParser(description=docstring_summary(__doc__), + prog='autopep8') + parser.add_argument('--version', action='version', + version='%(prog)s {} ({})'.format( + __version__, _get_package_version())) + parser.add_argument('-v', '--verbose', action='count', + default=0, + help='print verbose messages; ' + 'multiple -v result in more verbose messages') + parser.add_argument('-d', '--diff', action='store_true', + help='print the diff for the fixed source') + parser.add_argument('-i', '--in-place', action='store_true', + help='make changes to files in place') + parser.add_argument('--global-config', metavar='filename', + default=DEFAULT_CONFIG, + help='path to a global pep8 config file; if this file ' + 'does not exist then this is ignored ' + '(default: {})'.format(DEFAULT_CONFIG)) + parser.add_argument('--ignore-local-config', action='store_true', + help="don't look for and apply local config files; " + 'if not passed, defaults are updated with any ' + "config files in the project's root directory") + parser.add_argument('-r', '--recursive', action='store_true', + help='run recursively over directories; ' + 'must be used with --in-place or --diff') + parser.add_argument('-j', '--jobs', type=int, metavar='n', default=1, + help='number of parallel jobs; ' + 'match CPU count if value is less than 1') + parser.add_argument('-p', '--pep8-passes', metavar='n', + default=-1, type=int, + help='maximum number of additional pep8 passes ' + '(default: infinite)') + parser.add_argument('-a', '--aggressive', action='count', default=0, + help='enable non-whitespace changes; ' + 'multiple -a result in more aggressive changes') + parser.add_argument('--experimental', action='store_true', + help='enable experimental fixes') + parser.add_argument('--exclude', metavar='globs', + help='exclude file/directory names that match these ' + 'comma-separated globs') + parser.add_argument('--list-fixes', action='store_true', + help='list codes for fixes; ' + 'used by --ignore and --select') + parser.add_argument('--ignore', metavar='errors', default='', + help='do not fix these errors/warnings ' + '(default: {})'.format(DEFAULT_IGNORE)) + parser.add_argument('--select', metavar='errors', default='', + help='fix only these errors/warnings (e.g. E4,W)') + parser.add_argument('--max-line-length', metavar='n', default=79, type=int, + help='set maximum allowed line length ' + '(default: %(default)s)') + parser.add_argument('--line-range', '--range', metavar='line', + default=None, type=int, nargs=2, + help='only fix errors found within this inclusive ' + 'range of line numbers (e.g. 1 99); ' + 'line numbers are indexed at 1') + parser.add_argument('--indent-size', default=DEFAULT_INDENT_SIZE, + type=int, help=argparse.SUPPRESS) + parser.add_argument('--hang-closing', action='store_true', + help='hang-closing option passed to pycodestyle') + parser.add_argument('--exit-code', action='store_true', + help='change to behavior of exit code.' + ' default behavior of return value, 0 is no ' + 'differences, 1 is error exit. return 2 when' + ' add this option. 2 is exists differences.') + parser.add_argument('files', nargs='*', + help="files to format or '-' for standard in") + + return parser + + +def _expand_codes(codes, ignore_codes): + """expand to individual E/W codes""" + ret = set() + + is_conflict = False + if all( + any( + conflicting_code.startswith(code) + for code in codes + ) + for conflicting_code in CONFLICTING_CODES + ): + is_conflict = True + + is_ignore_w503 = "W503" in ignore_codes + is_ignore_w504 = "W504" in ignore_codes + + for code in codes: + if code == "W": + if is_ignore_w503 and is_ignore_w504: + ret.update({"W1", "W2", "W3", "W505", "W6"}) + elif is_ignore_w503: + ret.update({"W1", "W2", "W3", "W504", "W505", "W6"}) + else: + ret.update({"W1", "W2", "W3", "W503", "W505", "W6"}) + elif code in ("W5", "W50"): + if is_ignore_w503 and is_ignore_w504: + ret.update({"W505"}) + elif is_ignore_w503: + ret.update({"W504", "W505"}) + else: + ret.update({"W503", "W505"}) + elif not (code in ("W503", "W504") and is_conflict): + ret.add(code) + + return ret + + +def parse_args(arguments, apply_config=False): + """Parse command-line options.""" + parser = create_parser() + args = parser.parse_args(arguments) + + if not args.files and not args.list_fixes: + parser.exit(EXIT_CODE_ARGPARSE_ERROR, 'incorrect number of arguments') + + args.files = [decode_filename(name) for name in args.files] + + if apply_config: + parser = read_config(args, parser) + # prioritize settings when exist pyproject.toml's tool.autopep8 section + try: + parser_with_pyproject_toml = read_pyproject_toml(args, parser) + except Exception: + parser_with_pyproject_toml = None + if parser_with_pyproject_toml: + parser = parser_with_pyproject_toml + args = parser.parse_args(arguments) + args.files = [decode_filename(name) for name in args.files] + + if '-' in args.files: + if len(args.files) > 1: + parser.exit( + EXIT_CODE_ARGPARSE_ERROR, + 'cannot mix stdin and regular files', + ) + + if args.diff: + parser.exit( + EXIT_CODE_ARGPARSE_ERROR, + '--diff cannot be used with standard input', + ) + + if args.in_place: + parser.exit( + EXIT_CODE_ARGPARSE_ERROR, + '--in-place cannot be used with standard input', + ) + + if args.recursive: + parser.exit( + EXIT_CODE_ARGPARSE_ERROR, + '--recursive cannot be used with standard input', + ) + + if len(args.files) > 1 and not (args.in_place or args.diff): + parser.exit( + EXIT_CODE_ARGPARSE_ERROR, + 'autopep8 only takes one filename as argument ' + 'unless the "--in-place" or "--diff" args are used', + ) + + if args.recursive and not (args.in_place or args.diff): + parser.exit( + EXIT_CODE_ARGPARSE_ERROR, + '--recursive must be used with --in-place or --diff', + ) + + if args.in_place and args.diff: + parser.exit( + EXIT_CODE_ARGPARSE_ERROR, + '--in-place and --diff are mutually exclusive', + ) + + if args.max_line_length <= 0: + parser.exit( + EXIT_CODE_ARGPARSE_ERROR, + '--max-line-length must be greater than 0', + ) + + if args.indent_size <= 0: + parser.exit( + EXIT_CODE_ARGPARSE_ERROR, + '--indent-size must be greater than 0', + ) + + if args.select: + args.select = _expand_codes( + _split_comma_separated(args.select), + (_split_comma_separated(args.ignore) if args.ignore else []) + ) + + if args.ignore: + args.ignore = _split_comma_separated(args.ignore) + if all( + not any( + conflicting_code.startswith(ignore_code) + for ignore_code in args.ignore + ) + for conflicting_code in CONFLICTING_CODES + ): + args.ignore.update(CONFLICTING_CODES) + elif not args.select: + if args.aggressive: + # Enable everything by default if aggressive. + args.select = {'E', 'W1', 'W2', 'W3', 'W6'} + else: + args.ignore = _split_comma_separated(DEFAULT_IGNORE) + + if args.exclude: + args.exclude = _split_comma_separated(args.exclude) + else: + args.exclude = {} + + if args.jobs < 1: + # Do not import multiprocessing globally in case it is not supported + # on the platform. + import multiprocessing + args.jobs = multiprocessing.cpu_count() + + if args.jobs > 1 and not (args.in_place or args.diff): + parser.exit( + EXIT_CODE_ARGPARSE_ERROR, + 'parallel jobs requires --in-place', + ) + + if args.line_range: + if args.line_range[0] <= 0: + parser.exit( + EXIT_CODE_ARGPARSE_ERROR, + '--range must be positive numbers', + ) + if args.line_range[0] > args.line_range[1]: + parser.exit( + EXIT_CODE_ARGPARSE_ERROR, + 'First value of --range should be less than or equal ' + 'to the second', + ) + + return args + + +def _get_normalize_options(args, config, section, option_list): + for (k, v) in config.items(section): + norm_opt = k.lstrip('-').replace('-', '_') + if not option_list.get(norm_opt): + continue + opt_type = option_list[norm_opt] + if opt_type is int: + if v.strip() == "auto": + # skip to special case + if args.verbose: + print(f"ignore config: {k}={v}") + continue + value = config.getint(section, k) + elif opt_type is bool: + value = config.getboolean(section, k) + else: + value = config.get(section, k) + yield norm_opt, k, value + + +def read_config(args, parser): + """Read both user configuration and local configuration.""" + config = SafeConfigParser() + + try: + if args.verbose and os.path.exists(args.global_config): + print("read config path: {}".format(args.global_config)) + config.read(args.global_config) + + if not args.ignore_local_config: + parent = tail = args.files and os.path.abspath( + os.path.commonprefix(args.files)) + while tail: + if config.read([os.path.join(parent, fn) + for fn in PROJECT_CONFIG]): + if args.verbose: + for fn in PROJECT_CONFIG: + config_file = os.path.join(parent, fn) + if not os.path.exists(config_file): + continue + print( + "read config path: {}".format( + os.path.join(parent, fn) + ) + ) + break + (parent, tail) = os.path.split(parent) + + defaults = {} + option_list = {o.dest: o.type or type(o.default) + for o in parser._actions} + + for section in ['pep8', 'pycodestyle', 'flake8']: + if not config.has_section(section): + continue + for norm_opt, k, value in _get_normalize_options( + args, config, section, option_list + ): + if args.verbose: + print("enable config: section={}, key={}, value={}".format( + section, k, value)) + defaults[norm_opt] = value + + parser.set_defaults(**defaults) + except Error: + # Ignore for now. + pass + + return parser + + +def read_pyproject_toml(args, parser): + """Read pyproject.toml and load configuration.""" + if sys.version_info >= (3, 11): + import tomllib + else: + import tomli as tomllib + + config = None + + if os.path.exists(args.global_config): + with open(args.global_config, "rb") as fp: + config = tomllib.load(fp) + + if not args.ignore_local_config: + parent = tail = args.files and os.path.abspath( + os.path.commonprefix(args.files)) + while tail: + pyproject_toml = os.path.join(parent, "pyproject.toml") + if os.path.exists(pyproject_toml): + with open(pyproject_toml, "rb") as fp: + config = tomllib.load(fp) + break + (parent, tail) = os.path.split(parent) + + if not config: + return None + + if config.get("tool", {}).get("autopep8") is None: + return None + + config = config.get("tool").get("autopep8") + + defaults = {} + option_list = {o.dest: o.type or type(o.default) + for o in parser._actions} + + TUPLED_OPTIONS = ("ignore", "select") + for (k, v) in config.items(): + norm_opt = k.lstrip('-').replace('-', '_') + if not option_list.get(norm_opt): + continue + if type(v) in (list, tuple) and norm_opt in TUPLED_OPTIONS: + value = ",".join(v) + else: + value = v + if args.verbose: + print("enable pyproject.toml config: " + "key={}, value={}".format(k, value)) + defaults[norm_opt] = value + + if defaults: + # set value when exists key-value in defaults dict + parser.set_defaults(**defaults) + + return parser + + +def _split_comma_separated(string): + """Return a set of strings.""" + return {text.strip() for text in string.split(',') if text.strip()} + + +def decode_filename(filename): + """Return Unicode filename.""" + if isinstance(filename, str): + return filename + + return filename.decode(sys.getfilesystemencoding()) + + +def supported_fixes(): + """Yield pep8 error codes that autopep8 fixes. + + Each item we yield is a tuple of the code followed by its + description. + + """ + yield ('E101', docstring_summary(reindent.__doc__)) + + instance = FixPEP8(filename=None, options=None, contents='') + for attribute in dir(instance): + code = re.match('fix_([ew][0-9][0-9][0-9])', attribute) + if code: + yield ( + code.group(1).upper(), + re.sub(r'\s+', ' ', + docstring_summary(getattr(instance, attribute).__doc__)) + ) + + for (code, function) in sorted(global_fixes()): + yield (code.upper() + (4 - len(code)) * ' ', + re.sub(r'\s+', ' ', docstring_summary(function.__doc__))) + + for code in sorted(CODE_TO_2TO3): + yield (code.upper() + (4 - len(code)) * ' ', + re.sub(r'\s+', ' ', docstring_summary(fix_2to3.__doc__))) + + +def docstring_summary(docstring): + """Return summary of docstring.""" + return docstring.split('\n')[0] if docstring else '' + + +def line_shortening_rank(candidate, indent_word, max_line_length, + experimental=False): + """Return rank of candidate. + + This is for sorting candidates. + + """ + if not candidate.strip(): + return 0 + + rank = 0 + lines = candidate.rstrip().split('\n') + + offset = 0 + if ( + not lines[0].lstrip().startswith('#') and + lines[0].rstrip()[-1] not in '([{' + ): + for (opening, closing) in ('()', '[]', '{}'): + # Don't penalize empty containers that aren't split up. Things like + # this "foo(\n )" aren't particularly good. + opening_loc = lines[0].find(opening) + closing_loc = lines[0].find(closing) + if opening_loc >= 0: + if closing_loc < 0 or closing_loc != opening_loc + 1: + offset = max(offset, 1 + opening_loc) + + current_longest = max(offset + len(x.strip()) for x in lines) + + rank += 4 * max(0, current_longest - max_line_length) + + rank += len(lines) + + # Too much variation in line length is ugly. + rank += 2 * standard_deviation(len(line) for line in lines) + + bad_staring_symbol = { + '(': ')', + '[': ']', + '{': '}'}.get(lines[0][-1]) + + if len(lines) > 1: + if ( + bad_staring_symbol and + lines[1].lstrip().startswith(bad_staring_symbol) + ): + rank += 20 + + for lineno, current_line in enumerate(lines): + current_line = current_line.strip() + + if current_line.startswith('#'): + continue + + for bad_start in ['.', '%', '+', '-', '/']: + if current_line.startswith(bad_start): + rank += 100 + + # Do not tolerate operators on their own line. + if current_line == bad_start: + rank += 1000 + + if ( + current_line.endswith(('.', '%', '+', '-', '/')) and + "': " in current_line + ): + rank += 1000 + + if current_line.endswith(('(', '[', '{', '.')): + # Avoid lonely opening. They result in longer lines. + if len(current_line) <= len(indent_word): + rank += 100 + + # Avoid the ugliness of ", (\n". + if ( + current_line.endswith('(') and + current_line[:-1].rstrip().endswith(',') + ): + rank += 100 + + # Avoid the ugliness of "something[\n" and something[index][\n. + if ( + current_line.endswith('[') and + len(current_line) > 1 and + (current_line[-2].isalnum() or current_line[-2] in ']') + ): + rank += 300 + + # Also avoid the ugliness of "foo.\nbar" + if current_line.endswith('.'): + rank += 100 + + if has_arithmetic_operator(current_line): + rank += 100 + + # Avoid breaking at unary operators. + if re.match(r'.*[(\[{]\s*[\-\+~]$', current_line.rstrip('\\ ')): + rank += 1000 + + if re.match(r'.*lambda\s*\*$', current_line.rstrip('\\ ')): + rank += 1000 + + if current_line.endswith(('%', '(', '[', '{')): + rank -= 20 + + # Try to break list comprehensions at the "for". + if current_line.startswith('for '): + rank -= 50 + + if current_line.endswith('\\'): + # If a line ends in \-newline, it may be part of a + # multiline string. In that case, we would like to know + # how long that line is without the \-newline. If it's + # longer than the maximum, or has comments, then we assume + # that the \-newline is an okay candidate and only + # penalize it a bit. + total_len = len(current_line) + lineno += 1 + while lineno < len(lines): + total_len += len(lines[lineno]) + + if lines[lineno].lstrip().startswith('#'): + total_len = max_line_length + break + + if not lines[lineno].endswith('\\'): + break + + lineno += 1 + + if total_len < max_line_length: + rank += 10 + else: + rank += 100 if experimental else 1 + + # Prefer breaking at commas rather than colon. + if ',' in current_line and current_line.endswith(':'): + rank += 10 + + # Avoid splitting dictionaries between key and value. + if current_line.endswith(':'): + rank += 100 + + rank += 10 * count_unbalanced_brackets(current_line) + + return max(0, rank) + + +def standard_deviation(numbers): + """Return standard deviation.""" + numbers = list(numbers) + if not numbers: + return 0 + mean = sum(numbers) / len(numbers) + return (sum((n - mean) ** 2 for n in numbers) / + len(numbers)) ** .5 + + +def has_arithmetic_operator(line): + """Return True if line contains any arithmetic operators.""" + for operator in pycodestyle.ARITHMETIC_OP: + if operator in line: + return True + + return False + + +def count_unbalanced_brackets(line): + """Return number of unmatched open/close brackets.""" + count = 0 + for opening, closing in ['()', '[]', '{}']: + count += abs(line.count(opening) - line.count(closing)) + + return count + + +def split_at_offsets(line, offsets): + """Split line at offsets. + + Return list of strings. + + """ + result = [] + + previous_offset = 0 + current_offset = 0 + for current_offset in sorted(offsets): + if current_offset < len(line) and previous_offset != current_offset: + result.append(line[previous_offset:current_offset].strip()) + previous_offset = current_offset + + result.append(line[current_offset:]) + + return result + + +class LineEndingWrapper(object): + + r"""Replace line endings to work with sys.stdout. + + It seems that sys.stdout expects only '\n' as the line ending, no matter + the platform. Otherwise, we get repeated line endings. + + """ + + def __init__(self, output): + self.__output = output + + def write(self, s): + self.__output.write(s.replace('\r\n', '\n').replace('\r', '\n')) + + def flush(self): + self.__output.flush() + + +def match_file(filename, exclude): + """Return True if file is okay for modifying/recursing.""" + base_name = os.path.basename(filename) + + if base_name.startswith('.'): + return False + + for pattern in exclude: + if fnmatch.fnmatch(base_name, pattern): + return False + if fnmatch.fnmatch(filename, pattern): + return False + + if not os.path.isdir(filename) and not is_python_file(filename): + return False + + return True + + +def find_files(filenames, recursive, exclude): + """Yield filenames.""" + while filenames: + name = filenames.pop(0) + if recursive and os.path.isdir(name): + for root, directories, children in os.walk(name): + filenames += [os.path.join(root, f) for f in children + if match_file(os.path.join(root, f), + exclude)] + directories[:] = [d for d in directories + if match_file(os.path.join(root, d), + exclude)] + else: + is_exclude_match = False + for pattern in exclude: + if fnmatch.fnmatch(name, pattern): + is_exclude_match = True + break + if not is_exclude_match: + yield name + + +def _fix_file(parameters): + """Helper function for optionally running fix_file() in parallel.""" + if parameters[1].verbose: + print('[file:{}]'.format(parameters[0]), file=sys.stderr) + try: + return fix_file(*parameters) + except IOError as error: + print(str(error), file=sys.stderr) + raise error + + +def fix_multiple_files(filenames, options, output=None): + """Fix list of files. + + Optionally fix files recursively. + + """ + results = [] + filenames = find_files(filenames, options.recursive, options.exclude) + if options.jobs > 1: + import multiprocessing + pool = multiprocessing.Pool(options.jobs) + rets = [] + for name in filenames: + ret = pool.apply_async(_fix_file, ((name, options),)) + rets.append(ret) + pool.close() + pool.join() + if options.diff: + for r in rets: + sys.stdout.write(r.get().decode()) + sys.stdout.flush() + results.extend([x.get() for x in rets if x is not None]) + else: + for name in filenames: + ret = _fix_file((name, options, output)) + if ret is None: + continue + if options.diff: + if ret != '': + results.append(ret) + elif options.in_place: + results.append(ret) + else: + original_source = readlines_from_file(name) + if "".join(original_source).splitlines() != ret.splitlines(): + results.append(ret) + return results + + +def is_python_file(filename): + """Return True if filename is Python file.""" + if filename.endswith('.py'): + return True + + try: + with open_with_encoding( + filename, + limit_byte_check=MAX_PYTHON_FILE_DETECTION_BYTES) as f: + text = f.read(MAX_PYTHON_FILE_DETECTION_BYTES) + if not text: + return False + first_line = text.splitlines()[0] + except (IOError, IndexError): + return False + + if not PYTHON_SHEBANG_REGEX.match(first_line): + return False + + return True + + +def is_probably_part_of_multiline(line): + """Return True if line is likely part of a multiline string. + + When multiline strings are involved, pep8 reports the error as being + at the start of the multiline string, which doesn't work for us. + + """ + return ( + '"""' in line or + "'''" in line or + line.rstrip().endswith('\\') + ) + + +def wrap_output(output, encoding): + """Return output with specified encoding.""" + return codecs.getwriter(encoding)(output.buffer + if hasattr(output, 'buffer') + else output) + + +def get_encoding(): + """Return preferred encoding.""" + return locale.getpreferredencoding() or sys.getdefaultencoding() + + +def main(argv=None, apply_config=True): + """Command-line entry.""" + if argv is None: + argv = sys.argv + + try: + # Exit on broken pipe. + signal.signal(signal.SIGPIPE, signal.SIG_DFL) + except AttributeError: # pragma: no cover + # SIGPIPE is not available on Windows. + pass + + try: + args = parse_args(argv[1:], apply_config=apply_config) + + if args.list_fixes: + for code, description in sorted(supported_fixes()): + print('{code} - {description}'.format( + code=code, description=description)) + return EXIT_CODE_OK + + if args.files == ['-']: + assert not args.in_place + + encoding = sys.stdin.encoding or get_encoding() + read_stdin = sys.stdin.read() + fixed_stdin = fix_code(read_stdin, args, encoding=encoding) + + # LineEndingWrapper is unnecessary here due to the symmetry between + # standard in and standard out. + wrap_output(sys.stdout, encoding=encoding).write(fixed_stdin) + + if hash(read_stdin) != hash(fixed_stdin): + if args.exit_code: + return EXIT_CODE_EXISTS_DIFF + else: + if args.in_place or args.diff: + args.files = list(set(args.files)) + else: + assert len(args.files) == 1 + assert not args.recursive + + results = fix_multiple_files(args.files, args, sys.stdout) + if args.diff: + ret = any([len(ret) != 0 for ret in results]) + else: + # with in-place option + ret = any([ret is not None for ret in results]) + if args.exit_code and ret: + return EXIT_CODE_EXISTS_DIFF + except IOError: + return EXIT_CODE_ERROR + except KeyboardInterrupt: + return EXIT_CODE_ERROR # pragma: no cover + + +class CachedTokenizer(object): + + """A one-element cache around tokenize.generate_tokens(). + + Original code written by Ned Batchelder, in coverage.py. + + """ + + def __init__(self): + self.last_text = None + self.last_tokens = None + + def generate_tokens(self, text): + """A stand-in for tokenize.generate_tokens().""" + if text != self.last_text: + string_io = io.StringIO(text) + self.last_tokens = list( + tokenize.generate_tokens(string_io.readline) + ) + self.last_text = text + return self.last_tokens + + +_cached_tokenizer = CachedTokenizer() +generate_tokens = _cached_tokenizer.generate_tokens + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/INSTALLER b/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/LICENSE b/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/LICENSE new file mode 120000 index 00000000..0feb4e60 --- /dev/null +++ b/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/LICENSE @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/7a/f3/41/4fed1e59b7b898ef122a76a7d8668775d95d0556c8ea76de44a5d9a197 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/METADATA b/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/METADATA new file mode 120000 index 00000000..6b605b6c --- /dev/null +++ b/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/METADATA @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/41/0d/77/e6a175ccf0c8c65d02720144624c94cbe79719f6f9833d57197decebf4 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/RECORD b/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/RECORD new file mode 100644 index 00000000..763efbd2 --- /dev/null +++ b/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/RECORD @@ -0,0 +1,94 @@ +../../../bin/get_objgraph,sha256=alA_HypFrCFdb_KtCGawwEw0FSj6UmUpi3IULIE85No,1641 +../../../bin/undill,sha256=4klKb3PfP6FqVmHafjybFpUA4ml7wmviFlbOcvzKWa8,577 +dill-0.3.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +dill-0.3.6.dist-info/LICENSE,sha256=evNBT-0eWbe4mO8SKnan2GaHddldBVbI6nbeRKXZoZc,1790 +dill-0.3.6.dist-info/METADATA,sha256=QQ135qF1zPDIxl0CcgFEYkyUy-eXGfb5gz1XGX3s6_Q,9847 +dill-0.3.6.dist-info/RECORD,, +dill-0.3.6.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +dill-0.3.6.dist-info/top_level.txt,sha256=HLSIyYIjQzJiBvs3_-16ntezE3j6mWGTW0DT1xDd7X0,5 +dill/__diff.py,sha256=_-xqkDp9hgCmL3OZWaVN9p3mfJHi0ITlFE_AGtVvK2A,7143 +dill/__info__.py,sha256=C_5MG2kSI1Q_5gmzDeDNGnS_mRQPzvcPIK3zNGvYOFM,10612 +dill/__init__.py,sha256=aieQ5jaTr-rV4SGbTOxes_BUR8afH1tQR-9HVlyjxNc,3797 +dill/__pycache__/__diff.cpython-310.pyc,, +dill/__pycache__/__info__.cpython-310.pyc,, +dill/__pycache__/__init__.cpython-310.pyc,, +dill/__pycache__/_dill.cpython-310.pyc,, +dill/__pycache__/_objects.cpython-310.pyc,, +dill/__pycache__/_shims.cpython-310.pyc,, +dill/__pycache__/detect.cpython-310.pyc,, +dill/__pycache__/logger.cpython-310.pyc,, +dill/__pycache__/objtypes.cpython-310.pyc,, +dill/__pycache__/pointers.cpython-310.pyc,, +dill/__pycache__/session.cpython-310.pyc,, +dill/__pycache__/settings.cpython-310.pyc,, +dill/__pycache__/source.cpython-310.pyc,, +dill/__pycache__/temp.cpython-310.pyc,, +dill/_dill.py,sha256=7nh6DAfekcE8cwEYz5mLGqI8uHmH0EmpCjjfZ9_y9LI,82292 +dill/_objects.py,sha256=orBDFlfDPrpk_1FzVVqmn0zexF7uygEVLr7B8WpPXoM,19368 +dill/_shims.py,sha256=FFZo7JJZfz35iFZ-aDY07llbDd9M5IlA-lZ7nPJ0x00,6635 +dill/detect.py,sha256=pGADKt4dptlr5hzJzE-YzqEdoyJIICM8sspYRQrx26Q,11091 +dill/logger.py,sha256=w98pwlNZRUeDrVEsbwQwFjZjdtr2-5lgU93ffSeubBo,11079 +dill/objtypes.py,sha256=l3lfnIox6YJQXN-kXejlajubu-rAAfZ8alQF73l2V3U,736 +dill/pointers.py,sha256=7NIitFkL91Z0-_kTBHXGEqL8seI9qWVouFbykgDlcUw,4467 +dill/session.py,sha256=LVJY9CqFpbw8ckL7YMPnhyn44gDBgSeMHtb9O3C774E,22500 +dill/settings.py,sha256=NuSlm5ItUpCLAU5LoCoLzNt15ku8_APsk1p3XCxYltY,630 +dill/source.py,sha256=BhhsnqcmaiCa6t1oOX8r25JHm69ko9dETnC35jjdbIU,45121 +dill/temp.py,sha256=p1JAbDeiCrfUDlrJhqvZSsNBN12vvfie7yIQZGPUQg8,8027 +dill/tests/__init__.py,sha256=vZabTjRnwYaN-v3uL2fJBqKqj0T7_9Omwy63JSigvTA,501 +dill/tests/__main__.py,sha256=AJNslg4q2QHuMmXME8y6mSazzjz5dSA_mEgLILEXGNo,899 +dill/tests/__pycache__/__init__.cpython-310.pyc,, +dill/tests/__pycache__/__main__.cpython-310.pyc,, +dill/tests/__pycache__/test_check.cpython-310.pyc,, +dill/tests/__pycache__/test_classdef.cpython-310.pyc,, +dill/tests/__pycache__/test_dataclasses.cpython-310.pyc,, +dill/tests/__pycache__/test_detect.cpython-310.pyc,, +dill/tests/__pycache__/test_dictviews.cpython-310.pyc,, +dill/tests/__pycache__/test_diff.cpython-310.pyc,, +dill/tests/__pycache__/test_extendpickle.cpython-310.pyc,, +dill/tests/__pycache__/test_fglobals.cpython-310.pyc,, +dill/tests/__pycache__/test_file.cpython-310.pyc,, +dill/tests/__pycache__/test_functions.cpython-310.pyc,, +dill/tests/__pycache__/test_functors.cpython-310.pyc,, +dill/tests/__pycache__/test_logger.cpython-310.pyc,, +dill/tests/__pycache__/test_mixins.cpython-310.pyc,, +dill/tests/__pycache__/test_module.cpython-310.pyc,, +dill/tests/__pycache__/test_moduledict.cpython-310.pyc,, +dill/tests/__pycache__/test_nested.cpython-310.pyc,, +dill/tests/__pycache__/test_objects.cpython-310.pyc,, +dill/tests/__pycache__/test_properties.cpython-310.pyc,, +dill/tests/__pycache__/test_pycapsule.cpython-310.pyc,, +dill/tests/__pycache__/test_recursive.cpython-310.pyc,, +dill/tests/__pycache__/test_registered.cpython-310.pyc,, +dill/tests/__pycache__/test_restricted.cpython-310.pyc,, +dill/tests/__pycache__/test_selected.cpython-310.pyc,, +dill/tests/__pycache__/test_session.cpython-310.pyc,, +dill/tests/__pycache__/test_source.cpython-310.pyc,, +dill/tests/__pycache__/test_temp.cpython-310.pyc,, +dill/tests/__pycache__/test_weakref.cpython-310.pyc,, +dill/tests/test_check.py,sha256=KjX6OG9mwHWPfN0pnNacJxP7F7uIiNupnn7T2pgUX0Q,1396 +dill/tests/test_classdef.py,sha256=iJR7b4yRc7t8v0G9kLMqZWJ0WzSy3zCKGuCoqNAlNSo,6100 +dill/tests/test_dataclasses.py,sha256=jeVqMLQIhWT_SubVNLb9qayiOF9qlyIyk_KG93kalzc,885 +dill/tests/test_detect.py,sha256=AQo_m3QZC87xQ6htJ3zYJcpRY3dQPGVAj5e6poBza8M,4083 +dill/tests/test_dictviews.py,sha256=EF2jtJjmCv-LR_jT_9n76JZgnE5qwCSf1K2t4LbI0jE,1337 +dill/tests/test_diff.py,sha256=CPDayNL_gO7ecRQ4O_sSdX03__GHEdIrlat30aWbmW0,2667 +dill/tests/test_extendpickle.py,sha256=LtrP8Qo2rdRvQrCaFxnsXaIvTzYfuByL4CDqVndLs10,1315 +dill/tests/test_fglobals.py,sha256=a3xGhcKEp7ly3YDE1zKTL0NWtp6Hz7NmmCD_2IPDDLA,1679 +dill/tests/test_file.py,sha256=qSBC3izDyB9oWXurwO70uwNca3bNW0dkz93Nw2aapso,13578 +dill/tests/test_functions.py,sha256=cWXR3Whje46jLTt3n9PQ1Fr2Jw3W5qf3gsuBlUThKVc,4119 +dill/tests/test_functors.py,sha256=Sc9npIl2jTaIWi9Q_1RP37mhLo1ipapilrKN8Pe9JzA,930 +dill/tests/test_logger.py,sha256=-x9MZVGWRRZZuyjqcgKRV1HRz0-m7O3FabOMoBR_E5Q,2380 +dill/tests/test_mixins.py,sha256=oVHtv1W3v7VgpiBKtJIR1nqa2D6oDK6Br4zbIfVuXOI,4007 +dill/tests/test_module.py,sha256=DPVOyxXr3hUX83_eZ-SXNQixr99CwzgF1pq51oBrkuc,1943 +dill/tests/test_moduledict.py,sha256=GQ-grHuJl1uwEarrhVFoizNvxcfR5pQJDLETfjj481M,1182 +dill/tests/test_nested.py,sha256=qzWuWw3NRkDkIJ7cG0N0DCRS5InED9lDo2CtT7jsTMk,3146 +dill/tests/test_objects.py,sha256=mIFBW_ukZnQtglAZzXfErk65DabsaB1r1PJremqB7pw,1834 +dill/tests/test_properties.py,sha256=1mBRrIeYAu_4x14viOtN8uMeefQ8Zwv6Ovvu3EPDg9g,1346 +dill/tests/test_pycapsule.py,sha256=_jc4a_RYedtQ-FbdToxz65agm57oKG99SeWUhkq_H6w,1412 +dill/tests/test_recursive.py,sha256=dy4abzceZVpAe0GaPrffeC2RAHm4a7UJU_bT_HvoqDE,4182 +dill/tests/test_registered.py,sha256=Ty40fZzPBImRvh6URt0P3aSeKc8UG171122LQ6-MA0I,1250 +dill/tests/test_restricted.py,sha256=fcEbNfLbb1ar4EuR_Np9QoOqdnLeRoXSQXnIMvp73Lg,783 +dill/tests/test_selected.py,sha256=8X7kdiEccwo0mhDQe7DNQqgx0KwepK1sRa8uSQ2E6V0,3218 +dill/tests/test_session.py,sha256=_1J2JJXo1eHuW2dbx-NyHpl6ZwL6ydl48oDMGFUq_L0,10156 +dill/tests/test_source.py,sha256=uj_VEaCbPguguTjF-bXG8llXwXnE7Tr5HbMQkeHGTdE,6036 +dill/tests/test_temp.py,sha256=w2Z-GDhxz3Gx1jXMWpnE1728s7i0eGfXwc1VNWGl1OQ,2619 +dill/tests/test_weakref.py,sha256=JZ_14HFPigx3YTqKHxSL2bNmnPQ87d5-8jQPhCuta_Y,1602 diff --git a/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/WHEEL b/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/WHEEL new file mode 120000 index 00000000..7e89bc16 --- /dev/null +++ b/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/WHEEL @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/1b/5e/87/e00dc87a84269cead8578b9e6462928e18a95f1f3373c9eef451a5bcc0 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/top_level.txt b/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/top_level.txt new file mode 120000 index 00000000..10173762 --- /dev/null +++ b/venv/lib/python3.10/site-packages/dill-0.3.6.dist-info/top_level.txt @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/1c/b4/88/c9822343326206fb37ffed7a9ed7b31378fa9961935b40d3d710dded7d \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/dill/__diff.py b/venv/lib/python3.10/site-packages/dill/__diff.py new file mode 120000 index 00000000..b0aebe70 --- /dev/null +++ b/venv/lib/python3.10/site-packages/dill/__diff.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/ff/ec/6a/903a7d8600a62f739959a54df69de67c91e2d084e5144fc01ad56f2b60 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/dill/__info__.py b/venv/lib/python3.10/site-packages/dill/__info__.py new file mode 120000 index 00000000..8915ea4a --- /dev/null +++ b/venv/lib/python3.10/site-packages/dill/__info__.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/0b/fe/4c/1b691223543fe609b30de0cd1a74bf99140fcef70f20adf3346bd83853 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/dill/__init__.py b/venv/lib/python3.10/site-packages/dill/__init__.py new file mode 120000 index 00000000..5588e2e6 --- /dev/null +++ b/venv/lib/python3.10/site-packages/dill/__init__.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/6a/27/90/e63693afead5e1219b4cec5eb3f05447c69f1f5b5047ef47565ca3c4d7 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/dill/__pycache__/__diff.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/__pycache__/__diff.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..868425da41dcda2f2ba08f1cddee2e667d1e47bb GIT binary patch literal 5846 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 b_<7({`ITel@z32~-1)n^-`)M-S0DZlxgXi9 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/__pycache__/__init__.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..015177655a61f6d13035c34e81a1501eda4751ff GIT binary patch literal 3656 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%0AVjtONtZUg4#1#7F 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 VzmL`f_R)TI{w4zhSmkc(zX3bfj?Vx9 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/__pycache__/_shims.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/__pycache__/_shims.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c8ff2f334f9d2073538d8bbad7b27daf8ce1b33 GIT binary patch literal 6578 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/__pycache__/detect.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/__pycache__/detect.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83ebee0728457f03d9f8d067cc93491c2241d8c1 GIT binary patch literal 8260 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/__pycache__/logger.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/__pycache__/logger.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6bec022ac0c39911b84a681cf87c89729e9d939 GIT binary patch literal 8844 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 R`J~n)5w74G7p%EA{};luN+19L literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/__pycache__/objtypes.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/__pycache__/objtypes.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96c9443dd42e5237e22aaddf7c26406501f72632 GIT binary patch literal 530 zcmY*VL5tKd7)>&no!L5j5m`KbmvyJ$G*%H|QCZOim1Pk3AkMIqO!Mi~O`DputDTeJ z-%!w_cYjT&myl7hXvI%)4kMF(r|clexVZ;K z7DQ3SG|kz9QG)E-;5&IjPJ;!E-|)KZSS}--ScC z9o-89F9TD!LVrXAnUjjA<1q~6|L^T0=w@q}Kbj4?W<6S_s& FzyF~8mc9T0 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/__pycache__/pointers.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/__pycache__/pointers.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cdcb68f0904a69ae176276197b4f0afdadae82e GIT binary patch literal 3422 zcmc&$&5zs073Yv5MRBFg`U7d~H0?A^vnzKk+5JcX*IqQR<1|IF3GAQ+R2T}EGm@B4 zq&ysLRtpM9u`b$Mu08Jdw#OFvJNgIk+LJH6^w1)Qw!b%&*4jEfB|u2<@y*PeH*em& z-+Pm_T7hF(*8RVJFnaJ${ja})Kljk!&+z3RfDA2R{fYG~!GxW#9y5QtXA4Kv5@%fN zxy%CZg75L~?I+QASUrl8Y?7sW{TemnC)U%1?QJC^Q zNbx*QhY&ZNTe36k@Ho{xQ*YuCmFmaRoHBz5m~x?$a)Gk2Vedkh_*gt z^V;vNfq~Eyf9`6#aD;PY=NAfRz)}R^9H0{J6RU9USw|F{4uaDyY80Hp!(0EIbH$o_ zg@=&z4?n*T7aQN1os%OM0Ma=h;GE&84!=uY;U8l!TtfWgSdYv=VBEa$=huW2og*zk9LKvA?gR0!V%k~iCCVs&n-YpyO=nUT|i zl_27G5h1j^(GbxoFCXH`&zJE1gHE16{Ris^;5}u#r>qQOU?SHcLK!V~aLQB*VpWvT zftLR5BpmOFaOXPdut5Ur@XEsK&TUF7NxlQ7k}B){ej?L;|C}8(&73#scnRdUu;WpE z&R`EaV!yJO_1G5HLnIaq!V)_cr*>&~ZYT<Af;L{JJg9{M?$FNcW2IdT_B z@WOSt{{MhM0lQxa2E>EXUlSab_3SIbg8@WU3ql@c<8elCK@nI*5Yjmkz%a@75Xjr8 zGbVN3*;@2$wYS@wRYs^ZDLIiibb+#xB)Q4?vsfmAi+Esav|c9sZ64;l%Aq{h$j7-c z=q$_chsji)K^Vm%4iml~syN(33EJ#${uI_uVNqIt*{0}~<1igW;!e^_(=LX@EMxK%fBI1@0!Jj~S7hj&jZ-q5vC{_3$p>V}) z?k#u=d|k7mhC<~R{;`dI@F$E}iTx!05jT7~`P?Fo0hsZ=KW6HuxW z;2}F=9h3BXo~|ZV_j3xn(#x}{if|RB8PAYIf%p(#ejmhRO}su^KYK5-%jU)ufO>2L zqXFCacg-OwlJn7HQ8k^q>5^AV3z37?y9@T%C63~hAYAtciu$qkdtykj_><6EVi)=JGdNN J2ww4D`!9xxTZ{kz literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/__pycache__/session.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/__pycache__/session.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f783bb2e379adb08d7cdf3baea898b32418569b7 GIT binary patch literal 17920 zcmdU1+ix7#d7s-}xuhtH)Wx#pv1OTDnOa>eTQXxgmMtk!VpEDlNAb$aa=9~0F1a_I znH9zDY~qM6;vj9B7JX?^1XP-rG$@J`{TK4mx4zCxANo)j$U}jk1?nVLf8TdzW@mS4 zJ8qH&rNH6LnRETlcRRoD8@0yAv$~=v=Wl=I?_MhY@Vozp`+=Vno?gYT^Ixi>SV~b@ zRV?*~YEiW`ORsB1jsNOJo&Op|1AmQrqLC~n8>wQdkuIiH#Y$Moda{uzW*XUIwlP*5 zYvhW##&~hOF;Sdo>?!VPOco~_dy9J;Q^l#qzT!T#(X3Q`x-nCnY3wiV=V!fspm>1C zIaoYsAJ{o$AKZEDq4H2I9=6g}<~^nOxSg}d?W{d!XR3+f6IRxqx~GVW{e(SbWe+J; z^_+szvEmW?Nh@cKzo*zoE-BmUwpu)5O;~%-gK14#d-3-vYs%V(zfapo?ZejeVbrp8 zYo@AO`|TNfKgKy))eb3#6zhQfjCIh`t4ZsS_1Jrf;<1qyhporoQ;W~q$JQ15*^=@F z#d^Xz@}6QH+184)){~ZraptV&tf#D}Q7<2FU)4s&JBaafSc_pDwVuIv$A{`4vz|pS z&)LT@+H)l(_I3un&C+b`d9aDUBK1{_PN@d5YRa`&EwS)G4j%x%@9}qJx=5;?&vTF6ZpOW(se&(%ao2Mi` z0AnioF@NuCom$knqig6lCbaD!m&#(dTx~4{#YsMrj*zG^tCq4s$BOI zZ#8jKp;d-IBysfnI)0sh#KnTF)s=?YQy>N4!n)Sbd#b80PjeIN z$(__g1-rWNj@HwAhNoMJdy12H)1KjGwl(MY-N&t@r{7b>3!d(2>sfcqLq9Jop0S<_ z+8##RL@$ZA<6h#BvNPeKMOAx9<7(@B&?3352IUF7(do_Ig}aY?8aO7^J-lkWCYElt zs%A(nQ!<1jl2}z<1((>>a;NSR6X0>rO;oJgi{*yxw96G6yPjIvDmC%!Cva1<{EXXb zm+ByHov2unR4);EiQQ-mO1@giPx@n(R=sZX-aFzThVv7&7mheY_eQfk5dB;V`Dg)XsIL~qoQQF-L{*SIE;sUipP+hC($GA zIrYqQrvj3LRBL5DD!~1Z6>$=cKfHQ!t<|tkicYg>i<6fx-nhDW;*Ijk>67>D=Dm~k z+RDlH7FfFZeBtz|lMbeN0@T?kuiDN@l8KX{;I+3v2ssvL(LRR0ou_fhX*pF>llX`0 zucs1I_?uQI)G2jZeO%Q(GIVho)r#ZSw_Y!|9ZZ#kA)oY<6{eY=#GhJo)z3Pem9}VA zAn4eMHDQ-66n76-z`-3M?56upq1tgfP!MzP6yDiOYxLD>7ME;JF2HXRKE(=zpGiwP36bxBDP)=AZMl3XxHjCJr+*+>V2lB zyqrQGe&*#>yJ_EVi&rk-@fS3J_U=JNd=57idJ2C?+UQxwuk%A(JY^lyb%$K2?&F4rWq#x!$Uj>&`2MXshzt z;$l9_A|{SfyJv9mQ_v=5*A?PfdfI#S&Fj~0EM2}-x_Gm+^!D}3H+{X_-17Iu%ip|q z>8&>|-(>j|vuFk(Jx;9+mO&ka^2cIYTNLn8JV%!kbRp3cuhNB?X<~5ZpT`TP)s(hh zg?PQ2V{y_R9n>c1`H`WCFQU!>p|dE+;FtOA>kt4}*;c^h(BSLffS$Ih^mP0h_)XLl zXkTSr-!WL1H^GOg?_fJT1$_9lr$Ha5URLhTP|3QEvJ=qDdRXcvnA^aO@1-qWa+`C} zO}?+V>b54XxT*Ky(TFQ(9rOe1pn53vlx+iJrF$7KZ7JZ~H810(HZ)Q4^c|FWDQN}n z&Ugkt<87e*XSx$!0%a;$6zU&x64bthnHq|l+uBwkEh?>p$9)^+n~FP5)&y6qWLw=( z#NX3e$mX!Ufn1gLkOY<{AqiS(uR8@vGc0&1n4uzm;_kz&Rq+#x-cFMR@*t7<6y>TCa{)C^;Aqo?I=TB&I}N6cQFH_uv)j>Rude~?9A*zoWUGk#EnBLM0vq#mcG_0iwf#M0xa#%DY4N9q3gCzNhla}{ODitY08@1N5-t$V zFVH>7QZd=IH=$ID>CnU%$HF^wTAYd=qTc*;OVn0t@O{K(>S5ezb>N@}w2Fz|RT?A^ zy#aE*ffo)fKdEL_Lo-zRHwBB9#lM`oUrR&$VCx=bwJF@E)k$?q)3nF&js$Z`&#^5` zst461wbsNuE`P|;_fXT>kBbHuVp`qL*GV<`D5nwO#nca zI-*%2kqm!wxFN!S8NbdlG^9nuc@D&pHdx1L?u4a57bL3Me$tSJr9(Fz^pciw4$tf` zB(1~&#nm2as^aR~3fXIM!ZqOY!j4nBZS{eA7aO;eut4yK*i631=HXtYvm{Qd$zBS+ zZi>#0J?KX0!;CcsZS$s^>SdZ4=*tXw)8eac*2_S9%aSqJ{4&PMc^Ns5oAVTF9QA6R z(#tjzq~)xMZLOE>o^vO>te388H89VQ)bFXiG3eSc=sHb&%bk?Ha>-t656Y+by3d-# z{WM=^=A~{f}B?J zgW&#~+&}ll$2fDd=C1LISTq)vzrh}E;mznYxQqe%i!ql#5qZwExEJX`nH5YH%Ws-1 zc6c1NWZy)>YH;f0f#_jjId zH#bGiEwA7t?zr&38-=K;oEbF?<`_@_t!PftORV;Z$DPQk1@mgvTwZK7?d7ODn#~+F z49;jE%Px!n|I)!uTm5OoBz%D!(d8x4v6r!F^?I-;a7it2M6FuG{*@hbt$Yv06_f-y zL*+0q4RAq=*C1y*>+oXuh-j99L+}jDl`ZT<)y65LVi(Ngi!Ik)IF4rI0y_i!IkiTu zUKZv`#|6h(HXY+IA<2cy%VaAHj_m?USaohMuWX^)zgK;2RO=?!Hf_p(+n+~yI!#c721-u?WCv*9b18! z&^A@ewYn2<@a6kuI_WsK1CTC*4N7e{kNYkF0=LKT?6DngWe; zQr^U*=QAutwl&+W;n}04(5`o!5@c|2q0gQEw1v*1aVchNXXgVAZ~-s!pRzEs*=nBX zFDYyq*P)+beXPe>qlWwWW~5k$mQiiBu+aYNxmlFV=0|H4?v?8u+d<{qr{~YiKYwSa zNXNT4Z9smJG`Wj)HcpoH>agLlj9e;afXataE*Aa$k z8SjHexQz<5DRcMpW))WIK9n(TTET|L_xbjz!uhkO&z?K=()qLJPn|pe(u*(5o2Lpd zoqFlaOXtp>dGY+27hXJn`W%&=K70D~nNz1uoj>)$OXpuacjk^1fa9;Pm7A;B2aG|` zEI?OOe!lP`Y(xkWo6!9PTL-cPJ-KXd!a%{Kz$BA4<&_7uq%opO1=H-?a&$tV0-6$3 z-dF3JuuP*p$xfomF$N=h1FySH7$)G(tw80nS&KH{b&0ywx8`Z?19oec?ba;pRxpvF z*TRO5c5JE;b!WAjv#tqT6BdX~E^KG$%M@g_yau?N^y1scEt3JaUksX1$AEwH~s(+pN2o}@-kufXS|Zi%$?C$e`; z-40BixQ&W}fEJ)s>ClS%X#kLJ3z+cYhf`>Xb-{g&TqQq2UX|@@n=4nA@`wENW?3}J z`uhgm`G>B8ytoKCivVu@yOhc5f*!ibd)Z%s_nBVo#Z z3Unbj%QsqZJ_Mb3iW8;qV9Y=^A4(DRAW|2TC8k3$je{6(8xVqkON(QrYE3w9iA+8^ z2@x%JuY7|T+D}yKEyvF1{B-DF^5*fL`389s#Z;?qp$i}fbV&h$cK|TUWqh6HO?34Q zYF|uAhge96EIK9%LUbSC*SUd9?rIvxZF&68;s{O%8UEowZlIKo?sQN&p6;^D7f9Z-^DTuh7M!3(X6qO}c0HBMuiWx-fD26ru_LCw>_! z%Bhd3f=Z~Tfgge*Ud69N7h6HBRY9Cpl`&St3JqXi3H(J=)k@)SGKhZStZI$nIW1$G z#f&w9)$RcRbltW$$Yr?!$ley+)Aicwn!9P!H8@D%U_k*5IxLjo7L#8WxRPi(mmh#f zXnyqjI({9JHHt))n6@E6oRr5CQWo%GtHMRCA!-oHRcqD|Q27;J{(?Hps@;P_b1j6G zMrJ^qz%wAw0LWnwD!8f0IcPklZ%~v1``1AwUu_P}LEK02NBDJU_?+6E9v+^WS7?XB zAG!}0{|jC`5B(5~H860RTGne#8;BtdK0NXtQHSVEY~t_evcuLNJGSUjr;NvkOLgsf zU3gSH#CJWE0SpPo8d)Q?`_0D@4H{v$Vd#Ys4Kp)LO4dRH+epGofH-d>$r5d2PwPGj zNE{3g&}7`xb~FMo@K=8bcpQHb(3D}w9fV&Vst9oQ%ZytRFH5=rp0`d*%*;&#GSapY zKYE}6^3WIkL>12VTK6%@rJ+4&2U4;Cb6{38_R5#rU~W2?waU#FPCLVBS^*Kp;VQybeK($cvL3`^WUy z=bygva`56q{5oXE(%5JycTN7wX@cGk@DRyJgrO23D8tw?++pe1+c5&^DfnR-c$(om z3YpDylZZTN9wJY{Zt7dJA^M5H8sNK|fUd$jgu+frC^1xJa5`{e3-Av{e1N8aFgOze za6xha2cQ=PFO{}cd=nSIqFSvbXv6)9*E%?X4Jj0pu66?B^1YA1nC3g%f^-vYFR=Q{0 zou)Sk{wv~)m!!}o(fIDPo3H?4K2U)*OWAo_1?;IR-5CI#X*Y=-y6&k~7NFwwTMAI< zY%l$dw3WpUCaf`F*69bDEZbBeW4Z370Of%z8H1nbUOK(lEF_VzLr#UO@N(h)!@r21 zJ;O|aBqF)3w(|<_XPPW7(lv-4|pkGrNgZ(AO{9oM^F#!MsQz$hR0&A z+Ufw#mxoV3*=ko>mW`OFSS7UI@e?*heTF%45*ZT=v~2~r{So5D-*d9{jS?wFoJrDgD zI>L;wCDey1+T0G1yi><~(T4=?ks6aI?QP<^z88H@ahp^y-p?RaJOV-kY4IIAMPu}m zR*r(F;s;(z`~acJ%+9nmj`T7lm_5Yo*Jmi0AB>T9e(I&1p9Zy1gKDA{*0+vyt#BsP zWe)@qaDQ{3wN>Q*jnN5KUTwCpI~SDooEDGyZl zafDy6cd+HU`vjLC1&tAT{k|%WQKFeg$!2@Y2XIDui$j;JIwS@PVGZ=gT!2WE)gFbU z^DNGMq$RZ?kr;^(!>?Ul4o^Thwo7Cn#BCznoKL=kEu*M`1oLBO104RB)+CfG2MH!g z0RqGZM&~CZ5@ert!AA4*Jn zpI(Uil!uVPU?Oqlj6g}S^gi4RdINu_U=Jhj0W})sEuuz%O2a(UP~qtvn?eeeHiUu> z*YHkk0+@k}Fsa8J25`O<77-=0$@MvAyk@EOPgo(40I?C(en?hh3=8swgU#Gepm zgyIk5j9}3qxWxe^X&>SV3bAcs;_o`v=ynpxK7Bi{Aft9*KjY4HXcvA1|L(KwB_;6u z{sOwtF z8M(fZ$2}C@q;iheM~9=EHvIIu)9U-m zIl3xCJMbqQWr6r7$p`}@-NI7*_%KVShuP5x&a51Cwy@Zp=fGiDz|LXND)g=#vmZjF zm;k;oSXt@SA>IFs|HwZBD()zApXh{ZZ zbu*D$?+0hFcac zqfs&nnL((}We8e^CfBJx=lT96)lVWQ4}~V7hO1N)yciH{=qrh^K+Iq)-6#My};78U)~A+QnBe1Ozh3PvHL~pg$eZ zA0TXk|9g7(Ye;@(SPsBG{Wav5Y@PwwFhOu2$`BY33tqxX0Qx(F?`EhB-^Q$Gcg6tI zWhpGw1O(_MOZcLI+Iz;!3PFHxlN|7WskDqtmoOsty99f9GGu(DrXR>^rTBHNT(5O) zURmE<^({b%jj;`g`l9{@0hzWy@F_H)gK%6Qs|l(7TV{gBahd=H9ZUuNj4(~m2P16* zcnPsYxK0T)MmR3gc>ClE_G>V^iIS3+CDF0B*nD!8C7)Cf?Lcx=D+t)I(*o~%3s4?% zVF+ss0keqW>`@R;g&RWXm`oyGv0>`u4oX*D+G~s$@E;v7qmIHokSS6~knZ~^CM^J* z0DuYKqlIiMGb;LD;<0lRb+`MJD1>P`K!Q%#oC-`t?9fL@aguBzF+$K~i!IRpSiXJEoSGjGOHH2H0_)4|Zb_?c`Cj5~Na= ztD!~@h}Q4@6FLny5j@DG!kk*2xoXg^O>NQ(a;T)kOujPyy9{!RNl_Kkl%PkC z(v=?a&&Y@TIr(SglBds+;~KiSG7XQjHQ<^i;fPMbStaL`YGpM8iFxd>{kVS+Cou;z1Ao5{680XHrhnBN10TPZvsy5eIPbQ}n3}zLWRU_=LYr zn$1sN$5-grQS4{2O;l{vL@~8=`OWK>uHKNJTE0ddT%ryVZU^~pa*;Qwlut6WOTMv! zxIU-&$@Nm6i#%vCJMhMmcTDT6xJ)kou+dK;`IK`!Q-LOk9a4DrI9nwBvh>ei!R9Fr z@qm%WF(pBXlhfK+buvXqk_jA4Cic-c`}oq44k_d5~I4?bli&`^$q) pT1VZ3*bLJsX(yoy+~1*Np5)=NBuBs)z*x7o0p7TU9K;ME7v z7w}>B+LKQpdU8>EaE9+=zB&A6M6>Bz2%)FX*JpOJd*7M)U%4h-8L3la3`K}xMmS!Q zh+qVSSteVi?H4Dq9tm^qQRr@u{hW(5;emp>F3Ma5Ga-XGQqWzZY0dKGg}G3~k+rVjmdOQ3R9mLO@bJGmXU21(kXYbe*07b&ea^<0$a?amohMGdVg p$rectin4-px`(!_jrK0gODhhS*x=QXF}rbK6PsW{jIjIV`afuaVEzCA literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/__pycache__/source.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/__pycache__/source.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..faeb45f2ea307602f15a1b7f66f02bd6ec9b4b2c GIT binary patch literal 25925 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 N{=57H&XK~f{eSUJk@o-q literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/__pycache__/temp.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/__pycache__/temp.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..217259872aed8cccb3801bf7372fcb2f8c6fb0c9 GIT binary patch literal 7226 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 dazw`DTCu}e7SV0F?iKpm|CXz@DFJfcANkJ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/__main__.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/__main__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1382ea32edab9f2ab7f1fb947ad8f2d96f63dd0e GIT binary patch literal 753 zcmY*V%W4!s6s@X$&eIqtPX%3MGl8UyZdD=}As`_>KrE1^XX?&$PkOq_s_slC2rk5B z{$aB8PyB}3y2=N*5kaduh}cEld(XM2xVI1QbeaxAXrFBIZ+FI@zMJ~LFEnW1T=mNY zh8WHfz0R288WT$D>`)iT#H0Rsx5fbtAee-VFy{h`yWms*Eh-u=g2sFsBYWPV0?&|n z)nu5tU&sbx-U*>Cz?1f(1Kmq39@~0ygDwGDAXuu=%{9dQHFSyTGTdUp36UQeqCHrC zhTh+!E8tF6!H1PGfffrd$YSjh(REmt6WCx4)-)TnE*y+loAy4uG+gH&SL5bqj1g=? z&t`^S*SFujG7g}lH+`&wQ;;g-#g(;AJF~1fZ87d%Lh>OfrHK-{31={@%4Cp(_QkwR zc|je)&uDv=X2UeTrgZCYD!42Uq~ubEB2UT@ms9E6F|J6;R0k}RMKT4u;3&%>j8rz|ofpYqFFJ+dG|ICI?=jN&U{Z2p#d4J>ApY#vW z$Z+a`95DU4Y8?|wl<>0cWyi}dO37~d8E%|`S0tpa zk?yPXUkiH=2tMyBM^6Y?q0PJ%`yFM?H;pqNhUNSOZp>y1hMTw zbR5QUKuIaKiP=1aT^!%Q+#}^WCzdTftoLm2n4f?@o8(?#8@9O&j^W(<^bj($WRF`X zWKPY;Uy}QDkHEV)!3fB$6+R>(AG)TovYOd5blbIW>m*goGbPN<_a&dN#UF6|hjG-`IWt~98vcH)k*^CX`sNKalF6>`TXvodx3;7}SD0G*@i zl;{B*{@cxHzbaIuXJx5$w7YZji{Z7elks*mSLHm)vvD+C*!`;fXlwg=WHPI+O~Jq9 zjxv$V@;tK2SmR~vi?KCbxUNnzqw4oHATgIgaN3~*dgV|4ZIAV6kFq}o{4&!Upn9rk zmFZXdAGJ zw7+2Lkyauxdk77Otq}&p+aVjZpp9o53cCqb`V|!a#N6}D=eFZ`E)E49Yl z)I_c^UT8JBfTrVVyybiFseT>BoBx+WOm$_ew8}4F>3fzZ#viPR-u^Elvr40Hl2sbn zFl4S-_w5C|b@^)3>nqlG0XY%JMUs_q9MWOfcO2W@Ur3Ez2|qG;-?FNh)>jo9S-*+` zOYe)|)1)y3{p7?lDO4Q)t%)!MecruAC1<(1fj7Xs1)?Ve?J>ax{H;5@9-`f(_2^Lk F`(N*-CN2N~ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_classdef.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_classdef.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59a630d3b7fa35f2c27afa4f3643c40f7c7e2cdb GIT binary patch literal 8771 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 E11)gL6aWAK literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_dataclasses.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_dataclasses.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3fa033f27ca71b00e61b1c96132f20fda2063da4 GIT binary patch literal 1033 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 WZ%q)c_ZH(ey z;9meoPX0f8_0+S(7!#xKO-pIxPUgKg-@KW5-^{m-VzHnTLVkQZxc>U<=hb(J$36{4 z&!EeFFpMx75f8l<(OC1eSoieU@C-_r&Wta_GnvUO@D|H48+?x2EMM1z!_9L-3AdEZ zp=ESeb*IpSy-CHeY(JL7ZddLe7G*}o#nNe#r+rj|o ziikWoWq$9w$Bme~;v`A9a5q+WHY*ET!C~2L@ucNO;i21Xr^k(Cd9l3Y$}r^%&7f8f zj<|GjTQ}u0mCE`IN^gbyR4z8#*%VGFsEKSQ;XsM?%u_J|Zj2cP01H#ho*)Kv^S zA;;6ghCh29p_e-jMvk2ie!T>ABcg_=9$gVCj_ zd0}41Gg3{`m3oqR>T zg+LMX{=z3Lh%$PZ(OOT3P^eeR3lxY@z!XM!<)Vn@_WAUPC#dLJ>KNh<%z61BihT7% z-jw7`E`pQ~#%97#{r?`eG%ig)6=ALZ0Jf5kz}VELv$Oyf+e7+9wGu5+``VZkvyhV6 zz8?o+;`>fsmF5-jUswdWN6`og)PhpGlFD#t62#p1N93mdMx{A>C2p{jh(E;(ktHn0 ShJ!U*w=H|xq81cp{P_p&RuMA* literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_diff.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_diff.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe4235d38db790fa96a358df0df830e6806f072a GIT binary patch literal 1533 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 K$lUwKbN&O?@vE`` literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_file.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_file.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf4082168793e38bc0cf15431be8ca4f9a7e74ef GIT binary patch literal 7066 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 RkKorWxi)+~hhiXq>;Lt$Z|ML4 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_functions.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_functions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..afe253175cd7384870ec4d539a5d8843867d4544 GIT binary patch literal 4428 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_functors.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_functors.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4947c421ca77bb086db12a6e98f416c230cbf183 GIT binary patch literal 967 zcmbtSzi-n(6u#%X#BSQ8A)rd|4}gc(t(cH1#1AomPzG8SFP4+LByJtYx^pU3q65$Y z31w$2WBwTafm@M~BC)Ztz!udaN#dF<&s zs{WP%G95SzI}2oH-NV?|sz236^=Z#vi()`~jP^|+NOr*H(4Dh6w~$)sS?FtOIQafD z8coJ3($k_)I(qW(#nbNg^R%}Yov7j@%ClZno>rqtad&5LH!@kJw#&4CoDP+VWR~Yq zrA%cUCWC3wuO`~;l&2O3EfU}%2+$353yS|KRZ~}!_)BfIRpg|uVQOL6q3Sw86JbIB zxu9?Uk9M?0jE=TVWN52JyOS0=PV)|-Vi!<(5=Z%wpJ8?c6{k${89xJ;i&gHqyoOyd z^UioxKk{EOS(EjdXKp`ZZ@^VxS=n7xyk+Iys=}9*M^vGahJIJm5$g?v5Om<26}{A` z!w{@6=|F{nUAvshBsbPCQ(a|g?#AIxP}Bcfo)wi9G|kvAv;J|eOem~3C}VF}T5p8D zS6*Ei?S|2!!7oRS5L*k{__Uzob)W-Vpl{L^L6VHqtVj}6>ICyE@p=>A2m^f` zou*OPz^JOqilO;S>58jJ$0|vFlXP`Sg8lJCPIGmiE{C~+5Cj1%$qmwz4>~--*>HGH?FEwjybU|x{{Y&FJ?+u?F%i>`Sn~W^ z@|cP#ac&GbE&uV=mjznGdyImpc zOE*?-FVEfynhW(U(cP+too2nat2W~9XLAel^`xW3Y%gd%3fdy6^G+Dnl}J>QN#~Gk@9i#s*ibLG{bGM0WEcfeh=F5%MnU~LA)Ee7! zGY`La*9I@2JqE+G+DECW)_B<9S8A6V+a34Iuhv{m+)0TS*Lln#V64l4wFshHM=Z!? zxz$d<`LWH!{A-K%qh6wI#KDi7o0>_X^Q}1QbwZ)-woqF^*caMKdSOR}ovui9VZ9%Q zQJ`8Ix-3N$Z;9hItyUN(!nJfM*@*ig_mvDrlUF)J-8+G0nWxZWEwNkmtd z(xV(*M6l z?%o8O#NyIc29wzZznlh(#JtOM=re&wTz-J#^C&K$(MbBu6y=m-#rd zDr;c5=U$Li=(8i@8re1Qc3u&QK9^O1G|*?FIE^B$n&NHDh+2{|mYQ{9or6Mv=M?#w zC~e803l9@!BjwoZGhn(P?U&H;2?%X1t*qQ#@od;D6k8(Hb|Tar)Z{$+r=Xmcpb}cD zvn4Y7>z6dkOSOpRT{ozFel5@(Qz{)uOa||_1 KoRh|xul@swTHq7_ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_mixins.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_mixins.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5738ff83d72e460c88a2de6bbfda63c6bf297717 GIT binary patch literal 4686 zcmbVQNpBm;6|U-y%@(!O+Qyk-mYGq@);bR081}%TeL%94uLL->qHMYxy;;{oR)cZ_mLO*4@ig-ul zgn7z$RZj)2ys$o3#F!|YvJ<|mdHOyR<6m;<8=yHMCP6dj?yHf;TRf4i)*SS2$rDEZU*VzIh22vh63kIqA7A>3c3Z zmi`Rr;4@zSZD@L|!UY$~so7O~9Qvxzps)25=}{^U@aiwtYt_B= z=5g@6QU7Rdb7S4F2HtAZaSxq+&tDhST5Ub>{J^KSd{k{$>;78vI8wtfoWNHr&}clI zdKpyK?$;WwQ}aJw1L3vCN}M4v24o&JHduQcKjuIXsmI61Q>c-LW&|5V|1)+th}~|t zXRg5pQEZPPFKaSMPjTjF<(QBKp12< zM#Eo$M(}<9nby-F|B6sg&Ck>x>+zn_Q(;UerUO?xD)7PBetabkh=YXi(ZMr7TVw^g z!zuxK*vhs<8{%k?4?Hrf^%tHDJTVX>BOY5sC`{K34~xHUIijE8SiwcK^oNS*3>kpV zB!;t|4yMO6=Vz?L%j`^pmY?a+DjirnwmM91^aIU%4=(=>G-qmuRblF%_!qpZoN4Hp zoaiWH44zm=5y~tpvNPUMifo>pDf8&98hd+5go`s4X^!0YBkk~|@F{z?9&sn)dl7dd zUXesPRF#xVtk%<_4?-yX#K8o?#WMe(T8Q5-HFpS^QE< zG+KK#uj~l%A&6#6zm_t5myyg++S`zVbqi{YO(HrP8*q0sjFL|CaNiguOb%aI^`HL$W#7f- z7BoZX$i<8rxWood)Njr&(gHS*fsIAb1_E?`A4IV|NCHW*%n}yqRXj?62$CdaCJ*Og zddq&cNQppTJyFW>%#TsCxVaG${C--VzCkR&{SPE?@;yvPm}zwk5mTOP1;19B~q-z2$u zt_AEB?^2o*gj8b{H9G8^&H|ynQUeaScVpZGL+Fdlf0VsJJ;-%=pdOfAI3dpS9p&5# z#$It@ECRmB!OUM0UMeeOG81HOEISwv#?nGCn3zL9nwg}KND7Ihn@J`U$#^39T_#D( z%85kshfGoslT>g{!8^XpM#th&JhIQH#I%@srTj|oYF)i+baOZ=WBcR`g?}OMzH1q%Sf=y#I}V)<@emr z4AR6=ydt-H*em=MF%c{@b1IGZDiSbuyK3u!JXUg zgALmfUZs?*`Q^5K&nlIq7qn!()V{T8h070rR^LuNh((XrrfGq334MW5&iB(t_rEyIU6o~pJM17N@j$tOl zJvT8re#S~BF>T1`5wjB+S)JMKfZZ!ATcum2J?O#B9rOy3`(DAB20s0tq_EZ3x&uMn zc&)p53-vv?-3e>N5r7`Z!*vb~Wns{rgnVyxCXtaVwi=QVoAM(JH<_?`iJP(0gKayF zK1IERVJ{)uG45&Q4K_c03?EM3GZ>6HgC+TL!jn|(>BckAtT%#eB8((6`o3OC-!SP) zrE6IS1|ePJuK|F*N2;qx!2wb_D_L&)sl`C74HUg#XN9JbAjX8TxHBs7L?-eC2?xWQ zv8vCMWZT$^w~YQGjQL7YOAw$OUB;DXTTq2zjWv*?t#CSZ7T*8#iEMe#>=`OZC03|Z zkw+SS14o+MXdcTY9HmbLtbZayc!B2zQGVYG;{9gVtVqv$;Ygoq6^SS9t`+Y+4ivwU zSuWR|Bd=VJ;)5Btl}PuSwQ2yhvlrO;NGS{WUxptkLPUo2{8lX(DeWR&j(GC9)-OuN z@H;*ELjO6u*S`nNf?~oai=`~^In7c{Zm0&o34cq;-yEM%=Aiz67d~x@$$bI(A8;yf z(B31bS}&K=5}ismEJo}J`F*%WCRiO*>-#=^;>O<)SkudIV?%Mo@-U7Ennbk?MTTA> zsk|dM`b`e>BJ=)HL$qq%$M`xQ4-?b0xT#u}HD&RFW@&}I1z$v_s^nl?GjCa3d-ETv CzwFfj literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_module.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_module.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76520a4468dd4b4e938cbb090700e35d0a7f0fd5 GIT binary patch literal 1742 zcmb7EOK&4Z5bnpkGJfRcILW?ZmJ62HnAHjip#`x*D+H{3AS)2VVKjDkl5xf}R`)pT zM0>)Egpl|T_Hq9PKY?SPkT~Ve2?;?}Pc{lH92jY8s;jH(^?f}>qY-jKNb&A(FD`!B z{oz;8|Mmp1`UqbAJtagCK{FCnUm8)nW)X)k%bc+rxs(Vl>Btk#Ln3|2g*#_zPx4Wa zhaguLq40#iWPyj=Sk}ql06vVE{Xchd|J|N#fyv4d~!X6i)sJ$T3 zhIA#LQ%cS|u(!D+koEsWsfz|gX?;cVhC}4m*_1*Ah|#RY zN!53 z6UOl{86Ha!$A<1-0Bq#k*`J&ZFMf6i8REg~j|+>B;nf`wC0S5G1rvP91uMyjwa5w6 z&CkfU0QLdtI(>x)E*J_VPL~^RT!?7~iA6CTWHL^KFzj&llBha3Sn>No@3?c243ILM0pUx&O-U9;XUcP#y?Ip7Nl0txQZe~QA2Sxj!J8Q&9rO}B0W63 z*2n|c(Et|Np&hE$L3ynegw?`^ZV1gw+W%()n-8oUW2sf>H_EKx_-Qrot|BU#2-G9HNJ6AXoM z>r`#S=X|TOcV_Q*#z}d+FK3gtW?hVn%hx*PaK?7}HYh+zC}v8uZ=qrfUJ|%_bWTgS z8FLCCwyuC;{R$Sx@M18+i&1e0E{21wGS0A=oLwvZYG7v5!gA@J>NqcQ`2_M?RGRb- zRY*1yK*%J`fp-SMn!bzAw%d$-KBdyk8sjx+i zb(q5SiH)l#Sy~#;0wgSpj4P(&iH`h9dV*aTzp72+u{;^uWB4P`mibXI)iOp_S?Epk z(W^`HSgAr8R%qi)VA{r$vlOlt{zt~esWi^0NOR+hRAE%(U(&?*8MuMfgq0(xTJ2!* zh^g8|fg}0XX$B9gYClA(=`TS9K|ljqry*TqEz17%c*r~!az;Z2J01fG>nmHG)}1=| Y1umZ1p>2?X6RD_-v=P0ImL(H;QRs=B7_tqQ9^h$>LE2SQZgi{T|XPLZ(m-q>&6ypP}ejf+mlYY{?@zW?p*?mvG{ z-@<$2G2v?$MEwGa5k>`x2s1c2qO7$;n8~aQ5*gfJHghh>IgMJ(WgB2KwYL>ndbJ~) z+eZ$F%e%v)|ZL%#`JM0$QhPBH#+3jOPKI7&& zp@jQdcTqEXpe4BTJ5)%9-$jn(>0BzFQZ!sW2COK1Aj${DC^Ig|YkCIfgVrzw)AfS~ z(fK)uazT~kjQmUv$QwEgXhp}M%tTJq8zL>({_A=8qL}hf&hwnhaQ};MzaBn#mW&>T zCphb6`~Fc%G-y0S|4dm5rY`SZr0{5M62-+S2G0HUPsbSkR3@ zmlD&h1;Z9sVJl<&=oVQ1KrfTZ4OrfZiK+KM)HbM+{7OsXk}BsL@*};@5VR^2yN{e% zmL3bPbf}wov6HHc0L6@_g-lA$-UFLXzfC1J2;;B>KjGq?IClO?ijC%Ay z)E121ta=A9yTe@aF_%0~IXldCLCHw)J&`EYAQGb0K&*tGG-6Q2#{Ox_XJuC8$PmTF zcXi5JI`vw6zn_#=oUJy47L|5rhOb!rF|yK$T+QwUK(xSBBV?#J;D^F-7;5`kY! zu4kxOu?ZV@L26bIpGveeki-6v42=oas9n<6nj?5+&~5oFVL1SUj(pZ262L)E*UHgY zxH}@5j#x7I1P^ICk;Pp->b#KCM6B4p^b8Ey2ItCR^XW_lH1ZUeSt7CpXE(#Q*CKrk zha_Gl`97#dv+&&H49`nvTi*KnB>Mva3< z`b?87kKgH&mb(1=&yp8czpj`8@a(8M550FCYQ&6t!QP(gm&@I<=X_sypwyED8 M*R-ikJ!<~_FSHg_6#xJL literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_nested.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_nested.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a52071effbaf7e22c5f695fa53f4f24b55c49267 GIT binary patch literal 3610 zcmai0TW=gi7Otwkx;-9`?+%1u$RZetc#=T4h%6fvA;@YqTCLF{dRJ<-yE^vRJr}Cm z3AQFLI1=o?FueIM@CWt*i679fJmq!$vf3B;&S{T5V-vPpb?Q`|x}5sXrK&$O6Ieos zANS?;pLYM<{~7$mXQOowCI1hI7NO8mt4xNHYZWT4t9n2=Yq}B6=s7))wd#67FQT5+ zOL`e~L$Byn)N}fZegXBoeo1J(H)2q>j^1p(enov;ZIVH?*X-nIvZS4S1w{#O;H=#MBk9aEg zQBLMThH@w(HVbO3wjm73Svx>!=V|t^(wvoM!bVQQ)|;CJ$z-P1i@# zOS{twygQwjcHe<1LC=gjzQ3tskfFsZ%qF%6#90)*3gHQP|yX_Yt35XT#z?@qeCLH!f}2aVGu|3AKFjwYS2O~$^sHXZp*>L*)_uYC%i zS(==5uGI?=yiUR^M5uKM4T|1-C?|Btb616Hs?ynv^G?z}w#+hw972ZD!EfNd`q7AUD<IY1Yx0I0)f9I>^ayAEdAk zVfrDA2LsxLvm#))<&ojc4Xn^~$BsgA!bd6PSEbxh`6cS(|(--9Jh!qB_J_(k^x1KpyOqMp(x}?o2Yh&Wa5i1?xZGzhf zm+?PoKXO5z;CTnkgj(Y^eGWWy?Ouk*9aQKzR9{kOegYgG8PhV1&AS(su+Tw;u_5F} z*c7UY4@8GL%^Yf|*ty_hjMwTUUhWuP*RfI+F&r#xSIba-gH0J6g#R5VchSQpwdavr zn8o2y#XF#U4?PLW*+)=P0P!h)0CV8;<5+ZIWhp)vy%`&}-d~bv;faaZ&LH_h^yFiq zZJg2Cv5y?ekLJdR*EnU>K5~b$YDqDYLh?!B4TW|O6}W1?*zvjFI&zDtO7@)`&CwoY zUli6+KwSP0aMQ#=A7q+QY5HwWt$0MvvL&l$g6<>*=iP$}q4QpP{KI^2#S$J?n%qh7y=x-krk)pNS*6cSzy zzxu^iSCL7U74Z$Vtm@ML#e7Oy;N3)XaGI6Uiz3}mqR9LS67w2~ZF&}SYAgLbEs9QW zD`#gc-TvlI3gkG?aK@v&U8V7}z~*~{b1vsFP9PkvhQfutjn$~$2Nw066TY4NyOljY tq*RmN1+hKf_N9-T$+sI*^`H^dZG6(V{F?9iE`A5a^XFVS{s+?j@2`8N#ytQ4 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_objects.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_objects.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..415dcd9471841f22f6454f916294df63826ac1f2 GIT binary patch literal 1829 zcmZWpOK%)S5bmDG&Uie2CB_mVLW2Z^MY0zIQXsOdSjOQYvx=}$^_Km3W|}CFv^UKh6Xdav2QYK1wD2~b1SrRJGApg*r0@4%w!Gb zJTWNwoG_P7oDnv0YJ^ToLYH}L@{Cx7yUbr9;RJV1$-bxOQ!w|qv+u#$^a|nj`6PEQ zC?)JQHp6DmXy~&!cH@kMQ+%4;>=|N5S2PpO@R{>jHjlA<>Xg6^V@peOVf4gfJTD8W zM67tg(k#0pgSeAssTu~V4Ekx(%W$FF<$@O~=nvIiSp;g>=h9PLf(Jv=VmBzeL7Zj5 z!#ZM1#RZE63pUe^h{Z4{JNrCQGI%c;2uzg??*;2$1j~!d9|!k?50~yXy}zK9q`e(F zfuJu5!jHss=w&ykHNSM(EWQ#+{6Z{-Ag{0x3L7gheb!zb*W3^r8ZRWMo|&xJc=qWit>^TGPM0DIvB)Ry&}A;QePA; zCeUYtdILmX(Ir0Bo>w}7oIsI2s2@p}>JGZlJ+u8vFt+U`24mZPg0_hU82V)B9UWeR zI;so78Y*`si}MbPSKq=-`l4iX>&m&bl9frE$yG4wuzKsvRZgKTeVaM(Jx}5jf%D4S z)Z4ZJyOsB~?kL*f+_y!i92D$@E5Wm`1{UvvXaM{Qh9bx0b#h{i))YNAK+I#~f?m)Q z^O%ZHN8T~adxl*2iu^zykw*lkN0sc^k}lH3vo=0=P$a4hBHgAlc)f)9#p%V~We*Fjaf{1sF{p z^0;>|ct^s2KtepB3`7RtO5&W)U&{=9xgU(YQ) z-LiaoiyHrmHz6Pac|H(+2y6Y}a8;3WdOcoK8M$YpN7uSpQk+WB9y$hQqg50OmhV@J!29cL}oEE^vM!H*+f;Z`d<{Yp( zVr2qe3#l*gS*l#gm4e4q3PhkTLLmM$8AC_*d6LFi=tMOGG@Yx)pwHm>)^+L=#iY)4 z7>fdPRlZE~e#X0L22n57uivdP^Xm6v6?-P%24y*}?a_G~F5+1BEVSLjpW)8AwySOH GpZ@?txUQW5 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_properties.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_properties.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7090bd4701572e7a1a7cd0a32fdc5c31e2ea0843 GIT binary patch literal 1592 zcmZWpO>Y}F5G9wZT}qZ*r%w8THtit|3KfVIqt_rvP`E{lLWjCQ3S9_!N!x47yDCYg zmLXr_{E+zQdoTSfdo57F=iUmm=o?B}%Lx}VoEa{6=Di`e>~va!F{Z|UY+qmg_4}W& zZ;cq@y34w<65p0(#<6ob$c`Z2KwJw-^BGeBxy!Di{xvOM@v5Qp z&<|n6&W!f2m~A5d&x_t+d188YQWVDacAo$AegDyq!@cd^OH;h;jq<(TcjWO^}KQ31+B)m92@I%}rN-C8XxmRifY5u12TKuey(zlii z?_i)p1BL{~j2%(^yl)%uY)XnMo-0CGHPwOf0o5j4M>!IH)(JV5D;Y(XgKUzTs98;v z?I0dfbt5ZbSN!zdd~T8N1A4g)waB)N_t72zFNP;Zsj8*aNvS6zvfE1iIvI}UD|U_c zuahEnD!HI;TE*0(mAnBlfwffkdyvpz$t0ITiggj<8RGRI76l}LdU}yWp;xLXJ)|(7;scJTZt)E~ce$m=Ei8nC-UwLwFmAA%B{Oz``p@|b zR&2)1$J5U^t|4c>@g}*%9r&1?M?Up(7G3ZQ{)+#`W?b{*$UUsF(f6;KHnj6Y*el4I zJExf$`@AeF;ij&V<}|~J-Y={5=g!eNFN+;(ON(W1yTX2g{gtrBRouLde)9(Xq{t43 z#evZe@V=w=w|KHP7Q2d;Df>=hdq3AcVes|Mm9Ev-z(- zK>w=|m^}wkI{+Moh+|Gt9OBVPLc&St2;8Ra5+_|OmqvCsbh*Rn2L!${FC7y3KsY0R zLpWy$BTlxjrQsgm_q9;EUL^5hnq>R+sJ_+ThziwBMLln|MXddwa6W3r7AMVe^FTI0 z)FMVmqXF<5;!~ta+Zj-pm#o$Xt?drU31l#IPO&ZzydnBDj}d4yoD4B&WZ<8`UW|5O z6@`B0V3c`lNG|Vt%bFZ_>li9RX zO>JE%A$5{xqj`fEnnfKEmdE*iM$*>dd?z@_J0g(XEE6)=Tz~bVx%@I}tp!ISI||aI z6%>7akY|rp)>Z?RXt7*G@nN(tRA93VYzfr}S$ox9u@CbxfR9~#3lr${ z!Y}!_g703sj*llA0j&nsdzYR|&ONtw;bQVz+Wp33tP>>}V-3%g8RL1(m@I)u&RDQ( yq-&vS!2z&aY}&BSW;+G*Bkz+=&f#Z0g&za|27s15>S0PM#KX`RJ)lD`DgFat3=VAo literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_recursive.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_recursive.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1072ac0d73da07c09cb5d3b326774ebce2e072be GIT binary patch literal 5645 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_selected.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_selected.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73d9d1607ba9f17af20efa4efd3e96244275b41e GIT binary patch literal 3214 zcmZ`*TW=Fb6rP#gwbvVmgalF&Zh-=-QHcvxFQO5Ja;aLORD}TTmTI-x8HY{QUNbX+ z1ldv{y!N60AUyJO`p}noZC~gwsHiISoY~me4y-k2k7v$Y_B-c%XY%p!z#)YE^~u`r z|NQaW`9DD)dR+K-8Ja3lLO2Ntr<`Rpq}&m7jd6F8a4&RtiI<;~(B(d_z}w>iAA@)4 zYr?C1{5j#{qP*>dKFr>i(PkyAP+VyO^dJl<5dn9&$0vVfpjY_*SrU%Hduo>KR9_I= zH$9*q7|;(6=raTQdp-T93O~eW;WXoXjvt2iK7NEBh4%zM#*f2$QtapR>r6fs6Wh3# zYvn#G$E}=1$=Pk&YA2qY3barK8=Y&%$$GphR2{dg zBa+I>sE6Z1d&^8=e{sGfZ)wreYCl3%1yQ1tG+=X1Ko3wk1sw?lXa7MR8^UePp8~3P z(Se8tU9!inQA0PaRtQ|%uxRxNPD00(M>xY{QgfCh9uZFAi_IiTTaCQtn9B9dM6`99w~V8< zl$=2m*S-uDArsOty|VYzjbmVFKh>qx-5>i;9){kb)5Cwlpk0Qh4uB8@5}AYylNu7i z;m&Q?5OCmcMbv&Zf`drPX;6Aty5PFT=)uZSQ-J6B8Qc!{b?K8J;tRXoORy7!U@LA4 z2*DtVnmOOdP_IVO!;LsAMkIdRz|t6W65S=ySEr#_fBB?JZ4Y2tF7i-;8f1CQBb$&l z76wIV$19l#s~fF>e-l@;SgG%9{w_mug!`98vz^OWZrw;TVY?=l#iqU|<91s}+cEXk zMx!C5;J4xy&zmECBIcuZ_awx>oooEwvO^vkVuc;}wh>l1)TNdYC@=zpY(H!nf$4IG z0wd5qBQSNm&j@FFjG%pB7^maxGR){&SKhhSb-UI%*l($~R*zjI`n6WE$V=oiQ+gC< z8$wA;6InqKpcq5pfiRV*B_1aTH!=#B<2W(_B4jxqaI{Uy8A}7!I^selGHvTzs?We& z9Rg8;a1ZDlv?_h011)?2gG10d(1H8gAl?K;Lwa_JrXZQ7VG?e0PTYDfr;PZgB7;+Y8+<8vAZa?BYh=7w2 z0dB|J6LFqAV?P+{6#|L2pZ9HtfrR;0=uuzxXE?hvzVFX)0D7kny(jPVZLu2S>Z^U* z;cDoqb!+QM1s2|5Ev%K6UfI%sqW7SV?KU(^C7ls=dn@|>Viq@7czo$DPP6Pro}9AL z+K@&!Ln~OWX^-xP{(#mlhzNUQVnt zHHqLuzpFi6YOq=|3w9rNEY_tKm3J#%mN#`xYn!@;qg3dax{K9vm_ zB(+{?w%Jw-Oi6FG;i6}pE3GZ-8RI57+)vzVaCI^c+>4-AYiZn@snW(<-e_mSRL~@P zoazTPCNBV9607ZK0*~2fDb^P-uI53Yd#1o8Q{a?0Z`3EDxm11uMp!qSaoUQa+LS57 zH7-x0s5qUkgvOhxDrgr;!3LQPEmJBgW5GQb4f1^y$U??TGPvwn;@;GX? z@V*h2p8dt5XkWqvQi~wmvhN1eWj^!Ad^TCGx_Be;X_fVECRNI)@Awmb)t~mKk+BNa Ha{v7w&IzV` literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_session.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_session.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e8247dd5a8b675e809815ee3df50e1f35786f90 GIT binary patch literal 8183 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 b8?#o{v<=&uHnJpXwqWP7eE6T_)?fbuyJ{g% literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_weakref.cpython-310.pyc b/venv/lib/python3.10/site-packages/dill/tests/__pycache__/test_weakref.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a192789cd2e1b9bebdeca3735e31aa6168399fd6 GIT binary patch literal 1736 zcmaJ>OK%)S5bo-E?s#9}VHpl69E{jV@g^W~2mu8p5ekBpg)Nb+K&|m~ue0{-%%rCs zKQzk$N8)cd$NUwh9{Vs=MrT5|1(V%g=x8f5N{v zzac*Nk?|I``bQL!NyyolNv_xqNblxC!^iwfCVd$^VKO-8V-H86jBpg;$d|EfJz?WO zCUOb;P_|_U`$)yIyUX>bDm-RDEA{f$EEy-jR8oJYBBzB7+;h zRvC?7{WuP8VSD}-3dP1C*_ca^9QX62x4{O!4Mmoxb)5maoPC6;-NyFZMeuPk_2FYxJRauLtzmU&9+t(&YuB$0 z>#0#!t2En9w^coq(>xy zTm3(EnyAwO2}f7-61gG8KnI}Jgm{CDODK+3F08+H=7I;-ZE~ZaH8G{;F5*X@-nk9v2b8PWP6d{D*>;_%HM-x}Qs}hl&`ROYMCG z^orzc26KEUj^c(%Px@0hhB;8B&+k<)~*v2I^Ka7 zphP?aJjk{bh*zLuW=#Yf4YvIGx4Sc*Z+Bb{2EJoi)`z?AzI@(&`}7s~ud4;4C-A8E zAelw1%qDi$%AC9<9OBp(u$#N0P1=Urc}H|f*Kh~eBR#`iV4wJ+Px>Mtff$g17?PnF zk&y^VD8^)L;yj2uArr$r;3=6I_JQZ*mf?Qxhy_^y2d}MY@b=zww&n#>%X-U})ozvZ zbjejI>m@I0Cf7;IqEL69mBpHGbnik`uy)A~x=-nzNyW>8QthW(mR{4e%-E6FJZCy+ z=2b0OBD8DPU9&QUsu|_xbBgk!$^B>6#LjNUR!O~8dVX{ISDB#7!8H|SwgU@`KS%Tp zueTJ;sIt(WVs*`njnbVa^ScdwiflP*Uf5e0VHYD?kAH8GLOA3_o@~RK?4a~ee3U*) zfHFWCf8p#Y)0fHW zJl?ZnALo1(SBH9A77x$PAH<5+?6gYK>tw@JZ2qj6Lce)U=~;Eq-lL{ZkFkuJgSeJ! P2a~|Y`@S9c_zvx#IX&*} literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/__main__.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/__main__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..850b09121e77c738e867694d5f2129bd198b31d1 GIT binary patch literal 215 zcmd1j<>g{#U|=ZTH+}kNgS#&u1KB8m3CME*;$kr%k;0I|n8T3E7{$oQkjmK1z{rro z6wIK>{1Pa~pvicPB{wlM&rg#niYv1?zoywyds9%lB!#fn4F!Mo?5IAHda4A h9%OKQyk0@&Ee@O9{FKt1R69nX`Nb?if`@^N2>^%OHaY+R literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/_version.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/_version.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6d0f3f4e529c9887e18676e28a55d37f1eccf7d GIT binary patch literal 251 zcmd1j<>g{#U|>k$+x)NTen|9VAR7gMBprabSPDp_Fr+Z%Fyt~uF)}iwGA>|BVOq!- z#hk(%%%I8g5-880$#{z+H?<@&C9x#&7Hej4eo={^Cd)0(%-jMXGbb~thzY3b7JFH0 zQE_H|-YxFlB!#fn4F!Mo?5IAwpAZyu3kaqEe@O9{FKt1R69nX`Nb?i Jf`@^R2>`_9MN9wy literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/api.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd33d4c70f6b4eb97d474c119c2fd5de4ba2f86b GIT binary patch literal 18567 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 GWd9d9F7&Ga literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/exceptions.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36d86a8d569ffbb682c189db3c4c63d99dddf864 GIT binary patch literal 9245 zcmb7KTaO#ZmF{jfIULSKBWZLW%Vqf@(W~M3lJ)M6FKb1YSdKi=dTei&NWk>4i!&{e z-E>t`^7M{?wPhd%f-LfuhlK!TvDiR)4v?1s`2|7V`!!E_)?0u?`Oc~CCMj|xr3YQp zr@Fc>=bZY^r5G(N)Jm3R9sI-k@4xx!rR_iBdF*mQy^mXeU|W`NH7(!vovz(;nvPA+ zrEaO`HeG&pyX9V`S?SF*XL{9UwKva?p$xKIcHnnvHTgo`nBa(<^0`J za{=_MUjto}3!oQ4&-wG9=b1hLdcj`=y~y+u=mY)|=q08Pfy{@>f8wFntX4bN*@2rrWr51W88gzZJC510LK`4E(BbEFUNvLk8Gks6Rf!D>Od)gBX_ zA>2*fOF=tM-D`nH`N?iyrsYpVbo(cWkiM(-Rn!T(Qn#t2(aQnxK5l&+g|wPBB<}cj zv*bH|>1(U$`YvW)PHR^;G4snxMJoCD+n$!$QidytwrkHyGO*FsgnY8dCZhaC(Y{mATb=U6LfwgDdaQ@H!Z`-#!4rbCp66Sw&j(&NdozRiM{Rs}D4+Il0qP*t&7qjZtt%+1 zmTS*DTsI+HVj^7+UqLZ0TPy+A{Pw|8VHJfX99qK}tQ1px)S75Hcn?|3m)gffUBTD0ZP1gW2hl<)%uHHp-2 zx{!C$qE6bxy!@i)GVT)Yho@1*)?Mp9WWHzrkL5e}O24peYY#fna(oMuE^Q=rv$bw} zTEr1{P#lQ?v=nnFCd=cjiv*KGBfQumJuW6hv*TIv5|r#Ksbv_OraGpb7jBDw6oj#e zI-(tgonYI1;Rm`M-I8keyx1CG`LXaLZ00bEq4L<2je039>p@>CQh^{0pq}ak)>U`Z z68`Zs^mVq?Vj#d1QK%luj%(d*Kqo{6QEmOzv7D~Q+nU)M*ZSID#_XT5y zPCgw~AR{YiNiHge#h}**#%OUHniBvLBcJ34b=rZvn2#g?&AkdqP^8mYlGu|KND+jP zihMAsB2OL{B96Tv1XzuZxh_(>@t~wmp&F}3JlOGVsWoi{;v$JA6Cm?r-~C*O>0TH5BU5I+yw-kb`;g^%WFlvu2<3n`8XG&UJn?aTp2|lFBGVQ9WvlO!b5)m#EFEL z`)OdUY120S@XFK5&D);Z)?*q@3?*|*w)vs)S?*dljJ>k&IeYM-e@gyyW~~}zJ`A>a zW&{!=DtWq)BNQ5&Fq3WLfz2ZWV+zm#05Sg=Z(hTw)A;`$>Y4w<{o14C_+xx|1{tiO zi?^x!1{Fj-JNGjWBDwT;alddS3_j#u0&_soO7~^FdL3^G=|3Cg9$EV!KC49+W(i0E z{5ngFJ)1iQWcYht+}?r7_QZBK+A7+#h$1W+i!hjPK;56`&zwv9-%M4lhX=GfO^8 zcs6rc5Nnv`W85akjNA}XcTJmZ+%fY@_njEd8JsltUb(;%m({+!ksR4Hkq@MhPX^{A zdHHd7NnE()1zm3oE@ReCuZut1=NaAW<>4+!-5c=7R1Gsx|AZpNZI@zv#J;I_mNDubJmrR|sFl zh@t{5FnUmNVW3{x+@IrxM%1g*ylW-Uog!!1IE63J6RDahhQ8Z6>YBI*bc_^;qs_Hz^D{$MV}i}PzEf0+P0s~K9p)=k6c6cKzZHkp3;!l6~Ng*$>jE^kfIO~amV-? zWS#hf!kNx|0oX20kt}jT6j{=K5N(gPGjc&Dz^w^fgaF$C@)*MRVoxB_8?<8#+2FUS zOVL!i7^why<8@mcK220Mtt(pzaKv#JanYoHJAFV4;{RoTy@Y*|hTY zB|mA1t7MLi5APwGMr(x1S+HmN$y?KU$@!1M?yf)tZ6ZXCZ($pKeF(>#RR z*^8D$?jcJ?ZF{#&HlRr15bq6`j5@d%uzdAx6giF*71Oj+6SHz0ah%Fu-A9!&^z`(# zY2q&wv|igEK?rEm*~@umP?1cYf++8!Nr;ME+6(Cq?IGC%oPHcdi3N*jI@ zXm*5>FGuwh{_=F80n}t%RiP8~Wv;O|gV0YG z0=dvcgVD81d%va`4 zR7}&Ouh4L)N9>odJrer}XsAh3Gd*g7M&|^VQxT7uN|S}pl`twx?1r~Afd z2NXssT95@`xB}ph7)m8SA0P@PMw;loU`=iW(EESh@>D?B#+l@H5!dtZOqmZTXI{=kTxZF`5D?|-f@wmnoZ8^EAK)J_cyo{5B-F?&9&^LtEg^5 z%P65um;MCBsM(dS@5nL|CKcbs|FSH1s(!_v`P#i}H*v5etFp{@nGG@-Ws}*aL#FxW zEF0w-jPhK1_|q^mA;^Jc8SF%j>TDit3J=+VKI9LOLMANA0PtLv)aFADlK?(1E?&EO zogMVCS#qAn`0a0`qMHCGOcJn9Z4%n!eEC}G43L9hO)0nfm=g# zW25Zeqi6xqRcUrrBqeA_GB3nA)9bo8n>c6d?1MrduA&R|Ar;@HV(6Yy$~RqX8SQLE zd?@w5sN*w@<4$sB3hNr<&C}($?Q zG2jykbpZ8-Q_Q5?WE_UL$uh-Xbm}au_{u!r`W>}(BvL&P00kZ zhmN~qzgkjM-^M+5QO|Tujq8C&6@x`1Cu}o}Lsiomta)`% zt;j<*0;ZKbMXaBp$*-x|yHpUhuQ2oM@gn>gGTEEP`xrm_oF*9)$(a4h4ge<-b4Q{$ z5yfd>cBr2&m`}1Z;B+QyI~Ds`T$6{OqX8M`*ARqNu0UUWk(|nct4v8KJi>a+;bihF zPL9&qWDvHy13I+Lj&y#MO+)`EhYG@vU6?0ISL3v^A+C3Eya2TE@ey(f5(YzZE;|SZ z7^1c*yo6d3~EsDC@{LlbD!-#kAYXL=~Nh=5v zFm=Uf!$3p6j)~h?RXIC(k?QDlfDcjm$WGC@5g%x9UR_b5S5el1(?N=|6CB2|Th3k+ zgApq+PjJM3vn6NyRDH+%u;4u#-*X`ETJ!e2y@H6d^*{GrW4_s;?fdD)-l(W;l#JgwXBZfB56aU!Hyc z6X5?n1F#;#Ql}s|;)HTx3!$Nh& zdn!6eWbZZgqBu5w3mcSS^Q{@EWzn{R8#a^8Qq+b?(XC`Xr?$iH*#jNHn!{2FM(7*V zp)1r=jowFJ_PyWXQ?l{2e~o1am};M6jZb|}zV#sE^Dn%f^+6wYOtUN8M_r(UD-4l4 zeXJuLzk>RK9&EyE)F&EmB0Ydg4>Z}tI=;pj>0mS1qB_!vrfVcW`q!uFCeew_J9}M+ zQ1!Kb=q4I!ria(0A3@EL9zo4BTfJj0x@SFC7`(OXG;|dn>(OTjDm^~CeYVZpx93uq z+Jk8TL5ykN*8ZWvFA&X7hKYLks$C|&^3 z=Xtrzl5OtPB})Qa8Cu#eAdo^ez4(`33+8OV*`Fxol3zZfM4x2hg4%!PtffH^Ir|yFw zmyCua!4!vh|3&B}phFzP4-nbP5m>jtW`tal=j6BKmW|P$%$4OP9*okBbvX#h`Leh2&Sza$O0}&Lk z3(YPh69Eq?s>)TVQvQJBDzYjU9dpf3nQJNspK{14bZq78S?~eMIV3>Mt7o>i=bP@H z?oB2pe9JJ5zrTBS{x5(1^Uc4ZKlYoz=rT(B9y1JXaMm#zdCM9MW3yv+&4$T{W_7Ht z-LQ4v?l@hy;p)EADRjMt*DW@R%owC-%%DGa8|9CU*m`8}LZd8< ztqJaJv&N+E712AweKEyLVyb2HGM{*CH>M9zCixLiDxC2GpZb%@r?Iwza#VQ2J!$Y6 zv_-VX#8F=2tX1a6`Rrr2F@qJv^(eTW;3vW37_agdKs&AJQ!SUj$j>}>8pq!?_)9!^ zZ17;yY|LVGmY>7uoS5CT8YhY`^9%euxbME{6+Hg~&11IZ^H=$6;Bk_(C8K)rYXW(p z%9O{WOl0k@K)>9N+pV_XA#b-@7~8j_Y_)1C?^Z8sCvntK?y~qiyK!sz`oR6<;+;<~ z-W@n|cRroFt4i%|FOgZ;X~#mjQe=G@H*sQnKkC~kS5eaUPz{YOW82uEmT|VtJoL=SZuEJj2g&n6QlWw4l9WTh`2o#&&DUAA6OF3yK+dbu{ zStPUcQ9D~z1u1%+sEK{c0>pW0$Z0e?H)^X%SJY%bj)kn%uPokJn7bLRyit27;)k_P zd!^P}&sLN8&G|QeSWDZPnCnH&`_Vm-*4il$sI?N=jk5XPx|+_rVG21q8rT`y{1hsW z`K*k;ZTsJ%Hsw(e$M7Pf*u(1+3=ZR!zOIoow^{l+w}!?;Ajr+3@ul&Vsqq4S+iZgk z*%sl*HV9j5%N_#jFAeStO{}zOrN&Se@eWDWCd;V4eukecp;vX}BvFr`0*=^8rmSAl zQ}$ZYj;oeNPdPmTR#_tE8pph<&@+=G7~%*@5p`YyZG^!LBOK^|oG>_r8EBiE^s`<+ zQ{`sTNn|)0`K@+GgzcDSO1eLqDC$8Enkrua19=)%6Gi_V)IJJrPHWyD(aDUVJ+wB> z4Pd}o-;gD4##Y9L<|f;4snygInYm?c8*u@xJv6tRZDY;dW>{0m3PWSfBmH~=eD``T zcV>;D%U#rkjOEX7!XG?wH@u;D&A40GC=Q*i;t<}184uppw&+FwfN?CXCXdn}3J#iJ z0OW#fRRlemJZy8p1HJzsig}RlK8Wr`?KsWGR}mrsAu{j#0e*AAg$w)eUAS;5xDt>- z#P{%Alm)N^DN+$c76j7FRs=*5L31^Vq3QGETys(WAGT2|6Y{@sCHZrn z&aX@9xId|%>2!iuOHWXUd?^f388kmiFMtsqX~pq=i+ z-%mvvr0eN?nsG4N=Xy|8N$3w!fJN$y6We9pZUxJ-FY<>LB&p>xIpF(3^k6pWpl~UN zdEj2sz*KGJkz=FnC^t)}ZIpK@t_5D)VCaEDzOGMY?zX%=dtv}mEPEuGwXs)~e(cI{PPzKB_QhAOh;eVbE--M8fy z8An~nM>6MZ8cskwoE04kFMA-2{V_E+-ovc?!j2)bp9QV;AHl zOep57!pJeGNjkMK74Z2{mdGYyy!#u&I{=mLEkbPD+ydI8)}oefc_3)#wy?v39ahF| zO!p%;^%ffWHdS;lAGlAZrRXLP1vZ7-H^uEMev1Vu9r9_2Eia?fL>c>e7+pq5Td0IV zp<@HWG%Rj5Y+m8EaJYlw3Re_P8VI=x+(WqJ@gk@`w-B6_cp1T2@c?ClPlDp}BYSJ6 z_%tXbZee3bRr#GLZ8vX^tk9`1F5X&Hg{2R!Uac=JEhq=al}J@c`^~0EQ*BF4+Q;sX z`UL1zl$0*Eq1Cf9V~q`s&>TW_Lu*KVn*+$FYyo%mPq9k5xqs3O)sYeV5cZxTP*D^5 zwY$ToHXMNHwB$8BDeF|}d-M?MUWm)LorPh96{(A=4BPYB;Ml=E&hM^Lh0)t2A^)6) z(7miT6`+Ir7+YGycGj>R&Yn=u=H?R})dNUt0s5dNdmqc6A}}STtvZN02wF+uq;m5x zLlRrPgQuqaHTCJ4Lpr3HktY0;&<)sNW^5B9!2VaMGkXnj>A2JyR4oDdo~kQvlQcJ| z`VCd@P_=hvI2gG|lyUI&(X@%aglbS36ILIloWsO(@>(Ejl*y!kDI#r({wOC}GURm- zfh!%havn(-6Gj>_Vs==B3!rsSQbKHs4UUfqv3Eh_T+0gTLKi?7DnAUn3Gd??2vs=@ zAM~S6K9lcVAJ=($A?bu9#ggQX^7Gd4(W?)Lqp_jLQeHuI7bTrU<-vK`?6g^ND%NpJ z&ox0F`;jivFZ~SFz84Vi0w|V%7a-gJ!f4?F;LhW61Kxli;RVckn6;3;6@>-w;PcXB zXOqD{lrdN2F8o984T@jjzG?VS+bMPAD#ZX%HyXKsLpJuDtrG-vXelX6W^9tBBOD#V zT|TjJ@lb+fX4V=MZJVs$)f7up3Yy~Oeasc}b?EtY+;Fq-t=h7+&Jpg_5(4^u4;n;> zQ+BkDW6F@?DNjc)kX+f<5&0==v3^Y-m~!4-tk)N`nJNFuwQKcj;msQhbyZ%hzkln) z(MbLZ3}L9nFl=_BG!4W20QIra%O0Sl6arOP#je1QOtQg=LulMfu58dBGV-{d$@Gxt*=+ctn0g72V(Y zS&aJtRi?rKd7y%_ZOQgaSoF zoB zfecT7c%TeL3WS_eAkXm^MN3E#H^rr3HOqSGr5e6i^xE@@yjMdWNm*1)^M-NPeE;L5 zA2g#l5cnp7T#S;*sM87BSul$41Oiy3LF-9hQtFe5Zh*8V+D#Q9QX0TxNMwqX?$9@o z`Jn#!rNH;k2fcQ0pCwJ*(XUSL`jT9n{0XY-@Jr;tt3@@lD;T2x=wa0EL@Tg&f?wZ} za+!KRqe>gCO%X|cqI4A?`iW^yJ2`!G)G=%vjgxSX?`~9b$f94y!aty-$5DBfX`0U_ zJs%$>%4`ySpPA1jt%0aNr^d=-R;@_YQ*srwTtd1XRe^LJpNjHKsz8}6jYyx6$Kf#I zdk1biy_M1p{r#*?0ijGZlV;NGAJho^+;;nlB(N!*fWZ}C;J#@FCohxdYL@eNV0q*;0E!xn#!Uwl#PUEuVg)4nwO;~g=KQ=wVJMzLXI zDG!*DEJ_l2$TB55138(%#9^e;I32;dlry1}RM6d%xnc1nlgcouxKLYRnCoaHwnGMw zIEqbwAh}>SP4v+}{0 zbn9yA;Td+OYBpeV8D2-NAl9;*-$RKQtQVcx2MDv(Y3q6-2aq&3p|e;CUPibfAhIMj zcG=wVHW=PMqj4te+jsF_{1TVVsDv$zvr3 zMygoo0jAU9X+fs}ul4gkpfdu>`wKa)6;w5g+KI#IDIrebsSWrdg@<2;7Bz?kzwq@H z?ml$5dt5he;TmthcH-N%UijR-?3|KQAkdfeI4Jx(&f|}c8%5(J;I&ht1owHJ2Swv^ z=g)NH9*3q;gdnv!yKKV!X3;dQqVb#*K&LNV{ivw(@FVBAUJ&&N=2waa%rsw8;(X>j z-SQl>y1zE%#KGSq7&(NuaMXTLNBtm5ThUJeyI%k`F0tf-K5dc$6+qH(hKOl4l#1E( znX~5`q_HPug3JNT$T}<@GNi{%HfNeNpX>>R!8#{inObh$v;hf3%LY-d!8?{Y7CH>0 zIN4(NhHTEVb73=~B-4^1r^iWhCSpH_e2C!u2y4Nd?zimpoY}0BRa7i1IgF3&xmxB5 z*a)=;+MBXS36@H8b^uZbpaGnf36)HjRg-Bl1!HX;skjPs0}29aMeFdX&P5xe6xazm z@9Kt;x~v%_ie%OmT~snpmmN}VN71|E7_`+&9qiB*P;#}4_+}5V^!?6-9AOB7~ykQQ60(&Flz^q#=gHmXVvkfWi?Fm$l zgU`-@LW};#Q&l1?n7N9uhE_5#DgjN6rRm&?&&DEs>wH*(BE%#!QyZ!2Xw!}iY!zM> zdZr4-7pka5qyPzy04QV;78$#D!6L}8sfl8|Vc3abtn|6>mvGxe_do<}+DbfCr-IIdKGj!g9xFTH9MU&nurdD(d<&E zV;2FF7@=<5y8WvMyTAGE&r9#)ySMJB?*q*$yyF1ve;59G=VXl$GjpL-D+Uv#r^oW} z71@Rw)Ie71<9z8?F8soZAnFGwX&o<56ZuS(zBn=><+eU3r23LdU3zwB9iT!j%X+j2 zB@|=@uvBC2+M1+%Sl_!~v%p>i`v^%oQdrn}4P*pcPgEVhn>(P=!vkA_+b#7S7*lvd zQy*Z1mMN@?y#TT34<@{~YN@qvxgi#C;j8%3notHfiQ4tTDuC>kwM8ES4zgRnT^@tQ zMfF2CN?(U2c;6!-!8f2D{CkuVN-h!q>%a@iIt>Vg@sRkh1J@&~#QQzGgubRt$I-=-}REVJUqx%@8BJE-5U}WzE(N3%*6v z!d1F}WrZ@9?$SegF5Nga_RuA}@Y1L3{UW#yQ00lZiLTZ^fyQ%!T0mN4om`}s+$$k% dqH*~1zJm5OrSxm+(*ID8{yVJEuc*KJ>c7n%x%vPA literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/identify.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/identify.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd3e20b1951cd55991e64f313a2da5a49e9acd91 GIT binary patch literal 4780 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 UV%+1LKQMLv72@}$S*U*TZ^Z${SpWb4 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/io.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/io.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1dec7b25038cdd4b416c2dd6200bd6f1bf37bf33 GIT binary patch literal 2788 zcmZuzOLH8z5e6{N9qx+{+axW!Hc`c;k;7ffj;j(!wk6AqidCtl%c7#x$ns>kz)DNa zV~xRz+O1_(Eb6NNz&-lnlYc;N`471Il)sQeoNkOriA-h-4NRj4Xmo%5VT(p1um~Z~ z?3I7se)lK)XBeM*YR4Myr$vcCyC(1&!Vi^x#ci ztvTEqHJ6CcHO=e{4nTV*Qvz8=T!CVQco@mtr`|McGO6X=i7* zGf|^-q(-2al!ABmr=3w*NcAr`8|jBsHwQ(o#8Z_edGb)m(9+%)QzgosUG3jda+E)W zQDYA*c6RT{WIP5Ns_m~5^(b_-bu*u8|5lQw$$l!dzoUdqR3WuneW9JZ`KZX@i`Bb% zIT?>(Yr(hkLBV0=vI|apd%yFI`eyjx>gDd$&nx}?Pd+!iP6! z$TkRfMC~CFff>8P9lG4({&O1wz66#v;exfxT~1&o;7ewvE*czd8L#t((KIit>WbFT z=1tx*vu)vt<#W5bVuh0p0yb^Fj5e^}Dqn$Au4?;FBZ#S6Dk+jo+hYj1_Tk(ncG@4p zY@TEgb(rTVBwf2wsEN!63<7Za;Mj+D3tD*v#LQRZgwE*#0KGx(kvqgDicJB0_*2%L z9Mfm?kc6x+DcFa$_Eqs%&TJMR-pY+nves4TgkBa=G?zInk>V3ld}XXU;?ow|@VFC0nqBY@=8P5&E);WAs$w zR@yaj5+)oHiAB1o_M|9_^oa;9xrs^>GF-s~tP&e&*Z`>B z7l)<}sSIn{F2I}D0D&ceQ5BD+V}|IId<%!pAT3G}+6D;PtyVOU(l(Ow#WXlEuKgSM zv_z~04x>#P&^C49XUc-I|I7lD7GruYB?t;k$pF9q7R2`^DFAc2AVe^%n^DJuC(?q4M&aoj8~P4lIK0rM`QrKg7fUkGu`LgsuUUR2Th;Mvn7$aX|eYDOZd=vEvjd0wal`K*lNs#+~530*HyJIDku z6_-os6UIScCI2oe{IP`ONHvw0(Fjv5%|WqPWDUhN6t9kDMp*79Do80Mt`rcT z`ABi>3T5s(Wpk?%xM&F~x7BhJ6L3X(Tt^75J(<_iuVQ~fx>Ip6{hr7@1$mTY1 zfCsVJ&c*G7uUzK#)OBoZ%zWq!!6|>QCvsy>U@UD zoI?rBehX#{YuI$wJl(l#rb0&|AYwfq#ttF>Om>Jymw0-ABfC!18FCfw9s z9P?rT30~rfN(O0CmZF5p6%ua`9lZR*1NV+(s9>YQkafk+rZhc79~v08cGYwY)M%bRVkqF p+A*p4f2Y;{^$NG2VFpUP2yBAj@S)t-pk1PM7O=o-)Aomf^IsGXc{2b2 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/literal.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/literal.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ae641036db965787b756f2c387747459a2d5bf1 GIT binary patch literal 4230 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 Ai~s-t literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/main.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a685c461bce5a39824512d6e42fd1809db46a6a4 GIT binary patch literal 31591 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 E1X<}T2><{9 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/output.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/output.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9449077d3b3b9f209d5b39d79ba3fe2efcf6241a GIT binary patch literal 13387 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/parse.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/parse.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..caf7063851d667d24be323096a9ed666269b3f90 GIT binary patch literal 11820 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 KRXb!Jn*9&m*xcm+ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/profiles.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/profiles.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f99c9b91f8354b288cebeec14709727d68ce5c3 GIT binary patch literal 1603 zcmY*Y&2A$_5FXEr$Idv8^8*RV{$LhqB_Fb8#dU=+`4JXY5;=|peQC9)EB5TpbdP$* zNetpaKtAjutq|{kxbPNz<>VJYun;ZPGjXzb)aB~>s=BJau9o$>?^u>~_S?^ofB5}Z z=MU8X_p9OVb6lxiLNAM3#Ns7xN2S;%cI*(RWO0YPXmjx^b8qGmqq)4ot9)tZk}~2x zezloHyc}`)GOweyg1(g-O9Rm=xG$GpS;PnbWi7Y+e0Ao$Dq)TygU{FUZ0oZMS-#D? z!QY#eNj=}Y{C&QOSyw^}+}Eb6dY;Q2S$ylK690g2&nmA=qya9J!Gj7^!G~q2!wNL` z&devP;J{kG>~nkDG7HxEy=NA`e`>WJd`tFZ981wmlspe3NSjPSlf!u^fH%j0n@l!` z&;*u-(X=^9(R>+Z<4`o233?7ehSpGwn!CFMQt}W)I#ECcT;>N30Ye}UN1s&Ja%%))l#Sc6K0?VgEU3* zLMc++h~O#=8cdSdrG3RhfF&B{4k&=_dY!eo|U?adXS54h( zMy%&`ldU2#i;^)LLT1jVDOOQ& zGQr#gmkUGATpn(qg1!@jyYJw)P|G9U;o0DkND9zpmSrl{&UiA?-X+BB1?VbE5&>6}R96>o@Tj$+E0l5>P^ub+ zM>B!SJRY@e#Eud7jJR*a0~Fc~WHMC`jp|Jj&Tuq8G+@(+kBoR^#K$PKlV(acC}l#( z3@O18r1Td{wTy=mZ@y}eWejaK5du{EpwsUj?e^I4Y5M}iMLP81x$Q+SPm-ywK8q!vMDUpzv-C$4p0!%C9lNynyf^kzp?m+@6{C6AwzoiW zcY}M^)v{Z%ZG*Vi?pwQh=Yw8<+x}wj{jXZi}4Typ~vOx3Kd#DZ>BP4#2Cs=xZGtEHvDA%uMU$KmrY z(%=649qdbu!{|1M{vMPdg61Szd}%~s%yL#ZkwbCL$$8;MZsA2<(TZAyANfT)YBy^< z4~kCIZEQDRDtb{5Y)`cESKCL4T%AruLvc_up_1q0Ur+iq(N$jY!H3@h*DUmCYmA3{P?+DsIVoyBQqaJjh-gu#2hp9^t!I*SGZiDCtpd>+}L`+afF_V1Eg(LVWkKDE^f@ao} zo@_}+`eU|E)`@6IA9l81og4eY7wuCw3WN(#brhz-@;WgSh3-;J%|%1o0r?a}2cVAW zPe9$Dkvwev?p+C~FS1gG**G+lOow<(s3+Al7vZi9b0mit%pE`i=-|sz=%dU``pj}I z^RapZ&TN2Rs5KZ`H_7wr=uLEq{sT7eE=V?L7Dm>q6O|O&@W=sDEae`FnB;mhGQs@L3qEZhA=6^M5$yJR^w1ARjE)w zt!YFu0m4+Z$`T_7QBP!A$-P90SVM8$Q&?K_Ynx?SDJ4^r&qCy#6k%4>VCX^QZtiT~ zf6(Wa=jF7pPFm%bV|9a`)pFG54ck-)PKttbBGZEyV^atnEWQPwMP{y|bqy63$16E< zpg?e5hoF4U=vB%bMzQn1`Ps?~&bn<**%@=*c|H%$^9Mim>8RhaejJxcA>-Hvaa>el znxox~<8P)(e!k*p0}sw_Rpn|Oowrb7f)!?5d8k5EFGFiAK+}t?FfTGT#-UrC^=DaBQ zB++tl;b>*?49G{RY@STrKx|0^{UQnf6TS66TwwAs=33*0eB#qCeVcX}cIK?nHUD4r CoPBcu literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/sections.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/sections.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..308cdddd2bd870835e560ca26a3c651b6980cb98 GIT binary patch literal 482 zcmY+Ay-w>e6o8#SCrznfWsBH~L=9rC5WP38C`5qLbRbKV)~67WI+2|q74bs60OBPO zyH_S&fe9yw0bA$O=N}y(pQ6`u4TR7Oyg$92zkYov|1&JLI#nS`g*l=qMpUDEuC4W0 z*AO*g15B`}F+|jiaqFgXE4Ev=l;hZG9V@rvPV4p%fdLq7aGLl zH{BWPcOUnCSY-@^m*%-AU|D4a6J90?UU{`p`-_c7VU^Z-^{FaEeN9?XUFIP1WFF1K zvBa~;52pX58=Xx<|9TWgH`1L-Qeo~D41LY{x}>++aFIx^B}tHccq;qv{)vI z#MP$E*e%!91H5UMG(^Sac9Nuw6;;|6l_cD3&YO;L+`w+&C_E$HYrMhN1-UEMKzPj< za55f+)60V(T^x}IU=JkE7Np!%cLh5h932voRd7(I%lq^e1Zlrbe!DOzH_{od3tH!J TqN&tkM**WPZA(|t&OPlLcA9*P literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/settings.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/settings.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a971225f6b889ba4e93f5dec993859cbb881952 GIT binary patch literal 24409 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

  • an~Ge4n3@OR`FEStTF}C0DWJ@)nq*t8z`&7;b}TLn{_R*a&>5N0{aq0p-{a9JzWZt7gZlGnVv1!^4Zw{@GJmzokc tA@f&V74`knIJ$e)cK>%uVcn>6^cz{7izN^ivLK7j0SJ&qkVj|q{{W6LVLt!> literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/sorting.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/sorting.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3616bc95d9075ba28d96216f3fdcca77329aca11 GIT binary patch literal 3535 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/utils.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a4bb89be205ccdfd39480c4f202abcecb7f5452 GIT binary patch literal 2671 zcmZuzO>f&a7$)^)*|FWUTR)PmofZs54YYBKUAwKtTC4-Qv}iLF5H<*kNX1NL$tCHe z$?Q{l+%Fg~AUWoz?7kBZyX>^Tu*0zTrEDkZCO{NFUXm}L=XqbM>U3HzA>`NJ{`mQq z-@o$yg!;M1gVqChRSpFsj20xWzci-Mb_!?c#xBJ^xA2C3><@!D7&hX@FpNV=z9GzG z{yW0_Lnm%RD_{+1HK5gEAzxxm-p)PNVoUG5xWnj6(rf<(dy$PEHQw`74|<+)AC~*Z zdn7V#!e=8bsxmE%zd0TiJVV>FPY8_%@T$8|aDraO4hxyfUFLC*``qP0?yQg%@QFEj zU_J8V26JHVrU^Ht;2Ra=hHRLntSWP{o#dk6iv~+|Y68jiSe6;0H-E71!2314>SHJ- zj`9SVI)Y3{LMC+LTutk}4~ zdOJzpjMHK^;wmkr4-+JcM8@_jTx~4bAi|f3*Y&1II~!c1K~K@WG#?flP$sgfVW`w!U9(TQMOqJES8uH z!nj~O1m;-+ek~!BV9#GR}v}%9*sbDK}4K71PTiqQlbSK-; z*>fz;#*0AT&TSch1=44?+<*#hc}REYk#kIT+^IVu zJKofrxR1z>m!|&2pLjd|E|se~I3!q~`1fbu6*BeSbY_9#B@GOe+Tl>5BPJLDVx=|> zz^y8Fx$&VxE4d1TvV#SxNp_*=1rpDH3RZl5Hi;#(utu(uR3#cSiSaZaj*N$$@1bD= zQ7SI=3aqDa?PZ9S&}q>&Z984(V9A10+n5m9!dS@A_O<(C;;}7U~A$7XzrV3Z1>!QpR7($qc3cNQdVeL zQK?g*MUoe(7Q0rtb8n-q{fJef+>X+S@sS=Z7RrSLjjCFmr8zgBLPz}3f)?~8IY)}TffkpFRO!UV*ql5039faTQZSpCpmy>m z)D?=i>myA_R6tvfLp`tkk2j~Qwv``(U9T-K!$;yAc@+xNND@|MNg}Ud*Z*a+2nUc= zxrW85C$?sj8_ESGs4$6#kYYdcZ@4!*68mfaZTKQ!^9SQ-5lc^?p$W#(gdEc;)gXc+ zpV4EgE@GWIuN}EI0XbN!0IhxiF+s$+njAGI&N1C3Q#!$0)lHwmMsrb!+|sxWA}DRj ziuhZhbe*KqLRHZ))!6{D7Ur}pRXhUbUx|`cduqL9DStJ9xjA&9XplNIP9dA6Wwga3 zF&x32!`baf=t!tpJ1upTS8}l|%$e;4bFy>{8|@9|=?)i-D!8#AB-d*PZ>`nW4%}jE zJ)2VBAOG&zqwk+SuE)13NTKyj9c{|-*+bm6XLxQeOzU!07W*?Nqp`v>ogTeLOY*d^ z2dyP<+&xj6fTa??a5*}avaFh*cGb9QUzuUAZCg}eoYX&|8Rzc9`!2kdN literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/__pycache__/wrap.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/__pycache__/wrap.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1969761fc7c479f4765a62c28774dda318a9f9f7 GIT binary patch literal 3398 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/_vendored/tomli/__pycache__/_re.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/_vendored/tomli/__pycache__/_re.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4ee444b8256c4f6b48effa493a4dc3fad3d70a2 GIT binary patch literal 2814 zcmahL+in}jb!Tr}E=h@^WXG1(Vgnbb);3AeZW22PqRJ}MxV2?LRt$7yVzt^CN_6%@ z%nl8U-F;GC-5)3l*e?b85B-Dw!2o&clOKwpK!E~5Q1{I6V%ZJQA?EPRnRCvZJDJvM zwx%e`AHMzWZ~yq`^*4V9{GC;X(=TCXKLEfAMv>x)Z#6=(>ZvjEP^@`ctb2NFct&h` zCKC5rREjOnlDHm~W81UiidTuNUNx?HHKY)mwt&xw7UD&35%^56PL!uhxCF3)trx1d zOq7>Pr2YzdEApmH>VH(Q{U>eCaRFCw71v0OAfoow%SvCz3wZGx-MdIEjBx!0!b{`> z+3Ice`DG`^)b3 zZ}08=nrmChDYqUD*&t1Vh#OxefPjp>8_64bYz0>=B=f=l{E75E2W^jlU#on-i!FFIh7Z+R2FM?*j2Q+{4+}XVb z3|E~K@?5g!5*`UFrktIgWD$DauB*<`AUP+Hg2qo~5`g`W$W?m+XUSk z`9TLPpW6d6?)-tP4kqCZXOJ**OsF#qCxXtwq=~mtW zeK&h=&j+2G)4bji!39^rN2skE4rv{?oX(xwx0@Xh`DC88gMFtby&Uh&oL%?ad|g=U z{+~K=Cm}dzz9?2F?e{YRY1p*65eFfy zFdUXThqHcf&5%PUrSFjsTei%|UNFc=<~$Cf5$RG2e1pEjPRLXpPT?|1nG>dzk_^fR zizfo-Sr84d%)V3uaySLN49~^bs&q(sD9Sx4!!&7#WCbwFhjdnI* zq&W=2uY+TfwFg;BS=$FjoKk|@ERCZ<+lRs*p7JG`d7q{JECp?NF53WLHq?Kq=*K>5 zs)ed(4P8PyT7YdKUA=_p4G@B

    O@+*sAyy7dvyJ^D3aH2V7V$cL^Lz7LFO@Y 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/deprecated/finders.py b/venv/lib/python3.10/site-packages/isort/deprecated/finders.py new file mode 120000 index 00000000..b6f96fe5 --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/deprecated/finders.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/c9/6a/9e/c9fad15f0ec5bb85b5b96997b7eb41fb15bd914ad3edc494ec846c29bb \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/exceptions.py b/venv/lib/python3.10/site-packages/isort/exceptions.py new file mode 120000 index 00000000..9b4af783 --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/exceptions.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/c6/65/32/179b92d4afebb653035a86809ad0ff3c0d01f36bbaaea8318048d48dcc \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/files.py b/venv/lib/python3.10/site-packages/isort/files.py new file mode 120000 index 00000000..de46d34c --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/files.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/df/04/6a/20002ab8209317968fce9ce80ec581beb4f2e3dbea1b5d61005b1e243f \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/format.py b/venv/lib/python3.10/site-packages/isort/format.py new file mode 120000 index 00000000..9be19cc8 --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/format.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/13/d3/a0/e2673b6a3c7230016652500ad99996ecdef9b9ec5f63473dabece6cb30 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/hooks.py b/venv/lib/python3.10/site-packages/isort/hooks.py new file mode 120000 index 00000000..11a5d2dd --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/hooks.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/61/ef/af/9b443898b1719b5acd08bc5d3716c46bb0fe94ed94c8bdaf2e7be37bbf \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/identify.py b/venv/lib/python3.10/site-packages/isort/identify.py new file mode 120000 index 00000000..80f28fe4 --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/identify.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/43/9f/07/078051ace81d6e25ae93acbfa2570f9cb6862186b32721af561786ed8d \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/io.py b/venv/lib/python3.10/site-packages/isort/io.py new file mode 120000 index 00000000..5805065d --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/io.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/12/55/31/164f9205e30a550da7495b382f59620c71ed7faba6b13a4dca36869358 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/literal.py b/venv/lib/python3.10/site-packages/isort/literal.py new file mode 120000 index 00000000..3f759ad7 --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/literal.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/d5/f5/d4/9631b8a25d9e2848a4a0bce8ac3fe2af6bfb437fb7a0a9716a2b4d7d9e \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/logo.py b/venv/lib/python3.10/site-packages/isort/logo.py new file mode 120000 index 00000000..b4922b41 --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/logo.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/70/bd/da/97bf4eeced06daf8aa44c45f04fa74aad459989c369c7482670f1759d4 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/main.py b/venv/lib/python3.10/site-packages/isort/main.py new file mode 120000 index 00000000..fb031e74 --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/main.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/ad/ec/28/dc060cefa2288fcb3aa3058db961d6a81b3bb64fdd2eac8b8cb6c6eb4a \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/output.py b/venv/lib/python3.10/site-packages/isort/output.py new file mode 120000 index 00000000..f04793af --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/output.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/c9/55/99/f56f070a25c954b165625e26a7d878a5e37b6bf70d2b8f900dda73b1d1 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/parse.py b/venv/lib/python3.10/site-packages/isort/parse.py new file mode 120000 index 00000000..0e3506c2 --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/parse.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/bf/dc/a6/a1a7fafefd0b41ec6eed6063bf38b818ca1dcdcda7590f2ef67d1ab869 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/place.py b/venv/lib/python3.10/site-packages/isort/place.py new file mode 120000 index 00000000..946c826c --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/place.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/bb/7a/8d/e6bb7f03621c559e6775c18ca212d9bec456cd5ac97b79e29087fb4bfe \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/profiles.py b/venv/lib/python3.10/site-packages/isort/profiles.py new file mode 120000 index 00000000..2f69c915 --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/profiles.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/ad/b8/59/8354ddb5cd8a41172c617fa0cf3a59ac1c82d65a3f1b160cb42d369071 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/py.typed b/venv/lib/python3.10/site-packages/isort/py.typed new file mode 120000 index 00000000..05b4099d --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/py.typed @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/e3/b0/c4/4298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/pylama_isort.py b/venv/lib/python3.10/site-packages/isort/pylama_isort.py new file mode 120000 index 00000000..b6810c1d --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/pylama_isort.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/bc/d3/fb/8c0c59cbbaf2651e21a2dca7038242cc0c4bb5b6ac4fd018a598a20a59 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/sections.py b/venv/lib/python3.10/site-packages/isort/sections.py new file mode 120000 index 00000000..8ef6a850 --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/sections.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/c4/6e/5b/c14e2d38829499e041859e391087e33fc1e00cec7bf7a6cfbc3e73582c \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/settings.py b/venv/lib/python3.10/site-packages/isort/settings.py new file mode 120000 index 00000000..67f69376 --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/settings.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/6d/f7/6f/6f412335cea0b411a8de649e28def39ae6c1b5e77cd5a91ce5e57bd0d1 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/setuptools_commands.py b/venv/lib/python3.10/site-packages/isort/setuptools_commands.py new file mode 120000 index 00000000..adc97e29 --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/setuptools_commands.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/bb/37/81/7067ab4cab68cbdb47a3b3be8d5798ceade740059f96e383a6647cea3c \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/sorting.py b/venv/lib/python3.10/site-packages/isort/sorting.py new file mode 120000 index 00000000..d7b632f2 --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/sorting.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/9b/83/1b/7b5c2ae51b54648a7a82eba1e9d0814550f88a00862d791a4cede5d625 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/stdlibs/__init__.py b/venv/lib/python3.10/site-packages/isort/stdlibs/__init__.py new file mode 120000 index 00000000..217723c4 --- /dev/null +++ b/venv/lib/python3.10/site-packages/isort/stdlibs/__init__.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/43/37/c2/aeee885a8e4bfd9619e25826f0fd89d88f959c5b2a7e570aa553eb9b77 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/__init__.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a8623b1d8ce42b87280ff7f3d2b03f94985b859 GIT binary patch literal 357 zcmY+7MhX4Kwnc&sDVrt<4e7@VAUD*eD=@!2ddkHwtOIU1{wHWvu!5@Q@gemiY@P- z9#*r*a+9&WX!oqCH>@9rZP(`WEM>YL#H=r$U&|MvS*<%YFg;YZO0%M<+j=O9c|V$9 RA-ihVh+FuohOs6n#ebU*S8f0R literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/all.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/all.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2615b832bc24955536044d31e4bd65351dafabff GIT binary patch literal 235 zcmY+8zY4-I5XLWwhzJEA!L@^)e^wC{90cv4TeoV0t)@*$qR>b3dE7b)PCkH(lL<~9 z+>h^$kMB+eL7M@<+YV^5{qPU`S xV_Df$732PJfF`q|S0;yZaufzLqqN0erolwYep%J6Nv`-sim89bG#on6pg{#U|?7zXq(p_eDBX=AR7fR0eKEUTr378QW#Pga~N_NqZk<(QW>+DqL@;c zf*CZKUorwEH5qTQ6jU0S`)M-YVkiRXyTw*ql9H2|w34BS703k>zx?zw@^e%5i%RqI zQj7Fm9fLgmbbS(&4E4)W^UCyrs`U#hOEU8FjP(o+^ouh~QgsUwld}`kQ;YR8i}Q<0 j^dV*z1C<%+6;$5hu*uC&Da}c>1G%A?1xWBPa4`V@{>?S; literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py27.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py27.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7aa26433bb3205f6d342c9caa1757c0dea8db4a GIT binary patch literal 2938 zcmZuz&u-(m8FwsOlI>(>u}|Pb4_#n4>1Mj!q9_(SO)@h9@~@jrr{Kk)C`#g5A~_@# zTX~qh^wdY_gY?2{-=e4fNM(Q>paCM-vPAOx{rf(3bhJz+lgYb3{r2C#oPPc8KluFF z-xS||#J~LlmvTZT&7?f|#{oGgr}vYulBZvmZ$!)2Oi4$Dv}@P!wRKdM)RgO16o#5% zt*Z6i;2I^@r^nwPFPG=H>zmt$^~L$+!}0pE`u{JnhRT}Tuh(=f`3`GYx3-Py+j3oC zL&K@#<+8Uz)^UMuYh8&Q?Xe!#mKmYl@$!e?984x8xuK7K#*`j>qIacFSQjq#(a%}a z%dLOe^{o@yD8_AA(C0g9BtBR_cZ25EXFE=}hF2t$(rIi%WMW#bwPeA#GfEGLVOGH#4ASh>Q3tkWcAJ$|x&;TjYd*78YNbbe~^ z{2N0%{y~{7$wXI&SICr={wOR7@B`$|l5}4hoXsyf(edYl_ol_IQ=i{EgEcR2{X%qF z85bVR@S=OHtWP`p$c*#(d&|ugu=WeBtk`Sn8Zxs$jbt4aZK3ugH5L2g=_%?`C1=)u zagPOC{_f%7?w*@RZhZb+zwt?JG+AlEwk>x`wE$EPrD8rE?~!TMk$GXu5{O#vtj`_a zyPcuhAC`UB4Vw`T0N-~72Ve&u{IqWUyx~-TBy%mm56K$Wg*wR+$SNDRB6%qcqpaaR zbJPUT;>kM5)B05}MJS-8j`|d&qEe3jIvvb+W%AB=F^kVLz|rv`^moqu_**x#?Oe!4pwp~H4v z-IRC@$M6{}r8#px+wx(jOi5;42V~M})ZkPA$QrrIKn5Swe1r z$@NY^A+x7Isnm6$)C2IK21^wZE42R0W|ahZq7SdRvF{ z;)JmtvZx>sCtyZ|M$ig=iIyX&ZFmdNXH-Ywupfk9Rn?G$@I;YPl_j`2)tmZQxJ^pi|52dmevA`a0J;W zE*k3mmt!z|rtggQrBF)4!;HMBxwJi8(W$aWq~##n(E^{+GinMY$IxLE83JE_A`bNq zmL$*?Nvq(G7N?0&Yr_LcFBse=4K~#z5v9u@1e8c?;Jg1>`Q0^B7%f%JE5TDzxKT6 zutggp9T^UZ9gb{OLY6^r%G$_j$sb7?paP6J;G>oafd(1U^VA=nDOrhnOqh5#>@!Cb zlq#^yVy9U>3KSXIA1F(@@;jfgyVyK@@_=BQ3OvlJE+U%2BN63Phc;&Y^!1frhEW8O z5UY6DB3gpx19m93Rd5^L8XKTb3;6pFzlU-Mi{uK=lA7W>5{<$jhpSI`}5MQe zgL7hZ%zm~(_DH)pcf1IFjY}uoQ1S}#gSt+gdNnrca{-OayB-BY1Rq&ly>bgpF#NGvr+Z1cVL!1-2eT&!^+OKwkd3`G#2pz{aqlZA(^Xs#PWs z18{R{>Zl$hJ2Rn_@&N=O1cTuHv~1Bk(1g(?sD^~XfCZDxfu{jz;T#0xlLb2H<$ksa z*r%9aL^U9Y!Xy(02eOI{2;mWghU#zv@a8ixS7S+XbSL)LRDZzefQ<4B{0J>TbAGk? z1p8)l^VJmndjsokHXuHZjQ^aNe__0hm;c_LG^*n#08w&ta`F17%bRbmXz}gIBbSdS zfd53tS@zZOx4%0Hp8X~yHpQrVA}q$LljkuMkDY#xS=8r$9{utIM$w6#;WC>XX8!|G Cwrg-#J z3)&~qKC6yB#6vxa!&1{%O}%;tJ@!4%U%}R$6ijd1R%mv2{diwYm*pyBJJIf#n`Ub0 w*Ik>>vNEu%ipvRog~f`tZi5ID%um2R)rmegFUf literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py310.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py310.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..202409aa8955628f895274a0975cda8c7a66ccba GIT binary patch literal 2187 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 Dw?bCY literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py36.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py36.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3ca82292cb470e626d88c730f51ca8751155104 GIT binary patch literal 2206 zcmZuzO>ZPM5S^rZx_c&xmY*;e4lA)4c7yhW5J;d^Qa@(G6Gj7|l-I;X$ z3tTvH;)XbLZgbM@Qrzx?{`pZNPf zKj*mn9KZ1cT;zf+`h`6E@r<3x^KTZ9i-#Z9UuvT^!r8>Njhob~O-$TM9^}U8Ht;ZQ z+-CE_o7ZpNZC<{3_3nD}YXAR-M9*!f;zt|4vFeCeF>PY+Mk6;Z z5(dSSlIt;Q+sy%nLrfAG0vP&Spq`H2dDlvIczU*a7tML*gDJsL)n zv=2_Gm}60MfdT?b=T};RX*fSP_Gw zN}NuwaI^C~L`C%;Z^htQB}UvwTBRN^asVo1JJ31K)w|O}y2=N^Yi2V=R^7{h+_W0> zpiZGL@piAfIXH^ZgLfh2Z>k~QiI8aJUDWrUr=FD&=vh5*ZCZDa>YP*}Qqcv^F1!{8 zqmpw5p#3DBpz8FD>U7XHsX$Fq_vsk82My!Usu0=I>&(xxSKQy?OCB;nx)`m_;U!O; zDo}>}sLpdK12`rW5n|5`APpvX0U81qs^#K9E2FIvT=a?>!Hvo~0yjFc!l#L<0A;y> zR#Ab;Hyg%R#=^3 zXR4@3X=2MbB#*C;{7$hN(#Wt_6|Ky{tEfB64PDGt58N2gRe0Ir+-Uj8nj;ds(Mph* z`;K}Za#xmnVUxi_A3!OsfGUki8xSeNxtB$FY4s)tL8AeMwV6$UNO-QefBYLYuBs~;3=P@m=2PEEG$hplMQE{hw{7V z>|7;mJSYnxq10!|-9SXQ2JGLkWf-l8lL$zsIEO#J-E>D9Eb>4yG z21sC=&~pVkx%X6qz%D0T;pu6kyncL+J+y-$ce^aByjFi&gzvFS=gVJjw!ItF79gz( z+m~N_{p$6TuXy`(n~isiueW~Q_czy1Ki+1EKJjpOj&;7(5ld?OepTbMo9Ecq)O>mp Q*Jo$>e~l8Ca&cMz4Wv?DkpKVy literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py37.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py37.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..826a0cbf2f7c0f6b123fb93aa789c26d94493125 GIT binary patch literal 2224 zcmZuzU60%}6rJ5qt5H$3S3X#pd&dkj_#r-Yb^N^v_ zdaydj$`GgmnMekydM;%E`-F@_?6?8g-UKf|P~bu}TpVa=v{izOPSHYeqq4%lnvSgS zX{0JZbFQalRNy!{B)S4~398Wo?CHMkWT5h>?2&3H)ngUa2Q{8tkgV)`0IBvSPju+SgeXx=EJL~Tgwftr>uK!47e-2Y_M;zd|-}V}?LA#D|m(6%Z}0&$6F7iHaBvw!46|ATX*xARtnipnEEKBPL2bx&g^_Q@XX( z`+YvQXzriW!g&=q^gwk`e(IoA9GZuIhZD3KJ15ONaM|(1YCcHqoTtlHusSNZ4O(!4 zDkR>Z;#2DgD5i)b1lY(Xt1WZk5rwTzs%e5dGY&C3zDj3(DPE?xvo>M&) zP&-S>Voi>!@yu3dP*J#^ct#I2a|0M z27!LR>YW^n+G{Iuw{|g3yh(LL%0L2;3t-_elYa|@%BAN(h00xy@q*BS?5VcXg0sA_mrpM46*V>Avf?hQ{_I8X@~T;|iY z^+TdZJ2~|I_>aw2Xj0e-TP9_!njEw2kQ<0ZY$}IAqg`(Yhu+K$#4%$mtV}qQjb`eD z^5^L6lqHNkC<_50)#u6GKs>hw?BB3?7_5hb2uQg@x*Dp=^b8u~2fYNL!VmM9sD@y$ zojv|{p1Ce4YVtYE)EuxETJUgod^Bg40*nR*DQONQ0T6O5hA9;X$P$fL?mz}zof{hJ zJc8r}kiagX;|g?g4?hQiZ4S7^)ALw)^W+kfX$L{>c3D<=(EdIPzhb&hm%rX_JJ+i% zKw1^HufF>J^_!>P@#fh!8}1gXw|@EuaC80alWmshQx8|?81P#iF{!o>!yC(PUSNXL T;`6h(zPQN$K1y85*;V~FHKS$) literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py38.cpython-310.pyc b/venv/lib/python3.10/site-packages/isort/stdlibs/__pycache__/py38.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10a7b82b85fb2871152fb14046c057f1cf3fb7d7 GIT binary patch literal 2215 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/lazy_object_proxy/__pycache__/simple.cpython-310.pyc b/venv/lib/python3.10/site-packages/lazy_object_proxy/__pycache__/simple.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6a6f050e333ed883fc5fe6a7b9936e64ec32677 GIT binary patch literal 8374 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/lazy_object_proxy/__pycache__/utils.cpython-310.pyc b/venv/lib/python3.10/site-packages/lazy_object_proxy/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e3dc3dbbdd8ccaa4ecc2d8d74121d748065de6e GIT binary patch literal 2109 zcmZ`)TTdHD6rR~#+iPP3p%5UwUsTmngA=ut`Vdv2h@?mnNI+lw(9wElFiY0E?(7;c z+DNU)W7VHf5vfv@hyIHEi+$}=pYu{xy?tjEL+!e2oik@{=lacY+-THn#@Npf{`}#q zKYse{7sz9ugV}vh@*S9Dl83Cv+nkeZg;vjQ+eWrSr&ns1jO;)zx66=Aviy{_E3zV8 zjION88pf)ek#&qU*^sjsXXKom$5@v)`E$E{ zL$2UcjwFft?f;0G&W)#57Hn~ z`@=q+Y&=wv(q0;CTJSk(yZlJDKrcW^9qe14u`PuB1>0lK`Sx?L+>Sd(x`Iu^e&25$ z#y!>2g9ut%o9nw<+qWNiox81L6&<(2pwsFP)5AFWXzlKuRuZJ@cHi?KdtH^ZLho!S zpiTLy=fa%55 z&e)N2R7%VDv7fA_m5inCxuxGst90X{_6(^^XGq>-#=&MicT!YBQB5TB-Q$eU)QThj4?OW#v<;#2hy(+quKxJ*Ei`1!4&l}{?|}O z6`7n(RsK58en6Lua+-}PCxB3BJ0O!TO4boz8nDdzk$-;$x=V9}8g&{VT}@lx!lm5t zbT`S%k56cvOy3(g@gb?EaxHL8^D+B`5F(R2awHpJqfq5yX+ml41`-hm>F^FVjb?}I zw;}tWv5&0Y2PITA#oAo5wk5f=&@63fO9!JPOK6hie9rg$L!c0i1#c@I`gD2pkxX<| z;|!=0Xd5FS1Fi>y$VXKuDf(Sv6A#E0B8Vt+pU@_i<7{QZ=Gy3pZ)1D(QCetjj8iQ$ z#DV5frd(z00`q6wVNdLgqjFR~>mJMOk!!Z`CWm<$pm7S4BCn@VLZ|SS9)527VUm}Q zy>Or=J+BDSRk-;n&Lvb4mpgm~bhiB80L;nlW=X$KS^>{qEC(U1<#i#x9(ZA4TN}hT zapqsvOvdO5>36_B1|@`b7Y6ILS=(+dpi*%d;y)mWqh!tN_@=4l74$g#J*7p@D^Uwe zu3Mz(d8W~sE@k?LdCKO!X?hn1oCZgEx%iVY7N@zFyZ4HyJ|pZJbk$j%)6cbC2fv2l IBsq)DKg_<51ONa4 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/lazy_object_proxy/_version.py b/venv/lib/python3.10/site-packages/lazy_object_proxy/_version.py new file mode 120000 index 00000000..9bb216ef --- /dev/null +++ b/venv/lib/python3.10/site-packages/lazy_object_proxy/_version.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/07/90/60/564a2057a308fed09b75fa526c6a28b863c7f72ee1102c8f928f9de897 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/lazy_object_proxy/cext.cpython-310-x86_64-linux-gnu.so b/venv/lib/python3.10/site-packages/lazy_object_proxy/cext.cpython-310-x86_64-linux-gnu.so new file mode 120000 index 00000000..d6a64a81 --- /dev/null +++ b/venv/lib/python3.10/site-packages/lazy_object_proxy/cext.cpython-310-x86_64-linux-gnu.so @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/f8/0f/0f/70706eb81c4a5c5cb0ee915fb2ea6c915f02419ca9127f9ca851a91bac \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/lazy_object_proxy/compat.py b/venv/lib/python3.10/site-packages/lazy_object_proxy/compat.py new file mode 120000 index 00000000..9b3b1a3d --- /dev/null +++ b/venv/lib/python3.10/site-packages/lazy_object_proxy/compat.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/13/89/ef/669ce5eb13d8d2746b41c330150d76f6e3f0aa6856a724aff610c530e1 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/lazy_object_proxy/simple.py b/venv/lib/python3.10/site-packages/lazy_object_proxy/simple.py new file mode 120000 index 00000000..6507cc3d --- /dev/null +++ b/venv/lib/python3.10/site-packages/lazy_object_proxy/simple.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/8b/04/7e/e5e43b525d4f26990475d6d85b77b2b8e763aa24e0322af04ac78b0f1f \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/lazy_object_proxy/slots.py b/venv/lib/python3.10/site-packages/lazy_object_proxy/slots.py new file mode 120000 index 00000000..c284c3f5 --- /dev/null +++ b/venv/lib/python3.10/site-packages/lazy_object_proxy/slots.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/ee/c9/9c/4d5f552717b0ee7d5c64b4d334b70120d5cef0e71db9c804e0aa6febed \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/lazy_object_proxy/utils.py b/venv/lib/python3.10/site-packages/lazy_object_proxy/utils.py new file mode 120000 index 00000000..5832e40f --- /dev/null +++ b/venv/lib/python3.10/site-packages/lazy_object_proxy/utils.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/6f/25/6d/19a2b49404758bb05dc6a49c512d5a77e43fd725069c6f6ec8eb4d008e \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/INSTALLER b/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/LICENSE b/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/LICENSE new file mode 120000 index 00000000..fee8453a --- /dev/null +++ b/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/LICENSE @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/10/fb/c0/03cbaf8a6b3cf7195b80dac96c86daf390039b2abf6e7b6e735afd7d74 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/METADATA b/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/METADATA new file mode 120000 index 00000000..0936a883 --- /dev/null +++ b/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/METADATA @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/a0/cc/54/fdcc387afd90db76132f7351838a5e6c74aa96b6c5fc3492b3e7297c11 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/RECORD b/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/RECORD new file mode 100644 index 00000000..69c4dbda --- /dev/null +++ b/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/RECORD @@ -0,0 +1,9 @@ +__pycache__/mccabe.cpython-310.pyc,, +mccabe-0.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +mccabe-0.7.0.dist-info/LICENSE,sha256=EPvAA8uvims89xlbgNrJbIba85ADmyq_bntuc1r9fXQ,1221 +mccabe-0.7.0.dist-info/METADATA,sha256=oMxU_cw4ev2Q23YTL3NRg4pebHSqlrbF_DSSs-cpfBE,5035 +mccabe-0.7.0.dist-info/RECORD,, +mccabe-0.7.0.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110 +mccabe-0.7.0.dist-info/entry_points.txt,sha256=N2NH182GXTUyTm8r8XMgadb9C-CRa5dUr1k8OC91uGE,47 +mccabe-0.7.0.dist-info/top_level.txt,sha256=21cXuqZE-lpcfAqqANvX9EjI1ED1p8zcViv064u3RKA,7 +mccabe.py,sha256=g_kB8oPilNLemdOirPaZymQyyjqAH0kowrncUQaaw00,10654 diff --git a/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/WHEEL b/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/WHEEL new file mode 120000 index 00000000..ae483c49 --- /dev/null +++ b/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/WHEEL @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/cf/d8/f4/c406bf26650a3299b3ef62b464600b48cfe7fb04159866e5797c765478 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/entry_points.txt b/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/entry_points.txt new file mode 120000 index 00000000..175060d0 --- /dev/null +++ b/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/entry_points.txt @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/37/63/47/d7cd865d35324e6f2bf1732069d6fd0be0916b9754af593c382f75b861 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/top_level.txt b/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/top_level.txt new file mode 120000 index 00000000..ea6a5c09 --- /dev/null +++ b/venv/lib/python3.10/site-packages/mccabe-0.7.0.dist-info/top_level.txt @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/db/57/17/baa644fa5a5c7c0aaa00dbd7f448c8d440f5a7ccdc562bf4eb8bb744a0 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/mccabe.py b/venv/lib/python3.10/site-packages/mccabe.py new file mode 120000 index 00000000..99d05698 --- /dev/null +++ b/venv/lib/python3.10/site-packages/mccabe.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/83/f9/01/f283e294d2de99d3a2acf699ca6432ca3a801f4928c2b9dc51069ac34d \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/INSTALLER b/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/LICENSE b/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/LICENSE new file mode 120000 index 00000000..13a82092 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/LICENSE @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/f7/72/29/5e81af3478d34e88e52d076200230ec7dd6a39e123bc5cb35aa66abdae \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/METADATA b/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/METADATA new file mode 120000 index 00000000..43ac1ca8 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/METADATA @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/78/f3/72/a6a96971fdbe0a53bcf21c764ace0370f98c64044a57105d6e47525a92 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/RECORD b/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/RECORD new file mode 100644 index 00000000..fcf4411d --- /dev/null +++ b/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/RECORD @@ -0,0 +1,10 @@ +../../../bin/pycodestyle,sha256=wiLQp6983B4nR35BvVWUlRPK80csWxTG7hY0Ym5DTbI,216 +__pycache__/pycodestyle.cpython-310.pyc,, +pycodestyle-2.10.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pycodestyle-2.10.0.dist-info/LICENSE,sha256=93IpXoGvNHjTTojlLQdiACMOx91qOeEjvFyzWqZqva4,1254 +pycodestyle-2.10.0.dist-info/METADATA,sha256=ePNypqlpcf2-ClO88hx2Ss4DcPmMZARKVxBdbkdSWpI,31580 +pycodestyle-2.10.0.dist-info/RECORD,, +pycodestyle-2.10.0.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110 +pycodestyle-2.10.0.dist-info/entry_points.txt,sha256=MwLE0guIt64aEHtZzaErZQwFVsR4U1jmzn1L_C3RfXo,50 +pycodestyle-2.10.0.dist-info/top_level.txt,sha256=rHbIEiXmvsJ016mFcLVcF_d-dKgP3VdfOB6CWbivZug,12 +pycodestyle.py,sha256=ol8I_ngm_d7q7ruAFSEfKOnVYXvaGXxK0VZqKW32HQQ,102313 diff --git a/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/WHEEL b/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/WHEEL new file mode 120000 index 00000000..ae483c49 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/WHEEL @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/cf/d8/f4/c406bf26650a3299b3ef62b464600b48cfe7fb04159866e5797c765478 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/entry_points.txt b/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/entry_points.txt new file mode 120000 index 00000000..b16c9905 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/entry_points.txt @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/33/02/c4/d20b88b7ae1a107b59cda12b650c0556c4785358e6ce7d4bfc2dd17d7a \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/top_level.txt b/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/top_level.txt new file mode 120000 index 00000000..5403445a --- /dev/null +++ b/venv/lib/python3.10/site-packages/pycodestyle-2.10.0.dist-info/top_level.txt @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/ac/76/c8/1225e6bec274d7a98570b55c17f77e74a80fdd575f381e8259b8af66e8 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pycodestyle.py b/venv/lib/python3.10/site-packages/pycodestyle.py new file mode 120000 index 00000000..2691ff39 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pycodestyle.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/a2/5f/08/fe7826fddeeaeebb8015211f28e9d5617bda197c4ad1566a296df61d04 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/CONTRIBUTORS.txt b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/CONTRIBUTORS.txt new file mode 100644 index 00000000..59af3e05 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/CONTRIBUTORS.txt @@ -0,0 +1,609 @@ +# This file is autocompleted by 'contributors-txt', +# using the configuration in 'script/.contributors_aliases.json'. +# Do not add new persons manually and only add information without +# using '-' as the line first character. +# Please verify that your change are stable if you modify manually. + +Ex-maintainers +-------------- +- Claudiu Popa +- Sylvain Thénault : main author / maintainer +- Torsten Marek + + +Maintainers +----------- +- Pierre Sassoulas +- Daniël van Noord <13665637+DanielNoord@users.noreply.github.com> +- Marc Mueller <30130371+cdce8p@users.noreply.github.com> +- Jacob Walls +- Hippo91 +- Mark Byrne <31762852+mbyrnepr2@users.noreply.github.com> +- Andreas Finkler <3929834+DudeNr33@users.noreply.github.com> +- Matus Valo +- Dani Alcala <112832187+clavedeluna@users.noreply.github.com> +- Łukasz Rogalski +- Ashley Whetter +- Bryce Guinta +- Yu Shao, Pang <36848472+yushao2@users.noreply.github.com> +- Nick Drozd : performance improvements to astroid +- Dimitri Prybysh + * multiple-imports, not-iterable, not-a-mapping, various patches. +- Roy Williams (Lyft) + * added check for implementing __eq__ without implementing __hash__, + * Added Python 3 check for accessing Exception.message. + * Added Python 3 check for calling encode/decode with invalid codecs. + * Added Python 3 check for accessing sys.maxint. + * Added Python 3 check for bad import statements. + * Added Python 3 check for accessing deprecated methods on the 'string' module, + various patches. +- Florian Bruhin +- Arianna Yang + + +Contributors +------------ + +We would not be here without folks that contributed patches, pull requests, +issues and their time to pylint. We're incredibly grateful to all of these +contributors: + +- Emile Anclin (Logilab): python 3 support +- Michal Nowikowski : + * wrong-spelling-in-comment + * wrong-spelling-in-docstring + * parallel execution on multiple CPUs +- Julthep Nandakwang +- Bruno Daniel : check_docs extension. +- Sushobhit <31987769+sushobhit27@users.noreply.github.com> (sushobhit27) + * Added new check 'comparison-with-itself'. + * Added new check 'useless-import-alias'. + * Added support of annotations in missing-type-doc and missing-return-type-doc. + * Added new check 'comparison-with-callable'. + * Removed six package dependency. + * Added new check 'chained-comparison'. + * Added new check 'useless-object-inheritance'. +- Brett Cannon : + * Port source code to be Python 2/3 compatible + * Python 3 checker +- Laura Médioni (Logilab, on behalf of the CNES): + * misplaced-comparison-constant + * no-classmethod-decorator + * no-staticmethod-decorator + * too-many-nested-blocks, + * too-many-boolean-expressions + * unneeded-not + * wrong-import-order + * ungrouped-imports, + * wrong-import-position + * redefined-variable-type +- Harutaka Kawamura +- Alexandre Fayolle (Logilab): TkInter gui, documentation, debian support +- Ville Skyttä +- Julien Cristau (Logilab): python 3 support +- Adrien Di Mascio +- Moisés López (Vauxoo): + * Support for deprecated-modules in modules not installed, + * Refactor wrong-import-order to integrate it with `isort` library + * Add check too-complex with mccabe for cyclomatic complexity + * Refactor wrong-import-position to skip try-import and nested cases + * Add consider-merging-isinstance, superfluous-else-return + * Fix consider-using-ternary for 'True and True and True or True' case + * Add bad-docstring-quotes and docstring-first-line-empty + * Add missing-timeout +- Frank Harrison (doublethefish) +- Pierre-Yves David +- David Shea : invalid sequence and slice index +- Gunung P. Wibisono <55311527+gunungpw@users.noreply.github.com> +- Derek Gustafson +- Cezar Elnazli : deprecated-method +- Joseph Young <80432516+jpy-git@users.noreply.github.com> (jpy-git) +- Tim Martin +- Ollie <46904826+ollie-iterators@users.noreply.github.com> +- Tushar Sadhwani (tusharsadhwani) +- Nicolas Chauvat +- orSolocate <38433858+orSolocate@users.noreply.github.com> +- Radu Ciorba : not-context-manager and confusing-with-statement warnings. +- Holger Peters +- Cosmin Poieană : unichr-builtin and improvements to bad-open-mode. +- Steven Myint : duplicate-except. +- Peter Kolbus (Garmin) +- Luigi Bertaco Cristofolini (luigibertaco) +- Glenn Matthews : + * autogenerated documentation for optional extensions, + * bug fixes and enhancements for docparams (née check_docs) extension +- Vlad Temian : redundant-unittest-assert and the JSON reporter. +- Julien Jehannet +- Boris Feld +- Anthony Sottile +- Pedro Algarvio (s0undt3ch) +- Julien Palard +- David Liu (david-yz-liu) +- Dan Goldsmith : support for msg-template in HTML reporter. +- Buck Evan +- Zen Lee <53538590+zenlyj@users.noreply.github.com> +- Robert Hofer +- Mariatta Wijaya + * Added new check `logging-fstring-interpolation` + * Documentation typo fixes +- Jakub Wilk +- Eli Fine (eli88fine): Fixed false positive duplicate code warning for lines with symbols only +- Andrew Haigh (nelfin) +- Émile Crater +- Pavel Roskin +- David Gilman +- へーさん +- Yilei "Dolee" Yang +- Thomas Hisch +- Marianna Polatoglou : minor contribution for wildcard import check +- Manuel Vázquez Acosta +- Luis Escobar (Vauxoo): Add bad-docstring-quotes and docstring-first-line-empty +- Konstantina Saketou <56515303+ksaketou@users.noreply.github.com> +- Konstantin +- Jim Robertson +- Hugo van Kemenade +- Ethan Leba +- Enji Cooper +- Drum Ogilvie +- David Lindquist : logging-format-interpolation warning. +- Daniel Harding +- Anthony Truchet +- Alexander Todorov : + * added new error conditions to 'bad-super-call', + * Added new check for incorrect len(SEQUENCE) usage, + * Added new extension for comparison against empty string constants, + * Added new extension which detects comparing integers to zero, + * Added new useless-return checker, + * Added new try-except-raise checker +- Téo Bouvard +- Mihai Balint +- Mark Bell +- Levi Gruspe +- Jakub Kuczys +- Hornwitser : fix import graph +- Fureigh +- David Douard +- Daniel Balparda (Google): GPyLint maintainer (Google's pylint variant) +- Bastien Vallet (Djailla) +- Aru Sahni : Git ignoring, regex-based ignores +- Andreas Freimuth : fix indentation checking with tabs +- Alexandru Coman +- jpkotta +- Takahide Nojima +- Taewon D. Kim +- Stavros Ntentos <133706+stdedos@users.noreply.github.com> +- Sneaky Pete +- Sergey B Kirpichev +- Sandro Tosi : Debian packaging +- Rene Zhang +- Paul Lichtenberger +- Or Bahari +- Mr. Senko +- Mike Frysinger +- Martin von Gagern (Google): Added 'raising-format-tuple' warning. +- Martin Vielsmaier +- Martin Pool (Google): + * warnings for anomalous backslashes + * symbolic names for messages (like 'unused') + * etc. +- Martin Bašti + * Added new check for shallow copy of os.environ + * Added new check for useless `with threading.Lock():` statement +- Marcus Näslund (naslundx) +- Marco Pernigotti <7657251+mpernigo@users.noreply.github.com> +- Marco Forte +- James Addison <55152140+jayaddison@users.noreply.github.com> +- Ionel Maries Cristian +- Gergely Kalmár +- Damien Baty +- Benjamin Drung : contributing Debian Developer +- Anubhav <35621759+anubh-v@users.noreply.github.com> +- Antonio Quarta +- Andrew J. Simmons +- Alexey Pelykh +- wtracy +- jessebrennan +- chohner +- Tiago Honorato <61059243+tiagohonorato@users.noreply.github.com> +- Steven M. Vascellaro +- Robin Tweedie <70587124+robin-wayve@users.noreply.github.com> +- Roberto Leinardi : PyCharm plugin maintainer +- Ricardo Gemignani +- Pieter Engelbrecht +- Philipp Albrecht (pylbrecht) +- Nicolas Dickreuter +- Nick Bastin +- Nathaniel Manista : suspicious lambda checking +- Maksym Humetskyi (mhumetskyi) + * Fixed ignored empty functions by similarities checker with "ignore-signatures" option enabled + * Ignore function decorators signatures as well by similarities checker with "ignore-signatures" option enabled + * Ignore class methods and nested functions signatures as well by similarities checker with "ignore-signatures" option enabled +- Lucas Cimon +- Kylian +- Konstantin Manna +- Kai Mueller <15907922+kasium@users.noreply.github.com> +- Joshua Cannon +- John Leach +- James Morgensen : ignored-modules option applies to import errors. +- Jaehoon Hwang (jaehoonhwang) +- Huw Jones +- Gideon <87426140+GideonBear@users.noreply.github.com> +- Ganden Schaffner +- Frost Ming +- Federico Bond +- Erik Wright +- Erik Eriksson : Added overlapping-except error check. +- Dan Hemberger <846186+hemberger@users.noreply.github.com> +- Chris Rebert : unidiomatic-typecheck. +- Aurelien Campeas +- Alexander Pervakov +- Alain Leufroy +- Adam Williamson +- xmo-odoo +- tbennett0 +- omarandlorraine <64254276+omarandlorraine@users.noreply.github.com> +- craig-sh +- bernie gray +- Wes Turner (Google): added new check 'inconsistent-quotes' +- Tyler Thieding +- Tobias Hernstig <30827238+thernstig@users.noreply.github.com> +- Thomas Grainger +- Smixi +- Simu Toni +- Sergei Lebedev <185856+superbobry@users.noreply.github.com> +- Scott Worley +- Saugat Pachhai +- Rémi Cardona +- Rogdham +- Raphael Gaschignard +- Ram Rachum (cool-RR) +- Radostin Stoyanov +- Peter Bittner +- Paul Renvoisé +- PHeanEX +- Omega Weapon +- Nikolai Kristiansen +- Nick Pesce +- Nathan Marrow +- Mikhail Fesenko +- Matthew Suozzo +- Matthew Beckers <17108752+mattlbeck@users.noreply.github.com> (mattlbeck) +- Mark Roman Miller : fix inline defs in too-many-statements +- MalanB +- Mads Kiilerich +- Maarten ter Huurne +- Lefteris Karapetsas +- LCD 47 +- Justin Li +- John Kirkham +- Jens H. Nielsen +- Ioana Tagirta : fix bad thread instantiation check +- Ikraduya Edian : Added new checks 'consider-using-generator' and 'use-a-generator'. +- Hugues Bruant +- Harut +- Grygorii Iermolenko +- Grizzly Nyo +- Gabriel R. Sezefredo : Fixed "exception-escape" false positive with generators +- Filipe Brandenburger +- Fantix King (UChicago) +- Eric McDonald <221418+emcd@users.noreply.github.com> +- Elias Dorneles : minor adjust to config defaults and docs +- Derek Harland +- David Pursehouse +- Dave Bunten +- Daniel Mouritzen +- Daniel Miller +- Christoph Blessing <33834216+cblessing24@users.noreply.github.com> +- Chris Murray +- Chris Lamb +- Charles Hebert +- Carli Freudenberg (CarliJoy) + * Fixed issue 5281, added Unicode checker + * Improve non-ascii-name checker +- Bruce Dawson +- Brian Shaginaw : prevent error on exception check for functions +- Benny Mueller +- Ben James +- Ben Green +- Batuhan Taskaya +- Alvaro Frias +- Alexander Kapshuna +- Adam Parkin +- 谭九鼎 <109224573@qq.com> +- Łukasz Sznuk +- y2kbugger +- vinnyrose +- ttenhoeve-aa +- thinwybk +- syutbai +- sur.la.route <17788706+christopherpickering@users.noreply.github.com> +- sdet_liang +- paschich +- oittaa <8972248+oittaa@users.noreply.github.com> +- nyabkun <75878387+nyabkun@users.noreply.github.com> +- moxian +- mar-chi-pan +- lrjball <50599110+lrjball@users.noreply.github.com> +- laike9m +- kriek +- jaydesl <35102795+jaydesl@users.noreply.github.com> +- jab +- glmdgrielson <32415403+glmdgrielson@users.noreply.github.com> +- glegoux +- gaurikholkar +- flyingbot91 +- fly +- fahhem +- fadedDexofan +- epenet <6771947+epenet@users.noreply.github.com> +- danields +- cosven +- cordis-dev +- bluesheeptoken +- anatoly techtonik +- agutole +- Zeckie <49095968+Zeckie@users.noreply.github.com> +- Zeb Nicholls + * Made W9011 compatible with 'of' syntax in return types +- Yuval Langer +- Yury Gribov +- Yuri Bochkarev : Added epytext support to docparams extension. +- Youngsoo Sung +- Yory <39745367+yory8@users.noreply.github.com> +- Yoichi Nakayama +- Yeting Li (yetingli) +- Yannack +- Yann Dirson +- Yang Yang +- Xi Shen +- Will Shanks +- Viorel Știrbu : intern-builtin warning. +- VictorT +- Victor Jiajunsu <16359131+jiajunsu@users.noreply.github.com> +- Trevor Bekolay + * Added --list-msgs-enabled command +- Tomer Chachamu : simplifiable-if-expression +- Tomasz Magulski +- Tom +- Tim Hatch +- Tim Gates +- Thomas Benhamou +- Tanvi Moharir <74228962+tanvimoharir@users.noreply.github.com>: Fix for invalid toml config +- T.Rzepka +- Svetoslav Neykov +- Stéphane Wirtel : nonlocal-without-binding +- Stephen Longofono <8992396+SLongofono@users.noreply.github.com> +- Stanislav Levin +- Sorin Sbarnea +- Slavfox +- Skip Montanaro +- Sigurd Spieckermann <2206639+sisp@users.noreply.github.com> +- Shiv Venkatasubrahmanyam +- Sebastian Müller +- Sasha Bagan +- Sardorbek Imomaliev +- Santiago Castro +- Samuel Freilich (sfreilich) +- Samuel FORESTIER +- Sam Vermeiren <88253337+PaaEl@users.noreply.github.com> +- Ryan McGuire +- Ry4an Brase +- Ruro +- Roman Ivanov +- Robert Schweizer +- Reverb Chu +- Renat Galimov +- Rebecca Turner (9999years) +- Randall Leeds +- Ramon Saraiva +- Ramiro Leal-Cavazos (ramiro050): Fixed bug preventing pylint from working with Emacs tramp +- R. N. West <98110034+rnwst@users.noreply.github.com> +- Qwiddle13 <32040075+Qwiddle13@users.noreply.github.com> +- Quentin Young +- Prajwal Borkar +- Petr Pulc : require whitespace around annotations +- Peter Dawyndt +- Peter Dave Hello +- Peter Aronoff +- Paul Cochrane +- Patrik +- Pascal Corpet +- Pablo Galindo Salgado + * Fix false positive 'Non-iterable value' with async comprehensions. +- Osher De Paz +- Oisín Moran +- Obscuron +- Noam Yorav-Raphael +- Nir Soffer +- Niko Wenselowski +- Nikita Sobolev +- Nick Smith +- Ned Batchelder +- Natalie Serebryakova +- Moody +- Mitchell Young : minor adjustment to docparams +- Mitar +- Mike Fiedler (miketheman) +- Mike Bryant +- Michka Popoff +- Michal Vasilek +- Michael Scott Cuthbert +- Michael Kefeder +- Michael Hudson-Doyle +- Michael Giuffrida +- Melvin Hazeleger <31448155+melvio@users.noreply.github.com> +- Matěj Grabovský +- Matthijs Blom <19817960+MatthijsBlom@users.noreply.github.com> +- Matej Marušák +- Markus Siebenhaar <41283549+siehar@users.noreply.github.com> +- Marco Edward Gorelli : Documented Jupyter integration +- Marcin Kurczewski (rr-) +- Maik Röder +- Lumír 'Frenzy' Balhar +- Ludovic Aubry +- Louis Sautier +- Lorena Buciu <46202743+lorena-b@users.noreply.github.com> +- Logan Miller <14319179+komodo472@users.noreply.github.com> +- Kári Tristan Helgason +- Kurian Benoy <70306694+kurianbenoy-aot@users.noreply.github.com> +- Krzysztof Czapla +- Kraig Brockschmidt +- Kound +- KotlinIsland <65446343+KotlinIsland@users.noreply.github.com> +- Kosarchuk Sergey +- Konrad Weihmann <46938494+priv-kweihmann@users.noreply.github.com> +- Kian Meng, Ang +- Kevin Phillips +- Kevin Jing Qiu +- Kayran Schmidt <59456929+yumasheta@users.noreply.github.com> +- Karthik Nadig +- Jürgen Hermann +- Jérome Perrin +- Josselin Feist +- Jonathan Kotta +- John Paraskevopoulos : add 'differing-param-doc' and 'differing-type-doc' +- John McGehee +- John Gabriele +- John Belmonte +- Joffrey Mander +- Jochen Preusche +- Jeroen Seegers : + * Fixed `toml` dependency issue +- Jeremy Fleischman +- Jason Owen +- Jared Garst +- Jared Deckard +- Janne Rönkkö +- James Sinclair +- James M. Allen +- James Lingard +- James Broadhead +- Jakub Kulík +- Jakob Normark +- Jake Lishman +- Jacques Kvam +- Jace Browning : updated default report format with clickable paths +- JT Olds +- Hayden Richards <62866982+SupImDos@users.noreply.github.com> + * Fixed "no-self-use" for async methods + * Fixed "docparams" extension for async functions and methods +- Harshil <37377066+harshil21@users.noreply.github.com> +- Harry +- Grégoire <96051754+gregoire-mullvad@users.noreply.github.com> +- Grant Welch +- Giuseppe Valente +- Gary Tyler McLeod +- Felix von Drigalski +- Fabrice Douchant +- Fabio Natali +- Fabian Damken +- Eric Froemling +- Emmanuel Chaudron +- Elizabeth Bott <52465744+elizabethbott@users.noreply.github.com> +- Eisuke Kawashima +- Edward K. Ream +- Edgemaster +- Eddie Darling +- Drew Risinger +- Dr. Nick +- Don Jayamanne +- Dmytro Kyrychuk +- DetachHead <57028336+DetachHead@users.noreply.github.com> +- Denis Laxalde +- David Lawson +- David Cain +- Danny Hermes +- Daniele Procida +- Daniela Plascencia +- Daniel Werner +- Daniel R. Neal (danrneal) +- Daniel Draper +- Daniel Dorani (doranid) +- Daniel Brookman <53625739+dbrookman@users.noreply.github.com> +- Dan Garrette +- Damien Nozay +- Cubicpath +- Craig Citro +- Cosmo +- Clément Pit-Claudel +- Christopher Zurcher +- Christian Clauss +- Carl Crowder : don't evaluate the value of arguments for 'dangerous-default-value' +- Carey Metcalfe : demoted `try-except-raise` from error to warning +- Cameron Olechowski +- Calin Don +- Caio Carrara +- C.A.M. Gerlach +- Bruno P. Kinoshita +- Brice Chardin +- Brian C. Lane +- Brandon W Maister +- BioGeek +- Benjamin Graham +- Benedikt Morbach +- Ben Greiner +- Banjamin Freeman +- Athos Ribeiro : Fixed dict-keys-not-iterating false positive for inverse containment checks +- Arun Persaud +- Arthur Lutz +- Antonio Ossa +- Anthony VEREZ +- Anthony Tan +- Anthony Foglia (Google): Added simple string slots check. +- Anentropic +- Andy Young +- Andy Palmer <25123779+ninezerozeronine@users.noreply.github.com> +- Andrzej Klajnert +- Andrew Howe +- Andres Perez Hortal +- Andre Hora +- Alok Singh <8325708+alok@users.noreply.github.com> +- Allan Chandler <95424144+allanc65@users.noreply.github.com> (allanc65) + * Fixed issue 5452, false positive missing-param-doc for multi-line Google-style params +- Alex Jurkiewicz +- Alex Hearn +- Alan Evangelista +- Alan Chan +- Aivar Annamaa +- Aidan Haase <44787650+haasea@users.noreply.github.com> +- Ahirnish Pareek : 'keyword-arg-before-var-arg' check +- Adrian Chirieac +- Aditya Gupta (adityagupta1089) + * Added ignore_signatures to duplicate checker +- Adam Dangoor +- 243f6a88 85a308d3 <33170174+243f6a8885a308d313198a2e037@users.noreply.github.com> + + +Co-Author +--------- +The following persons were credited manually but did not commit themselves +under this name, or we did not manage to find their commits in the history. + +- Agustin Toledo +- Amaury Forgeot d'Arc: check names imported from a module exists in the module +- Anthony Tan +- Axel Muller +- Benjamin Niemann: allow block level enabling/disabling of messages +- Bernard Nauwelaerts +- Bill Wendling +- Brian van den Broek: windows installation documentation +- Craig Henriques +- D. Alphus (Alphadelta14) +- Daniil Kharkov +- Eero Vuojolahti +- Fabio Zadrozny +- Gauthier Sebaux +- James DesLauriers +- manderj +- Mirko Friedenhagen +- Nicholas Smith +- Nuzula H. Yudaka (Nuzhuka) +- Pek Chhan +- Peter Hammond +- Pierre Rouleau +- Richard Goodman: simplifiable-if-expression (with Tomer Chachamu) +- Sebastian Ulrich +- Takashi Hirashima +- Thomas Snowden: fix missing-docstring for inner functions +- Wolfgang Grafen +- Yannick Brehon diff --git a/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/INSTALLER b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/LICENSE b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/LICENSE new file mode 120000 index 00000000..d25752b4 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/LICENSE @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/f9/7b/14/080de8b8490d60eb3d620ebc419943e0779466d1dd0d5d6f68fe195dcd \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/METADATA b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/METADATA new file mode 100644 index 00000000..9e8cb4be --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/METADATA @@ -0,0 +1,275 @@ +Metadata-Version: 2.1 +Name: pylint +Version: 2.17.0 +Summary: python code static checker +Author-email: Python Code Quality Authority +License: GPL-2.0-or-later +Project-URL: Docs: User Guide, https://pylint.readthedocs.io/en/latest/ +Project-URL: Source Code, https://github.com/PyCQA/pylint +Project-URL: homepage, https://github.com/PyCQA/pylint +Project-URL: What's New, https://pylint.readthedocs.io/en/latest/whatsnew/2/ +Project-URL: Bug Tracker, https://github.com/PyCQA/pylint/issues +Project-URL: Discord Server, https://discord.com/invite/Egy6P8AMB5 +Project-URL: Docs: Contributor Guide, https://pylint.readthedocs.io/en/latest/development_guide/contributor_guide/index.html +Keywords: static code analysis,linter,python,lint +Classifier: Development Status :: 6 - Mature +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2) +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Debuggers +Classifier: Topic :: Software Development :: Quality Assurance +Classifier: Topic :: Software Development :: Testing +Requires-Python: >=3.7.2 +Description-Content-Type: text/x-rst +License-File: LICENSE +License-File: CONTRIBUTORS.txt +Requires-Dist: platformdirs (>=2.2.0) +Requires-Dist: astroid (<=2.17.0-dev0,>=2.15.0) +Requires-Dist: isort (<6,>=4.2.5) +Requires-Dist: mccabe (<0.8,>=0.6) +Requires-Dist: tomlkit (>=0.10.1) +Requires-Dist: typing-extensions (>=3.10.0) ; python_version < "3.10" +Requires-Dist: dill (>=0.2) ; python_version < "3.11" +Requires-Dist: tomli (>=1.1.0) ; python_version < "3.11" +Requires-Dist: dill (>=0.3.6) ; python_version >= "3.11" +Requires-Dist: colorama (>=0.4.5) ; sys_platform == "win32" +Provides-Extra: spelling +Requires-Dist: pyenchant (~=3.2) ; extra == 'spelling' +Provides-Extra: testutils +Requires-Dist: gitpython (>3) ; extra == 'testutils' + +`Pylint`_ +========= + +.. _`Pylint`: https://pylint.readthedocs.io/ + +.. This is used inside the doc to recover the start of the introduction + +.. image:: https://github.com/PyCQA/pylint/actions/workflows/tests.yaml/badge.svg?branch=main + :target: https://github.com/PyCQA/pylint/actions + +.. image:: https://codecov.io/gh/PyCQA/pylint/branch/main/graph/badge.svg?token=ZETEzayrfk + :target: https://codecov.io/gh/PyCQA/pylint + +.. image:: https://img.shields.io/pypi/v/pylint.svg + :alt: Pypi Package version + :target: https://pypi.python.org/pypi/pylint + +.. image:: https://readthedocs.org/projects/pylint/badge/?version=latest + :target: https://pylint.readthedocs.io/en/latest/?badge=latest + :alt: Documentation Status + +.. image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/ambv/black + +.. image:: https://img.shields.io/badge/linting-pylint-yellowgreen + :target: https://github.com/PyCQA/pylint + +.. image:: https://results.pre-commit.ci/badge/github/PyCQA/pylint/main.svg + :target: https://results.pre-commit.ci/latest/github/PyCQA/pylint/main + :alt: pre-commit.ci status + +.. image:: https://bestpractices.coreinfrastructure.org/projects/6328/badge + :target: https://bestpractices.coreinfrastructure.org/projects/6328 + :alt: CII Best Practices + +.. image:: https://api.securityscorecards.dev/projects/github.com/PyCQA/pylint/badge + :target: https://api.securityscorecards.dev/projects/github.com/PyCQA/pylint + :alt: OpenSSF Scorecard + +.. image:: https://img.shields.io/discord/825463413634891776.svg + :target: https://discord.gg/qYxpadCgkx + :alt: Discord + +What is Pylint? +--------------- + +Pylint is a `static code analyser`_ for Python 2 or 3. The latest version supports Python +3.7.2 and above. + +.. _`static code analyser`: https://en.wikipedia.org/wiki/Static_code_analysis + +Pylint analyses your code without actually running it. It checks for errors, enforces a +coding standard, looks for `code smells`_, and can make suggestions about how the code +could be refactored. + +.. _`code smells`: https://martinfowler.com/bliki/CodeSmell.html + +Install +------- + +.. This is used inside the doc to recover the start of the short text for installation + +For command line use, pylint is installed with:: + + pip install pylint + +Or if you want to also check spelling with ``enchant`` (you might need to +`install the enchant C library `_): + +.. code-block:: sh + + pip install pylint[spelling] + +It can also be integrated in most editors or IDEs. More information can be found +`in the documentation`_. + +.. _in the documentation: https://pylint.readthedocs.io/en/latest/user_guide/installation/index.html + +.. This is used inside the doc to recover the end of the short text for installation + +What differentiate Pylint? +-------------------------- + +Pylint is not trusting your typing and is inferring the actual value of nodes (for a +start because there was no typing when pylint started off) using its internal code +representation (astroid). If your code is ``import logging as argparse``, Pylint +can check and know that ``argparse.error(...)`` is in fact a logging call and not an +argparse call. This makes pylint slower, but it also let pylint find more issues if +your code is not fully typed. + + [inference] is the killer feature that keeps us using [pylint] in our project despite how painfully slow it is. + - `Realist pylint user`_, 2022 + +.. _`Realist pylint user`: https://github.com/charliermarsh/ruff/issues/970#issuecomment-1381067064 + +pylint, not afraid of being a little slower than it already is, is also a lot more thorough than other linters. +There is more checks, some opinionated one that are deactivated by default, but can be enabled using configuration. + +How to use pylint +----------------- + +Pylint isn't smarter than you: it may warn you about things that you have +conscientiously done or check for some things that you don't care about. +During adoption, especially in a legacy project where pylint was never enforced, +it's best to start with the ``--errors-only`` flag, then disable +convention and refactor message with ``--disable=C,R`` and progressively +re-evaluate and re-enable messages as your priorities evolve. + +Pylint is highly configurable and permits to write plugins in order to add your +own checks (for example, for internal libraries or an internal rule). Pylint also has an +ecosystem of existing plugins for popular frameworks and third party libraries. + +.. note:: + + Pylint supports the Python standard library out of the box. Third-party + libraries are not always supported, so a plugin might be needed. A good place + to start is ``PyPI`` which often returns a plugin by searching for + ``pylint ``. `pylint-pydantic`_, `pylint-django`_ and + `pylint-sonarjson`_ are examples of such plugins. More information about plugins + and how to load them can be found at `plugins`_. + +.. _`plugins`: https://pylint.readthedocs.io/en/latest/development_guide/how_tos/plugins.html#plugins +.. _`pylint-pydantic`: https://pypi.org/project/pylint-pydantic +.. _`pylint-django`: https://github.com/PyCQA/pylint-django +.. _`pylint-sonarjson`: https://github.com/omegacen/pylint-sonarjson + +Advised linters alongside pylint +-------------------------------- + +Projects that you might want to use alongside pylint include ruff_ (**really** fast, +with builtin auto-fix, and a growing number of checks taken from popular +linters but implemented in ``rust``) or flake8_ (faster and simpler checks with very few false positives), +mypy_, pyright_ or pyre_ (typing checks), bandit_ (security oriented checks), black_ and +isort_ (auto-formatting), autoflake_ (automated removal of unused imports or variables), +pyupgrade_ (automated upgrade to newer python syntax) and pydocstringformatter_ (automated pep257). + +.. _ruff: https://github.com/charliermarsh/ruff +.. _flake8: https://github.com/PyCQA/flake8 +.. _bandit: https://github.com/PyCQA/bandit +.. _mypy: https://github.com/python/mypy +.. _pyright: https://github.com/microsoft/pyright +.. _pyre: https://github.com/facebook/pyre-check +.. _black: https://github.com/psf/black +.. _autoflake: https://github.com/myint/autoflake +.. _pyupgrade: https://github.com/asottile/pyupgrade +.. _pydocstringformatter: https://github.com/DanielNoord/pydocstringformatter +.. _isort: https://pycqa.github.io/isort/ + +Additional tools included in pylint +----------------------------------- + +Pylint ships with two additional tools: + +- pyreverse_ (standalone tool that generates package and class diagrams.) +- symilar_ (duplicate code finder that is also integrated in pylint) + +.. _pyreverse: https://pylint.readthedocs.io/en/latest/pyreverse.html +.. _symilar: https://pylint.readthedocs.io/en/latest/symilar.html + + +.. This is used inside the doc to recover the end of the introduction + +Contributing +------------ + +.. This is used inside the doc to recover the start of the short text for contribution + +We welcome all forms of contributions such as updates for documentation, new code, checking issues for duplicates or telling us +that we can close them, confirming that issues still exist, `creating issues because +you found a bug or want a feature`_, etc. Everything is much appreciated! + +Please follow the `code of conduct`_ and check `the Contributor Guides`_ if you want to +make a code contribution. + +.. _creating issues because you found a bug or want a feature: https://pylint.readthedocs.io/en/latest/contact.html#bug-reports-feedback +.. _code of conduct: https://github.com/PyCQA/pylint/blob/main/CODE_OF_CONDUCT.md +.. _the Contributor Guides: https://pylint.readthedocs.io/en/latest/development_guide/contribute.html + +.. This is used inside the doc to recover the end of the short text for contribution + +Show your usage +----------------- + +You can place this badge in your README to let others know your project uses pylint. + + .. image:: https://img.shields.io/badge/linting-pylint-yellowgreen + :target: https://github.com/PyCQA/pylint + +Learn how to add a badge to your documentation in the `the badge documentation`_. + +.. _the badge documentation: https://pylint.readthedocs.io/en/latest/user_guide/installation/badge.html + +License +------- + +pylint is, with a few exceptions listed below, `GPLv2 `_. + +The icon files are licensed under the `CC BY-SA 4.0 `_ license: + +- `doc/logo.png `_ +- `doc/logo.svg `_ + +Support +------- + +Please check `the contact information`_. + +.. _`the contact information`: https://pylint.readthedocs.io/en/latest/contact.html + +.. |tideliftlogo| image:: https://raw.githubusercontent.com/PyCQA/pylint/main/doc/media/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White.png + :width: 200 + :alt: Tidelift + +.. list-table:: + :widths: 10 100 + + * - |tideliftlogo| + - Professional support for pylint is available as part of the `Tidelift + Subscription`_. Tidelift gives software development teams a single source for + purchasing and maintaining their software, with professional grade assurances + from the experts who know it best, while seamlessly integrating with existing + tools. + +.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-pylint?utm_source=pypi-pylint&utm_medium=referral&utm_campaign=readme diff --git a/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/RECORD b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/RECORD new file mode 100644 index 00000000..33f142ca --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/RECORD @@ -0,0 +1,383 @@ +../../../bin/epylint,sha256=WXnmMsLkfwTeNSclIhurpKoJhaw6akFfawqRlj9No6M,223 +../../../bin/pylint,sha256=_2VAon42GsU40B4qYbwk5Sn8LDdXcg8YUJ5IEDsxLqs,221 +../../../bin/pylint-config,sha256=r7-sx-S5CBRfvKrxy69SGmAu9natpHvKCas2BU2Agt4,237 +../../../bin/pyreverse,sha256=wLkWJauT7rmDxKjaABxEFj87a6CjnSq9zcjLxleKHt8,227 +../../../bin/symilar,sha256=I83sfwBpd5jmteH4ZTWcuo5ZDM8sle4-sWyH7K3Goxg,223 +pylint-2.17.0.dist-info/CONTRIBUTORS.txt,sha256=WIOlW055YsXTgxGgRbc_GyTHpQQK2WFi5sseXGOuwzc,28765 +pylint-2.17.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pylint-2.17.0.dist-info/LICENSE,sha256=-XsUCA3ouEkNYOs9Yg68QZlD4HeUZtHdDV1vaP4ZXc0,17984 +pylint-2.17.0.dist-info/METADATA,sha256=mbADTHl0AZGN-jg2sY5IVR_auKqW3bA2Dgp2nmn2uss,12010 +pylint-2.17.0.dist-info/RECORD,, +pylint-2.17.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pylint-2.17.0.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +pylint-2.17.0.dist-info/entry_points.txt,sha256=R_YZVGBH-O2g1wyUuQ_VLkFgVfx9p_uQC5oMeQd7cu4,178 +pylint-2.17.0.dist-info/top_level.txt,sha256=j6Z9i__pIuaiCka6Ul9YIy6yI5aw5QbCtldLvZlMksE,7 +pylint/__init__.py,sha256=muhhaAzltLG6voQgcupp2tw3s1Lfh92H0GL2LePJ0ms,3562 +pylint/__main__.py,sha256=m1y5m7Ky8HtyNnE8ftGSnRSTDgv5suq8P-B4V_KD3JY,305 +pylint/__pkginfo__.py,sha256=VB7aJv4aG5O4J185_fSncTt9P7EK-Jx-yhr_QKSPAOU,1340 +pylint/__pycache__/__init__.cpython-310.pyc,, +pylint/__pycache__/__main__.cpython-310.pyc,, +pylint/__pycache__/__pkginfo__.cpython-310.pyc,, +pylint/__pycache__/constants.cpython-310.pyc,, +pylint/__pycache__/epylint.cpython-310.pyc,, +pylint/__pycache__/exceptions.cpython-310.pyc,, +pylint/__pycache__/graph.cpython-310.pyc,, +pylint/__pycache__/interfaces.cpython-310.pyc,, +pylint/__pycache__/typing.cpython-310.pyc,, +pylint/checkers/__init__.py,sha256=kmnHBr0XGOqcFpATa-jB7S6LSyywhaOHmO_lq361zYY,4367 +pylint/checkers/__pycache__/__init__.cpython-310.pyc,, +pylint/checkers/__pycache__/async.cpython-310.pyc,, +pylint/checkers/__pycache__/bad_chained_comparison.cpython-310.pyc,, +pylint/checkers/__pycache__/base_checker.cpython-310.pyc,, +pylint/checkers/__pycache__/deprecated.cpython-310.pyc,, +pylint/checkers/__pycache__/design_analysis.cpython-310.pyc,, +pylint/checkers/__pycache__/dunder_methods.cpython-310.pyc,, +pylint/checkers/__pycache__/ellipsis_checker.cpython-310.pyc,, +pylint/checkers/__pycache__/exceptions.cpython-310.pyc,, +pylint/checkers/__pycache__/format.cpython-310.pyc,, +pylint/checkers/__pycache__/imports.cpython-310.pyc,, +pylint/checkers/__pycache__/lambda_expressions.cpython-310.pyc,, +pylint/checkers/__pycache__/logging.cpython-310.pyc,, +pylint/checkers/__pycache__/mapreduce_checker.cpython-310.pyc,, +pylint/checkers/__pycache__/method_args.cpython-310.pyc,, +pylint/checkers/__pycache__/misc.cpython-310.pyc,, +pylint/checkers/__pycache__/modified_iterating_checker.cpython-310.pyc,, +pylint/checkers/__pycache__/nested_min_max.cpython-310.pyc,, +pylint/checkers/__pycache__/newstyle.cpython-310.pyc,, +pylint/checkers/__pycache__/non_ascii_names.cpython-310.pyc,, +pylint/checkers/__pycache__/raw_metrics.cpython-310.pyc,, +pylint/checkers/__pycache__/similar.cpython-310.pyc,, +pylint/checkers/__pycache__/spelling.cpython-310.pyc,, +pylint/checkers/__pycache__/stdlib.cpython-310.pyc,, +pylint/checkers/__pycache__/strings.cpython-310.pyc,, +pylint/checkers/__pycache__/threading_checker.cpython-310.pyc,, +pylint/checkers/__pycache__/typecheck.cpython-310.pyc,, +pylint/checkers/__pycache__/unicode.cpython-310.pyc,, +pylint/checkers/__pycache__/unsupported_version.cpython-310.pyc,, +pylint/checkers/__pycache__/utils.cpython-310.pyc,, +pylint/checkers/__pycache__/variables.cpython-310.pyc,, +pylint/checkers/async.py,sha256=lq-KntL033fmOAPi61taHmre1Lzt9YB5u8COp8i8dDQ,3923 +pylint/checkers/bad_chained_comparison.py,sha256=iPi29sCYJn6HC69qWmUI6UfuKclTyENhkTYrXHL3JAs,2228 +pylint/checkers/base/__init__.py,sha256=ok6VJ5ZgWkMFDKvKnjV4VRxWwkLcce2OgJjbacm1-DU,1568 +pylint/checkers/base/__pycache__/__init__.cpython-310.pyc,, +pylint/checkers/base/__pycache__/basic_checker.cpython-310.pyc,, +pylint/checkers/base/__pycache__/basic_error_checker.cpython-310.pyc,, +pylint/checkers/base/__pycache__/comparison_checker.cpython-310.pyc,, +pylint/checkers/base/__pycache__/docstring_checker.cpython-310.pyc,, +pylint/checkers/base/__pycache__/pass_checker.cpython-310.pyc,, +pylint/checkers/base/basic_checker.py,sha256=V2cy5rCLs12-fdOK5-vPgi9XE-wItr7oQ-e7Z1g1QNE,40291 +pylint/checkers/base/basic_error_checker.py,sha256=BeEjhDb8s2r-PUg4ZOk7m2R2tbPVjbmBHmvUWmuJYtE,22514 +pylint/checkers/base/comparison_checker.py,sha256=aCVA4qONEvKfRdXTFhZAtwrblw-Bg7X3UzA2SGJkYJk,13864 +pylint/checkers/base/docstring_checker.py,sha256=PEw0Vt-dVEtMzVGpvEqVq2K_ldafLiHXK8sVbGiQBrc,7915 +pylint/checkers/base/name_checker/__init__.py,sha256=AKe0lfMl3OlPl7JkIJw3FATqC2XoXJ_k6hegPB13CcY,689 +pylint/checkers/base/name_checker/__pycache__/__init__.cpython-310.pyc,, +pylint/checkers/base/name_checker/__pycache__/checker.cpython-310.pyc,, +pylint/checkers/base/name_checker/__pycache__/naming_style.cpython-310.pyc,, +pylint/checkers/base/name_checker/checker.py,sha256=xrp4KA9LGnrn_KiP-pjSdDz4AspPZARBo5bKhB5c5TA,26715 +pylint/checkers/base/name_checker/naming_style.py,sha256=RVz52JWRnZ1zmXuQ1CQE0p7BkWDszrazfE3zxDcO204,5881 +pylint/checkers/base/pass_checker.py,sha256=DETwu3tP8Dgq9ME6sYMPR3jOtB6q6KIFDtJu3qSqpBI,992 +pylint/checkers/base_checker.py,sha256=u5AA6oW4T59jD057I4w6MTdb_42UM8XKzKyd33ANv24,10931 +pylint/checkers/classes/__init__.py,sha256=mw61Ow15QOTyjJoZT9QuBmFdzPfWSlfgQyaWTsCHD4w,644 +pylint/checkers/classes/__pycache__/__init__.cpython-310.pyc,, +pylint/checkers/classes/__pycache__/class_checker.cpython-310.pyc,, +pylint/checkers/classes/__pycache__/special_methods_checker.cpython-310.pyc,, +pylint/checkers/classes/class_checker.py,sha256=4a3VjLvP3nnTS5qFynIeu5vlM1QNKoCzcFirwzlFq4c,90008 +pylint/checkers/classes/special_methods_checker.py,sha256=xKA4edfphI-8anLWB8pOgyJDsDnC9Cnds99hArRHlZs,15115 +pylint/checkers/deprecated.py,sha256=ejXPFB0dGqNIRhQhrYQtedYdt7nNRuPlK33TmS-AWLM,9661 +pylint/checkers/design_analysis.py,sha256=CvG3MS1pqbOGkkXEH081Z5Ziit5Ho5uc52Y15CPSfQc,22139 +pylint/checkers/dunder_methods.py,sha256=Tv1nJJVXhIKpZGPRpBaAj7c8ZjbtVyyaZSomsi-lvxo,3513 +pylint/checkers/ellipsis_checker.py,sha256=WgyzvN4jnGMnxw6C4HH1vr1sMRMDIHGvH_HHC4TRXrc,2014 +pylint/checkers/exceptions.py,sha256=CrM7UfJThsL11U9lj627MSmMi26MITiGqKdNSDgt5Dw,26673 +pylint/checkers/format.py,sha256=bTqUNP4u2JVMZ_cLNgnqzp4W5Sy9IaCi-cV47sVsPL4,27558 +pylint/checkers/imports.py,sha256=3saM-SZUBty8RKu39gkslWkCANWFzfBaswL2sASpmKw,41935 +pylint/checkers/lambda_expressions.py,sha256=F0RsaEnY5Xuc-XPtw_aGP5-VD3m7bgYAdPo6LIyjiOA,3462 +pylint/checkers/logging.py,sha256=Qz25dR1vng-BLfg7S_lxlyRJwG607IBgViAd-2s-Jks,15595 +pylint/checkers/mapreduce_checker.py,sha256=VXx73lb2rvxK8Sc8o1U-wdV99nU1YTksRWuw63IBDmE,1111 +pylint/checkers/method_args.py,sha256=ZtMy4zgw5-abJWcFechN7unR48QsM2rIYQUVA6TgBco,4734 +pylint/checkers/misc.py,sha256=5JJZLaUQWLKionvNkP24-KEd7juyD42GL65irtUuHyA,4987 +pylint/checkers/modified_iterating_checker.py,sha256=e4cMJznf4PoN5xy6IaWoL-JvPHRtwJkgtmYzYRsnyIc,7859 +pylint/checkers/nested_min_max.py,sha256=8Cg4hB0p5lMaosSERKbNlEdU6A8K8hNbTijbJ0SsyNU,3720 +pylint/checkers/newstyle.py,sha256=YMQ8JR6DEo52uWXvGQcY5yZK0sJBmYzk4GO6eARhI50,4567 +pylint/checkers/non_ascii_names.py,sha256=TlsMUsG-sLfmeEslU7J5L02exiWXnQEKexF5w_G36tQ,7146 +pylint/checkers/raw_metrics.py,sha256=jbFMkeIm7ZfDD2Cq1-Ccn8wJPR11fdIddkr67RLpbkQ,3900 +pylint/checkers/refactoring/__init__.py,sha256=eEApx4kmgKO13iOdK3FCAqEcx8sy28qOi9MMhfguriY,1114 +pylint/checkers/refactoring/__pycache__/__init__.cpython-310.pyc,, +pylint/checkers/refactoring/__pycache__/implicit_booleaness_checker.cpython-310.pyc,, +pylint/checkers/refactoring/__pycache__/not_checker.cpython-310.pyc,, +pylint/checkers/refactoring/__pycache__/recommendation_checker.cpython-310.pyc,, +pylint/checkers/refactoring/__pycache__/refactoring_checker.cpython-310.pyc,, +pylint/checkers/refactoring/implicit_booleaness_checker.py,sha256=ic1aEjQj3kPI2TJiOxC2XlMl5NBZqXSnYguF9iqtxNY,9399 +pylint/checkers/refactoring/not_checker.py,sha256=KxH7cB5VOsTvEiLQyfGBrLshjnavF4fcAH2rMyC3qD8,2818 +pylint/checkers/refactoring/recommendation_checker.py,sha256=_FnELtglopNgDAaPIybaazwXnogysHLO5oOz4mIboO8,18123 +pylint/checkers/refactoring/refactoring_checker.py,sha256=7eC5FL_N101z2UE_0l5JlGJyUd3OKA2MAGXuBomkZcA,97480 +pylint/checkers/similar.py,sha256=Itd8T7WI5yAtMfwhKC4U2hNvkZr2d7jszSz4KUOQ7vI,34091 +pylint/checkers/spelling.py,sha256=uBdRaESNN2xBmsix4FtS1AaeYqRjdweufLwGBzCzzjY,16556 +pylint/checkers/stdlib.py,sha256=psPpdMTXgdiIEiG-CXu6pPBkLf8MM7NXORJT6FO4o94,32028 +pylint/checkers/strings.py,sha256=ACe0tdWrGYCN-a3_ciTdIYRoQAT816DjT-12pcAHCPY,41242 +pylint/checkers/threading_checker.py,sha256=F0sg6RvpBEqw7ixqb0dKg4YmHY9YChAnRRLTsDlB3ns,1941 +pylint/checkers/typecheck.py,sha256=CeDx-z4RpHVVbSMcS6Wc0qJND03f2h8Awve_tyOugn8,88551 +pylint/checkers/unicode.py,sha256=dIwn8eLiaVAhcFr7CCww9FPMBwRbuxaYyHpHthW74NA,18480 +pylint/checkers/unsupported_version.py,sha256=XrvHbJdSDJydVRPX4_es1Yez4nbiXTyBw72FzebDcgg,2999 +pylint/checkers/utils.py,sha256=JaykqkifusF-V4-S5GFDmC6KN1ADG1nvlpgKAN1P-j8,77883 +pylint/checkers/variables.py,sha256=atnAaTLXQmU-v9YksiKW_-DHkrayKgFt-Co2_WZ8LoE,128712 +pylint/config/__init__.py,sha256=3hLtVfZSfHZP4UZMHOJBF9qCiQJPjHD3PJXQyrpHxrs,2493 +pylint/config/__pycache__/__init__.cpython-310.pyc,, +pylint/config/__pycache__/argument.cpython-310.pyc,, +pylint/config/__pycache__/arguments_manager.cpython-310.pyc,, +pylint/config/__pycache__/arguments_provider.cpython-310.pyc,, +pylint/config/__pycache__/callback_actions.cpython-310.pyc,, +pylint/config/__pycache__/config_file_parser.cpython-310.pyc,, +pylint/config/__pycache__/config_initialization.cpython-310.pyc,, +pylint/config/__pycache__/configuration_mixin.cpython-310.pyc,, +pylint/config/__pycache__/deprecation_actions.cpython-310.pyc,, +pylint/config/__pycache__/environment_variable.cpython-310.pyc,, +pylint/config/__pycache__/exceptions.cpython-310.pyc,, +pylint/config/__pycache__/find_default_config_files.cpython-310.pyc,, +pylint/config/__pycache__/help_formatter.cpython-310.pyc,, +pylint/config/__pycache__/option.cpython-310.pyc,, +pylint/config/__pycache__/option_manager_mixin.cpython-310.pyc,, +pylint/config/__pycache__/option_parser.cpython-310.pyc,, +pylint/config/__pycache__/options_provider_mixin.cpython-310.pyc,, +pylint/config/__pycache__/utils.cpython-310.pyc,, +pylint/config/_pylint_config/__init__.py,sha256=1XJbigFjUmI27j9zn9gZFYGaDc8Mo7O-AsMGz2qOrwY,561 +pylint/config/_pylint_config/__pycache__/__init__.cpython-310.pyc,, +pylint/config/_pylint_config/__pycache__/generate_command.cpython-310.pyc,, +pylint/config/_pylint_config/__pycache__/help_message.cpython-310.pyc,, +pylint/config/_pylint_config/__pycache__/main.cpython-310.pyc,, +pylint/config/_pylint_config/__pycache__/setup.cpython-310.pyc,, +pylint/config/_pylint_config/__pycache__/utils.cpython-310.pyc,, +pylint/config/_pylint_config/generate_command.py,sha256=hyXFQyeXNXbRE8XcOZaLkcSD8h34Q7niL0MLVIpsySw,1846 +pylint/config/_pylint_config/help_message.py,sha256=6pT8R4iJDOB63G_0_kOhXJDGjC6ON-xsxkWUAN3ThK4,1997 +pylint/config/_pylint_config/main.py,sha256=sjO5wFWxXvnBc0vWHPOfIECzEo2df1IlghFPO2HFhlc,845 +pylint/config/_pylint_config/setup.py,sha256=pxKjhOen7p_Pn4rBaWisWfoUsc-ieK4ymsrDySUNxwQ,1603 +pylint/config/_pylint_config/utils.py,sha256=7SOGhvGZtjDpWEleQpWRCDEBMFQhiggAQ1Y36qdSvN8,3754 +pylint/config/argument.py,sha256=A84YRzyj5x8Atn8QbuWcmzAAvPkRtjq_x6k94i6JOrY,14903 +pylint/config/arguments_manager.py,sha256=kv9MgniJhAD6mtssSoka27sAeqaKlFGW4KnJ3fgmrUs,32618 +pylint/config/arguments_provider.py,sha256=yS18CQkPYE2JUuq-DoUIi1yV1u9A4LQsOsoZ4lO5h5U,8361 +pylint/config/callback_actions.py,sha256=EjyJBc-0kA3Qt1SoL7_8uCQfuUvEGIkMz3xSn2KqN_Q,14157 +pylint/config/config_file_parser.py,sha256=jL7oLbErca91oPmRQ9bsKZ__xYC4jwH-YwxJjCK_j6o,4639 +pylint/config/config_initialization.py,sha256=OpB5FFBXMpL1tKKWhcd4qJviCzBL8Hv_JOHmATNE4jc,5079 +pylint/config/configuration_mixin.py,sha256=JorNEM42b1kX07EYLG-HDPEFgk1wS6JTA4KTON9t-XY,1586 +pylint/config/deprecation_actions.py,sha256=XOZwcg_AxztjGv-5rERmEINuuzq85FFB2xEeIr9Dk2I,2947 +pylint/config/environment_variable.py,sha256=at9U9TSIQdf0yJpGaXx7sW9wvCF8wMQy_VmbbkAzOoQ,405 +pylint/config/exceptions.py,sha256=baU1rnYj_bAV1IF-AVF-F8S-aOgIuCdg2PxUyCPgoWo,816 +pylint/config/find_default_config_files.py,sha256=RTlwj9W6Acutyw2tuzQZ8TveneWJazhlf06UrcbhZaw,4155 +pylint/config/help_formatter.py,sha256=kDCwCvdC1TlMNoH92Srf8T9naagP6SkRPg_oin7VH_I,2688 +pylint/config/option.py,sha256=kttkR9YlqRc3mQq4lWB8PWlAzd0Fl4sKP2M0M-1FW3w,8515 +pylint/config/option_manager_mixin.py,sha256=bkppBYK7tfrv7yniMa0fpWG7h_zCFeQIY2sCamg9MzA,14829 +pylint/config/option_parser.py,sha256=ArpaynRxJjz5quey67Txm0n1_5-akTHEtBQ6ZhicLO0,2069 +pylint/config/options_provider_mixin.py,sha256=C5w5uPInk4RDWGBC-Y2qspoXa2LJdmSMmE4ddcm5ctM,4619 +pylint/config/utils.py,sha256=G36JSPYvQ0OZar8Me2w4EgTEIbhCjUECzLHM3198wAk,9465 +pylint/constants.py,sha256=ZgQd39duCbhpdrQyvGCoNJGsvole9ynRItiJ6AMTycE,10130 +pylint/epylint.py,sha256=E0UDINwDQRXWfs7sCDMmWYSWvk4xBp9faBhERmGERBc,7348 +pylint/exceptions.py,sha256=lWw5Tj0YdCnKWu9Bk1Ukd5f1qonOWXxayCYiO7v0GX0,1716 +pylint/extensions/__init__.py,sha256=1uuAFHCmgaWI3SV76dXPgkjrkPTWv0GPojiC5vtYTug,575 +pylint/extensions/__pycache__/__init__.cpython-310.pyc,, +pylint/extensions/__pycache__/_check_docs_utils.cpython-310.pyc,, +pylint/extensions/__pycache__/bad_builtin.cpython-310.pyc,, +pylint/extensions/__pycache__/broad_try_clause.cpython-310.pyc,, +pylint/extensions/__pycache__/check_elif.cpython-310.pyc,, +pylint/extensions/__pycache__/code_style.cpython-310.pyc,, +pylint/extensions/__pycache__/comparetozero.cpython-310.pyc,, +pylint/extensions/__pycache__/comparison_placement.cpython-310.pyc,, +pylint/extensions/__pycache__/confusing_elif.cpython-310.pyc,, +pylint/extensions/__pycache__/consider_refactoring_into_while_condition.cpython-310.pyc,, +pylint/extensions/__pycache__/consider_ternary_expression.cpython-310.pyc,, +pylint/extensions/__pycache__/dict_init_mutate.cpython-310.pyc,, +pylint/extensions/__pycache__/docparams.cpython-310.pyc,, +pylint/extensions/__pycache__/docstyle.cpython-310.pyc,, +pylint/extensions/__pycache__/dunder.cpython-310.pyc,, +pylint/extensions/__pycache__/empty_comment.cpython-310.pyc,, +pylint/extensions/__pycache__/emptystring.cpython-310.pyc,, +pylint/extensions/__pycache__/eq_without_hash.cpython-310.pyc,, +pylint/extensions/__pycache__/for_any_all.cpython-310.pyc,, +pylint/extensions/__pycache__/magic_value.cpython-310.pyc,, +pylint/extensions/__pycache__/mccabe.cpython-310.pyc,, +pylint/extensions/__pycache__/no_self_use.cpython-310.pyc,, +pylint/extensions/__pycache__/overlapping_exceptions.cpython-310.pyc,, +pylint/extensions/__pycache__/private_import.cpython-310.pyc,, +pylint/extensions/__pycache__/redefined_loop_name.cpython-310.pyc,, +pylint/extensions/__pycache__/redefined_variable_type.cpython-310.pyc,, +pylint/extensions/__pycache__/set_membership.cpython-310.pyc,, +pylint/extensions/__pycache__/typing.cpython-310.pyc,, +pylint/extensions/__pycache__/while_used.cpython-310.pyc,, +pylint/extensions/_check_docs_utils.py,sha256=gRYf-CdgDXrkZVWuBSnsTJPhaxuh8dLEHXxkOBNPnb0,26360 +pylint/extensions/bad_builtin.py,sha256=0oQMXkDwzhmrdES8xCISq8G5KHliyWYdqszAqef7On4,2269 +pylint/extensions/broad_try_clause.py,sha256=zgBEPWz_X4M_v9R10o_1XBBu3L0-TluxZ6eohDy28uA,2302 +pylint/extensions/check_elif.py,sha256=A8SPFAvsKcnvjkQPldDWFOK8-k2S55i67_U5hR2SiRc,2139 +pylint/extensions/code_style.py,sha256=gkfnO3ZkHu68Pd2_eDKtX1vxkvkvosfF6Wj1izdT0T8,12807 +pylint/extensions/comparetozero.py,sha256=HL5t7tWEoshz5VgWkfKsWY4kGRZoU9ER1kwLgd8e6f8,3168 +pylint/extensions/comparison_placement.py,sha256=S56QaqDsD_T5hch_f5FBVqY046IYBHUB1GBwZ48OSUQ,2352 +pylint/extensions/confusing_elif.py,sha256=Gnu2Et7aBoEeaYpDR6TWzZ5406cYs0yV-Fa-2BOuxug,2038 +pylint/extensions/consider_refactoring_into_while_condition.py,sha256=paSJWRAGuXJJnNa-dUbW8t6r9qnuCvondZ86nMAAZlM,3312 +pylint/extensions/consider_ternary_expression.py,sha256=RmERqrmtSY6sSImO2vP0wKPSMN_GRZHYvR-JprJzhS4,1698 +pylint/extensions/dict_init_mutate.py,sha256=cssSm-KCU3SgZgPsgvKSFyZ5xwj1kDu8yqP4ENDoLUE,2111 +pylint/extensions/docparams.py,sha256=6toBQQFf7xMsdQLtAwnX2QltRBz3clb0_YNz55srU40,25905 +pylint/extensions/docstyle.py,sha256=hAjw2yZquc-_bOPfU-OiQXdCEH-hLuIOB5AIiNOi4Vw,2943 +pylint/extensions/dunder.py,sha256=BWoz7EknGY2n3XP4gOr2n7EVHQoB12HEi-qXrdNO22g,2386 +pylint/extensions/empty_comment.py,sha256=6J3vWb1VsgqaihWB7iiLX9nWVMriY_mwMRgF55Qq8o8,1955 +pylint/extensions/emptystring.py,sha256=qcn-L25VhWMcGpwhtYl07V2vSt8fEEFwJWNUS9Goaec,2972 +pylint/extensions/eq_without_hash.py,sha256=MtJJ6-oUy2PJhmSBMCs8bAXXsIxzJwFTycdrdXXVyCs,1455 +pylint/extensions/for_any_all.py,sha256=NcmolEjBWD-aKSWmahpoaBOD-stJ8RNSnQB4OlHxr9Y,5825 +pylint/extensions/magic_value.py,sha256=ASwBW37SfUcDKgjQHydWtlfRII4QvB-vRrRZbeoBMPM,4238 +pylint/extensions/mccabe.py,sha256=IvPzKWs61Ro4iG6UiuWEJiCjIxfQ5RCouEhca3v6lRQ,7056 +pylint/extensions/no_self_use.py,sha256=-X4JaD97dlopbIlVUZwhtkJPTbhmU1axzXdcnMORzw0,3711 +pylint/extensions/overlapping_exceptions.py,sha256=De23ttHWJGotF0IxJuAxmU2lDnvAhOGJQED1UNar7bI,3340 +pylint/extensions/private_import.py,sha256=vxwz_YvnYMmO--vZjh36ByfGtjfpd4h7Cq1CbXMVXqo,11267 +pylint/extensions/redefined_loop_name.py,sha256=oQdXJptg0vz1jHZLhbvc_Jxax1GFNqLs8nCETfFDf7Q,3220 +pylint/extensions/redefined_variable_type.py,sha256=nn1TXwv0KMWyWeYbKuXpc--s2SgO9ZI3WBk--0zXSkw,4095 +pylint/extensions/set_membership.py,sha256=QM0OIvSX3Bb5aKndEOyHyc-ipspTp7wAnD-WkM4kLNA,1796 +pylint/extensions/typing.py,sha256=LJGyxtvXGGe-sO-CAs7QIS5bYWAWXaSvtv6GbuM5rKA,20390 +pylint/extensions/while_used.py,sha256=mPJM_99syc_U9obFYU_IoXzHlUHp80NTQ1cM4YljiZg,1093 +pylint/graph.py,sha256=8K9pHvoWupWOyHdRqzE_COXmUtMAD58eqGfWlOhSdtI,7112 +pylint/interfaces.py,sha256=1uZo1-eJoo_sct002nVnlgNKuf9fddypK-Fth3Laqh0,4058 +pylint/lint/__init__.py,sha256=PkPQqUEkDJ2UvZkxO2nB-W2f6o_zvgptqju-ktqCnVE,1499 +pylint/lint/__pycache__/__init__.cpython-310.pyc,, +pylint/lint/__pycache__/base_options.cpython-310.pyc,, +pylint/lint/__pycache__/caching.cpython-310.pyc,, +pylint/lint/__pycache__/expand_modules.cpython-310.pyc,, +pylint/lint/__pycache__/message_state_handler.cpython-310.pyc,, +pylint/lint/__pycache__/parallel.cpython-310.pyc,, +pylint/lint/__pycache__/pylinter.cpython-310.pyc,, +pylint/lint/__pycache__/report_functions.cpython-310.pyc,, +pylint/lint/__pycache__/run.cpython-310.pyc,, +pylint/lint/__pycache__/utils.cpython-310.pyc,, +pylint/lint/base_options.py,sha256=_S_GesVaavfDY6ref8F4M0pSynhj1dI57-zOXolmqkE,21450 +pylint/lint/caching.py,sha256=lCu3f08nROn1T30RapBsd7tIOaMNN2FfdRQGxR2GCdc,2380 +pylint/lint/expand_modules.py,sha256=nM7bWn_fWENEctwzZwNUM4KHWkVH7sEP7mf5IlOpX9E,7093 +pylint/lint/message_state_handler.py,sha256=lrWxkntvnVlFxXXIefRzY9ilxkGOmSvCUpngQerc0hA,17484 +pylint/lint/parallel.py,sha256=X9U6JT8HDx_nS7VPAPKOe9GMpUKoNppihvsddIK82zU,6558 +pylint/lint/pylinter.py,sha256=KjAJ5eF9oIr-XerP63W9MJR5gl4ksxQuN4RmkN6k-jc,53613 +pylint/lint/report_functions.py,sha256=-3IpMwyGtkxKOgdI4xys6Kw6P6GQW0dMjAruGDvA9No,2945 +pylint/lint/run.py,sha256=oA3c6t5mPOBK-T0y7guOX-p9apiX6I0zkFVDwjKQNl8,8957 +pylint/lint/utils.py,sha256=WssKoXUnlvqBYFnXisFEOXY2R8KeQ4e31iAsLob-dMU,4822 +pylint/message/__init__.py,sha256=OriAknwmd-zP1XxtaAZdks1rUxwIXTLjYD-Z64SJHsU,622 +pylint/message/__pycache__/__init__.cpython-310.pyc,, +pylint/message/__pycache__/_deleted_message_ids.cpython-310.pyc,, +pylint/message/__pycache__/message.cpython-310.pyc,, +pylint/message/__pycache__/message_definition.cpython-310.pyc,, +pylint/message/__pycache__/message_definition_store.cpython-310.pyc,, +pylint/message/__pycache__/message_id_store.cpython-310.pyc,, +pylint/message/_deleted_message_ids.py,sha256=_ZqD_BFwAhGFWd0300P7UUVZSR1p41o0gIdaePLhdQo,7614 +pylint/message/message.py,sha256=zK3jJgj7X4MYXM-v_pXhEAOSslGDoygZvIKMWwm44-8,2759 +pylint/message/message_definition.py,sha256=BSIpv0cvujQToi-9zLXn5247js6uvcS39UbJkex-k3I,5574 +pylint/message/message_definition_store.py,sha256=pz6CqY97Qt6E6fRH8HC3gGn6WGqnA6MafsYfWf6e3M0,5100 +pylint/message/message_id_store.py,sha256=O3l-UJ5FF0hIgtNvvqrGp8xtNDq-8cphfs7EOVNZdKQ,6447 +pylint/pyreverse/__init__.py,sha256=UUSMmrmRuB0ez663hA0gOeXaTsTBQaqhlR6Rzca2taM,274 +pylint/pyreverse/__pycache__/__init__.cpython-310.pyc,, +pylint/pyreverse/__pycache__/diadefslib.cpython-310.pyc,, +pylint/pyreverse/__pycache__/diagrams.cpython-310.pyc,, +pylint/pyreverse/__pycache__/dot_printer.cpython-310.pyc,, +pylint/pyreverse/__pycache__/inspector.cpython-310.pyc,, +pylint/pyreverse/__pycache__/main.cpython-310.pyc,, +pylint/pyreverse/__pycache__/mermaidjs_printer.cpython-310.pyc,, +pylint/pyreverse/__pycache__/plantuml_printer.cpython-310.pyc,, +pylint/pyreverse/__pycache__/printer.cpython-310.pyc,, +pylint/pyreverse/__pycache__/printer_factory.cpython-310.pyc,, +pylint/pyreverse/__pycache__/utils.cpython-310.pyc,, +pylint/pyreverse/__pycache__/vcg_printer.cpython-310.pyc,, +pylint/pyreverse/__pycache__/writer.cpython-310.pyc,, +pylint/pyreverse/diadefslib.py,sha256=ffJGQ7o3YwwAn9TdyrMpuW83F-Xyli-crCWGDwfXctY,8707 +pylint/pyreverse/diagrams.py,sha256=0od7HUDzBwlZB7CXtsUJXhYC_HIYX_CooPBjaTs-CyU,10878 +pylint/pyreverse/dot_printer.py,sha256=iLizsuDl0BLFkrNi5Hn2AfT5S0sFPVCW9CXl7dnVxWM,6069 +pylint/pyreverse/inspector.py,sha256=zVMiNs8xJBTjSesU3sq_GxV_j4hLi2r-yoAyQtft9HU,15076 +pylint/pyreverse/main.py,sha256=di7WGwfdpV8bRaDAnzABVxY4HfSiqU8iRN4EjI5sMOw,8968 +pylint/pyreverse/mermaidjs_printer.py,sha256=ANtrSa3mXZQUuKcqr9zm0Bbn2zaqddxuZI6CrkrJtew,3552 +pylint/pyreverse/plantuml_printer.py,sha256=6sp5wMD01Zk44RpFPSc4S2VMY6rz206cJqabSKQE-mk,3643 +pylint/pyreverse/printer.py,sha256=KUSbR9MWpi0eRlCotohEu91J3tMVSkpuwCaiGL99EjQ,3734 +pylint/pyreverse/printer_factory.py,sha256=lX9NG8dNQU9gVdBLaV6Pqo890cX4tVCOKZ7Ay0SpmfQ,900 +pylint/pyreverse/utils.py,sha256=mWDR5G-ldrQjGY2UMrriKMdiZdQQcBKi8qpOTLDlajw,8324 +pylint/pyreverse/vcg_printer.py,sha256=und-OhYEbtfta07D2SxcSjZ4bxpbCVHVMecAT5_Opfo,8880 +pylint/pyreverse/writer.py,sha256=5Ol0AjJP9itReMCwW9jPM-23vtKEk1g5DMcmJwIbu1g,6220 +pylint/reporters/__init__.py,sha256=KhZuqHuenXk0bhtsBvZRgRXt9CKuQJQUYPYKcPDNCeY,1026 +pylint/reporters/__pycache__/__init__.cpython-310.pyc,, +pylint/reporters/__pycache__/base_reporter.cpython-310.pyc,, +pylint/reporters/__pycache__/collecting_reporter.cpython-310.pyc,, +pylint/reporters/__pycache__/json_reporter.cpython-310.pyc,, +pylint/reporters/__pycache__/multi_reporter.cpython-310.pyc,, +pylint/reporters/__pycache__/reports_handler_mix_in.cpython-310.pyc,, +pylint/reporters/__pycache__/text.cpython-310.pyc,, +pylint/reporters/base_reporter.py,sha256=kJHMnoJH4OUe7Rm6w4_AHlJAWsjrQGgUSA1aYiOl_dE,3509 +pylint/reporters/collecting_reporter.py,sha256=-ZKVYrqfBDguGSxiTM1lZwZ7GpO90mx1_SN9MeJZsbk,725 +pylint/reporters/json_reporter.py,sha256=xsrutb9nLQ6m5HZzYyXbwE6xlrf4nnbHwzf-W4dPouI,3770 +pylint/reporters/multi_reporter.py,sha256=tOdC0CweV2Fb5XJb2uUr_90HYWqeInwG3agrzNjsXsE,3761 +pylint/reporters/reports_handler_mix_in.py,sha256=fOFMxrp54R2hVxYOqANVDlInH8jAI7tfEJ5h79TvC78,3067 +pylint/reporters/text.py,sha256=fDiOnoO6E3XFz5HtMs2zDo1qWWP2odff8VJtybqu694,10958 +pylint/reporters/ureports/__init__.py,sha256=ljyZntDHXZOMHLvRnrDJMs8Ys0B9OK7YoFrDhawcOa8,310 +pylint/reporters/ureports/__pycache__/__init__.cpython-310.pyc,, +pylint/reporters/ureports/__pycache__/base_writer.cpython-310.pyc,, +pylint/reporters/ureports/__pycache__/nodes.cpython-310.pyc,, +pylint/reporters/ureports/__pycache__/text_writer.cpython-310.pyc,, +pylint/reporters/ureports/base_writer.py,sha256=FyAmZGHeTeUBZ6_9xdlJOgbpuXQVCme-Q6FqT0sLnEI,3430 +pylint/reporters/ureports/nodes.py,sha256=WYjaA7lxztMSHMpo4r6Cy9sKr-3Q9z-RuhPMebhOWvM,5245 +pylint/reporters/ureports/text_writer.py,sha256=2McJv44uWKX1paFB0ZqQKskWLG1okf-SJTYgOOG5P_U,3606 +pylint/testutils/__init__.py,sha256=6KHmKni7nfNUXyIgksoUGoLgXCCEwrapVjlwqxCHdjI,1309 +pylint/testutils/__pycache__/__init__.cpython-310.pyc,, +pylint/testutils/__pycache__/_run.cpython-310.pyc,, +pylint/testutils/__pycache__/checker_test_case.cpython-310.pyc,, +pylint/testutils/__pycache__/configuration_test.cpython-310.pyc,, +pylint/testutils/__pycache__/constants.cpython-310.pyc,, +pylint/testutils/__pycache__/decorator.cpython-310.pyc,, +pylint/testutils/__pycache__/functional_test_file.cpython-310.pyc,, +pylint/testutils/__pycache__/get_test_info.cpython-310.pyc,, +pylint/testutils/__pycache__/global_test_linter.cpython-310.pyc,, +pylint/testutils/__pycache__/lint_module_test.cpython-310.pyc,, +pylint/testutils/__pycache__/output_line.cpython-310.pyc,, +pylint/testutils/__pycache__/pyreverse.cpython-310.pyc,, +pylint/testutils/__pycache__/reporter_for_tests.cpython-310.pyc,, +pylint/testutils/__pycache__/tokenize_str.cpython-310.pyc,, +pylint/testutils/__pycache__/unittest_linter.cpython-310.pyc,, +pylint/testutils/__pycache__/utils.cpython-310.pyc,, +pylint/testutils/_primer/__init__.py,sha256=1GhDjAf3SwghA2NcoV2yNCW0_OOKZv6ZDR--l5PjFE8,379 +pylint/testutils/_primer/__pycache__/__init__.cpython-310.pyc,, +pylint/testutils/_primer/__pycache__/package_to_lint.cpython-310.pyc,, +pylint/testutils/_primer/__pycache__/primer.cpython-310.pyc,, +pylint/testutils/_primer/__pycache__/primer_command.cpython-310.pyc,, +pylint/testutils/_primer/__pycache__/primer_compare_command.cpython-310.pyc,, +pylint/testutils/_primer/__pycache__/primer_prepare_command.cpython-310.pyc,, +pylint/testutils/_primer/__pycache__/primer_run_command.cpython-310.pyc,, +pylint/testutils/_primer/package_to_lint.py,sha256=RJbQbzyoDrNIXPajKyr4wDEIE9WD9Wg8oFSvcJxBj_A,4748 +pylint/testutils/_primer/primer.py,sha256=Lk9GU6CpT8KsbCnH1IRdooMuf0XlAXSUzTqgV7LdwZg,4063 +pylint/testutils/_primer/primer_command.py,sha256=SrEkTgkgDSxnNBxH1b6vzVQSlZZsaunOxa2VWZS-wb4,1110 +pylint/testutils/_primer/primer_compare_command.py,sha256=NAFn_C_XHhDC2uf20JEvrl9KQvqLfuJuHrHJ3pAZDQw,6422 +pylint/testutils/_primer/primer_prepare_command.py,sha256=EK4BfVwgRSDYFuONpjdHHjpubL9Gfv6POrZMw2r-AzQ,1947 +pylint/testutils/_primer/primer_run_command.py,sha256=2YDnib3yFo-ZCxYcIXZdK15XvBsTNc520s1S1BMiCz8,4140 +pylint/testutils/_run.py,sha256=VWk0xwotTdu6-2gn-8Eq7Go4nH9VZKwFd72XiH0WCCI,1549 +pylint/testutils/checker_test_case.py,sha256=IktDgF3pg-yiFiI16jts7-ecyJ7yOE1WKLQm1j-0ZJY,4377 +pylint/testutils/configuration_test.py,sha256=UpQ1GFlK3Aog75OUtL7ebiZYCtY0n2O_38_J94nFB9I,6036 +pylint/testutils/constants.py,sha256=nggFYQ10qQ44P4MuxsJ4ugTQ8M8Y7Z2hy3XHV8STPhE,1145 +pylint/testutils/decorator.py,sha256=22iVCXAV93lV5TTaDY5Z7lMIlmp3_opGiO5ITnGoQDY,1252 +pylint/testutils/functional/__init__.py,sha256=DaAh5XAzIhZkGUn2ZADAWJHSThraZvVaFNEU9UeL_5Y,790 +pylint/testutils/functional/__pycache__/__init__.cpython-310.pyc,, +pylint/testutils/functional/__pycache__/find_functional_tests.cpython-310.pyc,, +pylint/testutils/functional/__pycache__/lint_module_output_update.cpython-310.pyc,, +pylint/testutils/functional/__pycache__/test_file.cpython-310.pyc,, +pylint/testutils/functional/find_functional_tests.py,sha256=T9l4fuWZGVFFYf-WrpM2O8lq0jbuccpSN9buWf0Tm6I,3001 +pylint/testutils/functional/lint_module_output_update.py,sha256=Mx59vaJsxz-jPT4lzu6TsSG7JsCLxP9KBgMqiBWq9TA,2143 +pylint/testutils/functional/test_file.py,sha256=KLCKwlgyPeRR7BxIa70g5Cjj293CUcZRPe_akU1TUf8,3806 +pylint/testutils/functional_test_file.py,sha256=PsQq5Kp7X1tZLc4qhnC5OC34wgZRXXAzsjtBCphXW7A,635 +pylint/testutils/get_test_info.py,sha256=a3lQTkaIDk90QPSgBOt3deXn9XlzxKA_hbdK4_-tMVk,2127 +pylint/testutils/global_test_linter.py,sha256=ksZfQa2oxnRgzc6OBbzhhk2tM8SoxxDg0zfjhp_we20,685 +pylint/testutils/lint_module_test.py,sha256=0EzoQTPHYBNXpy8rBqQrgT5mfJSbmLc0u-hRqw6ahnI,12801 +pylint/testutils/output_line.py,sha256=RDMrPmemcWQXsiQ6ejMrjsOAvlUr12MaCv_uhAI6r5k,5897 +pylint/testutils/pyreverse.py,sha256=hDjoTVuFvwX-k_WJvmeS8kx00gxu8087ivlLaKyt--U,4194 +pylint/testutils/reporter_for_tests.py,sha256=06Gt7xqMWs2yp6rL08auUaLq-ABpPpJxjTCIB2Q_kxc,2306 +pylint/testutils/testing_pylintrc,sha256=wbnx5xK0-nhu1ZaFz8bVb5cdx6E6L-CuHaqSr6LV6QY,198 +pylint/testutils/tokenize_str.py,sha256=xV1BcMrl_VmkXVgKrU44OrYmTmkfbyv_ojDzMjxdEnI,447 +pylint/testutils/unittest_linter.py,sha256=QZ3qfFSRYZ2Q1aVL4pe_0fIZn6MdrASMNuIL4uRi4tc,2795 +pylint/testutils/utils.py,sha256=diP1uunxhC-USoXKs2CZFOVvGHQE4jaNF3gSJ11Ps7E,3133 +pylint/typing.py,sha256=7ossvI0DB1vm9rWpMbu5fSnvIDauVsWbsC96HW0BPtE,3250 +pylint/utils/__init__.py,sha256=IG9wBnlAbF9N1TUi8lQT3XZhluAg5XQ3KHqrzx6i4SY,1382 +pylint/utils/__pycache__/__init__.cpython-310.pyc,, +pylint/utils/__pycache__/ast_walker.cpython-310.pyc,, +pylint/utils/__pycache__/docs.cpython-310.pyc,, +pylint/utils/__pycache__/file_state.cpython-310.pyc,, +pylint/utils/__pycache__/linterstats.cpython-310.pyc,, +pylint/utils/__pycache__/pragma_parser.cpython-310.pyc,, +pylint/utils/__pycache__/utils.cpython-310.pyc,, +pylint/utils/ast_walker.py,sha256=7cQN2XIIZkLvzvsr6YMRjUwWviCMvMm_P4ORciLdxw0,4235 +pylint/utils/docs.py,sha256=wbCkopZIthCXIgzbd2dIng85Of-QNEhNWFyjainKjSI,3854 +pylint/utils/file_state.py,sha256=-bYuMbWzUzRxNi5bo9xltQ8mup2HgEEyWg9zV2pVmoA,11330 +pylint/utils/linterstats.py,sha256=9GSxKj4d_YstK6nsnIhjQuBlcbqkqvWtyx0w-52a-5g,12554 +pylint/utils/pragma_parser.py,sha256=cP-yUuOEf-gHGKAVqwodgaXEyOmaDksGOycUNvtqPf0,5054 +pylint/utils/utils.py,sha256=fMUbcmHAYJnBROkWD48JIsRF4GLqdc_2IL5PvfI_wmE,13267 diff --git a/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/REQUESTED b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/WHEEL b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/WHEEL new file mode 120000 index 00000000..7e89bc16 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/WHEEL @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/1b/5e/87/e00dc87a84269cead8578b9e6462928e18a95f1f3373c9eef451a5bcc0 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/entry_points.txt b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/entry_points.txt new file mode 120000 index 00000000..9f819330 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/entry_points.txt @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/47/f6/19/546047f8eda0d70c94b90fd52e416055fc7da7fb900b9a0c79077b72ee \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/top_level.txt b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/top_level.txt new file mode 120000 index 00000000..7c8dded1 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint-2.17.0.dist-info/top_level.txt @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/8f/a6/7d/8bffe922e6a20a46ba525f58232eb22396b0e506c2b6574bbd994c92c1 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pylint/__init__.py b/venv/lib/python3.10/site-packages/pylint/__init__.py new file mode 120000 index 00000000..eb075f3a --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint/__init__.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/9a/e8/61/680ce5b4b1babe842072ea69dadc37b352df87dd87d062f62de3c9d26b \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pylint/__main__.py b/venv/lib/python3.10/site-packages/pylint/__main__.py new file mode 120000 index 00000000..27408ae0 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint/__main__.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/9b/5c/b9/9bb2b2f07b7236713c7ed1929d14930e0bf9b2eabc3fe07857f283dc96 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pylint/__pkginfo__.py b/venv/lib/python3.10/site-packages/pylint/__pkginfo__.py new file mode 100644 index 00000000..4a6eb609 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint/__pkginfo__.py @@ -0,0 +1,43 @@ +# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html +# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt + +"""This module exists for compatibility reasons. + +It's updated via tbump, do not modify. +""" + +from __future__ import annotations + +__version__ = "2.17.0" + + +def get_numversion_from_version(v: str) -> tuple[int, int, int]: + """Kept for compatibility reason. + + See https://github.com/PyCQA/pylint/issues/4399 + https://github.com/PyCQA/pylint/issues/4420, + """ + version = v.replace("pylint-", "") + result_version = [] + for number in version.split(".")[0:3]: + try: + result_version.append(int(number)) + except ValueError: + current_number = "" + for char in number: + if char.isdigit(): + current_number += char + else: + break + try: + result_version.append(int(current_number)) + except ValueError: + result_version.append(0) + while len(result_version) != 3: + result_version.append(0) + + return tuple(result_version) # type: ignore[return-value] # mypy can't infer the length + + +numversion = get_numversion_from_version(__version__) diff --git a/venv/lib/python3.10/site-packages/pylint/__pycache__/__init__.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0164b0f24dc7004409bf72a7b0f1815312c7b24b GIT binary patch literal 3629 zcmc&%&2JmW72jPhKSWX=mYq0uoMPY>RR~l|3u=83f}(~U#70t8wG0?xQLLAoA-UFm zWoA|i1sOdw0dncJm!yT9TmGfJ=9F`Q9*hF%@69eH*-{e(2wD=meDnR@@4b1y$8>SA zU9&9fvv>Y-oZajH>ubm_eO$DDXIZxTCj@SBJF;SXVB6Nj;?9@$z(HRvsts!9*B!X# zw?3%j*Nqx+bI`PDT|H{W3xfqCH==gj8FV1O!LRWS?|xDrbd9{ommn`fzRp+pCCE!g zUgeh|FB|y^e+}{qf0Mt?uYTeVE{V=ymDhHy-i>ca^`2dHf+R_Gpu;p#y=Kwz{e2-7 zTE1U2E3sIPQyz|IzM3gN3-q*T%RKS3SrjI^=#VVVHqstNh;$Yie^mZSr&zYvp~_Z zJQj&oEKQi63N}jPI7m1Hg2HSp$)>ODqJ|^CA$hyk7<8($31@i;oka~UkX@24y)S0N zG?4s3qJ@-srVCem9O|B9#s>>K#y!~XD@(qP6)!&MPt#cR;gm$k{=0V`KG-EnT% zU3yi6~GqQbxICEN}8@+zca)yMqm-uR_GJ@kJ|;B@QP9eJJR zcknugUmcw$#NUQ+7QYfX?Q)mb|5mdt!jnRrH-KRCa6$-HxAQ{mqEP9dDt_e(lsg=* zk(Je%YwRG5BDyY8#OXe+LpZ-uY}32-E0!z4rdnretKXl5dYTVCT#mkogON&QHVqO) zU=@H^tF#EXXPf~qwUtJQMo2Kxb`Ke_a!qx1d1YD$flTOX7A{G}>OGN3F)}IdaXB=< zGwpZF4S-qcHRC^WoowQ@iAOEr)vddZV>@^n|L!)-*g1#I175y?1qkJs9D#dNCc_I| z@l&T0+p+WMC)vvN+v!QqnyeC z;;kJ+2n_U}N22oEE{HB;X|78m%cTUdv4d3Z;gT^P;%@0w&e&L{F>US9)}A4``@ufV zAp$%-)eEJg>iy%>$8EE#TbRPP`$yA$-!X)4*Dl|?8(}r=DN==zWf>^mIk1mx~ zYMRu?B)ZNGf|(sr20ngixtmY@Ot)VLpLr1|Kh#lfD_= z+`RRh&9YKhXAe!nGuDnni7X3k<;-J`rlBgcVh|k!z#hp_AoD@{n>R_93-K}fzO?Ci z2o2=4S_!ZVDi1t*8cJ@C4n=7+W8s+XeE8`8AGUYyJi3phI*M{GP^GY&TQ?aHr!9tJ z5+;;4=NgHGmw>Pn49?{1o!Q+#-kH}41`E~SyuEqbsLj~DG+EOX1+Y-Rq5+iE$VKFD zltu@fj$HHBC<3X+;ARl3c1sg@ohmTSK`1He$x^fRm(QWK-vg2qN_*@9Vz*+b3J6}E z0+hS{Hw9r~ z6}DHjPo4F`-a2%)yhF#^suKG`;iRf)OoRq-CXpAesnKg$niWlycA-p@qJ{~EE~Qon z2)3dHe;TRh6g4azEMY2Y6RH4d{i_5>1;}GOit3=&bUCuzKAqd+oM zkX%Gl5?9J)8aUTWMGk29bjIbP?fc^#e+Y!{OUk1~)As>6TEC!uOojCp^)HW7cw%J! zvv|R9B-_;6(6bETYRad$aR$yJfck1intU-d*gryDQyxyWM*0KPI5zKmY&$ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/__pycache__/__main__.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/__pycache__/__main__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f05fc52775b357c3b2e891577719db46a0162fd GIT binary patch literal 236 zcmd1j<>g{#U|^VE+8;T6_p^hKfov4O1mrmYaj^`LNMT4}%wdRPNM%^SxR8MnL^FZt z6vki%O{SMX6%2lw%u#Fwl{uMtB~kpj`6-!cmGQ-u#qkA+B^gm%MWuQ15XqGcMIfWW z#4jKHjQreGeV}Y!YLULHW00qxu1{i;p?+CvUYUMQW|DqEWl2VUp0S>xfqrpjNvdu^ xVsdt3dTKFH0%Vnbe0*+VW?p=}UP0w84jZ7or8%i~j6e&D*?mL5?Y7aRNyc^xtx^dI zSg_;^nAyRP@Dbj!;tP=2z;)Z2_SMIr+6 zGFDmz-Ao3ZY>-DfZpTTiM}ZWP%2L(z{hRu%3W}UZTJT^PM}ck^gM2CAS&(Mh62;w7 z)BkGIYhY80QrHF}K##q(=IZ(8iorwUC@qaAg)U_J{g^KDL_CjEy%Zdn?GCmS^Wnj_ z4(~Nv<7b$ZXm48MKAGSinvfFjVeaf>PPzM*oI=;p_N9q4K2(xDqMZ^d-p3d{MZ1d> zX*#-tk$pIs(9!|l+Qcp0J$E0;wUUXEKk576Hmzq>7R{ZGX~@Bqd`A%ecvxw;sJy;%2)b`$O= zyf?ab|7w_z5)dtnl`4b^H`Xs)m}36de`9TBX$lxuW=zWl8Qhds{;#&L8dXz~B2S`@ zFs{m>AB-2}xk$NjAh7YDL`flTNSR4fi4~6_L*pbOHSY9Y8=kZ@rZN;#K_9dhq)3F7Y%O#ODMhN;Y;9<#AIVQh9tZUIyJ0^Yh)@=3Dr9)$>VunG%bQVqH5`g` z7$$KWbkO}QU2m?ggeulzIgdI!Q4b`U3&dEy(~Hw?##l2SnbSQnjWo}Kb!9dpgx!AEf&Q(T3|$Arw*3z+<%ugJH0&Byg0RY#r#z*d7!tCbWM(zV9+Zo@Mb z#(36Y%=nCT3+Q{nm?Us!YV05`>{ybP4+_llnpXdZIbjjiOS2#Lvb`kbgQ2wUQsO)H GGd}@Iy(S3& literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/__pycache__/constants.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/__pycache__/constants.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3b950733bd2cb19500694e663dbd9ebba06a858 GIT binary patch literal 8278 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 o_#N!6e4M?7XW5(i1bY*o@PN&Hw-a literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/__pycache__/epylint.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/__pycache__/epylint.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..614467fabc3c593bbcf4d57ec0a3f21315064c08 GIT binary patch literal 6387 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 C@)Z{V literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/__pycache__/exceptions.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/__pycache__/exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23a43772ec957dc5c8143fdef78f8fb2a9e552ed GIT binary patch literal 2445 zcmb7G-HzKt6t-h0o6Y`Zy9ES=cA$u|)iz;4;sR0BA_A&Zarlt}%ZN8b6LHgyH^k?6B}@P zE}B{qZqE}H+|Dbu?#M$PN8)QRh7X{lwbJ9xUb*AZ5G3O)DaTl-!EU<4Gz=n>l@yrL zj0+K2$`P`K?;*@Uw7MsLQ4a#i69|H$5d?`6c})G)AowBY@nmEv2!slQ;Kb2&Bx#$c z-S$u=(AK$>pxd3>dw04w?(+U_`w-+|JC6G8bd(L1{HV42LEA(b+(>zNA1yFAK(1)R z)Q_f>j&ucArqxeL_qtPe?VFdnOOxNoJ>SUtQXRb$T6}MIpf#9{30TW9PsXzNkK0?NuK; zzSFCr#I<7U3y1*)S+L>Wf(`SmQBE^T`YLAGkZ0_O8z#yH*nw8bB+}5h2E%LKK>MQD zNX#G-fzm;_OtGaQQ5a+a9H%jtHiSZQ#q^^765jMYy^KxfJam3_h5NvLg6a66g01&U z^*7hWL`9SQ?o;>L_{ufQ%`T39pX0W}3;-+K)=8zPnjCY5;xLj?76hoNZy-L<>$s2J zz~;m)mV?0NS`f@>@(Pa8eOkk&<~H5>-{Uu5;L6r?>60Z*BIznMG)a?Dg@=ivX`y0m zvP}qaJl)Dh{A={F4TLr9QKs5W>yGbU_BFkGX*g&K8x;A{MBUFJ#C+=P>u(ua|1RXmbYBjZ0zm z1)QL_Xtt+crM}hj3iYfftxv5x$?c5ZzmCoL-7|bNQ&GP`-_HtBxuRW+BJ&arzC{h8 z=TwjM*!!NeJzT|yZ0 zd5?(M5<=))b{8kLzvKtHWcbNELrfK0%(1GI4WNl?R2~`ZeP|6@mgE5zIkA0Kg?k$b zQROP>5jvM%b3*U79+;Bam-Ez8IvfS#dXOg|GlM;tQrlrfZHEo{Az&E;cBGXYuo&bZ z8=gh;9VFJ8(Ij*(&8@Dw8%fyD(=?7iluW;yXPW6zgu7!(p_05G1ABI+;xW&e#0Y12 zXdzEL%~hT;tXgSoXK_1VQ%vSbA9Tz1&p1r3BI^%lHW2D=uavcDdG_bR9)I@SvGv7< zvt~4lv?&_j@;ER54QTR$re)@`VwPe>{nPST|BPbaP-^;q(`)+pTfrYbFZ%xga@1LK literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/__pycache__/graph.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/__pycache__/graph.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a45cecaa9b2b96bed65b556f16ace2e79aef8b3 GIT binary patch literal 6224 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 X$G+%vd>C!woPp%^fJ0nzr{n(*ZDE^E literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/async.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/async.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..769a7cf119ed4dd95456672ab0cad1bbb151b732 GIT binary patch literal 2986 zcmZ`*&2JmW72lbiC6_CbB4tUo?9|;hb{(b=Ww&n9q93rMNRH7!aMJ{a7cJJSoguaK zeo!+@StMv6fZbz&{sBEm$NV1!`WNJ~hhBQ}t%n=}wW#~vENMx0yMkukyf-uNz2Ey7 zW{rkp8iuj^!}tIC&F6pn=pR6z`xvb57zR;)27()&!3n1^NvKB&(q?RWCd@2miRD={ zUd5{b&x$Ka)vG49XKQ{Xt|gA=Xu29NBz3Q$X*+Hvi{2tJge89t=W1~)X?tyA+%vet z7hV{AK{$h@=cadoFYy*{zhK@nH-B$*E=+#CxhKLWLb|<7x2Zv)Fy_!PW!!_Ah?Y>Apl?JET|$(lpD1JjznF1M9};j~;CKo1biL z{`UUPy$&s`G~+@QY?Mba$nCJys(`kTheVT$Fq5d)e;Va`xb4CC(7_V}h*Iuujzfh0yi@d>`0D&bcM^$bf6Ml)e`O*va zoOrh8*}z-l%X~%iYJ3%-x?I%nA`COU3QL1Bx$-CyF?XX>MSKoaZ~n(I`FD1?O~J<~Mdd zCyCMnAr3*U6H zW5;RcoxezyVMT&eR(}L|}sR#-9KmU-X@V|+Pa|wv4F)#*X zK&OTeHP|OGGj2ez>CWWpOlchLcC|aR^~~XpRa9b~n?(gAy{PXkCedM(`e7U><;(tI z(emHqw0(V*-xsNXOwT0dJyRm?eQijz=;X7Fy(|$Ma+Jc3jjg+%-QQXNG}yhhaUjxz z4KQY72sN6eKkeSSxuK$5tPg|m34~LD01euhm)3?>)g6utmJLPvKHRRb8`VjjOxkzP z6~1;Y|OS=EKw)#B}09)B!)A>uawFtISNG>$t!Ov#av1CGb!W8;rkpV28jGLL~f zGUT&&7>rZ&&ddL_&f9V#qcgPx^AaHKHRSQYhI8Te7!%L*q_P=k4phN7tH&D&61(6u=C z6QLBq*D>WqREK&BE8L4>t^-mIYsg(afNSzHg7cc=qSpnPLMvOePOg$BrC+jtPu@KT z@c%w}vUmpUhfoyfP)3An@UKz+ClFIIFaTfq2l|XYGjnnTI3JT|YzjF$GSq5rP8p&N zxL({h^{S##zMk7t21wTs@qIJh)-q?XFsK9PXDA&sX7bx0|6o#|vZE#^$AlP~0zJfd zXr%8kBXa~LV0o}|V8}kut49|>&!uA` z`zU{8r1UAwAX$UG1Z6#V2fs2Q56oE}6wYZgDr&Dgk!%4R9a;v91+uT8JzG!=i7Fbi z{P*><;yEhl3Csc^{Y}3&`3RVTxi)B#OE7epj-q@A8EPDt1Y5Wl##^xJ@x9X#|XQZE^kC)YG4zc z8qamv=>i}CmDiG@A1Qo~XPK?w< z=UG?++8e>k34lu7e!maLib_5n!Y@K;!a}a&fJT>9R4HE^i9g1?#d6V|KR>dH`!x0| zZ-~0OG<9)#3o{u$T@sD+7O)^U%io73lxY8%sA!iJSu&1BEPw NxlS02OJ?(v{{p~dDT)99 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/bad_chained_comparison.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/bad_chained_comparison.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c76a78727fc13b9a6bfff9174154ed8554d9656 GIT binary patch literal 2750 zcmbVOTW=dh6rPz~ukX1vw1k4#1{GM;*r`fUCETbqjhcwojYt7?QMFoo#>uvOac9<{ zu^b6V5b(eYuLucv%m3h4>?^#KKY$bv<(#pTCIu?QT03**%;kLN%y-T@sa8t{A>_|r zfBLaj_-*=UkdHkkjIIzu)n_1Z!f8k%>Qag_3t42ihL(-cjB;*H%Vuarc{i`+Tv&*T zZjlmU$X8*H6_%p1TZVCk=Xa=Eg}wm&81zNx$FCD!;^ke!%ObyHxD)&YpWu_braQ@} z)`&Cx2;n(2EBkSrq<$JCv4Uas_MO!wZ*h5P@!gf?bx`EugbSQ0U-gw(+z{>iLc-8o zUb(&uePMO$Mi8fZX<}J z5618chG`xIL0rm-%Q$rn&Rmll+zhCj8n0p-0*`~ z@WmwR`Z7>SJObUns0C$r5^48h1RbN>erWfUzb@>gW4DKU?e^j3+WyIw&*w%Hb5ADR z+=mz5nm_Lt{o89j)eYJ~(o^ez?1o679MC60nwjYLD7y&et2CWdxcZKxR zL@N9Bv&xZGh(Q0B_m$xG#~UKH(+weo4N>&}>2O#Avq>y$@vtj}Qs5Xa)?mP~^yB1+ zQwmP=Q@bU?1R$k}&4W${4v5o3eD=CbdR@RW+nBX^BJ}Oqk?=JVTltZIL(n5%*|UL~ zJvW4f8h{#sZ}#lG-LM}bj3ywP)p%sm@>}4#Z%2Vj{rkeHWyM3+_lqHDKT@f@n^{t% zJsD?aD@npOgK!)?$P!E_=&8B{LP}DavW{_$+%0Xh0p)at4A>@-;{)~;d5}wuFGz=S z#*N*=fLr3yvx6+)u;kVA$H$}Wz4}(^{yOnMv z@rBy?`ML^H0laD72O27v2!WjS_Au8}9r)*s_~$+0U#+{96&vd!#tUC~18gdc3H#(E z=`TMc4Qk$ouROeP?|_Tm@UCl(Fachwh1%h#Z{1u4_-nVC-mTTFymD=+d3)vd z9UN3|F5SGk^xoR?$|?>GAhly;rV?RCjsX~V?6?UX8hHw4~%)eqe3)89u%^0gt zld?~qr~Qln%d5=93btR>b*#3i6I)~^GV&Oya$wAYcM-2W1tEnh&Dky)(0e1w0JX^X zY`}h?@=|J`eusWbwheB4Z*r68U@Z`XTc5KTf+YKa@;qp)8S*XRh3|}0WZN8&dpTYl z(19^9J1n($>1z`!{F;89a`SIo#9LiMP}3l6AQvsW5D4z9!GbFeI9 zNp~1*B;zpH#fB0o@@HWVbP8!cP5O;z1$8q3W{x-~j?m-apgx1Fe>!&%uR^>pf}nG! zxD99r5Gqc-Ge-GC0XN&HuQi7-(YL1n%NIa*9uFJx`i1`q_8>(bJ%*=m*?!FJ*W{~c z5NoVs$TQGorZ3l3R%$14C*UG(3n!mhDv_z+nUQprv~iUY3aCi;k|1`=KIdKpr52J_ zB6FOad>J}@+>rjoxEFa?f|Xl6TI{N=8jBo9XcO2>LIYa#TFxG7UqNjlD|lWEwcYcwlIKMU?}aE=Jnuoz4@Wb3 z&*MoO)FvuiGg9lr@W>h-rz!WO!AzGGXimbbuq+gaNlga7$EEUEUe9F~);u9)9#?Ca z2_69w;IFi aTfn$!I#tXH(?5uQg%((W7U+aAcJ?pG;?s@* literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/base_checker.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/base_checker.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35f1319ef7de231537d1ba9e6e030d29605895bf GIT binary patch literal 10296 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/deprecated.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/deprecated.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..806c7e8eb257cb840fdf0d461342f7f7004af84f GIT binary patch literal 9070 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 CNpW}p literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/design_analysis.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/design_analysis.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27d11337f558c3686de5bcb8a1ac51ba26fc368c GIT binary patch literal 15390 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 Q$z+}%NGP8vpY?71KW?`BqyPW_ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/dunder_methods.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/dunder_methods.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..415d51f6b403a81cb58e06a43f0f323fd3e3d3b4 GIT binary patch literal 3276 zcmZuz&2t;K6<=UMam~-_S%zAy>+IZH12y?iWX(B1n}YE;o;%;K7f3A z*|jap`pbWIlYi9y`RrdnFMJF}zqTx*{tg7UI7zIO_=F%$6Pnt-ZD>1TY0a;tb-!-L zENP^U?-;t4ETyjR8oHh|)0W>dbR$_#+kV^7PO_4A{0^~%EpLGCrDQc-^Vf)V%i=C? zKDKyMxF@!MfnVSqzWSK?7x~(*)xG!(&Fzx18D?3oLmlUtg5mPLFYasyn>*W^zq>uS z)up9#J5xH$B2m_|oC}m$*~{W=C}g;wh~I=tpceey9E<3_kT7&rI23^qf>C>GZ?Ls} zH~9Vby`4X7?E;7G+`hE~zs{ZMCvm2QjL@31-yFZ2z!jEHxaCt$e4A6BaoewP#%nS0 z>%8ta_(i_NT{xQ~miQ&!<|~ic3GrQinXmFS;5YdNIP)9j>Q<3)AveP$nHd}YjartW zy1kM2`Xw}>P{NCM-U=dJH717uWl~EM{>|8ty0`Gk##N5bHtjEPZC`$WxrkkH` z^efH%SgAs&{)a#N=%-z?Ud3Ryr^iBpO|VEvZyX+iUAY$~;HeC(hT#mAeCX|qI2##w z1ov`jl$aHvHxgM9XTmE$R|ElKAYPD9!>j;cr!!zTIFB(Bk#*I3@Di0M36%m|^f=UB zDA61ZAQ@2NP{Yn=>^3H(@o22UINY3j8my1dv3RmY&ngcN5qjVnFcP;h<7}oq5pS$Tb!Qtf@cw!>t``yYKv#>%k3bXf&H4kL0wLtA&2>)jhg+vsx+U@xpX997( z+G`yn@YxIa{MzPEetzwG*FNg*&Eqvrrd5nCp3eKR>S2@1kVi-H9)j^;3pITeipH}}!ACX7&m>gRN_5nMn-6!%*psgqMWBL?| z=vNJH?OI=xLAOz^1Qk9(WrC7Rps=jPTBNG1WBLeL)**w2@u+ks)8J4@1typEVgl(Y zx^~HwNQS;^LdZ<}?Q=R;K&Qm+`Ir51o{GLi2g&~S#@*Y4^-se6>-|HK9rlxWA2JI| z!3VwT*ZK;qSf7N^{cr?HHcPpvDwC?exCfMwk^z3%HP}YApsSM(X_FSAe`enuUEVrh zx_T&FGOWtaTc$Sm20#yPm25xHlLf?~$XSTGL3{@YMDr0jCY%&R{zwC*>4AMh<=e;P zfIX>kz+?g)j7@SevJF*7mmd%^9NZS%aI5QMUxMXxFwL4%8dp&8V_0YW2!r%3N2eZasIwL?qp9bgm|5Ttbdn*?`q9 zC-xeZx0-?yUPvW8TzaQ0UQPYRGb z-@wPeocnlI_!p`;I2nrBnUb~W>Rwqhb#Y*dP}epdDp@E;s&q|aa=a|N9r;7RsAO1F zDz7hXXf5OYLW|M~fkeN{3m_!lHIm}tM3xM3hbn_}S8&e34(p3V@cm}UITQ!D)JH

    82p#@Y#2VpEhNQlP0hu zSl>p&*YIqBHN~m!iD30fuYUr2%f@O#g5{txWWeZ5)&)k_9rc}U@Outtm%!WRV!JE6 zCSV&IWft_U#yub2np!mo2ygERHKJC%?OKO!xqyQ^=FC8Z9D;fVwJNSVM5>s8!Xeoj z%NA0TVax{Z{Xm#*>pjw-0^1s)2|8^L;!JJs^cyIoi90ENGEi4wOEZm1cU8WJ-pg>@ zHI=f)45ZLdm_7p&gIZR>>RDnh|3_!xhM1Sh3A%3TT?3+DkQ;k|;Q z(3qL=-5^Q`z>*T=)E4F(D4NexcY^>Fr65rRsG{^j14f^KTBlkLg&jQ~V2r>3O*Qe$ zh}48m*(-9Irai{7{fllX$vq}KsFpBvwPJ*D1ynm$KY7W9m z!h>_WqY||F7x6g>Zvr*Hf@EE_06u~?w<)9@s_Vx;4pNqO_2;<;Jb~^&EGLZ;^r}G$MIC!babW!IUSM z0IJeG(^OWW8m<8rctbZ3z74%3={bR(upkn%ys@|dUjjpU)8Pqc#VB_dYEH#16V%Gk z*2*>4x$BnwMY#B&n}dVGO#!vL0ucLugBgUb)USqD$eye&$bm7q%T=#TFcZ+;uxI{P z-zb47#7bRSu0T_Q1AOMsPJVuBx_tJ+MCr}xsq**Vzg7 zsrQW))$WOFCPnCkYVvW-6nl-0i$1&DU3M=*Ix=L^$4-Ib&PF{gFGL)j2oHp0+aQX^wKt{J}tj3Jx2#IYSI_Q&xMlp`EjAst|^lz%ltR*;E>aOFBi*Bda z_uQjtMqAU2R=v@9RQU2cP>(G^z46Q&Ya@Pu0FC@Sdcj5|?XI>|#L~`vf~B=%K2KZR zzU_-^j|*SfX?gADr!Mft^WI&j254;1r*)7^n6+nEKTwsuMmKs9c-kGp&pdqv8*EL6 zQFo@=PEwsP;7=72QIfec&SEWq z3bC{R4Ibt_d}|!4ymXF626?K&-R&7A10NM?U1Smu@@B)qlXTvW<-6n}K!if7eW$|L zF2JKoXtiTISTy*wKi62SF@Xu--tjhzU_*DXZcb(!_bFLK67Fp;WPw-j;!~rvol%(0 zZe+lUoeR59(u-VnRCy{qKLNQRD;!ZJzglT{fddbr5EJoS8_vX~&sZcyXqVPPEZmCW z{`SZH08(re;XJQ#&x?VfdbYOYg{hNE7PNiuRQR>a2wB2~Hs?YVaaxfWX2ru|)fm+z zskSe{8undRw2f|%*0x<+jRkU$7Jzv0U^o!juDhtId66XQtC18_oZ zqwV-iJs1aQN922EX2fgUamGc8#CIzrRlmW5adLo+)Rz{P#>20DavUQ3fkTC&D_HZ! zcdhCS0TO<#g#{PRmsmTv<<26qK~{=jeDQjPS9oWn6!I`KC=RtvSt8AAlEl(akb#Q} z%4eYZN%CDnxz*ignrWOw@LhYlcd3TMxe!J-WBvV)u3-y4f=!K!9Xw= z3f?+~PG_3%QC+Mbpg3=3}Te?cm?#!v3hM>Q#d(xPRy}PT}mxq>wj- z^MQXe)!C@cf<;KpZu8Hwq>ZxRpTh9KWI`t{Q}8J=VObyoVYi8?H6TV#OxGf&=$Uxn zwkA1Mn^l%$rXiM6Ca%awv1Yq#3apdd{}-=Zhzu%3Z4L)r4IHid9_JHyYpIVj393&$&cfnJsjyqogVIgE|4x0B$%XwpVHDhx{%n9U896U;mmB{Ahem2S-Ap$V z2ok27snxDEWjWJK;al0eir;7wKS7Q!+_{QYlcn*+ui|?td@pm`;9qT~SSJ2zs+no$ zGhr`A=D=$*81aoO3dYNF3gzFTGGNjVnDor&=XWiASHc8+dRZ47EU6jXp87ynm8xo_^ftk`V1z z29@PJ>tB7gnZ+9Lg{INWv)#>I_|onN`i!wmPz8?$gnA`>?pzhzc%T#-?_T$hY`8Sm z)fb|4TdU*_Q1$ZJf)Q$qhwwZff`Q?A{zG7{!W&3pOD!@SKI=!S6DAgenbB8au%-~B zY>?#{shKc2eEkaf4#H%CaxWIv)ptYl5NSAv*40CW1Nh+kK?Wq!g`F^$ylkubv@^P zxuw0p_MUAiM^OR}1ou8aiJ^r)=@$AH%~he~*OAz{21j(%b829^o@?h~$$;r#*4y25 z6KsQL+kJB5W!gDRcX5AB1YPVLNd$0Rz@_X2b{=k2j3hWP!F?lj#_rm*G&?K!l<&^c zogn@u))MKJM$Jx>&!ggiecRn|rfk{{|4mx;hWki(AbQ|mz%9G>_P<0Nm!u=OsJd6n z!|$g(9>6<;=yN~u){jly&{Em}xNS=9*EMxO&mtPFAvLrtxUum#FJjc@V?)<|mPuwX z6K28B{75r;)%`!sn%a9=J&#fS@Hpl*;@sqa><1_Brx^ENhX=ND>n-byOz8z$A0oMV zttD8Bm+79|d2gn1qa!p;aX)$l|DHz%l%@Cyp`8(LJaRoj&R%dxV>v-T@L6?UyRGr# zP24cW`#@7)g<}}}?7*F*$m_@-jPuan_z~pc6b47vo5mVA&>f-u6-?<63iTJB8w=Af zSW-(F4^uB#WOR*Nyp9FI_4__vQL42STp0ZPTW?Lnd%1>s{=3x2lsNd^R>!ii+7e=j zotD_c8~6AdG-At1cO#&S>n^^$O6WhNgQhzIBw7b_@?dHjj*1=~9?bWQ{|KMmdI+6U zaF5nu(5=b!thhT_d`sLc>;OHn932mV{!uqF37*24W;SG>97dbeEUB*kW@+?gjXlm8KY^8h7(Ov#^6 zvK5?iW)aJQ5&c6fg8v!%Z3kLs$MwT<5ohD5I@W=!YqD;_U-BxO8vaiU+$F!;ir!<5 zKcXWSfHK18b_Ud@-s_+HqiX1d5 zNJuTf6{mT19^uzDTp|Ij=0K(TGVB>>D4;aRYUo0O-Uh{`SEJ<*lUARAtu^P!c)H)Z zz#~OSQPQTsWVqjn0__w~uuOXwTD|KvqO=Qrkb*I8lz`J`(S-z~2p6$nUs7gb16ge; z-h@DaWzFtOanXrC{QLOS-_n6l7~M=ktpy!s)FBN__Hk%!J)W)9(GDUsF}#rCLM)M| zR(?$6NI>zB65+=cJq=FGga6*vT0v!hxMS@PcC7u29czEsS=+x;teB6ZlWjop_T@FX zT2393mt@I^FW@R2fL_efD(jA7+-VoUb! zEw#nPpjz_<(nVR^>7YwH2(=)V-9_DZ$&ZwUmQ|_`54cOEfLRi zsFsE^L2{GzOs6bqpbHnj;SrPCbCIe)P042|`726JQ*w?Ham|Gos<5`DRsIDkRw=nn zi9j_v7^Qt_NiyrCMq#4LruLTkF=v s4_6dP+sl8X{aa>#CXq4Cp1ht<<}>+RzAK;29LebU9^3=@a(C{30Qn##AOHXW literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/stdlib.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/stdlib.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..219e65855b4516b16f9c29873bcd1afbdba084b3 GIT binary patch literal 22819 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 g^=GG{_n8+*4#qyizrp4I4?y3OGXMYp literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/strings.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/strings.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aae81ff96b434a2d3d4d031714dc1858faf0f1ca GIT binary patch literal 25396 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 EAJAwm9RL6T literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/threading_checker.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/threading_checker.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40d8305a2caf55f5780342a0cc91feda4c3b266d GIT binary patch literal 2061 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/unicode.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/unicode.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92681c631d19db5043879c7111ba44ddfc3b5f20 GIT binary patch literal 13678 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 Tp|nVgCjK2K6lz|vN}v1#;}l4q literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/utils.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0397398f4608b7c05edd7e28fb343a8ae3bdcf2 GIT binary patch literal 61810 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/variables.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/variables.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..473f7f9aa6f44a77fddec728e87b1e0161c29f9a GIT binary patch literal 76171 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 None: + self._mixin_class_rgx = self.linter.config.mixin_class_rgx + self._async_generators = ["contextlib.asynccontextmanager"] + + @checker_utils.only_required_for_messages("yield-inside-async-function") + def visit_asyncfunctiondef(self, node: nodes.AsyncFunctionDef) -> None: + for child in node.nodes_of_class(nodes.Yield): + if child.scope() is node and ( + sys.version_info[:2] == (3, 5) or isinstance(child, nodes.YieldFrom) + ): + self.add_message("yield-inside-async-function", node=child) + + @checker_utils.only_required_for_messages("not-async-context-manager") + def visit_asyncwith(self, node: nodes.AsyncWith) -> None: + for ctx_mgr, _ in node.items: + inferred = checker_utils.safe_infer(ctx_mgr) + if inferred is None or isinstance(inferred, util.UninferableBase): + continue + + if isinstance(inferred, nodes.AsyncFunctionDef): + # Check if we are dealing with a function decorated + # with contextlib.asynccontextmanager. + if decorated_with(inferred, self._async_generators): + continue + elif isinstance(inferred, astroid.bases.AsyncGenerator): + # Check if we are dealing with a function decorated + # with contextlib.asynccontextmanager. + if decorated_with(inferred.parent, self._async_generators): + continue + else: + try: + inferred.getattr("__aenter__") + inferred.getattr("__aexit__") + except astroid.exceptions.NotFoundError: + if isinstance(inferred, astroid.Instance): + # If we do not know the bases of this class, + # just skip it. + if not checker_utils.has_known_bases(inferred): + continue + # Ignore mixin classes if they match the rgx option. + if ( + "not-async-context-manager" + in self.linter.config.ignored_checks_for_mixins + and self._mixin_class_rgx.match(inferred.name) + ): + continue + else: + continue + self.add_message( + "not-async-context-manager", node=node, args=(inferred.name,) + ) + + +def register(linter: PyLinter) -> None: + linter.register_checker(AsyncChecker(linter)) diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/bad_chained_comparison.py b/venv/lib/python3.10/site-packages/pylint/checkers/bad_chained_comparison.py new file mode 100644 index 00000000..8c3aeb9c --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint/checkers/bad_chained_comparison.py @@ -0,0 +1,60 @@ +# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html +# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from astroid import nodes + +from pylint.checkers import BaseChecker +from pylint.interfaces import HIGH + +if TYPE_CHECKING: + from pylint.lint import PyLinter + +COMPARISON_OP = frozenset(("<", "<=", ">", ">=", "!=", "==")) +IDENTITY_OP = frozenset(("is", "is not")) +MEMBERSHIP_OP = frozenset(("in", "not in")) + + +class BadChainedComparisonChecker(BaseChecker): + """Checks for unintentional usage of chained comparison.""" + + name = "bad-chained-comparison" + msgs = { + "W3601": ( + "Suspicious %s-part chained comparison using semantically incompatible operators (%s)", + "bad-chained-comparison", + "Used when there is a chained comparison where one expression is part " + "of two comparisons that belong to different semantic groups " + '("<" does not mean the same thing as "is", chaining them in ' + '"0 < x is None" is probably a mistake).', + ) + } + + def _has_diff_semantic_groups(self, operators: list[str]) -> bool: + # Check if comparison operators are in the same semantic group + for semantic_group in (COMPARISON_OP, IDENTITY_OP, MEMBERSHIP_OP): + if operators[0] in semantic_group: + group = semantic_group + return not all(o in group for o in operators) + + def visit_compare(self, node: nodes.Compare) -> None: + operators = sorted({op[0] for op in node.ops}) + if self._has_diff_semantic_groups(operators): + num_parts = f"{len(node.ops)}" + incompatibles = ( + ", ".join(f"'{o}'" for o in operators[:-1]) + f" and '{operators[-1]}'" + ) + self.add_message( + "bad-chained-comparison", + node=node, + args=(num_parts, incompatibles), + confidence=HIGH, + ) + + +def register(linter: PyLinter) -> None: + linter.register_checker(BadChainedComparisonChecker(linter)) diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/base/__init__.py b/venv/lib/python3.10/site-packages/pylint/checkers/base/__init__.py new file mode 120000 index 00000000..1ceb70fe --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint/checkers/base/__init__.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/a2/4e/95/2796605a43050cabca9e3578551c56c242dc71ed8e8098db69c9b5f835 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/__init__.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c22b239678d48a95754747ca1581c7a15732452 GIT binary patch literal 1365 zcmah|&2G~`5cVdH<0Q_1`a{bB5P}-1F%?&YC?TR%i>XLZ>0VZ@y`)xm?P%>(iqsoC z2ylZ(;1#%V_LUQ_zy)TVCQYP5ZRy+jX2(0TGoQn9xtLWH<@>jBf8)=OTR*{Gc;x0& zMM2S5Fg(RWOyLM4qzn`<^BLg`__8d^RjeYpud*E1u$J06mghRwQ(I#NUc|-J&a)CX zu#wt2EAtAj@G7qI8m{p=uJZB(j}E#$a=6>yA-(?5emAM~0_T)=oQO_>D;+q7&G9$GAr+Urdf-H^GZ&z5 z2jlcpD5)%uC!L*cXK&Yj0S@Dt6Z!5%Rlw^h?+Ou$IcF#2Lr3^g7+gAQ&qKEt3%JD8 zmlrv>xF|}JXP`g2p2eB&r<- z)J5Q$KGK#6I#MEU!8lhwDls}&-lI<-l9Xi@SayM_3oN(5v?=ox7$~yMJgx~k@FS>? zxRVizGUOD71bHJ-l~9vV0f2ipVELkmC0KrA>m=mV5~CoX!s>3n-nBRPo#QR*j0R^G z^N+3JI6eu3NA0bLR^-QYbLhCI&VWX+A^TxnWR0w2P=ZB>ANVmL?cq4lr%BU%9F&7?@kyAgDl5+X9-O7es_j1iJ(@puTs6(#WEJCiEf z(<<7s3JJbD>xayYH~teyrK)D(vVHjemErD8ZnJ3FQ+)5rXfJf5REM)*ISPFH%HRNg zo>|=Wa>eGgr%Zd2s^A}4hamM?R;dwOx;R(Pb}|(?r&KI+unfLLf6PN~#OM>L_-GBl W(DaN^GBO5|?_FdR45R|9Wd8!W3~+k@ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/basic_checker.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/basic_checker.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b11936decb4e5ddce0058d1fc06e1831e377d3d GIT binary patch literal 26373 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 T_7&%5GC@^1`BHXl?BM?e{8m9e literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/basic_error_checker.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/basic_error_checker.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78e8c736c294a8e4fbc3d69db7561874b7473856 GIT binary patch literal 17721 zcmbV!dvILWdEefxvRZ!XyCFlx10_Xuc&T6l9UK6|EyL7ke&%T`qRP zb1z6@y~rpgJ(im&w&SF)#0eQYX_!tDx5*@#rcFC(n@&5KX)aX{{~^}@nnaZv7a^`V6=#VvB5uWwx#E)L86Kz-Z7_TqNj7u4XqT^#XtsG+-7 zaa3(7j;SZrh}v<_DehDU)h@Lgce~V6YM=t_bN9$?au1vf*Z_x?u;}>)st@%Gvih`P;NAuK{=>4 z8~!w&vzG!-mxHFpeez6W8NX7Ert*B;Y`N5!^|aThcvn1ssUEOxDX7-jHdvCEpEGYo zMXt)urEf2?lu6VOyenxxc8zn-sIv_Ajo@Gs#)?Tor8>{&02fA5R1}o#wnO!G_%v{Y`x7xt&dVUa16+zRT zEuMiW#Q*qFuxRG%0!?_aLu=kLDUgNfruOQ-H$9%##B!L#jA2UV3Db*Z5K$23tA4fN z2W8Mxn3)4T1c4q;>H_=c`5xJ7UvEdn!-O8guT^hqzPaE{>7_=)(^D7DT)8woak)Hm zeCn3hxHVO;&P**X2lLIwiOJ)~ru=H)O)QoxH_CIKkA^yyKNT^6KLvj9SX3(|j~r8q zSz~cI94P^wlEG~UlDz=HXHm$dtsyIIr5`!Tw3W4N%dv*OFV7jh3mrm-gI32jp~ujf zX*TQY$T5wPAWO^tEN*(q5%)=44oK7fvNdZ_Y~9PgY1L9~3j~;a%RZmDYkegVq`#a% ztD{n;6=O2p_PZ8HFx~pA4hiZd&#lh7Wmooep}g#R4dvdh2J@&hG>F{^JQClAv?t>_ zREHft+D|bN2}(Dj0_5i}dX>Oao6#Tf@|=4uf{aq@2Y~IUd$9~!bDQX|Z&!WK&|n{a zZJ?CmAGBooJ8?6YXeVCJg4L}z6E~6?jQ(}|CYV&nOp1qgXipvsQ$mH~mfnp~rj_Hv z{K)47_YaX z2nQ}MH7Zmm=OMDQ=eRE34G93H=4`3LsxVn@EQhJHluqDz!R;u97q=>Jw%Vw2f{6Xe z_v5yHf^U$1g8t!k&>cqye=CYYu3+V@f}MV^kQ%bH@9B@AGIR*QssUp%2CEO_R1c() zbHq5;5+nlazTHkd0KS!V!vX);t*@T+^WrVPgDjF?$=l~-v(14p8DLFB10<#lMw>v3~aV_GTz zO|Zw4VY2QubO!gu{Y#DN!eU+c)>BZp2AWdz?uV8>f^JoY61aszQMiJks)_*kes!u31XKD~5ZWXAGFzRYg2**?It!lZ8q)5GU~$XVUiqkU*!VJL;%=t6X35FgP0J zK5uHIFG#Sw;7wn(&4mFB$OzlJoqZZ{JwHGDK zT9l6|7v>pv3m|o=!|+xeL_8l)~vLCQk{HYtDjP*)Tg99C$*HSi!|F2T9mL&BY8rP#GVW!}^>y`%x*~nINZnP`{j~aw z`mEG#?bLlk{fK%^>V~DRs6Geien!2nJ}EL{l~SJ6jdbe% zftpkEQny3us_6F*)eTjbx>5Cy)S|ixSjVJQqxByvUj@>-Q|gvb_jBsDx+8VF)X%Fg zs5VCI#tK%{kKt~Q`lfnA{W$LSs$Wp|)R%C#PyM2LQ+)+@`_M&a;s{TZ$s`dHL_~7H)^N^~Pue2Ge<+>}1 zBc7!*E2g9Ij{&gmnh*$`d0Yt7vb$XMAZTGnLlL_(O|?8}U^@=j_FTBLSg%&9LCoyv z7Eio7WCXxOwSoWDpmpiPKqYFR0h!Z3zletjfR6%z-3KAU>QI7;avzEh%Yc>Yxd;8# zZL^Ugo#=3O>qHlZvKzO%QxR&WV&niPoiWkdPT*~02Q@r_z%_EOzD%spN})G}Eoe;e zq4j+C9mWWR?5s2!P)M*BZ+OeMn;L!!On7&R+tgeN{3=zLOclNDX}&EI+;N8(+|{uN zu~EZB+|atveRJ78V0s;JJ2oig{cLjyHflU&4-NpN(Qgq19|HuVugTuWz2o<+jtWgo ztb70YzV}O~zw7ItX&sD~Z|v#Fhoc2dWOZn?6(a*)9(SPI@Z~;W)+58r+jS4uV~4(D z_f1`L>7dFz>`l&18jIhDTjd^DyJmlUvY1~e-?`;!9~RlT{dN)xLO+kfaM8zs<|hED z3+Ix&+GsW=VDtI`dTFwr_aQeq>+8#U$gCTb!<)=KRT#l4Qh2yZ1GLVD4>l_wrOm6U5uAOAMr$H z{*IX$M`*6Yp(9_FP5Va1t)Ls6+4~kO;nicuKguOkF3>f@aBgVR$QxM%xDVvH#?3qm zxwX)|WwxFH1eslN>lG;q(IlaYO5{zFm#V?)2qv$4zCXbs6CgnmWWRbD;>?dt?Pdc4 zZ@!GVv2K|<0tzlL2yNM|upaK3E8f~Be(=$*mnndBgp=<=FnO>t33S)G$BIRTk(~Sr z=$;5=4I!jTqID^(be#HN@+HJg&<;?*E);zlf}CmuQ5$j~2@>v8b*@3Le05jQY)&k| zl>(QPH8?Ns=eOoBEL6cxT|J74DYO?p;0?Ze`1(igTpyP=^}cM2v!t+ z1U>c3(^n&SyAZmlK`6ytSOW9G+Yy;W_m?ajfQh`-{nZB4VpW+Xbcarup{dy z`Y;02QxVbe>R_xpO$0#%CKc1u=YU?4;|AyzD(S;PGn?>lxVR`7?!K=79q7n_>I6X~l%FipUF%ZDOPUfmuKpwfyOTd(&)Kq|i;ce@^2 z4qY`BO${Ax=8mS0<@P3YMuqcKy!?)sHf90E7sbj9qy^mP)tzy_iKt~FYH5AG57KfM zJ-5obTAqQvq1q5!#3BQ_sf-ArGVi3ignMH5J z>6$&GpIR@|*>5&h_p!%>^oX{U`YmpTAnoO6fJ_nrl6vNawio*7oi;`%9QSQJ5y{>|%Ry!FWX@R)Q4lL1WCm&cg zqK8OZn3fb;9%Dk|}k7GZS(KFmbAVcapedKIIKgK@tK%=#d7pu`u}Y_k3wI{r6Y62x$<0{#u*LYVc9 ztks%WkHhzYLZ2nfpw`4{!Njr7h%W6zWD?CCL>BRY5EYQQ3rGQ?qWdl)YmNe%8HBfp zNEk-IF4K=~LRl$;S^-H<5;#IQo(VHX`T1Qe>mNl6(sfE9 zkmvhIX=nl`_(24m}o@vu0dy5FeGOB{5d8NyyjEeY+%)P5IEgtIgeWV*W0Zh(%_ zmx#>)v4^D1uI1a-Qo{cz(s23v17KE5e-cP82$ECW4EE!NoX2U2O3<#N%^AVFkqxn# zYM#FK&s|uyPJ@H!9uWh69>&+MBMYgF~%o14kexBUdyoy2;w`|s4YAB z*k(H!jn*H>Nc}8}PqDbb;uwm){bXR7m+WUAl7K>zShsjbVTn6NcJEsLV?h$q1vUO- zXhV+be)>T|?@`v`Ua|_sD)u%LWNSHGd0YdtlEo5v#lEki9Xp9=Fz)UTqUJRAc1U3^ zmFC_y#u$IR2dZG^3$kqsBawJc^7*cXaqJJeF#W5E6(`uL_}<~#u$0^8?7Q|#D%f5d zxxb^Gdcf%P&XsgKT`RO5Bzae4hC*9vX02dU4Zh_d*HS}`!(JzGFHAf%9j1*V7G`5- zQ9ll3h1ocmWROe-Ul%Q>xVai<93(51qV}vMdh$`o>(tN^Jr%TF-nqpcyJ*{;Es6U>pgOJCJ;Sm>0_eZezt89}9O!dOJ1= zOR$_v##{>b#ceRDO0=g+VueM`5-2yTI*e6mZw}l|4T!jA2`1EB-BVS6u^d$9OEG#i zb~I7Up}QdreF)D+M5IkzNFQX)Q!I|NZvlNf!5`lLrbX=d#R4XRWdhd>CSRDtlR0RB zyj^ZpA^vzolqWL5CPoOla!cD5i)EGFcwEuk?FP z#<8|C!)>K)LyTz>CydGTBjm*XZ)@s9qNtBFNtPYbd=n39P>2)xvU`QE@Nf}`6ShpU zZBB7egJnUSPLQgl4bf6}kwAS{`#H;0a1lLL5WmivZJ|AKu%zgade< zht`6jcbu>gJz)uXK(W1r=5^%kQxXeFT;>jPu7cG%z4`7$@bpOaF7tj<+N>)9w zR=vFmGXW+9*s_*bqu!7^zl$MY0CJ@M67MbjRo-`)QB$+M0*$^w$UlajU=1;-^`BgGE1NKMKh7&#?Xi3ao@&Ec^`DOg7`ESV7oj zW5@IQ3%qZ$SV0jck^k;t`fP_7Nb_Mq{CXexc?2~Kqo=z{sF>?0DKfdCB0n66I2qv= z-v~GY4dX%NjNn&z`W9+0ks`Rxp=35`!xa?He&l4KT)^ArX(%&7H|FSvLAU-SCXF3K zqow=!n*>8+3I(pZ11!LtM#(7AI^AM(HHN_ki zhOr5*^X?i8*|^T`#jcyt;vTU;X)|KX{7oG;(_Qn7QhaJs(qikDMqc33glxO!J(nP4 z1rKOfq%R~*REqLvV)SeX@PIKHq<4)BK@1Mrt$pivrKjiW79(;5%8Sq$n?kC85%U?6 zzt6jkkhY~~W|Cfmjp)fYg@#*t8< zaVSC~>_?^nHiSEl8$~Z<1V-~*;QK_4;;w_}wkd%6pP&`txG*KD7yS^A8v+n*p7gra zdHbeYXJ$Kt*;Yk)`#ib34vLt@x;qDS#341NPD(iTwJA<=kqO$=t%P%jk1A=T%rjsMcR5;3l?>R1k zCRhqJMnjIE-mcMiO~50b!0(i@$M}r632LSwbJCPK?4g{Igi2BOt2E*tYp(H3>!ZdJ zfSa>n&i2R=Ni-mh3VTdaxBg_yJ~E+SBW}2)x5>r&%P6K1sIo!7Be)MU(!ZgMmy?MW zOfRgCz{V_f#&r(dh)JV(#uAa#T>K&sEa&g?4otO2@F1++cJ^-^ShKB7qZ!fIm{B`A z={R9aA{^UouLPVIX(GZO7lkXA@_n0}lp9FcZ%i$$jjgBY!{p0J0U*@+8k4o9i$(i>z~Ec zyxU|!%m-C+%t4sb)05ExH?V;BV1jk4>qxL?&`JrW$Ee#8CEtY=*-SHv*0y)y8xNJ- z3H>dKB?TIbF61vx^?L7(Wpj8$4(l+N%M&NyWNLIdpyRGNR5Pj15Di#cLbQ0~R^cNR z1Y@S*^=)Mf168s9FhQCPG`0Q?di{4|iT>dbh=lRHAt%3@ebhR*DLM37cB^|MnHe7` zj6c;n%WnbnPh#Fa=|EN8!Q$8OVAL%H=_k55&6rN~81M;&4HY~Fo`zrrwwd)bxg}7N zK7j1O-l#T<=jUZa4&44ccLsg)Qk$p^_|IdH3f=VHO-G)Q+ko6KHkQdR9qZj6oEqS% zBsmdf4o1Qh<#89W3e73WY4IwAUX7DMb839BD4!=Fh!IJG9#Jxk4)TG8*{!Geco0P~ ze@!o6G$$y+oE)X#Ay<5P5xWB~v+H#faq3lU0peM{tXeA)ehm$O$sKlaQ*gGC`K@i( zX&xTWBWz|rf*^Qr$g$rT*)WIQ5dmVzhdC$^Zx&zk;iOMjTXrHz7rS4J^ldw%*I8WW zXdM3);6b7f0W{-muYgsQ!*ov#dbF0@1;c=LXy4Y;K3qc>ua;z=?wm5q_TE`*Bhk2TNAr$!#>F)|RBl&7t~_Szz*95z z1G@<6DCdl3=+xJcE`v(^Hs9aMw4M7qMV+Q!O*C>&BG|S3+f;#8;y$$TCOgsH0 zh$JxC&Xo*svb&A2<4U%j)!)TBvj|x3!F#^j&feb(Rk;t)d>8D7*>CFJ)nSLuu!V@1k!$kBJR+_R$d5Je$ucL*+z&b`W}e>O3#Vk z&S~fP_%oH}qzSWBDD2`NY8gt9t0W~dj%3-km@lb1Iq5Bs!&c2RMiMQJuu=JMnnTVpf``OsK zkF42Fx$vK&7rX%L>ObmS$pTQzn4hZ`w)hG6#q?W=pi5{jdh_A3|8U$}T_`pntO7ib#2`11LyvSR&T*lb^#4V?h?l>R-=|2r&xm&I4unmLEh z_AotEAVgD`#4*ug3IY?|Yiv*90GW3u%zu_&^N9M#XL{vX4;epL&c*Dd=(AP*N9?`x z+H0S_H2p&9;>%ZFJ#*!J>B@zRrB|lUymUcd<{MvPpY3XCVF4$cqT^*qBhK9kQwvNQ zifqI-DdtI>_ePw&L&5LZdDw?T$)O}&@~uzR?-P)Y^%uJfH*9;L+A3)P<-G`@KSv-yP*K5=kjB8{k5|oBdDkV>a|c&+}sv zll~#V2u&tR>?jx0Tl*?2exy@Nw=wSf`A%)`3^N9 zUEeBXZNIT$?LXhJ_P6_M(*`@g&suVp{+Ipj5%#3L7kl#Ff79PL-F4c`tZUk%xoG_M ztRaHnk6A00#u^CHhQ_5<-ufr~;~(SE3Ci_2kO z+JE4@X#bw`lKorG75g`wSM7(+>-M+oN;Jy0|0ey-d_9Yh8u&QJw-l1u0{C>;^yrk| zFXWuZVd(A7?!_@X^v}Wv%;Vzk-YcKaj+!3%O#V>b$rpxpXs!n=SHLgbCG0Jxb~kIg zq|(ctN7*FA*jw9WM5)~uW=bX1tdvUpTM_0s7AVB#*e{?6w;oFo627@kvNmo0 zmV~C3)I3WleqnJa{__S=a~dthE#}VzOjgVvvhWRo9avL4IfFkQzyg0fAnK`UtrmBz z?I?dALxM2H;iyd#WV2=1_!6Si{{aJGy6a}kYcNb262d=cv5Un=SWL0_7z-kJBT5Rh oC(R$vI7QpXKa9e03UuLlT2e}$3o}ny+Vjc$j{I0YH?sZz14X@yQ2+n{ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/comparison_checker.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/comparison_checker.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03d96bebbae7188f60b9ef6265d389c99a7c2276 GIT binary patch literal 9696 zcmbVS%WoVKu&vIAXqHdw(|R`dtQ?4 zY?e}2SASjgRn=F&?^QkFqWXI^f;Zyv`J%u0f%ze!{&e@7mneM!}6mD(1!jHnh zZftmsJD#wcBHXg$4bNV4BfrrnSAUJ!E47N67(vLrh$`*aZ&78kevO(gr3^sO-@f_Q z+ZFSWEi4?e=N1mtD~IZ0hh16du*HRno-jW;H2ug9!dRGKD{?40lWT3i75hO{jrX>_ zL~ppQR$>Y-Zi}Fy((u_I)k)+_xS}&CVx_CZ>L%M~;dHEZl}&vg(!GNx)QzHowX)8o zn-P|UQC*uj+q-_eVS9JoM%>!7FWTE-+LNsi0wCiO+!`8q~J%GSL_B2 zPcV=YeTgQgwY(tF(L745JKo-IC^+OHifHkrB1*U&^7)N$%bOSNAn?TejjOkB*5=-I z*DlWQc)`wm%U_${-itTF;8OMCg?Y@to7;99cieR^!i$z4#Piv{MDy4WZ@w|uuzL2Q zy1kc_>V8xY1Fw#`)UlE}t&ql#XtrmVIDuOO*Vx|#p5DY2UB)s!1&CA}##Kk-jB8xy z1~++bUG-Jq$l`fk;1h(WpXMArKgC}LmW)l4Ps{Qs${e5ZEPjlangxEGpSWi@`Tw)s z6Z|CF75FL1<+S8N98CTse+tN*;6s|upXSeiRve=}%Wcpm$7s*-GoVd*NA6Ga=dqHr z{2YIQm-+dF+*rE`fAJo$0-YHh0jbS}54~o3nwb^_CZt?hSVJvR(G>ZVP*1!Cn<@uRJ?^UUplN zSGL`N4{0@QdO2ga7ji&547kKG7@;1;_8DS+#uoniMqIXcH$36V@t_5Pz2@2Fg#{Yr zIayvQ&q{8#UA`g-i)9XKsIwj*>pbmF!DGp0b>Qw-EHAT5jfh= z>a-bN$Ki-zcidLni|m$v$CL7$wWSnkO(eQ%=M}I-_r7+Yuh_zc@e?o=7=jEDNVI{j ze2_Xn>9qc%($EK3`c1t2m6 zpa}+A_jf#-`^_fW!`?xh?N%IBoqX8h^}yYNoo9~m(S?hD@=E6vXmgKUcSY-5yBXN! za}hv7^QT(6P1)uJ>jX?PpfUC$_5`3z)<11|p4wLqXR7hyTf7#x^RHZ>k@QIO`giVM# z-Ib{GA0Lrg#k*l&p6Hxe3f!S}(p|a`a7YU#jAeMC2@l7q+8>hc%J+TlfS7>9up?-? zhW@sPfPt8V;Ne1$uq<04hRbvXGOXG+0~j*5<#&i(Sz1Hcu$&n}>C8#Tz?85gywBPg zhi6-xY1PZsOC+|}GqHhHU#6Hdyku&P}vS}h77!Wk1kxD(d&Ak|_r|1K4BuNcoE-BREJYX@v%;hkkDVDd$XxmYH z9q|Co3;hWvqqDPjN!MxK75(%RKF-?p`K!&gbgni6w&D(Hy{IE@k6(`~R52pe* z7*)C3Lri|Bk*&EknE#=94cc4VdsU*+ZZ=z?8=o(OcezrnrzkWjNxO^H)?s1m?powggf@v~ z)fxuM{vS~axR!85zd;cz_tma?fLN`IxUtI^>lr;Wn38k``pGT>UCro-idK{~D*7qw z<+=tpb`T3K*SEGJEL7e|H zty^p|KK+G8Sp=e#qc9y5q1%3wd}VcB0i-^`vO1YzBMrCmdb2wDXU$R6egoqhDS8_tb z&6z=vJeWjX8mGia0cMhicH<=Pq6wmyVBI;2)-)?>n1)ozgv)t7Q})VaqLU35Hdu@2 zs5nE#^C+DBU>IjYn#&Zr&Qk+Axc03;9ZAU6cFS{)Wr_|rjgdieW6zlxu71$)=m>3l zLm)43jtw+n_%1078Om%VEskS`$&+dNFeZ=wgjUfYdIv=zKcyDbDOG0$X6aCp2L-L5 zTAI!*wWzWOOtUnUs`&u#R7*99_P{jE-&jYBs{TONn99@{weWRkZfUSyi9)!{@0h`u z^5!uU$`WZ0qkl%h)mYg?5*;%nCP-B7=|3K)A#ni>Dd4c(50xLPPzNaMy<*RRf~xy! z&+MAf9O`UejpjJgM4pFo>*5kG;BJbme4?9!G8Lh=npCUFpBX(Xm>AI2Q931_QVl1d zhH3i=sG)^%k4QD7M0C0)Ucefpk$NPnweV(zmdR0c%EP=?oEyz+#W^_?JB94_zImW< z?G7W_{T%9`-nVeqiT07gjTHr@xuWPwoZq{sD)jGTN!f*J)Wj4`hZ5aHgSqZZ4bpIF z!&jFp1#yI$ka~-0DvnY?nkC985~CHu2_=>vAdZ9sc1+~7l)_J4?Pmlxgb2l#YPxhv zOh=$NNy)1m3n6Fl*LWEbZ>FABORS`t%mmm7TAjsj1ra)qXjJt|D};-V7OP{d9}zbp zN{agxR7Qk-65`e9070B2>ZXpv1!EsiREMc$JA@StyQ$X_4K8m{+80B*z=Q?cjuvcf zFT?H(1efFovPdjSlqkARbjo28y(a5K5iesV59_KFkmOAQ`Wv)}2q-6@nb0!zj}*&* z;Ui+9jXp-B&}RP#0@zo#b3an)zM_1o*3$XWOuuB}5^mykD&)3GW2!#~S)M>l ztDW!tQF{j_iPC{7M|gJ@+&UAm(i>Gj!i)1ARw;{TY3Oq(Dn@!VW7c5zYi}hwxdu_8 z*DuoRym*P~HWlOMS}cO*SYTPFn8PV%fdq{3-B`?02f4Nds>uZ&&ukZU85(jr;FIT3 zrCh0a+O#y<9i8FAzmw_-)CTsj{0E97$z?f+RGkLltpC@yi%TFxe}@8CRp}TEmxfDk zYWu7Q9QX9>4Pp32s&ATcZl6WZP>r)Tq(TRR*&8d)$Ax&JsiU{v)uU=x6RWU*#RH{h zaIH(B&+A<8nOy7T0vr>eW>Qdee-Z(TdBA!W^aKZ!u&gF1R#We?_z1VYpuDY(v`-F>~2zkJ8$}&0>#So zh<@tt`ca(d*ZoGEXe(Zv7)z8JNed^gQcq)T5Ai^vftYAGnM(|5v?RomobceU5quKX z1jU|xz|r=|&2y%q6=^h(?WtpdBI6LmCP5>F@oc1#Ed?RY3=$f*RYznC{MY4!QzRZj z>Q@*$Q%(P_hfE!arydU*j#C*-v*AXd`VW{?^eT!Ix(*|90x&J97Tmf8sG0-NW-c7g zUH(5!(`Di;>RP{!2;D$W4W$;$WUWlJdNpe$>u8met#aUt)-dX~x(rTT>*})9exkss z8-Oh0_^#SDnkqM>yN1sszgfw3{&fIVLQd>ADS1UCoa#OzXLmeLPfz%8$Y)qVVaU z3k|;QM$v#EUA%PmhpH`}g6O5$tX1-fPG&FB!tH3N5aMlWLH=F*DHWHgkcQMu4XMpxnu5(Cyl8#;6nC;Q+G*L^tadhE92uobTF{U=6}X4FLZN&kSy z2c~8XY9^3cBFug>`T^siuo9fc*^a@GAV^S@FkC|=g<-4$YHSmBGn$~J2~?c|Dy{*D zu&DrF`u6nLTeN_sL@*`+#5T>Y4p^E^EzSW-@{%BB3uha2vXZUD9tfyf8}6le8k2{CquofY+;t*Y;(a0v!jE(}KOmYkP;y_Tl`@9A zDQ?qy3W&ri6>_hJ8`e)526G>=C%;Ae=rjtGk<**X%GBW@RZt6GeMbuLIF4i6MXrv% zqsi_1B`UOC(q52-Ap4;1sA7^rc-o*?-!z(VeQ0G4T4Ixs&FgSs6!`1Vb9P<%)b8ct z+0|i{K#}o7|LXN-7@D`guiAD`|K(v7CJdxb8KRoC~iN`rMhg7UJmiJ^9Tbg|0??3X$9N>S&FB(GJIf(#x%@g&oSs!ncI9*F3&Y&Fq2wt z()v{F6#tIt%9v^U1>Pbr1bPlsm1^?TOV;3XGaB@SYB9VY(j55VJDPZ!5JvhVeX~JE z@Xw)9FmoE$5CFakyyxIg$zvh~zr#{Phq{TkH^`d~-sX0Yg_0S>TMKVLz&!HQ^I%j{ z@*|n3JW3jV8kRvFKCC{E)hrThM*_S-(3kdk+#>~oNMgy%iw{vGPi1>J@-?GA_=+RG zPwixiEA6E;q;o{OMnw$;QVp3)NSMj@gtf$w?(bp1Ozz)*s6edC9%BXdY*QV~yq3PXqk1$_Dx z&tNlX6A`21IFfu-X1eHJVX67Tf~8(Rv-eN-afxt)Xkk;9FhEKwFs zaFT9?vbXg3cM}J|Jp=MF$dSMu%yi{3OPssIqLTFd_(Tp#F2t6U;eza^%YG*MnOVPu zu1Uu;)DLY*`Si^^#S-A3L%UpDK%}uCIVziQGjJbuhfUB6MMCM&7QwH~JnQr1phMu#+>Q%FNYSq_ z7A3z+WGBXv@X$bFTf9RxTJ4AghVXv^FX$j!{$$8f5Jlx#jxsPflHbX?f#;n0@9Z`G z_c)jR1_!NQ>pJ_28SMAWEZ~PX-$I`QuLpE7R`{m$eCf&3jQ&KH-K9C6%6@kuUpmEd zeZCBQb;)rDov$LUkwlUmqqfq@3DPo6SZZfh;)+YI zXSlMpSOG=tV{+;(NCD}Rw&z}o{u4!S1#d-9Zm&JbP1N^>OKBy?LAluB%$u+G-n@_B zFc}_p3{BJi^zZM-fB5U~ul^J2rydHew>3?de})RvJdNp$M0$&OM8~=j8J?lu)T8Qc zdM3PSWVS5NQe(`h)UrKW)vc)9ay&=XOVLoP;#E}Lj)q$!-bicI8*Np+s;+U`9Ao8e zQ@jhSInj7)!kf^w*ix;@yv2?EDK>PVd(&)^RoU1h>doBL*f^Vbq_GKJd1!dE%($!7 zrnnHv$>f3-ZEal)t8DLqQxTX^@6VEZ3lI#tGvR zDoz-uTr`5ZYMGrhjF3F+zl-ZE=d0I@tQtx`+2JBe0_MxKvyn{zr7e;+7wN9gc*J3y zYgA-41~mL|yW!pHXDva7i(nH%wGE4BZBjQ5`)Bpq4l9<Bu}p)w&IPK$Gne5A(#!zHGjk`1I=n{2FitDOa`~zL zQ4_O3Ijk>kB`v-vI&sX!;_5r=x7Oxw2OCR^J3QW5jKYn@_HMeB#8(%VE-y;Z>wG(? zZwH%PLPrEAyVy4mxd>*#7mqja`}BqOZuVTxsn0qw<3h<4q+nbdos^#kF61;6gjV#5 zZt3L6F{nm(ZY;>Sq{gQ%jj&X_}0Uk2-C2bHk&1Tpvn`7tlc7uSwzRI3wFM#)0ytHq_ zF64l)*VuV>;SqhPdu2r(QqxSJ-4%LBRVzExZB%1Olh zIB0=GgEl_8yma+ScLHehXBnBj6G|}7%{~(+iyzLm@}Bvey#eOeo@QQg7$+yw7u;M8 z`DD}ucy#Itey4niO6VgWf^zPz-w)Ez6fJnrny6#V5XIqo=|DaNXfXK|O$LiL?t z4xHyiqxq;-N2Vah&S~ztFBKdV$1`v)C+wUn*eOO0aFh({tLPtC)mRcoG>>pHXmRh-Q*A2UHe*Ix!$d> z^UY2a2p7nLgM}n9SZi3{a^;pXxFn8t-ByqSWl*AAlgjWQ5e4aYvze6`Zv>qv&1kyY z=2;2MJ=h6EMz?s>?oJ-7cfJ+I^AV3X)2+ux@MH$WwXS&$%In>a?|@2Lofar4=59X9 zZGiI>jLAjC7MD3og$*9BE-#@}0y2^dDFi$X43s}WPgxM75WX_{RBFLAgXv`%LtGUq zJ*}xVA$c4?GQl)a)7KzjS{Q#J0hkc{Q|XO^DtYQdj7{pD7KbhdX_iVJHB_w6i#fF= z|n3X#zuu{!) z0>=M-5+dRUFkNkPmc_~rq_xz~Cnqo}XO(oHe~Q(?k%uFvQ~R^|#hr7#HpxDu;U+zR zG}6(;L{HlXNOmGcA&IFDx@L)2U}|R7leiIXW?=9q68UKGrm|c>9uOhL0t&c@1?Jm< zGZ@L)R%?QxO6Zjq6w{=t)1&T-&k(a1e>j#4dgBDLoRSrn!oNBjz>ME6>!Y5&Zyso3 zjOj6?&pna?0C}j(7t>PzZR1;Zm;1m}fjw^&Lb$&jC--9?F_skQ zb6)w@+Ktuq)wShSZ|u10-+1TN?GM*iy)wc#d>GWcq}*LLWy9>4`95!4h34WMaU8Szp)JRH8rOR)yEC{ zh!XPkv{lgwpgh2NM-&hr`8DD_=V;mh`zQ1t-3!m~fPt+($jayiKJt8cxexn4zNmcU z;wATDF%;|h8K{~P`{E~J1eg@ppvdS(l0-_g^bD}@TZcaiA{q(aQ z)SJ`H1~2}s&mT(lTUOpH$Kaug+b@^{Ey9NO%D~@DuMGZ7S>trYH{~)bb>grNtBU8b=LIZYgra}{QU)fzhXftK)guJc{9rjOsL?Usb(m%XUB9C_hX&^|&ehyYd4Hok% zgRlV2o$adllLs8S3P3EQ%Rv;02^gMH^qi~&yNM)Z-q5=V%)gTdOmhPpo_(vhbgD2n z6fg#HPD;2NA|erCyXNG9Wfi5t`=|1?TnRI{i;0rRtlSD7D50cSM=}64wal4Nqk`7& zV1UF?8C4+09+t9pe{!_jABS{8ItvEMQrKgG9_GE<#bGxloso@Dz3FTd8lJraD6D<_1!gf{r7SxQR3jz2d#o zbE=u`tIL<~XO7XPK?0|)tBdc-xr8wGa@*AHrbWpF0}HG zDOUcOBbRS9Z!8qwJaX+_I73~)ER982FTR2ZOc&nN*@5a?SPljhEI@#eRUq}^l?XqY zfR{sVgB!G{-~wZL!{-lD9^)8@IQ68}4kIppi7eyS5+(S6?;Pttv#;fF`Z@+L=|Vwi Z1$2*o1c?~``lRlFzf_20IL74I{{U7Xy{G^H literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/pass_checker.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/base/__pycache__/pass_checker.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..492b9809a8ebc2ef506b87b36f89558003e91a53 GIT binary patch literal 1112 zcmZ8g&2G~`5cb;ZpC)N3RaK#$Ot}yV;#5e$0ii+*2!x`Fsv!Bm%JFU*r}jGC-2^4- zExqy%?GXtcg4eLbiBn&pLX_G3w4p1_=-Zj`{Cqpk7Z*#GVHn?k-GA_7=i|@cfd4xf zZd)MoDJW`Clo}Zd5z^R9&CCj|F}6~i*`bY$HwMMjJ~61x?2#2Z)Y&tt?m2vIR8e8` zoHD6FPbH}ai{xb_lX$z$;zK549XEe$xNL#Q$Do)IB5H&tMWIDaY9%Pd%szD}K0{E? z?ReCoZVOY7E}Y;I3Kysg)k{TrHG`0`@8ckO$qvktfRC8PeAHsgNeZ)nrTTqV_xlpjaj zZ!$mX=Lv;asLptt_qbw$(VB2z=mKlb3P&*26TA_dV4EF{^$Tr-$akQWaf~|X)I3IK zXoM&_#PW`^v`yiT4dS%SktyzKOUD)Wjt$@pqN(-O)bF@=B~{!wN04#cLlp@ZaCM=u zQpO9X8wnsQT#DOCN{M7gJ!qR1r9>tixCAV8YlXL+!qhvgRg_=%c&w6~!zJ`+9uqxP zSdJ(qndbR`Rm}oRmbS*Fz8PW}GF*HP+IhwTp~)4&s}~>MHXgo@nwvqN@qUmd&7eC_ z?VLZVZPo*sCl*opczRP=vN?9Q>{BFN`2^A5p7= (3, 8): + from typing import Literal +else: + from typing_extensions import Literal + + +class _BasicChecker(BaseChecker): + """Permits separating multiple checks with the same checker name into + classes/file. + """ + + name = "basic" + + +REVERSED_PROTOCOL_METHOD = "__reversed__" +SEQUENCE_PROTOCOL_METHODS = ("__getitem__", "__len__") +REVERSED_METHODS = (SEQUENCE_PROTOCOL_METHODS, (REVERSED_PROTOCOL_METHOD,)) +# A mapping from qname -> symbol, to be used when generating messages +# about dangerous default values as arguments +DEFAULT_ARGUMENT_SYMBOLS = dict( + zip( + [".".join(["builtins", x]) for x in ("set", "dict", "list")], + ["set()", "{}", "[]"], + ), + **{ + x: f"{x}()" + for x in ( + "collections.deque", + "collections.ChainMap", + "collections.Counter", + "collections.OrderedDict", + "collections.defaultdict", + "collections.UserDict", + "collections.UserList", + ) + }, +) + + +def report_by_type_stats( + sect: reporter_nodes.Section, + stats: LinterStats, + old_stats: LinterStats | None, +) -> None: + """Make a report of. + + * percentage of different types documented + * percentage of different types with a bad name + """ + # percentage of different types documented and/or with a bad name + nice_stats: dict[str, dict[str, str]] = {} + for node_type in ("module", "class", "method", "function"): + node_type = cast(Literal["function", "class", "method", "module"], node_type) + total = stats.get_node_count(node_type) + nice_stats[node_type] = {} + if total != 0: + undocumented_node = stats.get_undocumented(node_type) + documented = total - undocumented_node + percent = (documented * 100.0) / total + nice_stats[node_type]["percent_documented"] = f"{percent:.2f}" + badname_node = stats.get_bad_names(node_type) + percent = (badname_node * 100.0) / total + nice_stats[node_type]["percent_badname"] = f"{percent:.2f}" + lines = ["type", "number", "old number", "difference", "%documented", "%badname"] + for node_type in ("module", "class", "method", "function"): + node_type = cast(Literal["function", "class", "method", "module"], node_type) + new = stats.get_node_count(node_type) + old = old_stats.get_node_count(node_type) if old_stats else None + diff_str = lint_utils.diff_string(old, new) if old else None + lines += [ + node_type, + str(new), + str(old) if old else "NC", + diff_str if diff_str else "NC", + nice_stats[node_type].get("percent_documented", "0"), + nice_stats[node_type].get("percent_badname", "0"), + ] + sect.append(reporter_nodes.Table(children=lines, cols=6, rheaders=1)) + + +# pylint: disable-next = too-many-public-methods +class BasicChecker(_BasicChecker): + """Basic checker. + + Checks for : + * doc strings + * number of arguments, local variables, branches, returns and statements in + functions, methods + * required module attributes + * dangerous default values as arguments + * redefinition of function / method / class + * uses of the global statement + """ + + name = "basic" + msgs = { + "W0101": ( + "Unreachable code", + "unreachable", + 'Used when there is some code behind a "return" or "raise" ' + "statement, which will never be accessed.", + ), + "W0102": ( + "Dangerous default value %s as argument", + "dangerous-default-value", + "Used when a mutable value as list or dictionary is detected in " + "a default value for an argument.", + ), + "W0104": ( + "Statement seems to have no effect", + "pointless-statement", + "Used when a statement doesn't have (or at least seems to) any effect.", + ), + "W0105": ( + "String statement has no effect", + "pointless-string-statement", + "Used when a string is used as a statement (which of course " + "has no effect). This is a particular case of W0104 with its " + "own message so you can easily disable it if you're using " + "those strings as documentation, instead of comments.", + ), + "W0106": ( + 'Expression "%s" is assigned to nothing', + "expression-not-assigned", + "Used when an expression that is not a function call is assigned " + "to nothing. Probably something else was intended.", + ), + "W0108": ( + "Lambda may not be necessary", + "unnecessary-lambda", + "Used when the body of a lambda expression is a function call " + "on the same argument list as the lambda itself; such lambda " + "expressions are in all but a few cases replaceable with the " + "function being called in the body of the lambda.", + ), + "W0109": ( + "Duplicate key %r in dictionary", + "duplicate-key", + "Used when a dictionary expression binds the same key multiple times.", + ), + "W0122": ( + "Use of exec", + "exec-used", + "Raised when the 'exec' statement is used. It's dangerous to use this " + "function for a user input, and it's also slower than actual code in " + "general. This doesn't mean you should never use it, but you should " + "consider alternatives first and restrict the functions available.", + ), + "W0123": ( + "Use of eval", + "eval-used", + 'Used when you use the "eval" function, to discourage its ' + "usage. Consider using `ast.literal_eval` for safely evaluating " + "strings containing Python expressions " + "from untrusted sources.", + ), + "W0150": ( + "%s statement in finally block may swallow exception", + "lost-exception", + "Used when a break or a return statement is found inside the " + "finally clause of a try...finally block: the exceptions raised " + "in the try clause will be silently swallowed instead of being " + "re-raised.", + ), + "W0199": ( + "Assert called on a populated tuple. Did you mean 'assert x,y'?", + "assert-on-tuple", + "A call of assert on a tuple will always evaluate to true if " + "the tuple is not empty, and will always evaluate to false if " + "it is.", + ), + "W0124": ( + 'Following "as" with another context manager looks like a tuple.', + "confusing-with-statement", + "Emitted when a `with` statement component returns multiple values " + "and uses name binding with `as` only for a part of those values, " + "as in with ctx() as a, b. This can be misleading, since it's not " + "clear if the context manager returns a tuple or if the node without " + "a name binding is another context manager.", + ), + "W0125": ( + "Using a conditional statement with a constant value", + "using-constant-test", + "Emitted when a conditional statement (If or ternary if) " + "uses a constant value for its test. This might not be what " + "the user intended to do.", + ), + "W0126": ( + "Using a conditional statement with potentially wrong function or method call due to " + "missing parentheses", + "missing-parentheses-for-call-in-test", + "Emitted when a conditional statement (If or ternary if) " + "seems to wrongly call a function due to missing parentheses", + ), + "W0127": ( + "Assigning the same variable %r to itself", + "self-assigning-variable", + "Emitted when we detect that a variable is assigned to itself", + ), + "W0128": ( + "Redeclared variable %r in assignment", + "redeclared-assigned-name", + "Emitted when we detect that a variable was redeclared in the same assignment.", + ), + "E0111": ( + "The first reversed() argument is not a sequence", + "bad-reversed-sequence", + "Used when the first argument to reversed() builtin " + "isn't a sequence (does not implement __reversed__, " + "nor __getitem__ and __len__", + ), + "E0119": ( + "format function is not called on str", + "misplaced-format-function", + "Emitted when format function is not called on str object. " + 'e.g doing print("value: {}").format(123) instead of ' + 'print("value: {}".format(123)). This might not be what the user ' + "intended to do.", + ), + "W0129": ( + "Assert statement has a string literal as its first argument. The assert will %s fail.", + "assert-on-string-literal", + "Used when an assert statement has a string literal as its first argument, which will " + "cause the assert to always pass.", + ), + "W0130": ( + "Duplicate value %r in set", + "duplicate-value", + "This message is emitted when a set contains the same value two or more times.", + ), + "W0131": ( + "Named expression used without context", + "named-expr-without-context", + "Emitted if named expression is used to do a regular assignment " + "outside a context like if, for, while, or a comprehension.", + ), + "W0133": ( + "Exception statement has no effect", + "pointless-exception-statement", + "Used when an exception is created without being assigned, raised or returned " + "for subsequent use elsewhere.", + ), + } + + reports = (("RP0101", "Statistics by type", report_by_type_stats),) + + def __init__(self, linter: PyLinter) -> None: + super().__init__(linter) + self._tryfinallys: list[nodes.TryFinally] | None = None + + def open(self) -> None: + """Initialize visit variables and statistics.""" + py_version = self.linter.config.py_version + self._py38_plus = py_version >= (3, 8) + self._tryfinallys = [] + self.linter.stats.reset_node_count() + + @utils.only_required_for_messages( + "using-constant-test", "missing-parentheses-for-call-in-test" + ) + def visit_if(self, node: nodes.If) -> None: + self._check_using_constant_test(node, node.test) + + @utils.only_required_for_messages( + "using-constant-test", "missing-parentheses-for-call-in-test" + ) + def visit_ifexp(self, node: nodes.IfExp) -> None: + self._check_using_constant_test(node, node.test) + + @utils.only_required_for_messages( + "using-constant-test", "missing-parentheses-for-call-in-test" + ) + def visit_comprehension(self, node: nodes.Comprehension) -> None: + if node.ifs: + for if_test in node.ifs: + self._check_using_constant_test(node, if_test) + + def _check_using_constant_test( + self, + node: nodes.If | nodes.IfExp | nodes.Comprehension, + test: nodes.NodeNG | None, + ) -> None: + const_nodes = ( + nodes.Module, + nodes.GeneratorExp, + nodes.Lambda, + nodes.FunctionDef, + nodes.ClassDef, + astroid.bases.Generator, + astroid.UnboundMethod, + astroid.BoundMethod, + nodes.Module, + ) + structs = (nodes.Dict, nodes.Tuple, nodes.Set, nodes.List) + + # These nodes are excepted, since they are not constant + # values, requiring a computation to happen. + except_nodes = ( + nodes.Call, + nodes.BinOp, + nodes.BoolOp, + nodes.UnaryOp, + nodes.Subscript, + ) + inferred = None + emit = isinstance(test, (nodes.Const,) + structs + const_nodes) + maybe_generator_call = None + if not isinstance(test, except_nodes): + inferred = utils.safe_infer(test) + if isinstance(inferred, util.UninferableBase) and isinstance( + test, nodes.Name + ): + emit, maybe_generator_call = BasicChecker._name_holds_generator(test) + + # Emit if calling a function that only returns GeneratorExp (always tests True) + elif isinstance(test, nodes.Call): + maybe_generator_call = test + if maybe_generator_call: + inferred_call = utils.safe_infer(maybe_generator_call.func) + if isinstance(inferred_call, nodes.FunctionDef): + # Can't use all(x) or not any(not x) for this condition, because it + # will return True for empty generators, which is not what we want. + all_returns_were_generator = None + for return_node in inferred_call._get_return_nodes_skip_functions(): + if not isinstance(return_node.value, nodes.GeneratorExp): + all_returns_were_generator = False + break + all_returns_were_generator = True + if all_returns_were_generator: + self.add_message( + "using-constant-test", node=node, confidence=INFERENCE + ) + return + + if emit: + self.add_message("using-constant-test", node=test, confidence=INFERENCE) + elif isinstance(inferred, const_nodes): + # If the constant node is a FunctionDef or Lambda then + # it may be an illicit function call due to missing parentheses + call_inferred = None + try: + # Just forcing the generator to infer all elements. + # astroid.exceptions.InferenceError are false positives + # see https://github.com/PyCQA/pylint/pull/8185 + if isinstance(inferred, nodes.FunctionDef): + call_inferred = list(inferred.infer_call_result()) + elif isinstance(inferred, nodes.Lambda): + call_inferred = list(inferred.infer_call_result(node)) + except astroid.InferenceError: + call_inferred = None + if call_inferred: + self.add_message( + "missing-parentheses-for-call-in-test", + node=test, + confidence=INFERENCE, + ) + self.add_message("using-constant-test", node=test, confidence=INFERENCE) + + @staticmethod + def _name_holds_generator(test: nodes.Name) -> tuple[bool, nodes.Call | None]: + """Return whether `test` tests a name certain to hold a generator, or optionally + a call that should be then tested to see if *it* returns only generators. + """ + assert isinstance(test, nodes.Name) + emit = False + maybe_generator_call = None + lookup_result = test.frame(future=True).lookup(test.name) + if not lookup_result: + return emit, maybe_generator_call + maybe_generator_assigned = ( + isinstance(assign_name.parent.value, nodes.GeneratorExp) + for assign_name in lookup_result[1] + if isinstance(assign_name.parent, nodes.Assign) + ) + first_item = next(maybe_generator_assigned, None) + if first_item is not None: + # Emit if this variable is certain to hold a generator + if all(itertools.chain((first_item,), maybe_generator_assigned)): + emit = True + # If this variable holds the result of a call, save it for next test + elif ( + len(lookup_result[1]) == 1 + and isinstance(lookup_result[1][0].parent, nodes.Assign) + and isinstance(lookup_result[1][0].parent.value, nodes.Call) + ): + maybe_generator_call = lookup_result[1][0].parent.value + return emit, maybe_generator_call + + def visit_module(self, _: nodes.Module) -> None: + """Check module name, docstring and required arguments.""" + self.linter.stats.node_count["module"] += 1 + + def visit_classdef(self, _: nodes.ClassDef) -> None: + """Check module name, docstring and redefinition + increment branch counter. + """ + self.linter.stats.node_count["klass"] += 1 + + @utils.only_required_for_messages( + "pointless-statement", + "pointless-exception-statement", + "pointless-string-statement", + "expression-not-assigned", + "named-expr-without-context", + ) + def visit_expr(self, node: nodes.Expr) -> None: + """Check for various kind of statements without effect.""" + expr = node.value + if isinstance(expr, nodes.Const) and isinstance(expr.value, str): + # treat string statement in a separated message + # Handle PEP-257 attribute docstrings. + # An attribute docstring is defined as being a string right after + # an assignment at the module level, class level or __init__ level. + scope = expr.scope() + if isinstance(scope, (nodes.ClassDef, nodes.Module, nodes.FunctionDef)): + if isinstance(scope, nodes.FunctionDef) and scope.name != "__init__": + pass + else: + sibling = expr.previous_sibling() + if ( + sibling is not None + and sibling.scope() is scope + and isinstance(sibling, (nodes.Assign, nodes.AnnAssign)) + ): + return + self.add_message("pointless-string-statement", node=node) + return + + # Warn W0133 for exceptions that are used as statements + if isinstance(expr, nodes.Call): + name = "" + if isinstance(expr.func, nodes.Name): + name = expr.func.name + elif isinstance(expr.func, nodes.Attribute): + name = expr.func.attrname + + # Heuristic: only run inference for names that begin with an uppercase char + # This reduces W0133's coverage, but retains acceptable runtime performance + # For more details, see: https://github.com/PyCQA/pylint/issues/8073 + inferred = utils.safe_infer(expr) if name[:1].isupper() else None + if isinstance(inferred, objects.ExceptionInstance): + self.add_message( + "pointless-exception-statement", node=node, confidence=INFERENCE + ) + return + + # Ignore if this is : + # * the unique child of a try/except body + # * a yield statement + # * an ellipsis (which can be used on Python 3 instead of pass) + # warn W0106 if we have any underlying function call (we can't predict + # side effects), else pointless-statement + if ( + isinstance(expr, (nodes.Yield, nodes.Await)) + or (isinstance(node.parent, nodes.TryExcept) and node.parent.body == [node]) + or (isinstance(expr, nodes.Const) and expr.value is Ellipsis) + ): + return + if isinstance(expr, nodes.NamedExpr): + self.add_message("named-expr-without-context", node=node, confidence=HIGH) + elif any(expr.nodes_of_class(nodes.Call)): + self.add_message( + "expression-not-assigned", node=node, args=expr.as_string() + ) + else: + self.add_message("pointless-statement", node=node) + + @staticmethod + def _filter_vararg( + node: nodes.Lambda, call_args: list[nodes.NodeNG] + ) -> Iterator[nodes.NodeNG]: + # Return the arguments for the given call which are + # not passed as vararg. + for arg in call_args: + if isinstance(arg, nodes.Starred): + if ( + isinstance(arg.value, nodes.Name) + and arg.value.name != node.args.vararg + ): + yield arg + else: + yield arg + + @staticmethod + def _has_variadic_argument( + args: list[nodes.Starred | nodes.Keyword], variadic_name: str + ) -> bool: + return not args or any( + isinstance(a.value, nodes.Name) + and a.value.name != variadic_name + or not isinstance(a.value, nodes.Name) + for a in args + ) + + @utils.only_required_for_messages("unnecessary-lambda") + def visit_lambda(self, node: nodes.Lambda) -> None: + """Check whether the lambda is suspicious.""" + # if the body of the lambda is a call expression with the same + # argument list as the lambda itself, then the lambda is + # possibly unnecessary and at least suspicious. + if node.args.defaults: + # If the arguments of the lambda include defaults, then a + # judgment cannot be made because there is no way to check + # that the defaults defined by the lambda are the same as + # the defaults defined by the function called in the body + # of the lambda. + return + call = node.body + if not isinstance(call, nodes.Call): + # The body of the lambda must be a function call expression + # for the lambda to be unnecessary. + return + if isinstance(node.body.func, nodes.Attribute) and isinstance( + node.body.func.expr, nodes.Call + ): + # Chained call, the intermediate call might + # return something else (but we don't check that, yet). + return + + call_site = astroid.arguments.CallSite.from_call(call) + ordinary_args = list(node.args.args) + new_call_args = list(self._filter_vararg(node, call.args)) + if node.args.kwarg: + if self._has_variadic_argument(call.kwargs, node.args.kwarg): + return + + if node.args.vararg: + if self._has_variadic_argument(call.starargs, node.args.vararg): + return + elif call.starargs: + return + + if call.keywords: + # Look for additional keyword arguments that are not part + # of the lambda's signature + lambda_kwargs = {keyword.name for keyword in node.args.defaults} + if len(lambda_kwargs) != len(call_site.keyword_arguments): + # Different lengths, so probably not identical + return + if set(call_site.keyword_arguments).difference(lambda_kwargs): + return + + # The "ordinary" arguments must be in a correspondence such that: + # ordinary_args[i].name == call.args[i].name. + if len(ordinary_args) != len(new_call_args): + return + for arg, passed_arg in zip(ordinary_args, new_call_args): + if not isinstance(passed_arg, nodes.Name): + return + if arg.name != passed_arg.name: + return + + self.add_message("unnecessary-lambda", line=node.fromlineno, node=node) + + @utils.only_required_for_messages("dangerous-default-value") + def visit_functiondef(self, node: nodes.FunctionDef) -> None: + """Check function name, docstring, arguments, redefinition, + variable names, max locals. + """ + if node.is_method(): + self.linter.stats.node_count["method"] += 1 + else: + self.linter.stats.node_count["function"] += 1 + self._check_dangerous_default(node) + + visit_asyncfunctiondef = visit_functiondef + + def _check_dangerous_default(self, node: nodes.FunctionDef) -> None: + """Check for dangerous default values as arguments.""" + + def is_iterable(internal_node: nodes.NodeNG) -> bool: + return isinstance(internal_node, (nodes.List, nodes.Set, nodes.Dict)) + + defaults = (node.args.defaults or []) + (node.args.kw_defaults or []) + for default in defaults: + if not default: + continue + try: + value = next(default.infer()) + except astroid.InferenceError: + continue + + if ( + isinstance(value, astroid.Instance) + and value.qname() in DEFAULT_ARGUMENT_SYMBOLS + ): + if value is default: + msg = DEFAULT_ARGUMENT_SYMBOLS[value.qname()] + elif isinstance(value, astroid.Instance) or is_iterable(value): + # We are here in the following situation(s): + # * a dict/set/list/tuple call which wasn't inferred + # to a syntax node ({}, () etc.). This can happen + # when the arguments are invalid or unknown to + # the inference. + # * a variable from somewhere else, which turns out to be a list + # or a dict. + if is_iterable(default): + msg = value.pytype() + elif isinstance(default, nodes.Call): + msg = f"{value.name}() ({value.qname()})" + else: + msg = f"{default.as_string()} ({value.qname()})" + else: + # this argument is a name + msg = f"{default.as_string()} ({DEFAULT_ARGUMENT_SYMBOLS[value.qname()]})" + self.add_message("dangerous-default-value", node=node, args=(msg,)) + + @utils.only_required_for_messages("unreachable", "lost-exception") + def visit_return(self, node: nodes.Return) -> None: + """Return node visitor. + + 1 - check if the node has a right sibling (if so, that's some + unreachable code) + 2 - check if the node is inside the 'finally' clause of a 'try...finally' + block + """ + self._check_unreachable(node) + # Is it inside final body of a try...finally block ? + self._check_not_in_finally(node, "return", (nodes.FunctionDef,)) + + @utils.only_required_for_messages("unreachable") + def visit_continue(self, node: nodes.Continue) -> None: + """Check is the node has a right sibling (if so, that's some unreachable + code). + """ + self._check_unreachable(node) + + @utils.only_required_for_messages("unreachable", "lost-exception") + def visit_break(self, node: nodes.Break) -> None: + """Break node visitor. + + 1 - check if the node has a right sibling (if so, that's some + unreachable code) + 2 - check if the node is inside the 'finally' clause of a 'try...finally' + block + """ + # 1 - Is it right sibling ? + self._check_unreachable(node) + # 2 - Is it inside final body of a try...finally block ? + self._check_not_in_finally(node, "break", (nodes.For, nodes.While)) + + @utils.only_required_for_messages("unreachable") + def visit_raise(self, node: nodes.Raise) -> None: + """Check if the node has a right sibling (if so, that's some unreachable + code). + """ + self._check_unreachable(node) + + def _check_misplaced_format_function(self, call_node: nodes.Call) -> None: + if not isinstance(call_node.func, nodes.Attribute): + return + if call_node.func.attrname != "format": + return + + expr = utils.safe_infer(call_node.func.expr) + if isinstance(expr, util.UninferableBase): + return + if not expr: + # we are doubtful on inferred type of node, so here just check if format + # was called on print() + call_expr = call_node.func.expr + if not isinstance(call_expr, nodes.Call): + return + if ( + isinstance(call_expr.func, nodes.Name) + and call_expr.func.name == "print" + ): + self.add_message("misplaced-format-function", node=call_node) + + @utils.only_required_for_messages( + "eval-used", + "exec-used", + "bad-reversed-sequence", + "misplaced-format-function", + "unreachable", + ) + def visit_call(self, node: nodes.Call) -> None: + """Visit a Call node.""" + if utils.is_terminating_func(node): + self._check_unreachable(node, confidence=INFERENCE) + self._check_misplaced_format_function(node) + if isinstance(node.func, nodes.Name): + name = node.func.name + # ignore the name if it's not a builtin (i.e. not defined in the + # locals nor globals scope) + if not (name in node.frame(future=True) or name in node.root()): + if name == "exec": + self.add_message("exec-used", node=node) + elif name == "reversed": + self._check_reversed(node) + elif name == "eval": + self.add_message("eval-used", node=node) + + @utils.only_required_for_messages("assert-on-tuple", "assert-on-string-literal") + def visit_assert(self, node: nodes.Assert) -> None: + """Check whether assert is used on a tuple or string literal.""" + if isinstance(node.test, nodes.Tuple) and len(node.test.elts) > 0: + self.add_message("assert-on-tuple", node=node, confidence=HIGH) + + if isinstance(node.test, nodes.Const) and isinstance(node.test.value, str): + if node.test.value: + when = "never" + else: + when = "always" + self.add_message("assert-on-string-literal", node=node, args=(when,)) + + @utils.only_required_for_messages("duplicate-key") + def visit_dict(self, node: nodes.Dict) -> None: + """Check duplicate key in dictionary.""" + keys = set() + for k, _ in node.items: + if isinstance(k, nodes.Const): + key = k.value + elif isinstance(k, nodes.Attribute): + key = k.as_string() + else: + continue + if key in keys: + self.add_message("duplicate-key", node=node, args=key) + keys.add(key) + + @utils.only_required_for_messages("duplicate-value") + def visit_set(self, node: nodes.Set) -> None: + """Check duplicate value in set.""" + values = set() + for v in node.elts: + if isinstance(v, nodes.Const): + value = v.value + else: + continue + if value in values: + self.add_message( + "duplicate-value", node=node, args=value, confidence=HIGH + ) + values.add(value) + + def visit_tryfinally(self, node: nodes.TryFinally) -> None: + """Update try...finally flag.""" + assert self._tryfinallys is not None + self._tryfinallys.append(node) + + def leave_tryfinally(self, _: nodes.TryFinally) -> None: + """Update try...finally flag.""" + assert self._tryfinallys is not None + self._tryfinallys.pop() + + def _check_unreachable( + self, + node: nodes.Return | nodes.Continue | nodes.Break | nodes.Raise | nodes.Call, + confidence: Confidence = HIGH, + ) -> None: + """Check unreachable code.""" + unreachable_statement = node.next_sibling() + if unreachable_statement is not None: + if ( + isinstance(node, nodes.Return) + and isinstance(unreachable_statement, nodes.Expr) + and isinstance(unreachable_statement.value, nodes.Yield) + ): + # Don't add 'unreachable' for empty generators. + # Only add warning if 'yield' is followed by another node. + unreachable_statement = unreachable_statement.next_sibling() + if unreachable_statement is None: + return + self.add_message( + "unreachable", node=unreachable_statement, confidence=confidence + ) + + def _check_not_in_finally( + self, + node: nodes.Break | nodes.Return, + node_name: str, + breaker_classes: tuple[nodes.NodeNG, ...] = (), + ) -> None: + """Check that a node is not inside a 'finally' clause of a + 'try...finally' statement. + + If we find a parent which type is in breaker_classes before + a 'try...finally' block we skip the whole check. + """ + # if self._tryfinallys is empty, we're not an in try...finally block + if not self._tryfinallys: + return + # the node could be a grand-grand...-child of the 'try...finally' + _parent = node.parent + _node = node + while _parent and not isinstance(_parent, breaker_classes): + if hasattr(_parent, "finalbody") and _node in _parent.finalbody: + self.add_message("lost-exception", node=node, args=node_name) + return + _node = _parent + _parent = _node.parent + + def _check_reversed(self, node: nodes.Call) -> None: + """Check that the argument to `reversed` is a sequence.""" + try: + argument = utils.safe_infer(utils.get_argument_from_call(node, position=0)) + except utils.NoSuchArgumentError: + pass + else: + if isinstance(argument, util.UninferableBase): + return + if argument is None: + # Nothing was inferred. + # Try to see if we have iter(). + if isinstance(node.args[0], nodes.Call): + try: + func = next(node.args[0].func.infer()) + except astroid.InferenceError: + return + if getattr( + func, "name", None + ) == "iter" and utils.is_builtin_object(func): + self.add_message("bad-reversed-sequence", node=node) + return + + if isinstance(argument, (nodes.List, nodes.Tuple)): + return + + # dicts are reversible, but only from Python 3.8 onward. Prior to + # that, any class based on dict must explicitly provide a + # __reversed__ method + if not self._py38_plus and isinstance(argument, astroid.Instance): + if any( + ancestor.name == "dict" and utils.is_builtin_object(ancestor) + for ancestor in itertools.chain( + (argument._proxied,), argument._proxied.ancestors() + ) + ): + try: + argument.locals[REVERSED_PROTOCOL_METHOD] + except KeyError: + self.add_message("bad-reversed-sequence", node=node) + return + + if hasattr(argument, "getattr"): + # everything else is not a proper sequence for reversed() + for methods in REVERSED_METHODS: + for meth in methods: + try: + argument.getattr(meth) + except astroid.NotFoundError: + break + else: + break + else: + self.add_message("bad-reversed-sequence", node=node) + else: + self.add_message("bad-reversed-sequence", node=node) + + @utils.only_required_for_messages("confusing-with-statement") + def visit_with(self, node: nodes.With) -> None: + # a "with" statement with multiple managers corresponds + # to one AST "With" node with multiple items + pairs = node.items + if pairs: + for prev_pair, pair in zip(pairs, pairs[1:]): + if isinstance(prev_pair[1], nodes.AssignName) and ( + pair[1] is None and not isinstance(pair[0], nodes.Call) + ): + # Don't emit a message if the second is a function call + # there's no way that can be mistaken for a name assignment. + # If the line number doesn't match + # we assume it's a nested "with". + self.add_message("confusing-with-statement", node=node) + + def _check_self_assigning_variable(self, node: nodes.Assign) -> None: + # Detect assigning to the same variable. + + scope = node.scope() + scope_locals = scope.locals + + rhs_names = [] + targets = node.targets + if isinstance(targets[0], nodes.Tuple): + if len(targets) != 1: + # A complex assignment, so bail out early. + return + targets = targets[0].elts + if len(targets) == 1: + # Unpacking a variable into the same name. + return + + if isinstance(node.value, nodes.Name): + if len(targets) != 1: + return + rhs_names = [node.value] + elif isinstance(node.value, nodes.Tuple): + rhs_count = len(node.value.elts) + if len(targets) != rhs_count or rhs_count == 1: + return + rhs_names = node.value.elts + + for target, lhs_name in zip(targets, rhs_names): + if not isinstance(lhs_name, nodes.Name): + continue + if not isinstance(target, nodes.AssignName): + continue + # Check that the scope is different from a class level, which is usually + # a pattern to expose module level attributes as class level ones. + if isinstance(scope, nodes.ClassDef) and target.name in scope_locals: + continue + if target.name == lhs_name.name: + self.add_message( + "self-assigning-variable", args=(target.name,), node=target + ) + + def _check_redeclared_assign_name(self, targets: list[nodes.NodeNG | None]) -> None: + dummy_variables_rgx = self.linter.config.dummy_variables_rgx + + for target in targets: + if not isinstance(target, nodes.Tuple): + continue + + found_names = [] + for element in target.elts: + if isinstance(element, nodes.Tuple): + self._check_redeclared_assign_name([element]) + elif isinstance(element, nodes.AssignName) and element.name != "_": + if dummy_variables_rgx and dummy_variables_rgx.match(element.name): + return + found_names.append(element.name) + + names = collections.Counter(found_names) + for name, count in names.most_common(): + if count > 1: + self.add_message( + "redeclared-assigned-name", args=(name,), node=target + ) + + @utils.only_required_for_messages( + "self-assigning-variable", "redeclared-assigned-name" + ) + def visit_assign(self, node: nodes.Assign) -> None: + self._check_self_assigning_variable(node) + self._check_redeclared_assign_name(node.targets) + + @utils.only_required_for_messages("redeclared-assigned-name") + def visit_for(self, node: nodes.For) -> None: + self._check_redeclared_assign_name([node.target]) diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/base/basic_error_checker.py b/venv/lib/python3.10/site-packages/pylint/checkers/base/basic_error_checker.py new file mode 100644 index 00000000..25038247 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint/checkers/base/basic_error_checker.py @@ -0,0 +1,582 @@ +# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html +# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt + +"""Basic Error checker from the basic checker.""" + +from __future__ import annotations + +import itertools +from collections.abc import Iterator +from typing import Any + +import astroid +from astroid import nodes +from astroid.typing import InferenceResult + +from pylint.checkers import utils +from pylint.checkers.base.basic_checker import _BasicChecker +from pylint.checkers.utils import infer_all +from pylint.interfaces import HIGH + +ABC_METACLASSES = {"_py_abc.ABCMeta", "abc.ABCMeta"} # Python 3.7+, +# List of methods which can be redefined +REDEFINABLE_METHODS = frozenset(("__module__",)) +TYPING_FORWARD_REF_QNAME = "typing.ForwardRef" + + +def _get_break_loop_node(break_node: nodes.Break) -> nodes.For | nodes.While | None: + """Returns the loop node that holds the break node in arguments. + + Args: + break_node (astroid.Break): the break node of interest. + + Returns: + astroid.For or astroid.While: the loop node holding the break node. + """ + loop_nodes = (nodes.For, nodes.While) + parent = break_node.parent + while not isinstance(parent, loop_nodes) or break_node in getattr( + parent, "orelse", [] + ): + break_node = parent + parent = parent.parent + if parent is None: + break + return parent + + +def _loop_exits_early(loop: nodes.For | nodes.While) -> bool: + """Returns true if a loop may end with a break statement. + + Args: + loop (astroid.For, astroid.While): the loop node inspected. + + Returns: + bool: True if the loop may end with a break statement, False otherwise. + """ + loop_nodes = (nodes.For, nodes.While) + definition_nodes = (nodes.FunctionDef, nodes.ClassDef) + inner_loop_nodes: list[nodes.For | nodes.While] = [ + _node + for _node in loop.nodes_of_class(loop_nodes, skip_klass=definition_nodes) + if _node != loop + ] + return any( + _node + for _node in loop.nodes_of_class(nodes.Break, skip_klass=definition_nodes) + if _get_break_loop_node(_node) not in inner_loop_nodes + ) + + +def _has_abstract_methods(node: nodes.ClassDef) -> bool: + """Determine if the given `node` has abstract methods. + + The methods should be made abstract by decorating them + with `abc` decorators. + """ + return len(utils.unimplemented_abstract_methods(node)) > 0 + + +def redefined_by_decorator(node: nodes.FunctionDef) -> bool: + """Return True if the object is a method redefined via decorator. + + For example: + @property + def x(self): return self._x + @x.setter + def x(self, value): self._x = value + """ + if node.decorators: + for decorator in node.decorators.nodes: + if ( + isinstance(decorator, nodes.Attribute) + and getattr(decorator.expr, "name", None) == node.name + ): + return True + return False + + +class BasicErrorChecker(_BasicChecker): + msgs = { + "E0100": ( + "__init__ method is a generator", + "init-is-generator", + "Used when the special class method __init__ is turned into a " + "generator by a yield in its body.", + ), + "E0101": ( + "Explicit return in __init__", + "return-in-init", + "Used when the special class method __init__ has an explicit " + "return value.", + ), + "E0102": ( + "%s already defined line %s", + "function-redefined", + "Used when a function / class / method is redefined.", + ), + "E0103": ( + "%r not properly in loop", + "not-in-loop", + "Used when break or continue keywords are used outside a loop.", + ), + "E0104": ( + "Return outside function", + "return-outside-function", + 'Used when a "return" statement is found outside a function or method.', + ), + "E0105": ( + "Yield outside function", + "yield-outside-function", + 'Used when a "yield" statement is found outside a function or method.', + ), + "E0106": ( + "Return with argument inside generator", + "return-arg-in-generator", + 'Used when a "return" statement with an argument is found ' + "outside in a generator function or method (e.g. with some " + '"yield" statements).', + {"maxversion": (3, 3)}, + ), + "E0107": ( + "Use of the non-existent %s operator", + "nonexistent-operator", + "Used when you attempt to use the C-style pre-increment or " + "pre-decrement operator -- and ++, which doesn't exist in Python.", + ), + "E0108": ( + "Duplicate argument name %s in function definition", + "duplicate-argument-name", + "Duplicate argument names in function definitions are syntax errors.", + ), + "E0110": ( + "Abstract class %r with abstract methods instantiated", + "abstract-class-instantiated", + "Used when an abstract class with `abc.ABCMeta` as metaclass " + "has abstract methods and is instantiated.", + ), + "W0120": ( + "Else clause on loop without a break statement, remove the else and" + " de-indent all the code inside it", + "useless-else-on-loop", + "Loops should only have an else clause if they can exit early " + "with a break statement, otherwise the statements under else " + "should be on the same scope as the loop itself.", + ), + "E0112": ( + "More than one starred expression in assignment", + "too-many-star-expressions", + "Emitted when there are more than one starred " + "expressions (`*x`) in an assignment. This is a SyntaxError.", + ), + "E0113": ( + "Starred assignment target must be in a list or tuple", + "invalid-star-assignment-target", + "Emitted when a star expression is used as a starred assignment target.", + ), + "E0114": ( + "Can use starred expression only in assignment target", + "star-needs-assignment-target", + "Emitted when a star expression is not used in an assignment target.", + ), + "E0115": ( + "Name %r is nonlocal and global", + "nonlocal-and-global", + "Emitted when a name is both nonlocal and global.", + ), + "E0116": ( + "'continue' not supported inside 'finally' clause", + "continue-in-finally", + "Emitted when the `continue` keyword is found " + "inside a finally clause, which is a SyntaxError.", + ), + "E0117": ( + "nonlocal name %s found without binding", + "nonlocal-without-binding", + "Emitted when a nonlocal variable does not have an attached " + "name somewhere in the parent scopes", + ), + "E0118": ( + "Name %r is used prior to global declaration", + "used-prior-global-declaration", + "Emitted when a name is used prior a global declaration, " + "which results in an error since Python 3.6.", + {"minversion": (3, 6)}, + ), + } + + def open(self) -> None: + py_version = self.linter.config.py_version + self._py38_plus = py_version >= (3, 8) + + @utils.only_required_for_messages("function-redefined") + def visit_classdef(self, node: nodes.ClassDef) -> None: + self._check_redefinition("class", node) + + def _too_many_starred_for_tuple(self, assign_tuple: nodes.Tuple) -> bool: + starred_count = 0 + for elem in assign_tuple.itered(): + if isinstance(elem, nodes.Tuple): + return self._too_many_starred_for_tuple(elem) + if isinstance(elem, nodes.Starred): + starred_count += 1 + return starred_count > 1 + + @utils.only_required_for_messages( + "too-many-star-expressions", "invalid-star-assignment-target" + ) + def visit_assign(self, node: nodes.Assign) -> None: + # Check *a, *b = ... + assign_target = node.targets[0] + # Check *a = b + if isinstance(node.targets[0], nodes.Starred): + self.add_message("invalid-star-assignment-target", node=node) + + if not isinstance(assign_target, nodes.Tuple): + return + if self._too_many_starred_for_tuple(assign_target): + self.add_message("too-many-star-expressions", node=node) + + @utils.only_required_for_messages("star-needs-assignment-target") + def visit_starred(self, node: nodes.Starred) -> None: + """Check that a Starred expression is used in an assignment target.""" + if isinstance(node.parent, nodes.Call): + # f(*args) is converted to Call(args=[Starred]), so ignore + # them for this check. + return + if isinstance(node.parent, (nodes.List, nodes.Tuple, nodes.Set, nodes.Dict)): + # PEP 448 unpacking. + return + + stmt = node.statement(future=True) + if not isinstance(stmt, nodes.Assign): + return + + if stmt.value is node or stmt.value.parent_of(node): + self.add_message("star-needs-assignment-target", node=node) + + @utils.only_required_for_messages( + "init-is-generator", + "return-in-init", + "function-redefined", + "return-arg-in-generator", + "duplicate-argument-name", + "nonlocal-and-global", + "used-prior-global-declaration", + ) + def visit_functiondef(self, node: nodes.FunctionDef) -> None: + self._check_nonlocal_and_global(node) + self._check_name_used_prior_global(node) + if not redefined_by_decorator( + node + ) and not utils.is_registered_in_singledispatch_function(node): + self._check_redefinition(node.is_method() and "method" or "function", node) + # checks for max returns, branch, return in __init__ + returns = node.nodes_of_class( + nodes.Return, skip_klass=(nodes.FunctionDef, nodes.ClassDef) + ) + if node.is_method() and node.name == "__init__": + if node.is_generator(): + self.add_message("init-is-generator", node=node) + else: + values = [r.value for r in returns] + # Are we returning anything but None from constructors + if any(v for v in values if not utils.is_none(v)): + self.add_message("return-in-init", node=node) + # Check for duplicate names by clustering args with same name for detailed report + arg_clusters = {} + arguments: Iterator[Any] = filter(None, [node.args.args, node.args.kwonlyargs]) + for arg in itertools.chain.from_iterable(arguments): + if arg.name in arg_clusters: + self.add_message( + "duplicate-argument-name", + node=arg, + args=(arg.name,), + confidence=HIGH, + ) + else: + arg_clusters[arg.name] = arg + + visit_asyncfunctiondef = visit_functiondef + + def _check_name_used_prior_global(self, node: nodes.FunctionDef) -> None: + scope_globals = { + name: child + for child in node.nodes_of_class(nodes.Global) + for name in child.names + if child.scope() is node + } + + if not scope_globals: + return + + for node_name in node.nodes_of_class(nodes.Name): + if node_name.scope() is not node: + continue + + name = node_name.name + corresponding_global = scope_globals.get(name) + if not corresponding_global: + continue + + global_lineno = corresponding_global.fromlineno + if global_lineno and global_lineno > node_name.fromlineno: + self.add_message( + "used-prior-global-declaration", node=node_name, args=(name,) + ) + + def _check_nonlocal_and_global(self, node: nodes.FunctionDef) -> None: + """Check that a name is both nonlocal and global.""" + + def same_scope(current: nodes.Global | nodes.Nonlocal) -> bool: + return current.scope() is node + + from_iter = itertools.chain.from_iterable + nonlocals = set( + from_iter( + child.names + for child in node.nodes_of_class(nodes.Nonlocal) + if same_scope(child) + ) + ) + + if not nonlocals: + return + + global_vars = set( + from_iter( + child.names + for child in node.nodes_of_class(nodes.Global) + if same_scope(child) + ) + ) + for name in nonlocals.intersection(global_vars): + self.add_message("nonlocal-and-global", args=(name,), node=node) + + @utils.only_required_for_messages("return-outside-function") + def visit_return(self, node: nodes.Return) -> None: + if not isinstance(node.frame(future=True), nodes.FunctionDef): + self.add_message("return-outside-function", node=node) + + @utils.only_required_for_messages("yield-outside-function") + def visit_yield(self, node: nodes.Yield) -> None: + self._check_yield_outside_func(node) + + @utils.only_required_for_messages("yield-outside-function") + def visit_yieldfrom(self, node: nodes.YieldFrom) -> None: + self._check_yield_outside_func(node) + + @utils.only_required_for_messages("not-in-loop", "continue-in-finally") + def visit_continue(self, node: nodes.Continue) -> None: + self._check_in_loop(node, "continue") + + @utils.only_required_for_messages("not-in-loop") + def visit_break(self, node: nodes.Break) -> None: + self._check_in_loop(node, "break") + + @utils.only_required_for_messages("useless-else-on-loop") + def visit_for(self, node: nodes.For) -> None: + self._check_else_on_loop(node) + + @utils.only_required_for_messages("useless-else-on-loop") + def visit_while(self, node: nodes.While) -> None: + self._check_else_on_loop(node) + + @utils.only_required_for_messages("nonexistent-operator") + def visit_unaryop(self, node: nodes.UnaryOp) -> None: + """Check use of the non-existent ++ and -- operators.""" + if ( + (node.op in "+-") + and isinstance(node.operand, nodes.UnaryOp) + and (node.operand.op == node.op) + and (node.col_offset + 1 == node.operand.col_offset) + ): + self.add_message("nonexistent-operator", node=node, args=node.op * 2) + + def _check_nonlocal_without_binding(self, node: nodes.Nonlocal, name: str) -> None: + current_scope = node.scope() + while current_scope.parent is not None: + if not isinstance(current_scope, (nodes.ClassDef, nodes.FunctionDef)): + self.add_message("nonlocal-without-binding", args=(name,), node=node) + return + + # Search for `name` in the parent scope if: + # `current_scope` is the same scope in which the `nonlocal` name is declared + # or `name` is not in `current_scope.locals`. + if current_scope is node.scope() or name not in current_scope.locals: + current_scope = current_scope.parent.scope() + continue + + # Okay, found it. + return + + if not isinstance(current_scope, nodes.FunctionDef): + self.add_message( + "nonlocal-without-binding", args=(name,), node=node, confidence=HIGH + ) + + @utils.only_required_for_messages("nonlocal-without-binding") + def visit_nonlocal(self, node: nodes.Nonlocal) -> None: + for name in node.names: + self._check_nonlocal_without_binding(node, name) + + @utils.only_required_for_messages("abstract-class-instantiated") + def visit_call(self, node: nodes.Call) -> None: + """Check instantiating abstract class with + abc.ABCMeta as metaclass. + """ + for inferred in infer_all(node.func): + self._check_inferred_class_is_abstract(inferred, node) + + def _check_inferred_class_is_abstract( + self, inferred: InferenceResult, node: nodes.Call + ) -> None: + if not isinstance(inferred, nodes.ClassDef): + return + + klass = utils.node_frame_class(node) + if klass is inferred: + # Don't emit the warning if the class is instantiated + # in its own body or if the call is not an instance + # creation. If the class is instantiated into its own + # body, we're expecting that it knows what it is doing. + return + + # __init__ was called + abstract_methods = _has_abstract_methods(inferred) + + if not abstract_methods: + return + + metaclass = inferred.metaclass() + + if metaclass is None: + # Python 3.4 has `abc.ABC`, which won't be detected + # by ClassNode.metaclass() + for ancestor in inferred.ancestors(): + if ancestor.qname() == "abc.ABC": + self.add_message( + "abstract-class-instantiated", args=(inferred.name,), node=node + ) + break + + return + + if metaclass.qname() in ABC_METACLASSES: + self.add_message( + "abstract-class-instantiated", args=(inferred.name,), node=node + ) + + def _check_yield_outside_func(self, node: nodes.Yield) -> None: + if not isinstance(node.frame(future=True), (nodes.FunctionDef, nodes.Lambda)): + self.add_message("yield-outside-function", node=node) + + def _check_else_on_loop(self, node: nodes.For | nodes.While) -> None: + """Check that any loop with an else clause has a break statement.""" + if node.orelse and not _loop_exits_early(node): + self.add_message( + "useless-else-on-loop", + node=node, + # This is not optimal, but the line previous + # to the first statement in the else clause + # will usually be the one that contains the else:. + line=node.orelse[0].lineno - 1, + ) + + def _check_in_loop( + self, node: nodes.Continue | nodes.Break, node_name: str + ) -> None: + """Check that a node is inside a for or while loop.""" + for parent in node.node_ancestors(): + if isinstance(parent, (nodes.For, nodes.While)): + if node not in parent.orelse: + return + + if isinstance(parent, (nodes.ClassDef, nodes.FunctionDef)): + break + if ( + isinstance(parent, nodes.TryFinally) + and node in parent.finalbody + and isinstance(node, nodes.Continue) + and not self._py38_plus + ): + self.add_message("continue-in-finally", node=node) + + self.add_message("not-in-loop", node=node, args=node_name) + + def _check_redefinition( + self, redeftype: str, node: nodes.Call | nodes.FunctionDef + ) -> None: + """Check for redefinition of a function / method / class name.""" + parent_frame = node.parent.frame(future=True) + + # Ignore function stubs created for type information + redefinitions = [ + i + for i in parent_frame.locals[node.name] + if not (isinstance(i.parent, nodes.AnnAssign) and i.parent.simple) + ] + defined_self = next( + (local for local in redefinitions if not utils.is_overload_stub(local)), + node, + ) + if defined_self is not node and not astroid.are_exclusive(node, defined_self): + # Additional checks for methods which are not considered + # redefined, since they are already part of the base API. + if ( + isinstance(parent_frame, nodes.ClassDef) + and node.name in REDEFINABLE_METHODS + ): + return + + # Skip typing.overload() functions. + if utils.is_overload_stub(node): + return + + # Exempt functions redefined on a condition. + if isinstance(node.parent, nodes.If): + # Exempt "if not " cases + if ( + isinstance(node.parent.test, nodes.UnaryOp) + and node.parent.test.op == "not" + and isinstance(node.parent.test.operand, nodes.Name) + and node.parent.test.operand.name == node.name + ): + return + + # Exempt "if is not None" cases + # pylint: disable=too-many-boolean-expressions + if ( + isinstance(node.parent.test, nodes.Compare) + and isinstance(node.parent.test.left, nodes.Name) + and node.parent.test.left.name == node.name + and node.parent.test.ops[0][0] == "is" + and isinstance(node.parent.test.ops[0][1], nodes.Const) + and node.parent.test.ops[0][1].value is None + ): + return + + # Check if we have forward references for this node. + try: + redefinition_index = redefinitions.index(node) + except ValueError: + pass + else: + for redefinition in redefinitions[:redefinition_index]: + inferred = utils.safe_infer(redefinition) + if ( + inferred + and isinstance(inferred, astroid.Instance) + and inferred.qname() == TYPING_FORWARD_REF_QNAME + ): + return + + dummy_variables_rgx = self.linter.config.dummy_variables_rgx + if dummy_variables_rgx and dummy_variables_rgx.match(node.name): + return + self.add_message( + "function-redefined", + node=node, + args=(redeftype, defined_self.fromlineno), + ) diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/base/comparison_checker.py b/venv/lib/python3.10/site-packages/pylint/checkers/base/comparison_checker.py new file mode 120000 index 00000000..804d9267 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint/checkers/base/comparison_checker.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/68/25/40/e2a38d12f29f45d5d3161640b70adb970f8183b5f75330364862646099 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/base/docstring_checker.py b/venv/lib/python3.10/site-packages/pylint/checkers/base/docstring_checker.py new file mode 120000 index 00000000..fb376558 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint/checkers/base/docstring_checker.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/3c/4c/34/56df9d544b4ccd51a9bc4a95ab62bf95d69f2e21d72bcb156c689006b7 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/__init__.py b/venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/__init__.py new file mode 120000 index 00000000..7cf30333 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/__init__.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/00/a7/b4/95f325dce94f97b264209c371404ea0b65e85c9fe4ea17a03c1d7709c6 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/__pycache__/__init__.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..445d686f51e2bb11de1ac0c876732f5b50c066d4 GIT binary patch literal 574 zcma)&K~KUk6vsOlY=Gbg@C&#YR*6?M60!s$PU0|xUYfEsu+WyJ8zlQW-uyUTclG4W zvnN}Sh$n5*f8XnSuYJF_ZZ_*>0Ki~&F}|LEyuK;>*D5LRR_(N_WC0@ZY#oQFXsQAl1Rg-327$*Q5aU?H8ODmCu)BO6Z5X}LV@vf|Z1bdX GZhQgX5unll literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/__pycache__/checker.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/__pycache__/checker.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..879b49157537f4fb66bb816d903c2902b36e0206 GIT binary patch literal 17682 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 tuple[set[str], set[str]]: + """Returns a tuple of property classes and names. + + Property classes are fully qualified, such as 'abc.abstractproperty' and + property names are the actual names, such as 'abstract_property'. + """ + property_classes = {BUILTIN_PROPERTY} + property_names: set[str] = set() # Not returning 'property', it has its own check. + if config is not None: + property_classes.update(config.property_classes) + property_names.update( + prop.rsplit(".", 1)[-1] for prop in config.property_classes + ) + return property_classes, property_names + + +def _redefines_import(node: nodes.AssignName) -> bool: + """Detect that the given node (AssignName) is inside an + exception handler and redefines an import from the tryexcept body. + + Returns True if the node redefines an import, False otherwise. + """ + current = node + while current and not isinstance(current.parent, nodes.ExceptHandler): + current = current.parent + if not current or not utils.error_of_type(current.parent, ImportError): + return False + try_block = current.parent.parent + for import_node in try_block.nodes_of_class((nodes.ImportFrom, nodes.Import)): + for name, alias in import_node.names: + if alias: + if alias == node.name: + return True + elif name == node.name: + return True + return False + + +def _determine_function_name_type( + node: nodes.FunctionDef, config: argparse.Namespace +) -> str: + """Determine the name type whose regex the function's name should match. + + :param node: A function node. + :param config: Configuration from which to pull additional property classes. + + :returns: One of ('function', 'method', 'attr') + """ + property_classes, property_names = _get_properties(config) + if not node.is_method(): + return "function" + + if is_property_setter(node) or is_property_deleter(node): + # If the function is decorated using the prop_method.{setter,getter} + # form, treat it like an attribute as well. + return "attr" + + decorators = node.decorators.nodes if node.decorators else [] + for decorator in decorators: + # If the function is a property (decorated with @property + # or @abc.abstractproperty), the name type is 'attr'. + if isinstance(decorator, nodes.Name) or ( + isinstance(decorator, nodes.Attribute) + and decorator.attrname in property_names + ): + inferred = utils.safe_infer(decorator) + if ( + inferred + and hasattr(inferred, "qname") + and inferred.qname() in property_classes + ): + return "attr" + return "method" + + +# Name categories that are always consistent with all naming conventions. +EXEMPT_NAME_CATEGORIES = {"exempt", "ignore"} + + +def _is_multi_naming_match( + match: re.Match[str] | None, node_type: str, confidence: interfaces.Confidence +) -> bool: + return ( + match is not None + and match.lastgroup is not None + and match.lastgroup not in EXEMPT_NAME_CATEGORIES + and (node_type != "method" or confidence != interfaces.INFERENCE_FAILURE) + ) + + +class NameChecker(_BasicChecker): + msgs = { + "C0103": ( + '%s name "%s" doesn\'t conform to %s', + "invalid-name", + "Used when the name doesn't conform to naming rules " + "associated to its type (constant, variable, class...).", + ), + "C0104": ( + 'Disallowed name "%s"', + "disallowed-name", + "Used when the name matches bad-names or bad-names-rgxs- (unauthorized names).", + { + "old_names": [ + ("C0102", "blacklisted-name"), + ] + }, + ), + "C0105": ( + "Type variable name does not reflect variance%s", + "typevar-name-incorrect-variance", + "Emitted when a TypeVar name doesn't reflect its type variance. " + "According to PEP8, it is recommended to add suffixes '_co' and " + "'_contra' to the variables used to declare covariant or " + "contravariant behaviour respectively. Invariant (default) variables " + "do not require a suffix. The message is also emitted when invariant " + "variables do have a suffix.", + ), + "C0131": ( + "TypeVar cannot be both covariant and contravariant", + "typevar-double-variance", + 'Emitted when both the "covariant" and "contravariant" ' + 'keyword arguments are set to "True" in a TypeVar.', + ), + "C0132": ( + 'TypeVar name "%s" does not match assigned variable name "%s"', + "typevar-name-mismatch", + "Emitted when a TypeVar is assigned to a variable " + "that does not match its name argument.", + ), + } + + _options: Options = ( + ( + "good-names", + { + "default": ("i", "j", "k", "ex", "Run", "_"), + "type": "csv", + "metavar": "", + "help": "Good variable names which should always be accepted," + " separated by a comma.", + }, + ), + ( + "good-names-rgxs", + { + "default": "", + "type": "regexp_csv", + "metavar": "", + "help": "Good variable names regexes, separated by a comma. If names match any regex," + " they will always be accepted", + }, + ), + ( + "bad-names", + { + "default": ("foo", "bar", "baz", "toto", "tutu", "tata"), + "type": "csv", + "metavar": "", + "help": "Bad variable names which should always be refused, " + "separated by a comma.", + }, + ), + ( + "bad-names-rgxs", + { + "default": "", + "type": "regexp_csv", + "metavar": "", + "help": "Bad variable names regexes, separated by a comma. If names match any regex," + " they will always be refused", + }, + ), + ( + "name-group", + { + "default": (), + "type": "csv", + "metavar": "", + "help": ( + "Colon-delimited sets of names that determine each" + " other's naming style when the name regexes" + " allow several styles." + ), + }, + ), + ( + "include-naming-hint", + { + "default": False, + "type": "yn", + "metavar": "", + "help": "Include a hint for the correct naming format with invalid-name.", + }, + ), + ( + "property-classes", + { + "default": ("abc.abstractproperty",), + "type": "csv", + "metavar": "", + "help": "List of decorators that produce properties, such as " + "abc.abstractproperty. Add to this list to register " + "other decorators that produce valid properties. " + "These decorators are taken in consideration only for invalid-name.", + }, + ), + ) + options: Options = _options + _create_naming_options() + + def __init__(self, linter: PyLinter) -> None: + super().__init__(linter) + self._name_group: dict[str, str] = {} + self._bad_names: dict[str, dict[str, list[_BadNamesTuple]]] = {} + self._name_regexps: dict[str, re.Pattern[str]] = {} + self._name_hints: dict[str, str] = {} + self._good_names_rgxs_compiled: list[re.Pattern[str]] = [] + self._bad_names_rgxs_compiled: list[re.Pattern[str]] = [] + + def open(self) -> None: + self.linter.stats.reset_bad_names() + for group in self.linter.config.name_group: + for name_type in group.split(":"): + self._name_group[name_type] = f"group_{group}" + + regexps, hints = self._create_naming_rules() + self._name_regexps = regexps + self._name_hints = hints + self._good_names_rgxs_compiled = [ + re.compile(rgxp) for rgxp in self.linter.config.good_names_rgxs + ] + self._bad_names_rgxs_compiled = [ + re.compile(rgxp) for rgxp in self.linter.config.bad_names_rgxs + ] + + def _create_naming_rules(self) -> tuple[dict[str, Pattern[str]], dict[str, str]]: + regexps: dict[str, Pattern[str]] = {} + hints: dict[str, str] = {} + + for name_type in KNOWN_NAME_TYPES: + if name_type in KNOWN_NAME_TYPES_WITH_STYLE: + naming_style_name = getattr( + self.linter.config, f"{name_type}_naming_style" + ) + regexps[name_type] = NAMING_STYLES[naming_style_name].get_regex( + name_type + ) + else: + naming_style_name = "predefined" + regexps[name_type] = DEFAULT_PATTERNS[name_type] + + custom_regex_setting_name = f"{name_type}_rgx" + custom_regex = getattr(self.linter.config, custom_regex_setting_name, None) + if custom_regex is not None: + regexps[name_type] = custom_regex + + if custom_regex is not None: + hints[name_type] = f"{custom_regex.pattern!r} pattern" + else: + hints[name_type] = f"{naming_style_name} naming style" + + return regexps, hints + + @utils.only_required_for_messages("disallowed-name", "invalid-name") + def visit_module(self, node: nodes.Module) -> None: + self._check_name("module", node.name.split(".")[-1], node) + self._bad_names = {} + + def leave_module(self, _: nodes.Module) -> None: + for all_groups in self._bad_names.values(): + if len(all_groups) < 2: + continue + groups: collections.defaultdict[ + int, list[list[_BadNamesTuple]] + ] = collections.defaultdict(list) + min_warnings = sys.maxsize + prevalent_group, _ = max(all_groups.items(), key=lambda item: len(item[1])) + for group in all_groups.values(): + groups[len(group)].append(group) + min_warnings = min(len(group), min_warnings) + if len(groups[min_warnings]) > 1: + by_line = sorted( + groups[min_warnings], + key=lambda group: min( # type: ignore[no-any-return] + warning[0].lineno + for warning in group + if warning[0].lineno is not None + ), + ) + warnings: Iterable[_BadNamesTuple] = itertools.chain(*by_line[1:]) + else: + warnings = groups[min_warnings][0] + for args in warnings: + self._raise_name_warning(prevalent_group, *args) + + @utils.only_required_for_messages("disallowed-name", "invalid-name") + def visit_classdef(self, node: nodes.ClassDef) -> None: + self._check_name("class", node.name, node) + for attr, anodes in node.instance_attrs.items(): + if not any(node.instance_attr_ancestors(attr)): + self._check_name("attr", attr, anodes[0]) + + @utils.only_required_for_messages("disallowed-name", "invalid-name") + def visit_functiondef(self, node: nodes.FunctionDef) -> None: + # Do not emit any warnings if the method is just an implementation + # of a base class method. + confidence = interfaces.HIGH + if node.is_method(): + if utils.overrides_a_method(node.parent.frame(future=True), node.name): + return + confidence = ( + interfaces.INFERENCE + if utils.has_known_bases(node.parent.frame(future=True)) + else interfaces.INFERENCE_FAILURE + ) + + self._check_name( + _determine_function_name_type(node, config=self.linter.config), + node.name, + node, + confidence, + ) + # Check argument names + args = node.args.args + if args is not None: + self._recursive_check_names(args) + + visit_asyncfunctiondef = visit_functiondef + + @utils.only_required_for_messages( + "disallowed-name", + "invalid-name", + "typevar-name-incorrect-variance", + "typevar-double-variance", + "typevar-name-mismatch", + ) + def visit_assignname( # pylint: disable=too-many-branches + self, node: nodes.AssignName + ) -> None: + """Check module level assigned names.""" + frame = node.frame(future=True) + assign_type = node.assign_type() + + # Check names defined in comprehensions + if isinstance(assign_type, nodes.Comprehension): + self._check_name("inlinevar", node.name, node) + + # Check names defined in module scope + elif isinstance(frame, nodes.Module): + # Check names defined in Assign nodes + if isinstance(assign_type, nodes.Assign): + inferred_assign_type = utils.safe_infer(assign_type.value) + + # Check TypeVar's and TypeAliases assigned alone or in tuple assignment + if isinstance(node.parent, nodes.Assign): + if self._assigns_typevar(assign_type.value): + self._check_name("typevar", assign_type.targets[0].name, node) + return + if self._assigns_typealias(assign_type.value): + self._check_name("typealias", assign_type.targets[0].name, node) + return + + if ( + isinstance(node.parent, nodes.Tuple) + and isinstance(assign_type.value, nodes.Tuple) + # protect against unbalanced tuple unpacking + and node.parent.elts.index(node) < len(assign_type.value.elts) + ): + assigner = assign_type.value.elts[node.parent.elts.index(node)] + if self._assigns_typevar(assigner): + self._check_name( + "typevar", + assign_type.targets[0] + .elts[node.parent.elts.index(node)] + .name, + node, + ) + return + if self._assigns_typealias(assigner): + self._check_name( + "typealias", + assign_type.targets[0] + .elts[node.parent.elts.index(node)] + .name, + node, + ) + return + + # Check classes (TypeVar's are classes so they need to be excluded first) + elif isinstance(inferred_assign_type, nodes.ClassDef): + self._check_name("class", node.name, node) + + # Don't emit if the name redefines an import in an ImportError except handler. + elif not _redefines_import(node) and isinstance( + inferred_assign_type, nodes.Const + ): + self._check_name("const", node.name, node) + else: + self._check_name( + "variable", node.name, node, disallowed_check_only=True + ) + + # Check names defined in AnnAssign nodes + elif isinstance(assign_type, nodes.AnnAssign): + if utils.is_assign_name_annotated_with(node, "Final"): + self._check_name("const", node.name, node) + elif self._assigns_typealias(assign_type.annotation): + self._check_name("typealias", node.name, node) + + # Check names defined in function scopes + elif isinstance(frame, nodes.FunctionDef): + # global introduced variable aren't in the function locals + if node.name in frame and node.name not in frame.argnames(): + if not _redefines_import(node): + self._check_name("variable", node.name, node) + + # Check names defined in class scopes + elif isinstance(frame, nodes.ClassDef): + if not list(frame.local_attr_ancestors(node.name)): + for ancestor in frame.ancestors(): + if utils.is_enum(ancestor) or utils.is_assign_name_annotated_with( + node, "Final" + ): + self._check_name("class_const", node.name, node) + break + else: + self._check_name("class_attribute", node.name, node) + + def _recursive_check_names(self, args: list[nodes.AssignName]) -> None: + """Check names in a possibly recursive list .""" + for arg in args: + self._check_name("argument", arg.name, arg) + + def _find_name_group(self, node_type: str) -> str: + return self._name_group.get(node_type, node_type) + + def _raise_name_warning( + self, + prevalent_group: str | None, + node: nodes.NodeNG, + node_type: str, + name: str, + confidence: interfaces.Confidence, + warning: str = "invalid-name", + ) -> None: + type_label = constants.HUMAN_READABLE_TYPES[node_type] + hint = self._name_hints[node_type] + if prevalent_group: + # This happens in the multi naming match case. The expected + # prevalent group needs to be spelled out to make the message + # correct. + hint = f"the `{prevalent_group}` group in the {hint}" + if self.linter.config.include_naming_hint: + hint += f" ({self._name_regexps[node_type].pattern!r} pattern)" + args = ( + (type_label.capitalize(), name, hint) + if warning == "invalid-name" + else (type_label.capitalize(), name) + ) + + self.add_message(warning, node=node, args=args, confidence=confidence) + self.linter.stats.increase_bad_name(node_type, 1) + + def _name_allowed_by_regex(self, name: str) -> bool: + return name in self.linter.config.good_names or any( + pattern.match(name) for pattern in self._good_names_rgxs_compiled + ) + + def _name_disallowed_by_regex(self, name: str) -> bool: + return name in self.linter.config.bad_names or any( + pattern.match(name) for pattern in self._bad_names_rgxs_compiled + ) + + def _check_name( + self, + node_type: str, + name: str, + node: nodes.NodeNG, + confidence: interfaces.Confidence = interfaces.HIGH, + disallowed_check_only: bool = False, + ) -> None: + """Check for a name using the type's regexp.""" + + def _should_exempt_from_invalid_name(node: nodes.NodeNG) -> bool: + if node_type == "variable": + inferred = utils.safe_infer(node) + if isinstance(inferred, nodes.ClassDef): + return True + return False + + if self._name_allowed_by_regex(name=name): + return + if self._name_disallowed_by_regex(name=name): + self.linter.stats.increase_bad_name(node_type, 1) + self.add_message( + "disallowed-name", node=node, args=name, confidence=interfaces.HIGH + ) + return + regexp = self._name_regexps[node_type] + match = regexp.match(name) + + if _is_multi_naming_match(match, node_type, confidence): + name_group = self._find_name_group(node_type) + bad_name_group = self._bad_names.setdefault(name_group, {}) + # Ignored because this is checked by the if statement + warnings = bad_name_group.setdefault(match.lastgroup, []) # type: ignore[union-attr, arg-type] + warnings.append((node, node_type, name, confidence)) + + if ( + match is None + and not disallowed_check_only + and not _should_exempt_from_invalid_name(node) + ): + self._raise_name_warning(None, node, node_type, name, confidence) + + # Check TypeVar names for variance suffixes + if node_type == "typevar": + self._check_typevar(name, node) + + @staticmethod + def _assigns_typevar(node: nodes.NodeNG | None) -> bool: + """Check if a node is assigning a TypeVar.""" + if isinstance(node, astroid.Call): + inferred = utils.safe_infer(node.func) + if ( + isinstance(inferred, astroid.ClassDef) + and inferred.qname() in TYPE_VAR_QNAME + ): + return True + return False + + @staticmethod + def _assigns_typealias(node: nodes.NodeNG | None) -> bool: + """Check if a node is assigning a TypeAlias.""" + inferred = utils.safe_infer(node) + if isinstance(inferred, nodes.ClassDef): + if inferred.qname() == ".Union": + return True + elif isinstance(inferred, nodes.FunctionDef): + if inferred.qname() == "typing.TypeAlias": + return True + return False + + def _check_typevar(self, name: str, node: nodes.AssignName) -> None: + """Check for TypeVar lint violations.""" + if isinstance(node.parent, nodes.Assign): + keywords = node.assign_type().value.keywords + args = node.assign_type().value.args + elif isinstance(node.parent, nodes.Tuple): + keywords = ( + node.assign_type().value.elts[node.parent.elts.index(node)].keywords + ) + args = node.assign_type().value.elts[node.parent.elts.index(node)].args + + variance = TypeVarVariance.invariant + name_arg = None + for kw in keywords: + if variance == TypeVarVariance.double_variant: + pass + elif kw.arg == "covariant" and kw.value.value: + variance = ( + TypeVarVariance.covariant + if variance != TypeVarVariance.contravariant + else TypeVarVariance.double_variant + ) + elif kw.arg == "contravariant" and kw.value.value: + variance = ( + TypeVarVariance.contravariant + if variance != TypeVarVariance.covariant + else TypeVarVariance.double_variant + ) + + if kw.arg == "name" and isinstance(kw.value, nodes.Const): + name_arg = kw.value.value + + if name_arg is None and args and isinstance(args[0], nodes.Const): + name_arg = args[0].value + + if variance == TypeVarVariance.double_variant: + self.add_message( + "typevar-double-variance", + node=node, + confidence=interfaces.INFERENCE, + ) + self.add_message( + "typevar-name-incorrect-variance", + node=node, + args=("",), + confidence=interfaces.INFERENCE, + ) + elif variance == TypeVarVariance.covariant and not name.endswith("_co"): + suggest_name = f"{re.sub('_contra$', '', name)}_co" + self.add_message( + "typevar-name-incorrect-variance", + node=node, + args=(f'. "{name}" is covariant, use "{suggest_name}" instead'), + confidence=interfaces.INFERENCE, + ) + elif variance == TypeVarVariance.contravariant and not name.endswith("_contra"): + suggest_name = f"{re.sub('_co$', '', name)}_contra" + self.add_message( + "typevar-name-incorrect-variance", + node=node, + args=(f'. "{name}" is contravariant, use "{suggest_name}" instead'), + confidence=interfaces.INFERENCE, + ) + elif variance == TypeVarVariance.invariant and ( + name.endswith("_co") or name.endswith("_contra") + ): + suggest_name = re.sub("_contra$|_co$", "", name) + self.add_message( + "typevar-name-incorrect-variance", + node=node, + args=(f'. "{name}" is invariant, use "{suggest_name}" instead'), + confidence=interfaces.INFERENCE, + ) + + if name_arg is not None and name_arg != name: + self.add_message( + "typevar-name-mismatch", + node=node, + args=(name_arg, name), + confidence=interfaces.INFERENCE, + ) diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/naming_style.py b/venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/naming_style.py new file mode 100644 index 00000000..8ccec428 --- /dev/null +++ b/venv/lib/python3.10/site-packages/pylint/checkers/base/name_checker/naming_style.py @@ -0,0 +1,185 @@ +# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html +# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt + +from __future__ import annotations + +import re +from re import Pattern + +from pylint import constants +from pylint.typing import OptionDict, Options + + +class NamingStyle: + """Class to register all accepted forms of a single naming style. + + It may seem counter-intuitive that single naming style has multiple "accepted" + forms of regular expressions, but we need to special-case stuff like dunder + names in method names. + """ + + ANY: Pattern[str] = re.compile(".*") + CLASS_NAME_RGX: Pattern[str] = ANY + MOD_NAME_RGX: Pattern[str] = ANY + CONST_NAME_RGX: Pattern[str] = ANY + COMP_VAR_RGX: Pattern[str] = ANY + DEFAULT_NAME_RGX: Pattern[str] = ANY + CLASS_ATTRIBUTE_RGX: Pattern[str] = ANY + + @classmethod + def get_regex(cls, name_type: str) -> Pattern[str]: + return { + "module": cls.MOD_NAME_RGX, + "const": cls.CONST_NAME_RGX, + "class": cls.CLASS_NAME_RGX, + "function": cls.DEFAULT_NAME_RGX, + "method": cls.DEFAULT_NAME_RGX, + "attr": cls.DEFAULT_NAME_RGX, + "argument": cls.DEFAULT_NAME_RGX, + "variable": cls.DEFAULT_NAME_RGX, + "class_attribute": cls.CLASS_ATTRIBUTE_RGX, + "class_const": cls.CONST_NAME_RGX, + "inlinevar": cls.COMP_VAR_RGX, + }[name_type] + + +class SnakeCaseStyle(NamingStyle): + """Regex rules for snake_case naming style.""" + + CLASS_NAME_RGX = re.compile(r"[^\W\dA-Z][^\WA-Z]+$") + MOD_NAME_RGX = re.compile(r"[^\W\dA-Z][^\WA-Z]*$") + CONST_NAME_RGX = re.compile(r"([^\W\dA-Z][^\WA-Z]*|__.*__)$") + COMP_VAR_RGX = CLASS_NAME_RGX + DEFAULT_NAME_RGX = re.compile( + r"([^\W\dA-Z][^\WA-Z]{2,}|_[^\WA-Z]*|__[^\WA-Z\d_][^\WA-Z]+__)$" + ) + CLASS_ATTRIBUTE_RGX = re.compile(r"([^\W\dA-Z][^\WA-Z]{2,}|__.*__)$") + + +class CamelCaseStyle(NamingStyle): + """Regex rules for camelCase naming style.""" + + CLASS_NAME_RGX = re.compile(r"[^\W\dA-Z][^\W_]+$") + MOD_NAME_RGX = re.compile(r"[^\W\dA-Z][^\W_]*$") + CONST_NAME_RGX = re.compile(r"([^\W\dA-Z][^\W_]*|__.*__)$") + COMP_VAR_RGX = MOD_NAME_RGX + DEFAULT_NAME_RGX = re.compile(r"([^\W\dA-Z][^\W_]{2,}|__[^\W\dA-Z_]\w+__)$") + CLASS_ATTRIBUTE_RGX = re.compile(r"([^\W\dA-Z][^\W_]{2,}|__.*__)$") + + +class PascalCaseStyle(NamingStyle): + """Regex rules for PascalCase naming style.""" + + CLASS_NAME_RGX = re.compile(r"[^\W\da-z][^\W_]+$") + MOD_NAME_RGX = CLASS_NAME_RGX + CONST_NAME_RGX = re.compile(r"([^\W\da-z][^\W_]*|__.*__)$") + COMP_VAR_RGX = CLASS_NAME_RGX + DEFAULT_NAME_RGX = re.compile(r"([^\W\da-z][^\W_]{2,}|__[^\W\dA-Z_]\w+__)$") + CLASS_ATTRIBUTE_RGX = re.compile(r"[^\W\da-z][^\W_]{2,}$") + + +class UpperCaseStyle(NamingStyle): + """Regex rules for UPPER_CASE naming style.""" + + CLASS_NAME_RGX = re.compile(r"[^\W\da-z][^\Wa-z]+$") + MOD_NAME_RGX = CLASS_NAME_RGX + CONST_NAME_RGX = re.compile(r"([^\W\da-z][^\Wa-z]*|__.*__)$") + COMP_VAR_RGX = CLASS_NAME_RGX + DEFAULT_NAME_RGX = re.compile(r"([^\W\da-z][^\Wa-z]{2,}|__[^\W\dA-Z_]\w+__)$") + CLASS_ATTRIBUTE_RGX = re.compile(r"[^\W\da-z][^\Wa-z]{2,}$") + + +class AnyStyle(NamingStyle): + pass + + +NAMING_STYLES = { + "snake_case": SnakeCaseStyle, + "camelCase": CamelCaseStyle, + "PascalCase": PascalCaseStyle, + "UPPER_CASE": UpperCaseStyle, + "any": AnyStyle, +} + +# Name types that have a style option +KNOWN_NAME_TYPES_WITH_STYLE = { + "module", + "const", + "class", + "function", + "method", + "attr", + "argument", + "variable", + "class_attribute", + "class_const", + "inlinevar", +} + + +DEFAULT_NAMING_STYLES = { + "module": "snake_case", + "const": "UPPER_CASE", + "class": "PascalCase", + "function": "snake_case", + "method": "snake_case", + "attr": "snake_case", + "argument": "snake_case", + "variable": "snake_case", + "class_attribute": "any", + "class_const": "UPPER_CASE", + "inlinevar": "any", +} + + +# Name types that have a 'rgx' option +KNOWN_NAME_TYPES = { + *KNOWN_NAME_TYPES_WITH_STYLE, + "typevar", + "typealias", +} + + +def _create_naming_options() -> Options: + name_options: list[tuple[str, OptionDict]] = [] + for name_type in sorted(KNOWN_NAME_TYPES): + human_readable_name = constants.HUMAN_READABLE_TYPES[name_type] + name_type_hyphened = name_type.replace("_", "-") + + help_msg = f"Regular expression matching correct {human_readable_name} names. " + if name_type in KNOWN_NAME_TYPES_WITH_STYLE: + help_msg += f"Overrides {name_type_hyphened}-naming-style. " + help_msg += ( + f"If left empty, {human_readable_name} names will be checked " + "with the set naming style." + ) + + # Add style option for names that support it + if name_type in KNOWN_NAME_TYPES_WITH_STYLE: + default_style = DEFAULT_NAMING_STYLES[name_type] + name_options.append( + ( + f"{name_type_hyphened}-naming-style", + { + "default": default_style, + "type": "choice", + "choices": list(NAMING_STYLES.keys()), + "metavar": "

    !p=;UnMVmSVdI*vZqu+LFE&DQMHlvhK zauJ&QE&I1aS?%bZS3~Ee$^isw2aQ;TuFI;R{XQ}b_XlUV@6EYJwpBVofItL6=>`G3 zE{X){RuFszcj;`V5d`oq2?B#i=}cst!_71GS*if_Mm{kQKKVB2E?baDI*uyO8f4{l z-1BAn7z%SpVqLlfOVv7ly?OvvG~ckKktjD8I(2 z?j=NVSin^UC`w#V*7bA(x0}TLEgPZIGLLx`QCN)p){NCFbevQ{wsQJXn-zE2K*3Ar zxMqPe0qS>7=T6^t=Hl{KXKZtC4MTXdn3(mOGd^Bu6|U$CbF$Yts&sx)MaHiXXj9`_ TtVKJtMOxV4kHK%pZvXcG?_`l2 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/ellipsis_checker.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/ellipsis_checker.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32fe68fec51afa5286e978af94daad924de8894f GIT binary patch literal 2038 zcmaJ>OK;mo5ayCAiV`K;G2A!Ot`9A$0+!?SR*MU00AcX;E%;0@uNTV9*r;wyahf_f`_?TOJ@KiwR}aWvMEX5oPdkAz~Q zRI$BTc92RIrd)Jip|>59yMdHx7GzN>HEi2IJ=+`j{qG0;A0F*KgoB!d+sJXh4YcUb zwZZnoRK_!3iRY6@3GRb>KM`67`^9BvZ}vEnnNT5`S$?i?`2tRb;Ss>b~dLpt74!2@l*@Wjt_)n*@1Xli~*!VhUo-@gPVcmEDR(Y3KmS$hzs6j_gNfC z!O~HIbYU^lStR%I2<}$KP}fojEE=IrCGb38JPmcG3aPm-V+Fx-JeaFjHv}N8Oe8{P zESd}GAQ4Q5=~#4C1JKSX=JL`lGTQAU5V@^HHc>LCyD4C4E@cX7OjaL@_z;LQ^1^rt zrF&$mUPjKyp_y5S^xRb2^Ifs8!I?cW;q*4%fVZwc%bb#KKw`}!s&>wd!zQ=R2&cbd zJJgL!br=S&EaasGEi1(_6zy6hmF=?x1X*SAe=v)Jlh_CeXVb*R#j7 zY&I5oGtzJudM6aQJq{F9n!*Cf>EL9na;F~$T7M@-x%;3D05+Zjb?jrsx2iX||Kp?Gt;fM|yEheb+KZ!M51fKo zw$t6d)6-EVw#Gqtgu@3I&>mT@oO`-gb(>$FbjP#YokA>`UzE}&*wgRA(sEnGe6vB# zf1H~6_j-NZa$eK==|>ef<=E*i$?kS&;kI%?UbS#(!_ukej_*roKi|)rzMrIg5+mL6 z{pXV)E;$tc9!>PVRyN9hfD6XIw7id72bK-^G@5V>N~lTS*zOuBIJu1x3#ICK_sWY9 zlUY4TUv=|3Y|e}q2K23QPF@n|Km$fB+3lF#niBg^!a`Me6(*n@J_ey1e&tSe`AcAG zoEYmweF8rOrVzO9QfD=<`#x4gfy-zDvj=cdD4E+(WzeU}!c9GZ;Ro}ys4#DJp44uY zR8@mJ-a9u=yOS)6=TLfX$wOr3xFCjwZ%aWGSR=x@^VK{_Un5W&v8J?TmM_5FB5T&l Gr~d-R={fZP literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/exceptions.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..257ebcdbf839162e925e154ded5e59e4909da76d GIT binary patch literal 20085 zcmd6PYm6L6e&2LY&vR#&%jKIAr6!LQInwTs)LT4SBDq{j)JZEHNxkOG%+5~t?#^-^ z%jzDkc0B9TnYxFa$cgX1#IP?RKg1UrL2yBUz&Q(dhT-^}ILUnof&`5O2oNK%gM3L2 z0p!(#`ThRY-7~XXo-T)c$dXf2U0qdO^?%j>)zcmw%_kFy#9!?G@st1kcY5A`MSbWm zgR3)%gyH?bNF?4!IEiw?F&wjDG|jSUu%2ur%SrjR%9ebm$|-zXjdU|p&PbnBBiqcC zbIp7?AC4I*kDyPwG14rQ3(e8;XmhMQCigOpZO!rWxYV~8KU?~(dQV{da`d0%sXdB0p28V@udEI()@+?=Z7IirmO&4Qz%Q$ag-;VlPDi|o^YOYobF(V3`VcK z^ZHC>`lXraFI}8{F-V?mtre3&s?~N}FUYj#m))B01y;weH!yVkVr#)wZmZ@_w_CpZ zu8$eE#ch{duhZ~@eV046n(KKBoyMkHm?2x^4qWA-p5m+?rm$YR_~J`J?&9o)nM*UX z(=)iY`&G^|e>(c(@AE%Jn;{wUPB)|0|xauGYBY=+8vO z!e^S4e;5@f=cJtU`__8GPuwzmvzNGSt{YCq$-bZH8Rru>4Zt`*8zix7mBIiufg-Tx z+wDdToD=`CPKLY8nRlY%Cwd9rxM{X?oYha>G%qLa7_&ty$k)Ak%k!&%SYY{UD=u5S z&U~#=^}Jy8T-9@DBK#E%#mVj@)C2h1ci?dU&ROe3~zu~rS z9BHV_Cw57Dy?eMtyJzL1G97@Fe*V350l%vco1_0xzoUBt=(LC{tzyI%JuC|e9rpf zAw^4o*vFsRh4CQi4Dhf5Vh-|)uHST<^Ps^X8}1oIs1ESinefi$HSO2}Ivn7oQRIz6 za?DUgPGEU{)88lv|CDCIMPRB-O*6~Jo|qp(_OW~RY`f)d%)~7D6`y4OmBI0o_I(-Z z>ZFX<<<%NN75xz}{D3D6&qw8JA(<|lzOkHKFmIaba4)fJoljidxo-NYTj`#8+gMNb zlIkD`I_YPYvo}reV9)HK_nQeLaedSQi}Vt=ay{cV80PBOda~bBJ$}8|!?>_-k$sD1 z_kUb+YaQj)Z@7&$dr?as*OvX+bxIQuqdmW7`%A99h+Zul?Bcskx8;}ec^iKh7vyH# z`9`(TaqYTiSM5gK^KHn&sx4rfgb3urTpQAm6S@tV$ScW2mqc7(T+0T#hy=7(m+G}8 zd#&y^98XW;VOcU5Lbh4;W#qA=ZB<{ax2g?U`O!)HXuKS51GHy=mO;rvou&gpq$q}p$pI{+F7W|(Ol9LvU=dxLp_e;N!hCl{ zJ%1W~e#(cL@9j@?AF9;73fEU}EtX>kIXo?YH}l!kzV6u|$?zYj94I6vYU5erQpTznfzXAy(&3%!@ z$uthUx`QQeLej?0X5Cw9RBNt-)hl;OhF2GKr`0#19?P|@3lpRDMNPzo;KqL@K_StCB)G38N2%!$}!*3U=fCu5M zrS|Yz!}Wn;ASpE}vGB%U`PccC!QGBPL{PjXIXwS!uUI^gY!*KNG24 zq*|O9&^fr-t>_1{3@&m~C`iuj9ewu1>ZfF;ZoQAnj?g#v;H|a%>bv$KO)sTV$rgr0 zf2tqxXG$shn#!9MP$uz-Y#LqPuI;nzZgAcTb)G*`B);vRxH0Tm|W_ z0kgt%A)cJJ>yhv4Ei4PbmW2*!svEnw4KUeM3%icj+3jAWMk^F|(9T9=0kzIWm66>s%Q*(2=?bO^{IH{JIvMGCR z?(&)kb#CU}x{nSx1km&)cWu61RnA44ajLVzJ9-jukvEAWJO!wd)04SGa)@MuLO-iS?d zCiuo3m{(%^hGMJxZ|TMmP+e#@fa>4!B6k6T#N~@m7lp=O+P%rzAPN?!z5aSK1B|1**NG zZJQ7&S{lePIq&MT4j7T=c;MjLwM_@lz{*PYCAZmzw!ouFM%dBh#I77zEx*pQYts(& zd3{i$=^23H2{0+O7X>yW2I@Z06e>XEb$wDE@s1wBcBrbNx-lWooPy3IhYj1SOOQOT zi{s=K)KG3k`- zw@9N@hcyKB$rj(Ys|yfJ5Ib7V^xH`#Hud zBk);;?jOOZZ}p0mE5a_6OFVzSI1>rFnCH1(P6KriUO%o8kHTOmYln__heArh#x{27 z=Bf6|fUfYXeG=y^@vesEk2VfV+&-kc*k?(4=T03eiD!VvLdzkLB3T604{j`|3iJl7 zLVqSK3|u>>6vzOHz^;ymteNCSe>>fwtmoL2QglGNM| z9F{0N_pK`E?0p;pp_DYZy-8rj?W7SHk-)$rRtb0xZdP+2kw4TQj0E2{*MUU}4EnSI z&&>4>@FFXE!|RBZ;Wq0a@X#h+s@@=|Lqd!vhNKHAKb}k|KBTEow0a@MKL=^SZIKR)=o2jQa@xBjHPbu8d&V7+?z#mhDLQ-=PMxH?1M zR0$O~Q8p0pG93c}t_dgW~yv{ zWQ~iC{#d8eYnq!FN2O=<5|soTv55*c6FIp|IMk!Zr7D~kZf?tS8w&~!`Gh=gvr`H# zc!pCdl@HOwqoXSghhTT-z@|%47d3+0Tl$n`Vf1PBjOE0#am&1&fCo9*gCDSG?m>X@ zW>WmfyL-tV{DBDBVbSm#Tl5?2tD-p@qy?OnVk*d0Dq?|FDvB|QAVp7)3NmojSAAav zqq--cUWE*WU-TXHk`2P4hmb;f6zcv8_16mBKbv=*lHq@ZFRvks$E-$P)0tOum_QsqgOmxXzcr)bIC#8Z@Ka5d& z_A$6;wKq_NFBp}l3l5>Pm#^3jx4KX)37j_aA&x*xeZUM600V+_)(h?bEmTPRj&aRY z+Yv>97uo@PE+>7z{qpI;t9bY`0K-YWF0+lH>=8CK6)1}EV;qfY7r3o)6a)EvIlTPP4Qb{sI01Yp(MY#w8?#pr+z z7i6lawd+nWb}@|k0@nOY7BTY?~Vgk1#7Qh zGk>?RkxhLrrZ^Kq?wX_*xtM#T;f>+ew8%YGW2?i$Wx?&LUt`f1&wcT>fE)iBACIy? zi?^{oimjYx=#SKKhQf`UI3(Qm#KLW_lXpfa+}sp2kbTamGlr{-v)|e7OrVx^9)O0j z3$>iH8+`s?uy2@PUx5&dmaz<`>hRLW zzA(?F6c4-@-Wmb|5z3DMfvFnUI20eSInSi#(-$mRZ7z-CnaftIf;*4)$ zf*@IIc$+sE_K#LawIkHj#*FT}4Acsu(|!gB4iC3M@lph`XE2MFBUv5g-Vw$RDs)IxJl}!X54J5; zy~?##d$m=Wr_-XGMGQhh5SyujCxiM1i(&k$zlkkxx%X(Tq}F&3%q8G416<;eLfAY>+9m6X>VhK$3_P@_IWCr5tap@A ze}nZtt8THuh`NPyW&H4FMRDBAO;V*8kC7*gd-U^&J63-~G5ZfJ0hDB zwQbHhW>lg!E^|J5n^};^sC=KZY>(T{JI9?9(l#M&C*vH;r=4eRXE4jN&U12qhcm;> zO3b+Po5=ep@4~TnLDA6Z_Rl^j`8wB83}COMkQ|ce?jBGw`)(@4M!UPCM6VKUs+i2W z6LEXo2AS;L=pHzY476r-%5zt$@NvP^7qI~^3-sdWyC>rAbb`Y1CSDnOqU@@@T2qmnJVXyRwtp?tR|0t)aXe5d4mr?N(Hz9}M3lNiI zIVs6o!qGPjb-<^jhV=fOgp>Sk65Je8!3QZA3OPS>GjS_>8|R4}(An9*D0P2$Su#P^ zs42wst9PlL8}QEcHTMCa!f8i0oW$VTh{|izQAUc_k9h)!4FPbB$a$TWm9|1G8BP?y zC{C)7@PfEebk3svMCnAyhU?Tu_9(pIG(wT5f>{W7`xuf<;Cek8W34-S)PA9el_JJi zbxPew^)#pKX<`o#hS!^3eL6}P>Wdxiu0+5DsVJ*}XOPwdfSxQ@yVzE1L6*1qydcft zt#**syDR2&k{_GlQV-I4)?kqC`o;~?3qwjkrYCE-r9&UV2zIF6(qs~(031wa!CBcV zYWDyb^xc|RHg^myZ$*keh!v}UfZ_=XP+nzW<7CC2F_Y;}O^fFRY@3hF_r~(w-F+er zeNZJnLrrrU5$kejU*P3=7Gev$!WxZ4t+>&zFmx_jXaGHGErP zSnC>9hp?XD0qqv6#JM)mHIyrfTyBt(5EyJyksP{_J?WtrRVCOT-a;NlADI;yCW^jx zfH0F!JG3=pYW|?}5_lD2H=-?NPe3~ewWXO-?fzZ5Jz$Xo3C~xk> zH8OM$+>1_q?#TEd9P!Lg;R8$?-rqr`XWUANlMb3{XrAusnYXOl359R!cW`9vB6NF5 z0Y#5Ado7sj7Scga_(m_eoatFe2R*@>IQIrx)e(+ZFxFG(eLC!&LhlQZQ&~zRKi7AQ zi1e{$nGWnCD*$dKAxN=7^WcUWz4iiBZX+1E0DF|8=DfR5&cTyF4`166cSSI&Ve*m= zy@H#8Xe0xOElLFgezMpMRsWdNWx^<6IfL*%QsKa*I+*P`o6w`ahyE3!#YQD-!hdi# z4ZAd-w7_VEB$b!(yIFh#L3g`T_oC-#(BTle$WAf3$WmGzUuHfo@~9mHY%mW0s!0J4 z-@pW&k8+(B??DkL%%Yc}jsoC00eC(HIC>8BhF{5h9=MJ=_FbX zpVb0MXkt|C3C(N&5Wv~YaHJCTt1QHl6x@rheVuK88^w@PDpL$IqWXPw@*@T;q{wgu zGcS0BCj!{rnaqCLoxCrGw-6OW2&T;BGKC-i6DqOH%!ovT3!U} zN4R}xUN2|x$x7<>BW$^q15d;4zMLn@;Ur4pKm@i}7Xckm6yJjF@|zb{087u_+!a)nkp0 zz#s=hQwK}?(jc(t!c)J3`-2j?yc_3u7)A{xzC5ZtAv#~By-;DEoy5d9%ZNLe>+7T( zo~IDp$-GJbVm@OfcS3a2(+JbXq>XBRYNqlZ6-LavWAtt%%}>WI_$hG*9xwPUtiQIb z?qf0FqPS7%{wGx?j9YH((6+uF8wx`WOa=e~3u4jNF%42;^hc2siygeUMeC3+2gs`d zc;m`MN;fEgN!@Tv!?EpHXu%5ubZD!6Lb)l}8H25drB%<923;=LgBLFo_bJk4DXLofxkh&foD3$T~H@bEf!>GD1?GV2t+uT+(@hSs9c2eZ`xb%(9d2DLu=kc zn9fS3!BKp<3Nc61`pmj(6|9d@w@@>>U;cj%hznby{0Z_LQ7!_tpbx1?jD8DmzHTi@ z%VRLGqW4oN&}iX?C=U$xj!_roe^?YYy;6r>|f-pIes^Pw|n{**mV4s zmBcHrs4sCLhWI3)yAAW8`Xk=V2H6mI`aL^sF;H}?Gc2BAL6C@)hA*dY8U8U^%lW>S zpu8`f3Dm%RvH=G|dH*oE$e@U3xUBLXbP!4k0TfYGc{gs5!Zx*Q0R9OVMkoe*Lb1P@ zGyak!_AGip&D-A=$BfoNGyhxO!lQxbE?Adn4D z1T?SIU_1$F3>(|dBlC~>a7`Dc;n8Co=A^wbQal>@_+F5usSokcVpcQwKS5oq|KCRq zX$tOwuXqRtDZI70q}>5`1_ILMe3;(}<8(8hhv7ve5Vltil9s6+jhPRbyYa5%{e3Xf ze`7R^x#8tyI3n%=Sq4*0lQA!$G6b@t!yt3u4hz+7sK^xjx9QYPh2YClDHia>>TsyA zsz1Zb>R+N5k_yBZKah8Z_zm?dl+laY^bKv62Zlfpg3`t~or+sN~4exBysl#M3D%C*3 zG2)P}pfPg{CRzHfd3U#EZFC?0oW-h_IQ2yq6g}!y7H3&dXH-!@EO)47VOi-st(#sKNicy*Gt7rf@BP}${9RAiUwNd64$PBZhv=(35eWh>v{RtU14iQ)t5PuXjo#lJv-OtBWS z_Zh6yYTy~(kwd@98f8FVAq>*z@UtGTtpsL!MeBu6^M0Gf3W{>}VweIlV9EUk@BWYl z&A@Ul0)nUJ*tm^_LQyRAb&K+Zh9-_0Pbaw|>tUodA87?%fS3Ip_g$^he2r5;N+*<9 zg;cW3qnH4%_iK22Nt-@}#q`z&s;m_rd*s@?X5 z1j^fI-kzR${mRAHW-nJ>eeL`kugrk+M2D0m51&Fp2j3#}$$1knw8sEbIQ~A~(#3bb z1W7z$f@^sb1=L>dd2^<3c0d_E#QP&GgnS-j?Vj;J+OqY>TekjWb88k6ox*OBMnA2np|PTrt@K78<-JCPrGjanxIKy8Taucu0Q#3Jc=R=9RA(>Cf zNNFf!OfXVafPx@up7u3_S!CsLilie9T{c9 zQ2&|zLn_*Vx}G_$e_2EbWRk5@ECi(`4zRS~q_v@21<}^PuB5M!<)e}}86bUpp@ZLJ z!teViK3g4SafHQf6v4JyyV1Z)qZEXt>U>S{Pzcg^!4d|RB0Thu_J{~h^D@JN>UVit zm~LF6qaHsyrKo9@$D-D7jy(Gd_5U_&WW4e=9p5j7;M102d3)F@Vf+QWCg|zoffBqt z8r}?N9cSA}*v7!W608>a2sty(utq`;wpF5^VG(Ixk)(GWGro!YWqG$GlzW;=h@AmS z6@+SBp4KS`&y!d@io-OVdRbU`Sy*}FMixvi+{);s3+ etU1Jp7tPwA+Hpqp8pWZP9MfA_ao- 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 D-r%Lk literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/lambda_expressions.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/lambda_expressions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13e428270420ddf1b41ba1aac75d9aa1ece72a79 GIT binary patch literal 2737 zcmai0OK;mo5awe=Q4dS9<0K8*q^$c$1;kPwXn__*k<>9_BZd$p>7lFxg4V8NI(#U* zD<={hpn!AjKj@)7<{$JIzbyEeNd=I^-zm+SJzQDLL)L=Q|V?%qJmpcIti_)=oXb; z2<@okmXvOV<*4FTbd44GC0Jh!tI>kHpli1@YSYp)jh0yH&~$5bk=AJa8FA~haZhV5 z{f;3u^|a#0aUy*gB(cEPaWL@0BzLSve%Q_VG~?wZta2{kF9g`W(!KrPpz z%d|qP5Nna1&ZD;J8OUG>Y$bXM;y;_7-SVRy>aRZ;a3%zVp9eF(suZV}aAz3DtP7() zA2~ze_nDLQoKUTE*mR+2jh8ax>Wr~zj<+)xGgBQOT=io{9ho@3v+wi3-w9dExygD# z%)rze#$5yx`~`8}k-N-Up{%#!JY=KC38zjF3(0)iIyyfS-D>VX+dg8k9PfWCz|G@b z7Q?Qu#q0!PE|y6o4)?(&2fu#ofZrg-D11jqKc+sopT_q%kh`yk*MhV+Ur)R1hap5m z1J1fK9JQSFC#*Y^Ol@!i8YCAY4AUGh%;uP_o}`Lfj=%rkBquJNJcQZ&mK>P1+jea4G8xp03t2w6(D0wKAH7Q#X)nj|HH zg+1lkwZmQEv5-Zs&2x=cVXhKKUVAr*SeqmLczgZE-ObMGmcMhQz0czPb{Oom2P3(g z#MfF^F1JM>+3LXWK7qGQ9YwA zVn}i799NOIh_vGBm!M=^&Dn8o%D5Ar>N!sh#ZwLVk>5?TqYjxb!ZuBtpMpnfWyh&b zlb;3)KZD{dig!@p$pJ0iLmjzsav1zPyr%Umml&f*EH}U?mOwQ0dCctN@x`~}G2P>+ zoI$b%t>nMa_ynBHp|J?{K`7)e3pC5#gzVvNl5y+pmGNpHspo=1}|mUZbp~%{oB}W7JN^y)fE&9;al7K3Txb>{vv?lF_;|IrG z%&iK8o)3RvRDHRX+>YR6&>);DyqP?vV5jz1*)e{NSSiG-q-s=kxIq%Q8)j|uUmVWX AWB>pF literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/logging.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/logging.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..daa42dfdd433ce97a2edee701d573041f6f44e90 GIT binary patch literal 13195 zcmeHOTaO&ab?*CI_sYwXv?#Smt;mtMv%J`{MA3}s6)Djohl+M3MJ+MI*{Po0*`4Vg zR`=|3$Fnva(vbqhu^l8xfH=W24iG3v5Clmc@{*?@4iF$udFt2XML!@2uok)bPF43@ zmPa>XPk;B%&rQw#8}dV+G_GD#6g4=j zD$2VGQyhhkZw}#joKQ_%#}4({il1F6E?9W;RmIw3BXToQx>98rf#f z$%%Zbk#CMTBO;$}j5f!dF_F(S#+wt)gve(blg)k3K2>pzmHjNYYVzyoHIFA9a1N-7 zXNjwW^2)XNhqxYTOf?TVhj9NW8)M^af=#l0Y(G2jqm*-)9dwVdsSC=o!Vdjdb-v_2 zwWP4af2`h9ouio}?5pf$c8ndrZ#qxEp|I!J^nHa*yCW;l+|wPKy~0ki!hOSemYrua ztcct(_9{Eg&LDT3U0`2fFCq6F)901K*E+}Mmfh;A%k7%a?RMbWe$9S+BV6`9yWuY_ z)xD+SXSC!6HOf^y&krkM-S>hLu16L=c>8jB?#;_{Z(S|DQP3iDu@bmJWO_bx12h=B z>eXECdR6xwH)uCP6s4>3aa3)#!+L`fu?GOAmp6&@D zO%Kj+u^rkCx3cD9u2_ba-w-mgL*GWCLIv;}` zY(JHVQI-$)R{4wnMUloM`G2tj9|jdA*-!S*)Qutah0=MX42_;xkM_j6m)cdn`wN!q zF>J_V*pUC1_T&F#_xu9o)p_+@FKD+~J`aHb2?)yFXjhkkEL8xDJMQc+rOvagUJXBlz)#tG(~O&uaee-c`HMs| zBC}QrD~-qiJ@F&c<=p2{YQ4fen9eBU-l@7Rq7xuB97F}oATp>nGMT&BUMd(JZ92f0 z;akI(f2u?VS>f#oL6nML_uC%3E*L{(5(5af$3h}Ia)f}Tn^8(KiXgJM8@AE8vFQ7a zs*dp`AIj5rj)?GU$b?E)3Dp(tp5{M8`4t^k23>Vket@o5%&xkocq&s-rtzmyW_GnT zWge6nv{0*j3mE%4kpd_wRJ2YyIWSxxHgj$6wzwM*SwO8Er{G7$Y}Ur-5_Ijn$k~E= zowpZ2HwJsTG`}Ew0#y;juoyQNi*eq*A=bCjumksYn|LH`4q{*lWAeaU0wOvX2dGvx z9PTDwyC-xMkNAmwh_SpQR=qb5>~_$sn%JyAa}C6%N~J-> z8?E_zJ#ghBEEKFLTL()6f?(!Rs)8B%br$6YRuGh%bjV3xO_~`r9q^-Pp$GgpCDWAH zNwU2#yX-gJS)i8Z^4ZIm-nm+uxmH;`GmG86HruE#&b9>oKUX|+dNu&do@rI8t03e7 zDjFbwvk8TtjW>0%wGoZhgR-1dndIZ+als^#{8(Pqb|y9LQC` zk=sJCt2ioLIgP1s-89E=O~+z7GnmONmSX8288wY%SeE5j9_h%EMo!d^%$ioy;Lx2V zHwrFJnw?{Z*kR-{?91#+>?!23aDSd=&mfm$F9|2gaPn}d$cZwX5qA`>Re`;5-+-$% zhPE%VQz##YQ#H#@BR9d$V1JyCMz2X55_?abXGKOBBGOS3e7rh#(`W65TZ~e1L1!$^ z%*YyeK>Rdj9qH9zt#j}~)o(T{(0JnI!m8GT@M5PLKQQi2D7_E_o&}pq4~*?t4CFl` z56C3Xpf{eLAJ8NIu^}uLj3~w2S_Q6JWY88A=u=s%@W@zp8?8s7b2{{pUH?F%-nk_W&(`OU(`NJp*{E?|&Pc67u%dW$Ad5&nf=v~QuuTfmo! zN9!y7DLDXg@J`vc(D^O0SSYk_eRK0xJRhnp7EFE?i_6bZ@?~1)lpJZmzd~1Pc{?xs z)#7y_C;mK@8YSOzs~WP&$3%v{a|E(AWJ2X0ptY<5IyC^Qv8ly56QvelSG$M0a;i?P z(p~L!<>u6;-qp7<@cy+2+NKd^yHGQxts4Av*I?RVg6cGK`eEgQa{DkdplW94m*(Ky zk#h#4FW3Z}y&AD72pyA-ccWe7e$#FMBw`JTD_Aj7i=P3_6;4U1kc;%d4WrR=ywqiZ zf00F7+vSj>@73x{PNJmcSV^5k_GP*BaBWHUBg2>Dy@i(bzca4XgFI^kjuf@T8BZCxRdt9o)RWZ^l81!TECy)~Ie;b+3QAkVasw?VY z1+s^^g@ngH(l+%?qpNqdRgE7(3w_Jz8m&WJ{eh|~x3ljH18XRuxp6{O=9*YX57c)Q*R5kE*!vREn@yo9In*C~08k{d`++FLsQ%T)RfC3Y_v zR82Y0zein=MKY>o#p)Q3o}iAh{dQI=;vDSg(27{-gH}W*2qG0^nU9r^RoFt<#{2nA zjb%SpYAV@CTw#UoDSYY^DCvs2X?U5geow*LnNUv?z?z;{K2f){Pn53lfI_9XF626P zyk=y?g^h{#VNCCWqQFOf0#C2vJM_W0lzlWdl2)kT$!Z8_1n)d3uT~6Pn{-WeE5?fT ziMo;^*7>PgDx~>I+$V_(A#Ieo6oS(sy5&ZOd#42>RDwqHQ`G7;N^B&bYC?^rRH#6L z!x;ET0wJW>KS50_gi$EwsHQ#aoZVA7Y34=5^Y9y7Ebi)NdrIaabLcsX+V&9<+jO8h|el*kH(WO(%f8LCCpDgG%S))Kr(s? zneV{h+{|pM=v=`Al~wIMbaxxPi}nxyRWzYEuX&qR5b<5Dc-l!584W_8i`AEj(D}@T zCD$V{UHn&i1}Qv{7qF1s$?kM6fAO_OB)AGY7W9SC>v^G|T`3htcm|zIMG-1fpvxDK zIO%eW`*-Rt_y}wUJQFT7DLqFWBBIR8XazL%Hk?c{kw9n^rk56BXznt;h*qDfQn760 zhjl6$;J=_IID}*rc1Bv8v}$SABW-8g!raxLN5hg%OIUcKAYzLp`I{(+IenByT$>B5 zo+u03PkJ76Z`go7I(wP~KAN&dvuai| zR0ELJIs8QF$-Z^$gdvwSja~?@pl)h#9!l7SQo$k~BoGfK$Z7@?r1O9WVn7PtN9PgD z*wnrKT`e>K>?cLrL<$9NLPKJ;;!8H zbU-AH5a0M|qj*|?He&!#*!F>%anyVVHJB&tK7nihu1VDWLAZ~YAO9Yei>KwE{ItSI z=anabauJe0*>KlfV3A~Hr|cJEdPaesLJ>U6U;2zTeu-a1DmdV_I=!vF_!u;hyv~ul zovC2 zZdvRuX!I>AO2v(_%Y??-C=?3GE68o*8;l~62m-`@sHs4abG!8Lu??^XW^mGI43)@E zWYDs3a!d>Roix}qr-H~@Mcf7zZ=iy&Q^TX;SnKlZ<+&TB_b!*NUM|gDE?;@KG`Dc| zMrmGJDgiC#*X!PmR;2kY@alFmGKic-z?Z@Cut4O`mB0owge zHtwe72T_v8lo3Cudl{2Nx2YK*w%sHib%_r^6=T=RmcNr`=(27?E& zgh|YF-k9SqoN~L8INQ=`g@+EZ1n+jO(x~Gsj6!)729S#`jv>*INFw$4%Q8xm9dkBpyls4303PH-7UBw zUFRV>**HNwz|+z-@6s7a34A0pM17W!sS;TQb ze3(hW0UQlTT#7|k@z)rfwqO1$zea9vVcIc_Fmm>gcc+I)5=tbv1BAHJHIFWS9>7 zqHMuZ2^(by8wDOnTrl|-tj^1c8$@xUUhs$ThL!~fcCnhq*wIt7BCwj4C`z@xdKFp= zDriad6dK9bP>Fbgz<3_uVlPT2!hO*JtPJ8>2yNf#2MjoWk#71nC3lewx}~zK<5V?G ziQP*C0{t2;3nYoBk;x01lGU^wd>^HC?V({NXp{fxV?O9^z~vvKkL{88g@O-HpR&)~ z93nGhh=|S#k^Ksu3Uvg5Axbl)Fzvet+<-!WiUeZ}YANdu!z6QEjV)~nTRp}h*8r}TL2#C`N zdL3nHsL@C`)*V5>3gtDOWk{9Yr_hA9ng3RvMj&(Rs_1Kc1pE+EK9JMQ8~31B^~bY9vGSki%r=PY^20EJ4r z;QR0-vE4aEdU%bJ1C$Ur7bc>E*xYR|EYndiNu(SKSxG8o!nm|uIdXGx11Fx5#asdu z0WTceN)Z_1?1Rr1xB~zITH_oUDvZw<-$h|*v|qy<4VGPFF-1jkua9bO{wB+aU1||5@LC|)xhPGqe9oMrlIU7~2hofft?kK`|2;Kom zCnc%d=^Xz8dP4y-3gq%vDS4if3rJ8(%$pNce7tmF&(imXOD)-hC?)GG)#kA$^zS08 zh35(r{+qqNPEhG!UxfSo2fcbR+Q}$g7J<)lIm(vf;4lfrO5UYpl@g-O{4SCxPjUQuRVp(lTEWSp35gC!*`_jK z?`DzvF1`T`GOa+=5VU4!niQzS%zJYU0h%@e;*Bm zL}I)ZDjww$NWc>YeBoFTGB%PzUpE?WA#R6&Xj z4-@W2WXZ`#83|)_bVJ7^fg5GtBfJ%Xe$H?MMlN=sOE*(k4DZV99`yIAcN+8&WZ<(A zfb7uM&^7fCJT(i(dh8Q<^14H~XiS5!<4`7q ztyfxTHb?eD`cTsS6sM@t;=|VBwMW8YQ1~E>-!7oT#Qsr8kJy6f4FVXpBS2ZbhlI-R%OJ0Y(W?FAoidwTR15EKtb^HqAU6)MKLTMZiJ&qcDFU2i6o zgx5~XmXMr&pTk2TnlmIOa%V_e#g?#<5nCdMsI=fA^dd;+7Q zri{jY&D@WRzGki5x%i-U^SU-v1@1cMk0*LyW;vWtT5#Xf# zl@3ighZxBKw6KRhx)^!@trqc6@c`QS;sI$wd336*C9%E)2(kJELy3&lJD;kN4t6KS z(L=xA@5}g*()lWu;t64@J>*>M#ro+$v!`FuH5V92kcOAUZ_FUdghlsmSL=l7PNkDVPxw`}ur1Jv# zD!nl2nE55@+3qDYmMEPx{v#TY*c~eWThw48y{3p3K1;V9qvSXx&rven%L%F_=u=GQ z{)DOqOUWegKkt>2AxMbdU-nAl9>h4sGKd~Xu?y4u0e*;a)!KN=4IGQpVELa?sUB>= zWk7HWM4gkqa&h28>m}kg&S?BMPtS`fGz&WM=8R6vOJL!cADQ+T&(O9`W@c$<;!3`?S zAU@Z@oo>kg8rLFP;^e*#dm|iSymL59#lr3qs!2^E3HIeDb5h0aK0Lp9?|J6;d%rg>*Va0o<2ZkO+Wq+A&rd%3 z8~htj3s#REhv-9axWkEbauO4QzAN3>t>0ek!P}F5-ilj!5C_B&Ewv3XU$*lw4vF)` z;VmAVJ3J8X@d|HWcyWijFPvWZ8V~FdyUL29G|XgWp@%)!t{wjLd@tGkesA}Or^6@K z8x%9B3ZKuOWrYzc#m}xkJ}e$1)GxsiPE5E1@CZQL`)t#{s{?+dMq?eCdX`BE393Y1oMXD1jG`5}fbYh_B#=$&EFRH(aT)8sb^$kt)6s^dCsLdW+4F38 z##E6NV{Lu(?AEsnprG)NP3je~z83Q6m7_Lci?_c9VUlD;W|CwJPSYJQ zK5>cbx}@{Z{NBw5_m{N_C+k0&p>C+z8_aS78oBc?4r-M(&4n6^9X67{1-qMp*EH8m zn7NclykvP+2;Lvo^wm0S)p*zqbq9>?Uhn<~5P5^m_MQ2Mx8Po{vjH|kD20<{eH8BP zip;e68E(-psRz;JgZ`3>x(f^7@%eY9f&m$4(DvmFe+H_j0wTI0a)c!?Y0&3tG4l%= zJx^`GKI%O*_t4aAt|)EXnxAc~c^Axl`xd8Lh45QYZ7dGKEPd>MFKA9fy3LXI(YvZ$ zLFo&YizKm~B*{xYmFRbqM!gjkHlLHMxMn;|g!6dLPXd zsY_-mfCO^asALGk)p7l>OMGvW)H%2#E3gquCDXdMicpTG@M8cd3T0JwD^|g?ftgis zc@*kXPhh;-jCdcVZG>$PzS-S}?drY%50DMNYN&pV64$7@e&~i|llX3z-1q(kOYe|F literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/method_args.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/method_args.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b23b077a553dd4adf0c389f0fb8410267193af33 GIT binary patch literal 4632 zcmb_g-ESOM6`!yDnq7Y;P1+=dfhsr)@j7V{pki5VT_+7q+^B8~j6l=z-aG5r%+74? zops{ThOa~d9{K>U6v^f-5`PE}h(BOndCC(H5kd;k@H=;QyDpC| z)tLQ2V>Y+%o9;YYU~_E#f#ohRYfEb`X0LqYi_qVWxOCb(ynTxc=>&;zZtkT!N$j)} z##@g_ho+v_{WwliKMj*uqC4}!4{vUG>+fu=zk6-->Soi-Yrg0VdOS{LUfT90$0No9 zvT5Y?x6ofNcF0SEG>mA8+O^Fq8}Dyyu5X}Iy}5Tij8iV!wBONR8J#x>wjDIM=IVgX zV7hBE!?l>nELLJ=R$ z2iASvt)YFIy$DEbv|eIo(5kbu0O#d=;RXi^>`l>;qoZg2BYG&HdP>BD=CWnm4t`2h zp{TlFcY2|eVcc0x!yZot>1ec{$dI7)qva%y_LdK^TjqEByq$8U1l{_P9hzqL!Hr@y zXSA9#o_FLl&eD0g?H%?^hMGUe$Po0XUC5_P8c&DgmIYiXz$6~u`_0W z`%rS`+}Yu=<2%I(oS1Va(OnvCz2x+LtjJ+9tmY(wp@HT7-6X_ZAL?Nr@+RMj5;SRE z%efXfadLS4P&yLohCzt^pm`Lw!!+7+(jD&Lfc_v#on1c~a0il5hP9k4SdriLd;N&3 z)t3anJ>W8h&NOSR=$$Z%aOPb)6gGAMy>lUK;RK)4zuC&JeSBVCXnyQ;lGKq2#E;qM z5N8RkC4u8h=N8|)1GOjbUU$yRCtp1_^%u0lV(n2Cw$QTblEL!;PGlUH?se7;TN)5%}$I>(DM6Xi}46fk6rLXeKYpu(d zRzQP%x$n1c`5i9tB0>^aQOANWt`w*j{Mz5k?cEUa9y#m=c9N7)ZEIG~&fPf9)vbx> z6htLVp^Ty+`U4uN0;X#m==Y4&>{|OJg6W<)G{n`RxnDle-VgowZAwtyC=v1%p6*~x_A%rCz&;b zF}lY73kO=Dr>9uy6H5E#t!G}%O7FLMysBUoD$=^lBt z$|;nk+DROQoq>QH*r4dOMk{#*=;MS&;x`NX5Ccn02)Lk``j2V#MJ-$XylXt$?OUr+0%YYH8smlX$_Nw{iw{lZ=edQ$$lO-2 zF&?-1X7jWlvdnGi2i#K#9%GmxB?1$*o%CcXkkLgA8#hbh93BN4)v-gkHF8XkB3gWl zUK1Nk3?$B=dmWc-;npZObi**7mJQ=G!<^TRr^de*%kxGXvYo0|Nnlc4%}fL;};}a!!pP{2_B5GIqBvmza)V zHJFKTS0fbgzt(<28tNH4X6!#&X?1ZuaveO4rwL%iepgAtx$6FWWpTLO*vzviS+JH+iTc z6uTglUumFd;~2GwuR!YI`0TeH>TVV1PzmRV=aLGNF5;APnwY^OGcG#M+#G_%=07Jk ztKGx*%259uKKOobex&KzZG5}HxW*HGX|vd36{{TsEw8P1c#JG7)-u|clrnyHM$0z; zKk$tg7ZQ()Am4HKo(89}qf zt8}yJcBtKyFH_u;YjGBXvDsXkORg-Qh_q<9I#_&PwH-$AoqLOTlD@jqI_mm6Vh0!aOBm=+ArE*HQJ{qU&S)4;bMW=g~8S?6C;Q(s{mLylP UtcKArs>Vs3@|cBd-kk0J2YK@(W&i*H literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/misc.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/misc.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9facd99b1d38238f000689f755f10f9a4225683 GIT binary patch literal 5018 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/newstyle.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/newstyle.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..752985776eda43dfab234c47364cef1f48241fd4 GIT binary patch literal 2897 zcma)8L2nz!6`q-$T`rdtNlCUG8%4Tx(IRYYQjQC>Xa%>4thi1SBB<;J*}_(T>1BZ*1nV%zXti0hr{gGgi!q#5bhE|0wSnj2_3S4QIxI38uEY} znJ0E&gU(Lup%XYp=Om?}8@NU;CFP+Pc*9Ci8CHX;(YeXeuol!PkzD-@)|Qj{un{!C z=7~y7gJn^bD`IJb+#;eT>JN#iOZV6cR>hh)C(b|Q!8yUVN%O+w?ae*e9r(RW`Kdhc z+kTb^U+0I3^p#AaTnc}rvYkW@b?Z6qvPp|dl%`o8<#Cp3m@eJ<^y95?^EX?YzrEeL z)d7v2WrHF&WcsETe?^9kG5}Z zcd_MXpHpnT16oM}3g}{j29{s}mv-O?D=0}<@M9{fqAa|JAO&Sv4geW&;!DMajy%}L z1K!NiUIJyz&u8*?Bftg#3uElK549sGW^m|6qi82ipzBimS$YO2rU#&mQsMdV%z6eZ z+oxdCes`Wte}gB_c>e^FnN)x?IFS7CiXVnL$#NZrS7wJa_q%MGczITw(G@OaG37la zssbG;I3nuBvH@W0{c+kwkN{i?N6CDw(t>xgRCd{!p1L5H;R|<~>MtlEQ~HFQ5bX%M z4RW9MnP9^DoE|Z-SUK<8C-f${_vMk5J5%eJ!bp$lz*2ASuTHIg>4@jY{Ry%&T~8GQb=n zR3QR-U>?|mdJK_)PEdOqx3-8ospHD*ulZ?>PtKhH$sMyllTS$Magv|!uO0r468wA$ zl^l>Mdql=mJqzqsgw zScba3TFlUAT2jvz)lEwfb-r&r#pcRnbw+e^tQjP=I(L9MoZc9KAq(5+6r4YxC_e-! zBA}X7t>F(-4PyW%(a#Y*&u5NWCcUB@&e$sqn{-k`RqIsKMZd*^3-Q%)9ijFH2!A9~ za<6nmr}PmSSigq`?K45P$y3@ds%wDb#1+^<6K@HMco0?C>Ro8%61otUn<>RT%p$J zuqbcr%2a+fQaAP?yGFKQ57x+Jqx0>g(YhZ)@US<(XhQZ{8%YKCZ*0VJ5~2%GEI3A4kdDQVK(nb;EGhiYhD&_)zacH?xuXFQJf$)lbo|HtS5J z57X`$a2f2M8GKx@1j7&EtML?E0y}g$?j5@3eqgMHgNT<(dFX#y_bXQuuPLH#6R#$^ zOvw|H(<$)L357paa4FUIK;2|PL&@D(L%eW)hfES+ieG^Jwdx9Y;rsxM8VO*9s$aqn z^wRjhT2u49`Z*Y}jWb??e&M3R0ZNL~U4`_aS~y^}L49_cTZ`MQY}B5AP1_phF))X@ z5_q3Xr-P-r*E}-51B1$3hYg#x3lFNOhvAt&eNYoN-E8B`ehs>Pbayvq7`TC5)z~(N ZS6P+0a3)oDj#h0B61S=^8(!_+{{XNU6V(6! literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/non_ascii_names.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/non_ascii_names.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1af4276fed6143fadf35acb22ff5ae14a43abc8 GIT binary patch literal 5637 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/raw_metrics.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/raw_metrics.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4371f83a687be6e6603a2e5510ba7c90580b21b0 GIT binary patch literal 3675 zcmai1OK%*<5uTp+KKQ02>OGN_2phZ{t`#6;CH4CB@P zf9`$F{{HE|A;0t3(C!-s%l-v{8=NIZmxYXxY$j%C>aP`A_*#kGbwa1>hHlpjJ>ADn z{B9+zXxT}s-C9`d*28*tBAn<>hLgJ9O{Tij;dFN&Sbs=)>Y%ILD0C z)!KZi2}iC$uOz3sr^C~*@e@AF=f1MTGmi{D&rf}2@Kd64V1*09+Bu8&9NzPIFSPCO zBEQ1V^9$&GiGRQ^^8nIiZay;_R}X3H4W?>wn)dQI@AT5F*|5~a#%E7gqUGPNEI(dt zK2p|$bYI!6ILpy@`qyzLHhQ}vUEUV0T_GE`syvNlyd~rQw(_2d7THnGM!cB_Wp9Wt z^M5yRE>Aq?I_D-C*5k8hjbx_ez_EHt%GiHf|>lM`{f{IXD}+MhjKEq zAZsL7dI^UW=x=7%Z@4%lmx8CwRozhxtvI}eSQt0O13bB8-;jlwxFM-JI2ppD$Zk~ed= zaJf5g9I(PVZ={TSBd;*!ox&`8=^DTA<#O&7e&HUNx~5Xtg_D!c3XgjOCfD)xU)gA_ zp!a8J^ADKTD)O&Ig`_R#wlT6lKZ~_j@@ir8DzEYS->laJTMrjKG5mNrPFjN`&PC7{ zvL(_y-V#Bt9khB}1WN($wNSQt-7cCSiEcmNUsO&GSR|6+tcK@;q?3v)*pBx^uqi|u z#A%%D4+XC_9A)SGeH?i@=xz%6hW%9eeJS=jy+Nj`blXCTv?YKQn`TrMOjzE(^2W0& zM^AdlFMmL{^e4^yRjQxsX|-rl!blM5~Bey+N8Q zx07Z<=8`U2(v3?pC8tm*r=9fTT-Hgpuny(M{k}-Kte~b*l{3_HmWnwPVND-Hr1!5J z{Ru1S(R}g@`Y3OFuF3)`L;ncj|1jhtn&13+X}i}IOLCB=LN2X5SYK^^xE62TT-p=q z-cr)pT2BGQjK7Gw0?yOQ7W?~ZT8e&8 z<`GqEXIQ{|*%cI3_X6|rn`BkCz-I9?@pJK|8vnlwp1gr>ExhkM+u&) z%4Lt4WBA=z2=eVX5BjpV*Wo}Ib`p#?7~m3f+_8o#9RL^uxWiFFSgck9JWt2t?r81j zfxfJuL?VsT_w|3;H2i<4!!b^O#Ef>F><2q(c)!&n^v0Xi2$2+dl-D9E82ZW7ImJ@1- z<6Q!kkQ(J7FqDZLjsq9c-UIpt=_c)RX@p?8ghJUpxXB8nj3%8nho|4W)kW%}+?+y0 z_GTf$oG-M}8Hz<6I9Ahk?`4Y&96jWjw12&eZ3vu=%-kqIydzeaIU{M;khgNPfPP^9 z#TuC-Yh+`$){ed7aMLkB#MW)YGVanD=-R@5r}o%RR_E3;kULJt9!@;(bK*tqJBym@ zv`04^uCi(M%1W>ye+vgh^ddjP`bu*68Kj0Ie?b+Wpirz6)-{@<5`L;eS~*M~;>k%) z0`4u5Wl?!hs~Db5qOeV$)!8&Vjo+6I--lCmNMbTSHLKJD{2)&YfGWju0 z_$w+-wt2i)c@quvW(3fxVKcjCn|1uE=A^A#PnNA}xCqc$C*|TxWdWpb9^`|5B3?ke z4n9CJ&JkW*Bfws}9$Y*2Qc}k8ghcIf*IvF0HVO#GV6)*s1;ADqg?SdR(>VZu#VMi_ z1QEdjycZ|!+#;Y+xoaNRLqpszZP<_z#kn~!%f{Yw}ZI`Cw7q?9It-?3FjH)ENyax z>hSiu&X+*OLbFsrXbqiL!30zzsX9jEg6UMUY(Q3d6G_C+&%FisgH|dciH|35{N<57VYS*Q326Gdw?_7qTnJgzMX0V&xcY*Jp5EmESCm1&sX z2<2EhAq(r{L4&-LlsSEwlGXQM0DmGt0_~p8*ut4|F%kYvAgs_Im9RD*O@U16jol#2 zL^R55t|@o5`4E_rPpG1@(tP;j!TRHsb-6~p^d-|7e;;8f|8B{V_b9yTT&iySz{xzT Yn+qUk@D?O+7^_;-XXmd}t;vi318ZEL_W%F@ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/similar.cpython-310.pyc b/venv/lib/python3.10/site-packages/pylint/checkers/__pycache__/similar.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae7b683d6566a5cd4baefc41098491da5c139442 GIT binary patch literal 29921 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

  • !H(jjiE~!$S~|)p}cOa2SZj-^vhRpSL}k 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/protocols.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/protocols.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3845cdcf02a1573c0fa9383b5670bd5e129935c4 GIT binary patch literal 21167 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 UV`!y!a2cv>7H~;_u literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/raw_building.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/raw_building.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7a795a47d2adcfabe9d6f9fcf1a03d2b78bd878 GIT binary patch literal 15450 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 OP)rx`+@kn^_5TBnw2~eG literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/scoped_nodes.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/scoped_nodes.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6c268513847cdd1a9eb5bafffcebcd403b4d524 GIT binary patch literal 755 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 F`yZB{j?Vx9 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/typing.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/typing.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..108cc6348ae33bc6c860bffd544fa6bf1bf38f65 GIT binary patch literal 2101 zcmah~OK;pZ5SFOtYPAo)>pE@J=CnYv+n_*CMiJX_TsQGHh@AjsU=Xy(wbkfVQfp_o zy|vf=ko=(@bnPjZo(o^np|rbk3KWr`8FDx?B1>+AM z2WAg6O_$5MrZJ7_v6kpq*VP!s2qWM|Y$PT&6AN33jqSw2PU2!WY2b#gaZ`K)I%e!8 zP25a;>?bYUO4_)cba1EgW5wNM2`^P+J6=v!@Cw+WpH`Xk$`ZR^?ZOUgcum(*yPB=n zGw!km^H}o_gf|W}=CjuC8f)>j-wgZ-w^^H8BebdEO<3!&F06H{wNH72ErEOs_%iTY zz*m5O#%|D1b27>K3o1(Mc?!lo ztF+FjyYP_!_rDKrbLCHsT^e@k)=5nt0mEL2yz`6xFJR1$m%1Fm76X&60+ zWWWYP++@Z!01Vs$ZbMLR{(`FTv^*@{C5%R&%$2)O|+A#XHs8}_Tn_2a=smhgcXrvT_+f9KiZ z@ZJ-8c7Jfm)5}2|oelCyagn88_wRo-kWsS%@rRgJP0L>3Kh&h;?wg z0iRTud77!armt7h{{MsWJ?MT66adEoa9rSx8TWuUVeSKO0dE8E0C?SUWv4#a5l!Ko zVi#aYrw>);DA>d#D6&9SSPCBVOPUrpkqZFBfCeA>2*Q|3*`IDO@bVJe-wo>2JE~%T zid(Z_kdTHKe0o&r72`bSwKkZ{a6G*msO;|7md7xJg+)Hd{%qsJB+o=qW#1|8D2&M{ z0+eh2cj8DEFX!d>QtbhLKRD7UUL_+6CX7UtFLIG(ub}SEvMk2yG`^w}N#cw$0!7DD z3Bi%r&!A$HXvzs(XzEH{-S!lE&0L4f@F!OnkPYe_)2;Vq-9MRE_=^a#B@@^qi`Ajn z1gzgDUp)$x>LcCA3bCU0QN@j&syjVOD?o5((W{bqGNraI4aUSV3t*xE8JHeRh=YcHQH?g`c=4w}JSkivrz5w;(xu-9v5NM?UHr cexqx+ZC6JK>E=7s@Q|&e`FriV=pXmpzxLH!nE(I) literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/__pycache__/util.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/__pycache__/util.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dafa2c0fae20ffcd0a11291469e25796298b2eea GIT binary patch literal 6360 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 bool: + """Check if in the current CallSite were passed *invalid* keyword arguments. + + For instance, unpacking a dictionary with integer keys is invalid + (**{1:2}), because the keys must be strings, which will make this + method to return True. Other cases where this might return True if + objects which can't be inferred were passed. + """ + return len(self.keyword_arguments) != len(self._unpacked_kwargs) + + def _unpack_keywords(self, keywords, context: InferenceContext | None = None): + values = {} + context = context or InferenceContext() + context.extra_context = self.argument_context_map + for name, value in keywords: + if name is None: + # Then it's an unpacking operation (**) + try: + inferred = next(value.infer(context=context)) + except InferenceError: + values[name] = Uninferable + continue + except StopIteration: + continue + + if not isinstance(inferred, nodes.Dict): + # Not something we can work with. + values[name] = Uninferable + continue + + for dict_key, dict_value in inferred.items: + try: + dict_key = next(dict_key.infer(context=context)) + except InferenceError: + values[name] = Uninferable + continue + except StopIteration: + continue + if not isinstance(dict_key, nodes.Const): + values[name] = Uninferable + continue + if not isinstance(dict_key.value, str): + values[name] = Uninferable + continue + if dict_key.value in values: + # The name is already in the dictionary + values[dict_key.value] = Uninferable + self.duplicated_keywords.add(dict_key.value) + continue + values[dict_key.value] = dict_value + else: + values[name] = value + return values + + def _unpack_args(self, args, context: InferenceContext | None = None): + values = [] + context = context or InferenceContext() + context.extra_context = self.argument_context_map + for arg in args: + if isinstance(arg, nodes.Starred): + try: + inferred = next(arg.value.infer(context=context)) + except InferenceError: + values.append(Uninferable) + continue + except StopIteration: + continue + + if isinstance(inferred, UninferableBase): + values.append(Uninferable) + continue + if not hasattr(inferred, "elts"): + values.append(Uninferable) + continue + values.extend(inferred.elts) + else: + values.append(arg) + return values + + def infer_argument(self, funcnode, name, context): # noqa: C901 + """Infer a function argument value according to the call context. + + Arguments: + funcnode: The function being called. + name: The name of the argument whose value is being inferred. + context: Inference context object + """ + if name in self.duplicated_keywords: + raise InferenceError( + "The arguments passed to {func!r} have duplicate keywords.", + call_site=self, + func=funcnode, + arg=name, + context=context, + ) + + # Look into the keywords first, maybe it's already there. + try: + return self.keyword_arguments[name].infer(context) + except KeyError: + pass + + # Too many arguments given and no variable arguments. + if len(self.positional_arguments) > len(funcnode.args.args): + if not funcnode.args.vararg and not funcnode.args.posonlyargs: + raise InferenceError( + "Too many positional arguments " + "passed to {func!r} that does " + "not have *args.", + call_site=self, + func=funcnode, + arg=name, + context=context, + ) + + positional = self.positional_arguments[: len(funcnode.args.args)] + vararg = self.positional_arguments[len(funcnode.args.args) :] + argindex = funcnode.args.find_argname(name)[0] + kwonlyargs = {arg.name for arg in funcnode.args.kwonlyargs} + kwargs = { + key: value + for key, value in self.keyword_arguments.items() + if key not in kwonlyargs + } + # If there are too few positionals compared to + # what the function expects to receive, check to see + # if the missing positional arguments were passed + # as keyword arguments and if so, place them into the + # positional args list. + if len(positional) < len(funcnode.args.args): + for func_arg in funcnode.args.args: + if func_arg.name in kwargs: + arg = kwargs.pop(func_arg.name) + positional.append(arg) + + if argindex is not None: + boundnode = getattr(context, "boundnode", None) + # 2. first argument of instance/class method + if argindex == 0 and funcnode.type in {"method", "classmethod"}: + # context.boundnode is None when an instance method is called with + # the class, e.g. MyClass.method(obj, ...). In this case, self + # is the first argument. + if boundnode is None and funcnode.type == "method" and positional: + return positional[0].infer(context=context) + if boundnode is None: + # XXX can do better ? + boundnode = funcnode.parent.frame(future=True) + + if isinstance(boundnode, nodes.ClassDef): + # Verify that we're accessing a method + # of the metaclass through a class, as in + # `cls.metaclass_method`. In this case, the + # first argument is always the class. + method_scope = funcnode.parent.scope() + if method_scope is boundnode.metaclass(): + return iter((boundnode,)) + + if funcnode.type == "method": + if not isinstance(boundnode, Instance): + boundnode = boundnode.instantiate_class() + return iter((boundnode,)) + if funcnode.type == "classmethod": + return iter((boundnode,)) + # if we have a method, extract one position + # from the index, so we'll take in account + # the extra parameter represented by `self` or `cls` + if funcnode.type in {"method", "classmethod"} and boundnode: + argindex -= 1 + # 2. search arg index + try: + return self.positional_arguments[argindex].infer(context) + except IndexError: + pass + + if funcnode.args.kwarg == name: + # It wants all the keywords that were passed into + # the call site. + if self.has_invalid_keywords(): + raise InferenceError( + "Inference failed to find values for all keyword arguments " + "to {func!r}: {unpacked_kwargs!r} doesn't correspond to " + "{keyword_arguments!r}.", + keyword_arguments=self.keyword_arguments, + unpacked_kwargs=self._unpacked_kwargs, + call_site=self, + func=funcnode, + arg=name, + context=context, + ) + kwarg = nodes.Dict( + lineno=funcnode.args.lineno, + col_offset=funcnode.args.col_offset, + parent=funcnode.args, + ) + kwarg.postinit( + [(nodes.const_factory(key), value) for key, value in kwargs.items()] + ) + return iter((kwarg,)) + if funcnode.args.vararg == name: + # It wants all the args that were passed into + # the call site. + if self.has_invalid_arguments(): + raise InferenceError( + "Inference failed to find values for all positional " + "arguments to {func!r}: {unpacked_args!r} doesn't " + "correspond to {positional_arguments!r}.", + positional_arguments=self.positional_arguments, + unpacked_args=self._unpacked_args, + call_site=self, + func=funcnode, + arg=name, + context=context, + ) + args = nodes.Tuple( + lineno=funcnode.args.lineno, + col_offset=funcnode.args.col_offset, + parent=funcnode.args, + ) + args.postinit(vararg) + return iter((args,)) + + # Check if it's a default parameter. + try: + return funcnode.args.default_value(name).infer(context) + except NoDefault: + pass + raise InferenceError( + "No value found for argument {arg} to {func!r}", + call_site=self, + func=funcnode, + arg=name, + context=context, + ) diff --git a/venv/lib/python3.10/site-packages/astroid/astroid_manager.py b/venv/lib/python3.10/site-packages/astroid/astroid_manager.py new file mode 120000 index 00000000..7ef1b440 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/astroid_manager.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/d3/69/7f/96d19612096f9282ffa8c1a6631b87a43039fb248f7f4af5706c0842a5 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/bases.py b/venv/lib/python3.10/site-packages/astroid/bases.py new file mode 100644 index 00000000..d1972c17 --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/bases.py @@ -0,0 +1,711 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt + +"""This module contains base classes and functions for the nodes and some +inference utils. +""" +from __future__ import annotations + +import collections +import collections.abc +import sys +from collections.abc import Sequence +from typing import TYPE_CHECKING, Any, ClassVar + +from astroid import decorators, nodes +from astroid.const import PY310_PLUS +from astroid.context import ( + CallContext, + InferenceContext, + bind_context_to_node, + copy_context, +) +from astroid.exceptions import ( + AstroidTypeError, + AttributeInferenceError, + InferenceError, + NameInferenceError, +) +from astroid.typing import InferBinaryOp, InferenceErrorInfo, InferenceResult +from astroid.util import Uninferable, UninferableBase, lazy_descriptor, lazy_import + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from typing_extensions import Literal + +if TYPE_CHECKING: + from astroid.constraint import Constraint + +objectmodel = lazy_import("interpreter.objectmodel") +helpers = lazy_import("helpers") +manager = lazy_import("manager") + + +# TODO: check if needs special treatment +BOOL_SPECIAL_METHOD = "__bool__" +BUILTINS = "builtins" # TODO Remove in 2.8 + +PROPERTIES = {"builtins.property", "abc.abstractproperty"} +if PY310_PLUS: + PROPERTIES.add("enum.property") + +# List of possible property names. We use this list in order +# to see if a method is a property or not. This should be +# pretty reliable and fast, the alternative being to check each +# decorator to see if its a real property-like descriptor, which +# can be too complicated. +# Also, these aren't qualified, because each project can +# define them, we shouldn't expect to know every possible +# property-like decorator! +POSSIBLE_PROPERTIES = { + "cached_property", + "cachedproperty", + "lazyproperty", + "lazy_property", + "reify", + "lazyattribute", + "lazy_attribute", + "LazyProperty", + "lazy", + "cache_readonly", + "DynamicClassAttribute", +} + + +def _is_property(meth, context: InferenceContext | None = None) -> bool: + decoratornames = meth.decoratornames(context=context) + if PROPERTIES.intersection(decoratornames): + return True + stripped = { + name.split(".")[-1] + for name in decoratornames + if not isinstance(name, UninferableBase) + } + if any(name in stripped for name in POSSIBLE_PROPERTIES): + return True + + # Lookup for subclasses of *property* + if not meth.decorators: + return False + for decorator in meth.decorators.nodes or (): + inferred = helpers.safe_infer(decorator, context=context) + if inferred is None or isinstance(inferred, UninferableBase): + continue + if inferred.__class__.__name__ == "ClassDef": + for base_class in inferred.bases: + if base_class.__class__.__name__ != "Name": + continue + module, _ = base_class.lookup(base_class.name) + if module.name == "builtins" and base_class.name == "property": + return True + + return False + + +class Proxy: + """A simple proxy object. + + Note: + + Subclasses of this object will need a custom __getattr__ + if new instance attributes are created. See the Const class + """ + + _proxied: nodes.ClassDef | nodes.Lambda | Proxy | None = ( + None # proxied object may be set by class or by instance + ) + + def __init__( + self, proxied: nodes.ClassDef | nodes.Lambda | Proxy | None = None + ) -> None: + if proxied is None: + # This is a hack to allow calling this __init__ during bootstrapping of + # builtin classes and their docstrings. + # For Const, Generator, and UnionType nodes the _proxied attribute + # is set during bootstrapping + # as we first need to build the ClassDef that they can proxy. + # Thus, if proxied is None self should be a Const or Generator + # as that is the only way _proxied will be correctly set as a ClassDef. + assert isinstance(self, (nodes.Const, Generator, UnionType)) + else: + self._proxied = proxied + + def __getattr__(self, name): + if name == "_proxied": + return self.__class__._proxied + if name in self.__dict__: + return self.__dict__[name] + return getattr(self._proxied, name) + + def infer( # type: ignore[return] + self, context: InferenceContext | None = None, **kwargs: Any + ) -> collections.abc.Generator[InferenceResult, None, InferenceErrorInfo | None]: + yield self + + +def _infer_stmts( + stmts: Sequence[nodes.NodeNG | UninferableBase | Instance], + context: InferenceContext | None, + frame: nodes.NodeNG | Instance | None = None, +) -> collections.abc.Generator[InferenceResult, None, None]: + """Return an iterator on statements inferred by each statement in *stmts*.""" + inferred = False + constraint_failed = False + if context is not None: + name = context.lookupname + context = context.clone() + constraints = context.constraints.get(name, {}) + else: + name = None + constraints = {} + context = InferenceContext() + + for stmt in stmts: + if isinstance(stmt, UninferableBase): + yield stmt + inferred = True + continue + # 'context' is always InferenceContext and Instances get '_infer_name' from ClassDef + context.lookupname = stmt._infer_name(frame, name) # type: ignore[union-attr] + try: + stmt_constraints: set[Constraint] = set() + for constraint_stmt, potential_constraints in constraints.items(): + if not constraint_stmt.parent_of(stmt): + stmt_constraints.update(potential_constraints) + for inf in stmt.infer(context=context): + if all(constraint.satisfied_by(inf) for constraint in stmt_constraints): + yield inf + inferred = True + else: + constraint_failed = True + except NameInferenceError: + continue + except InferenceError: + yield Uninferable + inferred = True + + if not inferred and constraint_failed: + yield Uninferable + elif not inferred: + raise InferenceError( + "Inference failed for all members of {stmts!r}.", + stmts=stmts, + frame=frame, + context=context, + ) + + +def _infer_method_result_truth(instance, method_name, context): + # Get the method from the instance and try to infer + # its return's truth value. + meth = next(instance.igetattr(method_name, context=context), None) + if meth and hasattr(meth, "infer_call_result"): + if not meth.callable(): + return Uninferable + try: + context.callcontext = CallContext(args=[], callee=meth) + for value in meth.infer_call_result(instance, context=context): + if isinstance(value, UninferableBase): + return value + try: + inferred = next(value.infer(context=context)) + except StopIteration as e: + raise InferenceError(context=context) from e + return inferred.bool_value() + except InferenceError: + pass + return Uninferable + + +class BaseInstance(Proxy): + """An instance base class, which provides lookup methods for potential + instances. + """ + + special_attributes = None + + def display_type(self) -> str: + return "Instance of" + + def getattr(self, name, context: InferenceContext | None = None, lookupclass=True): + try: + values = self._proxied.instance_attr(name, context) + except AttributeInferenceError as exc: + if self.special_attributes and name in self.special_attributes: + return [self.special_attributes.lookup(name)] + + if lookupclass: + # Class attributes not available through the instance + # unless they are explicitly defined. + return self._proxied.getattr(name, context, class_context=False) + + raise AttributeInferenceError( + target=self, attribute=name, context=context + ) from exc + # since we've no context information, return matching class members as + # well + if lookupclass: + try: + return values + self._proxied.getattr( + name, context, class_context=False + ) + except AttributeInferenceError: + pass + return values + + def igetattr(self, name, context: InferenceContext | None = None): + """Inferred getattr.""" + if not context: + context = InferenceContext() + try: + context.lookupname = name + # avoid recursively inferring the same attr on the same class + if context.push(self._proxied): + raise InferenceError( + message="Cannot infer the same attribute again", + node=self, + context=context, + ) + + # XXX frame should be self._proxied, or not ? + get_attr = self.getattr(name, context, lookupclass=False) + yield from _infer_stmts( + self._wrap_attr(get_attr, context), context, frame=self + ) + except AttributeInferenceError: + try: + # fallback to class.igetattr since it has some logic to handle + # descriptors + # But only if the _proxied is the Class. + if self._proxied.__class__.__name__ != "ClassDef": + raise + attrs = self._proxied.igetattr(name, context, class_context=False) + yield from self._wrap_attr(attrs, context) + except AttributeInferenceError as error: + raise InferenceError(**vars(error)) from error + + def _wrap_attr(self, attrs, context: InferenceContext | None = None): + """Wrap bound methods of attrs in a InstanceMethod proxies.""" + for attr in attrs: + if isinstance(attr, UnboundMethod): + if _is_property(attr): + yield from attr.infer_call_result(self, context) + else: + yield BoundMethod(attr, self) + elif hasattr(attr, "name") and attr.name == "": + if attr.args.arguments and attr.args.arguments[0].name == "self": + yield BoundMethod(attr, self) + continue + yield attr + else: + yield attr + + def infer_call_result( + self, caller: nodes.Call | Proxy, context: InferenceContext | None = None + ): + """Infer what a class instance is returning when called.""" + context = bind_context_to_node(context, self) + inferred = False + + # If the call is an attribute on the instance, we infer the attribute itself + if isinstance(caller, nodes.Call) and isinstance(caller.func, nodes.Attribute): + for res in self.igetattr(caller.func.attrname, context): + inferred = True + yield res + + # Otherwise we infer the call to the __call__ dunder normally + for node in self._proxied.igetattr("__call__", context): + if isinstance(node, UninferableBase) or not node.callable(): + continue + for res in node.infer_call_result(caller, context): + inferred = True + yield res + if not inferred: + raise InferenceError(node=self, caller=caller, context=context) + + +class Instance(BaseInstance): + """A special node representing a class instance.""" + + _proxied: nodes.ClassDef + + # pylint: disable=unnecessary-lambda + special_attributes = lazy_descriptor(lambda: objectmodel.InstanceModel()) + + def __init__(self, proxied: nodes.ClassDef | None) -> None: + super().__init__(proxied) + + infer_binary_op: ClassVar[InferBinaryOp[Instance]] + + def __repr__(self) -> str: + return "".format( + self._proxied.root().name, self._proxied.name, id(self) + ) + + def __str__(self) -> str: + return f"Instance of {self._proxied.root().name}.{self._proxied.name}" + + def callable(self) -> bool: + try: + self._proxied.getattr("__call__", class_context=False) + return True + except AttributeInferenceError: + return False + + def pytype(self) -> str: + return self._proxied.qname() + + def display_type(self) -> str: + return "Instance of" + + def bool_value(self, context: InferenceContext | None = None): + """Infer the truth value for an Instance. + + The truth value of an instance is determined by these conditions: + + * if it implements __bool__ on Python 3 or __nonzero__ + on Python 2, then its bool value will be determined by + calling this special method and checking its result. + * when this method is not defined, __len__() is called, if it + is defined, and the object is considered true if its result is + nonzero. If a class defines neither __len__() nor __bool__(), + all its instances are considered true. + """ + context = context or InferenceContext() + context.boundnode = self + + try: + result = _infer_method_result_truth(self, BOOL_SPECIAL_METHOD, context) + except (InferenceError, AttributeInferenceError): + # Fallback to __len__. + try: + result = _infer_method_result_truth(self, "__len__", context) + except (AttributeInferenceError, InferenceError): + return True + return result + + def getitem(self, index, context: InferenceContext | None = None): + new_context = bind_context_to_node(context, self) + if not context: + context = new_context + method = next(self.igetattr("__getitem__", context=context), None) + # Create a new CallContext for providing index as an argument. + new_context.callcontext = CallContext(args=[index], callee=method) + if not isinstance(method, BoundMethod): + raise InferenceError( + "Could not find __getitem__ for {node!r}.", node=self, context=context + ) + if len(method.args.arguments) != 2: # (self, index) + raise AstroidTypeError( + "__getitem__ for {node!r} does not have correct signature", + node=self, + context=context, + ) + return next(method.infer_call_result(self, new_context), None) + + +class UnboundMethod(Proxy): + """A special node representing a method not bound to an instance.""" + + # pylint: disable=unnecessary-lambda + special_attributes = lazy_descriptor(lambda: objectmodel.UnboundMethodModel()) + + def __repr__(self) -> str: + frame = self._proxied.parent.frame(future=True) + return "<{} {} of {} at 0x{}".format( + self.__class__.__name__, self._proxied.name, frame.qname(), id(self) + ) + + def implicit_parameters(self) -> Literal[0]: + return 0 + + def is_bound(self) -> Literal[False]: + return False + + def getattr(self, name, context: InferenceContext | None = None): + if name in self.special_attributes: + return [self.special_attributes.lookup(name)] + return self._proxied.getattr(name, context) + + def igetattr(self, name, context: InferenceContext | None = None): + if name in self.special_attributes: + return iter((self.special_attributes.lookup(name),)) + return self._proxied.igetattr(name, context) + + def infer_call_result(self, caller, context): + """ + The boundnode of the regular context with a function called + on ``object.__new__`` will be of type ``object``, + which is incorrect for the argument in general. + If no context is given the ``object.__new__`` call argument will + be correctly inferred except when inside a call that requires + the additional context (such as a classmethod) of the boundnode + to determine which class the method was called from + """ + + # If we're unbound method __new__ of a builtin, the result is an + # instance of the class given as first argument. + if self._proxied.name == "__new__": + qname = self._proxied.parent.frame(future=True).qname() + # Avoid checking builtins.type: _infer_type_new_call() does more validation + if qname.startswith("builtins.") and qname != "builtins.type": + return self._infer_builtin_new(caller, context) + return self._proxied.infer_call_result(caller, context) + + def _infer_builtin_new( + self, + caller: nodes.Call, + context: InferenceContext, + ) -> collections.abc.Generator[ + nodes.Const | Instance | UninferableBase, None, None + ]: + if not caller.args: + return + # Attempt to create a constant + if len(caller.args) > 1: + value = None + if isinstance(caller.args[1], nodes.Const): + value = caller.args[1].value + else: + inferred_arg = next(caller.args[1].infer(), None) + if isinstance(inferred_arg, nodes.Const): + value = inferred_arg.value + if value is not None: + yield nodes.const_factory(value) + return + + node_context = context.extra_context.get(caller.args[0]) + for inferred in caller.args[0].infer(context=node_context): + if isinstance(inferred, UninferableBase): + yield inferred + if isinstance(inferred, nodes.ClassDef): + yield Instance(inferred) + raise InferenceError + + def bool_value(self, context: InferenceContext | None = None) -> Literal[True]: + return True + + +class BoundMethod(UnboundMethod): + """A special node representing a method bound to an instance.""" + + # pylint: disable=unnecessary-lambda + special_attributes = lazy_descriptor(lambda: objectmodel.BoundMethodModel()) + + def __init__(self, proxy, bound): + super().__init__(proxy) + self.bound = bound + + def implicit_parameters(self) -> Literal[0, 1]: + if self.name == "__new__": + # __new__ acts as a classmethod but the class argument is not implicit. + return 0 + return 1 + + def is_bound(self) -> Literal[True]: + return True + + def _infer_type_new_call(self, caller, context): # noqa: C901 + """Try to infer what type.__new__(mcs, name, bases, attrs) returns. + + In order for such call to be valid, the metaclass needs to be + a subtype of ``type``, the name needs to be a string, the bases + needs to be a tuple of classes + """ + # pylint: disable=import-outside-toplevel; circular import + from astroid.nodes import Pass + + # Verify the metaclass + try: + mcs = next(caller.args[0].infer(context=context)) + except StopIteration as e: + raise InferenceError(context=context) from e + if mcs.__class__.__name__ != "ClassDef": + # Not a valid first argument. + return None + if not mcs.is_subtype_of("builtins.type"): + # Not a valid metaclass. + return None + + # Verify the name + try: + name = next(caller.args[1].infer(context=context)) + except StopIteration as e: + raise InferenceError(context=context) from e + if name.__class__.__name__ != "Const": + # Not a valid name, needs to be a const. + return None + if not isinstance(name.value, str): + # Needs to be a string. + return None + + # Verify the bases + try: + bases = next(caller.args[2].infer(context=context)) + except StopIteration as e: + raise InferenceError(context=context) from e + if bases.__class__.__name__ != "Tuple": + # Needs to be a tuple. + return None + try: + inferred_bases = [next(elt.infer(context=context)) for elt in bases.elts] + except StopIteration as e: + raise InferenceError(context=context) from e + if any(base.__class__.__name__ != "ClassDef" for base in inferred_bases): + # All the bases needs to be Classes + return None + + # Verify the attributes. + try: + attrs = next(caller.args[3].infer(context=context)) + except StopIteration as e: + raise InferenceError(context=context) from e + if attrs.__class__.__name__ != "Dict": + # Needs to be a dictionary. + return None + cls_locals = collections.defaultdict(list) + for key, value in attrs.items: + try: + key = next(key.infer(context=context)) + except StopIteration as e: + raise InferenceError(context=context) from e + try: + value = next(value.infer(context=context)) + except StopIteration as e: + raise InferenceError(context=context) from e + # Ignore non string keys + if key.__class__.__name__ == "Const" and isinstance(key.value, str): + cls_locals[key.value].append(value) + + # Build the class from now. + cls = mcs.__class__( + name=name.value, + lineno=caller.lineno, + col_offset=caller.col_offset, + parent=caller, + ) + empty = Pass() + cls.postinit( + bases=bases.elts, + body=[empty], + decorators=[], + newstyle=True, + metaclass=mcs, + keywords=[], + ) + cls.locals = cls_locals + return cls + + def infer_call_result(self, caller, context: InferenceContext | None = None): + context = bind_context_to_node(context, self.bound) + if ( + self.bound.__class__.__name__ == "ClassDef" + and self.bound.name == "type" + and self.name == "__new__" + and len(caller.args) == 4 + ): + # Check if we have a ``type.__new__(mcs, name, bases, attrs)`` call. + new_cls = self._infer_type_new_call(caller, context) + if new_cls: + return iter((new_cls,)) + + return super().infer_call_result(caller, context) + + def bool_value(self, context: InferenceContext | None = None) -> Literal[True]: + return True + + +class Generator(BaseInstance): + """A special node representing a generator. + + Proxied class is set once for all in raw_building. + """ + + _proxied: nodes.ClassDef + + special_attributes = lazy_descriptor(objectmodel.GeneratorModel) + + def __init__( + self, parent=None, generator_initial_context: InferenceContext | None = None + ): + super().__init__() + self.parent = parent + self._call_context = copy_context(generator_initial_context) + + @decorators.cached + def infer_yield_types(self): + yield from self.parent.infer_yield_result(self._call_context) + + def callable(self) -> Literal[False]: + return False + + def pytype(self) -> Literal["builtins.generator"]: + return "builtins.generator" + + def display_type(self) -> str: + return "Generator" + + def bool_value(self, context: InferenceContext | None = None) -> Literal[True]: + return True + + def __repr__(self) -> str: + return f"" + + def __str__(self) -> str: + return f"Generator({self._proxied.name})" + + +class AsyncGenerator(Generator): + """Special node representing an async generator.""" + + def pytype(self) -> Literal["builtins.async_generator"]: + return "builtins.async_generator" + + def display_type(self) -> str: + return "AsyncGenerator" + + def __repr__(self) -> str: + return f"" + + def __str__(self) -> str: + return f"AsyncGenerator({self._proxied.name})" + + +class UnionType(BaseInstance): + """Special node representing new style typing unions. + + Proxied class is set once for all in raw_building. + """ + + _proxied: nodes.ClassDef + + def __init__( + self, + left: UnionType | nodes.ClassDef | nodes.Const, + right: UnionType | nodes.ClassDef | nodes.Const, + parent: nodes.NodeNG | None = None, + ) -> None: + super().__init__() + self.parent = parent + self.left = left + self.right = right + + def callable(self) -> Literal[False]: + return False + + def bool_value(self, context: InferenceContext | None = None) -> Literal[True]: + return True + + def pytype(self) -> Literal["types.UnionType"]: + return "types.UnionType" + + def display_type(self) -> str: + return "UnionType" + + def __repr__(self) -> str: + return f"" + + def __str__(self) -> str: + return f"UnionType({self._proxied.name})" diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__init__.py b/venv/lib/python3.10/site-packages/astroid/brain/__init__.py new file mode 120000 index 00000000..05b4099d --- /dev/null +++ b/venv/lib/python3.10/site-packages/astroid/brain/__init__.py @@ -0,0 +1 @@ +/home/runner/.cache/pip/pool/e3/b0/c4/4298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ No newline at end of file diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/__init__.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba47c78464f3f09e733916fef6c1cbe2766a9d39 GIT binary patch literal 176 zcmd1j<>g{#U|{Gua8_0I`Cs+NKsE|s1o9k!xR?bP-L-5fdH)!UGz`_g&Mz%z`B%SV} z@}wZ7>2qAwwdj9L;)B5K>!T;am z!|FL9)L3wGlGBn@R8WdOD_P|Uui}DNzVKVjD}$;dI<3#ku!=;~`hFQ#UC{-9n2+)( zkKg*Dm!IVQeDIcwzU=PE%|QCgq2#i+qq2YN!QSA4OvZmN@lNC+{BK?LH)V+&rGvO3oS9b$9~!=kPm6s!DJyS<)qINJDe_8{4vmEj=@^ zd`Etv*1rjIc1yQjLzbP!OFK5i_>R6HKa95=;?XVH`ioMGzu%i^Q z>uWb`2Pef=TGIM(p7{XGhz2xZF$=u`4bi6qc=ZG1C(zPvv~qk_*X5i7bbN3kko0y6 zz5oaGC0lA~LoMpd^v4Zd@|><%{Sl%|AMjuYEA*G0oUPae$vx1NPjweE0N00lznX-O zFE(oK;=&wh-zyfK0dvJ{1Kbbs8!oTb+Hsr(pdIXl=@SU(578j0dvhN*KS;~EUYWEk zkoO}KpFqfrzy!2MW7ebWeazV3+}9YH&?%(EiPJGInMTs|L-a>3PSeE(D3WQakrLNA z=+I82#(UD%ErtjD^l;ZSUL!F+qVj4k*X?z0r}N+K)&7#|5Hq1BZBb&ZOc!9s#YM7ED@W6xK$A$El`Q(kdz{=gjQ?M*j{&c)|nY6 zishh6>9tb-g!agV8~@B6kPs)%hzn8`-kWh+sKl=3&Byzgncw@pDO;`3bsXo%XTSaW z%VF{CcNqWY^I`S{H1!w+b7F@PMsrfom=YYjxm$R#SNO4C1aVN*;#yIU>qh70jUtRg z;_waTUy!&7eE@xnx5k9kczaA)oi(2LafgLGWHq)i_E?j(o_O&lrx(uiYdqweyz|0^ zcpFDfuf04A_mq}p#-eFiK8nVrjP#U8sn$|Oc{Y@(JPX6`Gd(RA8dRCGhV!#L6FQQ7 zUP`T^g;0w*4msONmC7cf;6m?|b1qYzl_JEzHs~k^1Fph9005^)s`mN-_fwHhxa|2= zV^4@Z6Ql~(J)9DQ9;5}Yy!|xKtJ-(sktk0EM5ym$$UA)83zjw9q@N9|00-G{xnUO8 zlh91Y8PAzjsJ@w0zUg}5(zx|i<)fuqS_eDs7-tmOaG|+chh}`73BGI^ZL!elFz0L4 zSe8pJtV;FQhAk7Ve`RU>;26fV3MAJHDMl2*S%1hU586I7wF_e9%pB!2a%4s`a>w~$ z>zr!3qT0Qna%)9r-Z{*k`!AdoIdSARq?;Z&#|`x9xy#){vrBY3<&bPhOvL!8giLW3 ziIVYXnyM%jCSg}9%-?*TXPouFde95vaP3k`01KT|6=o_EN~dDPWdP@_yzxSesz$03 z;8-RmJ-71E6!>ZPD`g@er7GTfz3>X)pB&kRD1Sd3Ov{1~)s0LgukM|k0>!QF zeZ(1e4yZ?(BqRaIfY3{i%C}%yUITG3A|S6mtm+yxlcJwtpdmGkJS7tX$$|>Mjj5uL zsBg}Rc2`7u+8@&ks;(b5aXt%l4N~_Jj%M}ejTep%Pl){RxG4x&Y^>mA0Q~^;O@a2U z3BeRY#GB_X>_%p7XdSTgp1S8A#B}v0cpR-fdxn)ey9TGQv#y;Te}3F#K2Rc9PQT6o zPAKpctDHxsqz?X<3m=COe3G9^z&kP}ZP;QfBLezdG2vg!#s}&(n5Pn6hq#kiz}GUV zYC4q@t`+bkfaisavI<9Ko|NOU;#$59z#jCrBq9w4U_Qxd!k{k8{IkLh3DpE3fsUbm_x2`fiQ5_i_T?-%w> zmH3>*?_I5$YVD&;){n74&EkjGHq~oje$z>f;7MoZYD(6@v})Lw3-hy$yKErHM{A5B zIc08(CPHOb@=2yNm#^<_!FdCw`t71*i=6Lbktu}K^P0gnU_vQi0GOccZg!i&2LY*H F{sWwECj9^a literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_boto3.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_boto3.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ed60d35b3911f8979110d1abc6e458e40d55337 GIT binary patch literal 1011 zcmZ9KF;Ck-6vyuzCozc&Qq_g3gR6GHQi(wfNG+#&mvlWN87c56RD7;ua8j6k8n!;Sk75FUXhY^+XUQxg|N^@mabo z^OX^i?~K5baxjY;r3J<`EYrp&7S&91KGr?@dJ}q}jJ^%d3|*mXr0~!H+PLi+Y4HR= zvh>;8{lk57(Ci$w8cniOZyfG-K9ctz>btF-R&$%Q>w8TXi!$`c=FUw8!t^Q8Ymr3n zCD%{>)4mL4QtPm>Sb|U6wbL>ol!t_*RA2XUg zSSd^>5SmGj!R&D!XMgb@3O0zOV&azF9qoF1A{)Tk8gV*_*=vnUJ_2K!wqavnYgmQF KYRN2N>(5^)G!ys$ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_builtin_inference.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_builtin_inference.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5be2c5558963388147d2e5a51a6ba421e4863635 GIT binary patch literal 24966 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 G_J05x_UTXn literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_collections.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_collections.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..057e53f5da6cc42e0d11f9f8cbf1e6d0a4d32368 GIT binary patch literal 3933 zcmbVP-E!MR6xPb}PaMZ_(j+eZ0l^GI%(!tf9fl#(Kr?9yg*5FnVLDX-jjUZKY9y_@ zyH1l#%1!bVTqQTm^bNS=33veAa>X?_P-ZA+*OvSfHx%TNe6)Mc?%D60J^P7{jpb9C zrs?nB`{|<(zF++n%JbOtdx>dz7eFYbda$!>fP|O zLC(r4Iqi=Gc`L8vj6WI_tb&rW{#a17ib~G;<3Y(Pfjolq$C@>PM{xoEC-E3A!v6)5 zBE=&OkCTZbIpY;Pg{O}VYYNX;)A%ZW8(+egkJHu+$+7RG=1G~9$PAe}mD=SEbywc` z4OXF5P&DdQF6XF2g3Rda{zR~F4C3_YN@MT93v zFrdhYXt8i`s=TtTq?pX7Xw=5!X^Q~Z?oKpmQwB&AY)fxd+Y5~qK~FtiepB0~0jaT8 z7!p=nU4C$9{o0ySU#RVpaJS}r^;&aZY}4@i+`@c~gGbkzj=KZ6@|x3zxmIV67q*|a zOMRcXD)4j7{b;7Q!G=JGyg^w|g6X;RK}R|=vihG!PXEJr#bkS5h>+BQTZZU&86u3H zLzr0Z5cbE%+H>ttgAk?GonK((3WPXH0KhD*KLKBQA{01#J_#W(^8;Xep(hfgVUf(K z`(#OmuWGi9)JxA$GT<_TbFnsznuwH{kH77k!f7@k<2y0m8y4}lhEE#eJT2EJ4pR!l z#&BsX>^1LXOaE%yo3ArT?DDYD+KN3Mou}NS&DgEZtbOP_p6|y4)RTc>?l&=EB%r&b zGUOe$o-Ncc{ zi;LG5`T?@-!2;kx#gv&d6f4y^I07FiAxf!gz7{(h3WpCX>lU4O&LQ=wPN{!pRkBe* zpDe8(V;jnRct9BaAC@lEeke4&V_G$77Yu58VgGgvNWYv!jBn zQr+RCb37{3?n%hTL4_6I@iyE%2M+@o@8yt@QmwB&m)HcT!WndMtbA)9K=;~*?ycc8 z0USTKFbt^&vi8}6+TBwGm_yYBP9m0WJ3fz#;lY;)LjM6afT${uui>bb6>5DvVkmfH z0K^wP;28=$*&2=Z5QE5&T#t>)_Ds8)MTV>#t~~DJOUg0`ik;mC;ZQr#PPG$+(JA7^ z<%pFRrXP#moTwOSavjVCd)T(SBxnAG;{(INv*1LVnK6$J<7^D4%FghIU(*HR&O3E!t6@I7hfq5?K_*RcWt=uuPtw`Mj4;F zuwOt=!E*(at%E; zD_XDUOwPrw%GZlg-nJVp;PM1Yfn2aP-J#QSicZgM6Tb;WhRMZS<4Ir3^I_|#B`UIS zjm2F6EAa7bpLz#sCijsw8EcX~mq1Q}zDktt=t28~iRGpGrC41iC!gbRtieZwdQn?f zk#$uWncU$jJ(w(=3I=O3`Q}Sle-ErEbMmCeqpxi6tuYUkZUQUGo literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_crypt.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_crypt.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..699cb91224f65f69caad53397e0e6ecc915a9852 GIT binary patch literal 859 zcmZ8f(QeZ)6t&Z)t*Vwu2qYf!g4#-3v$Si)15A`{sFT(XtrLj6L}_xjMkID*yA$QL zd<)Y4g)b;i2wwOFUf?<@tequaUtgbdt`i?#uU89%kVnm@U%q|){__XsTce1(mpJ7i zhLD6bCJA*Z)wvNHNx>~-c_A()rfXte49(BPEdd2{Nx~A8mKsr>kXGdvYLFIPJrQsn zNd>}7csP&2gO3VW2;!Em%+wbW5cFUmmEci0@|k}PBGBB;Vc_Nnr>tO5c(WzN9>&<` zl#r^0<4W+v3V0ktpd!ws6(uPb%3^*3p_->LWH4_8YQ{tB#l}Iiv930Dt%k;1Q3y;~ z(vOuF%wRb8GV9AtC|UoPA-S%$KGT(=s6vfTT3(>c|}Y0F*tpk`~B8EPN&zu z$H9u`^wykycZ>4s?EKy9)5&m?^sk1D4l<{D?QF3|$GuGgZgmR>!?Rthd$5H)x_JNQ zaub~u5IW`zvJTGrN9q*m_Q^&pmc4NoU)J_-p z*IBpi?AtO@u$TJ52YhI0`}w=uQ{hJ}k6s`ascNT-RoxTdDd97D#YIxp@2{I0)S$&b zLR-N#Gw`@ob|0^$+L=^)25|~P3hf+s=l|I}iqU#PJN>Sj9otLRJMPRn z!B)aecm{3|QY&!*@4%C+;EJoh0s_LBnYEn~amPkGnLRV#`F`gci;EWn&vBe5KYsbm zPmPDa{*L)mkB_hS@v6@-#7@_VN$jSiOYq-I-I3Szh{pWXA62>)Gq0r8QLS6Uyc*ZO zb-H!l;3Te}xaxK8@!E+KH+cO-%ei~zZ3VO6f;%dgB8llxhE5l>Ry z4uYLbB{8S@kUzb&ZlD8}POy+NrD&pP%=<~kW11MDKnrcrNW_3FAq_2mJ9sdhD9TFp zvEV9e=5#+3hu~%T8S)Vy^|;jRjP@o;nkO06HU?}YvH|Ur z5yJsFCP&V;^TpNAy<_*-JNA#rBPaHb-0z*(Kk_hEj(m*OA8L;YaURxk64xHNN8~X% zA$v}%&VC_arg-kcYR;nJJjjyIV`=iSPQ?M2a5bh)6Z0lz8Rns04V%;kNf|05nBW?epYw zbHJYQh%3dw-s2IQfZNcRN?BS6BT!t>&Z*?%ltISq6EYbj8B2`{k#U`1dN@oFpnv&% zrtI2ucM|O<=@b+K3g;wceJ-`4l%Nn%nNl?rGB;XuJR_0i44On{NccHrOAhOO>xGtA zRHIN=Ug4n#3(~VlG-R@w`nA&6wv z0EyiLVB=;94HwYnn+B4Xv2_97yix8;0l_qgzHPVF>^5L2PL9Q%v)GEotbwI11IPy! zKer!do5)#`XDkUkRLP8obK7@8&;WJ@l%+n%PjqZbQ$Mh#PL_V}00Eyy7LI?k#O9vA zy3nk5mafZ}EUJ|(y?)SUEkSs!GLwr$J3 zMIXosH-d{5d-~`t+I+8RR%W$Q>ume~&^UW}&06$dYG;Aft1T)>pp(kRW3*c7A#jEN zl}NHyrF$s~O)$b-7?TT6$*7C6)Xk;4QZ{+})i4cCUm-s`auY0neA*d`5%0)JmT}qn z@XjYY_pk4=-bUwuX9t}$>2=0aod0aIz41mzB{{!7X3;)+y6TkIO{XVu$n7}4kH*vD z8qXveOo@bx4r~ljSD{Z6#*O2sD;RvgUSDxn$O@@@!R;%q|Mx#3@s$Js literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_curses.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_curses.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ead2ee90072c5c837fe16e50cf2b96ebcbc64a4 GIT binary patch literal 3472 zcmZu!&2Hm15SE-c3DRuaEl{9`9)jL-*m%<%76rPCQW6~tp+uD<<;NGpiPeo!{{*tL z=pKq5(s$^kFR-uDQ_s2f)K}=G9m;9MAuYhN=HqZU|0L(np6zaUp7-T%Umbn==N~`+ zh2P}aMCv>IE#Ba3>QM5d3~Vp+|{ zqhvT6zAdY3J=c6%NQC%X?BHvOn%(=jMk^iu{*mYH?&HG-OypsYDd743>;0ogFc5Ki zYSL0f1{uYPLB;7=3?`j35r+nlN|i8S0GX0G56uM?KjWx_!2>x)}vvM*YBL<2ud3C6y0dq72a4X~s^dEt!L00tG}y=m5+{c$#y% z5-4t#hE~-@G8LyydT1U&tzkz*6Lw6<;A=vLlsUARZJh&tLZ`Ddaj*7Q;mW(0)aINpy{nE4qI%_8%1i4LJ0GWfx3jJfwNS^lrpz#WQ+KT zvV=u3OQhjNy}$|ozA*P~gnIO_fQVqa!#9mXPZaKw!j&aNC{=3g4)s*E4zx{AU1?cN zqLK+b7Z`0y%g%%aC|6HBmryT5vv+72a7>ngSCssQl9(G7U_}|zz~X>_<^kq~&0)&` zTLuOMxjXk!U( zV0Z|9a^H#*dx?dd_hMs5U2$DmTt}u;>g|mxRt$H5|`Y@4@vQ z-XIo-x9=aGKYkCE)o`}>VO~vl^^HNV-11xg=D(G`JoL9#Gtz_Y{^ySZ4{L#kH|6BE ztQM8NZ1g{Q8oL`$@U~Lv%Ta?)R~MD4jc6^mv2gXZjROxm->&XFZ+xT{d-&Sh-1GPR Loel4o&kp|sH=YC% literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_dataclasses.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_dataclasses.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e411edb69353f74e5769f813359a2cc9ad2e1bb GIT binary patch literal 14111 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_dateutil.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_dateutil.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6e999975742658ca56079dc7764044df8569725 GIT binary patch literal 743 zcmY*Xzi-n(6uz^a+KJLus#Ju8kUTKdRclkRAwU$w0D=s3!i(kPUJ@(zo%Qb0(yU=) zW-lZEl2<1F1(x#8Zc}>JJ-=W6-h1D(+TI?xj4}RX^7w53$M@f)-#Z>zuj%R!Bm_&D z;KC_+%IWQvPUWU9w?41*s$SY_^|;ZS)mPJRw=P8A%m|5qyVJY&JDnuWl`Sue9C1$ z1Dsft|4)yMw{-Ob5{4PRW@~=s828E({3kusm@`_bK}e^lYK5ll$rKf|J^|CP&QZgG zby5FEor#5I?@m9zA02&s^E*2oOzQqy*-9V)2@BnI5$4tK7- zYwVM`+P%$BY>#WF3 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_fstrings.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_fstrings.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..329c49ab61e25f6b22796a0cf8d150adce0f9d60 GIT binary patch literal 1891 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 AbN~PV literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_gi.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_gi.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..322aebc7e4c71c06dcf9743529d0086ee28b2f43 GIT binary patch literal 4438 zcmaJ^-)|j972cWsdH1fb9mjU!q)k^XZR4o1TWG1M(x@Q`A<&xAR4Kiry{zw!uh-eT z_j+a>*Q>o!i31W6h)PHm5(=`*6XJnap7|4i2ec17z*BiZ;t8oD4d0o)cAQk=UhV9e zbIzP|W_IQ~X9g1!zG)c7Pd@(qyQh9>|L7l}ANtwoy@p5q0ZnYQjhMweWo@S4yv_C7 zY@7ORwJrU&+cw^2>h#^V%V><1di_Sbp=mqy`^|P!(@q-nC)yLtNQ`zXcH5I;YR!nf z->@ClJ`y)#|Blg~j+=3S_tAJl%&hXb6;Ix=+OzRgd<5J%F|lLp9ur6R7&A0|T)6A= zVouENnef4{84J_J?F%ZGgCq{u27{X_Tph?TUlZY*+xglc3%?v*`OeC^=;mRPK}`)o zCg86mS)61&wdnib6zNcfTS>kaZf3ENDvz`*6t{$g6{v+te>jl2h{IJm=!ehtl0_+o z1C`_hx&5sFDOS)}USO4-4Pv1{w8lYweKSd65}cXC9GJW;<$(D6nr}o|)DyC3z5o3S zXWP-)qVwL3tutRbe;lT(W~UR2G|F??=}@O9@+231bX+Z|39JJMuhS79BsnMtiuA5W zj|ZTW4YESWL9HP+@P?ICWFRnjWiUu<3R4{WQz9Qbhe9SkAge*A(;Z}alw_(_hl2;| zV{a6KfEe$T-gWE`Y^_CV4eSPD&g$W$ISxLM*<5o{T`x7#Qk*m$LMN>D&OI92Uhp_(_~ft^g$F4#>CFZ zElv6B(v98HSU>tJ9KpNh%f`sfXG&AA)frl=*q%3bXZH;GyNyrC?z}Pb5TCchMvZ)` z1Pz~mj2ks?cP{qh<{qCjMvc-fZCDM;2HJ_c7TJakSN<73ThuGL{M#Y_lL!8}_TPek zH=fc~j?^;rr?s8G!_I#W>{uT$X&$n4^uUs(ElnP>H1n{fkJyG=x)^`zz#2pE%pq&D z2iDl`vAud9y?ld@?2!}Cjr{yLR^Q#>7Kh zPk#_^rXrN0yD3$2OQhQ&uqs?3lnGV7xl-fb>Sm@+)+X(iHCsD5#T zACANK{mL0=D6blqKj?}f;dtR_Y4{mCU6|y+u8mvdXW?XJ#)+(aOhD#}5Wbq~(4r<$ z+8KMVxD=J$kMizX)#@ZMa41<#fMj61z*)j7`4p{)3#6m;0YYi7m7l2nc~^}@(Pzk$ ztnw078?UDKDP)DNOom7ol?j-xrVLx!5DoM9v}*UB9) zZ@aNS6;(A3K6>TuFOx+fR3^SaWlE7(=B+5L9L$B@)=H#A+ta2N*=8XomA8q2mA{R1}5I15b9IB%h6nf#t_`)r2QPr&(oJfB13 zo@ep@`c4ZHkNMm;EpG8?j0qSwJ??QDF~=f_P*YX!%wG;7dNO}8`*t- zoO4c@(kXw&z->!MchLn##yiHklX^Xr~YWXi}IoU#f!o1HxBRdMu)A`XI z_}WFzDvdpkoHCYY7U>~dffE~>hW!1Zl_WH6E*Gtb%C$ulT`qu>_H!})u;|L`$x7jY z*Xdzj7PF5?>q@d{YK0n$M~gk6w20AtOAw97{mNdr!HkX9lbq)M%zj+2l9%lnpbt5t7}tfk|DY!v;!PN z_^ZKW!IQ6(b#J_es(oajv6wKmURKqn1@592u2}y;Ky4f6IqPXusGDz-p(Fbt0j}!F z-vwK}i3SIAe5gDppo5BoZQ&?#qRc54*m!W{_ZxlU`q4^<#c&~vV3D%D3ffK-%7fksgv?N(-+ZQRL zW4H3f=PMHl_tEdsIM)-X@rUyKU&%f>;vb$cip5S!H>^&Y+!V-;8=Hv~9bAzVcKYJE zbbx%N&MzJet|lMRk=J4A?S*D#;;vCylMfRY~^B}^iaRE6uS=r2y`Y8SC%wthR zm9>mhE9oO)0v6r21soYwy z_3FqNv|L3~*~qJ#LRTIOT=t1i>-XqP=kXd;D286q{-c;{+_IZunO7SULi=X!t^`Ultv^ru>YQ!c;no$}(= NOWyGya7g3+{{UPiy!HS9 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_hashlib.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_hashlib.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03a662c84a27a57835c7c5e2c53b0cf248d72de7 GIT binary patch literal 2217 zcmc&$-ESL35Z~Qf-<=&NO)52Nkq}l<cVr|2hrMU}c9)B`GBo|N05Z_jp5)I!A|xooK4xT$m^MN`pdZN?Gdd4I}V;SnB@4ml!Y%FKymhGi#6S8^=J=DGyrv_#Gr(L-%y96>k|lu`O4 zT~U^QOcbAyL;4NsU^dSd9-1JPIYMuu1AK(XW~7hI0}R2qurpjP7y6R3P5>Kj_k|M; z8Xt;2kI~TFv)w*#6pJyH-0ckWik1s5_q$QgMg*Z;0lv0tOIcW1^=*%r6Z7 zmgV?PWLc}J>dI;|lup;TqrL#~(yc-W>SvUg)8#T+U0F?mbw+$9sg@8NtoX2YDp@*f zryYcYWZ}|@Q>V0)OEYWA*?!3Eh)-Ni_Wm;OdVK#sJ6J5v7P=jZAmkz%%s6Uk6}xj> zodj3RbY50UkX40?UOvf9w zdThe{x}_v02xL;Eq*4TO!|x#tcB54+mJ8R)g;V}CHgA**yL^z&N!yK51o4!CpW=?~ z2mPo~14SN2Jq28Dcao?y*2)DxVB88i9m%8FFqMQ!$M>Ner~s-tIMuH@(V zwO;=p{fe^?*IjPa>NlsbzOh*%vC(pYUvEu;Y-6ZP(@)h`1KK(?c@4kQr zD3QuqZ1!x~>-7D$xC~2+D?py$*o?Rrx^M}_E5P{c<7zMPcvbXOTB>i|`QV+M>v!!| zt-8nky{hZ9s^K8&1^#-awpNu+#IJ{TdlyQxtU~HkrLMMw?f5CR)RLf72?ud@tIK`9 zAByewVIiqjBVSRZn*_t}PePI&)2HM(cRXB~s#=k-eF>$~t8BqtgHy3xnOQ0sLd7(u z%xOol*%5&UXH~{}T32HFdEoeQ2HfDlO;mvGjdFfw5K}oF@2V!l;}hudc0uhbLJoBf+#Bc#w0I0Djt)(Rg%0_ zdfZiaTfkF;nipnseaD4oI*DO(e#&hJKIB|w;6&0(A8Mf<=47#SZz|m>N;YV2rGEgn S)%B2hAbFa{>St;fAN&nbQg-nG literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_http.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_http.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2724e8667c4eae74c7b86befe2f82ebb54b3b0e GIT binary patch literal 10599 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_hypothesis.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_hypothesis.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5e195e2881af39c5dbea8bd653aa75e5a9675d7 GIT binary patch literal 1630 zcmZ`(PjBNy6rXXNe@@y8SRuh-cf_T&L=slqDnPBaEv&TdqU{PKqm?_!yfjX2kC_=K zn`k+)SH1%rIPf{R@ezFG#E~ON2;SIfl1hssKfjs0dGF2p{oa#1J6??t^5=_}KmYny zulYObcb+<~j_}n_PzVwbL4_03#0eZ~^;%p@+`vWM4eFu}jjvN7`&Wm&Y+9#=}+M#eq9}ZeMZy+Bu?#; ze0xv0NT2%h@L5%o`2>(Fit$@`5YR_P1zZpzq0t1z&DX78e@w3Mly(fJ5a4>^(Hb90CvITNG{kZ?|qk&}_vUhZYi0J{x zxY!;8Y=S7QWVi)FwkYmLI$XsD5zetmFxPO6>wR1GE(+#!X_q#r^RMfu9o)DBk}Ze@ zss!l+R4hnS?C?)3jjlDP(hve?`P=6aUIDv@+qML@MJ|R-x=xGPwC-Z@Au>9VGqC5X z?unE(42z#9fK7dHWzo6vS&v0#Uo#%h`2yP~uOMW@#rBlYlFfk$neLm?Sqex3BN-%7 zmD&Hy20K6c<%yCKeofhdS9ExqO2ciR=-@50$iNoV<`r6Y_*8jlR)SjzTi~Ks-6*t) zhwJ$h+Oe>~W8L8Uctp2Qcy*6@)TL?<7k(}9ET6(r%r!C(2Ue_7j@9w}nR^4qA zqxA`{{08vR2Yv_tVXiqLP6#Q7T%c-Z7n_7g>CseI^`pM3ud2&#*S85Fuin1-;r)l- z|N0a3uZ9cOukdRFLXeOMDy)p=R%lVw?aa=d&;i{Mt%()3gd4hIDO?gx=m}3OzaZhV z@I@PDUvxwl=C-t+lh+;T$hPQ-l^5j1rsT_-FIE?8Vr`G~FFgDCjy9@H1&b9=3pPm$ zquHobOqaQ2<%pSyWKmkOO;*N_Wn%Q;9Yjm|wCc^TKHvo(O9d<5X2!L?Cr4H9?!jmz zl@$9bHBz0~yOImAyN~1_X6NC);?pUZ?sl5Vorek1wHU|_+MDp}>mUq)%&4Fz^w^%+ zGwUijc4p3N>x3M)X00)uk;nFoZV+KXX7;oFM~W93QpxKa#_6FfSiy67oyA9t3y~J% zb35w^#=g$DW}M|RkENQY?=u)hDdeEmDjVn+_8nzGOyMQ2O*B$v9_6Jt$Yg{F;aXZ~ z!wZvgBcs}J7Qzv-5K7v&*NJGqbH@gXvLqIT}lFmnL9GWN++2lP{_d|b!NjX>Dy+F2Npfo8$Lo;K}r4fZv%-)pJM zF#TshY7KTV1Y7Z^>LMC*;3d%2B^3XFy?73`iCc;v;ar19)fLeHg@>`!ZHkFN8xlhg z$sS}j1UyW-^6vh&y}h-&b?=*?-bTjrSn%6F!P$@K%_j=8{69!fpxxDXaCnZT@Zo$5 zruMjwo8N;N_Pf-^=DL`W4Y$LuCTY!Jek|rLz;nboDS_!&vGb!p6#_g&vkt2d~$7{dY?W62wXo* literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_mechanize.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_mechanize.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed8559232a0f9dbdd70e883a9856a1b8e837087f GIT binary patch literal 2629 zcmb^zO>fgMH0j4ystphbiDNVgiB?&|#BHJz193ot9Y9=qvE1afHFNCDcDjx0_#trQ z|8Sb%#EHMa1)k%sqhq4xBT}qq`+fO+%k}kkJqUuN_3`to@1J(RAiVH3aQ6^@y@N{@ zWFZgoa1e$TuJKx4AJi+j&Kr4i&_uYAHQxq<6$qhu5@ai|a$+%7Uk07lSL6|N!qeLd z#!MSfB$rvqfxwXgk%7XytGn7L$+AZ!XZ3%KzrK!(2~2nroP_Uc zS@=Fgp|w4FrxgS#r&>pklswd+?#kh7NKI$E9pRV3C?aGGh8m*?xvPPX;z-aOW(XEZ zfhm=U_N0LJA{8@`{~?tI^9xlRO(|a{a7ferGyVEo%dk@pRFMfp$+{*yySQsvsq z#+W+zHa}D@hm;e`+Y8@@kyFAqj${FXaG6>ujJt@6BMbUuw56^Tiz9qe9A(r{=bXr} z9AxQYWtsUaC4`(Z&CLH|_t$Syz$MMR%&kBdQh4Se<`EXrb6>ieIkVP<5RQbJU39y) z%q}e`SRzR(~E&5{unMXE#>ALnJ4xV(<^_jdD)VH+huea0Vr)pxRX(JeSy7AjwAnCw5Qe$T zDHCy2P&4Uoc<56O^Lb?dQKP`dH%rQ8icc9FqN|BDomcQy*@pi9DTL3>WTAr+^l$UG zQ&)DFPE7luI^0U8Af^dt!=yMi z6DjWZw(ccZ0bsMhzKyesPN*AhlA%I-yOrdSVpy^_&?}BlZ_anbC@QqAlx-BMS8!>E zwXpGBts*$MGDqC&tPXC?822j1y$SFFlvXv1d2N2@Myl$K=clH)k!w>$yi^S$X^Yg-M$lA6SfFLRJC3*ATV}>- z961jtNc@dfLZCkJfA+Oc`~oCi$~m)_tevotXXadI=FE4_Nz!iH1|j6nr@#IF?$H;2 zy@U0_X9D#V{KOFqKJm4XMA}f(aIJ@WWDE_pHbOJ9hL&2JVIyh|n`&)^t!QPqqSlSj zj#h`Oux|RTU&(OIU-502+st4qr^H`n?NjhpP-|=rDZjl(x|jZj-APx=R(FzV>_1_0 zlK4QbbG9D{$+#OO{xoDRJCZE+8Gox~R!X^GpmgbBJZ7B59(%xf!jZErBu@hW361GK zL(b~g)7X%=Ni3*6)*_J~;tDFRa&%Hw35~Kk6sui8VK0 zH+}1k#@DFR0qftN2a_aX13ryo#s?3! zpFZ5Z^_Y%s4-Q#;I0%E$Ae{lOXLW5vM_%kM8oDrnBt& zGSiiu#$ufCs0}9&Js5ON*Ub02t;XgR?E~$K*3$I%YsOX023bqDHQRvIKc>yEfx$vL z08Q}rDjhHuc{%{#^j+G7NUJw2P(?YXvpPdgIHNuQu+BVpk0c2lDx4JNy57N*O_{AY zUPy&-c4@=}got&L(F^9u8c~+c_uWz*AXzTe2~h*TTuZqE6*X6K+SO=ZivnX?>QU1dvl|MH_K1icikAG?z+9D`09P~2CXO8)dQKxIL$IFasp37y zECZ&RE3SH9;HtUeR>=#JYF$ZP7eWnP-34h#qmfS)-tMTeu62Z|d#3am<@@4}gJTXb z1R;Vr3BsJr(8{@(obH+7v*iG%<=ywRrYJc zI`FcO&(-L%8J`vFO;8lrr1E0Tufy_qeYsGUcG=}6$!_=3uwAr_J~l(4I@a*Riid5a zKVcyxrQim5A6~9x(;$R@pj6i!UM;!o$YUwuOsM90rd}L^H_^%UQXLzj=nD_B-ggy| vH%{y)>Nd5gU~l9qG_AXNL;VsPx3~ernz^Qxe=Vc+slM65=4G_B*8BeeFKh|0 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_namedtuple_enum.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_namedtuple_enum.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6cc743f39391dcc21b4a3c01f11d9fccce10750 GIT binary patch literal 16491 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_nose.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_nose.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..586c876a42f43685b78260a1a8285c125fe3e1bb GIT binary patch literal 2237 zcmaJ?&2HO95Z+x<6ixluQS77%kVZg@B19UgK`uezrga>nHDDV>oU{$ofS|N%TQ)_~ zyDK{uWT1up8U-Yvm)`mmz4y=yuRZk@0u=7d(pC~5N@ABY`!k&R_M6$XR`V=E$nQ`8 z`sI&L|NQrFkl%Y8(7uAEeua*cfN;uLOap4ZEMVqq1vY%GxYTz7hvFJLF8AHQHF7DQ z>3e}kiLiGo6e1?0cB)GyWyb9k2ukkv3uL=kE z@mX>8!~#nokLSVOf@ttLe&v)*V3e~>;x~rZze&?Q)!a&DGf94aQ| zDcF?LP~uvj<<7QD2bs!Cae8QcrTyQCoPo(V&)Yj`U$o^QNrY^#EInP_xVIK{?zay_ za?l0<+S!rbNs|Yy`=7N{Pm6n5)ZK${R68o7YXe5Tr07G0t(6_+?qVGEJ3M-H4ZXw| z=gIJTn2GFRYcWo{QLG+;P^4Pw0P&lZ@(EUs_AfnmW;&cMlG?8cE&&1azBxtM67wj3$pe{PoG-V9b5C2D?AtoDtX(`X}iU{XjeO8{M7DU_A{ zK@WRgiMN*~dHFm%S;I+B=}2mI*wZ`afb;S>&4S8f1Y_M`;oG@WWMB?tQ35nG zp3fk|LIm(Ke-;ckL!G9v3bzJHSHsWM4fv<}1UmMU&1}jjJG0MNWuDGa2jnWdMm^fV z#$d%8c^j6#myHk@!VR?kHm4<|&@wLR2_-*71Bhtg;V`hdx1AJn z+SwIdeHrOn@3IAK9Q2|%oW}GJESb{lF_+ev2mJ7C4;bT6n@S&MhYeE+O}MS|{qOMx zD>IhGWi*8a4p;(}d=Cpg+ZcLpxBJv&1{6t}Tyj%ZVB-c_KvNzux_=Gv<7qbxb0&qv zD3i|>^LyWWa&IqcIga!D;t;NWe1G~A`PTB$dWlEl>d z=6oatAS+GI^Cg_Wp@l}f-=BY>YNmU``nnC#JiO6KFsc+?9DO`Jj!!@JYA0ozck3vd zK@ESVB$FJ7s)PVVUSGa@J36_d<1=yt;)WFYn3M~XN%4Gec1m<^;H0FJIo7EOZ5l+z z%BospS}UGfZPP7n*M|?Dqz22>*jv7Dg$WQm*K_?l6(L<7JlOG3Z)e>}Qzj>Ay6$YU zP*&aKU}FvHYz7$=D5O?)o|DJ_&Z@k?7OM8vU*2?2*&Novbv;yd7WZN`tZN;@7tKIi XxM=Ao2)@7D-gWJ_-}1Vl8{Yi|tKIP` literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_fromnumeric.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_fromnumeric.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..859b321431d1e2f04d24c0c459ad6385c295b628 GIT binary patch literal 731 zcmZuv&5qMB5RTKd%`Pl(0ddR;ZKZC~6*mNk1#v)v9)MF2irjkIT8-^!?5x_}Pj9exGdwOu!~?KPrmu_c>Imc(a~Wi2!d~4#rp@JzI4A6{!1dVp3$<;Nr@m2 z1QTJ&RG5d%<4)O8Q64ooD!Zze_Xu}I?{kp%A%xyG5Pj%xJLHYu1%rdl=*&7aQX~sw zmNuCgOmwZPbviW&=?sk`6HrbQWkg*<`h!jm25fg9VJ@u$EZRT;D+gKtUa(!a;%I@A zZtbhT;hN6@r+)8s3CVat%f_S}-C)b8t8lzo9VR3KW{IuUF&`#;CGC^3(J)MeTUW5h zrgnR@1gL~mzmuevPV%w|4jwhtd_@FTquyUp3y#Rw#~((+Wb|>+B%$a3BETN~8ufFY zEsTN;YpnsZmuGKZjZa?l$!T^D`aCP;B&*hLVf4fFbd*`?;H2WyC0*BMyyZ5VAeXw; zMZ<34*)6WIn^x;x+tojz!Xej|2BU6xrhH=|3t4oDp0v%q|Bq`th5N28w`Q3dZ zY12r$fU*L#=-JP2|B2PIr17DDV^?0)P7b@|Z4SI*rbT@U?Bd7mBY4WlvUf;D(M{&R LxDy`4EWZ2&9L>xW literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_function_base.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_function_base.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b2202a85c0a0c6d0edf41ebebb9e3419cff777f GIT binary patch literal 1158 zcmbtTOK;Oa5cVT+oHS`eB_85}4;&hl+9{6ce)IV4XHLI-*ZQSZ z)u$JF%THQ_1~Ni3v?3Fk`fo>8Y$H1^p^}-~OHny?kW=X8s1m!#Ep#WU#x+#adL?wj zYFPVfqa|3ns85Y8obRiyKe_2b$+*;VD65YE5m^c>f@@ z4vf~)*~3k#1gD{Q%=wA*MqGF-jgyH#{D%iYS77`)IWbLiKw{z4wn-uVTe0BJ|Mcs{#uP?YBG|!>Oz~if9Ukk8h zBX`kgt<7sj)qg3pR9#ds_$ia1X!i;hp|=Z-2kH zm6fT2SkCgqjKqN4JY_7!Fsme*MU+Hn#@vF63yPyv0b{BOB(M^MNj(YiH$&7lRv~`U z;F!k{h?Fr9L2q+^r@#K13^syOV5dPu2SGAX$DBR#H#&jTS*&a3o@iprU|vg5G-@X2 zjmoDCFH$I`%ugnn`)oF9&rOXk?`u&ixmMGvoB3zimR`=UX0>iQrlohybbgoq`~_R` BXc+(i literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_multiarray.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_multiarray.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ab13a7f953dd769f29a7ebaf2ec60ec7034946b GIT binary patch literal 3583 zcmb_f-EZ4e6pwG5G)IC#harUExI!V$bx0AqQ zWO64dCCmiQ;ru5O9>)_PC-D@>X*>h+1fB&shfji>$B%(Lg&zlb8b1N@Nqh#Rf}a9; z7M}z8G=2u;d0YTl#3hi=;^#n?@dC&SuHr?!bSwFVq)w5k+ta&=mBh{S?;v$XJwc?~ zvm{AQ>>_nepu2sNjFT*x+mXTT|gVpO&m7&eg~uLiPH0ab(y=2npkO4+Tu!s zGR5)icDG_sMk=;vxu(vT-c@XhJ&RO+74cXrpVV-$fn6%SP?1GNXI1(ChU$Bq}n>;1RlzVI*DTt%{ALFFdn13syq57VPJN2*>#y& z_goUlYr0Jgfv5jM(76OR&wy|t5q2clC|dKs$|`W3Q?S_p;KXs2hUXZrNgb|W(l8x@ z71L4nw_Is=!zC~Y6AocTy{yzrFNK3b7bC96oY-Fu4*gWTu~=3XZ*HmNdCpsB7duU}bPctfu*Rkw(b) zOBUL?(E`u$svd>8T4%cHL^2MM2(&h^>)=cj)dMq{%XEiBhS*cWziALiLXv!+<)P`% z9-22nDs+p_g%=|a(fWJDaLWpIyKPciqYf!625on18_a_yWsnuM!s~^y!o50e)h_E6 zhj9nnrc+z&^MB~1V`2~_!S(*Ku-uCQsQ28^<`8<+EV0{eH_U7QU7>EjFCyE&kq6L= zO+AdQqR5+4NgXq&W9V=;;P&4X#`*?|p$Bu(6{ zyrpEfF!Yqv*|X6N)@#aqrOAfydyiy9A;D1Qxfp z32E6nZ`BG*;#ypU>}^uZ1eLsY<0kM%sLar<15pe0_BrA>PEqqQNZM#{;`(3qp^S$1 zVaB+kVSvi0Wz`CB_&EV+$HEOy0OKMthg-fI4joL-bA+I01F*~oCAEU1n_I%eecS2bINWx`ng`w<>Zr-JDA@i7 z0>fUn_%I0Es#GPV`bbB1Mur!RiNgIwBaDsT_5Sy~De^KZ? zI2yh#%P`#0wkc~J!$V<4WW-ypZn`|;hF(u->ElUwAZDJrxp_o_9UhE)h?w^vzbYUP z3=N0ZuL}j9a|F(ifnt{U-!da9?#p_uTBkeXrX zoDum|wacsP>#Hk43JN!y2V*vYS`KRtRJm%d zSF38ka={1`%uttGYE*=W1#|BKb$YMT-mBO4OUS5|1M@-V<){*W1wN$`{6i43oI#T) zCq=(WDU(F`4AgfhB}?eOoJ9BJ6#7RVL3ia*^p`w_{*?3R4|xLpF3+IfH<^sQV*-=GSDEA#c_i#aI`bz@q}O7gvQDr%+g$#?$+|C&t0 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_numeric.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_numeric.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8722bbf00168eccdefaf1effd25123503d43268 GIT binary patch literal 1508 zcmcIkPjB2r6t}%z@1J-#>6Ww=Lc$V<#L{-1s<(&$p;<%)-J&$7fy(mQZ@Z(6XSOqT z#72Tk_!eA}WAA(gBtC<$oVf4-kf6L7Z_=*RBaG$e=QnTu{O0$2BYM4V!?LXX-+qmM z{Q1xFcl6g<2me09SN(z}vxt@1nZs;i=*EeSvcq)J1|K0fM$h(F^*ZqS#Qol(g|K zxgoi-WhCgs^~)4}=@;lrKgPYbFZ~L6x&DT`E3N*lP08?zn)&T;W=IY>L;1!VhkKsq z{rg}4_@$En{O^CzUiozJ>off8D?B1^=tZrlowU;Su-&5eUb2^Vh8^4PB>U;X@W8hB zlSgTH*hTvwdh|DM_?UNi_oWwg`Qw*+pgw-#9UtDEeXfm?apX^>yw?6$DqrMjHa`ia z;wNZw6^CY?aqXuv$`gL_Kd9jyw_d$(ae>aWOe&)T0tM4p7!Broicex~xC)B50)A__ zh`0i8KVwRBG~O)x{yh_H!c|Cut4|9Ja?5Y?bgtM}Z+hOLk58B|t^ElXq?T!oUn=B#{JNL zF_n1|`6KSLa>xKSF?{aFLK`MR?vHZg3u$~dV{yVp2`>g%-mED3q5p^6m{?4FCVXqC zmB3l#Yw4RQGd_uha0$MMz>WB=#Vholo2gXs9gkLoTKADg(B8#^amps!47GC5eX7w# zBS4Ji22-?Y1Vj|4jZDQ^(#X8GS1g@4T6VjzpJo_K5<9t$KlK$ixe|UZVljprF$}9n zF?U6(Ny=__0LQ`|tg(t+(V8Z$1^4}k+I?RttnSOB-yZe-kZGDtmq)qKY|KH?`AA-0 zeywrN(2}lh|3VOf$u`c2z@)Z+C#^6J}f; zLf&>2jkvF5IkL?=n9S5L<;7*c=EK(TWND7IHe z^n{yn%oEpvroikdnZooAP|aNptm40;aQ7gYa^~u`)H#?In~|fgv^BXx`3=Q48);o% zk>ZXk>4@H8`Dey;DP_6qC@VJOuIrvQZAYsV&$#naLe!qJa&KF1P)%Dm&^VR2>LGLC zy67}#DxA`m%-vtvX<1|O?GlZ4@yZT9+2PQkzsosycD6Roek%@fj)UmF=V=^6*e!S6 zMGU)kok&L7V~(T7Mq-0<7o8w&bCyg8VBxwu7{x+oJrol^VQ-cA{8e$}65;U_h#v`tl{1t~k>@F%~72d)mL^wlbBs`jn$rs!vsn+N`CK7CRYNa(W;zA-zVFpFq%}8${5Ko1?C7`Zp zEch)nUFfi>C88)wrbeNPQ(3j9YKmhFHhNJUd;0!u-=Ev5(f9AFDYB&=R#(FwZi1fu zYVK&PWIE+VF$@JJdl1i{H|7M9f+EjD>Ouv z2)MwR~GCe;~(Wm{qUzHO}ykh|Yjtb)Z5y=GjcDS5bv9;Hcut{Jxpg~YRq z-ios}LDquj7Ymy<5fJn2At^aPPtPCLo^a0|hS{r*2-hM#dTgpxntt~D{9!LpsEv4H z7+kjIi?tBG5-GPv-Q_S8_O8iW-%-d~jKG6qYR3TXtL9a+!ROD`4W@Fho#dM@S#jvU zSuFJ1^hz0&$ktIlMm^n*2I5`HQ>o^3ytj^{{qh;ecHb;0sGWd7W4!pSPYFVI2Z5!9 zk<96uX~bNAvEmhe3ATvT2nKZ>E7QI-BCDFD? zNS!!k$+#k&UD%glHJOU9r-g24(Q7M&aGj8?5XhPhLOH&mFQ>ijam6uKyXS=}b*HS; zmtB*uBuIw zoZ2ASfMH?ODhXvbL?KD^T_cf?*GS~$I*FW6I)cchVmM@lGNN7=x|JkSZb_@WK(Cf= zpd%QmLf=-~@$JGN||In54V5C?qif4d>M>Y@WQkj~I zOXZVn{_2AUUSQ7=xRFkgD0})XJUaUaf9kf{`|TF~UUy!rE{J#US^=9k)>p@euO0_|7V7%9D&Mt>`9t__GBMsUj}BtoN4Gw7A7q`@mYg otRHKSM_|0_{;IeT|2183>$maf9Q?FZ{B`%dzqW6?t?ujp13j6)Qvd(} literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_umath.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_core_umath.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9c8901dc445e9cc632c819e827d7159b2bdd4ae GIT binary patch literal 4606 zcmcgwPj4GV6yM#riHRt!5S0+8k#cApxpwR}ZBr4{qyh<1f&}Gaghu0?S$pc;nPp}- zjsp>baz%U$#24UmaL$zzUjYu`&93dlj%Qp1)QMN)dGF2p|J#|7*RQXyc%Jv`Pe1>5 z@?GVx-(fuSslczt@YM(KpkBwLJ`G|&2|9sq#w+nkQt4ERaV5T%taesme2uRD;C0qm zz*b*)bd9aOSb^EeM^}FIU-)2KV=6<8(H?@xZPup3ml%Yx%fTVI0P*dsq5>SYP>AYj3(2@^p-o68h*#Bd%0$Mq z5v;qILGzvS$|gFf=vvA4hzFpWPzg|5(plSAHVczUpmGyY$j}Wt)a1j>m0UN5^&awM;W? zJba{2FEN|8TwYcSl^<~Z|Ld>2s(sF^XF~}wd3mE+5SaGAjLZglB8AR~$aK+w1`67Z z2d#(ghvs{4XLtMFPDz26gu*?NB*Xw!W9Pwxc5CPU{d>FHt)08=-Lio<5M&lXo{+)b zjKkt+$l)ym>4P66MrEBAOA-}^(m>m^48~LAcLfnKr|oMItQl>|rZEL_+OW4sTIwc`&=j@Arm6Kuz zvbb7ZE$ZygOaTBb)LLNA1_HP>Kn1(vmq02y({B@`F6$aXGvu0KB3^nzWSmnnhDK*$Pw>-KvlAX?VM8tOBzJ@j%3%pZ9%np_&4FhMCbJ$1 zILwmBSs3shz)Lz{N$o3^5I7dNs!#D=e`${4aGNO-I;sFLjxBAnn%}8THqW&{nHz|+ zRk#U&!#|KvZr~43wr6<2MngDko2_=9!1+=C;;B^-`I9vJGGR?XRl!vA{ryirJiPOi zbX(0MCXSjh?>5sB92dpiMr*qXZ##AefPVnD1G)(ZdUFZU>?(*$`NYLF1UAnE36CHM&Vx$e2d9Bw`Mz?lsxWzSbN*K2uvR@=8=vJnx5frE z3IiH_7N<;U6@X;t#*~(G=u1_^=VCS~FF2IB&?r{N!FtuNp8pN1=3y=X literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_ma.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_ma.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c15ad878fdd08ca1fa707a1b9ab8309a37117ef8 GIT binary patch literal 886 zcmbtT&2H2%5Kgk$AF3^tS|M??ICZ5qq2jiph=Mp&f*ybiK`3(L*{;>tj>gW?U5Qh9 znLZBJy~2f8-~wZ(wB?K?kLQ0r$6w6m=0-1yB2`}4t(_n1@1*~;QnH@Ywl7GCsE9-? zk~&sNk;Go_)jgFKY0%TUuLi|{^u8E;jfx>8Fu07w5QdjM@{Zm`lY6U2N7kW{g3XON zw`^vR=~gvMrZ`hZv^8WuX;w6e*AEfSq;-I07bxMvffj&Q@w(q|v_MJsulv2>nx6qy zzV_})$aqQHjz~Ddd>IptWc6i((K^;MK<4JaDqh#j%-DjXG_CDGWdv&0>dHx@ZMG3g zrZkx=rj3AUkjxn-eV@DG%4kP$r(FbeMH4z#$Xb01hg6M0cQY&a1kC7L*mDr&=Q$wk zQk{?^r7qo*BX UpT%TZk1S2c$v7Uzqu%z;A9QN^r~m)} literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_ndarray.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_ndarray.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd74672180c7b0a07ac1a403dd86ce3391cd3ec3 GIT binary patch literal 9070 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_utils.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_numpy_utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e90ee85a9ebd78ba5223d95f6f22946d55d35b49 GIT binary patch literal 2921 zcmbtWTW{1x6rLG-osF|eAflu|0k;yDg|JJY0x3!(5QH{TyC4#%aEmNwXEt%-wav_I zNTNk*6{LcyK2+)tAdmc>zWKFJ^e6B@dd_$^2}Hd}^~$qnX3or<%lDmeIy~%Jgb?rA z&v$-%dHv5nKz{GBp?8B2s=6R>;uB6ei)owrjG}DCR@?S%BinJQ?f8z7OYuOv?3dev z{$Shn-S&__1mlih;h*q9?moBuVSbWV_%KK#{1iXU5A(6-C4ZEA{3Cu8Mi22%`Eh;% zq{DnV{Etlo}VEg?msy^fCJNJm0>tyFq?S$IjOoo#rFGK>;cdxJhyX+9JtNvcB~ zrHO)WMXYNXHg%AsTtNTOTw?ZXid$)-VX|uHgEzI7(PBr7+?i`3+{8os4+Vk2dkbSX27)GA|{uG-)c-Mnz$ ztXJNG>3=dYG-pGWv93@)Ssw^K1mIT<2js|N&D)1`z8V|m?_b7Ncdw+iJ zZX;NDbZ<8JYOb*`AIv|vckk}~g(~%(Bt!kzM2>$?!33xRRrFdVKBPY$b4iM_W+bSI0&cd+Y(*KZylh~prrnmAqqVROVF5Mrrmm#nZA z_R8YcHr=A%l6hhiZR=8tZ5*cre~$=6}!<;fb!VXb~vK=$i$OoDQ zxZjR{2zRgRHPS>hEm+upP{!8;9FNlg+AaEwcIgW3GERS?0A1DqV~)dYl}Xh0OA%5D z$YCkj%xxr?ng77pe9Y+eK+_f&^E0sC;G#?c7pI^nPhv9wO%o&8e~?dzA2^Vz&q09v zlb5Cr8u^QraR#bY`PB&d+alH1T6O=<%N*p zObP|n#?%ilZNZqyo!3rzCl)%#-vQUO?v&U4ilTJM?ls1P?6|kM! zEja(?^1)NkwF7A>K{n5mFYNbhOwHd?Ja$S zC^}#>;`S=qd>(`!(dN--l#>^v1@^9xHIj{TL_J6kp_Dvf96SI4wb&NJhuLicsiu0<>**29IQIA`Y414qU|3KuzW+ZSy->1u| z5@sE`f&AL%Rgcv@8tt0^Hla4`f}AKO3QqkW#(iL$*>J&N>rQo0o`&#Aw-mZP`>_0TtMP2>vAAIei&FbE>ofU91A~1a|GcTE1_AQy6y% z)r^IRqJ8sY`9Kixv>61s8w9Nmd}N6rkO(b*wD%EGTkJ$J+%m=evpd?m>?B?k{_(yp zmQ+>4HfYA7QbL)qn&MN$(pZ47H(w^^>MZUe#JzEOUu`l0H3TY87c9p+g{Y&@*mi}% SkA6&T%e7pmGUAp-j{XHuvF!T* literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_pathlib.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_pathlib.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2962617e55e51d3efcd51842eb2e848c9107455d GIT binary patch literal 1544 zcmZWpTW{k;6!uJP$8nvcP19}#EDho!y)&uz~5eCP8N&8Ay34CC)#yMO-v^UlYA zfd1NLf%TbT5b+x*u@RHh$cRq}>NKTU&97;_mYSL6Tbb?KS>3N^j_+u{nKm-lceQS% zE1BneS<`Q7+fG|q+i!zj_gCYM*o&LbO@FP?iZ|m2@p{~SZuuS7o*Oso%$assopt7f zt=-~|t&!2+`U^j`Pt;17=Yh(zrIJMAB((PI(jcsTq?qD%vp}8CMNyq3_1NHRj|e^0kqBrXlOn znb6Dkh=KRFFv5}XBUU1^F?Hv(_z3ms3RLybx+XWxTO+QWL0;cHRP{0h?4bgky86Ig&+L zjSq&&P4M~7!J?q=1SKyn5*90GFAaqN{FU_smg-aPK`!rrcwz82;C1)S@U+O-kk9g* z@!|gNR|kiWo`mDa!*iCO4`D3B@=~4_`G#3hSfBOV;&}XC4*(d z<)wNUq(yNif;2f};Mb4@VmZVvY%bmc;Zgd^BPOM^Lsp4Rz^Zv5T}oeaOgL1n`&F87 zsuszMyX^&82lqtVtJvGS?j066yW3h4{5#EV$g2?lK0=l(FZ{3Z(Tv#vf_W zo|BupW(bweHN9!v8Yg5$BB|;NVrXJ=JR7-<0x9md7s0`JmZUM`8XUi~^sYhzE6rMB11+JOpjD%?2o zC;Dr+ambYucerqYS+8S~zGzjcD|xkR&(8PFx4SbIYim~BFbw|doB#RK&#&KUywn;r zdq9uep)NE+GcsaxV47-Ni)wLwP%p;ys1Y{@O&T}C=0{_&0(EE}7~u-694L#{OQX~N zK|YK_bJk25O6Zug+X!PWGeAEUVIF}G?=nb2K>BuVS7s=9_?#td3>c`ji>*eJhxEuc zbr~@`FbSj9XJ1wf!wO+!BfQBug0oQ$Vn{OCxo_Fj5V9N-JKY=m2vX!2fOOvq+~djE zmyo$9FSfMfJn?0KJk6ZaOm=Pk!cSNX=f?P-9}UNqK*SyQ{Zw#@!5O2-)2^+sdVP_c z8}Lj|oieym4%!Ra8tJ4g*rN^b1(H&Qpi0LsDX3*TA>uJ)eu`qsX(vxv-*G2QR??G< zi_VS^;WFf>`MErg3R=Syr$e8RGboLC1WNr=qPsjRC1J&^LaWG0h(gJOs?u9wY4>b(mfQsd<-itbE0>f;SssHP-_RmD0qkjj(pe!uc2A_fohBmwju@4k52-+ab~Tiz6s zsTc8~m+og1k=%2)?s}4v_vYNA$8>S@hRArLdw;o@rTep6OK*HqD3KI#Y^k!TXw=M_ z+4zI1g3i{KjQgF|tW|=b`a>ApEN5;3=}sU@0VS#*gu(Usw^$czY|`7p?Z0UCsHLFV X+q&HEm^71$&1z%STs7PE8{2;Yb!*`0 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_pytest.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_pytest.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..098e0cb7b6b329d5518b647bd80ca1c4ee66d427 GIT binary patch literal 2169 zcmbtV&2G~`5Vn&v38pO-5)xd%QZLP+cB|eHAX=!ZN;Ikf2`LxL@lKLe{HNJXoAkgX zJO~`&ZMf#j3GoJ8V1FFfP7@&&M_KL8e6!!o&g@RIv0+sW!+8AuJAC{2tNTODOJ7Z_ zUWz|E7XvXm1~Ew`G^0wVV#;|ntVXp?P0efJT2$}U#e9v_KN+0{RG>aJNCO(vs%d1a zre2Xd?~Imp_2`gsOenDjNit-1FF`w6ki{s>}Ws8qS zX@cDLGN&RRhs)#$!KIJ!Qq?Gq0hejSo`Ynm4I9!lrE!0mmCqO;r@|1%0i@hMRW2SQ zCa8T*1;m1ofnE|wg?l~+;st&f+RyW7GOwKlgkqK9uq9X}w-f}%lot^yP)ACYy64jp znN~}wQp*@`T1%-?>w`~lIjpGF&Wso6=11r#h1yakufQmm&Y2iaKqScL3GTEM4t>g? z7`slCqve`z+it_9P2;Ru?E_~|+2(~Ki^oq>OvVMuY$GjKcnQl3T&LDUxJ1gKV3+6I zS%Fo1W%Y2#InwTkL!l%jjVcSv+P2S<3m^-=udMhU0$hQ|Myb3AiYF7%I0#3ibWmlm zvjALKu%$y=xN&`mS%5Uv)H05RT?@yQV{b4^yH(dk>h#&>!Y2PlOt~xc}lu@iR3#Kq80iTZ2uQ+kB<2Wf$3c9MS*s%cCv|rO(=xK z%OuOdCBW^DJ5W1?>vmRT`tf3P8@ow`O{HPVSA8*01NoHaa; zB!TC39%KxTVsHi!rhp79((qoc(_K{sdo7K0XI0TFrt6UPOgb`aKGWU$g(+5SQw+7* Nx+#Cn>gLIP^Dmyds;dA1 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_qt.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_qt.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fd839295870f8ca6b347adc2bc33efd9c63d443 GIT binary patch literal 2511 zcma)8&2Jk;6rUZhKVv(N>!h^hV@0V{qtr<2VQ)WuTcFNQHX)_(wbuZJ;n%StH_HzBa znb$}@!xmVU)2#x_@fnuq#f=Oru$ld|SxWlzthk}G5-acPW_hY_mQ|o{md&y1J~1mi z&GUPNo#T}~*d6N!bLg3udFgPnr^;tpjm_^9>}AC^sh=NRUXe-!E;BZRpeK!uKp1M1 z8;^$Tj}6c52wMyrf51gaorY;YU|fdjfh{DjYvDVBcU`Htu=)Yp@wmmGDef~aV62?@ z{bI-UrhC4$eY?v=SQreqRom_QwioK?Ih>JE%ku3$4>N+R9pO6^H%~sqB?n~{iezBM zWQ!bVOzV(M8qO?09%!=^^?_mr?~n|vSHdTuno#uayzVH@#z4Loim%v+Y@*-~0os5OKJ=UK+n zn%PIgw#)dflgg(Kj-7ls1ur78ybI<>xW;$+=h|31Acw%H9{m=MuuT~pwNA}Uyl3l3 z3)9;e8bE?JZiFevlSf3%frr1_&CQ_Cn_|cJxoF;9`T9ZY`a`>Ov$@Ot-6r7J91PWF z;D6G%d7~*^#jg)+rw1^|rXAzo1gKp{ox`RU9mjm zisiXIZpDx_7QMi+J-OUCU30IV4a=@CmF+v+vXv4tOm(>uW$+W`fkVnwZs3P0+aCe} z5cBd1OmjOsir*C?5cQNmv_&3_neAbyxr{Cxn<{#$zIvJx^veY>WqpBGHC>}xMJsBQ zLhXf~5*J~pHH8V{fn^oSUu$3#WbvMcm@s;Q0JS2rbTuFxP-_t=#Pka!Y3ortecDbh z0*ZiLrZxJfV8Ca6(`w&+Y%Cc;XA5|AwO)w2Bk~w$X>c_juHT79aUtUyh7$m&ut;)m zK<0Hp zIf3;o9tpB1KHjwOZKH3_zH||RArkMQLD>->pfS*(hD@Z?`N;rFP_iV%w_w_2h-Z=z zUxt1M%G8I*u0oL&Fp4N`57hSnMC~w=wbtlqp@8&mKe*pod3ZH}JJPp1FvydVK135YjqV&N$O5wHHi(`R2yUI;9c4hG zi$X*w@ex!ATBD{;_>88(_v z9*pU3fjU;#Vhwx=qTHfq_dCp9egbnO?pq|{N<1I4u6{1eS{4f&c$>0`#0#7jWt=&m zbTuN?Z)|dJz=aej@#gI5Sp0NHu{`VT$Io{Z+;HaJj_;s~uknpA1(6Q*P7rvJ!bX`V zF5{jUI$o6AO3;)*U VYPDRoT+C=W$o@RG literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_random.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_random.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b2cfe6a430f2a44dcb61b61948c9e9ebb4de64c GIT binary patch literal 2618 zcmZ`*%WoV-8tkX!-nsx9y^JE8THp+{p$HWeqVLbYzDSv zSqb^-rxp6ke|`r2v7ZaA_brRa|AG=*F-fhAFhWqLDP5Le^oOY>_QyOKd4yX3NCl9lpeu zhc-JC*W=)h#a80QcqwkitvfDTjhEwvxO2y0YrJt_9i8QE9`Mxz!q@KEum`gQ2Yjo@75`EJw)lzUr|?BSj3z0<&E#Zg zsFE=Ntxc&!k;ETGd9=$#*Vpw;r9`qbQCvG)QJQKOR+UP(`!}L=5-A>E*%|SH($3`s zU}rnZxVEoxrQPe3amoi6m6Kl`6buAlM1BW~vJNdp4yf=Ctr7heS|fXEgLI}2NO$U% z6y9D*V)COs_5NiINlat=j$gVLtphTxm5%6@-cil;IHt$Jo_i45(vH2vD!qS`@5t0w zut)5|Uj5RA#~;;AZw-54tPk$3Z6Dj(OOu@Eg$@Qq8WzK$1Y5ju1Rhlba$*U*DLfuL zi(t&JtDwME*603|lmyKx!K@$X7Z9~$>lgyG%OPA!98*o#&ubSJj55HTyokA2hUve3 z*4ryG-V>8N=c3o&yn1Q-)yvV&YrPvhztKyRo!0l#H25L}b;|tHiM!(|8SFPJGhl8}pd59+nZzgIltSn#O zNQ*&~$_wic=l!MSVhI*A=ND&CLq~`wPO+y@`x}VoQF$7K_Q!=(NuDS(s~hMbkqM+! z1Q{#l%!ooHyGb6Ux*ozABPqj>HN!&faS;v^p2kwQ!Ig(O#N-;l%zB6o-5C7LyQI(vXfs8lmH&XqW^)S zAn``z064O5i@KuU5M_@X#A3Pzi5S~=>69wqlJX9yJZnZkYgAJ{w4ZrwhI2Z@E^T>! zHr7^k82Jvi%sk-MC^#Vdj@U%(cA(~t8i--jSoj?bl;sSjk3LzS}EK=m zh;FT-5c-+5tE2EZgwyV-J+^QPNdCnHZyxbBPPO@$17=u*2dLcDgO18)i+|#lSD;tE z38DquSfT;QhS4050d>ecbtt7vz#fnIU(*L??0`_}{XcL5A~tYSPjEF6;KiMyNdJ%t z=+G_9gx5iV+_NALuwYZT7n&s**}x$v*#>g}TLH|iFmnOh+u~iA`C-@7&Tx_ss(@g) zwT}fShwD!?vFV@+Sz}7idw^8-Kg^l6FfEFG2}O6GKb{;{V6?=LcqEwpp;CMRK$mR8 zk|x_<#wHd2fS0&{`V%?`!{G#s=V2(29pW7jx;876RWh|_t@T;S5e|%Dof8xy#>eKX z!XzMDKIt&Q!qDQEg1~!^oi3GCUkd_h#?GG1z-vXWo6E)2a4rSS0KY<*Xz4E^rKP00oIGhlR)<@#sUh`WsmhPf~sX%YnqJr{VatK^u@s U_r2<5=P#OPMQ1!Z28klm1aK&COFtgNN;s4%}PJRZbbfMKW99Qce= zfD0?%-MQFt^{Hze;7yU?u?V9aKBe6li#5I0x>Qtz_EwDfq@nn!+fSd zo?H8`>f5xtVsAiiR4SG7slnd1LO+SJ8SqMKV3*hEEr!hls3}UC8;+Qo zay{jV)L=;>!0~=WQ#*jN%7qU#IW>B_ahKt}lNxOVEvT|I7O7R^JlKj;J*07(6F!5Z z<*uDsky%#REY6AnlQmN~%2h8+k{#}a!4CC?9`F*V^60a>z~EP)nY4?lc4BMVe??vU zchb=QnKiY)r!DO-_6fl4RPT!C$Jd6JNToTtL+aVB;v6{bB&J>5?C8NVZoy9m%pwQ^ zjuQ@F>+3{?qcuP_F&NNBv>%N_P2|`|A}=5~4)p_lOFhu~Hqq}XV&XvCQf0w6_Mghh zPX~b?6I8RKhRQEPpYmY@Jcby-3+hY9C&bx!Co?uG+3DeFl?{g8NUbo4X`G~XHwnF@ z*W*+$yp7VCcePn3OM zunC+B%OWddgOMxu=gy8lZpL*rHL%c~@}JBbnKJo%*(cBg3<-V}nxZkU71e2Y!Dss9 Qbwjsv#d&L{sOC@p2jbqk1poj5 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_regex.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_regex.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f6e5ff8a80d82189dd99e75ae235859d83646b7 GIT binary patch literal 3318 zcmZV=+iv5=m82-ire&|~^`_Z0L8nm*SWR`Yw*}lqHjP%6Hv(kYu;krVC_q!>NTSV) zFf;NE&Xe=nf7m<~{hq$@wNHzFLAOb^=gd&Dvr7WQ!*iK)=3FOUUbZrtrv2{oH$VRC z&>8(3;GaEN`1@MZbp9FuPxJIZ3-!LPBWwglnCWLivu}pkepcc#K`zYq^Aa|Lg>bRI z7+QTx{%3=wu+T3^I2SC3EBzIKf8i~9)^}$A0nO8uTg_Xd4{kGnFZ5TvkG)lI4QOlL zWA791k@wMe+5S3my?#iuryJCy>$f^x`yTn%yISd&Z@@~eq$f*G6ve_3ejM>qCds>T zBRf3gqT$6feYsdK?%-`jU0XGB?&V^mC8^tK=sRrclPE*g3NG2o|x zPF?^&fRk@^IE-=qpWc{~BRZm&dx0||G@6ElUQS|8IdOu3_<{pcFdzO0S7bWz;Kb30 zjDmRJ1bnkpu`B}5D@w)=^U5w5P6X^ZgzY#P#*9SqMMd%y$>b{VBk`1YK6eHIEk|(d zXMmz*5y#~qjz*HPOJO%5Cj4o&I`YMMI;gmDSPhvoa9BizkYE`cN-wJeu%x1U3_|`6WYIp+m6iJ=)X-HFY5W7x5 zmHE$s`FXS3+pqT;-$=o&T1|=;$#cpD8BVXSuSn0B1~X<_NRb>e z@C1<&_TVERF(M_^1ny?%n|i0wyi>J%qct05XAiRIv?zP&j zj*{O=<%?wBIitjh+;Pk}2*qbA4e14Dn$mp;;)e&_)?eUTyTmxoVgr#ue3^@@fU01k zKQ{w96k!Ze#w>+sL*k>tBiP`m`LcO*=c~CLUFtA*Oa_j7b^*1)l|&aLb`N^>Hl81K zr~CxmD=qh8q4bjIzRAbHe%xs_4tCXfx95U$cg>=6-%&4XAcyv~4mt?dE+G%4XptNQ z9tr5kaj(dLj-7Kqo-$?RZgZ~=-nCOf+(OmR%dNZZ5R}f7Cn%B*y?|aZ2G3LP{S99M z@2i6&tOzW)x$SuBT{?88ftV-PMa)2+QRggm8Ab^#d44c=^2}#NlBU(g*cX&f92X<+ z5oi}7Bu*;d1NmNa|FB)}Dc^0~$@ie10!L7?IboDzvJI%~OgSZxtg2H(XXDTa(}rp!k~2}s|vJXHbfkHX}AI^c@7pMZ|LSb_5i>nEBUYgY<=wp z4(A~SRi5S1A+c?Vu}4&Z($Kay-GKid&O*b|Q<=YNco0BaiHQ^Bt)=Ej1G;}=4&pd) zbx<;U5XNaPXGs9SjrLmmUOUx2{mh8}D2yBJG$YK@>@EBu3>0Hd$pIyg6tMub-09-2 z?q%+%r;DEXSOXp_l?D#Pz#iFi4dzwu`X7xkbyYztFCD7ZNnp?@#6I?4XfrsxBEp3S z?oWr5B0+0}=%y_fMih&~lnrJEcwPGCo|Kp!B<5gl zK&mD=7*_r$N-_bBlDu#j1e*6Pg+)$C)-}{RPgRB)lzeJqTjX}&pHVyYgdM}p1bw#y z9Q+elR;+?-d1=@4iW;4G#F;ymN;=C_8(v(LnWfK>T5bCVhA zH^!;uWxmwJ(v2}v*BJBqZ&G=h0keo*pZRUsN>?_1<5?M6pF|!+GA1 z`9paxokv@Sx()Jt0~Rw|&`tT~elT+jdO^2z_5~1123vv;DOpiq>K8GQhY_W!OEBh6UsQlROvsM)24m^_hsoP z*@OGbGZN$=^ilNU9eb!Q$jm}5*eKa1E||LVX#I6a4s|1+_t(V4zIV@cvT$V0EPSb^ j!B<$p{8Ly8=7v$wSHW4}uFMKCGgiK^ky|V13-A6981H}L literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_responses.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_responses.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..637fa415fd4a5115e629a9aa8278ce672b83c9a5 GIT binary patch literal 1876 zcma)7PjAyo5Vw;w2~hzF3F#eI;gVJ%262lTL?7fqB}l6_T!PSMZBJsWw%6>gL-Vdh z;#2SedgaWS&wz4;3rDV8U^Y(d8dV}Id3XHV*_oZc%dcN=lnul9a`EZMhi@OrSELK0 zf`5*Z%+9*q2Ih-z6UBr;<##AOd8}BMGw8XdEaK`cqGl2*4$Z6B|g#qJ#y(oFuW! z6v7k1L!vw&abgF)LqbpdSgZAdq?}j$ItZ6lDLE)o-D;5;d%*unSw7b zVQarp2cu;(=M<$4cm$2?rY=l$v_Z9Yx*4eL6QB|i6&ac9whByXn0s1en~*!JuoKLn z@%VU^L*sGbNFsuizku4@o%fo}b^%0nel(>XFbto(;?yn^Q&~K-yLA?JsS79%QVvZdGL(%(>1rj6e@Ca*4Q8kaD*HlA3c{2XxI$DRs zTzvJqm|&EmSS($-Nj4($nXiynU!zTCEJ$!s0zIiy{f{fi#Bo4srJ9}iGA)F4E$1mu zR-DC~F-Q3`Y;~nAoVWq~dW4eZt>T%tH{WHxvn6sU}Noq2GxM zLsW5DPCrMM$3w705=Gb@`}@ZSgS*d}eczfvG_wNVw&FRq<>*1@{yj_j3hu_}Cv1Sy z!iK7!0LvB_#&pi|Sz>!#++1h3q}on-OLs@Dx@4Bj$}gcC<>Fe#G}x&xYLvR%p>%Y6 zCB3th-ti!av7Uu)vZI^XUg8H>=0ZPkIf@UBZqQ;2(WQ>u+?1+mz4g7c*FQAzPj2H> PschG`&26(@zP0xoA|Uli literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_scipy_signal.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_scipy_signal.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b627e43b0a07829453a0637aca4b3084317ec74 GIT binary patch literal 2290 zcmcgu&2H2%5Kgkcloli;B#x1gP`BD9TM!q-A`0SwME3waphZ>WO=c5o9Xqm}w%Y@j z@-h_?H(mgV7vR8Qubg-VE-+3a+FlSO5{}}GJ@(9Jdpuvn#>QI9vaGjX4nBT;|KamD zlrNPwwjSfFo?sPOQ!BC~huNt!b!;QISSxK$+lAa_owPgcqTGqP@2qJL9O#}}Q4e~j zE$r>TvIbX9?(8Zp1&!Q9h=p?JLb@uX+0s)q=7hPah;jzrcl2is?A0v^F;yC5P$~jA z*1#i>XZEU-5vc$NU8`*F5l&)|p_zNJIM{fKuj*r^5%;N$Seyy@)U~WN7t3uoqVqXO z;M$$%Jk(ThNi!VcI3%*Z|1g2s5iK@?=(-0I z3WbMW9|Rm{f@2&}!i!R! zZV<9MU%=8tJYiWv#v||kKQ7%cj49Gk_?ab<%*yJ=fuD#Je3^5+sQ$Cvm(M5LFUV}i zKLmd0GdlCLrA`FD=k1JqMKx?^$RWs`$|of~`!h)>FYBNn=%6HMFI%qGFLqot#A;kS zwqv({O2e@y<%o*YCxiZ~7X*>1xRiRRSoI&4e+rLmY^imu+U<4QJpI;o22~u{7Gg`PB*&>X3MGyt#(W4f zL#Hy*mGdKA75Rj&`X5?!(^bEqKvz98lw>6gLmJ3L(AWosSH*6oz5cXa$syD2Z-N$YYg<7T{UC#%L;cgf3jau_e! zxwl#;Z|CXqAZ0Jx#@kHCn9Z))1psgZ&(JLD09IA z$0nm7IOb#!Fd{~jaA)XSE^(b6v)H6$813^#FR(+Gk|FgevjpX8!&*!2;A6nR2-G1PoP$t%kr0-gsdsK`9 zdxN|lIsFlVd1v6v%tpQ#LpSJIE-#UJG!7@BZ}s4&2*^nJ0~1&klQAX1fb;{KBCI0^ zszV{oa~ff=p?nzxt{c3To>`0%%2?pjAms2@FlRWVjM}6(A&rUa_~M~K@cV*PwzlqV zJtPMaKx+|*Yp~CWA1ELIDsb?q*Q1QA`@v>3EPkAVb723khVxupp+P1YC{URq6}C+W zj*mdO>kLN%u><)5Lig2}j;U`;gaThd7IMngI0?p*7Faj;SPOe(;J9>ySSOa_ zs_a|HjqwE;2{GmmO>>BJhrLoi@XWDNY0g!eJy6I5PX%RWq~1K&ZWy&dfJ-AwQAI&i zvO*Dnq9>Lc!udH?BjB?*Mu1ype1pt0C&4i0Nm!f*1@^0u3u1?!HzA-D1;u8n5f6@$ z9e_guyaghB9AE{^25k+iFG3tuF7TDbfK7CCkwkEelg;_Du_n;Rki+-$7Nx0V{E0%O z)r$J`E~7(70@00*SC{@MkZQ^x%Z@F^DF&;vqjq5V7JTi?%@=>N_-*6ixA791(9blH zI@9iGA}!x%Ix3KU`gHeF6)Csc3cLSQO-jWKlh&py-6(e6l@y+?cB6yO7ITPIB~tQt z8p~ssdi{N5jslOGEc8*-%u2agt!?gGy)E;E`X?s1Hsi~K($+ojLeR~z)jvky+yrH0 z0X0!69Y1={`~WYfcQ5(GyMkFhmnY$KiA@Tx+bL#9@0S=AA@lnfFMc{k@*4%@V+?Hl zCxH11t>QS%uD#Lh^w-*ACB<%GC9_z`p6Ki|tSrfuHyQxXoj$k>I1fVBr>YvhPg=>s z8PUIjAF4t*-Z)^7=;7vgyT4_nQx56JH)$)C3s17qkx6fX9s^X|iz5gN(=R_<;1`#XMTI}*3fHU4`~35S z`rduIvmb*4idnb1Ta(hz_hy$SW$gk0i$)wlv4n75;!*uElVWoIuizJb@g}6IC+g^l zIr*=Rody({kAVWMOWg?0n_a}SpA+zy?@7Yr$$otsq)x!(uoiuDHG3p#tqSHY TNEP&go=>l4SHD>`Zm#?TZec0^ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_six.cpython-310.pyc b/venv/lib/python3.10/site-packages/astroid/brain/__pycache__/brain_six.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68579223724692a0e06a33e4f69cf5f4bb54a5cf GIT binary patch literal 6660 zcmb_gOK%*<5uVpRxm=MHMZN8D99X6xE$t|9V!<{{QC3Vuq8*co;{}4jaJrW}%XzGN zdc{YUhGQzQFUcV}8V1Ot?)d>Z`X2-s(x~i z&(2m&P1FAP&sV-OZ~XoBf1p3{SHS3Pd`VH)G^RB*rZXeZL!)Wv)Hee&w3?RcTR|Z# zHh~CuAt;6AW?A)%K_#pW>S}v+PWBk@0qlfN>rei|pKEt9gMfvGagl%%K<9ML;jHOYAbB zmwA!bk2Q9MpF1{nEgxOYN0>Re!k12U%uxR-w>r=9i~PbV;f^4e`6Ys|=Qg$F=MS&0 zCQ`&cv)ggJo7k;b*onVyhcW8~yzw=0a9K}_j58id^a@eTc!JIa!FT*ba^YmS4&RqN zVq9RZo)f*(^8EbxVk9OV>A{OcSRVjtP-IIJhYH`6Mk7pD0$?+J;2X5r3IsBhp~!6I+i`TO@#-rpi7)xh zuIugMh{=kZadu@}xPFwi4jr+3kj^vSa(jVvx`H#`b0t4dhoaM!b#VqiX;E<56Ol(c zJ@~WGp)q~Q6*Qk|pXr|&Et6FFarww(=84ufkF`@Bx3b)OxbiAviG2Rwv27r z=JqyZ7e$bR9k=X+2i%jK*>vy3_9Oe6gfOo)s#P0*>n*iBJLWapPwcLUANkOT8zZ`V zeh}Dk6dZuG4Y7b)zLg@X2<^2Y;xSq;)6}w}xFveL@r<3KSdMm6M0{zhy>bT9F4&H4 zGJZ!Fr-|a|CJ(#vAitMvyV7Pc;8IcY;wXUv+esX7oEwbTYeRkssn@x)9kLuE*dnY>bq1fdjB)Pa=NGdO3CTKPjd0BN%ENnO97TTc(4 zcYN4jBpYu8vF8TKTaC#TDOt1CiT!BV66df|EK+lpnk8yT>BRyyYQs`a?=m0>soz|s zW{HdFxc@F`TGbD`v5>ao$5n3=_7m-_zh}Qmh>fSsNW1fIT&L45!Oc4(Cq>RZB@9@4o6@8=HwMonCF1J;6d!NYW9=6 zEG!A!aGSZgySr^?(=TTpZ8;;=>P6nfNnx@*kLSl~2Yi39$HQJMq5X-S5Y$n_{5bId zXT%laf)@v5dp=Zgfbh$Ni@UxjZ`jnk4-L(F*~04nAC{jjbPma`1irkVZAUsaAaF>@GuuxTgq<3!>i%*jw|Te1aXFt zXW%7MSi>{4Wf(M|w!ZY?ffT7Qa0Y-8C17O-9pX%$J3CY0W94WoH5}2vsd3Xs(8$4& zvtjj)oA7tHw%*^&X5X~eezra_-o(v=NffnVzCPzm*Y|bFVUPEq+nKrx z-W5>K!7z!vT`ngHP4RorkH$o@9|of9jol;zIFlrDEN{q>94iA1Ht&f5M`?(7JC-B% zW>9AgI>6_l>j#a{4|yZRBj#g`Vz+`j1b2q;XRLu^9!`@C#+HpwJ!2(#!>JVndIsh; zWI2UNpaEunV|7_V%kQejQ#hO=l`$MO9^lAb<&36=4d%N+yhDp}1Sf+`kHf#SMk(#&E{MqxiI6fs`&<$c;Mn0YoTe(}?gWP1oyMT&Rl1Q> z<~%s)5IBv^A~sGB!)Xk-%2;@aQla7FsN?YOt_j09n!GzaBz)8eKD}nd{qbGo?g;*! z6>;Wm2A6DMJdG3bBtcNP9ZxWJ1RdaKia0rH2oBeQNM)p`Ib<5|`x@~7to|MXfZ-oS zt(07?;Y%85BtoHM{Y00BG?{U1oa#rKv}EBJLD5OEkLdIW=~iENN_`clZXCXz1z8lv z+YjPLJb5|Z?%-iuzO5#Hd!&9sn!$6IVJs`yp+zz3Hx&x3)%tb7$`bMXCtRIU@HDKqO-KdCT_ z6;6#K>#)){PO5#tSn;BERQOPf7A#H99Bk;?5pvwa;$WwK@l%7DN5zked-|RxYyE