From 6db909dce7840307d66e49b03cd6f805d656321a Mon Sep 17 00:00:00 2001 From: Nyemba Ambela Jean Nicolas Date: Sat, 7 Jun 2025 01:49:25 +0100 Subject: [PATCH] design repot Updated --- blog-app/__pycache__/wsgi.cpython-310.pyc | Bin 285 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 472 -> 0 bytes .../blogapp/__pycache__/forms.cpython-310.pyc | Bin 1192 -> 0 bytes .../__pycache__/models.cpython-310.pyc | Bin 1419 -> 0 bytes .../__pycache__/routes.cpython-310.pyc | Bin 1613 -> 0 bytes .../site/python3.10/greenlet/greenlet.h | 164 - .../typing_extensions.cpython-310.pyc | Bin 120440 -> 0 bytes .../site-packages/_distutils_hack/__init__.py | 222 - .../__pycache__/__init__.cpython-310.pyc | Bin 7618 -> 0 bytes .../__pycache__/override.cpython-310.pyc | Bin 265 -> 0 bytes .../site-packages/_distutils_hack/override.py | 1 - .../site-packages/distutils-precedence.pth | 1 - .../INSTALLER | 1 - .../LICENSE.rst | 28 - .../flask_sqlalchemy-3.1.1.dist-info/METADATA | 109 - .../flask_sqlalchemy-3.1.1.dist-info/RECORD | 27 - .../REQUESTED | 0 .../flask_sqlalchemy-3.1.1.dist-info/WHEEL | 4 - .../flask_sqlalchemy/__init__.py | 26 - .../__pycache__/__init__.cpython-310.pyc | Bin 917 -> 0 bytes .../__pycache__/cli.cpython-310.pyc | Bin 930 -> 0 bytes .../__pycache__/extension.cpython-310.pyc | Bin 31838 -> 0 bytes .../__pycache__/model.cpython-310.pyc | Bin 9441 -> 0 bytes .../__pycache__/pagination.cpython-310.pyc | Bin 10589 -> 0 bytes .../__pycache__/query.cpython-310.pyc | Bin 4135 -> 0 bytes .../record_queries.cpython-310.pyc | Bin 3895 -> 0 bytes .../__pycache__/session.cpython-310.pyc | Bin 3508 -> 0 bytes .../__pycache__/table.cpython-310.pyc | Bin 1368 -> 0 bytes .../track_modifications.cpython-310.pyc | Bin 2313 -> 0 bytes .../Lib/site-packages/flask_sqlalchemy/cli.py | 16 - .../flask_sqlalchemy/extension.py | 1008 -- .../site-packages/flask_sqlalchemy/model.py | 330 - .../flask_sqlalchemy/pagination.py | 364 - .../site-packages/flask_sqlalchemy/py.typed | 0 .../site-packages/flask_sqlalchemy/query.py | 105 - .../flask_sqlalchemy/record_queries.py | 117 - .../site-packages/flask_sqlalchemy/session.py | 111 - .../site-packages/flask_sqlalchemy/table.py | 39 - .../flask_sqlalchemy/track_modifications.py | 88 - .../greenlet-3.2.2.dist-info/INSTALLER | 1 - .../greenlet-3.2.2.dist-info/METADATA | 116 - .../greenlet-3.2.2.dist-info/RECORD | 120 - .../greenlet-3.2.2.dist-info/WHEEL | 5 - .../greenlet-3.2.2.dist-info/licenses/LICENSE | 30 - .../licenses/LICENSE.PSF | 47 - .../greenlet-3.2.2.dist-info/top_level.txt | 1 - .../Lib/site-packages/greenlet/CObjects.cpp | 157 - .../Lib/site-packages/greenlet/PyGreenlet.cpp | 738 -- .../Lib/site-packages/greenlet/PyGreenlet.hpp | 35 - .../greenlet/PyGreenletUnswitchable.cpp | 147 - .../Lib/site-packages/greenlet/PyModule.cpp | 292 - .../greenlet/TBrokenGreenlet.cpp | 45 - .../greenlet/TExceptionState.cpp | 62 - .../Lib/site-packages/greenlet/TGreenlet.cpp | 718 -- .../Lib/site-packages/greenlet/TGreenlet.hpp | 820 -- .../greenlet/TGreenletGlobals.cpp | 94 - .../site-packages/greenlet/TMainGreenlet.cpp | 153 - .../site-packages/greenlet/TPythonState.cpp | 402 - .../site-packages/greenlet/TStackState.cpp | 265 - .../site-packages/greenlet/TThreadState.hpp | 497 - .../greenlet/TThreadStateCreator.hpp | 102 - .../greenlet/TThreadStateDestroy.cpp | 217 - .../site-packages/greenlet/TUserGreenlet.cpp | 662 -- .../Lib/site-packages/greenlet/__init__.py | 71 - .../__pycache__/__init__.cpython-310.pyc | Bin 1016 -> 0 bytes .../greenlet/_greenlet.cp310-win_amd64.pyd | Bin 217088 -> 0 bytes .../Lib/site-packages/greenlet/greenlet.cpp | 320 - .../Lib/site-packages/greenlet/greenlet.h | 164 - .../greenlet/greenlet_allocator.hpp | 63 - .../greenlet/greenlet_compiler_compat.hpp | 98 - .../greenlet/greenlet_cpython_compat.hpp | 148 - .../greenlet/greenlet_exceptions.hpp | 171 - .../greenlet/greenlet_internal.hpp | 107 - .../site-packages/greenlet/greenlet_refs.hpp | 1118 --- .../greenlet/greenlet_slp_switch.hpp | 99 - .../greenlet/greenlet_thread_support.hpp | 31 - .../greenlet/platform/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 216 -> 0 bytes .../platform/setup_switch_x64_masm.cmd | 2 - .../greenlet/platform/switch_aarch64_gcc.h | 124 - .../greenlet/platform/switch_alpha_unix.h | 30 - .../greenlet/platform/switch_amd64_unix.h | 87 - .../greenlet/platform/switch_arm32_gcc.h | 79 - .../greenlet/platform/switch_arm32_ios.h | 67 - .../greenlet/platform/switch_arm64_masm.asm | 53 - .../greenlet/platform/switch_arm64_masm.obj | Bin 746 -> 0 bytes .../greenlet/platform/switch_arm64_msvc.h | 17 - .../greenlet/platform/switch_csky_gcc.h | 48 - .../platform/switch_loongarch64_linux.h | 31 - .../greenlet/platform/switch_m68k_gcc.h | 38 - .../greenlet/platform/switch_mips_unix.h | 64 - .../greenlet/platform/switch_ppc64_aix.h | 103 - .../greenlet/platform/switch_ppc64_linux.h | 105 - .../greenlet/platform/switch_ppc_aix.h | 87 - .../greenlet/platform/switch_ppc_linux.h | 84 - .../greenlet/platform/switch_ppc_macosx.h | 82 - .../greenlet/platform/switch_ppc_unix.h | 82 - .../greenlet/platform/switch_riscv_unix.h | 41 - .../greenlet/platform/switch_s390_unix.h | 87 - .../greenlet/platform/switch_sh_gcc.h | 36 - .../greenlet/platform/switch_sparc_sun_gcc.h | 92 - .../greenlet/platform/switch_x32_unix.h | 63 - .../greenlet/platform/switch_x64_masm.asm | 111 - .../greenlet/platform/switch_x64_masm.obj | Bin 1078 -> 0 bytes .../greenlet/platform/switch_x64_msvc.h | 60 - .../greenlet/platform/switch_x86_msvc.h | 326 - .../greenlet/platform/switch_x86_unix.h | 105 - .../greenlet/slp_platformselect.h | 75 - .../site-packages/greenlet/tests/__init__.py | 240 - .../__pycache__/__init__.cpython-310.pyc | Bin 5882 -> 0 bytes ...fail_clearing_run_switches.cpython-310.pyc | Bin 1541 -> 0 bytes .../fail_cpp_exception.cpython-310.pyc | Bin 1203 -> 0 bytes ...nitialstub_already_started.cpython-310.pyc | Bin 2054 -> 0 bytes .../fail_slp_switch.cpython-310.pyc | Bin 776 -> 0 bytes ...ail_switch_three_greenlets.cpython-310.pyc | Bin 1166 -> 0 bytes ...il_switch_three_greenlets2.cpython-310.pyc | Bin 1541 -> 0 bytes .../fail_switch_two_greenlets.cpython-310.pyc | Bin 1185 -> 0 bytes .../__pycache__/leakcheck.cpython-310.pyc | Bin 7415 -> 0 bytes .../test_contextvars.cpython-310.pyc | Bin 8068 -> 0 bytes .../__pycache__/test_cpp.cpython-310.pyc | Bin 2798 -> 0 bytes .../test_extension_interface.cpython-310.pyc | Bin 4687 -> 0 bytes .../tests/__pycache__/test_gc.cpython-310.pyc | Bin 3172 -> 0 bytes .../test_generator.cpython-310.pyc | Bin 2294 -> 0 bytes .../test_generator_nested.cpython-310.pyc | Bin 5450 -> 0 bytes .../__pycache__/test_greenlet.cpython-310.pyc | Bin 46574 -> 0 bytes .../test_greenlet_trash.cpython-310.pyc | Bin 4919 -> 0 bytes .../__pycache__/test_leaks.cpython-310.pyc | Bin 11372 -> 0 bytes .../test_stack_saved.cpython-310.pyc | Bin 898 -> 0 bytes .../__pycache__/test_throw.cpython-310.pyc | Bin 4080 -> 0 bytes .../__pycache__/test_tracing.cpython-310.pyc | Bin 9515 -> 0 bytes .../__pycache__/test_version.cpython-310.pyc | Bin 1593 -> 0 bytes .../__pycache__/test_weakref.cpython-310.pyc | Bin 1886 -> 0 bytes .../greenlet/tests/_test_extension.c | 231 - .../tests/_test_extension.cp310-win_amd64.pyd | Bin 14336 -> 0 bytes .../_test_extension_cpp.cp310-win_amd64.pyd | Bin 15872 -> 0 bytes .../greenlet/tests/_test_extension_cpp.cpp | 226 - .../tests/fail_clearing_run_switches.py | 47 - .../greenlet/tests/fail_cpp_exception.py | 33 - .../tests/fail_initialstub_already_started.py | 78 - .../greenlet/tests/fail_slp_switch.py | 29 - .../tests/fail_switch_three_greenlets.py | 44 - .../tests/fail_switch_three_greenlets2.py | 55 - .../tests/fail_switch_two_greenlets.py | 41 - .../site-packages/greenlet/tests/leakcheck.py | 319 - .../greenlet/tests/test_contextvars.py | 312 - .../site-packages/greenlet/tests/test_cpp.py | 73 - .../tests/test_extension_interface.py | 115 - .../site-packages/greenlet/tests/test_gc.py | 86 - .../greenlet/tests/test_generator.py | 59 - .../greenlet/tests/test_generator_nested.py | 168 - .../greenlet/tests/test_greenlet.py | 1327 --- .../greenlet/tests/test_greenlet_trash.py | 187 - .../greenlet/tests/test_leaks.py | 447 - .../greenlet/tests/test_stack_saved.py | 19 - .../greenlet/tests/test_throw.py | 128 - .../greenlet/tests/test_tracing.py | 291 - .../greenlet/tests/test_version.py | 41 - .../greenlet/tests/test_weakref.py | 35 - .../packaging-25.0.dist-info/INSTALLER | 1 - .../packaging-25.0.dist-info/METADATA | 105 - .../packaging-25.0.dist-info/RECORD | 40 - .../packaging-25.0.dist-info/WHEEL | 4 - .../packaging-25.0.dist-info/licenses/LICENSE | 3 - .../licenses/LICENSE.APACHE | 177 - .../licenses/LICENSE.BSD | 23 - .../Lib/site-packages/packaging/__init__.py | 15 - .../__pycache__/__init__.cpython-310.pyc | Bin 538 -> 0 bytes .../__pycache__/_elffile.cpython-310.pyc | Bin 3409 -> 0 bytes .../__pycache__/_manylinux.cpython-310.pyc | Bin 6599 -> 0 bytes .../__pycache__/_musllinux.cpython-310.pyc | Bin 3462 -> 0 bytes .../__pycache__/_parser.cpython-310.pyc | Bin 9278 -> 0 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 2720 -> 0 bytes .../__pycache__/_tokenizer.cpython-310.pyc | Bin 5969 -> 0 bytes .../__pycache__/markers.cpython-310.pyc | Bin 8830 -> 0 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 18763 -> 0 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 2932 -> 0 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 31406 -> 0 bytes .../__pycache__/tags.cpython-310.pyc | Bin 16481 -> 0 bytes .../__pycache__/utils.cpython-310.pyc | Bin 4666 -> 0 bytes .../__pycache__/version.cpython-310.pyc | Bin 15055 -> 0 bytes .../Lib/site-packages/packaging/_elffile.py | 109 - .../Lib/site-packages/packaging/_manylinux.py | 262 - .../Lib/site-packages/packaging/_musllinux.py | 85 - .../Lib/site-packages/packaging/_parser.py | 353 - .../site-packages/packaging/_structures.py | 61 - .../Lib/site-packages/packaging/_tokenizer.py | 195 - .../packaging/licenses/__init__.py | 145 - .../__pycache__/__init__.cpython-310.pyc | Bin 2625 -> 0 bytes .../__pycache__/_spdx.cpython-310.pyc | Bin 40997 -> 0 bytes .../site-packages/packaging/licenses/_spdx.py | 759 -- .../Lib/site-packages/packaging/markers.py | 362 - .../Lib/site-packages/packaging/metadata.py | 862 -- .../venv/Lib/site-packages/packaging/py.typed | 0 .../site-packages/packaging/requirements.py | 91 - .../Lib/site-packages/packaging/specifiers.py | 1019 -- .../venv/Lib/site-packages/packaging/tags.py | 656 -- .../venv/Lib/site-packages/packaging/utils.py | 163 - .../Lib/site-packages/packaging/version.py | 582 -- .../pip-25.1.1.dist-info/INSTALLER | 1 - .../pip-25.1.1.dist-info/METADATA | 90 - .../site-packages/pip-25.1.1.dist-info/RECORD | 856 -- .../pip-25.1.1.dist-info/REQUESTED | 0 .../site-packages/pip-25.1.1.dist-info/WHEEL | 5 - .../pip-25.1.1.dist-info/entry_points.txt | 3 - .../pip-25.1.1.dist-info/licenses/AUTHORS.txt | 821 -- .../pip-25.1.1.dist-info/licenses/LICENSE.txt | 20 - .../pip-25.1.1.dist-info/top_level.txt | 1 - .../venv/Lib/site-packages/pip/__init__.py | 13 - .../venv/Lib/site-packages/pip/__main__.py | 24 - .../Lib/site-packages/pip/__pip-runner__.py | 50 - .../pip/__pycache__/__init__.cpython-310.pyc | Bin 658 -> 0 bytes .../pip/__pycache__/__main__.cpython-310.pyc | Bin 492 -> 0 bytes .../__pip-runner__.cpython-310.pyc | Bin 1656 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 18 - .../__pycache__/__init__.cpython-310.pyc | Bin 720 -> 0 bytes .../__pycache__/build_env.cpython-310.pyc | Bin 9937 -> 0 bytes .../__pycache__/cache.cpython-310.pyc | Bin 9070 -> 0 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 11673 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 30122 -> 0 bytes .../__pycache__/main.cpython-310.pyc | Bin 644 -> 0 bytes .../__pycache__/pyproject.cpython-310.pyc | Bin 3787 -> 0 bytes .../self_outdated_check.cpython-310.pyc | Bin 6890 -> 0 bytes .../__pycache__/wheel_builder.cpython-310.pyc | Bin 8387 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 325 - .../Lib/site-packages/pip/_internal/cache.py | 289 - .../pip/_internal/cli/__init__.py | 3 - .../cli/__pycache__/__init__.cpython-310.pyc | Bin 298 -> 0 bytes .../autocompletion.cpython-310.pyc | Bin 5475 -> 0 bytes .../__pycache__/base_command.cpython-310.pyc | Bin 6363 -> 0 bytes .../__pycache__/cmdoptions.cpython-310.pyc | Bin 24975 -> 0 bytes .../command_context.cpython-310.pyc | Bin 1339 -> 0 bytes .../__pycache__/index_command.cpython-310.pyc | Bin 5037 -> 0 bytes .../cli/__pycache__/main.cpython-310.pyc | Bin 1532 -> 0 bytes .../__pycache__/main_parser.cpython-310.pyc | Bin 3021 -> 0 bytes .../cli/__pycache__/parser.cpython-310.pyc | Bin 10004 -> 0 bytes .../__pycache__/progress_bars.cpython-310.pyc | Bin 3887 -> 0 bytes .../__pycache__/req_command.cpython-310.pyc | Bin 9009 -> 0 bytes .../cli/__pycache__/spinners.cpython-310.pyc | Bin 4989 -> 0 bytes .../__pycache__/status_codes.cpython-310.pyc | Bin 378 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 175 - .../pip/_internal/cli/base_command.py | 233 - .../pip/_internal/cli/cmdoptions.py | 1133 --- .../pip/_internal/cli/command_context.py | 27 - .../pip/_internal/cli/index_command.py | 173 - .../site-packages/pip/_internal/cli/main.py | 79 - .../pip/_internal/cli/main_parser.py | 133 - .../site-packages/pip/_internal/cli/parser.py | 294 - .../pip/_internal/cli/progress_bars.py | 144 - .../pip/_internal/cli/req_command.py | 347 - .../pip/_internal/cli/spinners.py | 159 - .../pip/_internal/cli/status_codes.py | 6 - .../pip/_internal/commands/__init__.py | 137 - .../__pycache__/__init__.cpython-310.pyc | Bin 3377 -> 0 bytes .../__pycache__/cache.cpython-310.pyc | Bin 6571 -> 0 bytes .../__pycache__/check.cpython-310.pyc | Bin 1998 -> 0 bytes .../__pycache__/completion.cpython-310.pyc | Bin 4612 -> 0 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 8962 -> 0 bytes .../__pycache__/debug.cpython-310.pyc | Bin 6925 -> 0 bytes .../__pycache__/download.cpython-310.pyc | Bin 4225 -> 0 bytes .../__pycache__/freeze.cpython-310.pyc | Bin 2982 -> 0 bytes .../commands/__pycache__/hash.cpython-310.pyc | Bin 2175 -> 0 bytes .../commands/__pycache__/help.cpython-310.pyc | Bin 1336 -> 0 bytes .../__pycache__/index.cpython-310.pyc | Bin 4679 -> 0 bytes .../__pycache__/inspect.cpython-310.pyc | Bin 2997 -> 0 bytes .../__pycache__/install.cpython-310.pyc | Bin 18125 -> 0 bytes .../commands/__pycache__/list.cpython-310.pyc | Bin 11302 -> 0 bytes .../commands/__pycache__/lock.cpython-310.pyc | Bin 4631 -> 0 bytes .../__pycache__/search.cpython-310.pyc | Bin 5529 -> 0 bytes .../commands/__pycache__/show.cpython-310.pyc | Bin 7440 -> 0 bytes .../__pycache__/uninstall.cpython-310.pyc | Bin 3359 -> 0 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 4898 -> 0 bytes .../pip/_internal/commands/cache.py | 228 - .../pip/_internal/commands/check.py | 67 - .../pip/_internal/commands/completion.py | 136 - .../pip/_internal/commands/configuration.py | 280 - .../pip/_internal/commands/debug.py | 201 - .../pip/_internal/commands/download.py | 146 - .../pip/_internal/commands/freeze.py | 108 - .../pip/_internal/commands/hash.py | 59 - .../pip/_internal/commands/help.py | 41 - .../pip/_internal/commands/index.py | 153 - .../pip/_internal/commands/inspect.py | 92 - .../pip/_internal/commands/install.py | 793 -- .../pip/_internal/commands/list.py | 391 - .../pip/_internal/commands/lock.py | 171 - .../pip/_internal/commands/search.py | 176 - .../pip/_internal/commands/show.py | 228 - .../pip/_internal/commands/uninstall.py | 114 - .../pip/_internal/commands/wheel.py | 182 - .../pip/_internal/configuration.py | 383 - .../pip/_internal/distributions/__init__.py | 21 - .../__pycache__/__init__.cpython-310.pyc | Bin 826 -> 0 bytes .../__pycache__/base.cpython-310.pyc | Bin 2538 -> 0 bytes .../__pycache__/installed.cpython-310.pyc | Bin 1510 -> 0 bytes .../__pycache__/sdist.cpython-310.pyc | Bin 5343 -> 0 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 1905 -> 0 bytes .../pip/_internal/distributions/base.py | 53 - .../pip/_internal/distributions/installed.py | 29 - .../pip/_internal/distributions/sdist.py | 158 - .../pip/_internal/distributions/wheel.py | 42 - .../site-packages/pip/_internal/exceptions.py | 862 -- .../pip/_internal/index/__init__.py | 1 - .../__pycache__/__init__.cpython-310.pyc | Bin 252 -> 0 bytes .../__pycache__/collector.cpython-310.pyc | Bin 15134 -> 0 bytes .../package_finder.cpython-310.pyc | Bin 29647 -> 0 bytes .../index/__pycache__/sources.cpython-310.pyc | Bin 8905 -> 0 bytes .../pip/_internal/index/collector.py | 494 - .../pip/_internal/index/package_finder.py | 1050 -- .../pip/_internal/index/sources.py | 284 - .../pip/_internal/locations/__init__.py | 439 - .../__pycache__/__init__.cpython-310.pyc | Bin 10498 -> 0 bytes .../__pycache__/_distutils.cpython-310.pyc | Bin 4589 -> 0 bytes .../__pycache__/_sysconfig.cpython-310.pyc | Bin 6036 -> 0 bytes .../__pycache__/base.cpython-310.pyc | Bin 2423 -> 0 bytes .../pip/_internal/locations/_distutils.py | 172 - .../pip/_internal/locations/_sysconfig.py | 214 - .../pip/_internal/locations/base.py | 81 - .../Lib/site-packages/pip/_internal/main.py | 12 - .../pip/_internal/metadata/__init__.py | 162 - .../__pycache__/__init__.cpython-310.pyc | Bin 5459 -> 0 bytes .../__pycache__/_json.cpython-310.pyc | Bin 2279 -> 0 bytes .../metadata/__pycache__/base.cpython-310.pyc | Bin 26932 -> 0 bytes .../__pycache__/pkg_resources.cpython-310.pyc | Bin 11015 -> 0 bytes .../pip/_internal/metadata/_json.py | 86 - .../pip/_internal/metadata/base.py | 690 -- .../_internal/metadata/importlib/__init__.py | 6 - .../__pycache__/__init__.cpython-310.pyc | Bin 374 -> 0 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 3523 -> 0 bytes .../__pycache__/_dists.cpython-310.pyc | Bin 8879 -> 0 bytes .../__pycache__/_envs.cpython-310.pyc | Bin 5780 -> 0 bytes .../_internal/metadata/importlib/_compat.py | 85 - .../_internal/metadata/importlib/_dists.py | 228 - .../pip/_internal/metadata/importlib/_envs.py | 140 - .../pip/_internal/metadata/pkg_resources.py | 301 - .../pip/_internal/models/__init__.py | 1 - .../__pycache__/__init__.cpython-310.pyc | Bin 286 -> 0 bytes .../__pycache__/candidate.cpython-310.pyc | Bin 1259 -> 0 bytes .../__pycache__/direct_url.cpython-310.pyc | Bin 7427 -> 0 bytes .../format_control.cpython-310.pyc | Bin 2758 -> 0 bytes .../models/__pycache__/index.cpython-310.pyc | Bin 1256 -> 0 bytes .../installation_report.cpython-310.pyc | Bin 1777 -> 0 bytes .../models/__pycache__/link.cpython-310.pyc | Bin 18826 -> 0 bytes .../models/__pycache__/pylock.cpython-310.pyc | Bin 5175 -> 0 bytes .../models/__pycache__/scheme.cpython-310.pyc | Bin 958 -> 0 bytes .../__pycache__/search_scope.cpython-310.pyc | Bin 3496 -> 0 bytes .../selection_prefs.cpython-310.pyc | Bin 1717 -> 0 bytes .../__pycache__/target_python.cpython-310.pyc | Bin 3838 -> 0 bytes .../models/__pycache__/wheel.cpython-310.pyc | Bin 5526 -> 0 bytes .../pip/_internal/models/candidate.py | 25 - .../pip/_internal/models/direct_url.py | 224 - .../pip/_internal/models/format_control.py | 78 - .../pip/_internal/models/index.py | 28 - .../_internal/models/installation_report.py | 56 - .../pip/_internal/models/link.py | 608 -- .../pip/_internal/models/pylock.py | 183 - .../pip/_internal/models/scheme.py | 25 - .../pip/_internal/models/search_scope.py | 127 - .../pip/_internal/models/selection_prefs.py | 53 - .../pip/_internal/models/target_python.py | 121 - .../pip/_internal/models/wheel.py | 139 - .../pip/_internal/network/__init__.py | 1 - .../__pycache__/__init__.cpython-310.pyc | Bin 274 -> 0 bytes .../network/__pycache__/auth.cpython-310.pyc | Bin 14534 -> 0 bytes .../network/__pycache__/cache.cpython-310.pyc | Bin 4824 -> 0 bytes .../__pycache__/download.cpython-310.pyc | Bin 8502 -> 0 bytes .../__pycache__/lazy_wheel.cpython-310.pyc | Bin 8443 -> 0 bytes .../__pycache__/session.cpython-310.pyc | Bin 12623 -> 0 bytes .../network/__pycache__/utils.cpython-310.pyc | Bin 1481 -> 0 bytes .../__pycache__/xmlrpc.cpython-310.pyc | Bin 2130 -> 0 bytes .../pip/_internal/network/auth.py | 566 -- .../pip/_internal/network/cache.py | 117 - .../pip/_internal/network/download.py | 314 - .../pip/_internal/network/lazy_wheel.py | 210 - .../pip/_internal/network/session.py | 523 - .../pip/_internal/network/utils.py | 98 - .../pip/_internal/network/xmlrpc.py | 61 - .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 223 -> 0 bytes .../__pycache__/check.cpython-310.pyc | Bin 4839 -> 0 bytes .../__pycache__/freeze.cpython-310.pyc | Bin 6366 -> 0 bytes .../__pycache__/prepare.cpython-310.pyc | Bin 15844 -> 0 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 229 -> 0 bytes .../__pycache__/build_tracker.cpython-310.pyc | Bin 5001 -> 0 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 1461 -> 0 bytes .../metadata_editable.cpython-310.pyc | Bin 1509 -> 0 bytes .../metadata_legacy.cpython-310.pyc | Bin 2390 -> 0 bytes .../build/__pycache__/wheel.cpython-310.pyc | Bin 1252 -> 0 bytes .../wheel_editable.cpython-310.pyc | Bin 1476 -> 0 bytes .../__pycache__/wheel_legacy.cpython-310.pyc | Bin 3215 -> 0 bytes .../operations/build/build_tracker.py | 138 - .../_internal/operations/build/metadata.py | 38 - .../operations/build/metadata_editable.py | 41 - .../operations/build/metadata_legacy.py | 73 - .../pip/_internal/operations/build/wheel.py | 37 - .../operations/build/wheel_editable.py | 46 - .../operations/build/wheel_legacy.py | 118 - .../pip/_internal/operations/check.py | 180 - .../pip/_internal/operations/freeze.py | 256 - .../_internal/operations/install/__init__.py | 1 - .../__pycache__/__init__.cpython-310.pyc | Bin 286 -> 0 bytes .../editable_legacy.cpython-310.pyc | Bin 1515 -> 0 bytes .../install/__pycache__/wheel.cpython-310.pyc | Bin 21473 -> 0 bytes .../operations/install/editable_legacy.py | 46 - .../pip/_internal/operations/install/wheel.py | 738 -- .../pip/_internal/operations/prepare.py | 737 -- .../site-packages/pip/_internal/pyproject.py | 185 - .../pip/_internal/req/__init__.py | 103 - .../req/__pycache__/__init__.cpython-310.pyc | Bin 2666 -> 0 bytes .../__pycache__/constructors.cpython-310.pyc | Bin 13993 -> 0 bytes .../req_dependency_group.cpython-310.pyc | Bin 2991 -> 0 bytes .../req/__pycache__/req_file.cpython-310.pyc | Bin 15478 -> 0 bytes .../__pycache__/req_install.cpython-310.pyc | Bin 24869 -> 0 bytes .../req/__pycache__/req_set.cpython-310.pyc | Bin 3938 -> 0 bytes .../__pycache__/req_uninstall.cpython-310.pyc | Bin 18783 -> 0 bytes .../pip/_internal/req/constructors.py | 560 -- .../pip/_internal/req/req_dependency_group.py | 79 - .../pip/_internal/req/req_file.py | 623 -- .../pip/_internal/req/req_install.py | 934 -- .../pip/_internal/req/req_set.py | 82 - .../pip/_internal/req/req_uninstall.py | 636 -- .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 223 -> 0 bytes .../__pycache__/base.cpython-310.pyc | Bin 1075 -> 0 bytes .../pip/_internal/resolution/base.py | 20 - .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 230 -> 0 bytes .../__pycache__/resolver.cpython-310.pyc | Bin 15046 -> 0 bytes .../_internal/resolution/legacy/resolver.py | 597 -- .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 234 -> 0 bytes .../__pycache__/base.cpython-310.pyc | Bin 6126 -> 0 bytes .../__pycache__/candidates.cpython-310.pyc | Bin 19639 -> 0 bytes .../__pycache__/factory.cpython-310.pyc | Bin 21714 -> 0 bytes .../found_candidates.cpython-310.pyc | Bin 5183 -> 0 bytes .../__pycache__/provider.cpython-310.pyc | Bin 8820 -> 0 bytes .../__pycache__/reporter.cpython-310.pyc | Bin 3875 -> 0 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 10467 -> 0 bytes .../__pycache__/resolver.cpython-310.pyc | Bin 8910 -> 0 bytes .../_internal/resolution/resolvelib/base.py | 139 - .../resolution/resolvelib/candidates.py | 579 -- .../resolution/resolvelib/factory.py | 823 -- .../resolution/resolvelib/found_candidates.py | 164 - .../resolution/resolvelib/provider.py | 281 - .../resolution/resolvelib/reporter.py | 83 - .../resolution/resolvelib/requirements.py | 245 - .../resolution/resolvelib/resolver.py | 320 - .../pip/_internal/self_outdated_check.py | 252 - .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 218 -> 0 bytes .../__pycache__/_jaraco_text.cpython-310.pyc | Bin 3873 -> 0 bytes .../utils/__pycache__/_log.cpython-310.pyc | Bin 1546 -> 0 bytes .../utils/__pycache__/appdirs.cpython-310.pyc | Bin 1656 -> 0 bytes .../utils/__pycache__/compat.cpython-310.pyc | Bin 1989 -> 0 bytes .../compatibility_tags.cpython-310.pyc | Bin 4805 -> 0 bytes .../__pycache__/datetime.cpython-310.pyc | Bin 540 -> 0 bytes .../__pycache__/deprecation.cpython-310.pyc | Bin 3343 -> 0 bytes .../direct_url_helpers.cpython-310.pyc | Bin 2103 -> 0 bytes .../__pycache__/egg_link.cpython-310.pyc | Bin 2439 -> 0 bytes .../__pycache__/entrypoints.cpython-310.pyc | Bin 2748 -> 0 bytes .../__pycache__/filesystem.cpython-310.pyc | Bin 4434 -> 0 bytes .../__pycache__/filetypes.cpython-310.pyc | Bin 967 -> 0 bytes .../utils/__pycache__/glibc.cpython-310.pyc | Bin 1778 -> 0 bytes .../utils/__pycache__/hashes.cpython-310.pyc | Bin 5647 -> 0 bytes .../utils/__pycache__/logging.cpython-310.pyc | Bin 10159 -> 0 bytes .../utils/__pycache__/misc.cpython-310.pyc | Bin 22894 -> 0 bytes .../__pycache__/packaging.cpython-310.pyc | Bin 1528 -> 0 bytes .../utils/__pycache__/retry.cpython-310.pyc | Bin 1646 -> 0 bytes .../setuptools_build.cpython-310.pyc | Bin 3889 -> 0 bytes .../__pycache__/subprocess.cpython-310.pyc | Bin 5754 -> 0 bytes .../__pycache__/temp_dir.cpython-310.pyc | Bin 8349 -> 0 bytes .../__pycache__/unpacking.cpython-310.pyc | Bin 8095 -> 0 bytes .../utils/__pycache__/urls.cpython-310.pyc | Bin 1397 -> 0 bytes .../__pycache__/virtualenv.cpython-310.pyc | Bin 3314 -> 0 bytes .../utils/__pycache__/wheel.cpython-310.pyc | Bin 4416 -> 0 bytes .../pip/_internal/utils/_jaraco_text.py | 109 - .../site-packages/pip/_internal/utils/_log.py | 38 - .../pip/_internal/utils/appdirs.py | 53 - .../pip/_internal/utils/compat.py | 79 - .../pip/_internal/utils/compatibility_tags.py | 200 - .../pip/_internal/utils/datetime.py | 10 - .../pip/_internal/utils/deprecation.py | 124 - .../pip/_internal/utils/direct_url_helpers.py | 87 - .../pip/_internal/utils/egg_link.py | 80 - .../pip/_internal/utils/entrypoints.py | 87 - .../pip/_internal/utils/filesystem.py | 149 - .../pip/_internal/utils/filetypes.py | 26 - .../pip/_internal/utils/glibc.py | 101 - .../pip/_internal/utils/hashes.py | 147 - .../pip/_internal/utils/logging.py | 361 - .../site-packages/pip/_internal/utils/misc.py | 773 -- .../pip/_internal/utils/packaging.py | 43 - .../pip/_internal/utils/retry.py | 42 - .../pip/_internal/utils/setuptools_build.py | 147 - .../pip/_internal/utils/subprocess.py | 245 - .../pip/_internal/utils/temp_dir.py | 296 - .../pip/_internal/utils/unpacking.py | 335 - .../site-packages/pip/_internal/utils/urls.py | 55 - .../pip/_internal/utils/virtualenv.py | 104 - .../pip/_internal/utils/wheel.py | 133 - .../pip/_internal/vcs/__init__.py | 15 - .../vcs/__pycache__/__init__.cpython-310.pyc | Bin 541 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-310.pyc | Bin 3538 -> 0 bytes .../vcs/__pycache__/git.cpython-310.pyc | Bin 12844 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-310.pyc | Bin 5101 -> 0 bytes .../__pycache__/subversion.cpython-310.pyc | Bin 8501 -> 0 bytes .../versioncontrol.cpython-310.pyc | Bin 21008 -> 0 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 - .../site-packages/pip/_internal/vcs/git.py | 536 - .../pip/_internal/vcs/mercurial.py | 163 - .../pip/_internal/vcs/subversion.py | 324 - .../pip/_internal/vcs/versioncontrol.py | 688 -- .../pip/_internal/wheel_builder.py | 332 - .../Lib/site-packages/pip/_vendor/__init__.py | 117 - .../__pycache__/__init__.cpython-310.pyc | Bin 3116 -> 0 bytes .../typing_extensions.cpython-310.pyc | Bin 120500 -> 0 bytes .../pip/_vendor/cachecontrol/__init__.py | 29 - .../__pycache__/__init__.cpython-310.pyc | Bin 789 -> 0 bytes .../__pycache__/_cmd.cpython-310.pyc | Bin 1858 -> 0 bytes .../__pycache__/adapter.cpython-310.pyc | Bin 4543 -> 0 bytes .../__pycache__/cache.cpython-310.pyc | Bin 3302 -> 0 bytes .../__pycache__/controller.cpython-310.pyc | Bin 10356 -> 0 bytes .../__pycache__/filewrapper.cpython-310.pyc | Bin 3242 -> 0 bytes .../__pycache__/heuristics.cpython-310.pyc | Bin 5423 -> 0 bytes .../__pycache__/serialize.cpython-310.pyc | Bin 3376 -> 0 bytes .../__pycache__/wrapper.cpython-310.pyc | Bin 1493 -> 0 bytes .../pip/_vendor/cachecontrol/_cmd.py | 70 - .../pip/_vendor/cachecontrol/adapter.py | 168 - .../pip/_vendor/cachecontrol/cache.py | 75 - .../_vendor/cachecontrol/caches/__init__.py | 8 - .../__pycache__/__init__.cpython-310.pyc | Bin 452 -> 0 bytes .../__pycache__/file_cache.cpython-310.pyc | Bin 5261 -> 0 bytes .../__pycache__/redis_cache.cpython-310.pyc | Bin 2067 -> 0 bytes .../_vendor/cachecontrol/caches/file_cache.py | 145 - .../cachecontrol/caches/redis_cache.py | 48 - .../pip/_vendor/cachecontrol/controller.py | 511 - .../pip/_vendor/cachecontrol/filewrapper.py | 119 - .../pip/_vendor/cachecontrol/heuristics.py | 157 - .../pip/_vendor/cachecontrol/py.typed | 0 .../pip/_vendor/cachecontrol/serialize.py | 146 - .../pip/_vendor/cachecontrol/wrapper.py | 43 - .../pip/_vendor/certifi/__init__.py | 4 - .../pip/_vendor/certifi/__main__.py | 12 - .../__pycache__/__init__.cpython-310.pyc | Bin 331 -> 0 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 481 -> 0 bytes .../certifi/__pycache__/core.cpython-310.pyc | Bin 2174 -> 0 bytes .../pip/_vendor/certifi/cacert.pem | 4897 ---------- .../site-packages/pip/_vendor/certifi/core.py | 114 - .../pip/_vendor/certifi/py.typed | 0 .../pip/_vendor/dependency_groups/__init__.py | 13 - .../pip/_vendor/dependency_groups/__main__.py | 65 - .../__pycache__/__init__.cpython-310.pyc | Bin 389 -> 0 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 1748 -> 0 bytes .../_implementation.cpython-310.pyc | Bin 6946 -> 0 bytes .../_lint_dependency_groups.cpython-310.pyc | Bin 1865 -> 0 bytes .../__pycache__/_pip_wrapper.cpython-310.pyc | Bin 2255 -> 0 bytes .../__pycache__/_toml_compat.cpython-310.pyc | Bin 436 -> 0 bytes .../dependency_groups/_implementation.py | 209 - .../_lint_dependency_groups.py | 59 - .../_vendor/dependency_groups/_pip_wrapper.py | 62 - .../_vendor/dependency_groups/_toml_compat.py | 9 - .../pip/_vendor/dependency_groups/py.typed | 0 .../pip/_vendor/distlib/__init__.py | 33 - .../__pycache__/__init__.cpython-310.pyc | Bin 1089 -> 0 bytes .../__pycache__/compat.cpython-310.pyc | Bin 31462 -> 0 bytes .../__pycache__/database.cpython-310.pyc | Bin 43099 -> 0 bytes .../distlib/__pycache__/index.cpython-310.pyc | Bin 17326 -> 0 bytes .../__pycache__/locators.cpython-310.pyc | Bin 38277 -> 0 bytes .../__pycache__/manifest.cpython-310.pyc | Bin 10254 -> 0 bytes .../__pycache__/markers.cpython-310.pyc | Bin 5324 -> 0 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 26953 -> 0 bytes .../__pycache__/resources.cpython-310.pyc | Bin 11063 -> 0 bytes .../__pycache__/scripts.cpython-310.pyc | Bin 11692 -> 0 bytes .../distlib/__pycache__/util.cpython-310.pyc | Bin 52100 -> 0 bytes .../__pycache__/version.cpython-310.pyc | Bin 20308 -> 0 bytes .../distlib/__pycache__/wheel.cpython-310.pyc | Bin 28509 -> 0 bytes .../pip/_vendor/distlib/compat.py | 1137 --- .../pip/_vendor/distlib/database.py | 1329 --- .../pip/_vendor/distlib/index.py | 508 - .../pip/_vendor/distlib/locators.py | 1295 --- .../pip/_vendor/distlib/manifest.py | 384 - .../pip/_vendor/distlib/markers.py | 162 - .../pip/_vendor/distlib/metadata.py | 1031 -- .../pip/_vendor/distlib/resources.py | 358 - .../pip/_vendor/distlib/scripts.py | 447 - .../site-packages/pip/_vendor/distlib/t32.exe | Bin 97792 -> 0 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 182784 -> 0 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 108032 -> 0 bytes .../site-packages/pip/_vendor/distlib/util.py | 1984 ---- .../pip/_vendor/distlib/version.py | 750 -- .../site-packages/pip/_vendor/distlib/w32.exe | Bin 91648 -> 0 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 168448 -> 0 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 101888 -> 0 bytes .../pip/_vendor/distlib/wheel.py | 1100 --- .../pip/_vendor/distro/__init__.py | 54 - .../pip/_vendor/distro/__main__.py | 4 - .../__pycache__/__init__.cpython-310.pyc | Bin 942 -> 0 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 296 -> 0 bytes .../distro/__pycache__/distro.cpython-310.pyc | Bin 42181 -> 0 bytes .../pip/_vendor/distro/distro.py | 1403 --- .../site-packages/pip/_vendor/distro/py.typed | 0 .../pip/_vendor/idna/__init__.py | 45 - .../idna/__pycache__/__init__.cpython-310.pyc | Bin 879 -> 0 bytes .../idna/__pycache__/codec.cpython-310.pyc | Bin 3300 -> 0 bytes .../idna/__pycache__/compat.cpython-310.pyc | Bin 782 -> 0 bytes .../idna/__pycache__/core.cpython-310.pyc | Bin 9734 -> 0 bytes .../idna/__pycache__/idnadata.cpython-310.pyc | Bin 194475 -> 0 bytes .../__pycache__/intranges.cpython-310.pyc | Bin 2011 -> 0 bytes .../__pycache__/package_data.cpython-310.pyc | Bin 239 -> 0 bytes .../__pycache__/uts46data.cpython-310.pyc | Bin 152403 -> 0 bytes .../site-packages/pip/_vendor/idna/codec.py | 122 - .../site-packages/pip/_vendor/idna/compat.py | 15 - .../site-packages/pip/_vendor/idna/core.py | 437 - .../pip/_vendor/idna/idnadata.py | 4243 -------- .../pip/_vendor/idna/intranges.py | 57 - .../pip/_vendor/idna/package_data.py | 1 - .../site-packages/pip/_vendor/idna/py.typed | 0 .../pip/_vendor/idna/uts46data.py | 8681 ----------------- .../pip/_vendor/msgpack/__init__.py | 55 - .../__pycache__/__init__.cpython-310.pyc | Bin 1424 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 1835 -> 0 bytes .../msgpack/__pycache__/ext.cpython-310.pyc | Bin 6116 -> 0 bytes .../__pycache__/fallback.cpython-310.pyc | Bin 23798 -> 0 bytes .../pip/_vendor/msgpack/exceptions.py | 48 - .../site-packages/pip/_vendor/msgpack/ext.py | 170 - .../pip/_vendor/msgpack/fallback.py | 929 -- .../pip/_vendor/packaging/__init__.py | 15 - .../__pycache__/__init__.cpython-310.pyc | Bin 550 -> 0 bytes .../__pycache__/_elffile.cpython-310.pyc | Bin 3421 -> 0 bytes .../__pycache__/_manylinux.cpython-310.pyc | Bin 6611 -> 0 bytes .../__pycache__/_musllinux.cpython-310.pyc | Bin 3474 -> 0 bytes .../__pycache__/_parser.cpython-310.pyc | Bin 9290 -> 0 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 2732 -> 0 bytes .../__pycache__/_tokenizer.cpython-310.pyc | Bin 5981 -> 0 bytes .../__pycache__/markers.cpython-310.pyc | Bin 8842 -> 0 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 18775 -> 0 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 2944 -> 0 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 31442 -> 0 bytes .../__pycache__/tags.cpython-310.pyc | Bin 16493 -> 0 bytes .../__pycache__/utils.cpython-310.pyc | Bin 4678 -> 0 bytes .../__pycache__/version.cpython-310.pyc | Bin 15079 -> 0 bytes .../pip/_vendor/packaging/_elffile.py | 109 - .../pip/_vendor/packaging/_manylinux.py | 262 - .../pip/_vendor/packaging/_musllinux.py | 85 - .../pip/_vendor/packaging/_parser.py | 353 - .../pip/_vendor/packaging/_structures.py | 61 - .../pip/_vendor/packaging/_tokenizer.py | 195 - .../_vendor/packaging/licenses/__init__.py | 145 - .../__pycache__/__init__.cpython-310.pyc | Bin 2649 -> 0 bytes .../__pycache__/_spdx.cpython-310.pyc | Bin 41009 -> 0 bytes .../pip/_vendor/packaging/licenses/_spdx.py | 759 -- .../pip/_vendor/packaging/markers.py | 362 - .../pip/_vendor/packaging/metadata.py | 862 -- .../pip/_vendor/packaging/py.typed | 0 .../pip/_vendor/packaging/requirements.py | 91 - .../pip/_vendor/packaging/specifiers.py | 1019 -- .../pip/_vendor/packaging/tags.py | 656 -- .../pip/_vendor/packaging/utils.py | 163 - .../pip/_vendor/packaging/version.py | 582 -- .../pip/_vendor/pkg_resources/__init__.py | 3676 ------- .../__pycache__/__init__.cpython-310.pyc | Bin 113991 -> 0 bytes .../pip/_vendor/platformdirs/__init__.py | 631 -- .../pip/_vendor/platformdirs/__main__.py | 55 - .../__pycache__/__init__.cpython-310.pyc | Bin 15884 -> 0 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 1430 -> 0 bytes .../__pycache__/android.cpython-310.pyc | Bin 7448 -> 0 bytes .../__pycache__/api.cpython-310.pyc | Bin 10263 -> 0 bytes .../__pycache__/macos.cpython-310.pyc | Bin 6552 -> 0 bytes .../__pycache__/unix.cpython-310.pyc | Bin 10607 -> 0 bytes .../__pycache__/version.cpython-310.pyc | Bin 598 -> 0 bytes .../__pycache__/windows.cpython-310.pyc | Bin 9118 -> 0 bytes .../pip/_vendor/platformdirs/android.py | 249 - .../pip/_vendor/platformdirs/api.py | 299 - .../pip/_vendor/platformdirs/macos.py | 144 - .../pip/_vendor/platformdirs/py.typed | 0 .../pip/_vendor/platformdirs/unix.py | 272 - .../pip/_vendor/platformdirs/version.py | 21 - .../pip/_vendor/platformdirs/windows.py | 272 - .../pip/_vendor/pygments/__init__.py | 82 - .../pip/_vendor/pygments/__main__.py | 17 - .../__pycache__/__init__.cpython-310.pyc | Bin 2962 -> 0 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 615 -> 0 bytes .../__pycache__/console.cpython-310.pyc | Bin 1917 -> 0 bytes .../__pycache__/filter.cpython-310.pyc | Bin 2677 -> 0 bytes .../__pycache__/formatter.cpython-310.pyc | Bin 4128 -> 0 bytes .../__pycache__/lexer.cpython-310.pyc | Bin 26553 -> 0 bytes .../__pycache__/modeline.cpython-310.pyc | Bin 1220 -> 0 bytes .../__pycache__/plugin.cpython-310.pyc | Bin 1976 -> 0 bytes .../__pycache__/regexopt.cpython-310.pyc | Bin 2983 -> 0 bytes .../__pycache__/scanner.cpython-310.pyc | Bin 3585 -> 0 bytes .../__pycache__/sphinxext.cpython-310.pyc | Bin 7794 -> 0 bytes .../__pycache__/style.cpython-310.pyc | Bin 4641 -> 0 bytes .../__pycache__/token.cpython-310.pyc | Bin 4723 -> 0 bytes .../__pycache__/unistring.cpython-310.pyc | Bin 31257 -> 0 bytes .../pygments/__pycache__/util.cpython-310.pyc | Bin 10089 -> 0 bytes .../pip/_vendor/pygments/console.py | 70 - .../pip/_vendor/pygments/filter.py | 70 - .../pip/_vendor/pygments/filters/__init__.py | 940 -- .../__pycache__/__init__.cpython-310.pyc | Bin 29653 -> 0 bytes .../pip/_vendor/pygments/formatter.py | 129 - .../_vendor/pygments/formatters/__init__.py | 157 - .../__pycache__/__init__.cpython-310.pyc | Bin 5046 -> 0 bytes .../__pycache__/_mapping.cpython-310.pyc | Bin 4027 -> 0 bytes .../_vendor/pygments/formatters/_mapping.py | 23 - .../pip/_vendor/pygments/lexer.py | 963 -- .../pip/_vendor/pygments/lexers/__init__.py | 362 - .../__pycache__/__init__.cpython-310.pyc | Bin 10088 -> 0 bytes .../__pycache__/_mapping.cpython-310.pyc | Bin 66581 -> 0 bytes .../lexers/__pycache__/python.cpython-310.pyc | Bin 30245 -> 0 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 602 -- .../pip/_vendor/pygments/lexers/python.py | 1201 --- .../pip/_vendor/pygments/modeline.py | 43 - .../pip/_vendor/pygments/plugin.py | 72 - .../pip/_vendor/pygments/regexopt.py | 91 - .../pip/_vendor/pygments/scanner.py | 104 - .../pip/_vendor/pygments/sphinxext.py | 247 - .../pip/_vendor/pygments/style.py | 203 - .../pip/_vendor/pygments/styles/__init__.py | 61 - .../__pycache__/__init__.cpython-310.pyc | Bin 2089 -> 0 bytes .../__pycache__/_mapping.cpython-310.pyc | Bin 3339 -> 0 bytes .../pip/_vendor/pygments/styles/_mapping.py | 54 - .../pip/_vendor/pygments/token.py | 214 - .../pip/_vendor/pygments/unistring.py | 153 - .../pip/_vendor/pygments/util.py | 324 - .../pip/_vendor/pyproject_hooks/__init__.py | 31 - .../__pycache__/__init__.cpython-310.pyc | Bin 727 -> 0 bytes .../__pycache__/_impl.cpython-310.pyc | Bin 14121 -> 0 bytes .../pip/_vendor/pyproject_hooks/_impl.py | 410 - .../pyproject_hooks/_in_process/__init__.py | 21 - .../__pycache__/__init__.cpython-310.pyc | Bin 851 -> 0 bytes .../__pycache__/_in_process.cpython-310.pyc | Bin 10512 -> 0 bytes .../_in_process/_in_process.py | 389 - .../pip/_vendor/pyproject_hooks/py.typed | 0 .../pip/_vendor/requests/__init__.py | 179 - .../__pycache__/__init__.cpython-310.pyc | Bin 3899 -> 0 bytes .../__pycache__/__version__.cpython-310.pyc | Bin 577 -> 0 bytes .../_internal_utils.cpython-310.pyc | Bin 1653 -> 0 bytes .../__pycache__/adapters.cpython-310.pyc | Bin 22139 -> 0 bytes .../requests/__pycache__/api.cpython-310.pyc | Bin 6753 -> 0 bytes .../requests/__pycache__/auth.cpython-310.pyc | Bin 8149 -> 0 bytes .../__pycache__/certs.cpython-310.pyc | Bin 666 -> 0 bytes .../__pycache__/compat.cpython-310.pyc | Bin 1545 -> 0 bytes .../__pycache__/cookies.cpython-310.pyc | Bin 18754 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 6268 -> 0 bytes .../requests/__pycache__/help.cpython-310.pyc | Bin 2843 -> 0 bytes .../__pycache__/hooks.cpython-310.pyc | Bin 1021 -> 0 bytes .../__pycache__/models.cpython-310.pyc | Bin 24317 -> 0 bytes .../__pycache__/packages.cpython-310.pyc | Bin 767 -> 0 bytes .../__pycache__/sessions.cpython-310.pyc | Bin 19763 -> 0 bytes .../__pycache__/status_codes.cpython-310.pyc | Bin 4771 -> 0 bytes .../__pycache__/structures.cpython-310.pyc | Bin 4465 -> 0 bytes .../__pycache__/utils.cpython-310.pyc | Bin 24665 -> 0 bytes .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/_internal_utils.py | 50 - .../pip/_vendor/requests/adapters.py | 719 -- .../site-packages/pip/_vendor/requests/api.py | 157 - .../pip/_vendor/requests/auth.py | 314 - .../pip/_vendor/requests/certs.py | 17 - .../pip/_vendor/requests/compat.py | 78 - .../pip/_vendor/requests/cookies.py | 561 -- .../pip/_vendor/requests/exceptions.py | 151 - .../pip/_vendor/requests/help.py | 127 - .../pip/_vendor/requests/hooks.py | 33 - .../pip/_vendor/requests/models.py | 1037 -- .../pip/_vendor/requests/packages.py | 25 - .../pip/_vendor/requests/sessions.py | 831 -- .../pip/_vendor/requests/status_codes.py | 128 - .../pip/_vendor/requests/structures.py | 99 - .../pip/_vendor/requests/utils.py | 1096 --- .../pip/_vendor/resolvelib/__init__.py | 27 - .../__pycache__/__init__.cpython-310.pyc | Bin 633 -> 0 bytes .../__pycache__/providers.cpython-310.pyc | Bin 9886 -> 0 bytes .../__pycache__/reporters.cpython-310.pyc | Bin 3304 -> 0 bytes .../__pycache__/structs.cpython-310.pyc | Bin 9254 -> 0 bytes .../pip/_vendor/resolvelib/providers.py | 196 - .../pip/_vendor/resolvelib/py.typed | 0 .../pip/_vendor/resolvelib/reporters.py | 55 - .../_vendor/resolvelib/resolvers/__init__.py | 27 - .../__pycache__/__init__.cpython-310.pyc | Bin 746 -> 0 bytes .../__pycache__/abstract.cpython-310.pyc | Bin 2317 -> 0 bytes .../__pycache__/criterion.cpython-310.pyc | Bin 2861 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 3329 -> 0 bytes .../__pycache__/resolution.cpython-310.pyc | Bin 15166 -> 0 bytes .../_vendor/resolvelib/resolvers/abstract.py | 47 - .../_vendor/resolvelib/resolvers/criterion.py | 48 - .../resolvelib/resolvers/exceptions.py | 57 - .../resolvelib/resolvers/resolution.py | 541 - .../pip/_vendor/resolvelib/structs.py | 209 - .../pip/_vendor/rich/__init__.py | 177 - .../pip/_vendor/rich/__main__.py | 273 - .../rich/__pycache__/__init__.cpython-310.pyc | Bin 6140 -> 0 bytes .../rich/__pycache__/__main__.cpython-310.pyc | Bin 7210 -> 0 bytes .../__pycache__/_cell_widths.cpython-310.pyc | Bin 7892 -> 0 bytes .../__pycache__/_emoji_codes.cpython-310.pyc | Bin 360081 -> 0 bytes .../_emoji_replace.cpython-310.pyc | Bin 1221 -> 0 bytes .../_export_format.cpython-310.pyc | Bin 2352 -> 0 bytes .../__pycache__/_extension.cpython-310.pyc | Bin 522 -> 0 bytes .../rich/__pycache__/_fileno.cpython-310.pyc | Bin 815 -> 0 bytes .../rich/__pycache__/_inspect.cpython-310.pyc | Bin 8649 -> 0 bytes .../__pycache__/_log_render.cpython-310.pyc | Bin 2667 -> 0 bytes .../rich/__pycache__/_loop.cpython-310.pyc | Bin 1319 -> 0 bytes .../__pycache__/_null_file.cpython-310.pyc | Bin 3270 -> 0 bytes .../__pycache__/_palettes.cpython-310.pyc | Bin 5124 -> 0 bytes .../rich/__pycache__/_pick.cpython-310.pyc | Bin 667 -> 0 bytes .../rich/__pycache__/_ratio.cpython-310.pyc | Bin 5186 -> 0 bytes .../__pycache__/_spinners.cpython-310.pyc | Bin 12298 -> 0 bytes .../rich/__pycache__/_stack.cpython-310.pyc | Bin 865 -> 0 bytes .../rich/__pycache__/_timer.cpython-310.pyc | Bin 714 -> 0 bytes .../_win32_console.cpython-310.pyc | Bin 18994 -> 0 bytes .../rich/__pycache__/_windows.cpython-310.pyc | Bin 1816 -> 0 bytes .../_windows_renderer.cpython-310.pyc | Bin 2070 -> 0 bytes .../rich/__pycache__/_wrap.cpython-310.pyc | Bin 2500 -> 0 bytes .../rich/__pycache__/abc.cpython-310.pyc | Bin 1341 -> 0 bytes .../rich/__pycache__/align.cpython-310.pyc | Bin 8073 -> 0 bytes .../rich/__pycache__/ansi.cpython-310.pyc | Bin 6024 -> 0 bytes .../rich/__pycache__/bar.cpython-310.pyc | Bin 3010 -> 0 bytes .../rich/__pycache__/box.cpython-310.pyc | Bin 8430 -> 0 bytes .../rich/__pycache__/cells.cpython-310.pyc | Bin 4301 -> 0 bytes .../rich/__pycache__/color.cpython-310.pyc | Bin 17743 -> 0 bytes .../__pycache__/color_triplet.cpython-310.pyc | Bin 1464 -> 0 bytes .../rich/__pycache__/columns.cpython-310.pyc | Bin 6224 -> 0 bytes .../rich/__pycache__/console.cpython-310.pyc | Bin 83713 -> 0 bytes .../__pycache__/constrain.cpython-310.pyc | Bin 1781 -> 0 bytes .../__pycache__/containers.cpython-310.pyc | Bin 6518 -> 0 bytes .../rich/__pycache__/control.cpython-310.pyc | Bin 8186 -> 0 bytes .../default_styles.cpython-310.pyc | Bin 6379 -> 0 bytes .../rich/__pycache__/diagnose.cpython-310.pyc | Bin 1264 -> 0 bytes .../rich/__pycache__/emoji.cpython-310.pyc | Bin 3294 -> 0 bytes .../rich/__pycache__/errors.cpython-310.pyc | Bin 1554 -> 0 bytes .../__pycache__/file_proxy.cpython-310.pyc | Bin 2427 -> 0 bytes .../rich/__pycache__/filesize.cpython-310.pyc | Bin 2645 -> 0 bytes .../__pycache__/highlighter.cpython-310.pyc | Bin 8088 -> 0 bytes .../rich/__pycache__/json.cpython-310.pyc | Bin 4758 -> 0 bytes .../rich/__pycache__/jupyter.cpython-310.pyc | Bin 4026 -> 0 bytes .../rich/__pycache__/layout.cpython-310.pyc | Bin 14674 -> 0 bytes .../rich/__pycache__/live.cpython-310.pyc | Bin 11703 -> 0 bytes .../__pycache__/live_render.cpython-310.pyc | Bin 3429 -> 0 bytes .../rich/__pycache__/logging.cpython-310.pyc | Bin 10353 -> 0 bytes .../rich/__pycache__/markup.cpython-310.pyc | Bin 6183 -> 0 bytes .../rich/__pycache__/measure.cpython-310.pyc | Bin 5103 -> 0 bytes .../rich/__pycache__/padding.cpython-310.pyc | Bin 4452 -> 0 bytes .../rich/__pycache__/pager.cpython-310.pyc | Bin 1503 -> 0 bytes .../rich/__pycache__/palette.cpython-310.pyc | Bin 3735 -> 0 bytes .../rich/__pycache__/panel.cpython-310.pyc | Bin 7966 -> 0 bytes .../rich/__pycache__/pretty.cpython-310.pyc | Bin 27840 -> 0 bytes .../rich/__pycache__/progress.cpython-310.pyc | Bin 54578 -> 0 bytes .../__pycache__/progress_bar.cpython-310.pyc | Bin 6938 -> 0 bytes .../rich/__pycache__/prompt.cpython-310.pyc | Bin 12224 -> 0 bytes .../rich/__pycache__/protocol.cpython-310.pyc | Bin 1379 -> 0 bytes .../rich/__pycache__/region.cpython-310.pyc | Bin 554 -> 0 bytes .../rich/__pycache__/repr.cpython-310.pyc | Bin 4123 -> 0 bytes .../rich/__pycache__/rule.cpython-310.pyc | Bin 3970 -> 0 bytes .../rich/__pycache__/scope.cpython-310.pyc | Bin 3016 -> 0 bytes .../rich/__pycache__/screen.cpython-310.pyc | Bin 1906 -> 0 bytes .../rich/__pycache__/segment.cpython-310.pyc | Bin 21240 -> 0 bytes .../rich/__pycache__/spinner.cpython-310.pyc | Bin 4440 -> 0 bytes .../rich/__pycache__/status.cpython-310.pyc | Bin 4620 -> 0 bytes .../rich/__pycache__/style.cpython-310.pyc | Bin 21351 -> 0 bytes .../rich/__pycache__/styled.cpython-310.pyc | Bin 1790 -> 0 bytes .../rich/__pycache__/syntax.cpython-310.pyc | Bin 26195 -> 0 bytes .../rich/__pycache__/table.cpython-310.pyc | Bin 30176 -> 0 bytes .../terminal_theme.cpython-310.pyc | Bin 3043 -> 0 bytes .../rich/__pycache__/text.cpython-310.pyc | Bin 41818 -> 0 bytes .../rich/__pycache__/theme.cpython-310.pyc | Bin 4859 -> 0 bytes .../rich/__pycache__/themes.cpython-310.pyc | Bin 320 -> 0 bytes .../__pycache__/traceback.cpython-310.pyc | Bin 24243 -> 0 bytes .../rich/__pycache__/tree.cpython-310.pyc | Bin 7668 -> 0 bytes .../pip/_vendor/rich/_cell_widths.py | 454 - .../pip/_vendor/rich/_emoji_codes.py | 3610 ------- .../pip/_vendor/rich/_emoji_replace.py | 32 - .../pip/_vendor/rich/_export_format.py | 76 - .../pip/_vendor/rich/_extension.py | 10 - .../site-packages/pip/_vendor/rich/_fileno.py | 24 - .../pip/_vendor/rich/_inspect.py | 268 - .../pip/_vendor/rich/_log_render.py | 94 - .../site-packages/pip/_vendor/rich/_loop.py | 43 - .../pip/_vendor/rich/_null_file.py | 69 - .../pip/_vendor/rich/_palettes.py | 309 - .../site-packages/pip/_vendor/rich/_pick.py | 17 - .../site-packages/pip/_vendor/rich/_ratio.py | 159 - .../pip/_vendor/rich/_spinners.py | 482 - .../site-packages/pip/_vendor/rich/_stack.py | 16 - .../site-packages/pip/_vendor/rich/_timer.py | 19 - .../pip/_vendor/rich/_win32_console.py | 661 -- .../pip/_vendor/rich/_windows.py | 71 - .../pip/_vendor/rich/_windows_renderer.py | 56 - .../site-packages/pip/_vendor/rich/_wrap.py | 93 - .../Lib/site-packages/pip/_vendor/rich/abc.py | 33 - .../site-packages/pip/_vendor/rich/align.py | 312 - .../site-packages/pip/_vendor/rich/ansi.py | 241 - .../Lib/site-packages/pip/_vendor/rich/bar.py | 93 - .../Lib/site-packages/pip/_vendor/rich/box.py | 480 - .../site-packages/pip/_vendor/rich/cells.py | 174 - .../site-packages/pip/_vendor/rich/color.py | 621 -- .../pip/_vendor/rich/color_triplet.py | 38 - .../site-packages/pip/_vendor/rich/columns.py | 187 - .../site-packages/pip/_vendor/rich/console.py | 2675 ----- .../pip/_vendor/rich/constrain.py | 37 - .../pip/_vendor/rich/containers.py | 167 - .../site-packages/pip/_vendor/rich/control.py | 225 - .../pip/_vendor/rich/default_styles.py | 193 - .../pip/_vendor/rich/diagnose.py | 38 - .../site-packages/pip/_vendor/rich/emoji.py | 96 - .../site-packages/pip/_vendor/rich/errors.py | 34 - .../pip/_vendor/rich/file_proxy.py | 57 - .../pip/_vendor/rich/filesize.py | 88 - .../pip/_vendor/rich/highlighter.py | 232 - .../site-packages/pip/_vendor/rich/json.py | 139 - .../site-packages/pip/_vendor/rich/jupyter.py | 101 - .../site-packages/pip/_vendor/rich/layout.py | 442 - .../site-packages/pip/_vendor/rich/live.py | 375 - .../pip/_vendor/rich/live_render.py | 112 - .../site-packages/pip/_vendor/rich/logging.py | 297 - .../site-packages/pip/_vendor/rich/markup.py | 251 - .../site-packages/pip/_vendor/rich/measure.py | 151 - .../site-packages/pip/_vendor/rich/padding.py | 141 - .../site-packages/pip/_vendor/rich/pager.py | 34 - .../site-packages/pip/_vendor/rich/palette.py | 100 - .../site-packages/pip/_vendor/rich/panel.py | 318 - .../site-packages/pip/_vendor/rich/pretty.py | 1016 -- .../pip/_vendor/rich/progress.py | 1715 ---- .../pip/_vendor/rich/progress_bar.py | 223 - .../site-packages/pip/_vendor/rich/prompt.py | 400 - .../pip/_vendor/rich/protocol.py | 42 - .../site-packages/pip/_vendor/rich/py.typed | 0 .../site-packages/pip/_vendor/rich/region.py | 10 - .../site-packages/pip/_vendor/rich/repr.py | 149 - .../site-packages/pip/_vendor/rich/rule.py | 130 - .../site-packages/pip/_vendor/rich/scope.py | 86 - .../site-packages/pip/_vendor/rich/screen.py | 54 - .../site-packages/pip/_vendor/rich/segment.py | 752 -- .../site-packages/pip/_vendor/rich/spinner.py | 138 - .../site-packages/pip/_vendor/rich/status.py | 131 - .../site-packages/pip/_vendor/rich/style.py | 796 -- .../site-packages/pip/_vendor/rich/styled.py | 42 - .../site-packages/pip/_vendor/rich/syntax.py | 966 -- .../site-packages/pip/_vendor/rich/table.py | 1006 -- .../pip/_vendor/rich/terminal_theme.py | 153 - .../site-packages/pip/_vendor/rich/text.py | 1361 --- .../site-packages/pip/_vendor/rich/theme.py | 115 - .../site-packages/pip/_vendor/rich/themes.py | 5 - .../pip/_vendor/rich/traceback.py | 884 -- .../site-packages/pip/_vendor/rich/tree.py | 257 - .../pip/_vendor/tomli/__init__.py | 8 - .../__pycache__/__init__.cpython-310.pyc | Bin 352 -> 0 bytes .../tomli/__pycache__/_parser.cpython-310.pyc | Bin 18626 -> 0 bytes .../tomli/__pycache__/_re.cpython-310.pyc | Bin 3022 -> 0 bytes .../tomli/__pycache__/_types.cpython-310.pyc | Bin 352 -> 0 bytes .../pip/_vendor/tomli/_parser.py | 770 -- .../site-packages/pip/_vendor/tomli/_re.py | 112 - .../site-packages/pip/_vendor/tomli/_types.py | 10 - .../site-packages/pip/_vendor/tomli/py.typed | 1 - .../pip/_vendor/tomli_w/__init__.py | 4 - .../__pycache__/__init__.cpython-310.pyc | Bin 343 -> 0 bytes .../__pycache__/_writer.cpython-310.pyc | Bin 6929 -> 0 bytes .../pip/_vendor/tomli_w/_writer.py | 229 - .../pip/_vendor/tomli_w/py.typed | 1 - .../pip/_vendor/truststore/__init__.py | 36 - .../__pycache__/__init__.cpython-310.pyc | Bin 1047 -> 0 bytes .../__pycache__/_api.cpython-310.pyc | Bin 10668 -> 0 bytes .../__pycache__/_macos.cpython-310.pyc | Bin 10127 -> 0 bytes .../__pycache__/_openssl.cpython-310.pyc | Bin 1509 -> 0 bytes .../_ssl_constants.cpython-310.pyc | Bin 823 -> 0 bytes .../__pycache__/_windows.cpython-310.pyc | Bin 10603 -> 0 bytes .../pip/_vendor/truststore/_api.py | 333 - .../pip/_vendor/truststore/_macos.py | 571 -- .../pip/_vendor/truststore/_openssl.py | 66 - .../pip/_vendor/truststore/_ssl_constants.py | 31 - .../pip/_vendor/truststore/_windows.py | 567 -- .../pip/_vendor/truststore/py.typed | 0 .../pip/_vendor/typing_extensions.py | 4584 --------- .../pip/_vendor/urllib3/__init__.py | 102 - .../__pycache__/__init__.cpython-310.pyc | Bin 2536 -> 0 bytes .../__pycache__/_collections.cpython-310.pyc | Bin 11381 -> 0 bytes .../__pycache__/_version.cpython-310.pyc | Bin 241 -> 0 bytes .../__pycache__/connection.cpython-310.pyc | Bin 13736 -> 0 bytes .../connectionpool.cpython-310.pyc | Bin 25970 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 11021 -> 0 bytes .../__pycache__/fields.cpython-310.pyc | Bin 8212 -> 0 bytes .../__pycache__/filepost.cpython-310.pyc | Bin 2777 -> 0 bytes .../__pycache__/poolmanager.cpython-310.pyc | Bin 15187 -> 0 bytes .../__pycache__/request.cpython-310.pyc | Bin 6409 -> 0 bytes .../__pycache__/response.cpython-310.pyc | Bin 22543 -> 0 bytes .../pip/_vendor/urllib3/_collections.py | 355 - .../pip/_vendor/urllib3/_version.py | 2 - .../pip/_vendor/urllib3/connection.py | 572 -- .../pip/_vendor/urllib3/connectionpool.py | 1140 --- .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 226 -> 0 bytes .../_appengine_environ.cpython-310.pyc | Bin 1406 -> 0 bytes .../__pycache__/appengine.cpython-310.pyc | Bin 8223 -> 0 bytes .../__pycache__/ntlmpool.cpython-310.pyc | Bin 3650 -> 0 bytes .../__pycache__/pyopenssl.cpython-310.pyc | Bin 15838 -> 0 bytes .../securetransport.cpython-310.pyc | Bin 21965 -> 0 bytes .../contrib/__pycache__/socks.cpython-310.pyc | Bin 5628 -> 0 bytes .../urllib3/contrib/_appengine_environ.py | 36 - .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 243 -> 0 bytes .../__pycache__/bindings.cpython-310.pyc | Bin 10739 -> 0 bytes .../__pycache__/low_level.cpython-310.pyc | Bin 9126 -> 0 bytes .../contrib/_securetransport/bindings.py | 519 - .../contrib/_securetransport/low_level.py | 397 - .../pip/_vendor/urllib3/contrib/appengine.py | 314 - .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 - .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 - .../urllib3/contrib/securetransport.py | 920 -- .../pip/_vendor/urllib3/contrib/socks.py | 216 - .../pip/_vendor/urllib3/exceptions.py | 323 - .../pip/_vendor/urllib3/fields.py | 274 - .../pip/_vendor/urllib3/filepost.py | 98 - .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 227 -> 0 bytes .../packages/__pycache__/six.cpython-310.pyc | Bin 27687 -> 0 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 237 -> 0 bytes .../__pycache__/makefile.cpython-310.pyc | Bin 1337 -> 0 bytes .../weakref_finalize.cpython-310.pyc | Bin 4935 -> 0 bytes .../urllib3/packages/backports/makefile.py | 51 - .../packages/backports/weakref_finalize.py | 155 - .../pip/_vendor/urllib3/packages/six.py | 1076 -- .../pip/_vendor/urllib3/poolmanager.py | 540 - .../pip/_vendor/urllib3/request.py | 191 - .../pip/_vendor/urllib3/response.py | 879 -- .../pip/_vendor/urllib3/util/__init__.py | 49 - .../util/__pycache__/__init__.cpython-310.pyc | Bin 1136 -> 0 bytes .../__pycache__/connection.cpython-310.pyc | Bin 3464 -> 0 bytes .../util/__pycache__/proxy.cpython-310.pyc | Bin 1371 -> 0 bytes .../util/__pycache__/queue.cpython-310.pyc | Bin 1091 -> 0 bytes .../util/__pycache__/request.cpython-310.pyc | Bin 3398 -> 0 bytes .../util/__pycache__/response.cpython-310.pyc | Bin 2384 -> 0 bytes .../util/__pycache__/retry.cpython-310.pyc | Bin 16211 -> 0 bytes .../util/__pycache__/ssl_.cpython-310.pyc | Bin 11580 -> 0 bytes .../ssl_match_hostname.cpython-310.pyc | Bin 3288 -> 0 bytes .../__pycache__/ssltransport.cpython-310.pyc | Bin 7426 -> 0 bytes .../util/__pycache__/timeout.cpython-310.pyc | Bin 9171 -> 0 bytes .../util/__pycache__/url.cpython-310.pyc | Bin 10746 -> 0 bytes .../util/__pycache__/wait.cpython-310.pyc | Bin 3120 -> 0 bytes .../pip/_vendor/urllib3/util/connection.py | 149 - .../pip/_vendor/urllib3/util/proxy.py | 57 - .../pip/_vendor/urllib3/util/queue.py | 22 - .../pip/_vendor/urllib3/util/request.py | 137 - .../pip/_vendor/urllib3/util/response.py | 107 - .../pip/_vendor/urllib3/util/retry.py | 622 -- .../pip/_vendor/urllib3/util/ssl_.py | 504 - .../urllib3/util/ssl_match_hostname.py | 159 - .../pip/_vendor/urllib3/util/ssltransport.py | 221 - .../pip/_vendor/urllib3/util/timeout.py | 271 - .../pip/_vendor/urllib3/util/url.py | 435 - .../pip/_vendor/urllib3/util/wait.py | 152 - .../Lib/site-packages/pip/_vendor/vendor.txt | 20 - blog-app/venv/Lib/site-packages/pip/py.typed | 4 - .../site-packages/pkg_resources/__init__.py | 3296 ------- .../__pycache__/__init__.cpython-310.pyc | Bin 100602 -> 0 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 220 -> 0 bytes .../__pycache__/appdirs.cpython-310.pyc | Bin 20281 -> 0 bytes .../_vendor/__pycache__/zipp.cpython-310.pyc | Bin 10263 -> 0 bytes .../pkg_resources/_vendor/appdirs.py | 608 -- .../_vendor/importlib_resources/__init__.py | 36 - .../__pycache__/__init__.cpython-310.pyc | Bin 675 -> 0 bytes .../__pycache__/_adapters.cpython-310.pyc | Bin 7383 -> 0 bytes .../__pycache__/_common.cpython-310.pyc | Bin 2673 -> 0 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 3533 -> 0 bytes .../__pycache__/_itertools.cpython-310.pyc | Bin 920 -> 0 bytes .../__pycache__/_legacy.cpython-310.pyc | Bin 4256 -> 0 bytes .../__pycache__/abc.cpython-310.pyc | Bin 5409 -> 0 bytes .../__pycache__/readers.cpython-310.pyc | Bin 5493 -> 0 bytes .../__pycache__/simple.cpython-310.pyc | Bin 4761 -> 0 bytes .../_vendor/importlib_resources/_adapters.py | 170 - .../_vendor/importlib_resources/_common.py | 104 - .../_vendor/importlib_resources/_compat.py | 98 - .../_vendor/importlib_resources/_itertools.py | 35 - .../_vendor/importlib_resources/_legacy.py | 121 - .../_vendor/importlib_resources/abc.py | 137 - .../_vendor/importlib_resources/readers.py | 122 - .../_vendor/importlib_resources/simple.py | 116 - .../pkg_resources/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 227 -> 0 bytes .../__pycache__/context.cpython-310.pyc | Bin 6359 -> 0 bytes .../__pycache__/functools.cpython-310.pyc | Bin 15651 -> 0 bytes .../pkg_resources/_vendor/jaraco/context.py | 213 - .../pkg_resources/_vendor/jaraco/functools.py | 525 - .../_vendor/jaraco/text/__init__.py | 599 -- .../text/__pycache__/__init__.cpython-310.pyc | Bin 19696 -> 0 bytes .../_vendor/more_itertools/__init__.py | 4 - .../__pycache__/__init__.cpython-310.pyc | Bin 302 -> 0 bytes .../__pycache__/more.cpython-310.pyc | Bin 123087 -> 0 bytes .../__pycache__/recipes.cpython-310.pyc | Bin 20363 -> 0 bytes .../_vendor/more_itertools/more.py | 4316 -------- .../_vendor/more_itertools/recipes.py | 698 -- .../_vendor/packaging/__about__.py | 26 - .../_vendor/packaging/__init__.py | 25 - .../__pycache__/__about__.cpython-310.pyc | Bin 627 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 483 -> 0 bytes .../__pycache__/_manylinux.cpython-310.pyc | Bin 7337 -> 0 bytes .../__pycache__/_musllinux.cpython-310.pyc | Bin 4649 -> 0 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 2742 -> 0 bytes .../__pycache__/markers.cpython-310.pyc | Bin 9335 -> 0 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 4021 -> 0 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 21564 -> 0 bytes .../__pycache__/tags.cpython-310.pyc | Bin 12233 -> 0 bytes .../__pycache__/utils.cpython-310.pyc | Bin 3612 -> 0 bytes .../__pycache__/version.cpython-310.pyc | Bin 12962 -> 0 bytes .../_vendor/packaging/_manylinux.py | 301 - .../_vendor/packaging/_musllinux.py | 136 - .../_vendor/packaging/_structures.py | 61 - .../_vendor/packaging/markers.py | 304 - .../_vendor/packaging/requirements.py | 146 - .../_vendor/packaging/specifiers.py | 802 -- .../pkg_resources/_vendor/packaging/tags.py | 487 - .../pkg_resources/_vendor/packaging/utils.py | 136 - .../_vendor/packaging/version.py | 504 - .../_vendor/pyparsing/__init__.py | 331 - .../__pycache__/__init__.cpython-310.pyc | Bin 7154 -> 0 bytes .../__pycache__/actions.cpython-310.pyc | Bin 7219 -> 0 bytes .../__pycache__/common.cpython-310.pyc | Bin 10142 -> 0 bytes .../__pycache__/core.cpython-310.pyc | Bin 176431 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 9109 -> 0 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 35286 -> 0 bytes .../__pycache__/results.cpython-310.pyc | Bin 24836 -> 0 bytes .../__pycache__/testing.cpython-310.pyc | Bin 12139 -> 0 bytes .../__pycache__/unicode.cpython-310.pyc | Bin 9851 -> 0 bytes .../__pycache__/util.cpython-310.pyc | Bin 8642 -> 0 bytes .../_vendor/pyparsing/actions.py | 207 - .../pkg_resources/_vendor/pyparsing/common.py | 424 - .../pkg_resources/_vendor/pyparsing/core.py | 5812 ----------- .../_vendor/pyparsing/diagram/__init__.py | 611 -- .../__pycache__/__init__.cpython-310.pyc | Bin 16100 -> 0 bytes .../_vendor/pyparsing/exceptions.py | 267 - .../_vendor/pyparsing/helpers.py | 1083 -- .../_vendor/pyparsing/results.py | 760 -- .../_vendor/pyparsing/testing.py | 331 - .../_vendor/pyparsing/unicode.py | 332 - .../pkg_resources/_vendor/pyparsing/util.py | 235 - .../pkg_resources/_vendor/zipp.py | 329 - .../pkg_resources/extern/__init__.py | 76 - .../__pycache__/__init__.cpython-310.pyc | Bin 2973 -> 0 bytes .../setuptools-63.2.0.dist-info/INSTALLER | 1 - .../setuptools-63.2.0.dist-info/LICENSE | 19 - .../setuptools-63.2.0.dist-info/METADATA | 140 - .../setuptools-63.2.0.dist-info/RECORD | 468 - .../setuptools-63.2.0.dist-info/REQUESTED | 0 .../setuptools-63.2.0.dist-info/WHEEL | 5 - .../entry_points.txt | 56 - .../setuptools-63.2.0.dist-info/top_level.txt | 3 - .../Lib/site-packages/setuptools/__init__.py | 189 - .../__pycache__/__init__.cpython-310.pyc | Bin 6609 -> 0 bytes .../_deprecation_warning.cpython-310.pyc | Bin 581 -> 0 bytes .../__pycache__/_entry_points.cpython-310.pyc | Bin 3044 -> 0 bytes .../__pycache__/_imp.cpython-310.pyc | Bin 2107 -> 0 bytes .../__pycache__/_importlib.cpython-310.pyc | Bin 1377 -> 0 bytes .../__pycache__/_itertools.cpython-310.pyc | Bin 945 -> 0 bytes .../__pycache__/_path.cpython-310.pyc | Bin 457 -> 0 bytes .../__pycache__/_reqs.cpython-310.pyc | Bin 860 -> 0 bytes .../__pycache__/archive_util.cpython-310.pyc | Bin 6211 -> 0 bytes .../__pycache__/build_meta.cpython-310.pyc | Bin 9895 -> 0 bytes .../__pycache__/dep_util.cpython-310.pyc | Bin 888 -> 0 bytes .../__pycache__/depends.cpython-310.pyc | Bin 5327 -> 0 bytes .../__pycache__/discovery.cpython-310.pyc | Bin 20606 -> 0 bytes .../__pycache__/dist.cpython-310.pyc | Bin 38435 -> 0 bytes .../__pycache__/errors.cpython-310.pyc | Bin 2515 -> 0 bytes .../__pycache__/extension.cpython-310.pyc | Bin 5607 -> 0 bytes .../__pycache__/glob.cpython-310.pyc | Bin 3766 -> 0 bytes .../__pycache__/installer.cpython-310.pyc | Bin 3012 -> 0 bytes .../__pycache__/launch.cpython-310.pyc | Bin 938 -> 0 bytes .../__pycache__/logging.cpython-310.pyc | Bin 1241 -> 0 bytes .../__pycache__/monkey.cpython-310.pyc | Bin 4666 -> 0 bytes .../__pycache__/msvc.cpython-310.pyc | Bin 42670 -> 0 bytes .../__pycache__/namespaces.cpython-310.pyc | Bin 3649 -> 0 bytes .../__pycache__/package_index.cpython-310.pyc | Bin 32718 -> 0 bytes .../__pycache__/py34compat.cpython-310.pyc | Bin 513 -> 0 bytes .../__pycache__/sandbox.cpython-310.pyc | Bin 15789 -> 0 bytes .../__pycache__/unicode_utils.cpython-310.pyc | Bin 1143 -> 0 bytes .../__pycache__/version.cpython-310.pyc | Bin 355 -> 0 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 7405 -> 0 bytes .../windows_support.cpython-310.pyc | Bin 1061 -> 0 bytes .../setuptools/_deprecation_warning.py | 7 - .../setuptools/_distutils/__init__.py | 24 - .../__pycache__/__init__.cpython-310.pyc | Bin 589 -> 0 bytes .../__pycache__/_collections.cpython-310.pyc | Bin 2090 -> 0 bytes .../__pycache__/_functools.cpython-310.pyc | Bin 720 -> 0 bytes .../__pycache__/_macos_compat.cpython-310.pyc | Bin 484 -> 0 bytes .../__pycache__/_msvccompiler.cpython-310.pyc | Bin 13890 -> 0 bytes .../__pycache__/archive_util.cpython-310.pyc | Bin 6600 -> 0 bytes .../__pycache__/bcppcompiler.cpython-310.pyc | Bin 6610 -> 0 bytes .../__pycache__/ccompiler.cpython-310.pyc | Bin 33395 -> 0 bytes .../__pycache__/cmd.cpython-310.pyc | Bin 13993 -> 0 bytes .../__pycache__/config.cpython-310.pyc | Bin 3615 -> 0 bytes .../__pycache__/core.cpython-310.pyc | Bin 7117 -> 0 bytes .../cygwinccompiler.cpython-310.pyc | Bin 8365 -> 0 bytes .../__pycache__/debug.cpython-310.pyc | Bin 283 -> 0 bytes .../__pycache__/dep_util.cpython-310.pyc | Bin 2800 -> 0 bytes .../__pycache__/dir_util.cpython-310.pyc | Bin 5949 -> 0 bytes .../__pycache__/dist.cpython-310.pyc | Bin 34155 -> 0 bytes .../__pycache__/errors.cpython-310.pyc | Bin 5025 -> 0 bytes .../__pycache__/extension.cpython-310.pyc | Bin 7041 -> 0 bytes .../__pycache__/fancy_getopt.cpython-310.pyc | Bin 10671 -> 0 bytes .../__pycache__/file_util.cpython-310.pyc | Bin 5995 -> 0 bytes .../__pycache__/filelist.cpython-310.pyc | Bin 10831 -> 0 bytes .../__pycache__/log.cpython-310.pyc | Bin 2340 -> 0 bytes .../__pycache__/msvc9compiler.cpython-310.pyc | Bin 17562 -> 0 bytes .../__pycache__/msvccompiler.cpython-310.pyc | Bin 14822 -> 0 bytes .../__pycache__/py38compat.cpython-310.pyc | Bin 456 -> 0 bytes .../__pycache__/py39compat.cpython-310.pyc | Bin 765 -> 0 bytes .../__pycache__/spawn.cpython-310.pyc | Bin 2885 -> 0 bytes .../__pycache__/sysconfig.cpython-310.pyc | Bin 12609 -> 0 bytes .../__pycache__/text_file.cpython-310.pyc | Bin 8286 -> 0 bytes .../__pycache__/unixccompiler.cpython-310.pyc | Bin 8677 -> 0 bytes .../__pycache__/util.cpython-310.pyc | Bin 13537 -> 0 bytes .../__pycache__/version.cpython-310.pyc | Bin 7858 -> 0 bytes .../versionpredicate.cpython-310.pyc | Bin 5358 -> 0 bytes .../setuptools/_distutils/_collections.py | 56 - .../setuptools/_distutils/_functools.py | 20 - .../setuptools/_distutils/_macos_compat.py | 12 - .../setuptools/_distutils/_msvccompiler.py | 591 -- .../setuptools/_distutils/archive_util.py | 280 - .../setuptools/_distutils/bcppcompiler.py | 398 - .../setuptools/_distutils/ccompiler.py | 1193 --- .../setuptools/_distutils/cmd.py | 434 - .../setuptools/_distutils/command/__init__.py | 32 - .../__pycache__/__init__.cpython-310.pyc | Bin 562 -> 0 bytes .../_framework_compat.cpython-310.pyc | Bin 1954 -> 0 bytes .../command/__pycache__/bdist.cpython-310.pyc | Bin 3677 -> 0 bytes .../__pycache__/bdist_dumb.cpython-310.pyc | Bin 3671 -> 0 bytes .../__pycache__/bdist_msi.cpython-310.pyc | Bin 20226 -> 0 bytes .../__pycache__/bdist_rpm.cpython-310.pyc | Bin 12304 -> 0 bytes .../__pycache__/bdist_wininst.cpython-310.pyc | Bin 8644 -> 0 bytes .../command/__pycache__/build.cpython-310.pyc | Bin 3928 -> 0 bytes .../__pycache__/build_clib.cpython-310.pyc | Bin 4893 -> 0 bytes .../__pycache__/build_ext.cpython-310.pyc | Bin 16257 -> 0 bytes .../__pycache__/build_py.cpython-310.pyc | Bin 9830 -> 0 bytes .../__pycache__/build_scripts.cpython-310.pyc | Bin 4631 -> 0 bytes .../command/__pycache__/check.cpython-310.pyc | Bin 4584 -> 0 bytes .../command/__pycache__/clean.cpython-310.pyc | Bin 2163 -> 0 bytes .../__pycache__/config.cpython-310.pyc | Bin 10393 -> 0 bytes .../__pycache__/install.cpython-310.pyc | Bin 17249 -> 0 bytes .../__pycache__/install_data.cpython-310.pyc | Bin 2384 -> 0 bytes .../install_egg_info.cpython-310.pyc | Bin 3343 -> 0 bytes .../install_headers.cpython-310.pyc | Bin 1799 -> 0 bytes .../__pycache__/install_lib.cpython-310.pyc | Bin 5227 -> 0 bytes .../install_scripts.cpython-310.pyc | Bin 2232 -> 0 bytes .../__pycache__/py37compat.cpython-310.pyc | Bin 1075 -> 0 bytes .../__pycache__/register.cpython-310.pyc | Bin 8599 -> 0 bytes .../command/__pycache__/sdist.cpython-310.pyc | Bin 14536 -> 0 bytes .../__pycache__/upload.cpython-310.pyc | Bin 5386 -> 0 bytes .../_distutils/command/_framework_compat.py | 55 - .../setuptools/_distutils/command/bdist.py | 155 - .../_distutils/command/bdist_dumb.py | 142 - .../_distutils/command/bdist_msi.py | 1114 --- .../_distutils/command/bdist_rpm.py | 607 -- .../_distutils/command/bdist_wininst.py | 418 - .../setuptools/_distutils/command/build.py | 152 - .../_distutils/command/build_clib.py | 208 - .../_distutils/command/build_ext.py | 780 -- .../setuptools/_distutils/command/build_py.py | 408 - .../_distutils/command/build_scripts.py | 173 - .../setuptools/_distutils/command/check.py | 153 - .../setuptools/_distutils/command/clean.py | 76 - .../setuptools/_distutils/command/config.py | 376 - .../setuptools/_distutils/command/install.py | 811 -- .../_distutils/command/install_data.py | 84 - .../_distutils/command/install_egg_info.py | 87 - .../_distutils/command/install_headers.py | 45 - .../_distutils/command/install_lib.py | 238 - .../_distutils/command/install_scripts.py | 61 - .../_distutils/command/py37compat.py | 31 - .../setuptools/_distutils/command/register.py | 319 - .../setuptools/_distutils/command/sdist.py | 531 - .../setuptools/_distutils/command/upload.py | 205 - .../setuptools/_distutils/config.py | 139 - .../setuptools/_distutils/core.py | 283 - .../setuptools/_distutils/cygwinccompiler.py | 414 - .../setuptools/_distutils/debug.py | 5 - .../setuptools/_distutils/dep_util.py | 96 - .../setuptools/_distutils/dir_util.py | 239 - .../setuptools/_distutils/dist.py | 1286 --- .../setuptools/_distutils/errors.py | 127 - .../setuptools/_distutils/extension.py | 248 - .../setuptools/_distutils/fancy_getopt.py | 468 - .../setuptools/_distutils/file_util.py | 245 - .../setuptools/_distutils/filelist.py | 371 - .../setuptools/_distutils/log.py | 80 - .../setuptools/_distutils/msvc9compiler.py | 820 -- .../setuptools/_distutils/msvccompiler.py | 683 -- .../setuptools/_distutils/py38compat.py | 8 - .../setuptools/_distutils/py39compat.py | 22 - .../setuptools/_distutils/spawn.py | 107 - .../setuptools/_distutils/sysconfig.py | 549 -- .../setuptools/_distutils/text_file.py | 287 - .../setuptools/_distutils/unixccompiler.py | 382 - .../setuptools/_distutils/util.py | 520 - .../setuptools/_distutils/version.py | 358 - .../setuptools/_distutils/versionpredicate.py | 175 - .../site-packages/setuptools/_entry_points.py | 86 - .../venv/Lib/site-packages/setuptools/_imp.py | 82 - .../site-packages/setuptools/_importlib.py | 47 - .../site-packages/setuptools/_itertools.py | 23 - .../Lib/site-packages/setuptools/_path.py | 7 - .../Lib/site-packages/setuptools/_reqs.py | 19 - .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 217 -> 0 bytes .../__pycache__/ordered_set.cpython-310.pyc | Bin 16353 -> 0 bytes .../typing_extensions.cpython-310.pyc | Bin 66631 -> 0 bytes .../_vendor/__pycache__/zipp.cpython-310.pyc | Bin 10260 -> 0 bytes .../_vendor/importlib_metadata/__init__.py | 1047 -- .../__pycache__/__init__.cpython-310.pyc | Bin 37452 -> 0 bytes .../__pycache__/_adapters.cpython-310.pyc | Bin 2437 -> 0 bytes .../__pycache__/_collections.cpython-310.pyc | Bin 1612 -> 0 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 2101 -> 0 bytes .../__pycache__/_functools.cpython-310.pyc | Bin 3202 -> 0 bytes .../__pycache__/_itertools.cpython-310.pyc | Bin 2083 -> 0 bytes .../__pycache__/_meta.cpython-310.pyc | Bin 2391 -> 0 bytes .../__pycache__/_text.cpython-310.pyc | Bin 3135 -> 0 bytes .../_vendor/importlib_metadata/_adapters.py | 68 - .../importlib_metadata/_collections.py | 30 - .../_vendor/importlib_metadata/_compat.py | 71 - .../_vendor/importlib_metadata/_functools.py | 104 - .../_vendor/importlib_metadata/_itertools.py | 73 - .../_vendor/importlib_metadata/_meta.py | 48 - .../_vendor/importlib_metadata/_text.py | 99 - .../_vendor/importlib_resources/__init__.py | 36 - .../__pycache__/__init__.cpython-310.pyc | Bin 672 -> 0 bytes .../__pycache__/_adapters.cpython-310.pyc | Bin 7380 -> 0 bytes .../__pycache__/_common.cpython-310.pyc | Bin 2670 -> 0 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 3530 -> 0 bytes .../__pycache__/_itertools.cpython-310.pyc | Bin 917 -> 0 bytes .../__pycache__/_legacy.cpython-310.pyc | Bin 4253 -> 0 bytes .../__pycache__/abc.cpython-310.pyc | Bin 5406 -> 0 bytes .../__pycache__/readers.cpython-310.pyc | Bin 5490 -> 0 bytes .../__pycache__/simple.cpython-310.pyc | Bin 4758 -> 0 bytes .../_vendor/importlib_resources/_adapters.py | 170 - .../_vendor/importlib_resources/_common.py | 104 - .../_vendor/importlib_resources/_compat.py | 98 - .../_vendor/importlib_resources/_itertools.py | 35 - .../_vendor/importlib_resources/_legacy.py | 121 - .../_vendor/importlib_resources/abc.py | 137 - .../_vendor/importlib_resources/readers.py | 122 - .../_vendor/importlib_resources/simple.py | 116 - .../setuptools/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 224 -> 0 bytes .../__pycache__/context.cpython-310.pyc | Bin 6356 -> 0 bytes .../__pycache__/functools.cpython-310.pyc | Bin 15642 -> 0 bytes .../setuptools/_vendor/jaraco/context.py | 213 - .../setuptools/_vendor/jaraco/functools.py | 525 - .../_vendor/jaraco/text/__init__.py | 599 -- .../text/__pycache__/__init__.cpython-310.pyc | Bin 19684 -> 0 bytes .../_vendor/more_itertools/__init__.py | 4 - .../__pycache__/__init__.cpython-310.pyc | Bin 298 -> 0 bytes .../__pycache__/more.cpython-310.pyc | Bin 110031 -> 0 bytes .../__pycache__/recipes.cpython-310.pyc | Bin 17998 -> 0 bytes .../setuptools/_vendor/more_itertools/more.py | 3824 -------- .../_vendor/more_itertools/recipes.py | 620 -- .../setuptools/_vendor/ordered_set.py | 488 - .../setuptools/_vendor/packaging/__about__.py | 26 - .../setuptools/_vendor/packaging/__init__.py | 25 - .../__pycache__/__about__.cpython-310.pyc | Bin 624 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 480 -> 0 bytes .../__pycache__/_manylinux.cpython-310.pyc | Bin 7334 -> 0 bytes .../__pycache__/_musllinux.cpython-310.pyc | Bin 4646 -> 0 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 2739 -> 0 bytes .../__pycache__/markers.cpython-310.pyc | Bin 9329 -> 0 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 4015 -> 0 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 21561 -> 0 bytes .../__pycache__/tags.cpython-310.pyc | Bin 12230 -> 0 bytes .../__pycache__/utils.cpython-310.pyc | Bin 3609 -> 0 bytes .../__pycache__/version.cpython-310.pyc | Bin 12959 -> 0 bytes .../_vendor/packaging/_manylinux.py | 301 - .../_vendor/packaging/_musllinux.py | 136 - .../_vendor/packaging/_structures.py | 61 - .../setuptools/_vendor/packaging/markers.py | 304 - .../_vendor/packaging/requirements.py | 146 - .../_vendor/packaging/specifiers.py | 802 -- .../setuptools/_vendor/packaging/tags.py | 487 - .../setuptools/_vendor/packaging/utils.py | 136 - .../setuptools/_vendor/packaging/version.py | 504 - .../setuptools/_vendor/pyparsing/__init__.py | 331 - .../__pycache__/__init__.cpython-310.pyc | Bin 7151 -> 0 bytes .../__pycache__/actions.cpython-310.pyc | Bin 7216 -> 0 bytes .../__pycache__/common.cpython-310.pyc | Bin 10139 -> 0 bytes .../__pycache__/core.cpython-310.pyc | Bin 176428 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 9106 -> 0 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 35283 -> 0 bytes .../__pycache__/results.cpython-310.pyc | Bin 24833 -> 0 bytes .../__pycache__/testing.cpython-310.pyc | Bin 12136 -> 0 bytes .../__pycache__/unicode.cpython-310.pyc | Bin 9848 -> 0 bytes .../__pycache__/util.cpython-310.pyc | Bin 8639 -> 0 bytes .../setuptools/_vendor/pyparsing/actions.py | 207 - .../setuptools/_vendor/pyparsing/common.py | 424 - .../setuptools/_vendor/pyparsing/core.py | 5812 ----------- .../_vendor/pyparsing/diagram/__init__.py | 611 -- .../__pycache__/__init__.cpython-310.pyc | Bin 16097 -> 0 bytes .../_vendor/pyparsing/exceptions.py | 267 - .../setuptools/_vendor/pyparsing/helpers.py | 1083 -- .../setuptools/_vendor/pyparsing/results.py | 760 -- .../setuptools/_vendor/pyparsing/testing.py | 331 - .../setuptools/_vendor/pyparsing/unicode.py | 332 - .../setuptools/_vendor/pyparsing/util.py | 235 - .../setuptools/_vendor/tomli/__init__.py | 11 - .../__pycache__/__init__.cpython-310.pyc | Bin 389 -> 0 bytes .../tomli/__pycache__/_parser.cpython-310.pyc | Bin 17103 -> 0 bytes .../tomli/__pycache__/_re.cpython-310.pyc | Bin 2935 -> 0 bytes .../tomli/__pycache__/_types.cpython-310.pyc | Bin 359 -> 0 bytes .../setuptools/_vendor/tomli/_parser.py | 691 -- .../setuptools/_vendor/tomli/_re.py | 107 - .../setuptools/_vendor/tomli/_types.py | 10 - .../setuptools/_vendor/typing_extensions.py | 2296 ----- .../site-packages/setuptools/_vendor/zipp.py | 329 - .../site-packages/setuptools/archive_util.py | 213 - .../site-packages/setuptools/build_meta.py | 304 - .../Lib/site-packages/setuptools/cli-32.exe | Bin 65536 -> 0 bytes .../Lib/site-packages/setuptools/cli-64.exe | Bin 74752 -> 0 bytes .../site-packages/setuptools/cli-arm64.exe | Bin 137216 -> 0 bytes .../venv/Lib/site-packages/setuptools/cli.exe | Bin 65536 -> 0 bytes .../setuptools/command/__init__.py | 8 - .../__pycache__/__init__.cpython-310.pyc | Bin 406 -> 0 bytes .../command/__pycache__/alias.cpython-310.pyc | Bin 2408 -> 0 bytes .../__pycache__/bdist_egg.cpython-310.pyc | Bin 13158 -> 0 bytes .../__pycache__/bdist_rpm.cpython-310.pyc | Bin 1621 -> 0 bytes .../command/__pycache__/build.cpython-310.pyc | Bin 1251 -> 0 bytes .../__pycache__/build_clib.cpython-310.pyc | Bin 2497 -> 0 bytes .../__pycache__/build_ext.cpython-310.pyc | Bin 9924 -> 0 bytes .../__pycache__/build_py.cpython-310.pyc | Bin 10703 -> 0 bytes .../__pycache__/develop.cpython-310.pyc | Bin 6184 -> 0 bytes .../__pycache__/dist_info.cpython-310.pyc | Bin 2665 -> 0 bytes .../__pycache__/easy_install.cpython-310.pyc | Bin 64457 -> 0 bytes .../__pycache__/egg_info.cpython-310.pyc | Bin 22926 -> 0 bytes .../__pycache__/install.cpython-310.pyc | Bin 4317 -> 0 bytes .../install_egg_info.cpython-310.pyc | Bin 2491 -> 0 bytes .../__pycache__/install_lib.cpython-310.pyc | Bin 4203 -> 0 bytes .../install_scripts.cpython-310.pyc | Bin 2485 -> 0 bytes .../__pycache__/py36compat.cpython-310.pyc | Bin 4568 -> 0 bytes .../__pycache__/register.cpython-310.pyc | Bin 872 -> 0 bytes .../__pycache__/rotate.cpython-310.pyc | Bin 2539 -> 0 bytes .../__pycache__/saveopts.cpython-310.pyc | Bin 958 -> 0 bytes .../command/__pycache__/sdist.cpython-310.pyc | Bin 7016 -> 0 bytes .../__pycache__/setopt.cpython-310.pyc | Bin 4720 -> 0 bytes .../command/__pycache__/test.cpython-310.pyc | Bin 8262 -> 0 bytes .../__pycache__/upload.cpython-310.pyc | Bin 845 -> 0 bytes .../__pycache__/upload_docs.cpython-310.pyc | Bin 6435 -> 0 bytes .../site-packages/setuptools/command/alias.py | 78 - .../setuptools/command/bdist_egg.py | 457 - .../setuptools/command/bdist_rpm.py | 40 - .../site-packages/setuptools/command/build.py | 24 - .../setuptools/command/build_clib.py | 101 - .../setuptools/command/build_ext.py | 328 - .../setuptools/command/build_py.py | 298 - .../setuptools/command/develop.py | 193 - .../setuptools/command/dist_info.py | 69 - .../setuptools/command/easy_install.py | 2312 ----- .../setuptools/command/egg_info.py | 752 -- .../setuptools/command/install.py | 139 - .../setuptools/command/install_egg_info.py | 63 - .../setuptools/command/install_lib.py | 122 - .../setuptools/command/install_scripts.py | 70 - .../setuptools/command/launcher manifest.xml | 15 - .../setuptools/command/py36compat.py | 134 - .../setuptools/command/register.py | 18 - .../setuptools/command/rotate.py | 64 - .../setuptools/command/saveopts.py | 22 - .../site-packages/setuptools/command/sdist.py | 196 - .../setuptools/command/setopt.py | 149 - .../site-packages/setuptools/command/test.py | 251 - .../setuptools/command/upload.py | 17 - .../setuptools/command/upload_docs.py | 212 - .../setuptools/config/__init__.py | 35 - .../__pycache__/__init__.cpython-310.pyc | Bin 1474 -> 0 bytes .../_apply_pyprojecttoml.cpython-310.pyc | Bin 13557 -> 0 bytes .../config/__pycache__/expand.cpython-310.pyc | Bin 18124 -> 0 bytes .../__pycache__/pyprojecttoml.cpython-310.pyc | Bin 16187 -> 0 bytes .../__pycache__/setupcfg.cpython-310.pyc | Bin 19706 -> 0 bytes .../setuptools/config/_apply_pyprojecttoml.py | 377 - .../config/_validate_pyproject/__init__.py | 34 - .../__pycache__/__init__.cpython-310.pyc | Bin 1549 -> 0 bytes .../error_reporting.cpython-310.pyc | Bin 11610 -> 0 bytes .../extra_validations.cpython-310.pyc | Bin 1463 -> 0 bytes .../fastjsonschema_exceptions.cpython-310.pyc | Bin 2481 -> 0 bytes ...fastjsonschema_validations.cpython-310.pyc | Bin 68722 -> 0 bytes .../__pycache__/formats.cpython-310.pyc | Bin 8529 -> 0 bytes .../_validate_pyproject/error_reporting.py | 318 - .../_validate_pyproject/extra_validations.py | 36 - .../fastjsonschema_exceptions.py | 51 - .../fastjsonschema_validations.py | 1035 -- .../config/_validate_pyproject/formats.py | 257 - .../site-packages/setuptools/config/expand.py | 479 - .../setuptools/config/pyprojecttoml.py | 484 - .../setuptools/config/setupcfg.py | 713 -- .../Lib/site-packages/setuptools/dep_util.py | 25 - .../Lib/site-packages/setuptools/depends.py | 176 - .../Lib/site-packages/setuptools/discovery.py | 588 -- .../venv/Lib/site-packages/setuptools/dist.py | 1222 --- .../Lib/site-packages/setuptools/errors.py | 58 - .../Lib/site-packages/setuptools/extension.py | 140 - .../setuptools/extern/__init__.py | 76 - .../__pycache__/__init__.cpython-310.pyc | Bin 3048 -> 0 bytes .../venv/Lib/site-packages/setuptools/glob.py | 167 - .../Lib/site-packages/setuptools/gui-32.exe | Bin 65536 -> 0 bytes .../Lib/site-packages/setuptools/gui-64.exe | Bin 75264 -> 0 bytes .../site-packages/setuptools/gui-arm64.exe | Bin 137728 -> 0 bytes .../venv/Lib/site-packages/setuptools/gui.exe | Bin 65536 -> 0 bytes .../Lib/site-packages/setuptools/installer.py | 104 - .../Lib/site-packages/setuptools/launch.py | 36 - .../Lib/site-packages/setuptools/logging.py | 36 - .../Lib/site-packages/setuptools/monkey.py | 177 - .../venv/Lib/site-packages/setuptools/msvc.py | 1805 ---- .../site-packages/setuptools/namespaces.py | 107 - .../site-packages/setuptools/package_index.py | 1126 --- .../site-packages/setuptools/py34compat.py | 13 - .../Lib/site-packages/setuptools/sandbox.py | 530 - .../setuptools/script (dev).tmpl | 6 - .../Lib/site-packages/setuptools/script.tmpl | 3 - .../site-packages/setuptools/unicode_utils.py | 42 - .../Lib/site-packages/setuptools/version.py | 6 - .../Lib/site-packages/setuptools/wheel.py | 213 - .../setuptools/windows_support.py | 29 - .../sqlalchemy-2.0.41.dist-info/INSTALLER | 1 - .../sqlalchemy-2.0.41.dist-info/METADATA | 243 - .../sqlalchemy-2.0.41.dist-info/RECORD | 531 - .../sqlalchemy-2.0.41.dist-info/WHEEL | 5 - .../licenses/LICENSE | 19 - .../sqlalchemy-2.0.41.dist-info/top_level.txt | 1 - .../Lib/site-packages/sqlalchemy/__init__.py | 283 - .../__pycache__/__init__.cpython-310.pyc | Bin 9002 -> 0 bytes .../__pycache__/events.cpython-310.pyc | Bin 570 -> 0 bytes .../__pycache__/exc.cpython-310.pyc | Bin 24514 -> 0 bytes .../__pycache__/inspection.cpython-310.pyc | Bin 5897 -> 0 bytes .../__pycache__/log.cpython-310.pyc | Bin 8366 -> 0 bytes .../__pycache__/schema.cpython-310.pyc | Bin 2329 -> 0 bytes .../__pycache__/types.cpython-310.pyc | Bin 2239 -> 0 bytes .../sqlalchemy/connectors/__init__.py | 18 - .../__pycache__/__init__.cpython-310.pyc | Bin 596 -> 0 bytes .../__pycache__/aioodbc.cpython-310.pyc | Bin 5223 -> 0 bytes .../__pycache__/asyncio.cpython-310.pyc | Bin 7864 -> 0 bytes .../__pycache__/pyodbc.cpython-310.pyc | Bin 6798 -> 0 bytes .../sqlalchemy/connectors/aioodbc.py | 174 - .../sqlalchemy/connectors/asyncio.py | 213 - .../sqlalchemy/connectors/pyodbc.py | 247 - .../sqlalchemy/cyextension/__init__.py | 6 - .../__pycache__/__init__.cpython-310.pyc | Bin 221 -> 0 bytes .../collections.cp310-win_amd64.pyd | Bin 162304 -> 0 bytes .../sqlalchemy/cyextension/collections.pyx | 409 - .../immutabledict.cp310-win_amd64.pyd | Bin 70144 -> 0 bytes .../sqlalchemy/cyextension/immutabledict.pxd | 8 - .../sqlalchemy/cyextension/immutabledict.pyx | 133 - .../processors.cp310-win_amd64.pyd | Bin 57856 -> 0 bytes .../sqlalchemy/cyextension/processors.pyx | 68 - .../resultproxy.cp310-win_amd64.pyd | Bin 58880 -> 0 bytes .../sqlalchemy/cyextension/resultproxy.pyx | 102 - .../cyextension/util.cp310-win_amd64.pyd | Bin 70144 -> 0 bytes .../sqlalchemy/cyextension/util.pyx | 91 - .../sqlalchemy/dialects/__init__.py | 61 - .../__pycache__/__init__.cpython-310.pyc | Bin 1427 -> 0 bytes .../__pycache__/_typing.cpython-310.pyc | Bin 894 -> 0 bytes .../sqlalchemy/dialects/_typing.py | 30 - .../sqlalchemy/dialects/mssql/__init__.py | 88 - .../__pycache__/__init__.cpython-310.pyc | Bin 1600 -> 0 bytes .../mssql/__pycache__/aioodbc.cpython-310.pyc | Bin 2296 -> 0 bytes .../mssql/__pycache__/base.cpython-310.pyc | Bin 109575 -> 0 bytes .../information_schema.cpython-310.pyc | Bin 5776 -> 0 bytes .../mssql/__pycache__/json.cpython-310.pyc | Bin 4650 -> 0 bytes .../__pycache__/provision.cpython-310.pyc | Bin 4648 -> 0 bytes .../mssql/__pycache__/pymssql.cpython-310.pyc | Bin 4529 -> 0 bytes .../mssql/__pycache__/pyodbc.cpython-310.pyc | Bin 25691 -> 0 bytes .../sqlalchemy/dialects/mssql/aioodbc.py | 63 - .../sqlalchemy/dialects/mssql/base.py | 4055 -------- .../dialects/mssql/information_schema.py | 254 - .../sqlalchemy/dialects/mssql/json.py | 129 - .../sqlalchemy/dialects/mssql/provision.py | 162 - .../sqlalchemy/dialects/mssql/pymssql.py | 126 - .../sqlalchemy/dialects/mssql/pyodbc.py | 760 -- .../sqlalchemy/dialects/mysql/__init__.py | 104 - .../__pycache__/__init__.cpython-310.pyc | Bin 1919 -> 0 bytes .../__pycache__/aiomysql.cpython-310.pyc | Bin 11835 -> 0 bytes .../mysql/__pycache__/asyncmy.cpython-310.pyc | Bin 11702 -> 0 bytes .../mysql/__pycache__/base.cpython-310.pyc | Bin 103300 -> 0 bytes .../mysql/__pycache__/cymysql.cpython-310.pyc | Bin 2623 -> 0 bytes .../mysql/__pycache__/dml.cpython-310.pyc | Bin 7582 -> 0 bytes .../__pycache__/enumerated.cpython-310.pyc | Bin 8005 -> 0 bytes .../__pycache__/expression.cpython-310.pyc | Bin 3946 -> 0 bytes .../mysql/__pycache__/json.cpython-310.pyc | Bin 2870 -> 0 bytes .../mysql/__pycache__/mariadb.cpython-310.pyc | Bin 1967 -> 0 bytes .../mariadbconnector.cpython-310.pyc | Bin 8386 -> 0 bytes .../mysqlconnector.cpython-310.pyc | Bin 8980 -> 0 bytes .../mysql/__pycache__/mysqldb.cpython-310.pyc | Bin 8807 -> 0 bytes .../__pycache__/provision.cpython-310.pyc | Bin 2778 -> 0 bytes .../mysql/__pycache__/pymysql.cpython-310.pyc | Bin 4168 -> 0 bytes .../mysql/__pycache__/pyodbc.cpython-310.pyc | Bin 4303 -> 0 bytes .../__pycache__/reflection.cpython-310.pyc | Bin 15631 -> 0 bytes .../reserved_words.cpython-310.pyc | Bin 4372 -> 0 bytes .../mysql/__pycache__/types.cpython-310.pyc | Bin 25357 -> 0 bytes .../sqlalchemy/dialects/mysql/aiomysql.py | 335 - .../sqlalchemy/dialects/mysql/asyncmy.py | 339 - .../sqlalchemy/dialects/mysql/base.py | 3581 ------- .../sqlalchemy/dialects/mysql/cymysql.py | 84 - .../sqlalchemy/dialects/mysql/dml.py | 225 - .../sqlalchemy/dialects/mysql/enumerated.py | 243 - .../sqlalchemy/dialects/mysql/expression.py | 143 - .../sqlalchemy/dialects/mysql/json.py | 81 - .../sqlalchemy/dialects/mysql/mariadb.py | 67 - .../dialects/mysql/mariadbconnector.py | 277 - .../dialects/mysql/mysqlconnector.py | 253 - .../sqlalchemy/dialects/mysql/mysqldb.py | 305 - .../sqlalchemy/dialects/mysql/provision.py | 114 - .../sqlalchemy/dialects/mysql/pymysql.py | 136 - .../sqlalchemy/dialects/mysql/pyodbc.py | 139 - .../sqlalchemy/dialects/mysql/reflection.py | 677 -- .../dialects/mysql/reserved_words.py | 571 -- .../sqlalchemy/dialects/mysql/types.py | 773 -- .../sqlalchemy/dialects/oracle/__init__.py | 77 - .../__pycache__/__init__.cpython-310.pyc | Bin 1467 -> 0 bytes .../oracle/__pycache__/base.cpython-310.pyc | Bin 98817 -> 0 bytes .../__pycache__/cx_oracle.cpython-310.pyc | Bin 46744 -> 0 bytes .../__pycache__/dictionary.cpython-310.pyc | Bin 12204 -> 0 bytes .../__pycache__/oracledb.cpython-310.pyc | Bin 35638 -> 0 bytes .../__pycache__/provision.cpython-310.pyc | Bin 6761 -> 0 bytes .../oracle/__pycache__/types.cpython-310.pyc | Bin 10661 -> 0 bytes .../oracle/__pycache__/vector.cpython-310.pyc | Bin 7548 -> 0 bytes .../sqlalchemy/dialects/oracle/base.py | 3747 ------- .../sqlalchemy/dialects/oracle/cx_oracle.py | 1552 --- .../sqlalchemy/dialects/oracle/dictionary.py | 507 - .../sqlalchemy/dialects/oracle/oracledb.py | 947 -- .../sqlalchemy/dialects/oracle/provision.py | 220 - .../sqlalchemy/dialects/oracle/types.py | 316 - .../sqlalchemy/dialects/oracle/vector.py | 266 - .../dialects/postgresql/__init__.py | 167 - .../__pycache__/__init__.cpython-310.pyc | Bin 3272 -> 0 bytes .../_psycopg_common.cpython-310.pyc | Bin 5701 -> 0 bytes .../__pycache__/array.cpython-310.pyc | Bin 15948 -> 0 bytes .../__pycache__/asyncpg.cpython-310.pyc | Bin 40523 -> 0 bytes .../__pycache__/base.cpython-310.pyc | Bin 139227 -> 0 bytes .../__pycache__/dml.cpython-310.pyc | Bin 10684 -> 0 bytes .../__pycache__/ext.cpython-310.pyc | Bin 16914 -> 0 bytes .../__pycache__/hstore.cpython-310.pyc | Bin 12008 -> 0 bytes .../__pycache__/json.cpython-310.pyc | Bin 12984 -> 0 bytes .../__pycache__/named_types.cpython-310.pyc | Bin 18140 -> 0 bytes .../__pycache__/operators.cpython-310.pyc | Bin 1263 -> 0 bytes .../__pycache__/pg8000.cpython-310.pyc | Bin 21080 -> 0 bytes .../__pycache__/pg_catalog.cpython-310.pyc | Bin 7570 -> 0 bytes .../__pycache__/provision.cpython-310.pyc | Bin 5004 -> 0 bytes .../__pycache__/psycopg.cpython-310.pyc | Bin 26228 -> 0 bytes .../__pycache__/psycopg2.cpython-310.pyc | Bin 30849 -> 0 bytes .../__pycache__/psycopg2cffi.cpython-310.pyc | Bin 1859 -> 0 bytes .../__pycache__/ranges.cpython-310.pyc | Bin 23910 -> 0 bytes .../__pycache__/types.cpython-310.pyc | Bin 9531 -> 0 bytes .../dialects/postgresql/_psycopg_common.py | 186 - .../sqlalchemy/dialects/postgresql/array.py | 509 - .../sqlalchemy/dialects/postgresql/asyncpg.py | 1287 --- .../sqlalchemy/dialects/postgresql/base.py | 5175 ---------- .../sqlalchemy/dialects/postgresql/dml.py | 339 - .../sqlalchemy/dialects/postgresql/ext.py | 536 - .../sqlalchemy/dialects/postgresql/hstore.py | 406 - .../sqlalchemy/dialects/postgresql/json.py | 367 - .../dialects/postgresql/named_types.py | 538 - .../dialects/postgresql/operators.py | 129 - .../sqlalchemy/dialects/postgresql/pg8000.py | 666 -- .../dialects/postgresql/pg_catalog.py | 312 - .../dialects/postgresql/provision.py | 175 - .../sqlalchemy/dialects/postgresql/psycopg.py | 783 -- .../dialects/postgresql/psycopg2.py | 892 -- .../dialects/postgresql/psycopg2cffi.py | 61 - .../sqlalchemy/dialects/postgresql/ranges.py | 1031 -- .../sqlalchemy/dialects/postgresql/types.py | 313 - .../sqlalchemy/dialects/sqlite/__init__.py | 57 - .../__pycache__/__init__.cpython-310.pyc | Bin 1010 -> 0 bytes .../__pycache__/aiosqlite.cpython-310.pyc | Bin 12666 -> 0 bytes .../sqlite/__pycache__/base.cpython-310.pyc | Bin 82056 -> 0 bytes .../sqlite/__pycache__/dml.cpython-310.pyc | Bin 9008 -> 0 bytes .../sqlite/__pycache__/json.cpython-310.pyc | Bin 3201 -> 0 bytes .../__pycache__/provision.cpython-310.pyc | Bin 4753 -> 0 bytes .../__pycache__/pysqlcipher.cpython-310.pyc | Bin 5497 -> 0 bytes .../__pycache__/pysqlite.cpython-310.pyc | Bin 25407 -> 0 bytes .../sqlalchemy/dialects/sqlite/aiosqlite.py | 398 - .../sqlalchemy/dialects/sqlite/base.py | 2945 ------ .../sqlalchemy/dialects/sqlite/dml.py | 263 - .../sqlalchemy/dialects/sqlite/json.py | 92 - .../sqlalchemy/dialects/sqlite/provision.py | 196 - .../sqlalchemy/dialects/sqlite/pysqlcipher.py | 157 - .../sqlalchemy/dialects/sqlite/pysqlite.py | 705 -- .../dialects/type_migration_guidelines.txt | 145 - .../sqlalchemy/engine/__init__.py | 62 - .../__pycache__/__init__.cpython-310.pyc | Bin 2248 -> 0 bytes .../_py_processors.cpython-310.pyc | Bin 3447 -> 0 bytes .../__pycache__/_py_row.cpython-310.pyc | Bin 4282 -> 0 bytes .../__pycache__/_py_util.cpython-310.pyc | Bin 1555 -> 0 bytes .../engine/__pycache__/base.cpython-310.pyc | Bin 97650 -> 0 bytes .../characteristics.cpython-310.pyc | Bin 5712 -> 0 bytes .../engine/__pycache__/create.cpython-310.pyc | Bin 29754 -> 0 bytes .../engine/__pycache__/cursor.cpython-310.pyc | Bin 61199 -> 0 bytes .../__pycache__/default.cpython-310.pyc | Bin 59728 -> 0 bytes .../engine/__pycache__/events.cpython-310.pyc | Bin 37564 -> 0 bytes .../__pycache__/interfaces.cpython-310.pyc | Bin 91968 -> 0 bytes .../engine/__pycache__/mock.cpython-310.pyc | Bin 4959 -> 0 bytes .../__pycache__/processors.cpython-310.pyc | Bin 1184 -> 0 bytes .../__pycache__/reflection.cpython-310.pyc | Bin 61547 -> 0 bytes .../engine/__pycache__/result.cpython-310.pyc | Bin 75282 -> 0 bytes .../engine/__pycache__/row.cpython-310.pyc | Bin 14909 -> 0 bytes .../__pycache__/strategies.cpython-310.pyc | Bin 556 -> 0 bytes .../engine/__pycache__/url.cpython-310.pyc | Bin 27320 -> 0 bytes .../engine/__pycache__/util.cpython-310.pyc | Bin 5126 -> 0 bytes .../sqlalchemy/engine/_py_processors.py | 136 - .../sqlalchemy/engine/_py_row.py | 128 - .../sqlalchemy/engine/_py_util.py | 74 - .../site-packages/sqlalchemy/engine/base.py | 3370 ------- .../sqlalchemy/engine/characteristics.py | 155 - .../site-packages/sqlalchemy/engine/create.py | 878 -- .../site-packages/sqlalchemy/engine/cursor.py | 2181 ----- .../sqlalchemy/engine/default.py | 2380 ----- .../site-packages/sqlalchemy/engine/events.py | 965 -- .../sqlalchemy/engine/interfaces.py | 3413 ------- .../site-packages/sqlalchemy/engine/mock.py | 134 - .../sqlalchemy/engine/processors.py | 61 - .../sqlalchemy/engine/reflection.py | 2102 ---- .../site-packages/sqlalchemy/engine/result.py | 2387 ----- .../site-packages/sqlalchemy/engine/row.py | 400 - .../sqlalchemy/engine/strategies.py | 19 - .../site-packages/sqlalchemy/engine/url.py | 924 -- .../site-packages/sqlalchemy/engine/util.py | 167 - .../sqlalchemy/event/__init__.py | 25 - .../__pycache__/__init__.cpython-310.pyc | Bin 842 -> 0 bytes .../event/__pycache__/api.cpython-310.pyc | Bin 8475 -> 0 bytes .../event/__pycache__/attr.cpython-310.pyc | Bin 23170 -> 0 bytes .../event/__pycache__/base.cpython-310.pyc | Bin 15040 -> 0 bytes .../event/__pycache__/legacy.cpython-310.pyc | Bin 7008 -> 0 bytes .../__pycache__/registry.cpython-310.pyc | Bin 8268 -> 0 bytes .../Lib/site-packages/sqlalchemy/event/api.py | 222 - .../site-packages/sqlalchemy/event/attr.py | 655 -- .../site-packages/sqlalchemy/event/base.py | 472 - .../site-packages/sqlalchemy/event/legacy.py | 246 - .../sqlalchemy/event/registry.py | 390 - .../Lib/site-packages/sqlalchemy/events.py | 17 - .../venv/Lib/site-packages/sqlalchemy/exc.py | 832 -- .../site-packages/sqlalchemy/ext/__init__.py | 11 - .../ext/__pycache__/__init__.cpython-310.pyc | Bin 308 -> 0 bytes .../associationproxy.cpython-310.pyc | Bin 63801 -> 0 bytes .../ext/__pycache__/automap.cpython-310.pyc | Bin 50712 -> 0 bytes .../ext/__pycache__/baked.cpython-310.pyc | Bin 17043 -> 0 bytes .../ext/__pycache__/compiler.cpython-310.pyc | Bin 20139 -> 0 bytes .../horizontal_shard.cpython-310.pyc | Bin 14324 -> 0 bytes .../ext/__pycache__/hybrid.cpython-310.pyc | Bin 54881 -> 0 bytes .../ext/__pycache__/indexable.cpython-310.pyc | Bin 10807 -> 0 bytes .../instrumentation.cpython-310.pyc | Bin 14593 -> 0 bytes .../ext/__pycache__/mutable.cpython-310.pyc | Bin 38956 -> 0 bytes .../__pycache__/orderinglist.cpython-310.pyc | Bin 14857 -> 0 bytes .../__pycache__/serializer.cpython-310.pyc | Bin 5565 -> 0 bytes .../sqlalchemy/ext/associationproxy.py | 2013 ---- .../sqlalchemy/ext/asyncio/__init__.py | 25 - .../__pycache__/__init__.cpython-310.pyc | Bin 976 -> 0 bytes .../asyncio/__pycache__/base.cpython-310.pyc | Bin 8463 -> 0 bytes .../__pycache__/engine.cpython-310.pyc | Bin 45822 -> 0 bytes .../asyncio/__pycache__/exc.cpython-310.pyc | Bin 886 -> 0 bytes .../__pycache__/result.cpython-310.pyc | Bin 31379 -> 0 bytes .../__pycache__/scoping.cpython-310.pyc | Bin 48523 -> 0 bytes .../__pycache__/session.cpython-310.pyc | Bin 59861 -> 0 bytes .../sqlalchemy/ext/asyncio/base.py | 281 - .../sqlalchemy/ext/asyncio/engine.py | 1469 --- .../sqlalchemy/ext/asyncio/exc.py | 21 - .../sqlalchemy/ext/asyncio/result.py | 962 -- .../sqlalchemy/ext/asyncio/scoping.py | 1613 --- .../sqlalchemy/ext/asyncio/session.py | 1961 ---- .../site-packages/sqlalchemy/ext/automap.py | 1701 ---- .../Lib/site-packages/sqlalchemy/ext/baked.py | 570 -- .../site-packages/sqlalchemy/ext/compiler.py | 600 -- .../sqlalchemy/ext/declarative/__init__.py | 65 - .../__pycache__/__init__.cpython-310.pyc | Bin 1632 -> 0 bytes .../__pycache__/extensions.cpython-310.pyc | Bin 17168 -> 0 bytes .../sqlalchemy/ext/declarative/extensions.py | 564 -- .../sqlalchemy/ext/horizontal_shard.py | 478 - .../site-packages/sqlalchemy/ext/hybrid.py | 1533 --- .../site-packages/sqlalchemy/ext/indexable.py | 345 - .../sqlalchemy/ext/instrumentation.py | 450 - .../site-packages/sqlalchemy/ext/mutable.py | 1095 --- .../sqlalchemy/ext/mypy/__init__.py | 6 - .../mypy/__pycache__/__init__.cpython-310.pyc | Bin 218 -> 0 bytes .../mypy/__pycache__/apply.cpython-310.pyc | Bin 6316 -> 0 bytes .../__pycache__/decl_class.cpython-310.pyc | Bin 8306 -> 0 bytes .../mypy/__pycache__/infer.cpython-310.pyc | Bin 9342 -> 0 bytes .../mypy/__pycache__/names.cpython-310.pyc | Bin 7189 -> 0 bytes .../mypy/__pycache__/plugin.cpython-310.pyc | Bin 7900 -> 0 bytes .../ext/mypy/__pycache__/util.cpython-310.pyc | Bin 10020 -> 0 bytes .../sqlalchemy/ext/mypy/apply.py | 324 - .../sqlalchemy/ext/mypy/decl_class.py | 515 - .../sqlalchemy/ext/mypy/infer.py | 590 -- .../sqlalchemy/ext/mypy/names.py | 335 - .../sqlalchemy/ext/mypy/plugin.py | 303 - .../site-packages/sqlalchemy/ext/mypy/util.py | 357 - .../sqlalchemy/ext/orderinglist.py | 427 - .../sqlalchemy/ext/serializer.py | 185 - .../sqlalchemy/future/__init__.py | 16 - .../__pycache__/__init__.cpython-310.pyc | Bin 475 -> 0 bytes .../future/__pycache__/engine.cpython-310.pyc | Bin 409 -> 0 bytes .../site-packages/sqlalchemy/future/engine.py | 15 - .../site-packages/sqlalchemy/inspection.py | 174 - .../venv/Lib/site-packages/sqlalchemy/log.py | 288 - .../site-packages/sqlalchemy/orm/__init__.py | 170 - .../orm/__pycache__/__init__.cpython-310.pyc | Bin 6066 -> 0 bytes .../_orm_constructors.cpython-310.pyc | Bin 98574 -> 0 bytes .../orm/__pycache__/_typing.cpython-310.pyc | Bin 5746 -> 0 bytes .../__pycache__/attributes.cpython-310.pyc | Bin 67884 -> 0 bytes .../orm/__pycache__/base.cpython-310.pyc | Bin 25241 -> 0 bytes .../bulk_persistence.cpython-310.pyc | Bin 42301 -> 0 bytes .../__pycache__/clsregistry.cpython-310.pyc | Bin 16488 -> 0 bytes .../__pycache__/collections.cpython-310.pyc | Bin 45933 -> 0 bytes .../orm/__pycache__/context.cpython-310.pyc | Bin 63757 -> 0 bytes .../orm/__pycache__/decl_api.cpython-310.pyc | Bin 57111 -> 0 bytes .../orm/__pycache__/decl_base.cpython-310.pyc | Bin 45200 -> 0 bytes .../__pycache__/dependency.cpython-310.pyc | Bin 23765 -> 0 bytes .../descriptor_props.cpython-310.pyc | Bin 33858 -> 0 bytes .../orm/__pycache__/dynamic.cpython-310.pyc | Bin 9502 -> 0 bytes .../orm/__pycache__/evaluator.cpython-310.pyc | Bin 12226 -> 0 bytes .../orm/__pycache__/events.cpython-310.pyc | Bin 127123 -> 0 bytes .../orm/__pycache__/exc.cpython-310.pyc | Bin 8054 -> 0 bytes .../orm/__pycache__/identity.cpython-310.pyc | Bin 9244 -> 0 bytes .../instrumentation.cpython-310.pyc | Bin 22700 -> 0 bytes .../__pycache__/interfaces.cpython-310.pyc | Bin 46102 -> 0 bytes .../orm/__pycache__/loading.cpython-310.pyc | Bin 29759 -> 0 bytes .../mapped_collection.cpython-310.pyc | Bin 18267 -> 0 bytes .../orm/__pycache__/mapper.cpython-310.pyc | Bin 119464 -> 0 bytes .../__pycache__/path_registry.cpython-310.pyc | Bin 22178 -> 0 bytes .../__pycache__/persistence.cpython-310.pyc | Bin 27699 -> 0 bytes .../__pycache__/properties.cpython-310.pyc | Bin 22283 -> 0 bytes .../orm/__pycache__/query.cpython-310.pyc | Bin 106456 -> 0 bytes .../__pycache__/relationships.cpython-310.pyc | Bin 86669 -> 0 bytes .../orm/__pycache__/scoping.cpython-310.pyc | Bin 75641 -> 0 bytes .../orm/__pycache__/session.cpython-310.pyc | Bin 156985 -> 0 bytes .../orm/__pycache__/state.cpython-310.pyc | Bin 33387 -> 0 bytes .../__pycache__/state_changes.cpython-310.pyc | Bin 5007 -> 0 bytes .../__pycache__/strategies.cpython-310.pyc | Bin 60476 -> 0 bytes .../strategy_options.cpython-310.pyc | Bin 64541 -> 0 bytes .../orm/__pycache__/sync.cpython-310.pyc | Bin 4018 -> 0 bytes .../__pycache__/unitofwork.cpython-310.pyc | Bin 21181 -> 0 bytes .../orm/__pycache__/util.cpython-310.pyc | Bin 61287 -> 0 bytes .../orm/__pycache__/writeonly.cpython-310.pyc | Bin 19651 -> 0 bytes .../sqlalchemy/orm/_orm_constructors.py | 2590 ----- .../site-packages/sqlalchemy/orm/_typing.py | 179 - .../sqlalchemy/orm/attributes.py | 2835 ------ .../Lib/site-packages/sqlalchemy/orm/base.py | 973 -- .../sqlalchemy/orm/bulk_persistence.py | 2123 ---- .../sqlalchemy/orm/clsregistry.py | 571 -- .../sqlalchemy/orm/collections.py | 1627 --- .../site-packages/sqlalchemy/orm/context.py | 3334 ------- .../site-packages/sqlalchemy/orm/decl_api.py | 1917 ---- .../site-packages/sqlalchemy/orm/decl_base.py | 2186 ----- .../sqlalchemy/orm/dependency.py | 1304 --- .../sqlalchemy/orm/descriptor_props.py | 1077 -- .../site-packages/sqlalchemy/orm/dynamic.py | 300 - .../site-packages/sqlalchemy/orm/evaluator.py | 379 - .../site-packages/sqlalchemy/orm/events.py | 3271 ------- .../Lib/site-packages/sqlalchemy/orm/exc.py | 237 - .../site-packages/sqlalchemy/orm/identity.py | 302 - .../sqlalchemy/orm/instrumentation.py | 754 -- .../sqlalchemy/orm/interfaces.py | 1490 --- .../site-packages/sqlalchemy/orm/loading.py | 1682 ---- .../sqlalchemy/orm/mapped_collection.py | 557 -- .../site-packages/sqlalchemy/orm/mapper.py | 4431 --------- .../sqlalchemy/orm/path_registry.py | 811 -- .../sqlalchemy/orm/persistence.py | 1782 ---- .../sqlalchemy/orm/properties.py | 884 -- .../Lib/site-packages/sqlalchemy/orm/query.py | 3453 ------- .../sqlalchemy/orm/relationships.py | 3509 ------- .../site-packages/sqlalchemy/orm/scoping.py | 2162 ---- .../site-packages/sqlalchemy/orm/session.py | 5294 ---------- .../Lib/site-packages/sqlalchemy/orm/state.py | 1143 --- .../sqlalchemy/orm/state_changes.py | 198 - .../sqlalchemy/orm/strategies.py | 3470 ------- .../sqlalchemy/orm/strategy_options.py | 2549 ----- .../Lib/site-packages/sqlalchemy/orm/sync.py | 164 - .../sqlalchemy/orm/unitofwork.py | 796 -- .../Lib/site-packages/sqlalchemy/orm/util.py | 2403 ----- .../site-packages/sqlalchemy/orm/writeonly.py | 678 -- .../site-packages/sqlalchemy/pool/__init__.py | 44 - .../pool/__pycache__/__init__.cpython-310.pyc | Bin 1503 -> 0 bytes .../pool/__pycache__/base.cpython-310.pyc | Bin 41217 -> 0 bytes .../pool/__pycache__/events.cpython-310.pyc | Bin 13159 -> 0 bytes .../pool/__pycache__/impl.cpython-310.pyc | Bin 18824 -> 0 bytes .../Lib/site-packages/sqlalchemy/pool/base.py | 1516 --- .../site-packages/sqlalchemy/pool/events.py | 372 - .../Lib/site-packages/sqlalchemy/pool/impl.py | 581 -- .../Lib/site-packages/sqlalchemy/py.typed | 0 .../Lib/site-packages/sqlalchemy/schema.py | 71 - .../site-packages/sqlalchemy/sql/__init__.py | 145 - .../sql/__pycache__/__init__.cpython-310.pyc | Bin 4286 -> 0 bytes .../_dml_constructors.cpython-310.pyc | Bin 3941 -> 0 bytes .../_elements_constructors.cpython-310.pyc | Bin 63661 -> 0 bytes .../__pycache__/_orm_types.cpython-310.pyc | Bin 617 -> 0 bytes .../sql/__pycache__/_py_util.cpython-310.pyc | Bin 2504 -> 0 bytes .../_selectable_constructors.cpython-310.pyc | Bin 20363 -> 0 bytes .../sql/__pycache__/_typing.cpython-310.pyc | Bin 12245 -> 0 bytes .../__pycache__/annotation.cpython-310.pyc | Bin 15068 -> 0 bytes .../sql/__pycache__/base.cpython-310.pyc | Bin 76732 -> 0 bytes .../sql/__pycache__/cache_key.cpython-310.pyc | Bin 25532 -> 0 bytes .../sql/__pycache__/coercions.cpython-310.pyc | Bin 34213 -> 0 bytes .../sql/__pycache__/compiler.cpython-310.pyc | Bin 177440 -> 0 bytes .../sql/__pycache__/crud.cpython-310.pyc | Bin 26491 -> 0 bytes .../sql/__pycache__/ddl.cpython-310.pyc | Bin 45923 -> 0 bytes .../default_comparator.cpython-310.pyc | Bin 10370 -> 0 bytes .../sql/__pycache__/dml.cpython-310.pyc | Bin 61132 -> 0 bytes .../sql/__pycache__/elements.cpython-310.pyc | Bin 158381 -> 0 bytes .../sql/__pycache__/events.cpython-310.pyc | Bin 18879 -> 0 bytes .../__pycache__/expression.cpython-310.pyc | Bin 5010 -> 0 bytes .../sql/__pycache__/functions.cpython-310.pyc | Bin 64068 -> 0 bytes .../sql/__pycache__/lambdas.cpython-310.pyc | Bin 38623 -> 0 bytes .../sql/__pycache__/naming.cpython-310.pyc | Bin 5302 -> 0 bytes .../sql/__pycache__/operators.cpython-310.pyc | Bin 75780 -> 0 bytes .../sql/__pycache__/roles.cpython-310.pyc | Bin 10168 -> 0 bytes .../sql/__pycache__/schema.cpython-310.pyc | Bin 195826 -> 0 bytes .../__pycache__/selectable.cpython-310.pyc | Bin 210044 -> 0 bytes .../sql/__pycache__/sqltypes.cpython-310.pyc | Bin 121388 -> 0 bytes .../__pycache__/traversals.cpython-310.pyc | Bin 31153 -> 0 bytes .../sql/__pycache__/type_api.cpython-310.pyc | Bin 72761 -> 0 bytes .../sql/__pycache__/util.cpython-310.pyc | Bin 37067 -> 0 bytes .../sql/__pycache__/visitors.cpython-310.pyc | Bin 29767 -> 0 bytes .../sqlalchemy/sql/_dml_constructors.py | 132 - .../sqlalchemy/sql/_elements_constructors.py | 1872 ---- .../sqlalchemy/sql/_orm_types.py | 20 - .../site-packages/sqlalchemy/sql/_py_util.py | 75 - .../sql/_selectable_constructors.py | 715 -- .../site-packages/sqlalchemy/sql/_typing.py | 468 - .../sqlalchemy/sql/annotation.py | 585 -- .../Lib/site-packages/sqlalchemy/sql/base.py | 2197 ----- .../site-packages/sqlalchemy/sql/cache_key.py | 1057 -- .../site-packages/sqlalchemy/sql/coercions.py | 1403 --- .../site-packages/sqlalchemy/sql/compiler.py | 7946 --------------- .../Lib/site-packages/sqlalchemy/sql/crud.py | 1678 ---- .../Lib/site-packages/sqlalchemy/sql/ddl.py | 1442 --- .../sqlalchemy/sql/default_comparator.py | 552 -- .../Lib/site-packages/sqlalchemy/sql/dml.py | 1837 ---- .../site-packages/sqlalchemy/sql/elements.py | 5544 ----------- .../site-packages/sqlalchemy/sql/events.py | 458 - .../sqlalchemy/sql/expression.py | 162 - .../site-packages/sqlalchemy/sql/functions.py | 2106 ---- .../site-packages/sqlalchemy/sql/lambdas.py | 1440 --- .../site-packages/sqlalchemy/sql/naming.py | 212 - .../site-packages/sqlalchemy/sql/operators.py | 2623 ----- .../Lib/site-packages/sqlalchemy/sql/roles.py | 323 - .../site-packages/sqlalchemy/sql/schema.py | 6218 ------------ .../sqlalchemy/sql/selectable.py | 7193 -------------- .../site-packages/sqlalchemy/sql/sqltypes.py | 3921 -------- .../sqlalchemy/sql/traversals.py | 1024 -- .../site-packages/sqlalchemy/sql/type_api.py | 2362 ----- .../Lib/site-packages/sqlalchemy/sql/util.py | 1487 --- .../site-packages/sqlalchemy/sql/visitors.py | 1167 --- .../sqlalchemy/testing/__init__.py | 96 - .../__pycache__/__init__.cpython-310.pyc | Bin 3212 -> 0 bytes .../__pycache__/assertions.cpython-310.pyc | Bin 29077 -> 0 bytes .../__pycache__/assertsql.cpython-310.pyc | Bin 13074 -> 0 bytes .../__pycache__/asyncio.cpython-310.pyc | Bin 3281 -> 0 bytes .../__pycache__/config.cpython-310.pyc | Bin 14022 -> 0 bytes .../__pycache__/engines.cpython-310.pyc | Bin 13882 -> 0 bytes .../__pycache__/entities.cpython-310.pyc | Bin 2965 -> 0 bytes .../__pycache__/exclusions.cpython-310.pyc | Bin 13828 -> 0 bytes .../__pycache__/pickleable.cpython-310.pyc | Bin 5167 -> 0 bytes .../__pycache__/profiling.cpython-310.pyc | Bin 8232 -> 0 bytes .../__pycache__/provision.cpython-310.pyc | Bin 13626 -> 0 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 70773 -> 0 bytes .../__pycache__/schema.cpython-310.pyc | Bin 6386 -> 0 bytes .../testing/__pycache__/util.cpython-310.pyc | Bin 15182 -> 0 bytes .../__pycache__/warnings.cpython-310.pyc | Bin 1702 -> 0 bytes .../sqlalchemy/testing/assertions.py | 989 -- .../sqlalchemy/testing/assertsql.py | 516 - .../sqlalchemy/testing/asyncio.py | 135 - .../sqlalchemy/testing/config.py | 423 - .../sqlalchemy/testing/engines.py | 474 - .../sqlalchemy/testing/entities.py | 117 - .../sqlalchemy/testing/exclusions.py | 435 - .../sqlalchemy/testing/fixtures/__init__.py | 28 - .../__pycache__/__init__.cpython-310.pyc | Bin 905 -> 0 bytes .../fixtures/__pycache__/base.cpython-310.pyc | Bin 7802 -> 0 bytes .../fixtures/__pycache__/mypy.cpython-310.pyc | Bin 8072 -> 0 bytes .../fixtures/__pycache__/orm.cpython-310.pyc | Bin 7794 -> 0 bytes .../fixtures/__pycache__/sql.cpython-310.pyc | Bin 13280 -> 0 bytes .../sqlalchemy/testing/fixtures/base.py | 366 - .../sqlalchemy/testing/fixtures/mypy.py | 332 - .../sqlalchemy/testing/fixtures/orm.py | 227 - .../sqlalchemy/testing/fixtures/sql.py | 503 - .../sqlalchemy/testing/pickleable.py | 155 - .../sqlalchemy/testing/plugin/__init__.py | 6 - .../__pycache__/__init__.cpython-310.pyc | Bin 224 -> 0 bytes .../__pycache__/bootstrap.cpython-310.pyc | Bin 1568 -> 0 bytes .../__pycache__/plugin_base.cpython-310.pyc | Bin 18682 -> 0 bytes .../__pycache__/pytestplugin.cpython-310.pyc | Bin 20766 -> 0 bytes .../sqlalchemy/testing/plugin/bootstrap.py | 51 - .../sqlalchemy/testing/plugin/plugin_base.py | 779 -- .../sqlalchemy/testing/plugin/pytestplugin.py | 867 -- .../sqlalchemy/testing/profiling.py | 324 - .../sqlalchemy/testing/provision.py | 502 - .../sqlalchemy/testing/requirements.py | 1893 ---- .../sqlalchemy/testing/schema.py | 224 - .../sqlalchemy/testing/suite/__init__.py | 19 - .../__pycache__/__init__.cpython-310.pyc | Bin 548 -> 0 bytes .../__pycache__/test_cte.cpython-310.pyc | Bin 4575 -> 0 bytes .../__pycache__/test_ddl.cpython-310.pyc | Bin 11100 -> 0 bytes .../test_deprecations.cpython-310.pyc | Bin 4454 -> 0 bytes .../__pycache__/test_dialect.cpython-310.pyc | Bin 19714 -> 0 bytes .../__pycache__/test_insert.cpython-310.pyc | Bin 13361 -> 0 bytes .../test_reflection.cpython-310.pyc | Bin 79439 -> 0 bytes .../__pycache__/test_results.cpython-310.pyc | Bin 13269 -> 0 bytes .../__pycache__/test_rowcount.cpython-310.pyc | Bin 5907 -> 0 bytes .../__pycache__/test_select.cpython-310.pyc | Bin 58170 -> 0 bytes .../__pycache__/test_sequence.cpython-310.pyc | Bin 8626 -> 0 bytes .../__pycache__/test_types.cpython-310.pyc | Bin 56184 -> 0 bytes .../test_unicode_ddl.cpython-310.pyc | Bin 3751 -> 0 bytes .../test_update_delete.cpython-310.pyc | Bin 3565 -> 0 bytes .../sqlalchemy/testing/suite/test_cte.py | 211 - .../sqlalchemy/testing/suite/test_ddl.py | 389 - .../testing/suite/test_deprecations.py | 153 - .../sqlalchemy/testing/suite/test_dialect.py | 740 -- .../sqlalchemy/testing/suite/test_insert.py | 630 -- .../testing/suite/test_reflection.py | 3275 ------- .../sqlalchemy/testing/suite/test_results.py | 504 - .../sqlalchemy/testing/suite/test_rowcount.py | 258 - .../sqlalchemy/testing/suite/test_select.py | 2008 ---- .../sqlalchemy/testing/suite/test_sequence.py | 317 - .../sqlalchemy/testing/suite/test_types.py | 2145 ---- .../testing/suite/test_unicode_ddl.py | 189 - .../testing/suite/test_update_delete.py | 139 - .../site-packages/sqlalchemy/testing/util.py | 538 - .../sqlalchemy/testing/warnings.py | 52 - .../Lib/site-packages/sqlalchemy/types.py | 76 - .../site-packages/sqlalchemy/util/__init__.py | 160 - .../util/__pycache__/__init__.cpython-310.pyc | Bin 5530 -> 0 bytes .../__pycache__/_collections.cpython-310.pyc | Bin 24864 -> 0 bytes .../_concurrency_py3k.cpython-310.pyc | Bin 8391 -> 0 bytes .../util/__pycache__/_has_cy.cpython-310.pyc | Bin 912 -> 0 bytes .../_py_collections.cpython-310.pyc | Bin 20716 -> 0 bytes .../util/__pycache__/compat.cpython-310.pyc | Bin 8568 -> 0 bytes .../__pycache__/concurrency.cpython-310.pyc | Bin 3213 -> 0 bytes .../__pycache__/deprecations.cpython-310.pyc | Bin 9779 -> 0 bytes .../__pycache__/langhelpers.cpython-310.pyc | Bin 62713 -> 0 bytes .../__pycache__/preloaded.cpython-310.pyc | Bin 5179 -> 0 bytes .../util/__pycache__/queue.cpython-310.pyc | Bin 10434 -> 0 bytes .../__pycache__/tool_support.cpython-310.pyc | Bin 5633 -> 0 bytes .../__pycache__/topological.cpython-310.pyc | Bin 2987 -> 0 bytes .../util/__pycache__/typing.cpython-310.pyc | Bin 19472 -> 0 bytes .../sqlalchemy/util/_collections.py | 717 -- .../sqlalchemy/util/_concurrency_py3k.py | 288 - .../site-packages/sqlalchemy/util/_has_cy.py | 40 - .../sqlalchemy/util/_py_collections.py | 541 - .../site-packages/sqlalchemy/util/compat.py | 303 - .../sqlalchemy/util/concurrency.py | 108 - .../sqlalchemy/util/deprecations.py | 401 - .../sqlalchemy/util/langhelpers.py | 2303 ----- .../sqlalchemy/util/preloaded.py | 150 - .../site-packages/sqlalchemy/util/queue.py | 322 - .../sqlalchemy/util/tool_support.py | 201 - .../sqlalchemy/util/topological.py | 120 - .../site-packages/sqlalchemy/util/typing.py | 733 -- .../INSTALLER | 1 - .../METADATA | 68 - .../typing_extensions-4.13.2.dist-info/RECORD | 7 - .../typing_extensions-4.13.2.dist-info/WHEEL | 4 - .../licenses/LICENSE | 279 - .../Lib/site-packages/typing_extensions.py | 4584 --------- blog-app/venv/Scripts/Activate.ps1 | 473 - blog-app/venv/Scripts/activate | 69 - blog-app/venv/Scripts/activate.bat | 34 - blog-app/venv/Scripts/deactivate.bat | 22 - blog-app/venv/Scripts/pip.exe | Bin 108453 -> 0 bytes blog-app/venv/Scripts/pip3.10.exe | Bin 108453 -> 0 bytes blog-app/venv/Scripts/pip3.exe | Bin 108453 -> 0 bytes blog-app/venv/Scripts/python.exe | Bin 266664 -> 0 bytes blog-app/venv/Scripts/pythonw.exe | Bin 254888 -> 0 bytes blog-app/venv/pyvenv.cfg | 3 - 2061 files changed, 491357 deletions(-) delete mode 100644 blog-app/__pycache__/wsgi.cpython-310.pyc delete mode 100644 blog-app/blogapp/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/blogapp/__pycache__/forms.cpython-310.pyc delete mode 100644 blog-app/blogapp/__pycache__/models.cpython-310.pyc delete mode 100644 blog-app/blogapp/__pycache__/routes.cpython-310.pyc delete mode 100644 blog-app/venv/Include/site/python3.10/greenlet/greenlet.h delete mode 100644 blog-app/venv/Lib/site-packages/__pycache__/typing_extensions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/_distutils_hack/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/_distutils_hack/override.py delete mode 100644 blog-app/venv/Lib/site-packages/distutils-precedence.pth delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/REQUESTED delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/cli.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/extension.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/model.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/pagination.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/query.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/record_queries.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/session.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/table.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/track_modifications.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/cli.py delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/extension.py delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/model.py delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/pagination.py delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/query.py delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/record_queries.py delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/session.py delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/table.py delete mode 100644 blog-app/venv/Lib/site-packages/flask_sqlalchemy/track_modifications.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/INSTALLER delete mode 100644 blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/METADATA delete mode 100644 blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/RECORD delete mode 100644 blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/WHEEL delete mode 100644 blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/licenses/LICENSE delete mode 100644 blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/licenses/LICENSE.PSF delete mode 100644 blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/top_level.txt delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/CObjects.cpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/PyGreenlet.cpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/PyGreenlet.hpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/PyGreenletUnswitchable.cpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/PyModule.cpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/TBrokenGreenlet.cpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/TExceptionState.cpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/TGreenlet.cpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/TGreenlet.hpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/TGreenletGlobals.cpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/TMainGreenlet.cpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/TPythonState.cpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/TStackState.cpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/TThreadState.hpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/TThreadStateCreator.hpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/TThreadStateDestroy.cpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/TUserGreenlet.cpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/_greenlet.cp310-win_amd64.pyd delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/greenlet.cpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/greenlet.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/greenlet_allocator.hpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/greenlet_compiler_compat.hpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/greenlet_cpython_compat.hpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/greenlet_exceptions.hpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/greenlet_internal.hpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/greenlet_refs.hpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/greenlet_slp_switch.hpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/greenlet_thread_support.hpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/setup_switch_x64_masm.cmd delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_aarch64_gcc.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_alpha_unix.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_amd64_unix.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm32_gcc.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm32_ios.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm64_masm.asm delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm64_masm.obj delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm64_msvc.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_csky_gcc.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_loongarch64_linux.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_m68k_gcc.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_mips_unix.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc64_aix.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc64_linux.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_aix.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_linux.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_macosx.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_unix.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_riscv_unix.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_s390_unix.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_sh_gcc.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_sparc_sun_gcc.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_x32_unix.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_x64_masm.asm delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_x64_masm.obj delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_x64_msvc.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_x86_msvc.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/platform/switch_x86_unix.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/slp_platformselect.h delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_clearing_run_switches.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_cpp_exception.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_initialstub_already_started.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_slp_switch.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_switch_three_greenlets.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_switch_three_greenlets2.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_switch_two_greenlets.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/leakcheck.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_contextvars.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_cpp.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_extension_interface.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_gc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_generator.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_generator_nested.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_greenlet.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_greenlet_trash.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_leaks.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_stack_saved.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_throw.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_tracing.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_version.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_weakref.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/_test_extension.c delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/_test_extension.cp310-win_amd64.pyd delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/_test_extension_cpp.cp310-win_amd64.pyd delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/_test_extension_cpp.cpp delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/fail_clearing_run_switches.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/fail_cpp_exception.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/fail_initialstub_already_started.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/fail_slp_switch.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets2.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/fail_switch_two_greenlets.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/leakcheck.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/test_contextvars.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/test_cpp.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/test_extension_interface.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/test_gc.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/test_generator.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/test_generator_nested.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/test_greenlet.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/test_greenlet_trash.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/test_leaks.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/test_stack_saved.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/test_throw.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/test_tracing.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/test_version.py delete mode 100644 blog-app/venv/Lib/site-packages/greenlet/tests/test_weakref.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/INSTALLER delete mode 100644 blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/METADATA delete mode 100644 blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/RECORD delete mode 100644 blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/WHEEL delete mode 100644 blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/licenses/LICENSE delete mode 100644 blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/licenses/LICENSE.APACHE delete mode 100644 blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/licenses/LICENSE.BSD delete mode 100644 blog-app/venv/Lib/site-packages/packaging/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/__pycache__/_elffile.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/__pycache__/_manylinux.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/__pycache__/_musllinux.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/__pycache__/_parser.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/__pycache__/_structures.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/__pycache__/_tokenizer.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/__pycache__/markers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/__pycache__/metadata.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/__pycache__/requirements.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/__pycache__/specifiers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/__pycache__/tags.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/__pycache__/utils.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/__pycache__/version.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/_elffile.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging/_manylinux.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging/_musllinux.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging/_parser.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging/_structures.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging/_tokenizer.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging/licenses/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging/licenses/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/licenses/__pycache__/_spdx.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/packaging/licenses/_spdx.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging/markers.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging/metadata.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/packaging/requirements.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging/specifiers.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging/tags.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging/utils.py delete mode 100644 blog-app/venv/Lib/site-packages/packaging/version.py delete mode 100644 blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/INSTALLER delete mode 100644 blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/METADATA delete mode 100644 blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/RECORD delete mode 100644 blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/REQUESTED delete mode 100644 blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/WHEEL delete mode 100644 blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/entry_points.txt delete mode 100644 blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/licenses/AUTHORS.txt delete mode 100644 blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/licenses/LICENSE.txt delete mode 100644 blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/top_level.txt delete mode 100644 blog-app/venv/Lib/site-packages/pip/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/__main__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/__pip-runner__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/__pycache__/__main__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/build_env.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cache.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/base_command.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/command_context.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/index_command.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/main.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/parser.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/req_command.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/spinners.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/lock.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/cache.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/check.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/completion.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/configuration.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/debug.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/download.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/freeze.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/hash.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/help.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/index.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/inspect.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/install.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/list.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/lock.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/search.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/show.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/commands/wheel.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/configuration.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/distributions/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/distributions/base.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/distributions/installed.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/distributions/sdist.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/distributions/wheel.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/exceptions.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/index/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/index/collector.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/index/package_finder.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/index/sources.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/locations/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/locations/_distutils.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/locations/base.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/main.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/_json.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/base.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/__pycache__/pylock.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/candidate.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/direct_url.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/format_control.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/index.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/installation_report.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/link.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/pylock.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/scheme.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/search_scope.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/selection_prefs.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/target_python.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/models/wheel.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/auth.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/cache.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/download.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/session.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/utils.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/network/xmlrpc.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/metadata.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/wheel.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/check.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/freeze.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/install/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/install/wheel.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/operations/prepare.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/pyproject.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/req/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_dependency_group.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/req/constructors.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/req/req_dependency_group.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/req/req_file.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/req/req_install.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/req/req_set.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/base.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/self_outdated_check.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/retry.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/_log.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/compat.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/datetime.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/egg_link.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/entrypoints.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/filetypes.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/glibc.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/hashes.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/logging.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/misc.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/packaging.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/retry.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/subprocess.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/unpacking.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/urls.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/virtualenv.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/utils/wheel.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/vcs/git.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_internal/wheel_builder.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/certifi/core.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/certifi/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/dependency_groups/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/dependency_groups/__main__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/dependency_groups/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/dependency_groups/__pycache__/__main__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/dependency_groups/__pycache__/_implementation.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/dependency_groups/__pycache__/_lint_dependency_groups.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/dependency_groups/__pycache__/_pip_wrapper.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/dependency_groups/__pycache__/_toml_compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/dependency_groups/_implementation.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/dependency_groups/_lint_dependency_groups.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/dependency_groups/_pip_wrapper.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/dependency_groups/_toml_compat.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/dependency_groups/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/compat.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/database.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/index.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/resources.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/t32.exe delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/t64.exe delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/util.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/version.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/w32.exe delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/w64-arm.exe delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/w64.exe delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distro/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distro/__main__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distro/distro.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/distro/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/codec.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/compat.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/core.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/idnadata.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/intranges.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/package_data.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/idna/uts46data.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/msgpack/ext.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_parser.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_tokenizer.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/_elffile.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/_manylinux.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/_musllinux.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/_parser.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/_structures.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/_tokenizer.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/licenses/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/licenses/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/licenses/__pycache__/_spdx.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/licenses/_spdx.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/markers.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/metadata.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/requirements.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/tags.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/utils.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/packaging/version.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/android.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/api.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/version.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__main__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/console.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/filter.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/formatter.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/lexer.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/modeline.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/plugin.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/regexopt.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/scanner.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/style.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/styles/_mapping.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/token.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/unistring.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pygments/util.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_impl.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/__version__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/adapters.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/api.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/auth.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/certs.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/compat.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/cookies.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/exceptions.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/help.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/hooks.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/models.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/packages.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/sessions.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/status_codes.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/structures.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/requests/utils.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/abstract.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/criterion.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/exceptions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/resolution.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__main__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/json.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/region.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/text.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_cell_widths.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_export_format.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_extension.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_fileno.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_inspect.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_log_render.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_loop.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_null_file.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_palettes.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_pick.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_ratio.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_spinners.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_stack.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_timer.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_win32_console.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_windows.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_windows_renderer.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/_wrap.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/abc.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/align.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/ansi.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/bar.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/box.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/cells.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/color.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/color_triplet.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/columns.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/console.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/constrain.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/containers.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/control.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/default_styles.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/diagnose.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/emoji.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/errors.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/filesize.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/highlighter.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/json.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/jupyter.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/layout.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/live.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/live_render.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/logging.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/markup.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/measure.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/padding.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/pager.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/palette.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/panel.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/pretty.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/progress.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/prompt.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/protocol.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/region.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/repr.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/rule.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/scope.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/screen.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/segment.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/spinner.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/status.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/style.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/styled.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/syntax.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/table.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/terminal_theme.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/text.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/theme.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/themes.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/traceback.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/rich/tree.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/tomli/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/tomli/_parser.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/tomli/_re.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/tomli/_types.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/tomli/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/tomli_w/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/tomli_w/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/tomli_w/__pycache__/_writer.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/tomli_w/_writer.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/tomli_w/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/truststore/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/truststore/_api.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/truststore/_macos.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/truststore/_openssl.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/truststore/_ssl_constants.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/truststore/_windows.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/truststore/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/typing_extensions.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/_version.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/connection.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/fields.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/request.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/response.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py delete mode 100644 blog-app/venv/Lib/site-packages/pip/_vendor/vendor.txt delete mode 100644 blog-app/venv/Lib/site-packages/pip/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/zipp.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/appdirs.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_adapters.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_common.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_itertools.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_legacy.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/abc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/readers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/simple.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_common.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/abc.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/readers.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/simple.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/context.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/functools.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/jaraco/context.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/jaraco/functools.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/jaraco/text/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/recipes.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/more.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/recipes.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_manylinux.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_musllinux.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/actions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/common.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/core.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/exceptions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/helpers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/results.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/testing.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/unicode.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/actions.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/common.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/core.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/diagram/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/exceptions.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/helpers.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/results.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/testing.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/unicode.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/util.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/_vendor/zipp.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/extern/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools-63.2.0.dist-info/INSTALLER delete mode 100644 blog-app/venv/Lib/site-packages/setuptools-63.2.0.dist-info/LICENSE delete mode 100644 blog-app/venv/Lib/site-packages/setuptools-63.2.0.dist-info/METADATA delete mode 100644 blog-app/venv/Lib/site-packages/setuptools-63.2.0.dist-info/RECORD delete mode 100644 blog-app/venv/Lib/site-packages/setuptools-63.2.0.dist-info/REQUESTED delete mode 100644 blog-app/venv/Lib/site-packages/setuptools-63.2.0.dist-info/WHEEL delete mode 100644 blog-app/venv/Lib/site-packages/setuptools-63.2.0.dist-info/entry_points.txt delete mode 100644 blog-app/venv/Lib/site-packages/setuptools-63.2.0.dist-info/top_level.txt delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/_entry_points.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/_imp.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/_importlib.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/_itertools.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/_path.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/_reqs.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/archive_util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/build_meta.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/dep_util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/depends.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/discovery.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/dist.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/errors.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/extension.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/glob.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/installer.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/launch.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/logging.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/monkey.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/msvc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/namespaces.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/package_index.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/py34compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/sandbox.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/version.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/wheel.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/__pycache__/windows_support.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_deprecation_warning.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/_collections.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/_functools.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/_macos_compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/config.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/core.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/debug.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/dist.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/errors.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/extension.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/log.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/py39compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/version.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/_collections.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/_functools.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/_macos_compat.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/archive_util.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/bcppcompiler.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/ccompiler.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/cmd.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/_framework_compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_msi.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_wininst.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/_framework_compat.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/bdist.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/bdist_msi.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/bdist_wininst.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/build.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/build_py.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/check.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/clean.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/config.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/install.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/install_data.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/py37compat.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/register.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/sdist.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/command/upload.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/config.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/core.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/debug.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/dep_util.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/dir_util.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/dist.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/errors.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/extension.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/file_util.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/filelist.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/log.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/msvc9compiler.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/msvccompiler.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/py38compat.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/py39compat.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/spawn.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/sysconfig.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/text_file.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/util.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/version.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_entry_points.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_imp.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_importlib.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_itertools.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_path.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_reqs.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/__pycache__/zipp.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_adapters.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_collections.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_functools.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_itertools.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_meta.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_text.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_collections.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_compat.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_functools.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_meta.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_text.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_adapters.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_common.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_itertools.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_legacy.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/abc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/readers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/simple.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_adapters.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_common.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_compat.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_itertools.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_legacy.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/abc.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/readers.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/importlib_resources/simple.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/jaraco/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/context.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/functools.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/jaraco/context.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/jaraco/functools.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/ordered_set.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/_manylinux.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/_musllinux.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/packaging/version.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/actions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/common.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/core.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/exceptions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/helpers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/results.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/testing.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/unicode.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/actions.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/common.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/core.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/diagram/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/exceptions.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/helpers.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/results.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/testing.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/unicode.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/pyparsing/util.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/tomli/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_parser.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_re.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_types.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/tomli/_parser.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/tomli/_re.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/tomli/_types.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/typing_extensions.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/_vendor/zipp.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/archive_util.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/build_meta.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/cli-32.exe delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/cli-64.exe delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/cli-arm64.exe delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/cli.exe delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/alias.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/build.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/build_clib.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/build_ext.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/develop.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/dist_info.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/install.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/install_lib.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/install_scripts.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/py36compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/register.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/rotate.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/saveopts.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/sdist.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/test.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/upload.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/__pycache__/upload_docs.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/alias.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/bdist_egg.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/bdist_rpm.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/build.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/build_clib.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/build_ext.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/build_py.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/develop.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/dist_info.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/easy_install.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/egg_info.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/install.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/install_egg_info.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/install_lib.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/install_scripts.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/launcher manifest.xml delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/py36compat.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/register.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/rotate.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/saveopts.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/sdist.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/setopt.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/test.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/upload.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/command/upload_docs.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/__pycache__/_apply_pyprojecttoml.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/__pycache__/expand.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/__pycache__/pyprojecttoml.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/__pycache__/setupcfg.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/_validate_pyproject/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/error_reporting.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/extra_validations.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/formats.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/_validate_pyproject/error_reporting.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/expand.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/pyprojecttoml.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/config/setupcfg.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/dep_util.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/depends.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/discovery.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/dist.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/errors.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/extension.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/extern/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/extern/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/glob.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/gui-32.exe delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/gui-64.exe delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/gui-arm64.exe delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/gui.exe delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/installer.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/launch.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/logging.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/monkey.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/msvc.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/namespaces.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/package_index.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/py34compat.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/sandbox.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/script (dev).tmpl delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/script.tmpl delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/unicode_utils.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/version.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/wheel.py delete mode 100644 blog-app/venv/Lib/site-packages/setuptools/windows_support.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy-2.0.41.dist-info/INSTALLER delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy-2.0.41.dist-info/METADATA delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy-2.0.41.dist-info/RECORD delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy-2.0.41.dist-info/WHEEL delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy-2.0.41.dist-info/licenses/LICENSE delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy-2.0.41.dist-info/top_level.txt delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/__pycache__/events.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/__pycache__/exc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/__pycache__/inspection.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/__pycache__/log.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/__pycache__/schema.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/__pycache__/types.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/connectors/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/connectors/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/connectors/__pycache__/aioodbc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/connectors/__pycache__/asyncio.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/connectors/__pycache__/pyodbc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/connectors/aioodbc.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/connectors/asyncio.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/connectors/pyodbc.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/cyextension/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/cyextension/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/cyextension/collections.cp310-win_amd64.pyd delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/cyextension/collections.pyx delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/cyextension/immutabledict.cp310-win_amd64.pyd delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/cyextension/immutabledict.pxd delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/cyextension/immutabledict.pyx delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/cyextension/processors.cp310-win_amd64.pyd delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/cyextension/processors.pyx delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/cyextension/resultproxy.cp310-win_amd64.pyd delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/cyextension/resultproxy.pyx delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/cyextension/util.cp310-win_amd64.pyd delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/cyextension/util.pyx delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/__pycache__/_typing.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/_typing.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/aioodbc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/json.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/provision.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/aioodbc.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/base.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/information_schema.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/json.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/provision.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/pymssql.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mssql/pyodbc.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/dml.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/expression.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/json.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadb.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/provision.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/types.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/aiomysql.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/asyncmy.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/base.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/cymysql.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/dml.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/enumerated.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/expression.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/json.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/mariadb.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/mysqldb.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/provision.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/pymysql.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/pyodbc.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/reflection.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/reserved_words.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/mysql/types.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/dictionary.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/oracledb.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/provision.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/types.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/vector.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/base.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/dictionary.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/oracledb.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/provision.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/types.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/oracle/vector.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/_psycopg_common.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/array.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/json.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/named_types.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/operators.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg_catalog.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/provision.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/types.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/_psycopg_common.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/array.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/base.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/dml.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/ext.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/hstore.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/json.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/named_types.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/operators.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/pg8000.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/pg_catalog.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/provision.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/psycopg.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/psycopg2cffi.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/ranges.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/types.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/aiosqlite.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/dml.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/json.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/provision.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/base.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/dml.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/json.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/provision.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/pysqlcipher.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/dialects/type_migration_guidelines.txt delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/_py_processors.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/_py_row.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/_py_util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/characteristics.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/create.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/cursor.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/default.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/events.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/interfaces.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/mock.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/processors.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/reflection.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/result.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/row.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/strategies.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/url.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/_py_processors.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/_py_row.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/_py_util.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/base.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/characteristics.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/create.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/cursor.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/default.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/events.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/interfaces.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/mock.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/processors.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/reflection.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/result.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/row.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/strategies.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/url.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/engine/util.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/event/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/event/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/event/__pycache__/api.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/event/__pycache__/attr.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/event/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/event/__pycache__/legacy.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/event/__pycache__/registry.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/event/api.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/event/attr.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/event/base.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/event/legacy.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/event/registry.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/events.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/exc.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/associationproxy.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/automap.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/baked.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/compiler.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/horizontal_shard.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/hybrid.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/indexable.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/instrumentation.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/mutable.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/orderinglist.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/serializer.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/associationproxy.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/engine.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/exc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/result.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/scoping.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/session.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/asyncio/base.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/asyncio/engine.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/asyncio/exc.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/asyncio/result.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/asyncio/scoping.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/asyncio/session.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/automap.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/baked.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/compiler.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/declarative/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/declarative/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/declarative/__pycache__/extensions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/declarative/extensions.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/horizontal_shard.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/hybrid.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/indexable.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/instrumentation.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/mutable.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/mypy/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/apply.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/decl_class.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/infer.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/names.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/plugin.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/mypy/apply.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/mypy/decl_class.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/mypy/infer.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/mypy/names.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/mypy/plugin.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/mypy/util.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/orderinglist.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/ext/serializer.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/future/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/future/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/future/__pycache__/engine.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/future/engine.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/inspection.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/log.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/_orm_constructors.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/_typing.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/attributes.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/bulk_persistence.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/clsregistry.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/collections.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/context.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/decl_api.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/decl_base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/dependency.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/descriptor_props.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/dynamic.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/evaluator.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/events.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/exc.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/identity.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/instrumentation.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/interfaces.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/loading.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/mapped_collection.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/mapper.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/path_registry.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/persistence.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/properties.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/query.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/relationships.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/scoping.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/session.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/state.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/state_changes.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/strategies.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/strategy_options.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/sync.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/unitofwork.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/writeonly.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/_orm_constructors.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/_typing.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/attributes.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/base.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/bulk_persistence.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/clsregistry.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/collections.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/context.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/decl_api.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/decl_base.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/dependency.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/descriptor_props.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/dynamic.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/evaluator.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/events.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/exc.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/identity.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/instrumentation.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/interfaces.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/loading.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/mapped_collection.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/mapper.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/path_registry.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/persistence.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/properties.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/query.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/relationships.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/scoping.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/session.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/state.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/state_changes.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/strategies.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/strategy_options.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/sync.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/unitofwork.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/util.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/orm/writeonly.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/pool/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/pool/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/pool/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/pool/__pycache__/events.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/pool/__pycache__/impl.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/pool/base.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/pool/events.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/pool/impl.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/py.typed delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/schema.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_dml_constructors.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_elements_constructors.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_orm_types.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_py_util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_typing.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/annotation.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/cache_key.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/coercions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/compiler.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/crud.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/ddl.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/default_comparator.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/dml.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/elements.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/events.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/expression.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/functions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/lambdas.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/naming.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/operators.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/roles.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/schema.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/selectable.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/sqltypes.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/traversals.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/type_api.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/visitors.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/_dml_constructors.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/_elements_constructors.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/_orm_types.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/_py_util.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/_selectable_constructors.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/_typing.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/annotation.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/base.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/cache_key.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/coercions.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/compiler.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/crud.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/ddl.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/default_comparator.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/dml.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/elements.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/events.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/expression.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/functions.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/lambdas.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/naming.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/operators.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/roles.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/schema.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/selectable.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/sqltypes.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/traversals.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/type_api.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/util.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/sql/visitors.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/assertions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/assertsql.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/asyncio.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/config.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/engines.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/entities.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/exclusions.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/pickleable.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/profiling.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/provision.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/requirements.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/schema.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/util.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/warnings.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/assertions.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/assertsql.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/asyncio.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/config.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/engines.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/entities.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/exclusions.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/fixtures/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/fixtures/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/fixtures/__pycache__/base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/fixtures/__pycache__/mypy.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/fixtures/__pycache__/orm.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/fixtures/__pycache__/sql.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/fixtures/base.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/fixtures/mypy.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/fixtures/orm.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/fixtures/sql.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/pickleable.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/plugin/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/plugin/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/plugin/bootstrap.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/plugin/plugin_base.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/plugin/pytestplugin.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/profiling.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/provision.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/requirements.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/schema.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_cte.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_deprecations.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_insert.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_results.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_rowcount.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_select.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_types.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_unicode_ddl.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/test_cte.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/test_ddl.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/test_deprecations.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/test_dialect.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/test_insert.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/test_reflection.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/test_results.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/test_rowcount.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/test_select.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/test_sequence.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/test_types.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/test_unicode_ddl.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/suite/test_update_delete.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/util.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/testing/warnings.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/types.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/__init__.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/__pycache__/_collections.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/__pycache__/_has_cy.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/__pycache__/_py_collections.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/__pycache__/compat.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/__pycache__/concurrency.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/__pycache__/deprecations.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/__pycache__/langhelpers.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/__pycache__/preloaded.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/__pycache__/queue.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/__pycache__/tool_support.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/__pycache__/topological.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/__pycache__/typing.cpython-310.pyc delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/_collections.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/_concurrency_py3k.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/_has_cy.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/_py_collections.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/compat.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/concurrency.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/deprecations.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/langhelpers.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/preloaded.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/queue.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/tool_support.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/topological.py delete mode 100644 blog-app/venv/Lib/site-packages/sqlalchemy/util/typing.py delete mode 100644 blog-app/venv/Lib/site-packages/typing_extensions-4.13.2.dist-info/INSTALLER delete mode 100644 blog-app/venv/Lib/site-packages/typing_extensions-4.13.2.dist-info/METADATA delete mode 100644 blog-app/venv/Lib/site-packages/typing_extensions-4.13.2.dist-info/RECORD delete mode 100644 blog-app/venv/Lib/site-packages/typing_extensions-4.13.2.dist-info/WHEEL delete mode 100644 blog-app/venv/Lib/site-packages/typing_extensions-4.13.2.dist-info/licenses/LICENSE delete mode 100644 blog-app/venv/Lib/site-packages/typing_extensions.py delete mode 100644 blog-app/venv/Scripts/Activate.ps1 delete mode 100644 blog-app/venv/Scripts/activate delete mode 100644 blog-app/venv/Scripts/activate.bat delete mode 100644 blog-app/venv/Scripts/deactivate.bat delete mode 100644 blog-app/venv/Scripts/pip.exe delete mode 100644 blog-app/venv/Scripts/pip3.10.exe delete mode 100644 blog-app/venv/Scripts/pip3.exe delete mode 100644 blog-app/venv/Scripts/python.exe delete mode 100644 blog-app/venv/Scripts/pythonw.exe delete mode 100644 blog-app/venv/pyvenv.cfg diff --git a/blog-app/__pycache__/wsgi.cpython-310.pyc b/blog-app/__pycache__/wsgi.cpython-310.pyc deleted file mode 100644 index 3776f0feb82b1c22acc38f69a6a217c7d6a62293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285 zcmYjN%}&EG49-s{D%4$hhaQGFqk#}i9Lpr&QbmfwYPDfWS|!WSo(4GbCOkv0oOlH; z;Piwg`}=HvmM!=5`7uFz{k-U&5x-LM-xwxW=-~`QLmFy`r8T9AGs7&eIVF%ae9Qa^ z@Hh5Ou$SFWUe3O8ij;KB;!Ybxu7+XErL;;rDXVf;=WTR)(|hOBs*(HXJWmW&PFaxh zgZLvXOyQ@xITw!sd=M2*85P8xgO%5N5ZBRzic@_Bd-2f0V%=%6KJ2>QiCffe#gpmV h1>PWDLaR@Q!pYCa`APRyydh(N=< z3;8(qHryPpV{WaB`j~IbnadmZu4mqFQ#T6DVjpJC+W_JMeHv@qU~D diff --git a/blog-app/blogapp/__pycache__/forms.cpython-310.pyc b/blog-app/blogapp/__pycache__/forms.cpython-310.pyc deleted file mode 100644 index af5886ebbf6ebc8f7a4d3f8ce4e551dbd25c5c06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1192 zcmZuwOHbS|5VrGvEnQJs(Z_-79_Y1FRaJ;rFLaAoP$er;8n8DTHBJ^M3x(_U$`9cm zRk`-WU+ATsaTdA~jpWZB&)DPnzDd>V1q8m$?YEPkCLzDjSpF<9wqVp>0XX5bAd)gl zacvZaG?^(aW=Wgb(qWF?Hw#yK%#%LzWxxU%vXGLGgj?MHLAWjG++-2h4tK$JwcX?1 zhz$HY$U+9R_4kXk{k%;5Ho!5r{7+T+g2V$Tyklm*cl)iD9so{kB*Kc|bRNc4Cxr)-6XPvQi?qmj+El7mKDb-&o}TOe zPF0R`B{%MOT5r0b?%EyYS-EjC9S)wfUXoynBx!>rkrkg6xQ>zp>FGQQI)fJnPh2uv?;DVkpAzFFWsIEVYh@`B??Z$Dd2F ztMUsGZ_kuSXL^5ET*Su{v3WSjMJ8!NPtall2!y<{Blp0U2a#3-!K zjSq1t%VZ|e7H~2mdc8R~c!Irnhag$VfrUa^QyaSj9K?GOx~uU=53D~qayB^ctd0DsM<>;u*XzZ}2T9}XVb zK3ceR<_EnCyZ6IR??UwY7}>9oOXHa|0bXM)qtir5yp~-^b$ZV97Z~y4_x(phT3ZZ{ zl2NAOV)$z+4|MWE4xd(9##PN9$QQ%GL_R#8B*Wu5o;)2MqVL)8L}lZLah}%(ePTi%6oiU0`5JkAUQe?NH=y?^Z)r_`qv2ph^ zRn1c4{gjq+EVU5{824GJlXR?alZPW`aiTP3%J_L)6fZLkrlqBd%Op#SNs=2U$MhHa zEA*)oum)ceN3Vf$UQoS#*5%vy>u|x{f44-Jw?yr6vzkj>_P^9jS{7GYo;L7d1=A+D zsK?eyv(t91cM*0j$BwiOF%f(lz81lSa>9b z-2`rwm)=CTT1X_%2R;26t)(2Gkeo6pl{8Iy(GlfOg8rQ5NkJ>9b4N+7jjz#Iv?`4A-XXY0aG&5ifOZPQHDxL zOA{PsS|;Q4XE_h+n??!TTwzKR-L@d03UBd%+gRVOxI^`&`J=wO+SVh1qpnvHbbcXq g*9xfJ))G*sf-Z0Ty_Jd|)AKESgcfV@O>4XTA2Gv9@c;k- diff --git a/blog-app/blogapp/__pycache__/routes.cpython-310.pyc b/blog-app/blogapp/__pycache__/routes.cpython-310.pyc deleted file mode 100644 index 52e55585df21b8f467505f039104e3b2584a5ab9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1613 zcmZ`(!EWO=5EUs(mh9MZ9B+~W-9o`$>cb`|&{Gi<-R^dKS$Kmc3$%iPKrtCxi6|K) z=4Y4rCaIcF(f9Y{U(@ z7O%nH<9tna=y4S&!BZuMrbj9_nM``LYJVd}sWvJxX^}rKl&r!R#VEBbsM#wm zRK*SpZQ^i}jD$%|CT8KdkRrl;#gN65c_KyS!i$xcp#^*mO$&8P_GjKco*Sa4s~=|O zDNNl0Vjwey7|Q9D3vs#q#XEarBQtoxn}8R(YUIiEG*Kx;sc&3G;iB3=(gAYgs4ntI zZohr{*#Q05gMKl}Jh}eh_+E zF!r9HjhyLo7p0ugj27VUqFQKp8ufIBm{JlInhMd== zfcUt6&rbq3-lgFHHpZDdKRB1p8*=TaZAb^Xbk5y#_7gP7FYcTW$9Tr)z|F~#V``jn z@6zGEOpmF{i!wLS5HL1^M^J&$E!nlG&6-Qs7C{G#`V;Dgsx5fDVsKja0#(CJ zXPRUw2O}p%exl1$nHt4V5tNWuTX783iNXMsiv%-rLlkCb1u{fStpoWOrpCX8PXp2= zYotXWd$wTzAC*Hm{~jv4fCxQzIk}+fA@FR;8;?_qkPo;l5%M^*vH*V@fK<&Q74%~- z;WEuIu#<1z?mq`qdUAhFR+=SSGg{SL!tFqna%3f-@B@@di5c=*b7wv zi~0yiw^9Y29-`x2qrApw9D&=%?Ux{LqG z#iI8t>X;O3x2j>=K({EY{kVCz+rzACn^fy#+*&GR!9}K3hz2k(_hnysw&85q*t)g} zROs4@yVh~r48Z}|Dl_ppRAQKt diff --git a/blog-app/venv/Include/site/python3.10/greenlet/greenlet.h b/blog-app/venv/Include/site/python3.10/greenlet/greenlet.h deleted file mode 100644 index d02a16e..0000000 --- a/blog-app/venv/Include/site/python3.10/greenlet/greenlet.h +++ /dev/null @@ -1,164 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ - -/* Greenlet object interface */ - -#ifndef Py_GREENLETOBJECT_H -#define Py_GREENLETOBJECT_H - - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* This is deprecated and undocumented. It does not change. */ -#define GREENLET_VERSION "1.0.0" - -#ifndef GREENLET_MODULE -#define implementation_ptr_t void* -#endif - -typedef struct _greenlet { - PyObject_HEAD - PyObject* weakreflist; - PyObject* dict; - implementation_ptr_t pimpl; -} PyGreenlet; - -#define PyGreenlet_Check(op) (op && PyObject_TypeCheck(op, &PyGreenlet_Type)) - - -/* C API functions */ - -/* Total number of symbols that are exported */ -#define PyGreenlet_API_pointers 12 - -#define PyGreenlet_Type_NUM 0 -#define PyExc_GreenletError_NUM 1 -#define PyExc_GreenletExit_NUM 2 - -#define PyGreenlet_New_NUM 3 -#define PyGreenlet_GetCurrent_NUM 4 -#define PyGreenlet_Throw_NUM 5 -#define PyGreenlet_Switch_NUM 6 -#define PyGreenlet_SetParent_NUM 7 - -#define PyGreenlet_MAIN_NUM 8 -#define PyGreenlet_STARTED_NUM 9 -#define PyGreenlet_ACTIVE_NUM 10 -#define PyGreenlet_GET_PARENT_NUM 11 - -#ifndef GREENLET_MODULE -/* This section is used by modules that uses the greenlet C API */ -static void** _PyGreenlet_API = NULL; - -# define PyGreenlet_Type \ - (*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM]) - -# define PyExc_GreenletError \ - ((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM]) - -# define PyExc_GreenletExit \ - ((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM]) - -/* - * PyGreenlet_New(PyObject *args) - * - * greenlet.greenlet(run, parent=None) - */ -# define PyGreenlet_New \ - (*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \ - _PyGreenlet_API[PyGreenlet_New_NUM]) - -/* - * PyGreenlet_GetCurrent(void) - * - * greenlet.getcurrent() - */ -# define PyGreenlet_GetCurrent \ - (*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) - -/* - * PyGreenlet_Throw( - * PyGreenlet *greenlet, - * PyObject *typ, - * PyObject *val, - * PyObject *tb) - * - * g.throw(...) - */ -# define PyGreenlet_Throw \ - (*(PyObject * (*)(PyGreenlet * self, \ - PyObject * typ, \ - PyObject * val, \ - PyObject * tb)) \ - _PyGreenlet_API[PyGreenlet_Throw_NUM]) - -/* - * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) - * - * g.switch(*args, **kwargs) - */ -# define PyGreenlet_Switch \ - (*(PyObject * \ - (*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \ - _PyGreenlet_API[PyGreenlet_Switch_NUM]) - -/* - * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) - * - * g.parent = new_parent - */ -# define PyGreenlet_SetParent \ - (*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \ - _PyGreenlet_API[PyGreenlet_SetParent_NUM]) - -/* - * PyGreenlet_GetParent(PyObject* greenlet) - * - * return greenlet.parent; - * - * This could return NULL even if there is no exception active. - * If it does not return NULL, you are responsible for decrementing the - * reference count. - */ -# define PyGreenlet_GetParent \ - (*(PyGreenlet* (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_GET_PARENT_NUM]) - -/* - * deprecated, undocumented alias. - */ -# define PyGreenlet_GET_PARENT PyGreenlet_GetParent - -# define PyGreenlet_MAIN \ - (*(int (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_MAIN_NUM]) - -# define PyGreenlet_STARTED \ - (*(int (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_STARTED_NUM]) - -# define PyGreenlet_ACTIVE \ - (*(int (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_ACTIVE_NUM]) - - - - -/* Macro that imports greenlet and initializes C API */ -/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we - keep the older definition to be sure older code that might have a copy of - the header still works. */ -# define PyGreenlet_Import() \ - { \ - _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ - } - -#endif /* GREENLET_MODULE */ - -#ifdef __cplusplus -} -#endif -#endif /* !Py_GREENLETOBJECT_H */ diff --git a/blog-app/venv/Lib/site-packages/__pycache__/typing_extensions.cpython-310.pyc b/blog-app/venv/Lib/site-packages/__pycache__/typing_extensions.cpython-310.pyc deleted file mode 100644 index c256bcd26d64fe3d107ac4864be49e9be90206fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120440 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 pG|G02#s)X?D2KjrX5Jkm&zO(n!z5*3z&Ft*V z?96w*-_Q5Qd>v0u7Y+Qr^XiNBzdd3Yf2EhvUk)#qP}FZxaf7qSSk0bnm2p!TTV~r> zwYbIYyT+=`bKJo*$Mf99)8PeP#52#QcnMGUD+ZtD<+}zi@0+Uyyv^`gyv^dRD2iKC zi^e;p)smPNMgEW|{nGfAiQe+Q#f;nML~-9(o#Ds$99Ejex5xRz`1WCZ`w&0DA3^Ui zev&_m=NxCtM&;B8pxIbjb$!3tX?A?SM(_O}L&HM3jG|sZ#aUu(u{M)=ZY&##DQEF+ zar2fTXQ>BgG$MP?*frkIar+))-~)EaEu{q>s-%^Kk*b&<(3&6QQAye%*hjtCANFtZ98!dn(etC_@cq@MNGTS;#`Y;2B z$GjB@FKl=>RYz5`S9P=Mt<*#1Z3i7M5&`#;*lRVoP@xRgF@0UsgLW88<;BtyQlf<~ zVlQaNAtu*_!jek01PIIeT8hXTY>bu^wIu31>xqVH;Vel#NIW$-5IzS{DhZ+p=LLC0 zcp?KHCSlwNBJiW*JuRx6Rj&~zUeNFahBR@#&nnou!52W_c5q90AGb*mVWp$29Z*`W zIH?8Jr1>6i(tM~iD$-J0NCj&Au(1)R?oJ>ZIHXE#YE_slK#KPbIfciEoy#w;-B6gn zwiMRlC{SzH8e&m~ZL#)c96xC3{zcJVTd9lFZ`H%Kw>n8ZZmeC!+*@nwQM`FNXg1f{ zqS0P^GhAO&VIod9gW9cNQ>Zn6K(Aj%-+~XC!o>Hh%}#oP$QhZ?ln_rNA?nmDsv@&l znc0@hY|~`!ft*I?7~lz*R4${atEk2S&rQJF)bNHnYj{JQ?;4~Oi^e|NW4n01ixRK0k^6ZmKK3BnW&vGsaMR@te#2jMzAfk+_I{K)zjiD z5tOkOZ#OT}ZklzDVVVvzKXNVeBa=A?-T4~SMGl!=eI<%((7=mm^uMmylIWHWRU`#T zhO}bo_Non-DM@lUOu)>cwLgtH>NqMApv#JSFOxjDQa$YU576C&}>M$tk%fd&cV zeUrl$-_yc_y&@i2-B*hqey>GQyaSDlpr-)27jKNH?|KJ%+YV*i*anomb|6F2y{i6l z_2lxEl^buZT)Xz>vVUXwiof{!^2&{s*WX-DbDA9$D>Y+iRBwsY+7t-{k=v< zV-_vVzW|aI9iVKxOrAtz?05tR7eybhfd&p{M8=+xuziEUDDN9Ton~Z$VVDV{Z^H=N z_#+q5aL*d*)DC*-@7pMP9tww3?p`f!cE+IuU57>5fER(Gk6}_hm2fbiTGY!d z3*pt1q^VwBSlEP$w$`iA!3DVGU}4C~h0NP5Jb(7ZdELYuLgwk`E}T1e;ic!#oYjlL zYr^Bf+ib^4*bWHS8Dy8Begr9P`}Fxom`Da(Y8x=cW1mQrAs372RfISv?=Yy`zodtk zBWxpFUP5_5>M9I`KE|q6Is_Xd!4Dw_Fj;{|2!rUlIAZE(ov)xMG8VgR*YI@^ai1+g za|(VlND?6%2qS+bdp{XWG`*3uE$=_8Fc`tW;Xrt@T`-!t0AH-W3$@E^;DoX4Oh7GR!1 zJGF3x`z&=-BH;(JbLb-!UfC24ai=LS-oQL<6wG%|7~T1iQ)~xGtv+IY`(J=T7J>@- zB)-H(pQBC5v}DUaLoK~WPA{;6cSUDE$-1+LS6`~+NEgXj_&$W!(@(TZzJI$FMA?XZ ziWaR>rI9qOXe0Rqs<%)ckUww@mz6BtcLYhq#Y-rPtlI!dbMU^_T?Q;^pSx-c1kyZz z7k(E(w95;?Szfrj$ftB)0ple;t=mOj<}(IM$$6A2@5>V2zMhC?r7jnn~!KuzjoK0nRFtwAki z#nCWJ-9GWD4P@6-2XP0cq*L1hp&r*jN}cRwgyanJ10ueSt+Ww1X4&kRIm;Z@{mg$P zdrTh*MP#+;soJRE>5O}bMzn0mXOhpOr`da2d#sy>3~ln8KZM_G6m28Pb>{otlD^!5 zanc5Xr08m&>1^d8O$1+C?pA^4cHx2FGq#G{`LP8vkLiW~V8r`a9!hjD|IIi6w2v4+0>~T@K=zlzcKJ9B&S7RTEW-T-4D>7t zY%t&g+hxIJXQI?noUS3%Pejj9bZ9w3D*`vx{rZ4{p@LOE0map^wU5x>R}c9-HXO6H zWC8&@eGxniyD4!8nwO335xH7VSodrHFR>%*!i;L($umURS*k8mb%iQzEMFV6G#6(E zn`g4RgJG3f&k`%y@+wUyLg5*mScaQnqcW8iac!$L^`%P3N~^u7ib9QGy_S{-p;whI z}ei2pbgo=XN5ddng5ykSWsP3X@^p%|MW0UwW6z`b5 zBis`f^!YtB2KEl;&jMKOLDBCcE(1^O5uWsd*eoI)x&Q3cMZ=S=23`1dW<+|;usJ*` zMXfqSMeqDeFTQYAGf?V?Gw9!wh+#`dg!M6sI*~Ewah{)}NXkNW&rM>>0Bc0w$Za(9 zeYlA|iUGf$S@L;{Vl7{bNnb(aH7tFfWsn{ZUDDF%;y=PX9S^%X8$PMby54`IXG~Be zBnlraTIWer6kFl~#}YPlEO0|6xuHdbH#*wPb*~KoyeJafRlRV7WI;KEbwT3kpN+Ce z0rF&oT~(7|GpY9Q`rP^RL(%DL+;|L2B$1ugG3;Y#=oq%R1`oMsz6bxgi!{TbNEWtd zZbMRNsPAe(r*?F}ypC;idMvf0up!7#)FPEhSOfl9?C~oU%}?`P+bFZ*LHE)metxX< zMua_xeXX>B99m7RBS!>-*65_goglj9BLh;q1>f~8>?tY0$Y^<+TACobEBpebC*TrU zsDtk5Pejm|v&OkthPNVH$SrQ@d?4bo zum*q1J;RcNXlYq3nZ^o>yZ69`EiTg$K))sa$tv^{Umf?Q&RU2vYgz9bNU8C z)i80=ePr0#6q`P&7fgFByCbs)(S!_$@_AI1nZt3;t29Ig7N!(eg|OBO{>kA7j9o>g!93SFUUN z(*n*GQ2L^tP9bwIWa3lKYtji)H{iI4Ve}7l4BGz`lXW~M(sl_0@^MtSe|?H35t92q zYE!w4@_=OB(?5`%5zOQ!dMCoJ;QL4|3F-TPqA5?K>XwNtq)vJRV;5txbN#(!NS|ml zuyjg_ZKRX*k#LFp9EMU$+^MCxb`Z5hY9{L=d?4dP`37-^GW&m~b@bNL{jGKXglKw; zrp8na^=AkRV$C0E@Elc|QD}_)28No{u^&Gs);%+mFx`RZeEr1s2HJ?{v@oT>%fx+& zy?;T`azxUR-jB$U&`lyz`lN+yZ|uyn{OvM)NMd*9#&4n-dvlq7WW;2Q*2JX6ZxVB_ z(0{Ea5_SvwrL-r(!bCn4Q8+UXB=uL0XRDIMPLES8k%WzY-iOjXO6D=*p^&zoL@SaQ+1>0S@n1cIimnbt%eCA& fD6{K6R4$d>;-<;)pB-E+oR6HmYaxT~mh686VO%OC diff --git a/blog-app/venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc b/blog-app/venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc deleted file mode 100644 index e308a48fceaa9ae60f5e7f673fccd7aa3208599d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcmZ9H!D<3A5QdXIi6Z(MLf0M(MO0epsaT5#gnBD68vy zh7pz;^Mxi@)IpmP-qP+KHig;c(prdEMtG+UcnX-?gdlh5;UCuHjbUi(b8B=ksw!~I Ko5vcYKKlbYDNcw0 diff --git a/blog-app/venv/Lib/site-packages/_distutils_hack/override.py b/blog-app/venv/Lib/site-packages/_distutils_hack/override.py deleted file mode 100644 index 2cc433a..0000000 --- a/blog-app/venv/Lib/site-packages/_distutils_hack/override.py +++ /dev/null @@ -1 +0,0 @@ -__import__('_distutils_hack').do_override() diff --git a/blog-app/venv/Lib/site-packages/distutils-precedence.pth b/blog-app/venv/Lib/site-packages/distutils-precedence.pth deleted file mode 100644 index 7f009fe..0000000 --- a/blog-app/venv/Lib/site-packages/distutils-precedence.pth +++ /dev/null @@ -1 +0,0 @@ -import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'local') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER b/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst b/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst deleted file mode 100644 index 9d227a0..0000000 --- a/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA b/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA deleted file mode 100644 index 92f239c..0000000 --- a/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA +++ /dev/null @@ -1,109 +0,0 @@ -Metadata-Version: 2.1 -Name: Flask-SQLAlchemy -Version: 3.1.1 -Summary: Add SQLAlchemy support to your Flask application. -Maintainer-email: Pallets -Requires-Python: >=3.8 -Description-Content-Type: text/x-rst -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Requires-Dist: flask>=2.2.5 -Requires-Dist: sqlalchemy>=2.0.16 -Project-URL: Changes, https://flask-sqlalchemy.palletsprojects.com/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://flask-sqlalchemy.palletsprojects.com -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Issue Tracker, https://github.com/pallets-eco/flask-sqlalchemy/issues/ -Project-URL: Source Code, https://github.com/pallets-eco/flask-sqlalchemy/ - -Flask-SQLAlchemy -================ - -Flask-SQLAlchemy is an extension for `Flask`_ that adds support for -`SQLAlchemy`_ to your application. It aims to simplify using SQLAlchemy -with Flask by providing useful defaults and extra helpers that make it -easier to accomplish common tasks. - -.. _Flask: https://palletsprojects.com/p/flask/ -.. _SQLAlchemy: https://www.sqlalchemy.org - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - $ pip install -U Flask-SQLAlchemy - -.. _pip: https://pip.pypa.io/en/stable/getting-started/ - - -A Simple Example ----------------- - -.. code-block:: python - - from flask import Flask - from flask_sqlalchemy import SQLAlchemy - from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column - - app = Flask(__name__) - app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///example.sqlite" - - class Base(DeclarativeBase): - pass - - db = SQLAlchemy(app, model_class=Base) - - class User(db.Model): - id: Mapped[int] = mapped_column(db.Integer, primary_key=True) - username: Mapped[str] = mapped_column(db.String, unique=True, nullable=False) - - with app.app_context(): - db.create_all() - - db.session.add(User(username="example")) - db.session.commit() - - users = db.session.execute(db.select(User)).scalars() - - -Contributing ------------- - -For guidance on setting up a development environment and how to make a -contribution to Flask-SQLAlchemy, see the `contributing guidelines`_. - -.. _contributing guidelines: https://github.com/pallets-eco/flask-sqlalchemy/blob/main/CONTRIBUTING.rst - - -Donate ------- - -The Pallets organization develops and supports Flask-SQLAlchemy and -other popular packages. In order to grow the community of contributors -and users, and allow the maintainers to devote more time to the -projects, `please donate today`_. - -.. _please donate today: https://palletsprojects.com/donate - - -Links ------ - -- Documentation: https://flask-sqlalchemy.palletsprojects.com/ -- Changes: https://flask-sqlalchemy.palletsprojects.com/changes/ -- PyPI Releases: https://pypi.org/project/Flask-SQLAlchemy/ -- Source Code: https://github.com/pallets-eco/flask-sqlalchemy/ -- Issue Tracker: https://github.com/pallets-eco/flask-sqlalchemy/issues/ -- Website: https://palletsprojects.com/ -- Twitter: https://twitter.com/PalletsTeam -- Chat: https://discord.gg/pallets - diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD b/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD deleted file mode 100644 index 5808b11..0000000 --- a/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD +++ /dev/null @@ -1,27 +0,0 @@ -flask_sqlalchemy-3.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -flask_sqlalchemy-3.1.1.dist-info/METADATA,sha256=lBxR1akBt7n9XBjIVTL2OV52OhCfFrb-Mqtoe0DCbR8,3432 -flask_sqlalchemy-3.1.1.dist-info/RECORD,, -flask_sqlalchemy-3.1.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask_sqlalchemy-3.1.1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -flask_sqlalchemy/__init__.py,sha256=he_w4qQQVS2Z1ms5GCTptDTXNOXBXw0n8zSuWCp8n6Y,653 -flask_sqlalchemy/__pycache__/__init__.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/cli.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/extension.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/model.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/pagination.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/query.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/record_queries.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/session.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/table.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/track_modifications.cpython-310.pyc,, -flask_sqlalchemy/cli.py,sha256=pg3QDxP36GW2qnwe_CpPtkRhPchyVSGM6zlBNWuNCFE,484 -flask_sqlalchemy/extension.py,sha256=71tP_kNtb5VgZdafy_OH1sWdZOA6PaT7cJqX7tKgZ-k,38261 -flask_sqlalchemy/model.py,sha256=_mSisC2Eni0TgTyFWeN_O4LIexTeP_sVTdxh03yMK50,11461 -flask_sqlalchemy/pagination.py,sha256=JFpllrqkRkwacb8DAmQWaz9wsvQa0dypfSkhUDSC2ws,11119 -flask_sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask_sqlalchemy/query.py,sha256=Uls9qbmnpb9Vba43EDfsRP17eHJ0X4VG7SE22tH5R3g,3748 -flask_sqlalchemy/record_queries.py,sha256=ouS1ayj16h76LJprx13iYdoFZbm6m8OncrOgAVbG1Sk,3520 -flask_sqlalchemy/session.py,sha256=pBbtN8iDc8yuGVt0k18BvZHh2uEI7QPzZXO7eXrRi1g,3426 -flask_sqlalchemy/table.py,sha256=wAPOy8qwyAxpMwOIUJY4iMOultzz2W0D6xvBkQ7U2CE,859 -flask_sqlalchemy/track_modifications.py,sha256=yieyozj7IiVzwnAGZ-ZrgqrzjrUfG0kPrXBfW_hStSU,2755 diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/REQUESTED b/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL b/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL deleted file mode 100644 index 3b5e64b..0000000 --- a/blog-app/venv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.9.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/__init__.py b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/__init__.py deleted file mode 100644 index c2fa059..0000000 --- a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -from __future__ import annotations - -import typing as t - -from .extension import SQLAlchemy - -__all__ = [ - "SQLAlchemy", -] - - -def __getattr__(name: str) -> t.Any: - if name == "__version__": - import importlib.metadata - import warnings - - warnings.warn( - "The '__version__' attribute is deprecated and will be removed in" - " Flask-SQLAlchemy 3.2. Use feature detection or" - " 'importlib.metadata.version(\"flask-sqlalchemy\")' instead.", - DeprecationWarning, - stacklevel=2, - ) - return importlib.metadata.version("flask-sqlalchemy") - - raise AttributeError(name) diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/__init__.cpython-310.pyc b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 7079ed984e66ffa92849f5ba911209fa4866dbf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 917 zcmZWn!EO^V5VgI#$u>=Ist~1xQ&oxzLW)+hoY+m=dcDDRQc|TC z;M#wHW50&Gublb|<4!{+vgVDkbYY}diy zh+~Bc+{HN9M3HX9BOa@`NV*C5k^$~kc%9ey^4GXqk(ij@NWfZ8(_=;+7U4i zIN?a4Q#@bsDVdQ&!XpPDd2$wEG{cASw}e-|<9*~RGxP<2#;xkEU#4^-j0J3znvm(_ z{M}Gw&0Fqf#+);F5bqe7aXO4BQFg;v5n8&go6jdMS z3n*L=xMm&eA1N^r>g3M94_Z~f`hNnS9y6n*9#|g-%dc)<(E?B(7Dqn4hU2SOc>K!d zwG^+6DNQRfp&EYaZwAwV{W&ssVYxindX@uiWAk0vFM&z^MvHADCnA3dGO+R7zbz&? zXx`o%%6xC?hNaHu3g$gk4%%!q$|pik@*UaBt#qP20_~e8Ry|ZZHDy2**xELbN6}UCs3y;%{qU2*Go`+7e0ahKQq)tc_|6WP{ E01`q8$^ZZW diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/cli.cpython-310.pyc b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/cli.cpython-310.pyc deleted file mode 100644 index df76971182ff7d13508b64269d603ab4a1672545..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 930 zcmZuv&2H2%5Vo_MZAgDq2@d6!8(KsISE^Oj(uxz5iozwN@_J);ldWT?wzIHR%Z0uH zPr;c7;hrm8c!i!ATR?m0NSTbso|$jv8@0L`BM|lDdHD+?^wS+~OAih^2w{_g!4Sg& z)i}f0*?|bM9{hWvUx!%;zK9Lj(p5hju;2&{@BMa}hPYd%QYuSrrKCA<=c3h`OG{|e zbOX(8tL61Ns|x$USp6ii>8@NH7cTmr1YkHUdk)KEFf5v3h99C!z`=S~=mO1xS#Q?g zM_=$IzCah4^+%uqM|l4IEuU7#a?M%tv9e{dRdZWzjX$3VYEILaUYn8&K?)@;|71y{ zRl$u>dYn`zaRM?PQ^rWG7#D_EMg03QT$_YTIuV?u$u46iu_cGcY~t>uu~Zg3p^_z3 zh{T5{1r#*g__S8RV~->Gn=$qNEH-C?ilXH8q5x|CiyK8Bz9Tn^4KONb{y2iB@eGFI z^w;1F2>6DEK{xQVNEZ(zC;x0Sy)T$}u$Dinar-$=f%t2xhK zw3^e_`}g@ge^>I&!?MZ`7q(O~_mj&fLQOY;%Y4q|JbzV9a#LBp+0f#YPPxf_cjTs> zr-i7}X3@nX$9bXZW_t~=7}wbbI)8M>oYRp|1r=sHy@}}pHW`N6twk3DXIvV$VOjXv zag?nPLy7jp>qWLy13>6-80b|O&{M6wnSfq)zWa9+j^M&L6^9RSg!@>p!vV553Uuh~ zr7kAqq=hYp@oLvZH?WJQlG6^`EcD%bls@!UQBQ!c9F1TxTEVv+(Z1XYih`A3t@j7A C_5a@h diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/extension.cpython-310.pyc b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/extension.cpython-310.pyc deleted file mode 100644 index 4b8916f555cb2962d114eb7a7047fbfa9dfc99f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31838 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 nQ0rtEL*ZGfk-!-xJ|Mt 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 diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/query.cpython-310.pyc b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/query.cpython-310.pyc deleted file mode 100644 index 034b2ab01eebf61b89f8ddcdf5f6592d26d34b73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4135 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 diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/table.cpython-310.pyc b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/table.cpython-310.pyc deleted file mode 100644 index b66624c34219491731d488524598a9df25c56d8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1368 zcmaJ>J8u**5VrS~y~`bWU!aLn&|HzD1|h^F0wKXABB5DUvYfSZx5+*(_TEK@(j`(l zegPGtxnD!?mWn!EM1jYfdjujZ?Rdsx&&>DPvw6Kk?Ob~xI2ju4jH zT49Lc1f@8@7<4PK0^7_^;F{S>=PZO#>IW5!-XLZ(=K?W@yGPY?JD6wI9%{P3Abu08 zd75Q;L5n!gWIKYz+2NK3mit=aD8LK_7PpTahMDyhvsG4S_b$A19Jpq6jV)>0nb-}s zJhoZm5*=c;qU~DXULpqto-Slvd1Rj+B)qMQ@eksRkz+noPDWF%Y*`59P|=as_a!Cr zBq1{D@|3pr%=EV4sQ_}Wt9s|=*=9S>xbluq%@Ma~y~u{j6TIk)OgZ3;tQ&Y(&wvi* z9X(w^7>4%H2)9R?ALU4%917TCGKe|Q;F`qZSX`gJdJ=w=T*$B;M|nbJxRdd15f6Cy zvM)I8oAqrz2=}{uYquMRyThWJXW?tT_c%OA^3E3R^}+$q2I0H-Ae3>zw|X=>rX4QB zL)ZnVX##MEj|w2F)f+0GkT{DALZF~4z~uO!7fK>qW1sR%BI%wGrtT zHW{-Nh|ZYWp-?G6gWGB{SWSOo>dgkr7hTb@$^WczUU%!Uqis5ET&Sam<5O15wxF))~WL16&5JIepg||IR#j z?VN*$0G&dJsuGgste=2hBjlt{lN%2%l%Ef{NOH;yYE{318}TF=LpHDa0aRze!y^Gy z5-cA%*m4(tJCz!Sui*;tH*1jfu&>)oXBBWm$}5JwIO_01YT(b^;?auT=R1<>86c0y(Hy7Em1#%MwUQQ4f&RDE#rp$2hTMkYXATM diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/track_modifications.cpython-310.pyc b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/track_modifications.cpython-310.pyc deleted file mode 100644 index 6c98df522ac60ae29a88881bf51cb8197fb862dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2313 zcma)7&2Aev5MJ)TWJy+RC${sC_Ry%UoL+ip5EOOoq;ZodY3!oNR>5Muq^y-!y9!A; zaUh@49`g?N(J#?UAE0+$d&(=MNYNRt1jzwfR07FwX1H9=H$R(Kt7QXz`5#|(e+Tp@ z3bQ{8gl`Okh~EHEgOb$flYkJ!W@-kOUhTlqtK0Vie{3uD%fXz+R$A#-gQ~_h;95}A z*h%O6^`K4+X7$eTFR4qtbfLc(EP|%~+6b1|((!rfpOD}}$ZT5a+v*Kp4h(CfQ2~s!}WJGckx__LdZ9c-u?}IN(*ipHr5KW}Nr?iIj}KTHa-y zoU`VK2IYz3nRi!36z06YCgOa+XgF5?JU;T7aygSjo+-PPXDr4yPJW187#kRqCjg|; zBO{25G^t6gH#V7Q>{-n*?y;qHVxe72j zb*wL(4JuJbG7dbU>p`uMc%G)aQM})9l@ETh17KFUX(A-c)Lh6}oO2rH1EFf+nd4M7 zoIOv?kHyJ>r-b|9@u|U=V0riJ#;x{`f^pGqC2^icqWvgin>;yS?Qe&iMMJIMWC!h? zE^9vSChfpNSITHDG^GN2sdIULYPGUY<?s8_vUY1BSQ^lS^z;Hf`ct zKJiKAz3-IC5~&mOz5SQoc_vWk9D1p1?|T5VfjTx%j3Y845F!j%eH<{Ge=Hpg*s*(J z0QIKydj5!vpjzLUMZMw9Q>(>S;Y6r3Z{loehSJ3lTn#5}D&Oq^d;AJKz(0aX*_eXL zJ&4jF6KdRl3huH)@H2m?FuZM+~PwPIJ#Tv^4Adxs#>uolD#ZS z1;_rTsyj~~-wC0&Y~0^!eK++e@Wb&wJoFu5y+Z~A71O#Uul7xLL8Wgmu9_R9<9T5bLxr-w0K diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/cli.py b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/cli.py deleted file mode 100644 index d7d7e4b..0000000 --- a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/cli.py +++ /dev/null @@ -1,16 +0,0 @@ -from __future__ import annotations - -import typing as t - -from flask import current_app - - -def add_models_to_shell() -> dict[str, t.Any]: - """Registered with :meth:`~flask.Flask.shell_context_processor` if - ``add_models_to_shell`` is enabled. Adds the ``db`` instance and all model classes - to ``flask shell``. - """ - db = current_app.extensions["sqlalchemy"] - out = {m.class_.__name__: m.class_ for m in db.Model._sa_registry.mappers} - out["db"] = db - return out diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/extension.py b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/extension.py deleted file mode 100644 index 43e1b9a..0000000 --- a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/extension.py +++ /dev/null @@ -1,1008 +0,0 @@ -from __future__ import annotations - -import os -import types -import typing as t -import warnings -from weakref import WeakKeyDictionary - -import sqlalchemy as sa -import sqlalchemy.event as sa_event -import sqlalchemy.exc as sa_exc -import sqlalchemy.orm as sa_orm -from flask import abort -from flask import current_app -from flask import Flask -from flask import has_app_context - -from .model import _QueryProperty -from .model import BindMixin -from .model import DefaultMeta -from .model import DefaultMetaNoName -from .model import Model -from .model import NameMixin -from .pagination import Pagination -from .pagination import SelectPagination -from .query import Query -from .session import _app_ctx_id -from .session import Session -from .table import _Table - -_O = t.TypeVar("_O", bound=object) # Based on sqlalchemy.orm._typing.py - - -# Type accepted for model_class argument -_FSA_MCT = t.TypeVar( - "_FSA_MCT", - bound=t.Union[ - t.Type[Model], - sa_orm.DeclarativeMeta, - t.Type[sa_orm.DeclarativeBase], - t.Type[sa_orm.DeclarativeBaseNoMeta], - ], -) - - -# Type returned by make_declarative_base -class _FSAModel(Model): - metadata: sa.MetaData - - -def _get_2x_declarative_bases( - model_class: _FSA_MCT, -) -> list[t.Type[t.Union[sa_orm.DeclarativeBase, sa_orm.DeclarativeBaseNoMeta]]]: - return [ - b - for b in model_class.__bases__ - if issubclass(b, (sa_orm.DeclarativeBase, sa_orm.DeclarativeBaseNoMeta)) - ] - - -class SQLAlchemy: - """Integrates SQLAlchemy with Flask. This handles setting up one or more engines, - associating tables and models with specific engines, and cleaning up connections and - sessions after each request. - - Only the engine configuration is specific to each application, other things like - the model, table, metadata, and session are shared for all applications using that - extension instance. Call :meth:`init_app` to configure the extension on an - application. - - After creating the extension, create model classes by subclassing :attr:`Model`, and - table classes with :attr:`Table`. These can be accessed before :meth:`init_app` is - called, making it possible to define the models separately from the application. - - Accessing :attr:`session` and :attr:`engine` requires an active Flask application - context. This includes methods like :meth:`create_all` which use the engine. - - This class also provides access to names in SQLAlchemy's ``sqlalchemy`` and - ``sqlalchemy.orm`` modules. For example, you can use ``db.Column`` and - ``db.relationship`` instead of importing ``sqlalchemy.Column`` and - ``sqlalchemy.orm.relationship``. This can be convenient when defining models. - - :param app: Call :meth:`init_app` on this Flask application now. - :param metadata: Use this as the default :class:`sqlalchemy.schema.MetaData`. Useful - for setting a naming convention. - :param session_options: Arguments used by :attr:`session` to create each session - instance. A ``scopefunc`` key will be passed to the scoped session, not the - session instance. See :class:`sqlalchemy.orm.sessionmaker` for a list of - arguments. - :param query_class: Use this as the default query class for models and dynamic - relationships. The query interface is considered legacy in SQLAlchemy. - :param model_class: Use this as the model base class when creating the declarative - model class :attr:`Model`. Can also be a fully created declarative model class - for further customization. - :param engine_options: Default arguments used when creating every engine. These are - lower precedence than application config. See :func:`sqlalchemy.create_engine` - for a list of arguments. - :param add_models_to_shell: Add the ``db`` instance and all model classes to - ``flask shell``. - - .. versionchanged:: 3.1.0 - The ``metadata`` parameter can still be used with SQLAlchemy 1.x classes, - but is ignored when using SQLAlchemy 2.x style of declarative classes. - Instead, specify metadata on your Base class. - - .. versionchanged:: 3.1.0 - Added the ``disable_autonaming`` parameter. - - .. versionchanged:: 3.1.0 - Changed ``model_class`` parameter to accepta SQLAlchemy 2.x - declarative base subclass. - - .. versionchanged:: 3.0 - An active Flask application context is always required to access ``session`` and - ``engine``. - - .. versionchanged:: 3.0 - Separate ``metadata`` are used for each bind key. - - .. versionchanged:: 3.0 - The ``engine_options`` parameter is applied as defaults before per-engine - configuration. - - .. versionchanged:: 3.0 - The session class can be customized in ``session_options``. - - .. versionchanged:: 3.0 - Added the ``add_models_to_shell`` parameter. - - .. versionchanged:: 3.0 - Engines are created when calling ``init_app`` rather than the first time they - are accessed. - - .. versionchanged:: 3.0 - All parameters except ``app`` are keyword-only. - - .. versionchanged:: 3.0 - The extension instance is stored directly as ``app.extensions["sqlalchemy"]``. - - .. versionchanged:: 3.0 - Setup methods are renamed with a leading underscore. They are considered - internal interfaces which may change at any time. - - .. versionchanged:: 3.0 - Removed the ``use_native_unicode`` parameter and config. - - .. versionchanged:: 2.4 - Added the ``engine_options`` parameter. - - .. versionchanged:: 2.1 - Added the ``metadata``, ``query_class``, and ``model_class`` parameters. - - .. versionchanged:: 2.1 - Use the same query class across ``session``, ``Model.query`` and - ``Query``. - - .. versionchanged:: 0.16 - ``scopefunc`` is accepted in ``session_options``. - - .. versionchanged:: 0.10 - Added the ``session_options`` parameter. - """ - - def __init__( - self, - app: Flask | None = None, - *, - metadata: sa.MetaData | None = None, - session_options: dict[str, t.Any] | None = None, - query_class: type[Query] = Query, - model_class: _FSA_MCT = Model, # type: ignore[assignment] - engine_options: dict[str, t.Any] | None = None, - add_models_to_shell: bool = True, - disable_autonaming: bool = False, - ): - if session_options is None: - session_options = {} - - self.Query = query_class - """The default query class used by ``Model.query`` and ``lazy="dynamic"`` - relationships. - - .. warning:: - The query interface is considered legacy in SQLAlchemy. - - Customize this by passing the ``query_class`` parameter to the extension. - """ - - self.session = self._make_scoped_session(session_options) - """A :class:`sqlalchemy.orm.scoping.scoped_session` that creates instances of - :class:`.Session` scoped to the current Flask application context. The session - will be removed, returning the engine connection to the pool, when the - application context exits. - - Customize this by passing ``session_options`` to the extension. - - This requires that a Flask application context is active. - - .. versionchanged:: 3.0 - The session is scoped to the current app context. - """ - - self.metadatas: dict[str | None, sa.MetaData] = {} - """Map of bind keys to :class:`sqlalchemy.schema.MetaData` instances. The - ``None`` key refers to the default metadata, and is available as - :attr:`metadata`. - - Customize the default metadata by passing the ``metadata`` parameter to the - extension. This can be used to set a naming convention. When metadata for - another bind key is created, it copies the default's naming convention. - - .. versionadded:: 3.0 - """ - - if metadata is not None: - if len(_get_2x_declarative_bases(model_class)) > 0: - warnings.warn( - "When using SQLAlchemy 2.x style of declarative classes," - " the `metadata` should be an attribute of the base class." - "The metadata passed into SQLAlchemy() is ignored.", - DeprecationWarning, - stacklevel=2, - ) - else: - metadata.info["bind_key"] = None - self.metadatas[None] = metadata - - self.Table = self._make_table_class() - """A :class:`sqlalchemy.schema.Table` class that chooses a metadata - automatically. - - Unlike the base ``Table``, the ``metadata`` argument is not required. If it is - not given, it is selected based on the ``bind_key`` argument. - - :param bind_key: Used to select a different metadata. - :param args: Arguments passed to the base class. These are typically the table's - name, columns, and constraints. - :param kwargs: Arguments passed to the base class. - - .. versionchanged:: 3.0 - This is a subclass of SQLAlchemy's ``Table`` rather than a function. - """ - - self.Model = self._make_declarative_base( - model_class, disable_autonaming=disable_autonaming - ) - """A SQLAlchemy declarative model class. Subclass this to define database - models. - - If a model does not set ``__tablename__``, it will be generated by converting - the class name from ``CamelCase`` to ``snake_case``. It will not be generated - if the model looks like it uses single-table inheritance. - - If a model or parent class sets ``__bind_key__``, it will use that metadata and - database engine. Otherwise, it will use the default :attr:`metadata` and - :attr:`engine`. This is ignored if the model sets ``metadata`` or ``__table__``. - - For code using the SQLAlchemy 1.x API, customize this model by subclassing - :class:`.Model` and passing the ``model_class`` parameter to the extension. - A fully created declarative model class can be - passed as well, to use a custom metaclass. - - For code using the SQLAlchemy 2.x API, customize this model by subclassing - :class:`sqlalchemy.orm.DeclarativeBase` or - :class:`sqlalchemy.orm.DeclarativeBaseNoMeta` - and passing the ``model_class`` parameter to the extension. - """ - - if engine_options is None: - engine_options = {} - - self._engine_options = engine_options - self._app_engines: WeakKeyDictionary[Flask, dict[str | None, sa.engine.Engine]] - self._app_engines = WeakKeyDictionary() - self._add_models_to_shell = add_models_to_shell - - if app is not None: - self.init_app(app) - - def __repr__(self) -> str: - if not has_app_context(): - return f"<{type(self).__name__}>" - - message = f"{type(self).__name__} {self.engine.url}" - - if len(self.engines) > 1: - message = f"{message} +{len(self.engines) - 1}" - - return f"<{message}>" - - def init_app(self, app: Flask) -> None: - """Initialize a Flask application for use with this extension instance. This - must be called before accessing the database engine or session with the app. - - This sets default configuration values, then configures the extension on the - application and creates the engines for each bind key. Therefore, this must be - called after the application has been configured. Changes to application config - after this call will not be reflected. - - The following keys from ``app.config`` are used: - - - :data:`.SQLALCHEMY_DATABASE_URI` - - :data:`.SQLALCHEMY_ENGINE_OPTIONS` - - :data:`.SQLALCHEMY_ECHO` - - :data:`.SQLALCHEMY_BINDS` - - :data:`.SQLALCHEMY_RECORD_QUERIES` - - :data:`.SQLALCHEMY_TRACK_MODIFICATIONS` - - :param app: The Flask application to initialize. - """ - if "sqlalchemy" in app.extensions: - raise RuntimeError( - "A 'SQLAlchemy' instance has already been registered on this Flask app." - " Import and use that instance instead." - ) - - app.extensions["sqlalchemy"] = self - app.teardown_appcontext(self._teardown_session) - - if self._add_models_to_shell: - from .cli import add_models_to_shell - - app.shell_context_processor(add_models_to_shell) - - basic_uri: str | sa.engine.URL | None = app.config.setdefault( - "SQLALCHEMY_DATABASE_URI", None - ) - basic_engine_options = self._engine_options.copy() - basic_engine_options.update( - app.config.setdefault("SQLALCHEMY_ENGINE_OPTIONS", {}) - ) - echo: bool = app.config.setdefault("SQLALCHEMY_ECHO", False) - config_binds: dict[ - str | None, str | sa.engine.URL | dict[str, t.Any] - ] = app.config.setdefault("SQLALCHEMY_BINDS", {}) - engine_options: dict[str | None, dict[str, t.Any]] = {} - - # Build the engine config for each bind key. - for key, value in config_binds.items(): - engine_options[key] = self._engine_options.copy() - - if isinstance(value, (str, sa.engine.URL)): - engine_options[key]["url"] = value - else: - engine_options[key].update(value) - - # Build the engine config for the default bind key. - if basic_uri is not None: - basic_engine_options["url"] = basic_uri - - if "url" in basic_engine_options: - engine_options.setdefault(None, {}).update(basic_engine_options) - - if not engine_options: - raise RuntimeError( - "Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set." - ) - - engines = self._app_engines.setdefault(app, {}) - - # Dispose existing engines in case init_app is called again. - if engines: - for engine in engines.values(): - engine.dispose() - - engines.clear() - - # Create the metadata and engine for each bind key. - for key, options in engine_options.items(): - self._make_metadata(key) - options.setdefault("echo", echo) - options.setdefault("echo_pool", echo) - self._apply_driver_defaults(options, app) - engines[key] = self._make_engine(key, options, app) - - if app.config.setdefault("SQLALCHEMY_RECORD_QUERIES", False): - from . import record_queries - - for engine in engines.values(): - record_queries._listen(engine) - - if app.config.setdefault("SQLALCHEMY_TRACK_MODIFICATIONS", False): - from . import track_modifications - - track_modifications._listen(self.session) - - def _make_scoped_session( - self, options: dict[str, t.Any] - ) -> sa_orm.scoped_session[Session]: - """Create a :class:`sqlalchemy.orm.scoping.scoped_session` around the factory - from :meth:`_make_session_factory`. The result is available as :attr:`session`. - - The scope function can be customized using the ``scopefunc`` key in the - ``session_options`` parameter to the extension. By default it uses the current - thread or greenlet id. - - This method is used for internal setup. Its signature may change at any time. - - :meta private: - - :param options: The ``session_options`` parameter from ``__init__``. Keyword - arguments passed to the session factory. A ``scopefunc`` key is popped. - - .. versionchanged:: 3.0 - The session is scoped to the current app context. - - .. versionchanged:: 3.0 - Renamed from ``create_scoped_session``, this method is internal. - """ - scope = options.pop("scopefunc", _app_ctx_id) - factory = self._make_session_factory(options) - return sa_orm.scoped_session(factory, scope) - - def _make_session_factory( - self, options: dict[str, t.Any] - ) -> sa_orm.sessionmaker[Session]: - """Create the SQLAlchemy :class:`sqlalchemy.orm.sessionmaker` used by - :meth:`_make_scoped_session`. - - To customize, pass the ``session_options`` parameter to :class:`SQLAlchemy`. To - customize the session class, subclass :class:`.Session` and pass it as the - ``class_`` key. - - This method is used for internal setup. Its signature may change at any time. - - :meta private: - - :param options: The ``session_options`` parameter from ``__init__``. Keyword - arguments passed to the session factory. - - .. versionchanged:: 3.0 - The session class can be customized. - - .. versionchanged:: 3.0 - Renamed from ``create_session``, this method is internal. - """ - options.setdefault("class_", Session) - options.setdefault("query_cls", self.Query) - return sa_orm.sessionmaker(db=self, **options) - - def _teardown_session(self, exc: BaseException | None) -> None: - """Remove the current session at the end of the request. - - :meta private: - - .. versionadded:: 3.0 - """ - self.session.remove() - - def _make_metadata(self, bind_key: str | None) -> sa.MetaData: - """Get or create a :class:`sqlalchemy.schema.MetaData` for the given bind key. - - This method is used for internal setup. Its signature may change at any time. - - :meta private: - - :param bind_key: The name of the metadata being created. - - .. versionadded:: 3.0 - """ - if bind_key in self.metadatas: - return self.metadatas[bind_key] - - if bind_key is not None: - # Copy the naming convention from the default metadata. - naming_convention = self._make_metadata(None).naming_convention - else: - naming_convention = None - - # Set the bind key in info to be used by session.get_bind. - metadata = sa.MetaData( - naming_convention=naming_convention, info={"bind_key": bind_key} - ) - self.metadatas[bind_key] = metadata - return metadata - - def _make_table_class(self) -> type[_Table]: - """Create a SQLAlchemy :class:`sqlalchemy.schema.Table` class that chooses a - metadata automatically based on the ``bind_key``. The result is available as - :attr:`Table`. - - This method is used for internal setup. Its signature may change at any time. - - :meta private: - - .. versionadded:: 3.0 - """ - - class Table(_Table): - def __new__( - cls, *args: t.Any, bind_key: str | None = None, **kwargs: t.Any - ) -> Table: - # If a metadata arg is passed, go directly to the base Table. Also do - # this for no args so the correct error is shown. - if not args or (len(args) >= 2 and isinstance(args[1], sa.MetaData)): - return super().__new__(cls, *args, **kwargs) - - metadata = self._make_metadata(bind_key) - return super().__new__(cls, *[args[0], metadata, *args[1:]], **kwargs) - - return Table - - def _make_declarative_base( - self, - model_class: _FSA_MCT, - disable_autonaming: bool = False, - ) -> t.Type[_FSAModel]: - """Create a SQLAlchemy declarative model class. The result is available as - :attr:`Model`. - - To customize, subclass :class:`.Model` and pass it as ``model_class`` to - :class:`SQLAlchemy`. To customize at the metaclass level, pass an already - created declarative model class as ``model_class``. - - This method is used for internal setup. Its signature may change at any time. - - :meta private: - - :param model_class: A model base class, or an already created declarative model - class. - - :param disable_autonaming: Turns off automatic tablename generation in models. - - .. versionchanged:: 3.1.0 - Added support for passing SQLAlchemy 2.x base class as model class. - Added optional ``disable_autonaming`` parameter. - - .. versionchanged:: 3.0 - Renamed with a leading underscore, this method is internal. - - .. versionchanged:: 2.3 - ``model`` can be an already created declarative model class. - """ - model: t.Type[_FSAModel] - declarative_bases = _get_2x_declarative_bases(model_class) - if len(declarative_bases) > 1: - # raise error if more than one declarative base is found - raise ValueError( - "Only one declarative base can be passed to SQLAlchemy." - " Got: {}".format(model_class.__bases__) - ) - elif len(declarative_bases) == 1: - body = dict(model_class.__dict__) - body["__fsa__"] = self - mixin_classes = [BindMixin, NameMixin, Model] - if disable_autonaming: - mixin_classes.remove(NameMixin) - model = types.new_class( - "FlaskSQLAlchemyBase", - (*mixin_classes, *model_class.__bases__), - {"metaclass": type(declarative_bases[0])}, - lambda ns: ns.update(body), - ) - elif not isinstance(model_class, sa_orm.DeclarativeMeta): - metadata = self._make_metadata(None) - metaclass = DefaultMetaNoName if disable_autonaming else DefaultMeta - model = sa_orm.declarative_base( - metadata=metadata, cls=model_class, name="Model", metaclass=metaclass - ) - else: - model = model_class # type: ignore[assignment] - - if None not in self.metadatas: - # Use the model's metadata as the default metadata. - model.metadata.info["bind_key"] = None - self.metadatas[None] = model.metadata - else: - # Use the passed in default metadata as the model's metadata. - model.metadata = self.metadatas[None] - - model.query_class = self.Query - model.query = _QueryProperty() # type: ignore[assignment] - model.__fsa__ = self - return model - - def _apply_driver_defaults(self, options: dict[str, t.Any], app: Flask) -> None: - """Apply driver-specific configuration to an engine. - - SQLite in-memory databases use ``StaticPool`` and disable ``check_same_thread``. - File paths are relative to the app's :attr:`~flask.Flask.instance_path`, - which is created if it doesn't exist. - - MySQL sets ``charset="utf8mb4"``, and ``pool_timeout`` defaults to 2 hours. - - This method is used for internal setup. Its signature may change at any time. - - :meta private: - - :param options: Arguments passed to the engine. - :param app: The application that the engine configuration belongs to. - - .. versionchanged:: 3.0 - SQLite paths are relative to ``app.instance_path``. It does not use - ``NullPool`` if ``pool_size`` is 0. Driver-level URIs are supported. - - .. versionchanged:: 3.0 - MySQL sets ``charset="utf8mb4". It does not set ``pool_size`` to 10. It - does not set ``pool_recycle`` if not using a queue pool. - - .. versionchanged:: 3.0 - Renamed from ``apply_driver_hacks``, this method is internal. It does not - return anything. - - .. versionchanged:: 2.5 - Returns ``(sa_url, options)``. - """ - url = sa.engine.make_url(options["url"]) - - if url.drivername in {"sqlite", "sqlite+pysqlite"}: - if url.database is None or url.database in {"", ":memory:"}: - options["poolclass"] = sa.pool.StaticPool - - if "connect_args" not in options: - options["connect_args"] = {} - - options["connect_args"]["check_same_thread"] = False - else: - # the url might look like sqlite:///file:path?uri=true - is_uri = url.query.get("uri", False) - - if is_uri: - db_str = url.database[5:] - else: - db_str = url.database - - if not os.path.isabs(db_str): - os.makedirs(app.instance_path, exist_ok=True) - db_str = os.path.join(app.instance_path, db_str) - - if is_uri: - db_str = f"file:{db_str}" - - options["url"] = url.set(database=db_str) - elif url.drivername.startswith("mysql"): - # set queue defaults only when using queue pool - if ( - "pool_class" not in options - or options["pool_class"] is sa.pool.QueuePool - ): - options.setdefault("pool_recycle", 7200) - - if "charset" not in url.query: - options["url"] = url.update_query_dict({"charset": "utf8mb4"}) - - def _make_engine( - self, bind_key: str | None, options: dict[str, t.Any], app: Flask - ) -> sa.engine.Engine: - """Create the :class:`sqlalchemy.engine.Engine` for the given bind key and app. - - To customize, use :data:`.SQLALCHEMY_ENGINE_OPTIONS` or - :data:`.SQLALCHEMY_BINDS` config. Pass ``engine_options`` to :class:`SQLAlchemy` - to set defaults for all engines. - - This method is used for internal setup. Its signature may change at any time. - - :meta private: - - :param bind_key: The name of the engine being created. - :param options: Arguments passed to the engine. - :param app: The application that the engine configuration belongs to. - - .. versionchanged:: 3.0 - Renamed from ``create_engine``, this method is internal. - """ - return sa.engine_from_config(options, prefix="") - - @property - def metadata(self) -> sa.MetaData: - """The default metadata used by :attr:`Model` and :attr:`Table` if no bind key - is set. - """ - return self.metadatas[None] - - @property - def engines(self) -> t.Mapping[str | None, sa.engine.Engine]: - """Map of bind keys to :class:`sqlalchemy.engine.Engine` instances for current - application. The ``None`` key refers to the default engine, and is available as - :attr:`engine`. - - To customize, set the :data:`.SQLALCHEMY_BINDS` config, and set defaults by - passing the ``engine_options`` parameter to the extension. - - This requires that a Flask application context is active. - - .. versionadded:: 3.0 - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - - if app not in self._app_engines: - raise RuntimeError( - "The current Flask app is not registered with this 'SQLAlchemy'" - " instance. Did you forget to call 'init_app', or did you create" - " multiple 'SQLAlchemy' instances?" - ) - - return self._app_engines[app] - - @property - def engine(self) -> sa.engine.Engine: - """The default :class:`~sqlalchemy.engine.Engine` for the current application, - used by :attr:`session` if the :attr:`Model` or :attr:`Table` being queried does - not set a bind key. - - To customize, set the :data:`.SQLALCHEMY_ENGINE_OPTIONS` config, and set - defaults by passing the ``engine_options`` parameter to the extension. - - This requires that a Flask application context is active. - """ - return self.engines[None] - - def get_engine( - self, bind_key: str | None = None, **kwargs: t.Any - ) -> sa.engine.Engine: - """Get the engine for the given bind key for the current application. - This requires that a Flask application context is active. - - :param bind_key: The name of the engine. - - .. deprecated:: 3.0 - Will be removed in Flask-SQLAlchemy 3.2. Use ``engines[key]`` instead. - - .. versionchanged:: 3.0 - Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` - parameter. - """ - warnings.warn( - "'get_engine' is deprecated and will be removed in Flask-SQLAlchemy" - " 3.2. Use 'engine' or 'engines[key]' instead. If you're using" - " Flask-Migrate or Alembic, you'll need to update your 'env.py' file.", - DeprecationWarning, - stacklevel=2, - ) - - if "bind" in kwargs: - bind_key = kwargs.pop("bind") - - return self.engines[bind_key] - - def get_or_404( - self, - entity: type[_O], - ident: t.Any, - *, - description: str | None = None, - **kwargs: t.Any, - ) -> _O: - """Like :meth:`session.get() ` but aborts with a - ``404 Not Found`` error instead of returning ``None``. - - :param entity: The model class to query. - :param ident: The primary key to query. - :param description: A custom message to show on the error page. - :param kwargs: Extra arguments passed to ``session.get()``. - - .. versionchanged:: 3.1 - Pass extra keyword arguments to ``session.get()``. - - .. versionadded:: 3.0 - """ - value = self.session.get(entity, ident, **kwargs) - - if value is None: - abort(404, description=description) - - return value - - def first_or_404( - self, statement: sa.sql.Select[t.Any], *, description: str | None = None - ) -> t.Any: - """Like :meth:`Result.scalar() `, but aborts - with a ``404 Not Found`` error instead of returning ``None``. - - :param statement: The ``select`` statement to execute. - :param description: A custom message to show on the error page. - - .. versionadded:: 3.0 - """ - value = self.session.execute(statement).scalar() - - if value is None: - abort(404, description=description) - - return value - - def one_or_404( - self, statement: sa.sql.Select[t.Any], *, description: str | None = None - ) -> t.Any: - """Like :meth:`Result.scalar_one() `, - but aborts with a ``404 Not Found`` error instead of raising ``NoResultFound`` - or ``MultipleResultsFound``. - - :param statement: The ``select`` statement to execute. - :param description: A custom message to show on the error page. - - .. versionadded:: 3.0 - """ - try: - return self.session.execute(statement).scalar_one() - except (sa_exc.NoResultFound, sa_exc.MultipleResultsFound): - abort(404, description=description) - - def paginate( - self, - select: sa.sql.Select[t.Any], - *, - page: int | None = None, - per_page: int | None = None, - max_per_page: int | None = None, - error_out: bool = True, - count: bool = True, - ) -> Pagination: - """Apply an offset and limit to a select statment based on the current page and - number of items per page, returning a :class:`.Pagination` object. - - The statement should select a model class, like ``select(User)``. This applies - ``unique()`` and ``scalars()`` modifiers to the result, so compound selects will - not return the expected results. - - :param select: The ``select`` statement to paginate. - :param page: The current page, used to calculate the offset. Defaults to the - ``page`` query arg during a request, or 1 otherwise. - :param per_page: The maximum number of items on a page, used to calculate the - offset and limit. Defaults to the ``per_page`` query arg during a request, - or 20 otherwise. - :param max_per_page: The maximum allowed value for ``per_page``, to limit a - user-provided value. Use ``None`` for no limit. Defaults to 100. - :param error_out: Abort with a ``404 Not Found`` error if no items are returned - and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if - either are not ints. - :param count: Calculate the total number of values by issuing an extra count - query. For very complex queries this may be inaccurate or slow, so it can be - disabled and set manually if necessary. - - .. versionchanged:: 3.0 - The ``count`` query is more efficient. - - .. versionadded:: 3.0 - """ - return SelectPagination( - select=select, - session=self.session(), - page=page, - per_page=per_page, - max_per_page=max_per_page, - error_out=error_out, - count=count, - ) - - def _call_for_binds( - self, bind_key: str | None | list[str | None], op_name: str - ) -> None: - """Call a method on each metadata. - - :meta private: - - :param bind_key: A bind key or list of keys. Defaults to all binds. - :param op_name: The name of the method to call. - - .. versionchanged:: 3.0 - Renamed from ``_execute_for_all_tables``. - """ - if bind_key == "__all__": - keys: list[str | None] = list(self.metadatas) - elif bind_key is None or isinstance(bind_key, str): - keys = [bind_key] - else: - keys = bind_key - - for key in keys: - try: - engine = self.engines[key] - except KeyError: - message = f"Bind key '{key}' is not in 'SQLALCHEMY_BINDS' config." - - if key is None: - message = f"'SQLALCHEMY_DATABASE_URI' config is not set. {message}" - - raise sa_exc.UnboundExecutionError(message) from None - - metadata = self.metadatas[key] - getattr(metadata, op_name)(bind=engine) - - def create_all(self, bind_key: str | None | list[str | None] = "__all__") -> None: - """Create tables that do not exist in the database by calling - ``metadata.create_all()`` for all or some bind keys. This does not - update existing tables, use a migration library for that. - - This requires that a Flask application context is active. - - :param bind_key: A bind key or list of keys to create the tables for. Defaults - to all binds. - - .. versionchanged:: 3.0 - Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` - parameter. - - .. versionchanged:: 0.12 - Added the ``bind`` and ``app`` parameters. - """ - self._call_for_binds(bind_key, "create_all") - - def drop_all(self, bind_key: str | None | list[str | None] = "__all__") -> None: - """Drop tables by calling ``metadata.drop_all()`` for all or some bind keys. - - This requires that a Flask application context is active. - - :param bind_key: A bind key or list of keys to drop the tables from. Defaults to - all binds. - - .. versionchanged:: 3.0 - Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` - parameter. - - .. versionchanged:: 0.12 - Added the ``bind`` and ``app`` parameters. - """ - self._call_for_binds(bind_key, "drop_all") - - def reflect(self, bind_key: str | None | list[str | None] = "__all__") -> None: - """Load table definitions from the database by calling ``metadata.reflect()`` - for all or some bind keys. - - This requires that a Flask application context is active. - - :param bind_key: A bind key or list of keys to reflect the tables from. Defaults - to all binds. - - .. versionchanged:: 3.0 - Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` - parameter. - - .. versionchanged:: 0.12 - Added the ``bind`` and ``app`` parameters. - """ - self._call_for_binds(bind_key, "reflect") - - def _set_rel_query(self, kwargs: dict[str, t.Any]) -> None: - """Apply the extension's :attr:`Query` class as the default for relationships - and backrefs. - - :meta private: - """ - kwargs.setdefault("query_class", self.Query) - - if "backref" in kwargs: - backref = kwargs["backref"] - - if isinstance(backref, str): - backref = (backref, {}) - - backref[1].setdefault("query_class", self.Query) - - def relationship( - self, *args: t.Any, **kwargs: t.Any - ) -> sa_orm.RelationshipProperty[t.Any]: - """A :func:`sqlalchemy.orm.relationship` that applies this extension's - :attr:`Query` class for dynamic relationships and backrefs. - - .. versionchanged:: 3.0 - The :attr:`Query` class is set on ``backref``. - """ - self._set_rel_query(kwargs) - return sa_orm.relationship(*args, **kwargs) - - def dynamic_loader( - self, argument: t.Any, **kwargs: t.Any - ) -> sa_orm.RelationshipProperty[t.Any]: - """A :func:`sqlalchemy.orm.dynamic_loader` that applies this extension's - :attr:`Query` class for relationships and backrefs. - - .. versionchanged:: 3.0 - The :attr:`Query` class is set on ``backref``. - """ - self._set_rel_query(kwargs) - return sa_orm.dynamic_loader(argument, **kwargs) - - def _relation( - self, *args: t.Any, **kwargs: t.Any - ) -> sa_orm.RelationshipProperty[t.Any]: - """A :func:`sqlalchemy.orm.relationship` that applies this extension's - :attr:`Query` class for dynamic relationships and backrefs. - - SQLAlchemy 2.0 removes this name, use ``relationship`` instead. - - :meta private: - - .. versionchanged:: 3.0 - The :attr:`Query` class is set on ``backref``. - """ - self._set_rel_query(kwargs) - f = sa_orm.relationship - return f(*args, **kwargs) - - def __getattr__(self, name: str) -> t.Any: - if name == "relation": - return self._relation - - if name == "event": - return sa_event - - if name.startswith("_"): - raise AttributeError(name) - - for mod in (sa, sa_orm): - if hasattr(mod, name): - return getattr(mod, name) - - raise AttributeError(name) diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/model.py b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/model.py deleted file mode 100644 index c6f9e5a..0000000 --- a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/model.py +++ /dev/null @@ -1,330 +0,0 @@ -from __future__ import annotations - -import re -import typing as t - -import sqlalchemy as sa -import sqlalchemy.orm as sa_orm - -from .query import Query - -if t.TYPE_CHECKING: - from .extension import SQLAlchemy - - -class _QueryProperty: - """A class property that creates a query object for a model. - - :meta private: - """ - - def __get__(self, obj: Model | None, cls: type[Model]) -> Query: - return cls.query_class( - cls, session=cls.__fsa__.session() # type: ignore[arg-type] - ) - - -class Model: - """The base class of the :attr:`.SQLAlchemy.Model` declarative model class. - - To define models, subclass :attr:`db.Model <.SQLAlchemy.Model>`, not this. To - customize ``db.Model``, subclass this and pass it as ``model_class`` to - :class:`.SQLAlchemy`. To customize ``db.Model`` at the metaclass level, pass an - already created declarative model class as ``model_class``. - """ - - __fsa__: t.ClassVar[SQLAlchemy] - """Internal reference to the extension object. - - :meta private: - """ - - query_class: t.ClassVar[type[Query]] = Query - """Query class used by :attr:`query`. Defaults to :attr:`.SQLAlchemy.Query`, which - defaults to :class:`.Query`. - """ - - query: t.ClassVar[Query] = _QueryProperty() # type: ignore[assignment] - """A SQLAlchemy query for a model. Equivalent to ``db.session.query(Model)``. Can be - customized per-model by overriding :attr:`query_class`. - - .. warning:: - The query interface is considered legacy in SQLAlchemy. Prefer using - ``session.execute(select())`` instead. - """ - - def __repr__(self) -> str: - state = sa.inspect(self) - assert state is not None - - if state.transient: - pk = f"(transient {id(self)})" - elif state.pending: - pk = f"(pending {id(self)})" - else: - pk = ", ".join(map(str, state.identity)) - - return f"<{type(self).__name__} {pk}>" - - -class BindMetaMixin(type): - """Metaclass mixin that sets a model's ``metadata`` based on its ``__bind_key__``. - - If the model sets ``metadata`` or ``__table__`` directly, ``__bind_key__`` is - ignored. If the ``metadata`` is the same as the parent model, it will not be set - directly on the child model. - """ - - __fsa__: SQLAlchemy - metadata: sa.MetaData - - def __init__( - cls, name: str, bases: tuple[type, ...], d: dict[str, t.Any], **kwargs: t.Any - ) -> None: - if not ("metadata" in cls.__dict__ or "__table__" in cls.__dict__): - bind_key = getattr(cls, "__bind_key__", None) - parent_metadata = getattr(cls, "metadata", None) - metadata = cls.__fsa__._make_metadata(bind_key) - - if metadata is not parent_metadata: - cls.metadata = metadata - - super().__init__(name, bases, d, **kwargs) - - -class BindMixin: - """DeclarativeBase mixin to set a model's ``metadata`` based on ``__bind_key__``. - - If no ``__bind_key__`` is specified, the model will use the default metadata - provided by ``DeclarativeBase`` or ``DeclarativeBaseNoMeta``. - If the model doesn't set ``metadata`` or ``__table__`` directly - and does set ``__bind_key__``, the model will use the metadata - for the specified bind key. - If the ``metadata`` is the same as the parent model, it will not be set - directly on the child model. - - .. versionchanged:: 3.1.0 - """ - - __fsa__: SQLAlchemy - metadata: sa.MetaData - - @classmethod - def __init_subclass__(cls: t.Type[BindMixin], **kwargs: t.Dict[str, t.Any]) -> None: - if not ("metadata" in cls.__dict__ or "__table__" in cls.__dict__) and hasattr( - cls, "__bind_key__" - ): - bind_key = getattr(cls, "__bind_key__", None) - parent_metadata = getattr(cls, "metadata", None) - metadata = cls.__fsa__._make_metadata(bind_key) - - if metadata is not parent_metadata: - cls.metadata = metadata - - super().__init_subclass__(**kwargs) - - -class NameMetaMixin(type): - """Metaclass mixin that sets a model's ``__tablename__`` by converting the - ``CamelCase`` class name to ``snake_case``. A name is set for non-abstract models - that do not otherwise define ``__tablename__``. If a model does not define a primary - key, it will not generate a name or ``__table__``, for single-table inheritance. - """ - - metadata: sa.MetaData - __tablename__: str - __table__: sa.Table - - def __init__( - cls, name: str, bases: tuple[type, ...], d: dict[str, t.Any], **kwargs: t.Any - ) -> None: - if should_set_tablename(cls): - cls.__tablename__ = camel_to_snake_case(cls.__name__) - - super().__init__(name, bases, d, **kwargs) - - # __table_cls__ has run. If no table was created, use the parent table. - if ( - "__tablename__" not in cls.__dict__ - and "__table__" in cls.__dict__ - and cls.__dict__["__table__"] is None - ): - del cls.__table__ - - def __table_cls__(cls, *args: t.Any, **kwargs: t.Any) -> sa.Table | None: - """This is called by SQLAlchemy during mapper setup. It determines the final - table object that the model will use. - - If no primary key is found, that indicates single-table inheritance, so no table - will be created and ``__tablename__`` will be unset. - """ - schema = kwargs.get("schema") - - if schema is None: - key = args[0] - else: - key = f"{schema}.{args[0]}" - - # Check if a table with this name already exists. Allows reflected tables to be - # applied to models by name. - if key in cls.metadata.tables: - return sa.Table(*args, **kwargs) - - # If a primary key is found, create a table for joined-table inheritance. - for arg in args: - if (isinstance(arg, sa.Column) and arg.primary_key) or isinstance( - arg, sa.PrimaryKeyConstraint - ): - return sa.Table(*args, **kwargs) - - # If no base classes define a table, return one that's missing a primary key - # so SQLAlchemy shows the correct error. - for base in cls.__mro__[1:-1]: - if "__table__" in base.__dict__: - break - else: - return sa.Table(*args, **kwargs) - - # Single-table inheritance, use the parent table name. __init__ will unset - # __table__ based on this. - if "__tablename__" in cls.__dict__: - del cls.__tablename__ - - return None - - -class NameMixin: - """DeclarativeBase mixin that sets a model's ``__tablename__`` by converting the - ``CamelCase`` class name to ``snake_case``. A name is set for non-abstract models - that do not otherwise define ``__tablename__``. If a model does not define a primary - key, it will not generate a name or ``__table__``, for single-table inheritance. - - .. versionchanged:: 3.1.0 - """ - - metadata: sa.MetaData - __tablename__: str - __table__: sa.Table - - @classmethod - def __init_subclass__(cls: t.Type[NameMixin], **kwargs: t.Dict[str, t.Any]) -> None: - if should_set_tablename(cls): - cls.__tablename__ = camel_to_snake_case(cls.__name__) - - super().__init_subclass__(**kwargs) - - # __table_cls__ has run. If no table was created, use the parent table. - if ( - "__tablename__" not in cls.__dict__ - and "__table__" in cls.__dict__ - and cls.__dict__["__table__"] is None - ): - del cls.__table__ - - @classmethod - def __table_cls__(cls, *args: t.Any, **kwargs: t.Any) -> sa.Table | None: - """This is called by SQLAlchemy during mapper setup. It determines the final - table object that the model will use. - - If no primary key is found, that indicates single-table inheritance, so no table - will be created and ``__tablename__`` will be unset. - """ - schema = kwargs.get("schema") - - if schema is None: - key = args[0] - else: - key = f"{schema}.{args[0]}" - - # Check if a table with this name already exists. Allows reflected tables to be - # applied to models by name. - if key in cls.metadata.tables: - return sa.Table(*args, **kwargs) - - # If a primary key is found, create a table for joined-table inheritance. - for arg in args: - if (isinstance(arg, sa.Column) and arg.primary_key) or isinstance( - arg, sa.PrimaryKeyConstraint - ): - return sa.Table(*args, **kwargs) - - # If no base classes define a table, return one that's missing a primary key - # so SQLAlchemy shows the correct error. - for base in cls.__mro__[1:-1]: - if "__table__" in base.__dict__: - break - else: - return sa.Table(*args, **kwargs) - - # Single-table inheritance, use the parent table name. __init__ will unset - # __table__ based on this. - if "__tablename__" in cls.__dict__: - del cls.__tablename__ - - return None - - -def should_set_tablename(cls: type) -> bool: - """Determine whether ``__tablename__`` should be generated for a model. - - - If no class in the MRO sets a name, one should be generated. - - If a declared attr is found, it should be used instead. - - If a name is found, it should be used if the class is a mixin, otherwise one - should be generated. - - Abstract models should not have one generated. - - Later, ``__table_cls__`` will determine if the model looks like single or - joined-table inheritance. If no primary key is found, the name will be unset. - """ - if ( - cls.__dict__.get("__abstract__", False) - or ( - not issubclass(cls, (sa_orm.DeclarativeBase, sa_orm.DeclarativeBaseNoMeta)) - and not any(isinstance(b, sa_orm.DeclarativeMeta) for b in cls.__mro__[1:]) - ) - or any( - (b is sa_orm.DeclarativeBase or b is sa_orm.DeclarativeBaseNoMeta) - for b in cls.__bases__ - ) - ): - return False - - for base in cls.__mro__: - if "__tablename__" not in base.__dict__: - continue - - if isinstance(base.__dict__["__tablename__"], sa_orm.declared_attr): - return False - - return not ( - base is cls - or base.__dict__.get("__abstract__", False) - or not ( - # SQLAlchemy 1.x - isinstance(base, sa_orm.DeclarativeMeta) - # 2.x: DeclarativeBas uses this as metaclass - or isinstance(base, sa_orm.decl_api.DeclarativeAttributeIntercept) - # 2.x: DeclarativeBaseNoMeta doesn't use a metaclass - or issubclass(base, sa_orm.DeclarativeBaseNoMeta) - ) - ) - - return True - - -def camel_to_snake_case(name: str) -> str: - """Convert a ``CamelCase`` name to ``snake_case``.""" - name = re.sub(r"((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))", r"_\1", name) - return name.lower().lstrip("_") - - -class DefaultMeta(BindMetaMixin, NameMetaMixin, sa_orm.DeclarativeMeta): - """SQLAlchemy declarative metaclass that provides ``__bind_key__`` and - ``__tablename__`` support. - """ - - -class DefaultMetaNoName(BindMetaMixin, sa_orm.DeclarativeMeta): - """SQLAlchemy declarative metaclass that provides ``__bind_key__`` and - ``__tablename__`` support. - """ diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/pagination.py b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/pagination.py deleted file mode 100644 index 3d49d6e..0000000 --- a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/pagination.py +++ /dev/null @@ -1,364 +0,0 @@ -from __future__ import annotations - -import typing as t -from math import ceil - -import sqlalchemy as sa -import sqlalchemy.orm as sa_orm -from flask import abort -from flask import request - - -class Pagination: - """Apply an offset and limit to the query based on the current page and number of - items per page. - - Don't create pagination objects manually. They are created by - :meth:`.SQLAlchemy.paginate` and :meth:`.Query.paginate`. - - This is a base class, a subclass must implement :meth:`_query_items` and - :meth:`_query_count`. Those methods will use arguments passed as ``kwargs`` to - perform the queries. - - :param page: The current page, used to calculate the offset. Defaults to the - ``page`` query arg during a request, or 1 otherwise. - :param per_page: The maximum number of items on a page, used to calculate the - offset and limit. Defaults to the ``per_page`` query arg during a request, - or 20 otherwise. - :param max_per_page: The maximum allowed value for ``per_page``, to limit a - user-provided value. Use ``None`` for no limit. Defaults to 100. - :param error_out: Abort with a ``404 Not Found`` error if no items are returned - and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if - either are not ints. - :param count: Calculate the total number of values by issuing an extra count - query. For very complex queries this may be inaccurate or slow, so it can be - disabled and set manually if necessary. - :param kwargs: Information about the query to paginate. Different subclasses will - require different arguments. - - .. versionchanged:: 3.0 - Iterating over a pagination object iterates over its items. - - .. versionchanged:: 3.0 - Creating instances manually is not a public API. - """ - - def __init__( - self, - page: int | None = None, - per_page: int | None = None, - max_per_page: int | None = 100, - error_out: bool = True, - count: bool = True, - **kwargs: t.Any, - ) -> None: - self._query_args = kwargs - page, per_page = self._prepare_page_args( - page=page, - per_page=per_page, - max_per_page=max_per_page, - error_out=error_out, - ) - - self.page: int = page - """The current page.""" - - self.per_page: int = per_page - """The maximum number of items on a page.""" - - self.max_per_page: int | None = max_per_page - """The maximum allowed value for ``per_page``.""" - - items = self._query_items() - - if not items and page != 1 and error_out: - abort(404) - - self.items: list[t.Any] = items - """The items on the current page. Iterating over the pagination object is - equivalent to iterating over the items. - """ - - if count: - total = self._query_count() - else: - total = None - - self.total: int | None = total - """The total number of items across all pages.""" - - @staticmethod - def _prepare_page_args( - *, - page: int | None = None, - per_page: int | None = None, - max_per_page: int | None = None, - error_out: bool = True, - ) -> tuple[int, int]: - if request: - if page is None: - try: - page = int(request.args.get("page", 1)) - except (TypeError, ValueError): - if error_out: - abort(404) - - page = 1 - - if per_page is None: - try: - per_page = int(request.args.get("per_page", 20)) - except (TypeError, ValueError): - if error_out: - abort(404) - - per_page = 20 - else: - if page is None: - page = 1 - - if per_page is None: - per_page = 20 - - if max_per_page is not None: - per_page = min(per_page, max_per_page) - - if page < 1: - if error_out: - abort(404) - else: - page = 1 - - if per_page < 1: - if error_out: - abort(404) - else: - per_page = 20 - - return page, per_page - - @property - def _query_offset(self) -> int: - """The index of the first item to query, passed to ``offset()``. - - :meta private: - - .. versionadded:: 3.0 - """ - return (self.page - 1) * self.per_page - - def _query_items(self) -> list[t.Any]: - """Execute the query to get the items on the current page. - - Uses init arguments stored in :attr:`_query_args`. - - :meta private: - - .. versionadded:: 3.0 - """ - raise NotImplementedError - - def _query_count(self) -> int: - """Execute the query to get the total number of items. - - Uses init arguments stored in :attr:`_query_args`. - - :meta private: - - .. versionadded:: 3.0 - """ - raise NotImplementedError - - @property - def first(self) -> int: - """The number of the first item on the page, starting from 1, or 0 if there are - no items. - - .. versionadded:: 3.0 - """ - if len(self.items) == 0: - return 0 - - return (self.page - 1) * self.per_page + 1 - - @property - def last(self) -> int: - """The number of the last item on the page, starting from 1, inclusive, or 0 if - there are no items. - - .. versionadded:: 3.0 - """ - first = self.first - return max(first, first + len(self.items) - 1) - - @property - def pages(self) -> int: - """The total number of pages.""" - if self.total == 0 or self.total is None: - return 0 - - return ceil(self.total / self.per_page) - - @property - def has_prev(self) -> bool: - """``True`` if this is not the first page.""" - return self.page > 1 - - @property - def prev_num(self) -> int | None: - """The previous page number, or ``None`` if this is the first page.""" - if not self.has_prev: - return None - - return self.page - 1 - - def prev(self, *, error_out: bool = False) -> Pagination: - """Query the :class:`Pagination` object for the previous page. - - :param error_out: Abort with a ``404 Not Found`` error if no items are returned - and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if - either are not ints. - """ - p = type(self)( - page=self.page - 1, - per_page=self.per_page, - error_out=error_out, - count=False, - **self._query_args, - ) - p.total = self.total - return p - - @property - def has_next(self) -> bool: - """``True`` if this is not the last page.""" - return self.page < self.pages - - @property - def next_num(self) -> int | None: - """The next page number, or ``None`` if this is the last page.""" - if not self.has_next: - return None - - return self.page + 1 - - def next(self, *, error_out: bool = False) -> Pagination: - """Query the :class:`Pagination` object for the next page. - - :param error_out: Abort with a ``404 Not Found`` error if no items are returned - and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if - either are not ints. - """ - p = type(self)( - page=self.page + 1, - per_page=self.per_page, - max_per_page=self.max_per_page, - error_out=error_out, - count=False, - **self._query_args, - ) - p.total = self.total - return p - - def iter_pages( - self, - *, - left_edge: int = 2, - left_current: int = 2, - right_current: int = 4, - right_edge: int = 2, - ) -> t.Iterator[int | None]: - """Yield page numbers for a pagination widget. Skipped pages between the edges - and middle are represented by a ``None``. - - For example, if there are 20 pages and the current page is 7, the following - values are yielded. - - .. code-block:: python - - 1, 2, None, 5, 6, 7, 8, 9, 10, 11, None, 19, 20 - - :param left_edge: How many pages to show from the first page. - :param left_current: How many pages to show left of the current page. - :param right_current: How many pages to show right of the current page. - :param right_edge: How many pages to show from the last page. - - .. versionchanged:: 3.0 - Improved efficiency of calculating what to yield. - - .. versionchanged:: 3.0 - ``right_current`` boundary is inclusive. - - .. versionchanged:: 3.0 - All parameters are keyword-only. - """ - pages_end = self.pages + 1 - - if pages_end == 1: - return - - left_end = min(1 + left_edge, pages_end) - yield from range(1, left_end) - - if left_end == pages_end: - return - - mid_start = max(left_end, self.page - left_current) - mid_end = min(self.page + right_current + 1, pages_end) - - if mid_start - left_end > 0: - yield None - - yield from range(mid_start, mid_end) - - if mid_end == pages_end: - return - - right_start = max(mid_end, pages_end - right_edge) - - if right_start - mid_end > 0: - yield None - - yield from range(right_start, pages_end) - - def __iter__(self) -> t.Iterator[t.Any]: - yield from self.items - - -class SelectPagination(Pagination): - """Returned by :meth:`.SQLAlchemy.paginate`. Takes ``select`` and ``session`` - arguments in addition to the :class:`Pagination` arguments. - - .. versionadded:: 3.0 - """ - - def _query_items(self) -> list[t.Any]: - select = self._query_args["select"] - select = select.limit(self.per_page).offset(self._query_offset) - session = self._query_args["session"] - return list(session.execute(select).unique().scalars()) - - def _query_count(self) -> int: - select = self._query_args["select"] - sub = select.options(sa_orm.lazyload("*")).order_by(None).subquery() - session = self._query_args["session"] - out = session.execute(sa.select(sa.func.count()).select_from(sub)).scalar() - return out # type: ignore[no-any-return] - - -class QueryPagination(Pagination): - """Returned by :meth:`.Query.paginate`. Takes a ``query`` argument in addition to - the :class:`Pagination` arguments. - - .. versionadded:: 3.0 - """ - - def _query_items(self) -> list[t.Any]: - query = self._query_args["query"] - out = query.limit(self.per_page).offset(self._query_offset).all() - return out # type: ignore[no-any-return] - - def _query_count(self) -> int: - # Query.count automatically disables eager loads - out = self._query_args["query"].order_by(None).count() - return out # type: ignore[no-any-return] diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/py.typed b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/query.py b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/query.py deleted file mode 100644 index 35f927d..0000000 --- a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/query.py +++ /dev/null @@ -1,105 +0,0 @@ -from __future__ import annotations - -import typing as t - -import sqlalchemy.exc as sa_exc -import sqlalchemy.orm as sa_orm -from flask import abort - -from .pagination import Pagination -from .pagination import QueryPagination - - -class Query(sa_orm.Query): # type: ignore[type-arg] - """SQLAlchemy :class:`~sqlalchemy.orm.query.Query` subclass with some extra methods - useful for querying in a web application. - - This is the default query class for :attr:`.Model.query`. - - .. versionchanged:: 3.0 - Renamed to ``Query`` from ``BaseQuery``. - """ - - def get_or_404(self, ident: t.Any, description: str | None = None) -> t.Any: - """Like :meth:`~sqlalchemy.orm.Query.get` but aborts with a ``404 Not Found`` - error instead of returning ``None``. - - :param ident: The primary key to query. - :param description: A custom message to show on the error page. - """ - rv = self.get(ident) - - if rv is None: - abort(404, description=description) - - return rv - - def first_or_404(self, description: str | None = None) -> t.Any: - """Like :meth:`~sqlalchemy.orm.Query.first` but aborts with a ``404 Not Found`` - error instead of returning ``None``. - - :param description: A custom message to show on the error page. - """ - rv = self.first() - - if rv is None: - abort(404, description=description) - - return rv - - def one_or_404(self, description: str | None = None) -> t.Any: - """Like :meth:`~sqlalchemy.orm.Query.one` but aborts with a ``404 Not Found`` - error instead of raising ``NoResultFound`` or ``MultipleResultsFound``. - - :param description: A custom message to show on the error page. - - .. versionadded:: 3.0 - """ - try: - return self.one() - except (sa_exc.NoResultFound, sa_exc.MultipleResultsFound): - abort(404, description=description) - - def paginate( - self, - *, - page: int | None = None, - per_page: int | None = None, - max_per_page: int | None = None, - error_out: bool = True, - count: bool = True, - ) -> Pagination: - """Apply an offset and limit to the query based on the current page and number - of items per page, returning a :class:`.Pagination` object. - - :param page: The current page, used to calculate the offset. Defaults to the - ``page`` query arg during a request, or 1 otherwise. - :param per_page: The maximum number of items on a page, used to calculate the - offset and limit. Defaults to the ``per_page`` query arg during a request, - or 20 otherwise. - :param max_per_page: The maximum allowed value for ``per_page``, to limit a - user-provided value. Use ``None`` for no limit. Defaults to 100. - :param error_out: Abort with a ``404 Not Found`` error if no items are returned - and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if - either are not ints. - :param count: Calculate the total number of values by issuing an extra count - query. For very complex queries this may be inaccurate or slow, so it can be - disabled and set manually if necessary. - - .. versionchanged:: 3.0 - All parameters are keyword-only. - - .. versionchanged:: 3.0 - The ``count`` query is more efficient. - - .. versionchanged:: 3.0 - ``max_per_page`` defaults to 100. - """ - return QueryPagination( - query=self, - page=page, - per_page=per_page, - max_per_page=max_per_page, - error_out=error_out, - count=count, - ) diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/record_queries.py b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/record_queries.py deleted file mode 100644 index e8273be..0000000 --- a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/record_queries.py +++ /dev/null @@ -1,117 +0,0 @@ -from __future__ import annotations - -import dataclasses -import inspect -import typing as t -from time import perf_counter - -import sqlalchemy as sa -import sqlalchemy.event as sa_event -from flask import current_app -from flask import g -from flask import has_app_context - - -def get_recorded_queries() -> list[_QueryInfo]: - """Get the list of recorded query information for the current session. Queries are - recorded if the config :data:`.SQLALCHEMY_RECORD_QUERIES` is enabled. - - Each query info object has the following attributes: - - ``statement`` - The string of SQL generated by SQLAlchemy with parameter placeholders. - ``parameters`` - The parameters sent with the SQL statement. - ``start_time`` / ``end_time`` - Timing info about when the query started execution and when the results where - returned. Accuracy and value depends on the operating system. - ``duration`` - The time the query took in seconds. - ``location`` - A string description of where in your application code the query was executed. - This may not be possible to calculate, and the format is not stable. - - .. versionchanged:: 3.0 - Renamed from ``get_debug_queries``. - - .. versionchanged:: 3.0 - The info object is a dataclass instead of a tuple. - - .. versionchanged:: 3.0 - The info object attribute ``context`` is renamed to ``location``. - - .. versionchanged:: 3.0 - Not enabled automatically in debug or testing mode. - """ - return g.get("_sqlalchemy_queries", []) # type: ignore[no-any-return] - - -@dataclasses.dataclass -class _QueryInfo: - """Information about an executed query. Returned by :func:`get_recorded_queries`. - - .. versionchanged:: 3.0 - Renamed from ``_DebugQueryTuple``. - - .. versionchanged:: 3.0 - Changed to a dataclass instead of a tuple. - - .. versionchanged:: 3.0 - ``context`` is renamed to ``location``. - """ - - statement: str | None - parameters: t.Any - start_time: float - end_time: float - location: str - - @property - def duration(self) -> float: - return self.end_time - self.start_time - - -def _listen(engine: sa.engine.Engine) -> None: - sa_event.listen(engine, "before_cursor_execute", _record_start, named=True) - sa_event.listen(engine, "after_cursor_execute", _record_end, named=True) - - -def _record_start(context: sa.engine.ExecutionContext, **kwargs: t.Any) -> None: - if not has_app_context(): - return - - context._fsa_start_time = perf_counter() # type: ignore[attr-defined] - - -def _record_end(context: sa.engine.ExecutionContext, **kwargs: t.Any) -> None: - if not has_app_context(): - return - - if "_sqlalchemy_queries" not in g: - g._sqlalchemy_queries = [] - - import_top = current_app.import_name.partition(".")[0] - import_dot = f"{import_top}." - frame = inspect.currentframe() - - while frame: - name = frame.f_globals.get("__name__") - - if name and (name == import_top or name.startswith(import_dot)): - code = frame.f_code - location = f"{code.co_filename}:{frame.f_lineno} ({code.co_name})" - break - - frame = frame.f_back - else: - location = "" - - g._sqlalchemy_queries.append( - _QueryInfo( - statement=context.statement, - parameters=context.parameters, - start_time=context._fsa_start_time, # type: ignore[attr-defined] - end_time=perf_counter(), - location=location, - ) - ) diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/session.py b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/session.py deleted file mode 100644 index 631fffa..0000000 --- a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/session.py +++ /dev/null @@ -1,111 +0,0 @@ -from __future__ import annotations - -import typing as t - -import sqlalchemy as sa -import sqlalchemy.exc as sa_exc -import sqlalchemy.orm as sa_orm -from flask.globals import app_ctx - -if t.TYPE_CHECKING: - from .extension import SQLAlchemy - - -class Session(sa_orm.Session): - """A SQLAlchemy :class:`~sqlalchemy.orm.Session` class that chooses what engine to - use based on the bind key associated with the metadata associated with the thing - being queried. - - To customize ``db.session``, subclass this and pass it as the ``class_`` key in the - ``session_options`` to :class:`.SQLAlchemy`. - - .. versionchanged:: 3.0 - Renamed from ``SignallingSession``. - """ - - def __init__(self, db: SQLAlchemy, **kwargs: t.Any) -> None: - super().__init__(**kwargs) - self._db = db - self._model_changes: dict[object, tuple[t.Any, str]] = {} - - def get_bind( - self, - mapper: t.Any | None = None, - clause: t.Any | None = None, - bind: sa.engine.Engine | sa.engine.Connection | None = None, - **kwargs: t.Any, - ) -> sa.engine.Engine | sa.engine.Connection: - """Select an engine based on the ``bind_key`` of the metadata associated with - the model or table being queried. If no bind key is set, uses the default bind. - - .. versionchanged:: 3.0.3 - Fix finding the bind for a joined inheritance model. - - .. versionchanged:: 3.0 - The implementation more closely matches the base SQLAlchemy implementation. - - .. versionchanged:: 2.1 - Support joining an external transaction. - """ - if bind is not None: - return bind - - engines = self._db.engines - - if mapper is not None: - try: - mapper = sa.inspect(mapper) - except sa_exc.NoInspectionAvailable as e: - if isinstance(mapper, type): - raise sa_orm.exc.UnmappedClassError(mapper) from e - - raise - - engine = _clause_to_engine(mapper.local_table, engines) - - if engine is not None: - return engine - - if clause is not None: - engine = _clause_to_engine(clause, engines) - - if engine is not None: - return engine - - if None in engines: - return engines[None] - - return super().get_bind(mapper=mapper, clause=clause, bind=bind, **kwargs) - - -def _clause_to_engine( - clause: sa.ClauseElement | None, - engines: t.Mapping[str | None, sa.engine.Engine], -) -> sa.engine.Engine | None: - """If the clause is a table, return the engine associated with the table's - metadata's bind key. - """ - table = None - - if clause is not None: - if isinstance(clause, sa.Table): - table = clause - elif isinstance(clause, sa.UpdateBase) and isinstance(clause.table, sa.Table): - table = clause.table - - if table is not None and "bind_key" in table.metadata.info: - key = table.metadata.info["bind_key"] - - if key not in engines: - raise sa_exc.UnboundExecutionError( - f"Bind key '{key}' is not in 'SQLALCHEMY_BINDS' config." - ) - - return engines[key] - - return None - - -def _app_ctx_id() -> int: - """Get the id of the current Flask application context for the session scope.""" - return id(app_ctx._get_current_object()) # type: ignore[attr-defined] diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/table.py b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/table.py deleted file mode 100644 index ab08a69..0000000 --- a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/table.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -import typing as t - -import sqlalchemy as sa -import sqlalchemy.sql.schema as sa_sql_schema - - -class _Table(sa.Table): - @t.overload - def __init__( - self, - name: str, - *args: sa_sql_schema.SchemaItem, - bind_key: str | None = None, - **kwargs: t.Any, - ) -> None: - ... - - @t.overload - def __init__( - self, - name: str, - metadata: sa.MetaData, - *args: sa_sql_schema.SchemaItem, - **kwargs: t.Any, - ) -> None: - ... - - @t.overload - def __init__( - self, name: str, *args: sa_sql_schema.SchemaItem, **kwargs: t.Any - ) -> None: - ... - - def __init__( - self, name: str, *args: sa_sql_schema.SchemaItem, **kwargs: t.Any - ) -> None: - super().__init__(name, *args, **kwargs) # type: ignore[arg-type] diff --git a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/track_modifications.py b/blog-app/venv/Lib/site-packages/flask_sqlalchemy/track_modifications.py deleted file mode 100644 index 7028b65..0000000 --- a/blog-app/venv/Lib/site-packages/flask_sqlalchemy/track_modifications.py +++ /dev/null @@ -1,88 +0,0 @@ -from __future__ import annotations - -import typing as t - -import sqlalchemy as sa -import sqlalchemy.event as sa_event -import sqlalchemy.orm as sa_orm -from flask import current_app -from flask import has_app_context -from flask.signals import Namespace # type: ignore[attr-defined] - -if t.TYPE_CHECKING: - from .session import Session - -_signals = Namespace() - -models_committed = _signals.signal("models-committed") -"""This Blinker signal is sent after the session is committed if there were changed -models in the session. - -The sender is the application that emitted the changes. The receiver is passed the -``changes`` argument with a list of tuples in the form ``(instance, operation)``. -The operations are ``"insert"``, ``"update"``, and ``"delete"``. -""" - -before_models_committed = _signals.signal("before-models-committed") -"""This signal works exactly like :data:`models_committed` but is emitted before the -commit takes place. -""" - - -def _listen(session: sa_orm.scoped_session[Session]) -> None: - sa_event.listen(session, "before_flush", _record_ops, named=True) - sa_event.listen(session, "before_commit", _record_ops, named=True) - sa_event.listen(session, "before_commit", _before_commit) - sa_event.listen(session, "after_commit", _after_commit) - sa_event.listen(session, "after_rollback", _after_rollback) - - -def _record_ops(session: Session, **kwargs: t.Any) -> None: - if not has_app_context(): - return - - if not current_app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]: - return - - for targets, operation in ( - (session.new, "insert"), - (session.dirty, "update"), - (session.deleted, "delete"), - ): - for target in targets: - state = sa.inspect(target) - key = state.identity_key if state.has_identity else id(target) - session._model_changes[key] = (target, operation) - - -def _before_commit(session: Session) -> None: - if not has_app_context(): - return - - app = current_app._get_current_object() # type: ignore[attr-defined] - - if not app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]: - return - - if session._model_changes: - changes = list(session._model_changes.values()) - before_models_committed.send(app, changes=changes) - - -def _after_commit(session: Session) -> None: - if not has_app_context(): - return - - app = current_app._get_current_object() # type: ignore[attr-defined] - - if not app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]: - return - - if session._model_changes: - changes = list(session._model_changes.values()) - models_committed.send(app, changes=changes) - session._model_changes.clear() - - -def _after_rollback(session: Session) -> None: - session._model_changes.clear() diff --git a/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/INSTALLER b/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/METADATA b/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/METADATA deleted file mode 100644 index 6190cbd..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/METADATA +++ /dev/null @@ -1,116 +0,0 @@ -Metadata-Version: 2.4 -Name: greenlet -Version: 3.2.2 -Summary: Lightweight in-process concurrent programming -Home-page: https://greenlet.readthedocs.io/ -Author: Alexey Borzenkov -Author-email: snaury@gmail.com -Maintainer: Jason Madden -Maintainer-email: jason@seecoresoftware.com -License: MIT AND Python-2.0 -Project-URL: Bug Tracker, https://github.com/python-greenlet/greenlet/issues -Project-URL: Source Code, https://github.com/python-greenlet/greenlet/ -Project-URL: Documentation, https://greenlet.readthedocs.io/ -Project-URL: Changes, https://greenlet.readthedocs.io/en/latest/changes.html -Keywords: greenlet coroutine concurrency threads cooperative -Platform: any -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Natural Language :: English -Classifier: Programming Language :: C -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Operating System :: OS Independent -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Requires-Python: >=3.9 -Description-Content-Type: text/x-rst -License-File: LICENSE -License-File: LICENSE.PSF -Provides-Extra: docs -Requires-Dist: Sphinx; extra == "docs" -Requires-Dist: furo; extra == "docs" -Provides-Extra: test -Requires-Dist: objgraph; extra == "test" -Requires-Dist: psutil; extra == "test" -Dynamic: author -Dynamic: author-email -Dynamic: classifier -Dynamic: description -Dynamic: description-content-type -Dynamic: home-page -Dynamic: keywords -Dynamic: license -Dynamic: license-file -Dynamic: maintainer -Dynamic: maintainer-email -Dynamic: platform -Dynamic: project-url -Dynamic: provides-extra -Dynamic: requires-python -Dynamic: summary - -.. This file is included into docs/history.rst - - -Greenlets are lightweight coroutines for in-process concurrent -programming. - -The "greenlet" package is a spin-off of `Stackless`_, a version of -CPython that supports micro-threads called "tasklets". Tasklets run -pseudo-concurrently (typically in a single or a few OS-level threads) -and are synchronized with data exchanges on "channels". - -A "greenlet", on the other hand, is a still more primitive notion of -micro-thread with no implicit scheduling; coroutines, in other words. -This is useful when you want to control exactly when your code runs. -You can build custom scheduled micro-threads on top of greenlet; -however, it seems that greenlets are useful on their own as a way to -make advanced control flow structures. For example, we can recreate -generators; the difference with Python's own generators is that our -generators can call nested functions and the nested functions can -yield values too. (Additionally, you don't need a "yield" keyword. See -the example in `test_generator.py -`_). - -Greenlets are provided as a C extension module for the regular unmodified -interpreter. - -.. _`Stackless`: http://www.stackless.com - - -Who is using Greenlet? -====================== - -There are several libraries that use Greenlet as a more flexible -alternative to Python's built in coroutine support: - - - `Concurrence`_ - - `Eventlet`_ - - `Gevent`_ - -.. _Concurrence: http://opensource.hyves.org/concurrence/ -.. _Eventlet: http://eventlet.net/ -.. _Gevent: http://www.gevent.org/ - -Getting Greenlet -================ - -The easiest way to get Greenlet is to install it with pip:: - - pip install greenlet - - -Source code archives and binary distributions are available on the -python package index at https://pypi.org/project/greenlet - -The source code repository is hosted on github: -https://github.com/python-greenlet/greenlet - -Documentation is available on readthedocs.org: -https://greenlet.readthedocs.io diff --git a/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/RECORD b/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/RECORD deleted file mode 100644 index c376441..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/RECORD +++ /dev/null @@ -1,120 +0,0 @@ -../../include/site/python3.10/greenlet/greenlet.h,sha256=sz5pYRSQqedgOt2AMgxLZdTjO-qcr_JMvgiEJR9IAJ8,4755 -greenlet-3.2.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -greenlet-3.2.2.dist-info/METADATA,sha256=X57v7sBEYSNABzNQXpCK_CGTvT2GasTRzF6Qjy9IUys,4193 -greenlet-3.2.2.dist-info/RECORD,, -greenlet-3.2.2.dist-info/WHEEL,sha256=cApr8aT7ro1gNNNzftTDVqaaXPK4_jWf4Qi4QFW6aVk,101 -greenlet-3.2.2.dist-info/licenses/LICENSE,sha256=dpgx1uXfrywggC-sz_H6-0wgJd2PYlPfpH_K1Z1NCXk,1434 -greenlet-3.2.2.dist-info/licenses/LICENSE.PSF,sha256=5f88I8EQ5JTNfXNsEP2W1GJFe6_soxCEDbZScpjH1Gs,2424 -greenlet-3.2.2.dist-info/top_level.txt,sha256=YSnRsCRoO61JGlP57o8iKL6rdLWDWuiyKD8ekpWUsDc,9 -greenlet/CObjects.cpp,sha256=OPej1bWBgc4sRrTRQ2aFFML9pzDYKlKhlJSjsI0X_eU,3508 -greenlet/PyGreenlet.cpp,sha256=ogWsQ5VhSdItWRLLpWOgSuqYuM3QwQ4cVCxOQIgHx6E,23441 -greenlet/PyGreenlet.hpp,sha256=2ZQlOxYNoy7QwD7mppFoOXe_At56NIsJ0eNsE_hoSsw,1463 -greenlet/PyGreenletUnswitchable.cpp,sha256=PQE0fSZa_IOyUM44IESHkJoD2KtGW3dkhkmZSYY3WHs,4375 -greenlet/PyModule.cpp,sha256=J2TH06dGcNEarioS6NbWXkdME8hJY05XVbdqLrfO5w4,8587 -greenlet/TBrokenGreenlet.cpp,sha256=smN26uC7ahAbNYiS10rtWPjCeTG4jevM8siA2sjJiXg,1021 -greenlet/TExceptionState.cpp,sha256=U7Ctw9fBdNraS0d174MoQW7bN-ae209Ta0JuiKpcpVI,1359 -greenlet/TGreenlet.cpp,sha256=HGYGKpmKYqQ842tASW-QaaV8wua4a5XV_quYKPDsV_Y,25731 -greenlet/TGreenlet.hpp,sha256=7ti9va3tzIdFkQ-FEEEkG5p7vQ3PTdYlDFMHLcnIHw4,28043 -greenlet/TGreenletGlobals.cpp,sha256=YyEmDjKf1g32bsL-unIUScFLnnA1fzLWf2gOMd-D0Zw,3264 -greenlet/TMainGreenlet.cpp,sha256=fvgb8HHB-FVTPEKjR1s_ifCZSpp5D5YQByik0CnIABg,3276 -greenlet/TPythonState.cpp,sha256=vBMJT9qScTSIqhnOTVJqsGug3WbKv9dDt0cOqyhUk8w,15779 -greenlet/TStackState.cpp,sha256=V444I8Jj9DhQz-9leVW_9dtiSRjaE1NMlgDG02Xxq-Y,7381 -greenlet/TThreadState.hpp,sha256=2Jgg7DtGggMYR_x3CLAvAFf1mIdIDtQvSSItcdmX4ZQ,19131 -greenlet/TThreadStateCreator.hpp,sha256=uYTexDWooXSSgUc5uh-Mhm5BQi3-kR6CqpizvNynBFQ,2610 -greenlet/TThreadStateDestroy.cpp,sha256=36yBCAMq3beXTZd-XnFA7DwaHVSOx2vc28-nf0spysU,8169 -greenlet/TUserGreenlet.cpp,sha256=uemg0lwKXtYB0yzmvyYdIIAsKnNkifXM1OJ2OlrFP1A,23553 -greenlet/__init__.py,sha256=NNXC07srcIhPc_tI8r0YWIxSi9S3V0MNFxTFAnY4mFE,1723 -greenlet/__pycache__/__init__.cpython-310.pyc,, -greenlet/_greenlet.cp310-win_amd64.pyd,sha256=uO9XL6OgIO8vpQPslJVjYp_XH9-ZOdNEpLTkAPw67q4,217088 -greenlet/greenlet.cpp,sha256=WdItb1yWL9WNsTqJNf0Iw8ZwDHD49pkDP0rIRGBg2pw,10996 -greenlet/greenlet.h,sha256=sz5pYRSQqedgOt2AMgxLZdTjO-qcr_JMvgiEJR9IAJ8,4755 -greenlet/greenlet_allocator.hpp,sha256=kxyWW4Qdwlrc7ufgdb5vd6Y7jhauQ699Kod0mqiO1iM,1582 -greenlet/greenlet_compiler_compat.hpp,sha256=nRxpLN9iNbnLVyFDeVmOwyeeNm6scQrOed1l7JQYMCM,4346 -greenlet/greenlet_cpython_compat.hpp,sha256=XrsoFv8nKavrdxly5_-q9lqGeE8d3wKt1YtldsAHAT8,4068 -greenlet/greenlet_exceptions.hpp,sha256=06Bx81DtVaJTa6RtiMcV141b-XHv4ppEgVItkblcLWY,4503 -greenlet/greenlet_internal.hpp,sha256=Ajc-_09W4xWzm9XfyXHAeQAFUgKGKsnJwYsTCoNy3ns,2709 -greenlet/greenlet_refs.hpp,sha256=OnbA91yZf3QHH6-eJccvoNDAaN-pQBMMrclFU1Ot3J4,34436 -greenlet/greenlet_slp_switch.hpp,sha256=kM1QHA2iV-gH4cFyN6lfIagHQxvJZjWOVJdIxRE3TlQ,3198 -greenlet/greenlet_thread_support.hpp,sha256=XUJ6ljWjf9OYyuOILiz8e_yHvT3fbaUiHdhiPNQUV4s,867 -greenlet/platform/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -greenlet/platform/__pycache__/__init__.cpython-310.pyc,, -greenlet/platform/setup_switch_x64_masm.cmd,sha256=ZpClUJeU0ujEPSTWNSepP0W2f9XiYQKA8QKSoVou8EU,143 -greenlet/platform/switch_aarch64_gcc.h,sha256=GKC0yWNXnbK2X--X6aguRCMj2Tg7hDU1Zkl3RljDvC8,4307 -greenlet/platform/switch_alpha_unix.h,sha256=Z-SvF8JQV3oxWT8JRbL9RFu4gRFxPdJ7cviM8YayMmw,671 -greenlet/platform/switch_amd64_unix.h,sha256=EcSFCBlodEBhqhKjcJqY_5Dn_jn7pKpkJlOvp7gFXLI,2748 -greenlet/platform/switch_arm32_gcc.h,sha256=Z3KkHszdgq6uU4YN3BxvKMG2AdDnovwCCNrqGWZ1Lyo,2479 -greenlet/platform/switch_arm32_ios.h,sha256=mm5_R9aXB92hyxzFRwB71M60H6AlvHjrpTrc72Pz3l8,1892 -greenlet/platform/switch_arm64_masm.asm,sha256=4kpTtfy7rfcr8j1CpJLAK21EtZpGDAJXWRU68HEy5A8,1245 -greenlet/platform/switch_arm64_masm.obj,sha256=DmLnIB_icoEHAz1naue_pJPTZgR9ElM7-Nmztr-o9_U,746 -greenlet/platform/switch_arm64_msvc.h,sha256=RqK5MHLmXI3Q-FQ7tm32KWnbDNZKnkJdq8CR89cz640,398 -greenlet/platform/switch_csky_gcc.h,sha256=kDikyiPpewP71KoBZQO_MukDTXTXBiC7x-hF0_2DL0w,1331 -greenlet/platform/switch_loongarch64_linux.h,sha256=7M-Dhc4Q8tRbJCJhalDLwU6S9Mx8MjmN1RbTDgIvQTM,779 -greenlet/platform/switch_m68k_gcc.h,sha256=VSa6NpZhvyyvF-Q58CTIWSpEDo4FKygOyTz00whctlw,928 -greenlet/platform/switch_mips_unix.h,sha256=E0tYsqc5anDY1BhenU1l8DW-nVHC_BElzLgJw3TGtPk,1426 -greenlet/platform/switch_ppc64_aix.h,sha256=_BL0iyRr3ZA5iPlr3uk9SJ5sNRWGYLrXcZ5z-CE9anE,3860 -greenlet/platform/switch_ppc64_linux.h,sha256=0rriT5XyxPb0GqsSSn_bP9iQsnjsPbBmu0yqo5goSyQ,3815 -greenlet/platform/switch_ppc_aix.h,sha256=pHA4slEjUFP3J3SYm1TAlNPhgb2G_PAtax5cO8BEe1A,2941 -greenlet/platform/switch_ppc_linux.h,sha256=YwrlKUzxlXuiKMQqr6MFAV1bPzWnmvk6X1AqJZEpOWU,2759 -greenlet/platform/switch_ppc_macosx.h,sha256=Z6KN_ud0n6nC3ltJrNz2qtvER6vnRAVRNH9mdIDpMxY,2624 -greenlet/platform/switch_ppc_unix.h,sha256=-ZG7MSSPEA5N4qO9PQChtyEJ-Fm6qInhyZm_ZBHTtMg,2652 -greenlet/platform/switch_riscv_unix.h,sha256=606V6ACDf79Fz_WGItnkgbjIJ0pGg_sHmPyDxQYKK58,949 -greenlet/platform/switch_s390_unix.h,sha256=RRlGu957ybmq95qNNY4Qw1mcaoT3eBnW5KbVwu48KX8,2763 -greenlet/platform/switch_sh_gcc.h,sha256=mcRJBTu-2UBf4kZtX601qofwuDuy-Y-hnxJtrcaB7do,901 -greenlet/platform/switch_sparc_sun_gcc.h,sha256=xZish9GsMHBienUbUMsX1-ZZ-as7hs36sVhYIE3ew8Y,2797 -greenlet/platform/switch_x32_unix.h,sha256=nM98PKtzTWc1lcM7TRMUZJzskVdR1C69U1UqZRWX0GE,1509 -greenlet/platform/switch_x64_masm.asm,sha256=nu6n2sWyXuXfpPx40d9YmLfHXUc1sHgeTvX1kUzuvEM,1841 -greenlet/platform/switch_x64_masm.obj,sha256=GNtTNxYdo7idFUYsQv-mrXWgyT5EJ93-9q90lN6svtQ,1078 -greenlet/platform/switch_x64_msvc.h,sha256=LIeasyKo_vHzspdMzMHbosRhrBfKI4BkQOh4qcTHyJw,1805 -greenlet/platform/switch_x86_msvc.h,sha256=TtGOwinbFfnn6clxMNkCz8i6OmgB6kVRrShoF5iT9to,12838 -greenlet/platform/switch_x86_unix.h,sha256=VplW9H0FF0cZHw1DhJdIUs5q6YLS4cwb2nYwjF83R1s,3059 -greenlet/slp_platformselect.h,sha256=J01Fd1y2sFLxkBfsixdpexCVWaAdeprDTEly-ujDQAk,3841 -greenlet/tests/__init__.py,sha256=sqxm7-dZuGBwmNI0n6xrcQJGoHHjoXUGyUTnvHidcYM,9361 -greenlet/tests/__pycache__/__init__.cpython-310.pyc,, -greenlet/tests/__pycache__/fail_clearing_run_switches.cpython-310.pyc,, -greenlet/tests/__pycache__/fail_cpp_exception.cpython-310.pyc,, -greenlet/tests/__pycache__/fail_initialstub_already_started.cpython-310.pyc,, -greenlet/tests/__pycache__/fail_slp_switch.cpython-310.pyc,, -greenlet/tests/__pycache__/fail_switch_three_greenlets.cpython-310.pyc,, -greenlet/tests/__pycache__/fail_switch_three_greenlets2.cpython-310.pyc,, -greenlet/tests/__pycache__/fail_switch_two_greenlets.cpython-310.pyc,, -greenlet/tests/__pycache__/leakcheck.cpython-310.pyc,, -greenlet/tests/__pycache__/test_contextvars.cpython-310.pyc,, -greenlet/tests/__pycache__/test_cpp.cpython-310.pyc,, -greenlet/tests/__pycache__/test_extension_interface.cpython-310.pyc,, -greenlet/tests/__pycache__/test_gc.cpython-310.pyc,, -greenlet/tests/__pycache__/test_generator.cpython-310.pyc,, -greenlet/tests/__pycache__/test_generator_nested.cpython-310.pyc,, -greenlet/tests/__pycache__/test_greenlet.cpython-310.pyc,, -greenlet/tests/__pycache__/test_greenlet_trash.cpython-310.pyc,, -greenlet/tests/__pycache__/test_leaks.cpython-310.pyc,, -greenlet/tests/__pycache__/test_stack_saved.cpython-310.pyc,, -greenlet/tests/__pycache__/test_throw.cpython-310.pyc,, -greenlet/tests/__pycache__/test_tracing.cpython-310.pyc,, -greenlet/tests/__pycache__/test_version.cpython-310.pyc,, -greenlet/tests/__pycache__/test_weakref.cpython-310.pyc,, -greenlet/tests/_test_extension.c,sha256=vkeGA-6oeJcGILsD7oIrT1qZop2GaTOHXiNT7mcSl-0,5773 -greenlet/tests/_test_extension.cp310-win_amd64.pyd,sha256=adYY1kQrWcD9DtOmN5_n9PQ38YBWsqmHS0DDsZVIAZY,14336 -greenlet/tests/_test_extension_cpp.cp310-win_amd64.pyd,sha256=wrN6WBz3wEA5uLJH8Wx1JoSgVoNcrnMW95bRLvZrkGc,15872 -greenlet/tests/_test_extension_cpp.cpp,sha256=e0kVnaB8CCaEhE9yHtNyfqTjevsPDKKx-zgxk7PPK48,6565 -greenlet/tests/fail_clearing_run_switches.py,sha256=o433oA_nUCtOPaMEGc8VEhZIKa71imVHXFw7TsXaP8M,1263 -greenlet/tests/fail_cpp_exception.py,sha256=o_ZbipWikok8Bjc-vjiQvcb5FHh2nVW-McGKMLcMzh0,985 -greenlet/tests/fail_initialstub_already_started.py,sha256=txENn5IyzGx2p-XR1XB7qXmC8JX_4mKDEA8kYBXUQKc,1961 -greenlet/tests/fail_slp_switch.py,sha256=rJBZcZfTWR3e2ERQtPAud6YKShiDsP84PmwOJbp4ey0,524 -greenlet/tests/fail_switch_three_greenlets.py,sha256=zSitV7rkNnaoHYVzAGGLnxz-yPtohXJJzaE8ehFDQ0M,956 -greenlet/tests/fail_switch_three_greenlets2.py,sha256=FPJensn2EJxoropl03JSTVP3kgP33k04h6aDWWozrOk,1285 -greenlet/tests/fail_switch_two_greenlets.py,sha256=1CaI8s3504VbbF1vj1uBYuy-zxBHVzHPIAd1LIc8ONg,817 -greenlet/tests/leakcheck.py,sha256=inbfM7_oVzd8jIKGxCgo4JqpFZaDAnWPkSULJ8vIE1s,11964 -greenlet/tests/test_contextvars.py,sha256=xutO-qZgKTwKsA9lAqTjIcTBEiQV4RpNKM-vO2_YCVU,10541 -greenlet/tests/test_cpp.py,sha256=hpxhFAdKJTpAVZP8CBGs1ZcrKdscI9BaDZk4btkI5d4,2736 -greenlet/tests/test_extension_interface.py,sha256=eJ3cwLacdK2WbsrC-4DgeyHdwLRcG4zx7rrkRtqSzC4,3829 -greenlet/tests/test_gc.py,sha256=PCOaRpIyjNnNlDogGL3FZU_lrdXuM-pv1rxeE5TP5mc,2923 -greenlet/tests/test_generator.py,sha256=tONXiTf98VGm347o1b-810daPiwdla5cbpFg6QI1R1g,1240 -greenlet/tests/test_generator_nested.py,sha256=7v4HOYrf1XZP39dk5IUMubdZ8yc3ynwZcqj9GUJyMSA,3718 -greenlet/tests/test_greenlet.py,sha256=rYWDvMx7ZpMlQju9KRxsBR61ela7HSJCg98JtR7RPOQ,46251 -greenlet/tests/test_greenlet_trash.py,sha256=n2dBlQfOoEO1ODatFi8QdhboH3fB86YtqzcYMYOXxbw,7947 -greenlet/tests/test_leaks.py,sha256=Qeso_qH9MCWJOkk2I3VcTh7UhaNvWxrzAmNBta-fUyY,17714 -greenlet/tests/test_stack_saved.py,sha256=eyzqNY2VCGuGlxhT_In6TvZ6Okb0AXFZVyBEnK1jDwA,446 -greenlet/tests/test_throw.py,sha256=u2TQ_WvvCd6N6JdXWIxVEcXkKu5fepDlz9dktYdmtng,3712 -greenlet/tests/test_tracing.py,sha256=VlwzMU0C1noospZhuUMyB7MHw200emIvGCN_6G2p2ZU,8250 -greenlet/tests/test_version.py,sha256=O9DpAITsOFgiRcjd4odQ7ejmwx_N9Q1zQENVcbtFHIc,1339 -greenlet/tests/test_weakref.py,sha256=F8M23btEF87bIbpptLNBORosbQqNZGiYeKMqYjWrsak,883 diff --git a/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/WHEEL b/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/WHEEL deleted file mode 100644 index 0460801..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.3.1) -Root-Is-Purelib: false -Tag: cp310-cp310-win_amd64 - diff --git a/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/licenses/LICENSE b/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/licenses/LICENSE deleted file mode 100644 index b73a4a1..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/licenses/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -The following files are derived from Stackless Python and are subject to the -same license as Stackless Python: - - src/greenlet/slp_platformselect.h - files in src/greenlet/platform/ directory - -See LICENSE.PSF and http://www.stackless.com/ for details. - -Unless otherwise noted, the files in greenlet have been released under the -following MIT license: - -Copyright (c) Armin Rigo, Christian Tismer and contributors - -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. diff --git a/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/licenses/LICENSE.PSF b/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/licenses/LICENSE.PSF deleted file mode 100644 index d3b509a..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/licenses/LICENSE.PSF +++ /dev/null @@ -1,47 +0,0 @@ -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- - -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011 Python Software Foundation; All Rights Reserved" are retained in Python -alone or in any derivative version prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. - -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. diff --git a/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/top_level.txt b/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/top_level.txt deleted file mode 100644 index 46725be..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet-3.2.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -greenlet diff --git a/blog-app/venv/Lib/site-packages/greenlet/CObjects.cpp b/blog-app/venv/Lib/site-packages/greenlet/CObjects.cpp deleted file mode 100644 index c135995..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/CObjects.cpp +++ /dev/null @@ -1,157 +0,0 @@ -#ifndef COBJECTS_CPP -#define COBJECTS_CPP -/***************************************************************************** - * C interface - * - * These are exported using the CObject API - */ -#ifdef __clang__ -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wunused-function" -#endif - -#include "greenlet_exceptions.hpp" - -#include "greenlet_internal.hpp" -#include "greenlet_refs.hpp" - - -#include "TThreadStateDestroy.cpp" - -#include "PyGreenlet.hpp" - -using greenlet::PyErrOccurred; -using greenlet::Require; - - - -extern "C" { -static PyGreenlet* -PyGreenlet_GetCurrent(void) -{ - return GET_THREAD_STATE().state().get_current().relinquish_ownership(); -} - -static int -PyGreenlet_SetParent(PyGreenlet* g, PyGreenlet* nparent) -{ - return green_setparent((PyGreenlet*)g, (PyObject*)nparent, NULL); -} - -static PyGreenlet* -PyGreenlet_New(PyObject* run, PyGreenlet* parent) -{ - using greenlet::refs::NewDictReference; - // In the past, we didn't use green_new and green_init, but that - // was a maintenance issue because we duplicated code. This way is - // much safer, but slightly slower. If that's a problem, we could - // refactor green_init to separate argument parsing from initialization. - OwnedGreenlet g = OwnedGreenlet::consuming(green_new(&PyGreenlet_Type, nullptr, nullptr)); - if (!g) { - return NULL; - } - - try { - NewDictReference kwargs; - if (run) { - kwargs.SetItem(mod_globs->str_run, run); - } - if (parent) { - kwargs.SetItem("parent", (PyObject*)parent); - } - - Require(green_init(g.borrow(), mod_globs->empty_tuple, kwargs.borrow())); - } - catch (const PyErrOccurred&) { - return nullptr; - } - - return g.relinquish_ownership(); -} - -static PyObject* -PyGreenlet_Switch(PyGreenlet* self, PyObject* args, PyObject* kwargs) -{ - if (!PyGreenlet_Check(self)) { - PyErr_BadArgument(); - return NULL; - } - - if (args == NULL) { - args = mod_globs->empty_tuple; - } - - if (kwargs == NULL || !PyDict_Check(kwargs)) { - kwargs = NULL; - } - - return green_switch(self, args, kwargs); -} - -static PyObject* -PyGreenlet_Throw(PyGreenlet* self, PyObject* typ, PyObject* val, PyObject* tb) -{ - if (!PyGreenlet_Check(self)) { - PyErr_BadArgument(); - return nullptr; - } - try { - PyErrPieces err_pieces(typ, val, tb); - return internal_green_throw(self, err_pieces).relinquish_ownership(); - } - catch (const PyErrOccurred&) { - return nullptr; - } -} - - - -static int -Extern_PyGreenlet_MAIN(PyGreenlet* self) -{ - if (!PyGreenlet_Check(self)) { - PyErr_BadArgument(); - return -1; - } - return self->pimpl->main(); -} - -static int -Extern_PyGreenlet_ACTIVE(PyGreenlet* self) -{ - if (!PyGreenlet_Check(self)) { - PyErr_BadArgument(); - return -1; - } - return self->pimpl->active(); -} - -static int -Extern_PyGreenlet_STARTED(PyGreenlet* self) -{ - if (!PyGreenlet_Check(self)) { - PyErr_BadArgument(); - return -1; - } - return self->pimpl->started(); -} - -static PyGreenlet* -Extern_PyGreenlet_GET_PARENT(PyGreenlet* self) -{ - if (!PyGreenlet_Check(self)) { - PyErr_BadArgument(); - return NULL; - } - // This can return NULL even if there is no exception - return self->pimpl->parent().acquire(); -} -} // extern C. - -/** End C API ****************************************************************/ -#ifdef __clang__ -# pragma clang diagnostic pop -#endif - - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/PyGreenlet.cpp b/blog-app/venv/Lib/site-packages/greenlet/PyGreenlet.cpp deleted file mode 100644 index 29c0bba..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/PyGreenlet.cpp +++ /dev/null @@ -1,738 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -#ifndef PYGREENLET_CPP -#define PYGREENLET_CPP -/***************** -The Python slot functions for TGreenlet. - */ - - -#define PY_SSIZE_T_CLEAN -#include -#include "structmember.h" // PyMemberDef - -#include "greenlet_internal.hpp" -#include "TThreadStateDestroy.cpp" -#include "TGreenlet.hpp" -// #include "TUserGreenlet.cpp" -// #include "TMainGreenlet.cpp" -// #include "TBrokenGreenlet.cpp" - - -#include "greenlet_refs.hpp" -#include "greenlet_slp_switch.hpp" - -#include "greenlet_thread_support.hpp" -#include "TGreenlet.hpp" - -#include "TGreenletGlobals.cpp" -#include "TThreadStateDestroy.cpp" -#include "PyGreenlet.hpp" -// #include "TGreenlet.cpp" - -// #include "TExceptionState.cpp" -// #include "TPythonState.cpp" -// #include "TStackState.cpp" - -using greenlet::LockGuard; -using greenlet::LockInitError; -using greenlet::PyErrOccurred; -using greenlet::Require; - -using greenlet::g_handle_exit; -using greenlet::single_result; - -using greenlet::Greenlet; -using greenlet::UserGreenlet; -using greenlet::MainGreenlet; -using greenlet::BrokenGreenlet; -using greenlet::ThreadState; -using greenlet::PythonState; - - - -static PyGreenlet* -green_new(PyTypeObject* type, PyObject* UNUSED(args), PyObject* UNUSED(kwds)) -{ - PyGreenlet* o = - (PyGreenlet*)PyBaseObject_Type.tp_new(type, mod_globs->empty_tuple, mod_globs->empty_dict); - if (o) { - new UserGreenlet(o, GET_THREAD_STATE().state().borrow_current()); - assert(Py_REFCNT(o) == 1); - } - return o; -} - - -// green_init is used in the tp_init slot. So it's important that -// it can be called directly from CPython. Thus, we don't use -// BorrowedGreenlet and BorrowedObject --- although in theory -// these should be binary layout compatible, that may not be -// guaranteed to be the case (32-bit linux ppc possibly). -static int -green_init(PyGreenlet* self, PyObject* args, PyObject* kwargs) -{ - PyArgParseParam run; - PyArgParseParam nparent; - static const char* kwlist[] = { - "run", - "parent", - NULL - }; - - // recall: The O specifier does NOT increase the reference count. - if (!PyArg_ParseTupleAndKeywords( - args, kwargs, "|OO:green", (char**)kwlist, &run, &nparent)) { - return -1; - } - - if (run) { - if (green_setrun(self, run, NULL)) { - return -1; - } - } - if (nparent && !nparent.is_None()) { - return green_setparent(self, nparent, NULL); - } - return 0; -} - - - -static int -green_traverse(PyGreenlet* self, visitproc visit, void* arg) -{ - // We must only visit referenced objects, i.e. only objects - // Py_INCREF'ed by this greenlet (directly or indirectly): - // - // - stack_prev is not visited: holds previous stack pointer, but it's not - // referenced - // - frames are not visited as we don't strongly reference them; - // alive greenlets are not garbage collected - // anyway. This can be a problem, however, if this greenlet is - // never allowed to finish, and is referenced from the frame: we - // have an uncollectible cycle in that case. Note that the - // frame object itself is also frequently not even tracked by the GC - // starting with Python 3.7 (frames are allocated by the - // interpreter untracked, and only become tracked when their - // evaluation is finished if they have a refcount > 1). All of - // this is to say that we should probably strongly reference - // the frame object. Doing so, while always allowing GC on a - // greenlet, solves several leaks for us. - - Py_VISIT(self->dict); - if (!self->pimpl) { - // Hmm. I have seen this at interpreter shutdown time, - // I think. That's very odd because this doesn't go away until - // we're ``green_dealloc()``, at which point we shouldn't be - // traversed anymore. - return 0; - } - - return self->pimpl->tp_traverse(visit, arg); -} - -static int -green_is_gc(PyObject* _self) -{ - BorrowedGreenlet self(_self); - int result = 0; - /* Main greenlet can be garbage collected since it can only - become unreachable if the underlying thread exited. - Active greenlets --- including those that are suspended --- - cannot be garbage collected, however. - */ - if (self->main() || !self->active()) { - result = 1; - } - // The main greenlet pointer will eventually go away after the thread dies. - if (self->was_running_in_dead_thread()) { - // Our thread is dead! We can never run again. Might as well - // GC us. Note that if a tuple containing only us and other - // immutable objects had been scanned before this, when we - // would have returned 0, the tuple will take itself out of GC - // tracking and never be investigated again. So that could - // result in both us and the tuple leaking due to an - // unreachable/uncollectible reference. The same goes for - // dictionaries. - // - // It's not a great idea to be changing our GC state on the - // fly. - result = 1; - } - return result; -} - - -static int -green_clear(PyGreenlet* self) -{ - /* Greenlet is only cleared if it is about to be collected. - Since active greenlets are not garbage collectable, we can - be sure that, even if they are deallocated during clear, - nothing they reference is in unreachable or finalizers, - so even if it switches we are relatively safe. */ - // XXX: Are we responsible for clearing weakrefs here? - Py_CLEAR(self->dict); - return self->pimpl->tp_clear(); -} - -/** - * Returns 0 on failure (the object was resurrected) or 1 on success. - **/ -static int -_green_dealloc_kill_started_non_main_greenlet(BorrowedGreenlet self) -{ - /* Hacks hacks hacks copied from instance_dealloc() */ - /* Temporarily resurrect the greenlet. */ - assert(self.REFCNT() == 0); - Py_SET_REFCNT(self.borrow(), 1); - /* Save the current exception, if any. */ - PyErrPieces saved_err; - try { - // BY THE TIME WE GET HERE, the state may actually be going - // away - // if we're shutting down the interpreter and freeing thread - // entries, - // this could result in freeing greenlets that were leaked. So - // we can't try to read the state. - self->deallocing_greenlet_in_thread( - self->thread_state() - ? static_cast(GET_THREAD_STATE()) - : nullptr); - } - catch (const PyErrOccurred&) { - PyErr_WriteUnraisable(self.borrow_o()); - /* XXX what else should we do? */ - } - /* Check for no resurrection must be done while we keep - * our internal reference, otherwise PyFile_WriteObject - * causes recursion if using Py_INCREF/Py_DECREF - */ - if (self.REFCNT() == 1 && self->active()) { - /* Not resurrected, but still not dead! - XXX what else should we do? we complain. */ - PyObject* f = PySys_GetObject("stderr"); - Py_INCREF(self.borrow_o()); /* leak! */ - if (f != NULL) { - PyFile_WriteString("GreenletExit did not kill ", f); - PyFile_WriteObject(self.borrow_o(), f, 0); - PyFile_WriteString("\n", f); - } - } - /* Restore the saved exception. */ - saved_err.PyErrRestore(); - /* Undo the temporary resurrection; can't use DECREF here, - * it would cause a recursive call. - */ - assert(self.REFCNT() > 0); - - Py_ssize_t refcnt = self.REFCNT() - 1; - Py_SET_REFCNT(self.borrow_o(), refcnt); - if (refcnt != 0) { - /* Resurrected! */ - _Py_NewReference(self.borrow_o()); - Py_SET_REFCNT(self.borrow_o(), refcnt); - /* Better to use tp_finalizer slot (PEP 442) - * and call ``PyObject_CallFinalizerFromDealloc``, - * but that's only supported in Python 3.4+; see - * Modules/_io/iobase.c for an example. - * - * The following approach is copied from iobase.c in CPython 2.7. - * (along with much of this function in general). Here's their - * comment: - * - * When called from a heap type's dealloc, the type will be - * decref'ed on return (see e.g. subtype_dealloc in typeobject.c). */ - if (PyType_HasFeature(self.TYPE(), Py_TPFLAGS_HEAPTYPE)) { - Py_INCREF(self.TYPE()); - } - - PyObject_GC_Track((PyObject*)self); - - _Py_DEC_REFTOTAL; -#ifdef COUNT_ALLOCS - --Py_TYPE(self)->tp_frees; - --Py_TYPE(self)->tp_allocs; -#endif /* COUNT_ALLOCS */ - return 0; - } - return 1; -} - - -static void -green_dealloc(PyGreenlet* self) -{ - PyObject_GC_UnTrack(self); - BorrowedGreenlet me(self); - if (me->active() - && me->started() - && !me->main()) { - if (!_green_dealloc_kill_started_non_main_greenlet(me)) { - return; - } - } - - if (self->weakreflist != NULL) { - PyObject_ClearWeakRefs((PyObject*)self); - } - Py_CLEAR(self->dict); - - if (self->pimpl) { - // In case deleting this, which frees some memory, - // somehow winds up calling back into us. That's usually a - //bug in our code. - Greenlet* p = self->pimpl; - self->pimpl = nullptr; - delete p; - } - // and finally we're done. self is now invalid. - Py_TYPE(self)->tp_free((PyObject*)self); -} - - - -static OwnedObject -internal_green_throw(BorrowedGreenlet self, PyErrPieces& err_pieces) -{ - PyObject* result = nullptr; - err_pieces.PyErrRestore(); - assert(PyErr_Occurred()); - if (self->started() && !self->active()) { - /* dead greenlet: turn GreenletExit into a regular return */ - result = g_handle_exit(OwnedObject()).relinquish_ownership(); - } - self->args() <<= result; - - return single_result(self->g_switch()); -} - - - -PyDoc_STRVAR( - green_switch_doc, - "switch(*args, **kwargs)\n" - "\n" - "Switch execution to this greenlet.\n" - "\n" - "If this greenlet has never been run, then this greenlet\n" - "will be switched to using the body of ``self.run(*args, **kwargs)``.\n" - "\n" - "If the greenlet is active (has been run, but was switch()'ed\n" - "out before leaving its run function), then this greenlet will\n" - "be resumed and the return value to its switch call will be\n" - "None if no arguments are given, the given argument if one\n" - "argument is given, or the args tuple and keyword args dict if\n" - "multiple arguments are given.\n" - "\n" - "If the greenlet is dead, or is the current greenlet then this\n" - "function will simply return the arguments using the same rules as\n" - "above.\n"); - -static PyObject* -green_switch(PyGreenlet* self, PyObject* args, PyObject* kwargs) -{ - using greenlet::SwitchingArgs; - SwitchingArgs switch_args(OwnedObject::owning(args), OwnedObject::owning(kwargs)); - self->pimpl->may_switch_away(); - self->pimpl->args() <<= switch_args; - - // If we're switching out of a greenlet, and that switch is the - // last thing the greenlet does, the greenlet ought to be able to - // go ahead and die at that point. Currently, someone else must - // manually switch back to the greenlet so that we "fall off the - // end" and can perform cleanup. You'd think we'd be able to - // figure out that this is happening using the frame's ``f_lasti`` - // member, which is supposed to be an index into - // ``frame->f_code->co_code``, the bytecode string. However, in - // recent interpreters, ``f_lasti`` tends not to be updated thanks - // to things like the PREDICT() macros in ceval.c. So it doesn't - // really work to do that in many cases. For example, the Python - // code: - // def run(): - // greenlet.getcurrent().parent.switch() - // produces bytecode of len 16, with the actual call to switch() - // being at index 10 (in Python 3.10). However, the reported - // ``f_lasti`` we actually see is...5! (Which happens to be the - // second byte of the CALL_METHOD op for ``getcurrent()``). - - try { - //OwnedObject result = single_result(self->pimpl->g_switch()); - OwnedObject result(single_result(self->pimpl->g_switch())); -#ifndef NDEBUG - // Note that the current greenlet isn't necessarily self. If self - // finished, we went to one of its parents. - assert(!self->pimpl->args()); - - const BorrowedGreenlet& current = GET_THREAD_STATE().state().borrow_current(); - // It's possible it's never been switched to. - assert(!current->args()); -#endif - PyObject* p = result.relinquish_ownership(); - - if (!p && !PyErr_Occurred()) { - // This shouldn't be happening anymore, so the asserts - // are there for debug builds. Non-debug builds - // crash "gracefully" in this case, although there is an - // argument to be made for killing the process in all - // cases --- for this to be the case, our switches - // probably nested in an incorrect way, so the state is - // suspicious. Nothing should be corrupt though, just - // confused at the Python level. Letting this propagate is - // probably good enough. - assert(p || PyErr_Occurred()); - throw PyErrOccurred( - mod_globs->PyExc_GreenletError, - "Greenlet.switch() returned NULL without an exception set." - ); - } - return p; - } - catch(const PyErrOccurred&) { - return nullptr; - } -} - -PyDoc_STRVAR( - green_throw_doc, - "Switches execution to this greenlet, but immediately raises the\n" - "given exception in this greenlet. If no argument is provided, the " - "exception\n" - "defaults to `greenlet.GreenletExit`. The normal exception\n" - "propagation rules apply, as described for `switch`. Note that calling " - "this\n" - "method is almost equivalent to the following::\n" - "\n" - " def raiser():\n" - " raise typ, val, tb\n" - " g_raiser = greenlet(raiser, parent=g)\n" - " g_raiser.switch()\n" - "\n" - "except that this trick does not work for the\n" - "`greenlet.GreenletExit` exception, which would not propagate\n" - "from ``g_raiser`` to ``g``.\n"); - -static PyObject* -green_throw(PyGreenlet* self, PyObject* args) -{ - PyArgParseParam typ(mod_globs->PyExc_GreenletExit); - PyArgParseParam val; - PyArgParseParam tb; - - if (!PyArg_ParseTuple(args, "|OOO:throw", &typ, &val, &tb)) { - return nullptr; - } - - assert(typ.borrow() || val.borrow()); - - self->pimpl->may_switch_away(); - try { - // Both normalizing the error and the actual throw_greenlet - // could throw PyErrOccurred. - PyErrPieces err_pieces(typ.borrow(), val.borrow(), tb.borrow()); - - return internal_green_throw(self, err_pieces).relinquish_ownership(); - } - catch (const PyErrOccurred&) { - return nullptr; - } -} - -static int -green_bool(PyGreenlet* self) -{ - return self->pimpl->active(); -} - -/** - * CAUTION: Allocates memory, may run GC and arbitrary Python code. - */ -static PyObject* -green_getdict(PyGreenlet* self, void* UNUSED(context)) -{ - if (self->dict == NULL) { - self->dict = PyDict_New(); - if (self->dict == NULL) { - return NULL; - } - } - Py_INCREF(self->dict); - return self->dict; -} - -static int -green_setdict(PyGreenlet* self, PyObject* val, void* UNUSED(context)) -{ - PyObject* tmp; - - if (val == NULL) { - PyErr_SetString(PyExc_TypeError, "__dict__ may not be deleted"); - return -1; - } - if (!PyDict_Check(val)) { - PyErr_SetString(PyExc_TypeError, "__dict__ must be a dictionary"); - return -1; - } - tmp = self->dict; - Py_INCREF(val); - self->dict = val; - Py_XDECREF(tmp); - return 0; -} - -static bool -_green_not_dead(BorrowedGreenlet self) -{ - // XXX: Where else should we do this? - // Probably on entry to most Python-facing functions? - if (self->was_running_in_dead_thread()) { - self->deactivate_and_free(); - return false; - } - return self->active() || !self->started(); -} - - -static PyObject* -green_getdead(PyGreenlet* self, void* UNUSED(context)) -{ - if (_green_not_dead(self)) { - Py_RETURN_FALSE; - } - else { - Py_RETURN_TRUE; - } -} - -static PyObject* -green_get_stack_saved(PyGreenlet* self, void* UNUSED(context)) -{ - return PyLong_FromSsize_t(self->pimpl->stack_saved()); -} - - -static PyObject* -green_getrun(PyGreenlet* self, void* UNUSED(context)) -{ - try { - OwnedObject result(BorrowedGreenlet(self)->run()); - return result.relinquish_ownership(); - } - catch(const PyErrOccurred&) { - return nullptr; - } -} - - -static int -green_setrun(PyGreenlet* self, PyObject* nrun, void* UNUSED(context)) -{ - try { - BorrowedGreenlet(self)->run(nrun); - return 0; - } - catch(const PyErrOccurred&) { - return -1; - } -} - -static PyObject* -green_getparent(PyGreenlet* self, void* UNUSED(context)) -{ - return BorrowedGreenlet(self)->parent().acquire_or_None(); -} - - -static int -green_setparent(PyGreenlet* self, PyObject* nparent, void* UNUSED(context)) -{ - try { - BorrowedGreenlet(self)->parent(nparent); - } - catch(const PyErrOccurred&) { - return -1; - } - return 0; -} - - -static PyObject* -green_getcontext(const PyGreenlet* self, void* UNUSED(context)) -{ - const Greenlet *const g = self->pimpl; - try { - OwnedObject result(g->context()); - return result.relinquish_ownership(); - } - catch(const PyErrOccurred&) { - return nullptr; - } -} - -static int -green_setcontext(PyGreenlet* self, PyObject* nctx, void* UNUSED(context)) -{ - try { - BorrowedGreenlet(self)->context(nctx); - return 0; - } - catch(const PyErrOccurred&) { - return -1; - } -} - - -static PyObject* -green_getframe(PyGreenlet* self, void* UNUSED(context)) -{ - const PythonState::OwnedFrame& top_frame = BorrowedGreenlet(self)->top_frame(); - return top_frame.acquire_or_None(); -} - - -static PyObject* -green_getstate(PyGreenlet* self) -{ - PyErr_Format(PyExc_TypeError, - "cannot serialize '%s' object", - Py_TYPE(self)->tp_name); - return nullptr; -} - -static PyObject* -green_repr(PyGreenlet* _self) -{ - BorrowedGreenlet self(_self); - /* - Return a string like - - - The handling of greenlets across threads is not super good. - We mostly use the internal definitions of these terms, but they - generally should make sense to users as well. - */ - PyObject* result; - int never_started = !self->started() && !self->active(); - - const char* const tp_name = Py_TYPE(self)->tp_name; - - if (_green_not_dead(self)) { - /* XXX: The otid= is almost useless because you can't correlate it to - any thread identifier exposed to Python. We could use - PyThreadState_GET()->thread_id, but we'd need to save that in the - greenlet, or save the whole PyThreadState object itself. - - As it stands, its only useful for identifying greenlets from the same thread. - */ - const char* state_in_thread; - if (self->was_running_in_dead_thread()) { - // The thread it was running in is dead! - // This can happen, especially at interpreter shut down. - // It complicates debugging output because it may be - // impossible to access the current thread state at that - // time. Thus, don't access the current thread state. - state_in_thread = " (thread exited)"; - } - else { - state_in_thread = GET_THREAD_STATE().state().is_current(self) - ? " current" - : (self->started() ? " suspended" : ""); - } - result = PyUnicode_FromFormat( - "<%s object at %p (otid=%p)%s%s%s%s>", - tp_name, - self.borrow_o(), - self->thread_state(), - state_in_thread, - self->active() ? " active" : "", - never_started ? " pending" : " started", - self->main() ? " main" : "" - ); - } - else { - result = PyUnicode_FromFormat( - "<%s object at %p (otid=%p) %sdead>", - tp_name, - self.borrow_o(), - self->thread_state(), - self->was_running_in_dead_thread() - ? "(thread exited) " - : "" - ); - } - - return result; -} - - -static PyMethodDef green_methods[] = { - { - .ml_name="switch", - .ml_meth=reinterpret_cast(green_switch), - .ml_flags=METH_VARARGS | METH_KEYWORDS, - .ml_doc=green_switch_doc - }, - {.ml_name="throw", .ml_meth=(PyCFunction)green_throw, .ml_flags=METH_VARARGS, .ml_doc=green_throw_doc}, - {.ml_name="__getstate__", .ml_meth=(PyCFunction)green_getstate, .ml_flags=METH_NOARGS, .ml_doc=NULL}, - {.ml_name=NULL, .ml_meth=NULL} /* sentinel */ -}; - -static PyGetSetDef green_getsets[] = { - /* name, getter, setter, doc, context pointer */ - {.name="__dict__", .get=(getter)green_getdict, .set=(setter)green_setdict}, - {.name="run", .get=(getter)green_getrun, .set=(setter)green_setrun}, - {.name="parent", .get=(getter)green_getparent, .set=(setter)green_setparent}, - {.name="gr_frame", .get=(getter)green_getframe }, - { - .name="gr_context", - .get=(getter)green_getcontext, - .set=(setter)green_setcontext - }, - {.name="dead", .get=(getter)green_getdead}, - {.name="_stack_saved", .get=(getter)green_get_stack_saved}, - {.name=NULL} -}; - -static PyMemberDef green_members[] = { - {.name=NULL} -}; - -static PyNumberMethods green_as_number = { - .nb_bool=(inquiry)green_bool, -}; - - -PyTypeObject PyGreenlet_Type = { - .ob_base=PyVarObject_HEAD_INIT(NULL, 0) - .tp_name="greenlet.greenlet", /* tp_name */ - .tp_basicsize=sizeof(PyGreenlet), /* tp_basicsize */ - /* methods */ - .tp_dealloc=(destructor)green_dealloc, /* tp_dealloc */ - .tp_repr=(reprfunc)green_repr, /* tp_repr */ - .tp_as_number=&green_as_number, /* tp_as _number*/ - .tp_flags=G_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - .tp_doc="greenlet(run=None, parent=None) -> greenlet\n\n" - "Creates a new greenlet object (without running it).\n\n" - " - *run* -- The callable to invoke.\n" - " - *parent* -- The parent greenlet. The default is the current " - "greenlet.", /* tp_doc */ - .tp_traverse=(traverseproc)green_traverse, /* tp_traverse */ - .tp_clear=(inquiry)green_clear, /* tp_clear */ - .tp_weaklistoffset=offsetof(PyGreenlet, weakreflist), /* tp_weaklistoffset */ - - .tp_methods=green_methods, /* tp_methods */ - .tp_members=green_members, /* tp_members */ - .tp_getset=green_getsets, /* tp_getset */ - .tp_dictoffset=offsetof(PyGreenlet, dict), /* tp_dictoffset */ - .tp_init=(initproc)green_init, /* tp_init */ - .tp_alloc=PyType_GenericAlloc, /* tp_alloc */ - .tp_new=(newfunc)green_new, /* tp_new */ - .tp_free=PyObject_GC_Del, /* tp_free */ - .tp_is_gc=(inquiry)green_is_gc, /* tp_is_gc */ -}; - -#endif - -// Local Variables: -// flycheck-clang-include-path: ("/opt/local/Library/Frameworks/Python.framework/Versions/3.8/include/python3.8") -// End: diff --git a/blog-app/venv/Lib/site-packages/greenlet/PyGreenlet.hpp b/blog-app/venv/Lib/site-packages/greenlet/PyGreenlet.hpp deleted file mode 100644 index df6cd80..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/PyGreenlet.hpp +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef PYGREENLET_HPP -#define PYGREENLET_HPP - - -#include "greenlet.h" -#include "greenlet_compiler_compat.hpp" -#include "greenlet_refs.hpp" - - -using greenlet::refs::OwnedGreenlet; -using greenlet::refs::BorrowedGreenlet; -using greenlet::refs::BorrowedObject;; -using greenlet::refs::OwnedObject; -using greenlet::refs::PyErrPieces; - - -// XXX: These doesn't really belong here, it's not a Python slot. -static OwnedObject internal_green_throw(BorrowedGreenlet self, PyErrPieces& err_pieces); - -static PyGreenlet* green_new(PyTypeObject* type, PyObject* UNUSED(args), PyObject* UNUSED(kwds)); -static int green_clear(PyGreenlet* self); -static int green_init(PyGreenlet* self, PyObject* args, PyObject* kwargs); -static int green_setparent(PyGreenlet* self, PyObject* nparent, void* UNUSED(context)); -static int green_setrun(PyGreenlet* self, PyObject* nrun, void* UNUSED(context)); -static int green_traverse(PyGreenlet* self, visitproc visit, void* arg); -static void green_dealloc(PyGreenlet* self); -static PyObject* green_getparent(PyGreenlet* self, void* UNUSED(context)); - -static int green_is_gc(PyObject* self); -static PyObject* green_getdead(PyGreenlet* self, void* UNUSED(context)); -static PyObject* green_getrun(PyGreenlet* self, void* UNUSED(context)); -static int green_setcontext(PyGreenlet* self, PyObject* nctx, void* UNUSED(context)); -static PyObject* green_getframe(PyGreenlet* self, void* UNUSED(context)); -static PyObject* green_repr(PyGreenlet* self); -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/PyGreenletUnswitchable.cpp b/blog-app/venv/Lib/site-packages/greenlet/PyGreenletUnswitchable.cpp deleted file mode 100644 index 1b768ee..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/PyGreenletUnswitchable.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -/** - Implementation of the Python slots for PyGreenletUnswitchable_Type -*/ -#ifndef PY_GREENLET_UNSWITCHABLE_CPP -#define PY_GREENLET_UNSWITCHABLE_CPP - - - -#define PY_SSIZE_T_CLEAN -#include -#include "structmember.h" // PyMemberDef - -#include "greenlet_internal.hpp" -// Code after this point can assume access to things declared in stdint.h, -// including the fixed-width types. This goes for the platform-specific switch functions -// as well. -#include "greenlet_refs.hpp" -#include "greenlet_slp_switch.hpp" - -#include "greenlet_thread_support.hpp" -#include "TGreenlet.hpp" - -#include "TGreenlet.cpp" -#include "TGreenletGlobals.cpp" -#include "TThreadStateDestroy.cpp" - - -using greenlet::LockGuard; -using greenlet::LockInitError; -using greenlet::PyErrOccurred; -using greenlet::Require; - -using greenlet::g_handle_exit; -using greenlet::single_result; - -using greenlet::Greenlet; -using greenlet::UserGreenlet; -using greenlet::MainGreenlet; -using greenlet::BrokenGreenlet; -using greenlet::ThreadState; -using greenlet::PythonState; - - -#include "PyGreenlet.hpp" - -static PyGreenlet* -green_unswitchable_new(PyTypeObject* type, PyObject* UNUSED(args), PyObject* UNUSED(kwds)) -{ - PyGreenlet* o = - (PyGreenlet*)PyBaseObject_Type.tp_new(type, mod_globs->empty_tuple, mod_globs->empty_dict); - if (o) { - new BrokenGreenlet(o, GET_THREAD_STATE().state().borrow_current()); - assert(Py_REFCNT(o) == 1); - } - return o; -} - -static PyObject* -green_unswitchable_getforce(PyGreenlet* self, void* UNUSED(context)) -{ - BrokenGreenlet* broken = dynamic_cast(self->pimpl); - return PyBool_FromLong(broken->_force_switch_error); -} - -static int -green_unswitchable_setforce(PyGreenlet* self, PyObject* nforce, void* UNUSED(context)) -{ - if (!nforce) { - PyErr_SetString( - PyExc_AttributeError, - "Cannot delete force_switch_error" - ); - return -1; - } - BrokenGreenlet* broken = dynamic_cast(self->pimpl); - int is_true = PyObject_IsTrue(nforce); - if (is_true == -1) { - return -1; - } - broken->_force_switch_error = is_true; - return 0; -} - -static PyObject* -green_unswitchable_getforceslp(PyGreenlet* self, void* UNUSED(context)) -{ - BrokenGreenlet* broken = dynamic_cast(self->pimpl); - return PyBool_FromLong(broken->_force_slp_switch_error); -} - -static int -green_unswitchable_setforceslp(PyGreenlet* self, PyObject* nforce, void* UNUSED(context)) -{ - if (!nforce) { - PyErr_SetString( - PyExc_AttributeError, - "Cannot delete force_slp_switch_error" - ); - return -1; - } - BrokenGreenlet* broken = dynamic_cast(self->pimpl); - int is_true = PyObject_IsTrue(nforce); - if (is_true == -1) { - return -1; - } - broken->_force_slp_switch_error = is_true; - return 0; -} - -static PyGetSetDef green_unswitchable_getsets[] = { - /* name, getter, setter, doc, closure (context pointer) */ - { - .name="force_switch_error", - .get=(getter)green_unswitchable_getforce, - .set=(setter)green_unswitchable_setforce, - .doc=NULL - }, - { - .name="force_slp_switch_error", - .get=(getter)green_unswitchable_getforceslp, - .set=(setter)green_unswitchable_setforceslp, - .doc=nullptr - }, - {.name=nullptr} -}; - -PyTypeObject PyGreenletUnswitchable_Type = { - .ob_base=PyVarObject_HEAD_INIT(NULL, 0) - .tp_name="greenlet._greenlet.UnswitchableGreenlet", - .tp_dealloc= (destructor)green_dealloc, /* tp_dealloc */ - .tp_flags=G_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - .tp_doc="Undocumented internal class", /* tp_doc */ - .tp_traverse=(traverseproc)green_traverse, /* tp_traverse */ - .tp_clear=(inquiry)green_clear, /* tp_clear */ - - .tp_getset=green_unswitchable_getsets, /* tp_getset */ - .tp_base=&PyGreenlet_Type, /* tp_base */ - .tp_init=(initproc)green_init, /* tp_init */ - .tp_alloc=PyType_GenericAlloc, /* tp_alloc */ - .tp_new=(newfunc)green_unswitchable_new, /* tp_new */ - .tp_free=PyObject_GC_Del, /* tp_free */ - .tp_is_gc=(inquiry)green_is_gc, /* tp_is_gc */ -}; - - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/PyModule.cpp b/blog-app/venv/Lib/site-packages/greenlet/PyModule.cpp deleted file mode 100644 index 6adcb5c..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/PyModule.cpp +++ /dev/null @@ -1,292 +0,0 @@ -#ifndef PY_MODULE_CPP -#define PY_MODULE_CPP - -#include "greenlet_internal.hpp" - - -#include "TGreenletGlobals.cpp" -#include "TMainGreenlet.cpp" -#include "TThreadStateDestroy.cpp" - -using greenlet::LockGuard; -using greenlet::ThreadState; - -#ifdef __clang__ -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wunused-function" -# pragma clang diagnostic ignored "-Wunused-variable" -#endif - -PyDoc_STRVAR(mod_getcurrent_doc, - "getcurrent() -> greenlet\n" - "\n" - "Returns the current greenlet (i.e. the one which called this " - "function).\n"); - -static PyObject* -mod_getcurrent(PyObject* UNUSED(module)) -{ - return GET_THREAD_STATE().state().get_current().relinquish_ownership_o(); -} - -PyDoc_STRVAR(mod_settrace_doc, - "settrace(callback) -> object\n" - "\n" - "Sets a new tracing function and returns the previous one.\n"); -static PyObject* -mod_settrace(PyObject* UNUSED(module), PyObject* args) -{ - PyArgParseParam tracefunc; - if (!PyArg_ParseTuple(args, "O", &tracefunc)) { - return NULL; - } - ThreadState& state = GET_THREAD_STATE(); - OwnedObject previous = state.get_tracefunc(); - if (!previous) { - previous = Py_None; - } - - state.set_tracefunc(tracefunc); - - return previous.relinquish_ownership(); -} - -PyDoc_STRVAR(mod_gettrace_doc, - "gettrace() -> object\n" - "\n" - "Returns the currently set tracing function, or None.\n"); - -static PyObject* -mod_gettrace(PyObject* UNUSED(module)) -{ - OwnedObject tracefunc = GET_THREAD_STATE().state().get_tracefunc(); - if (!tracefunc) { - tracefunc = Py_None; - } - return tracefunc.relinquish_ownership(); -} - - - -PyDoc_STRVAR(mod_set_thread_local_doc, - "set_thread_local(key, value) -> None\n" - "\n" - "Set a value in the current thread-local dictionary. Debugging only.\n"); - -static PyObject* -mod_set_thread_local(PyObject* UNUSED(module), PyObject* args) -{ - PyArgParseParam key; - PyArgParseParam value; - PyObject* result = NULL; - - if (PyArg_UnpackTuple(args, "set_thread_local", 2, 2, &key, &value)) { - if(PyDict_SetItem( - PyThreadState_GetDict(), // borrow - key, - value) == 0 ) { - // success - Py_INCREF(Py_None); - result = Py_None; - } - } - return result; -} - -PyDoc_STRVAR(mod_get_pending_cleanup_count_doc, - "get_pending_cleanup_count() -> Integer\n" - "\n" - "Get the number of greenlet cleanup operations pending. Testing only.\n"); - - -static PyObject* -mod_get_pending_cleanup_count(PyObject* UNUSED(module)) -{ - LockGuard cleanup_lock(*mod_globs->thread_states_to_destroy_lock); - return PyLong_FromSize_t(mod_globs->thread_states_to_destroy.size()); -} - -PyDoc_STRVAR(mod_get_total_main_greenlets_doc, - "get_total_main_greenlets() -> Integer\n" - "\n" - "Quickly return the number of main greenlets that exist. Testing only.\n"); - -static PyObject* -mod_get_total_main_greenlets(PyObject* UNUSED(module)) -{ - return PyLong_FromSize_t(G_TOTAL_MAIN_GREENLETS); -} - - - -PyDoc_STRVAR(mod_get_clocks_used_doing_optional_cleanup_doc, - "get_clocks_used_doing_optional_cleanup() -> Integer\n" - "\n" - "Get the number of clock ticks the program has used doing optional " - "greenlet cleanup.\n" - "Beginning in greenlet 2.0, greenlet tries to find and dispose of greenlets\n" - "that leaked after a thread exited. This requires invoking Python's garbage collector,\n" - "which may have a performance cost proportional to the number of live objects.\n" - "This function returns the amount of processor time\n" - "greenlet has used to do this. In programs that run with very large amounts of live\n" - "objects, this metric can be used to decide whether the cost of doing this cleanup\n" - "is worth the memory leak being corrected. If not, you can disable the cleanup\n" - "using ``enable_optional_cleanup(False)``.\n" - "The units are arbitrary and can only be compared to themselves (similarly to ``time.clock()``);\n" - "for example, to see how it scales with your heap. You can attempt to convert them into seconds\n" - "by dividing by the value of CLOCKS_PER_SEC." - "If cleanup has been disabled, returns None." - "\n" - "This is an implementation specific, provisional API. It may be changed or removed\n" - "in the future.\n" - ".. versionadded:: 2.0" - ); -static PyObject* -mod_get_clocks_used_doing_optional_cleanup(PyObject* UNUSED(module)) -{ - std::clock_t& clocks = ThreadState::clocks_used_doing_gc(); - - if (clocks == std::clock_t(-1)) { - Py_RETURN_NONE; - } - // This might not actually work on some implementations; clock_t - // is an opaque type. - return PyLong_FromSsize_t(clocks); -} - -PyDoc_STRVAR(mod_enable_optional_cleanup_doc, - "mod_enable_optional_cleanup(bool) -> None\n" - "\n" - "Enable or disable optional cleanup operations.\n" - "See ``get_clocks_used_doing_optional_cleanup()`` for details.\n" - ); -static PyObject* -mod_enable_optional_cleanup(PyObject* UNUSED(module), PyObject* flag) -{ - int is_true = PyObject_IsTrue(flag); - if (is_true == -1) { - return nullptr; - } - - std::clock_t& clocks = ThreadState::clocks_used_doing_gc(); - if (is_true) { - // If we already have a value, we don't want to lose it. - if (clocks == std::clock_t(-1)) { - clocks = 0; - } - } - else { - clocks = std::clock_t(-1); - } - Py_RETURN_NONE; -} - - - - -#if !GREENLET_PY313 -PyDoc_STRVAR(mod_get_tstate_trash_delete_nesting_doc, - "get_tstate_trash_delete_nesting() -> Integer\n" - "\n" - "Return the 'trash can' nesting level. Testing only.\n"); -static PyObject* -mod_get_tstate_trash_delete_nesting(PyObject* UNUSED(module)) -{ - PyThreadState* tstate = PyThreadState_GET(); - -#if GREENLET_PY312 - return PyLong_FromLong(tstate->trash.delete_nesting); -#else - return PyLong_FromLong(tstate->trash_delete_nesting); -#endif -} -#endif - - - - -static PyMethodDef GreenMethods[] = { - { - .ml_name="getcurrent", - .ml_meth=(PyCFunction)mod_getcurrent, - .ml_flags=METH_NOARGS, - .ml_doc=mod_getcurrent_doc - }, - { - .ml_name="settrace", - .ml_meth=(PyCFunction)mod_settrace, - .ml_flags=METH_VARARGS, - .ml_doc=mod_settrace_doc - }, - { - .ml_name="gettrace", - .ml_meth=(PyCFunction)mod_gettrace, - .ml_flags=METH_NOARGS, - .ml_doc=mod_gettrace_doc - }, - { - .ml_name="set_thread_local", - .ml_meth=(PyCFunction)mod_set_thread_local, - .ml_flags=METH_VARARGS, - .ml_doc=mod_set_thread_local_doc - }, - { - .ml_name="get_pending_cleanup_count", - .ml_meth=(PyCFunction)mod_get_pending_cleanup_count, - .ml_flags=METH_NOARGS, - .ml_doc=mod_get_pending_cleanup_count_doc - }, - { - .ml_name="get_total_main_greenlets", - .ml_meth=(PyCFunction)mod_get_total_main_greenlets, - .ml_flags=METH_NOARGS, - .ml_doc=mod_get_total_main_greenlets_doc - }, - { - .ml_name="get_clocks_used_doing_optional_cleanup", - .ml_meth=(PyCFunction)mod_get_clocks_used_doing_optional_cleanup, - .ml_flags=METH_NOARGS, - .ml_doc=mod_get_clocks_used_doing_optional_cleanup_doc - }, - { - .ml_name="enable_optional_cleanup", - .ml_meth=(PyCFunction)mod_enable_optional_cleanup, - .ml_flags=METH_O, - .ml_doc=mod_enable_optional_cleanup_doc - }, -#if !GREENLET_PY313 - { - .ml_name="get_tstate_trash_delete_nesting", - .ml_meth=(PyCFunction)mod_get_tstate_trash_delete_nesting, - .ml_flags=METH_NOARGS, - .ml_doc=mod_get_tstate_trash_delete_nesting_doc - }, -#endif - {.ml_name=NULL, .ml_meth=NULL} /* Sentinel */ -}; - -static const char* const copy_on_greentype[] = { - "getcurrent", - "error", - "GreenletExit", - "settrace", - "gettrace", - NULL -}; - -static struct PyModuleDef greenlet_module_def = { - .m_base=PyModuleDef_HEAD_INIT, - .m_name="greenlet._greenlet", - .m_doc=NULL, - .m_size=-1, - .m_methods=GreenMethods, -}; - - -#endif - -#ifdef __clang__ -# pragma clang diagnostic pop -#elif defined(__GNUC__) -# pragma GCC diagnostic pop -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/TBrokenGreenlet.cpp b/blog-app/venv/Lib/site-packages/greenlet/TBrokenGreenlet.cpp deleted file mode 100644 index 7e9ab5b..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/TBrokenGreenlet.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -/** - * Implementation of greenlet::UserGreenlet. - * - * Format with: - * clang-format -i --style=file src/greenlet/greenlet.c - * - * - * Fix missing braces with: - * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" -*/ - -#include "TGreenlet.hpp" - -namespace greenlet { - -void* BrokenGreenlet::operator new(size_t UNUSED(count)) -{ - return allocator.allocate(1); -} - - -void BrokenGreenlet::operator delete(void* ptr) -{ - return allocator.deallocate(static_cast(ptr), - 1); -} - -greenlet::PythonAllocator greenlet::BrokenGreenlet::allocator; - -bool -BrokenGreenlet::force_slp_switch_error() const noexcept -{ - return this->_force_slp_switch_error; -} - -UserGreenlet::switchstack_result_t BrokenGreenlet::g_switchstack(void) -{ - if (this->_force_switch_error) { - return switchstack_result_t(-1); - } - return UserGreenlet::g_switchstack(); -} - -}; //namespace greenlet diff --git a/blog-app/venv/Lib/site-packages/greenlet/TExceptionState.cpp b/blog-app/venv/Lib/site-packages/greenlet/TExceptionState.cpp deleted file mode 100644 index 08a94ae..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/TExceptionState.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef GREENLET_EXCEPTION_STATE_CPP -#define GREENLET_EXCEPTION_STATE_CPP - -#include -#include "TGreenlet.hpp" - -namespace greenlet { - - -ExceptionState::ExceptionState() -{ - this->clear(); -} - -void ExceptionState::operator<<(const PyThreadState *const tstate) noexcept -{ - this->exc_info = tstate->exc_info; - this->exc_state = tstate->exc_state; -} - -void ExceptionState::operator>>(PyThreadState *const tstate) noexcept -{ - tstate->exc_state = this->exc_state; - tstate->exc_info = - this->exc_info ? this->exc_info : &tstate->exc_state; - this->clear(); -} - -void ExceptionState::clear() noexcept -{ - this->exc_info = nullptr; - this->exc_state.exc_value = nullptr; -#if !GREENLET_PY311 - this->exc_state.exc_type = nullptr; - this->exc_state.exc_traceback = nullptr; -#endif - this->exc_state.previous_item = nullptr; -} - -int ExceptionState::tp_traverse(visitproc visit, void* arg) noexcept -{ - Py_VISIT(this->exc_state.exc_value); -#if !GREENLET_PY311 - Py_VISIT(this->exc_state.exc_type); - Py_VISIT(this->exc_state.exc_traceback); -#endif - return 0; -} - -void ExceptionState::tp_clear() noexcept -{ - Py_CLEAR(this->exc_state.exc_value); -#if !GREENLET_PY311 - Py_CLEAR(this->exc_state.exc_type); - Py_CLEAR(this->exc_state.exc_traceback); -#endif -} - - -}; // namespace greenlet - -#endif // GREENLET_EXCEPTION_STATE_CPP diff --git a/blog-app/venv/Lib/site-packages/greenlet/TGreenlet.cpp b/blog-app/venv/Lib/site-packages/greenlet/TGreenlet.cpp deleted file mode 100644 index 4698a17..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/TGreenlet.cpp +++ /dev/null @@ -1,718 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -/** - * Implementation of greenlet::Greenlet. - * - * Format with: - * clang-format -i --style=file src/greenlet/greenlet.c - * - * - * Fix missing braces with: - * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" -*/ -#ifndef TGREENLET_CPP -#define TGREENLET_CPP -#include "greenlet_internal.hpp" -#include "TGreenlet.hpp" - - -#include "TGreenletGlobals.cpp" -#include "TThreadStateDestroy.cpp" - -namespace greenlet { - -Greenlet::Greenlet(PyGreenlet* p) - : Greenlet(p, StackState()) -{ -} - -Greenlet::Greenlet(PyGreenlet* p, const StackState& initial_stack) - : _self(p), stack_state(initial_stack) -{ - assert(p->pimpl == nullptr); - p->pimpl = this; -} - -Greenlet::~Greenlet() -{ - // XXX: Can't do this. tp_clear is a virtual function, and by the - // time we're here, we've sliced off our child classes. - //this->tp_clear(); - this->_self->pimpl = nullptr; -} - -bool -Greenlet::force_slp_switch_error() const noexcept -{ - return false; -} - -void -Greenlet::release_args() -{ - this->switch_args.CLEAR(); -} - -/** - * CAUTION: This will allocate memory and may trigger garbage - * collection and arbitrary Python code. - */ -OwnedObject -Greenlet::throw_GreenletExit_during_dealloc(const ThreadState& UNUSED(current_thread_state)) -{ - // If we're killed because we lost all references in the - // middle of a switch, that's ok. Don't reset the args/kwargs, - // we still want to pass them to the parent. - PyErr_SetString(mod_globs->PyExc_GreenletExit, - "Killing the greenlet because all references have vanished."); - // To get here it had to have run before - return this->g_switch(); -} - -inline void -Greenlet::slp_restore_state() noexcept -{ -#ifdef SLP_BEFORE_RESTORE_STATE - SLP_BEFORE_RESTORE_STATE(); -#endif - this->stack_state.copy_heap_to_stack( - this->thread_state()->borrow_current()->stack_state); -} - - -inline int -Greenlet::slp_save_state(char *const stackref) noexcept -{ - // XXX: This used to happen in the middle, before saving, but - // after finding the next owner. Does that matter? This is - // only defined for Sparc/GCC where it flushes register - // windows to the stack (I think) -#ifdef SLP_BEFORE_SAVE_STATE - SLP_BEFORE_SAVE_STATE(); -#endif - return this->stack_state.copy_stack_to_heap(stackref, - this->thread_state()->borrow_current()->stack_state); -} - -/** - * CAUTION: This will allocate memory and may trigger garbage - * collection and arbitrary Python code. - */ -OwnedObject -Greenlet::on_switchstack_or_initialstub_failure( - Greenlet* target, - const Greenlet::switchstack_result_t& err, - const bool target_was_me, - const bool was_initial_stub) -{ - // If we get here, either g_initialstub() - // failed, or g_switchstack() failed. Either one of those - // cases SHOULD leave us in the original greenlet with a valid stack. - if (!PyErr_Occurred()) { - PyErr_SetString( - PyExc_SystemError, - was_initial_stub - ? "Failed to switch stacks into a greenlet for the first time." - : "Failed to switch stacks into a running greenlet."); - } - this->release_args(); - - if (target && !target_was_me) { - target->murder_in_place(); - } - - assert(!err.the_new_current_greenlet); - assert(!err.origin_greenlet); - return OwnedObject(); - -} - -OwnedGreenlet -Greenlet::g_switchstack_success() noexcept -{ - PyThreadState* tstate = PyThreadState_GET(); - // restore the saved state - this->python_state >> tstate; - this->exception_state >> tstate; - - // The thread state hasn't been changed yet. - ThreadState* thread_state = this->thread_state(); - OwnedGreenlet result(thread_state->get_current()); - thread_state->set_current(this->self()); - //assert(thread_state->borrow_current().borrow() == this->_self); - return result; -} - -Greenlet::switchstack_result_t -Greenlet::g_switchstack(void) -{ - // if any of these assertions fail, it's likely because we - // switched away and tried to switch back to us. Early stages of - // switching are not reentrant because we re-use ``this->args()``. - // Switching away would happen if we trigger a garbage collection - // (by just using some Python APIs that happen to allocate Python - // objects) and some garbage had weakref callbacks or __del__ that - // switches (people don't write code like that by hand, but with - // gevent it's possible without realizing it) - assert(this->args() || PyErr_Occurred()); - { /* save state */ - if (this->thread_state()->is_current(this->self())) { - // Hmm, nothing to do. - // TODO: Does this bypass trace events that are - // important? - return switchstack_result_t(0, - this, this->thread_state()->borrow_current()); - } - BorrowedGreenlet current = this->thread_state()->borrow_current(); - PyThreadState* tstate = PyThreadState_GET(); - - current->python_state << tstate; - current->exception_state << tstate; - this->python_state.will_switch_from(tstate); - switching_thread_state = this; - current->expose_frames(); - } - assert(this->args() || PyErr_Occurred()); - // If this is the first switch into a greenlet, this will - // return twice, once with 1 in the new greenlet, once with 0 - // in the origin. - int err; - if (this->force_slp_switch_error()) { - err = -1; - } - else { - err = slp_switch(); - } - - if (err < 0) { /* error */ - // Tested by - // test_greenlet.TestBrokenGreenlets.test_failed_to_slp_switch_into_running - // - // It's not clear if it's worth trying to clean up and - // continue here. Failing to switch stacks is a big deal which - // may not be recoverable (who knows what state the stack is in). - // Also, we've stolen references in preparation for calling - // ``g_switchstack_success()`` and we don't have a clean - // mechanism for backing that all out. - Py_FatalError("greenlet: Failed low-level slp_switch(). The stack is probably corrupt."); - } - - // No stack-based variables are valid anymore. - - // But the global is volatile so we can reload it without the - // compiler caching it from earlier. - Greenlet* greenlet_that_switched_in = switching_thread_state; // aka this - switching_thread_state = nullptr; - // except that no stack variables are valid, we would: - // assert(this == greenlet_that_switched_in); - - // switchstack success is where we restore the exception state, - // etc. It returns the origin greenlet because its convenient. - - OwnedGreenlet origin = greenlet_that_switched_in->g_switchstack_success(); - assert(greenlet_that_switched_in->args() || PyErr_Occurred()); - return switchstack_result_t(err, greenlet_that_switched_in, origin); -} - - -inline void -Greenlet::check_switch_allowed() const -{ - // TODO: Make this take a parameter of the current greenlet, - // or current main greenlet, to make the check for - // cross-thread switching cheaper. Surely somewhere up the - // call stack we've already accessed the thread local variable. - - // We expect to always have a main greenlet now; accessing the thread state - // created it. However, if we get here and cleanup has already - // begun because we're a greenlet that was running in a - // (now dead) thread, these invariants will not hold true. In - // fact, accessing `this->thread_state` may not even be possible. - - // If the thread this greenlet was running in is dead, - // we'll still have a reference to a main greenlet, but the - // thread state pointer we have is bogus. - // TODO: Give the objects an API to determine if they belong - // to a dead thread. - - const BorrowedMainGreenlet main_greenlet = this->find_main_greenlet_in_lineage(); - - if (!main_greenlet) { - throw PyErrOccurred(mod_globs->PyExc_GreenletError, - "cannot switch to a garbage collected greenlet"); - } - - if (!main_greenlet->thread_state()) { - throw PyErrOccurred(mod_globs->PyExc_GreenletError, - "cannot switch to a different thread (which happens to have exited)"); - } - - // The main greenlet we found was from the .parent lineage. - // That may or may not have any relationship to the main - // greenlet of the running thread. We can't actually access - // our this->thread_state members to try to check that, - // because it could be in the process of getting destroyed, - // but setting the main_greenlet->thread_state member to NULL - // may not be visible yet. So we need to check against the - // current thread state (once the cheaper checks are out of - // the way) - const BorrowedMainGreenlet current_main_greenlet = GET_THREAD_STATE().state().borrow_main_greenlet(); - if ( - // lineage main greenlet is not this thread's greenlet - current_main_greenlet != main_greenlet - || ( - // atteched to some thread - this->main_greenlet() - // XXX: Same condition as above. Was this supposed to be - // this->main_greenlet()? - && current_main_greenlet != main_greenlet) - // switching into a known dead thread (XXX: which, if we get here, - // is bad, because we just accessed the thread state, which is - // gone!) - || (!current_main_greenlet->thread_state())) { - // CAUTION: This may trigger memory allocations, gc, and - // arbitrary Python code. - throw PyErrOccurred( - mod_globs->PyExc_GreenletError, - "Cannot switch to a different thread\n\tCurrent: %R\n\tExpected: %R", - current_main_greenlet, main_greenlet); - } -} - -const OwnedObject -Greenlet::context() const -{ - using greenlet::PythonStateContext; - OwnedObject result; - - if (this->is_currently_running_in_some_thread()) { - /* Currently running greenlet: context is stored in the thread state, - not the greenlet object. */ - if (GET_THREAD_STATE().state().is_current(this->self())) { - result = PythonStateContext::context(PyThreadState_GET()); - } - else { - throw ValueError( - "cannot get context of a " - "greenlet that is running in a different thread"); - } - } - else { - /* Greenlet is not running: just return context. */ - result = this->python_state.context(); - } - if (!result) { - result = OwnedObject::None(); - } - return result; -} - - -void -Greenlet::context(BorrowedObject given) -{ - using greenlet::PythonStateContext; - if (!given) { - throw AttributeError("can't delete context attribute"); - } - if (given.is_None()) { - /* "Empty context" is stored as NULL, not None. */ - given = nullptr; - } - - //checks type, incrs refcnt - greenlet::refs::OwnedContext context(given); - PyThreadState* tstate = PyThreadState_GET(); - - if (this->is_currently_running_in_some_thread()) { - if (!GET_THREAD_STATE().state().is_current(this->self())) { - throw ValueError("cannot set context of a greenlet" - " that is running in a different thread"); - } - - /* Currently running greenlet: context is stored in the thread state, - not the greenlet object. */ - OwnedObject octx = OwnedObject::consuming(PythonStateContext::context(tstate)); - PythonStateContext::context(tstate, context.relinquish_ownership()); - } - else { - /* Greenlet is not running: just set context. Note that the - greenlet may be dead.*/ - this->python_state.context() = context; - } -} - -/** - * CAUTION: May invoke arbitrary Python code. - * - * Figure out what the result of ``greenlet.switch(arg, kwargs)`` - * should be and transfers ownership of it to the left-hand-side. - * - * If switch() was just passed an arg tuple, then we'll just return that. - * If only keyword arguments were passed, then we'll pass the keyword - * argument dict. Otherwise, we'll create a tuple of (args, kwargs) and - * return both. - * - * CAUTION: This may allocate a new tuple object, which may - * cause the Python garbage collector to run, which in turn may - * run arbitrary Python code that switches. - */ -OwnedObject& operator<<=(OwnedObject& lhs, greenlet::SwitchingArgs& rhs) noexcept -{ - // Because this may invoke arbitrary Python code, which could - // result in switching back to us, we need to get the - // arguments locally on the stack. - assert(rhs); - OwnedObject args = rhs.args(); - OwnedObject kwargs = rhs.kwargs(); - rhs.CLEAR(); - // We shouldn't be called twice for the same switch. - assert(args || kwargs); - assert(!rhs); - - if (!kwargs) { - lhs = args; - } - else if (!PyDict_Size(kwargs.borrow())) { - lhs = args; - } - else if (!PySequence_Length(args.borrow())) { - lhs = kwargs; - } - else { - // PyTuple_Pack allocates memory, may GC, may run arbitrary - // Python code. - lhs = OwnedObject::consuming(PyTuple_Pack(2, args.borrow(), kwargs.borrow())); - } - return lhs; -} - -static OwnedObject -g_handle_exit(const OwnedObject& greenlet_result) -{ - if (!greenlet_result && mod_globs->PyExc_GreenletExit.PyExceptionMatches()) { - /* catch and ignore GreenletExit */ - PyErrFetchParam val; - PyErr_Fetch(PyErrFetchParam(), val, PyErrFetchParam()); - if (!val) { - return OwnedObject::None(); - } - return OwnedObject(val); - } - - if (greenlet_result) { - // package the result into a 1-tuple - // PyTuple_Pack increments the reference of its arguments, - // so we always need to decref the greenlet result; - // the owner will do that. - return OwnedObject::consuming(PyTuple_Pack(1, greenlet_result.borrow())); - } - - return OwnedObject(); -} - - - -/** - * May run arbitrary Python code. - */ -OwnedObject -Greenlet::g_switch_finish(const switchstack_result_t& err) -{ - assert(err.the_new_current_greenlet == this); - - ThreadState& state = *this->thread_state(); - // Because calling the trace function could do arbitrary things, - // including switching away from this greenlet and then maybe - // switching back, we need to capture the arguments now so that - // they don't change. - OwnedObject result; - if (this->args()) { - result <<= this->args(); - } - else { - assert(PyErr_Occurred()); - } - assert(!this->args()); - try { - // Our only caller handles the bad error case - assert(err.status >= 0); - assert(state.borrow_current() == this->self()); - if (OwnedObject tracefunc = state.get_tracefunc()) { - assert(result || PyErr_Occurred()); - g_calltrace(tracefunc, - result ? mod_globs->event_switch : mod_globs->event_throw, - err.origin_greenlet, - this->self()); - } - // The above could have invoked arbitrary Python code, but - // it couldn't switch back to this object and *also* - // throw an exception, so the args won't have changed. - - if (PyErr_Occurred()) { - // We get here if we fell of the end of the run() function - // raising an exception. The switch itself was - // successful, but the function raised. - // valgrind reports that memory allocated here can still - // be reached after a test run. - throw PyErrOccurred::from_current(); - } - return result; - } - catch (const PyErrOccurred&) { - /* Turn switch errors into switch throws */ - /* Turn trace errors into switch throws */ - this->release_args(); - throw; - } -} - -void -Greenlet::g_calltrace(const OwnedObject& tracefunc, - const greenlet::refs::ImmortalEventName& event, - const BorrowedGreenlet& origin, - const BorrowedGreenlet& target) -{ - PyErrPieces saved_exc; - try { - TracingGuard tracing_guard; - // TODO: We have saved the active exception (if any) that's - // about to be raised. In the 'throw' case, we could provide - // the exception to the tracefunction, which seems very helpful. - tracing_guard.CallTraceFunction(tracefunc, event, origin, target); - } - catch (const PyErrOccurred&) { - // In case of exceptions trace function is removed, - // and any existing exception is replaced with the tracing - // exception. - GET_THREAD_STATE().state().set_tracefunc(Py_None); - throw; - } - - saved_exc.PyErrRestore(); - assert( - (event == mod_globs->event_throw && PyErr_Occurred()) - || (event == mod_globs->event_switch && !PyErr_Occurred()) - ); -} - -void -Greenlet::murder_in_place() -{ - if (this->active()) { - assert(!this->is_currently_running_in_some_thread()); - this->deactivate_and_free(); - } -} - -inline void -Greenlet::deactivate_and_free() -{ - if (!this->active()) { - return; - } - // Throw away any saved stack. - this->stack_state = StackState(); - assert(!this->stack_state.active()); - // Throw away any Python references. - // We're holding a borrowed reference to the last - // frame we executed. Since we borrowed it, the - // normal traversal, clear, and dealloc functions - // ignore it, meaning it leaks. (The thread state - // object can't find it to clear it when that's - // deallocated either, because by definition if we - // got an object on this list, it wasn't - // running and the thread state doesn't have - // this frame.) - // So here, we *do* clear it. - this->python_state.tp_clear(true); -} - -bool -Greenlet::belongs_to_thread(const ThreadState* thread_state) const -{ - if (!this->thread_state() // not running anywhere, or thread - // exited - || !thread_state) { // same, or there is no thread state. - return false; - } - return true; -} - - -void -Greenlet::deallocing_greenlet_in_thread(const ThreadState* current_thread_state) -{ - /* Cannot raise an exception to kill the greenlet if - it is not running in the same thread! */ - if (this->belongs_to_thread(current_thread_state)) { - assert(current_thread_state); - // To get here it had to have run before - /* Send the greenlet a GreenletExit exception. */ - - // We don't care about the return value, only whether an - // exception happened. - this->throw_GreenletExit_during_dealloc(*current_thread_state); - return; - } - - // Not the same thread! Temporarily save the greenlet - // into its thread's deleteme list, *if* it exists. - // If that thread has already exited, and processed its pending - // cleanup, we'll never be able to clean everything up: we won't - // be able to raise an exception. - // That's mostly OK! Since we can't add it to a list, our refcount - // won't increase, and we'll go ahead with the DECREFs later. - ThreadState *const thread_state = this->thread_state(); - if (thread_state) { - thread_state->delete_when_thread_running(this->self()); - } - else { - // The thread is dead, we can't raise an exception. - // We need to make it look non-active, though, so that dealloc - // finishes killing it. - this->deactivate_and_free(); - } - return; -} - - -int -Greenlet::tp_traverse(visitproc visit, void* arg) -{ - - int result; - if ((result = this->exception_state.tp_traverse(visit, arg)) != 0) { - return result; - } - //XXX: This is ugly. But so is handling everything having to do - //with the top frame. - bool visit_top_frame = this->was_running_in_dead_thread(); - // When true, the thread is dead. Our implicit weak reference to the - // frame is now all that's left; we consider ourselves to - // strongly own it now. - if ((result = this->python_state.tp_traverse(visit, arg, visit_top_frame)) != 0) { - return result; - } - return 0; -} - -int -Greenlet::tp_clear() -{ - bool own_top_frame = this->was_running_in_dead_thread(); - this->exception_state.tp_clear(); - this->python_state.tp_clear(own_top_frame); - return 0; -} - -bool Greenlet::is_currently_running_in_some_thread() const -{ - return this->stack_state.active() && !this->python_state.top_frame(); -} - -#if GREENLET_PY312 -void GREENLET_NOINLINE(Greenlet::expose_frames)() -{ - if (!this->python_state.top_frame()) { - return; - } - - _PyInterpreterFrame* last_complete_iframe = nullptr; - _PyInterpreterFrame* iframe = this->python_state.top_frame()->f_frame; - while (iframe) { - // We must make a copy before looking at the iframe contents, - // since iframe might point to a portion of the greenlet's C stack - // that was spilled when switching greenlets. - _PyInterpreterFrame iframe_copy; - this->stack_state.copy_from_stack(&iframe_copy, iframe, sizeof(*iframe)); - if (!_PyFrame_IsIncomplete(&iframe_copy)) { - // If the iframe were OWNED_BY_CSTACK then it would always be - // incomplete. Since it's not incomplete, it's not on the C stack - // and we can access it through the original `iframe` pointer - // directly. This is important since GetFrameObject might - // lazily _create_ the frame object and we don't want the - // interpreter to lose track of it. - assert(iframe_copy.owner != FRAME_OWNED_BY_CSTACK); - - // We really want to just write: - // PyFrameObject* frame = _PyFrame_GetFrameObject(iframe); - // but _PyFrame_GetFrameObject calls _PyFrame_MakeAndSetFrameObject - // which is not a visible symbol in libpython. The easiest - // way to get a public function to call it is using - // PyFrame_GetBack, which is defined as follows: - // assert(frame != NULL); - // assert(!_PyFrame_IsIncomplete(frame->f_frame)); - // PyFrameObject *back = frame->f_back; - // if (back == NULL) { - // _PyInterpreterFrame *prev = frame->f_frame->previous; - // prev = _PyFrame_GetFirstComplete(prev); - // if (prev) { - // back = _PyFrame_GetFrameObject(prev); - // } - // } - // return (PyFrameObject*)Py_XNewRef(back); - if (!iframe->frame_obj) { - PyFrameObject dummy_frame; - _PyInterpreterFrame dummy_iframe; - dummy_frame.f_back = nullptr; - dummy_frame.f_frame = &dummy_iframe; - // force the iframe to be considered complete without - // needing to check its code object: - dummy_iframe.owner = FRAME_OWNED_BY_GENERATOR; - dummy_iframe.previous = iframe; - assert(!_PyFrame_IsIncomplete(&dummy_iframe)); - // Drop the returned reference immediately; the iframe - // continues to hold a strong reference - Py_XDECREF(PyFrame_GetBack(&dummy_frame)); - assert(iframe->frame_obj); - } - - // This is a complete frame, so make the last one of those we saw - // point at it, bypassing any incomplete frames (which may have - // been on the C stack) in between the two. We're overwriting - // last_complete_iframe->previous and need that to be reversible, - // so we store the original previous ptr in the frame object - // (which we must have created on a previous iteration through - // this loop). The frame object has a bunch of storage that is - // only used when its iframe is OWNED_BY_FRAME_OBJECT, which only - // occurs when the frame object outlives the frame's execution, - // which can't have happened yet because the frame is currently - // executing as far as the interpreter is concerned. So, we can - // reuse it for our own purposes. - assert(iframe->owner == FRAME_OWNED_BY_THREAD - || iframe->owner == FRAME_OWNED_BY_GENERATOR); - if (last_complete_iframe) { - assert(last_complete_iframe->frame_obj); - memcpy(&last_complete_iframe->frame_obj->_f_frame_data[0], - &last_complete_iframe->previous, sizeof(void *)); - last_complete_iframe->previous = iframe; - } - last_complete_iframe = iframe; - } - // Frames that are OWNED_BY_FRAME_OBJECT are linked via the - // frame's f_back while all others are linked via the iframe's - // previous ptr. Since all the frames we traverse are running - // as far as the interpreter is concerned, we don't have to - // worry about the OWNED_BY_FRAME_OBJECT case. - iframe = iframe_copy.previous; - } - - // Give the outermost complete iframe a null previous pointer to - // account for any potential incomplete/C-stack iframes between it - // and the actual top-of-stack - if (last_complete_iframe) { - assert(last_complete_iframe->frame_obj); - memcpy(&last_complete_iframe->frame_obj->_f_frame_data[0], - &last_complete_iframe->previous, sizeof(void *)); - last_complete_iframe->previous = nullptr; - } -} -#else -void Greenlet::expose_frames() -{ - -} -#endif - -}; // namespace greenlet -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/TGreenlet.hpp b/blog-app/venv/Lib/site-packages/greenlet/TGreenlet.hpp deleted file mode 100644 index f69b881..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/TGreenlet.hpp +++ /dev/null @@ -1,820 +0,0 @@ -#ifndef GREENLET_GREENLET_HPP -#define GREENLET_GREENLET_HPP -/* - * Declarations of the core data structures. -*/ - -#define PY_SSIZE_T_CLEAN -#include - -#include "greenlet_compiler_compat.hpp" -#include "greenlet_refs.hpp" -#include "greenlet_cpython_compat.hpp" -#include "greenlet_allocator.hpp" - -using greenlet::refs::OwnedObject; -using greenlet::refs::OwnedGreenlet; -using greenlet::refs::OwnedMainGreenlet; -using greenlet::refs::BorrowedGreenlet; - -#if PY_VERSION_HEX < 0x30B00A6 -# define _PyCFrame CFrame -# define _PyInterpreterFrame _interpreter_frame -#endif - -#if GREENLET_PY312 -# define Py_BUILD_CORE -# include "internal/pycore_frame.h" -#endif - -#if GREENLET_PY314 -# include "internal/pycore_interpframe_structs.h" -# include "internal/pycore_interpframe.h" -#endif - -// XXX: TODO: Work to remove all virtual functions -// for speed of calling and size of objects (no vtable). -// One pattern is the Curiously Recurring Template -namespace greenlet -{ - class ExceptionState - { - private: - G_NO_COPIES_OF_CLS(ExceptionState); - - // Even though these are borrowed objects, we actually own - // them, when they're not null. - // XXX: Express that in the API. - private: - _PyErr_StackItem* exc_info; - _PyErr_StackItem exc_state; - public: - ExceptionState(); - void operator<<(const PyThreadState *const tstate) noexcept; - void operator>>(PyThreadState* tstate) noexcept; - void clear() noexcept; - - int tp_traverse(visitproc visit, void* arg) noexcept; - void tp_clear() noexcept; - }; - - template - void operator<<(const PyThreadState *const tstate, T& exc); - - class PythonStateContext - { - protected: - greenlet::refs::OwnedContext _context; - public: - inline const greenlet::refs::OwnedContext& context() const - { - return this->_context; - } - inline greenlet::refs::OwnedContext& context() - { - return this->_context; - } - - inline void tp_clear() - { - this->_context.CLEAR(); - } - - template - inline static PyObject* context(T* tstate) - { - return tstate->context; - } - - template - inline static void context(T* tstate, PyObject* new_context) - { - tstate->context = new_context; - tstate->context_ver++; - } - }; - class SwitchingArgs; - class PythonState : public PythonStateContext - { - public: - typedef greenlet::refs::OwnedReference OwnedFrame; - private: - G_NO_COPIES_OF_CLS(PythonState); - // We own this if we're suspended (although currently we don't - // tp_traverse into it; that's a TODO). If we're running, it's - // empty. If we get deallocated and *still* have a frame, it - // won't be reachable from the place that normally decref's - // it, so we need to do it (hence owning it). - OwnedFrame _top_frame; -#if GREENLET_USE_CFRAME - _PyCFrame* cframe; - int use_tracing; -#endif -#if GREENLET_PY314 - int py_recursion_depth; -#elif GREENLET_PY312 - int py_recursion_depth; - int c_recursion_depth; -#else - int recursion_depth; -#endif -#if GREENLET_PY313 - PyObject *delete_later; -#else - int trash_delete_nesting; -#endif -#if GREENLET_PY311 - _PyInterpreterFrame* current_frame; - _PyStackChunk* datastack_chunk; - PyObject** datastack_top; - PyObject** datastack_limit; -#endif - // The PyInterpreterFrame list on 3.12+ contains some entries that are - // on the C stack, which can't be directly accessed while a greenlet is - // suspended. In order to keep greenlet gr_frame introspection working, - // we adjust stack switching to rewrite the interpreter frame list - // to skip these C-stack frames; we call this "exposing" the greenlet's - // frames because it makes them valid to work with in Python. Then when - // the greenlet is resumed we need to remember to reverse the operation - // we did. The C-stack frames are "entry frames" which are a low-level - // interpreter detail; they're not needed for introspection, but do - // need to be present for the eval loop to work. - void unexpose_frames(); - - public: - - PythonState(); - // You can use this for testing whether we have a frame - // or not. It returns const so they can't modify it. - const OwnedFrame& top_frame() const noexcept; - - inline void operator<<(const PyThreadState *const tstate) noexcept; - inline void operator>>(PyThreadState* tstate) noexcept; - void clear() noexcept; - - int tp_traverse(visitproc visit, void* arg, bool visit_top_frame) noexcept; - void tp_clear(bool own_top_frame) noexcept; - void set_initial_state(const PyThreadState* const tstate) noexcept; -#if GREENLET_USE_CFRAME - void set_new_cframe(_PyCFrame& frame) noexcept; -#endif - - void may_switch_away() noexcept; - inline void will_switch_from(PyThreadState *const origin_tstate) noexcept; - void did_finish(PyThreadState* tstate) noexcept; - }; - - class StackState - { - // By having only plain C (POD) members, no virtual functions - // or bases, we get a trivial assignment operator generated - // for us. However, that's not safe since we do manage memory. - // So we declare an assignment operator that only works if we - // don't have any memory allocated. (We don't use - // std::shared_ptr for reference counting just to keep this - // object small) - private: - char* _stack_start; - char* stack_stop; - char* stack_copy; - intptr_t _stack_saved; - StackState* stack_prev; - inline int copy_stack_to_heap_up_to(const char* const stop) noexcept; - inline void free_stack_copy() noexcept; - - public: - /** - * Creates a started, but inactive, state, using *current* - * as the previous. - */ - StackState(void* mark, StackState& current); - /** - * Creates an inactive, unstarted, state. - */ - StackState(); - ~StackState(); - StackState(const StackState& other); - StackState& operator=(const StackState& other); - inline void copy_heap_to_stack(const StackState& current) noexcept; - inline int copy_stack_to_heap(char* const stackref, const StackState& current) noexcept; - inline bool started() const noexcept; - inline bool main() const noexcept; - inline bool active() const noexcept; - inline void set_active() noexcept; - inline void set_inactive() noexcept; - inline intptr_t stack_saved() const noexcept; - inline char* stack_start() const noexcept; - static inline StackState make_main() noexcept; -#ifdef GREENLET_USE_STDIO - friend std::ostream& operator<<(std::ostream& os, const StackState& s); -#endif - - // Fill in [dest, dest + n) with the values that would be at - // [src, src + n) while this greenlet is running. This is like memcpy - // except that if the greenlet is suspended it accounts for the portion - // of the greenlet's stack that was spilled to the heap. `src` may - // be on this greenlet's stack, or on the heap, but not on a different - // greenlet's stack. - void copy_from_stack(void* dest, const void* src, size_t n) const; - }; -#ifdef GREENLET_USE_STDIO - std::ostream& operator<<(std::ostream& os, const StackState& s); -#endif - - class SwitchingArgs - { - private: - G_NO_ASSIGNMENT_OF_CLS(SwitchingArgs); - // If args and kwargs are both false (NULL), this is a *throw*, not a - // switch. PyErr_... must have been called already. - OwnedObject _args; - OwnedObject _kwargs; - public: - - SwitchingArgs() - {} - - SwitchingArgs(const OwnedObject& args, const OwnedObject& kwargs) - : _args(args), - _kwargs(kwargs) - {} - - SwitchingArgs(const SwitchingArgs& other) - : _args(other._args), - _kwargs(other._kwargs) - {} - - const OwnedObject& args() - { - return this->_args; - } - - const OwnedObject& kwargs() - { - return this->_kwargs; - } - - /** - * Moves ownership from the argument to this object. - */ - SwitchingArgs& operator<<=(SwitchingArgs& other) - { - if (this != &other) { - this->_args = other._args; - this->_kwargs = other._kwargs; - other.CLEAR(); - } - return *this; - } - - /** - * Acquires ownership of the argument (consumes the reference). - */ - SwitchingArgs& operator<<=(PyObject* args) - { - this->_args = OwnedObject::consuming(args); - this->_kwargs.CLEAR(); - return *this; - } - - /** - * Acquires ownership of the argument. - * - * Sets the args to be the given value; clears the kwargs. - */ - SwitchingArgs& operator<<=(OwnedObject& args) - { - assert(&args != &this->_args); - this->_args = args; - this->_kwargs.CLEAR(); - args.CLEAR(); - - return *this; - } - - explicit operator bool() const noexcept - { - return this->_args || this->_kwargs; - } - - inline void CLEAR() - { - this->_args.CLEAR(); - this->_kwargs.CLEAR(); - } - - const std::string as_str() const noexcept - { - return PyUnicode_AsUTF8( - OwnedObject::consuming( - PyUnicode_FromFormat( - "SwitchingArgs(args=%R, kwargs=%R)", - this->_args.borrow(), - this->_kwargs.borrow() - ) - ).borrow() - ); - } - }; - - class ThreadState; - - class UserGreenlet; - class MainGreenlet; - - class Greenlet - { - private: - G_NO_COPIES_OF_CLS(Greenlet); - PyGreenlet* const _self; - private: - // XXX: Work to remove these. - friend class ThreadState; - friend class UserGreenlet; - friend class MainGreenlet; - protected: - ExceptionState exception_state; - SwitchingArgs switch_args; - StackState stack_state; - PythonState python_state; - Greenlet(PyGreenlet* p, const StackState& initial_state); - public: - // This constructor takes ownership of the PyGreenlet, by - // setting ``p->pimpl = this;``. - Greenlet(PyGreenlet* p); - virtual ~Greenlet(); - - const OwnedObject context() const; - - // You MUST call this _very_ early in the switching process to - // prepare anything that may need prepared. This might perform - // garbage collections or otherwise run arbitrary Python code. - // - // One specific use of it is for Python 3.11+, preventing - // running arbitrary code at unsafe times. See - // PythonState::may_switch_away(). - inline void may_switch_away() - { - this->python_state.may_switch_away(); - } - - inline void context(refs::BorrowedObject new_context); - - inline SwitchingArgs& args() - { - return this->switch_args; - } - - virtual const refs::BorrowedMainGreenlet main_greenlet() const = 0; - - inline intptr_t stack_saved() const noexcept - { - return this->stack_state.stack_saved(); - } - - // This is used by the macro SLP_SAVE_STATE to compute the - // difference in stack sizes. It might be nice to handle the - // computation ourself, but the type of the result - // varies by platform, so doing it in the macro is the - // simplest way. - inline const char* stack_start() const noexcept - { - return this->stack_state.stack_start(); - } - - virtual OwnedObject throw_GreenletExit_during_dealloc(const ThreadState& current_thread_state); - virtual OwnedObject g_switch() = 0; - /** - * Force the greenlet to appear dead. Used when it's not - * possible to throw an exception into a greenlet anymore. - * - * This losses access to the thread state and the main greenlet. - */ - virtual void murder_in_place(); - - /** - * Called when somebody notices we were running in a dead - * thread to allow cleaning up resources (because we can't - * raise GreenletExit into it anymore). - * This is very similar to ``murder_in_place()``, except that - * it DOES NOT lose the main greenlet or thread state. - */ - inline void deactivate_and_free(); - - - // Called when some thread wants to deallocate a greenlet - // object. - // The thread may or may not be the same thread the greenlet - // was running in. - // The thread state will be null if the thread the greenlet - // was running in was known to have exited. - void deallocing_greenlet_in_thread(const ThreadState* current_state); - - // Must be called on 3.12+ before exposing a suspended greenlet's - // frames to user code. This rewrites the linked list of interpreter - // frames to skip the ones that are being stored on the C stack (which - // can't be safely accessed while the greenlet is suspended because - // that stack space might be hosting a different greenlet), and - // sets PythonState::frames_were_exposed so we remember to restore - // the original list before resuming the greenlet. The C-stack frames - // are a low-level interpreter implementation detail; while they're - // important to the bytecode eval loop, they're superfluous for - // introspection purposes. - void expose_frames(); - - - // TODO: Figure out how to make these non-public. - inline void slp_restore_state() noexcept; - inline int slp_save_state(char *const stackref) noexcept; - - inline bool is_currently_running_in_some_thread() const; - virtual bool belongs_to_thread(const ThreadState* state) const; - - inline bool started() const - { - return this->stack_state.started(); - } - inline bool active() const - { - return this->stack_state.active(); - } - inline bool main() const - { - return this->stack_state.main(); - } - virtual refs::BorrowedMainGreenlet find_main_greenlet_in_lineage() const = 0; - - virtual const OwnedGreenlet parent() const = 0; - virtual void parent(const refs::BorrowedObject new_parent) = 0; - - inline const PythonState::OwnedFrame& top_frame() - { - return this->python_state.top_frame(); - } - - virtual const OwnedObject& run() const = 0; - virtual void run(const refs::BorrowedObject nrun) = 0; - - - virtual int tp_traverse(visitproc visit, void* arg); - virtual int tp_clear(); - - - // Return the thread state that the greenlet is running in, or - // null if the greenlet is not running or the thread is known - // to have exited. - virtual ThreadState* thread_state() const noexcept = 0; - - // Return true if the greenlet is known to have been running - // (active) in a thread that has now exited. - virtual bool was_running_in_dead_thread() const noexcept = 0; - - // Return a borrowed greenlet that is the Python object - // this object represents. - inline BorrowedGreenlet self() const noexcept - { - return BorrowedGreenlet(this->_self); - } - - // For testing. If this returns true, we should pretend that - // slp_switch() failed. - virtual bool force_slp_switch_error() const noexcept; - - protected: - inline void release_args(); - - // The functions that must not be inlined are declared virtual. - // We also mark them as protected, not private, so that the - // compiler is forced to call them through a function pointer. - // (A sufficiently smart compiler could directly call a private - // virtual function since it can never be overridden in a - // subclass). - - // Also TODO: Switch away from integer error codes and to enums, - // or throw exceptions when possible. - struct switchstack_result_t - { - int status; - Greenlet* the_new_current_greenlet; - OwnedGreenlet origin_greenlet; - - switchstack_result_t() - : status(0), - the_new_current_greenlet(nullptr) - {} - - switchstack_result_t(int err) - : status(err), - the_new_current_greenlet(nullptr) - {} - - switchstack_result_t(int err, Greenlet* state, OwnedGreenlet& origin) - : status(err), - the_new_current_greenlet(state), - origin_greenlet(origin) - { - } - - switchstack_result_t(int err, Greenlet* state, const BorrowedGreenlet& origin) - : status(err), - the_new_current_greenlet(state), - origin_greenlet(origin) - { - } - - switchstack_result_t(const switchstack_result_t& other) - : status(other.status), - the_new_current_greenlet(other.the_new_current_greenlet), - origin_greenlet(other.origin_greenlet) - {} - - switchstack_result_t& operator=(const switchstack_result_t& other) - { - this->status = other.status; - this->the_new_current_greenlet = other.the_new_current_greenlet; - this->origin_greenlet = other.origin_greenlet; - return *this; - } - }; - - OwnedObject on_switchstack_or_initialstub_failure( - Greenlet* target, - const switchstack_result_t& err, - const bool target_was_me=false, - const bool was_initial_stub=false); - - // Returns the previous greenlet we just switched away from. - virtual OwnedGreenlet g_switchstack_success() noexcept; - - - // Check the preconditions for switching to this greenlet; if they - // aren't met, throws PyErrOccurred. Most callers will want to - // catch this and clear the arguments - inline void check_switch_allowed() const; - class GreenletStartedWhileInPython : public std::runtime_error - { - public: - GreenletStartedWhileInPython() : std::runtime_error("") - {} - }; - - protected: - - - /** - Perform a stack switch into this greenlet. - - This temporarily sets the global variable - ``switching_thread_state`` to this greenlet; as soon as the - call to ``slp_switch`` completes, this is reset to NULL. - Consequently, this depends on the GIL. - - TODO: Adopt the stackman model and pass ``slp_switch`` a - callback function and context pointer; this eliminates the - need for global variables altogether. - - Because the stack switch happens in this function, this - function can't use its own stack (local) variables, set - before the switch, and then accessed after the switch. - - Further, you con't even access ``g_thread_state_global`` - before and after the switch from the global variable. - Because it is thread local some compilers cache it in a - register/on the stack, notably new versions of MSVC; this - breaks with strange crashes sometime later, because writing - to anything in ``g_thread_state_global`` after the switch - is actually writing to random memory. For this reason, we - call a non-inlined function to finish the operation. (XXX: - The ``/GT`` MSVC compiler argument probably fixes that.) - - It is very important that stack switch is 'atomic', i.e. no - calls into other Python code allowed (except very few that - are safe), because global variables are very fragile. (This - should no longer be the case with thread-local variables.) - - */ - // Made virtual to facilitate subclassing UserGreenlet for testing. - virtual switchstack_result_t g_switchstack(void); - -class TracingGuard -{ -private: - PyThreadState* tstate; -public: - TracingGuard() - : tstate(PyThreadState_GET()) - { - PyThreadState_EnterTracing(this->tstate); - } - - ~TracingGuard() - { - PyThreadState_LeaveTracing(this->tstate); - this->tstate = nullptr; - } - - inline void CallTraceFunction(const OwnedObject& tracefunc, - const greenlet::refs::ImmortalEventName& event, - const BorrowedGreenlet& origin, - const BorrowedGreenlet& target) - { - // TODO: This calls tracefunc(event, (origin, target)). Add a shortcut - // function for that that's specialized to avoid the Py_BuildValue - // string parsing, or start with just using "ON" format with PyTuple_Pack(2, - // origin, target). That seems like what the N format is meant - // for. - // XXX: Why does event not automatically cast back to a PyObject? - // It tries to call the "deleted constructor ImmortalEventName - // const" instead. - assert(tracefunc); - assert(event); - assert(origin); - assert(target); - greenlet::refs::NewReference retval( - PyObject_CallFunction( - tracefunc.borrow(), - "O(OO)", - event.borrow(), - origin.borrow(), - target.borrow() - )); - if (!retval) { - throw PyErrOccurred::from_current(); - } - } -}; - - static void - g_calltrace(const OwnedObject& tracefunc, - const greenlet::refs::ImmortalEventName& event, - const greenlet::refs::BorrowedGreenlet& origin, - const BorrowedGreenlet& target); - private: - OwnedObject g_switch_finish(const switchstack_result_t& err); - - }; - - class UserGreenlet : public Greenlet - { - private: - static greenlet::PythonAllocator allocator; - OwnedMainGreenlet _main_greenlet; - OwnedObject _run_callable; - OwnedGreenlet _parent; - public: - static void* operator new(size_t UNUSED(count)); - static void operator delete(void* ptr); - - UserGreenlet(PyGreenlet* p, BorrowedGreenlet the_parent); - virtual ~UserGreenlet(); - - virtual refs::BorrowedMainGreenlet find_main_greenlet_in_lineage() const; - virtual bool was_running_in_dead_thread() const noexcept; - virtual ThreadState* thread_state() const noexcept; - virtual OwnedObject g_switch(); - virtual const OwnedObject& run() const - { - if (this->started() || !this->_run_callable) { - throw AttributeError("run"); - } - return this->_run_callable; - } - virtual void run(const refs::BorrowedObject nrun); - - virtual const OwnedGreenlet parent() const; - virtual void parent(const refs::BorrowedObject new_parent); - - virtual const refs::BorrowedMainGreenlet main_greenlet() const; - - virtual void murder_in_place(); - virtual bool belongs_to_thread(const ThreadState* state) const; - virtual int tp_traverse(visitproc visit, void* arg); - virtual int tp_clear(); - class ParentIsCurrentGuard - { - private: - OwnedGreenlet oldparent; - UserGreenlet* greenlet; - G_NO_COPIES_OF_CLS(ParentIsCurrentGuard); - public: - ParentIsCurrentGuard(UserGreenlet* p, const ThreadState& thread_state); - ~ParentIsCurrentGuard(); - }; - virtual OwnedObject throw_GreenletExit_during_dealloc(const ThreadState& current_thread_state); - protected: - virtual switchstack_result_t g_initialstub(void* mark); - private: - // This function isn't meant to return. - // This accepts raw pointers and the ownership of them at the - // same time. The caller should use ``inner_bootstrap(origin.relinquish_ownership())``. - void inner_bootstrap(PyGreenlet* origin_greenlet, PyObject* run); - }; - - class BrokenGreenlet : public UserGreenlet - { - private: - static greenlet::PythonAllocator allocator; - public: - bool _force_switch_error = false; - bool _force_slp_switch_error = false; - - static void* operator new(size_t UNUSED(count)); - static void operator delete(void* ptr); - BrokenGreenlet(PyGreenlet* p, BorrowedGreenlet the_parent) - : UserGreenlet(p, the_parent) - {} - virtual ~BrokenGreenlet() - {} - - virtual switchstack_result_t g_switchstack(void); - virtual bool force_slp_switch_error() const noexcept; - - }; - - class MainGreenlet : public Greenlet - { - private: - static greenlet::PythonAllocator allocator; - refs::BorrowedMainGreenlet _self; - ThreadState* _thread_state; - G_NO_COPIES_OF_CLS(MainGreenlet); - public: - static void* operator new(size_t UNUSED(count)); - static void operator delete(void* ptr); - - MainGreenlet(refs::BorrowedMainGreenlet::PyType*, ThreadState*); - virtual ~MainGreenlet(); - - - virtual const OwnedObject& run() const; - virtual void run(const refs::BorrowedObject nrun); - - virtual const OwnedGreenlet parent() const; - virtual void parent(const refs::BorrowedObject new_parent); - - virtual const refs::BorrowedMainGreenlet main_greenlet() const; - - virtual refs::BorrowedMainGreenlet find_main_greenlet_in_lineage() const; - virtual bool was_running_in_dead_thread() const noexcept; - virtual ThreadState* thread_state() const noexcept; - void thread_state(ThreadState*) noexcept; - virtual OwnedObject g_switch(); - virtual int tp_traverse(visitproc visit, void* arg); - }; - - // Instantiate one on the stack to save the GC state, - // and then disable GC. When it goes out of scope, GC will be - // restored to its original state. Sadly, these APIs are only - // available on 3.10+; luckily, we only need them on 3.11+. -#if GREENLET_PY310 - class GCDisabledGuard - { - private: - int was_enabled = 0; - public: - GCDisabledGuard() - : was_enabled(PyGC_IsEnabled()) - { - PyGC_Disable(); - } - - ~GCDisabledGuard() - { - if (this->was_enabled) { - PyGC_Enable(); - } - } - }; -#endif - - OwnedObject& operator<<=(OwnedObject& lhs, greenlet::SwitchingArgs& rhs) noexcept; - - //TODO: Greenlet::g_switch() should call this automatically on its - //return value. As it is, the module code is calling it. - static inline OwnedObject - single_result(const OwnedObject& results) - { - if (results - && PyTuple_Check(results.borrow()) - && PyTuple_GET_SIZE(results.borrow()) == 1) { - PyObject* result = PyTuple_GET_ITEM(results.borrow(), 0); - assert(result); - return OwnedObject::owning(result); - } - return results; - } - - - static OwnedObject - g_handle_exit(const OwnedObject& greenlet_result); - - - template - void operator<<(const PyThreadState *const lhs, T& rhs) - { - rhs.operator<<(lhs); - } - -} // namespace greenlet ; - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/TGreenletGlobals.cpp b/blog-app/venv/Lib/site-packages/greenlet/TGreenletGlobals.cpp deleted file mode 100644 index 0087d2f..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/TGreenletGlobals.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -/** - * Implementation of GreenletGlobals. - * - * Format with: - * clang-format -i --style=file src/greenlet/greenlet.c - * - * - * Fix missing braces with: - * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" -*/ -#ifndef T_GREENLET_GLOBALS -#define T_GREENLET_GLOBALS - -#include "greenlet_refs.hpp" -#include "greenlet_exceptions.hpp" -#include "greenlet_thread_support.hpp" -#include "greenlet_internal.hpp" - -namespace greenlet { - -// This encapsulates what were previously module global "constants" -// established at init time. -// This is a step towards Python3 style module state that allows -// reloading. -// -// In an earlier iteration of this code, we used placement new to be -// able to allocate this object statically still, so that references -// to its members don't incur an extra pointer indirection. -// But under some scenarios, that could result in crashes at -// shutdown because apparently the destructor was getting run twice? -class GreenletGlobals -{ - -public: - const greenlet::refs::ImmortalEventName event_switch; - const greenlet::refs::ImmortalEventName event_throw; - const greenlet::refs::ImmortalException PyExc_GreenletError; - const greenlet::refs::ImmortalException PyExc_GreenletExit; - const greenlet::refs::ImmortalObject empty_tuple; - const greenlet::refs::ImmortalObject empty_dict; - const greenlet::refs::ImmortalString str_run; - Mutex* const thread_states_to_destroy_lock; - greenlet::cleanup_queue_t thread_states_to_destroy; - - GreenletGlobals() : - event_switch("switch"), - event_throw("throw"), - PyExc_GreenletError("greenlet.error"), - PyExc_GreenletExit("greenlet.GreenletExit", PyExc_BaseException), - empty_tuple(Require(PyTuple_New(0))), - empty_dict(Require(PyDict_New())), - str_run("run"), - thread_states_to_destroy_lock(new Mutex()) - {} - - ~GreenletGlobals() - { - // This object is (currently) effectively immortal, and not - // just because of those placement new tricks; if we try to - // deallocate the static object we allocated, and overwrote, - // we would be doing so at C++ teardown time, which is after - // the final Python GIL is released, and we can't use the API - // then. - // (The members will still be destructed, but they also don't - // do any deallocation.) - } - - void queue_to_destroy(ThreadState* ts) const - { - // we're currently accessed through a static const object, - // implicitly marking our members as const, so code can't just - // call push_back (or pop_back) without casting away the - // const. - // - // Do that for callers. - greenlet::cleanup_queue_t& q = const_cast(this->thread_states_to_destroy); - q.push_back(ts); - } - - ThreadState* take_next_to_destroy() const - { - greenlet::cleanup_queue_t& q = const_cast(this->thread_states_to_destroy); - ThreadState* result = q.back(); - q.pop_back(); - return result; - } -}; - -}; // namespace greenlet - -static const greenlet::GreenletGlobals* mod_globs; - -#endif // T_GREENLET_GLOBALS diff --git a/blog-app/venv/Lib/site-packages/greenlet/TMainGreenlet.cpp b/blog-app/venv/Lib/site-packages/greenlet/TMainGreenlet.cpp deleted file mode 100644 index a2a9cfe..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/TMainGreenlet.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -/** - * Implementation of greenlet::MainGreenlet. - * - * Format with: - * clang-format -i --style=file src/greenlet/greenlet.c - * - * - * Fix missing braces with: - * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" -*/ -#ifndef T_MAIN_GREENLET_CPP -#define T_MAIN_GREENLET_CPP - -#include "TGreenlet.hpp" - - - -// Protected by the GIL. Incremented when we create a main greenlet, -// in a new thread, decremented when it is destroyed. -static Py_ssize_t G_TOTAL_MAIN_GREENLETS; - -namespace greenlet { -greenlet::PythonAllocator MainGreenlet::allocator; - -void* MainGreenlet::operator new(size_t UNUSED(count)) -{ - return allocator.allocate(1); -} - - -void MainGreenlet::operator delete(void* ptr) -{ - return allocator.deallocate(static_cast(ptr), - 1); -} - - -MainGreenlet::MainGreenlet(PyGreenlet* p, ThreadState* state) - : Greenlet(p, StackState::make_main()), - _self(p), - _thread_state(state) -{ - G_TOTAL_MAIN_GREENLETS++; -} - -MainGreenlet::~MainGreenlet() -{ - G_TOTAL_MAIN_GREENLETS--; - this->tp_clear(); -} - -ThreadState* -MainGreenlet::thread_state() const noexcept -{ - return this->_thread_state; -} - -void -MainGreenlet::thread_state(ThreadState* t) noexcept -{ - assert(!t); - this->_thread_state = t; -} - - -const BorrowedMainGreenlet -MainGreenlet::main_greenlet() const -{ - return this->_self; -} - -BorrowedMainGreenlet -MainGreenlet::find_main_greenlet_in_lineage() const -{ - return BorrowedMainGreenlet(this->_self); -} - -bool -MainGreenlet::was_running_in_dead_thread() const noexcept -{ - return !this->_thread_state; -} - -OwnedObject -MainGreenlet::g_switch() -{ - try { - this->check_switch_allowed(); - } - catch (const PyErrOccurred&) { - this->release_args(); - throw; - } - - switchstack_result_t err = this->g_switchstack(); - if (err.status < 0) { - // XXX: This code path is untested, but it is shared - // with the UserGreenlet path that is tested. - return this->on_switchstack_or_initialstub_failure( - this, - err, - true, // target was me - false // was initial stub - ); - } - - return err.the_new_current_greenlet->g_switch_finish(err); -} - -int -MainGreenlet::tp_traverse(visitproc visit, void* arg) -{ - if (this->_thread_state) { - // we've already traversed main, (self), don't do it again. - int result = this->_thread_state->tp_traverse(visit, arg, false); - if (result) { - return result; - } - } - return Greenlet::tp_traverse(visit, arg); -} - -const OwnedObject& -MainGreenlet::run() const -{ - throw AttributeError("Main greenlets do not have a run attribute."); -} - -void -MainGreenlet::run(const BorrowedObject UNUSED(nrun)) -{ - throw AttributeError("Main greenlets do not have a run attribute."); -} - -void -MainGreenlet::parent(const BorrowedObject raw_new_parent) -{ - if (!raw_new_parent) { - throw AttributeError("can't delete attribute"); - } - throw AttributeError("cannot set the parent of a main greenlet"); -} - -const OwnedGreenlet -MainGreenlet::parent() const -{ - return OwnedGreenlet(); // null becomes None -} - -}; // namespace greenlet - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/TPythonState.cpp b/blog-app/venv/Lib/site-packages/greenlet/TPythonState.cpp deleted file mode 100644 index a7f743c..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/TPythonState.cpp +++ /dev/null @@ -1,402 +0,0 @@ -#ifndef GREENLET_PYTHON_STATE_CPP -#define GREENLET_PYTHON_STATE_CPP - -#include -#include "TGreenlet.hpp" - -namespace greenlet { - -PythonState::PythonState() - : _top_frame() -#if GREENLET_USE_CFRAME - ,cframe(nullptr) - ,use_tracing(0) -#endif -#if GREENLET_PY314 - ,py_recursion_depth(0) -#elif GREENLET_PY312 - ,py_recursion_depth(0) - ,c_recursion_depth(0) -#else - ,recursion_depth(0) -#endif -#if GREENLET_PY313 - ,delete_later(nullptr) -#else - ,trash_delete_nesting(0) -#endif -#if GREENLET_PY311 - ,current_frame(nullptr) - ,datastack_chunk(nullptr) - ,datastack_top(nullptr) - ,datastack_limit(nullptr) -#endif -{ -#if GREENLET_USE_CFRAME - /* - The PyThreadState->cframe pointer usually points to memory on - the stack, alloceted in a call into PyEval_EvalFrameDefault. - - Initially, before any evaluation begins, it points to the - initial PyThreadState object's ``root_cframe`` object, which is - statically allocated for the lifetime of the thread. - - A greenlet can last for longer than a call to - PyEval_EvalFrameDefault, so we can't set its ``cframe`` pointer - to be the current ``PyThreadState->cframe``; nor could we use - one from the greenlet parent for the same reason. Yet a further - no: we can't allocate one scoped to the greenlet and then - destroy it when the greenlet is deallocated, because inside the - interpreter the _PyCFrame objects form a linked list, and that too - can result in accessing memory beyond its dynamic lifetime (if - the greenlet doesn't actually finish before it dies, its entry - could still be in the list). - - Using the ``root_cframe`` is problematic, though, because its - members are never modified by the interpreter and are set to 0, - meaning that its ``use_tracing`` flag is never updated. We don't - want to modify that value in the ``root_cframe`` ourself: it - *shouldn't* matter much because we should probably never get - back to the point where that's the only cframe on the stack; - even if it did matter, the major consequence of an incorrect - value for ``use_tracing`` is that if its true the interpreter - does some extra work --- however, it's just good code hygiene. - - Our solution: before a greenlet runs, after its initial - creation, it uses the ``root_cframe`` just to have something to - put there. However, once the greenlet is actually switched to - for the first time, ``g_initialstub`` (which doesn't actually - "return" while the greenlet is running) stores a new _PyCFrame on - its local stack, and copies the appropriate values from the - currently running _PyCFrame; this is then made the _PyCFrame for the - newly-minted greenlet. ``g_initialstub`` then proceeds to call - ``glet.run()``, which results in ``PyEval_...`` adding the - _PyCFrame to the list. Switches continue as normal. Finally, when - the greenlet finishes, the call to ``glet.run()`` returns and - the _PyCFrame is taken out of the linked list and the stack value - is now unused and free to expire. - - XXX: I think we can do better. If we're deallocing in the same - thread, can't we traverse the list and unlink our frame? - Can we just keep a reference to the thread state in case we - dealloc in another thread? (Is that even possible if we're still - running and haven't returned from g_initialstub?) - */ - this->cframe = &PyThreadState_GET()->root_cframe; -#endif -} - - -inline void PythonState::may_switch_away() noexcept -{ -#if GREENLET_PY311 - // PyThreadState_GetFrame is probably going to have to allocate a - // new frame object. That may trigger garbage collection. Because - // we call this during the early phases of a switch (it doesn't - // matter to which greenlet, as this has a global effect), if a GC - // triggers a switch away, two things can happen, both bad: - // - We might not get switched back to, halting forward progress. - // this is pathological, but possible. - // - We might get switched back to with a different set of - // arguments or a throw instead of a switch. That would corrupt - // our state (specifically, PyErr_Occurred() and this->args() - // would no longer agree). - // - // Thus, when we call this API, we need to have GC disabled. - // This method serves as a bottleneck we call when maybe beginning - // a switch. In this way, it is always safe -- no risk of GC -- to - // use ``_GetFrame()`` whenever we need to, just as it was in - // <=3.10 (because subsequent calls will be cached and not - // allocate memory). - - GCDisabledGuard no_gc; - Py_XDECREF(PyThreadState_GetFrame(PyThreadState_GET())); -#endif -} - -void PythonState::operator<<(const PyThreadState *const tstate) noexcept -{ - this->_context.steal(tstate->context); -#if GREENLET_USE_CFRAME - /* - IMPORTANT: ``cframe`` is a pointer into the STACK. Thus, because - the call to ``slp_switch()`` changes the contents of the stack, - you cannot read from ``ts_current->cframe`` after that call and - necessarily get the same values you get from reading it here. - Anything you need to restore from now to then must be saved in a - global/threadlocal variable (because we can't use stack - variables here either). For things that need to persist across - the switch, use `will_switch_from`. - */ - this->cframe = tstate->cframe; - #if !GREENLET_PY312 - this->use_tracing = tstate->cframe->use_tracing; - #endif -#endif // GREENLET_USE_CFRAME -#if GREENLET_PY311 - #if GREENLET_PY314 - this->py_recursion_depth = tstate->py_recursion_limit - tstate->py_recursion_remaining; - #elif GREENLET_PY312 - this->py_recursion_depth = tstate->py_recursion_limit - tstate->py_recursion_remaining; - this->c_recursion_depth = Py_C_RECURSION_LIMIT - tstate->c_recursion_remaining; - #else // not 312 - this->recursion_depth = tstate->recursion_limit - tstate->recursion_remaining; - #endif // GREENLET_PY312 - #if GREENLET_PY313 - this->current_frame = tstate->current_frame; - #elif GREENLET_USE_CFRAME - this->current_frame = tstate->cframe->current_frame; - #endif - this->datastack_chunk = tstate->datastack_chunk; - this->datastack_top = tstate->datastack_top; - this->datastack_limit = tstate->datastack_limit; - - PyFrameObject *frame = PyThreadState_GetFrame((PyThreadState *)tstate); - Py_XDECREF(frame); // PyThreadState_GetFrame gives us a new - // reference. - this->_top_frame.steal(frame); - #if GREENLET_PY313 - this->delete_later = Py_XNewRef(tstate->delete_later); - #elif GREENLET_PY312 - this->trash_delete_nesting = tstate->trash.delete_nesting; - #else // not 312 - this->trash_delete_nesting = tstate->trash_delete_nesting; - #endif // GREENLET_PY312 -#else // Not 311 - this->recursion_depth = tstate->recursion_depth; - this->_top_frame.steal(tstate->frame); - this->trash_delete_nesting = tstate->trash_delete_nesting; -#endif // GREENLET_PY311 -} - -#if GREENLET_PY312 -void GREENLET_NOINLINE(PythonState::unexpose_frames)() -{ - if (!this->top_frame()) { - return; - } - - // See GreenletState::expose_frames() and the comment on frames_were_exposed - // for more information about this logic. - _PyInterpreterFrame *iframe = this->_top_frame->f_frame; - while (iframe != nullptr) { - _PyInterpreterFrame *prev_exposed = iframe->previous; - assert(iframe->frame_obj); - memcpy(&iframe->previous, &iframe->frame_obj->_f_frame_data[0], - sizeof(void *)); - iframe = prev_exposed; - } -} -#else -void PythonState::unexpose_frames() -{} -#endif - -void PythonState::operator>>(PyThreadState *const tstate) noexcept -{ - tstate->context = this->_context.relinquish_ownership(); - /* Incrementing this value invalidates the contextvars cache, - which would otherwise remain valid across switches */ - tstate->context_ver++; -#if GREENLET_USE_CFRAME - tstate->cframe = this->cframe; - /* - If we were tracing, we need to keep tracing. - There should never be the possibility of hitting the - root_cframe here. See note above about why we can't - just copy this from ``origin->cframe->use_tracing``. - */ - #if !GREENLET_PY312 - tstate->cframe->use_tracing = this->use_tracing; - #endif -#endif // GREENLET_USE_CFRAME -#if GREENLET_PY311 - #if GREENLET_PY314 - tstate->py_recursion_remaining = tstate->py_recursion_limit - this->py_recursion_depth; - this->unexpose_frames(); - #elif GREENLET_PY312 - tstate->py_recursion_remaining = tstate->py_recursion_limit - this->py_recursion_depth; - tstate->c_recursion_remaining = Py_C_RECURSION_LIMIT - this->c_recursion_depth; - this->unexpose_frames(); - #else // \/ 3.11 - tstate->recursion_remaining = tstate->recursion_limit - this->recursion_depth; - #endif // GREENLET_PY312 - #if GREENLET_PY313 - tstate->current_frame = this->current_frame; - #elif GREENLET_USE_CFRAME - tstate->cframe->current_frame = this->current_frame; - #endif - tstate->datastack_chunk = this->datastack_chunk; - tstate->datastack_top = this->datastack_top; - tstate->datastack_limit = this->datastack_limit; - this->_top_frame.relinquish_ownership(); - #if GREENLET_PY313 - Py_XDECREF(tstate->delete_later); - tstate->delete_later = this->delete_later; - Py_CLEAR(this->delete_later); - #elif GREENLET_PY312 - tstate->trash.delete_nesting = this->trash_delete_nesting; - #else // not 3.12 - tstate->trash_delete_nesting = this->trash_delete_nesting; - #endif // GREENLET_PY312 -#else // not 3.11 - tstate->frame = this->_top_frame.relinquish_ownership(); - tstate->recursion_depth = this->recursion_depth; - tstate->trash_delete_nesting = this->trash_delete_nesting; -#endif // GREENLET_PY311 -} - -inline void PythonState::will_switch_from(PyThreadState *const origin_tstate) noexcept -{ -#if GREENLET_USE_CFRAME && !GREENLET_PY312 - // The weird thing is, we don't actually save this for an - // effect on the current greenlet, it's saved for an - // effect on the target greenlet. That is, we want - // continuity of this setting across the greenlet switch. - this->use_tracing = origin_tstate->cframe->use_tracing; -#endif -} - -void PythonState::set_initial_state(const PyThreadState* const tstate) noexcept -{ - this->_top_frame = nullptr; -#if GREENLET_PY314 - this->py_recursion_depth = tstate->py_recursion_limit - tstate->py_recursion_remaining; -#elif GREENLET_PY312 - this->py_recursion_depth = tstate->py_recursion_limit - tstate->py_recursion_remaining; - // XXX: TODO: Comment from a reviewer: - // Should this be ``Py_C_RECURSION_LIMIT - tstate->c_recursion_remaining``? - // But to me it looks more like that might not be the right - // initialization either? - this->c_recursion_depth = tstate->py_recursion_limit - tstate->py_recursion_remaining; -#elif GREENLET_PY311 - this->recursion_depth = tstate->recursion_limit - tstate->recursion_remaining; -#else - this->recursion_depth = tstate->recursion_depth; -#endif -} -// TODO: Better state management about when we own the top frame. -int PythonState::tp_traverse(visitproc visit, void* arg, bool own_top_frame) noexcept -{ - Py_VISIT(this->_context.borrow()); - if (own_top_frame) { - Py_VISIT(this->_top_frame.borrow()); - } - return 0; -} - -void PythonState::tp_clear(bool own_top_frame) noexcept -{ - PythonStateContext::tp_clear(); - // If we get here owning a frame, - // we got dealloc'd without being finished. We may or may not be - // in the same thread. - if (own_top_frame) { - this->_top_frame.CLEAR(); - } -} - -#if GREENLET_USE_CFRAME -void PythonState::set_new_cframe(_PyCFrame& frame) noexcept -{ - frame = *PyThreadState_GET()->cframe; - /* Make the target greenlet refer to the stack value. */ - this->cframe = &frame; - /* - And restore the link to the previous frame so this one gets - unliked appropriately. - */ - this->cframe->previous = &PyThreadState_GET()->root_cframe; -} -#endif - -const PythonState::OwnedFrame& PythonState::top_frame() const noexcept -{ - return this->_top_frame; -} - -void PythonState::did_finish(PyThreadState* tstate) noexcept -{ -#if GREENLET_PY311 - // See https://github.com/gevent/gevent/issues/1924 and - // https://github.com/python-greenlet/greenlet/issues/328. In - // short, Python 3.11 allocates memory for frames as a sort of - // linked list that's kept as part of PyThreadState in the - // ``datastack_chunk`` member and friends. These are saved and - // restored as part of switching greenlets. - // - // When we initially switch to a greenlet, we set those to NULL. - // That causes the frame management code to treat this like a - // brand new thread and start a fresh list of chunks, beginning - // with a new "root" chunk. As we make calls in this greenlet, - // those chunks get added, and as calls return, they get popped. - // But the frame code (pystate.c) is careful to make sure that the - // root chunk never gets popped. - // - // Thus, when a greenlet exits for the last time, there will be at - // least a single root chunk that we must be responsible for - // deallocating. - // - // The complex part is that these chunks are allocated and freed - // using ``_PyObject_VirtualAlloc``/``Free``. Those aren't public - // functions, and they aren't exported for linking. It so happens - // that we know they are just thin wrappers around the Arena - // allocator, so we can use that directly to deallocate in a - // compatible way. - // - // CAUTION: Check this implementation detail on every major version. - // - // It might be nice to be able to do this in our destructor, but - // can we be sure that no one else is using that memory? Plus, as - // described below, our pointers may not even be valid anymore. As - // a special case, there is one time that we know we can do this, - // and that's from the destructor of the associated UserGreenlet - // (NOT main greenlet) - PyObjectArenaAllocator alloc; - _PyStackChunk* chunk = nullptr; - if (tstate) { - // We really did finish, we can never be switched to again. - chunk = tstate->datastack_chunk; - // Unfortunately, we can't do much sanity checking. Our - // this->datastack_chunk pointer is out of date (evaluation may - // have popped down through it already) so we can't verify that - // we deallocate it. I don't think we can even check datastack_top - // for the same reason. - - PyObject_GetArenaAllocator(&alloc); - tstate->datastack_chunk = nullptr; - tstate->datastack_limit = nullptr; - tstate->datastack_top = nullptr; - - } - else if (this->datastack_chunk) { - // The UserGreenlet (NOT the main greenlet!) is being deallocated. If we're - // still holding a stack chunk, it's garbage because we know - // we can never switch back to let cPython clean it up. - // Because the last time we got switched away from, and we - // haven't run since then, we know our chain is valid and can - // be dealloced. - chunk = this->datastack_chunk; - PyObject_GetArenaAllocator(&alloc); - } - - if (alloc.free && chunk) { - // In case the arena mechanism has been torn down already. - while (chunk) { - _PyStackChunk *prev = chunk->previous; - chunk->previous = nullptr; - alloc.free(alloc.ctx, chunk, chunk->size); - chunk = prev; - } - } - - this->datastack_chunk = nullptr; - this->datastack_limit = nullptr; - this->datastack_top = nullptr; -#endif -} - - -}; // namespace greenlet - -#endif // GREENLET_PYTHON_STATE_CPP diff --git a/blog-app/venv/Lib/site-packages/greenlet/TStackState.cpp b/blog-app/venv/Lib/site-packages/greenlet/TStackState.cpp deleted file mode 100644 index 9743ab5..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/TStackState.cpp +++ /dev/null @@ -1,265 +0,0 @@ -#ifndef GREENLET_STACK_STATE_CPP -#define GREENLET_STACK_STATE_CPP - -#include "TGreenlet.hpp" - -namespace greenlet { - -#ifdef GREENLET_USE_STDIO -#include -using std::cerr; -using std::endl; - -std::ostream& operator<<(std::ostream& os, const StackState& s) -{ - os << "StackState(stack_start=" << (void*)s._stack_start - << ", stack_stop=" << (void*)s.stack_stop - << ", stack_copy=" << (void*)s.stack_copy - << ", stack_saved=" << s._stack_saved - << ", stack_prev=" << s.stack_prev - << ", addr=" << &s - << ")"; - return os; -} -#endif - -StackState::StackState(void* mark, StackState& current) - : _stack_start(nullptr), - stack_stop((char*)mark), - stack_copy(nullptr), - _stack_saved(0), - /* Skip a dying greenlet */ - stack_prev(current._stack_start - ? ¤t - : current.stack_prev) -{ -} - -StackState::StackState() - : _stack_start(nullptr), - stack_stop(nullptr), - stack_copy(nullptr), - _stack_saved(0), - stack_prev(nullptr) -{ -} - -StackState::StackState(const StackState& other) -// can't use a delegating constructor because of -// MSVC for Python 2.7 - : _stack_start(nullptr), - stack_stop(nullptr), - stack_copy(nullptr), - _stack_saved(0), - stack_prev(nullptr) -{ - this->operator=(other); -} - -StackState& StackState::operator=(const StackState& other) -{ - if (&other == this) { - return *this; - } - if (other._stack_saved) { - throw std::runtime_error("Refusing to steal memory."); - } - - //If we have memory allocated, dispose of it - this->free_stack_copy(); - - this->_stack_start = other._stack_start; - this->stack_stop = other.stack_stop; - this->stack_copy = other.stack_copy; - this->_stack_saved = other._stack_saved; - this->stack_prev = other.stack_prev; - return *this; -} - -inline void StackState::free_stack_copy() noexcept -{ - PyMem_Free(this->stack_copy); - this->stack_copy = nullptr; - this->_stack_saved = 0; -} - -inline void StackState::copy_heap_to_stack(const StackState& current) noexcept -{ - - /* Restore the heap copy back into the C stack */ - if (this->_stack_saved != 0) { - memcpy(this->_stack_start, this->stack_copy, this->_stack_saved); - this->free_stack_copy(); - } - StackState* owner = const_cast(¤t); - if (!owner->_stack_start) { - owner = owner->stack_prev; /* greenlet is dying, skip it */ - } - while (owner && owner->stack_stop <= this->stack_stop) { - // cerr << "\tOwner: " << owner << endl; - owner = owner->stack_prev; /* find greenlet with more stack */ - } - this->stack_prev = owner; - // cerr << "\tFinished with: " << *this << endl; -} - -inline int StackState::copy_stack_to_heap_up_to(const char* const stop) noexcept -{ - /* Save more of g's stack into the heap -- at least up to 'stop' - g->stack_stop |________| - | | - | __ stop . . . . . - | | ==> . . - |________| _______ - | | | | - | | | | - g->stack_start | | |_______| g->stack_copy - */ - intptr_t sz1 = this->_stack_saved; - intptr_t sz2 = stop - this->_stack_start; - assert(this->_stack_start); - if (sz2 > sz1) { - char* c = (char*)PyMem_Realloc(this->stack_copy, sz2); - if (!c) { - PyErr_NoMemory(); - return -1; - } - memcpy(c + sz1, this->_stack_start + sz1, sz2 - sz1); - this->stack_copy = c; - this->_stack_saved = sz2; - } - return 0; -} - -inline int StackState::copy_stack_to_heap(char* const stackref, - const StackState& current) noexcept -{ - /* must free all the C stack up to target_stop */ - const char* const target_stop = this->stack_stop; - - StackState* owner = const_cast(¤t); - assert(owner->_stack_saved == 0); // everything is present on the stack - if (!owner->_stack_start) { - owner = owner->stack_prev; /* not saved if dying */ - } - else { - owner->_stack_start = stackref; - } - - while (owner->stack_stop < target_stop) { - /* ts_current is entierely within the area to free */ - if (owner->copy_stack_to_heap_up_to(owner->stack_stop)) { - return -1; /* XXX */ - } - owner = owner->stack_prev; - } - if (owner != this) { - if (owner->copy_stack_to_heap_up_to(target_stop)) { - return -1; /* XXX */ - } - } - return 0; -} - -inline bool StackState::started() const noexcept -{ - return this->stack_stop != nullptr; -} - -inline bool StackState::main() const noexcept -{ - return this->stack_stop == (char*)-1; -} - -inline bool StackState::active() const noexcept -{ - return this->_stack_start != nullptr; -} - -inline void StackState::set_active() noexcept -{ - assert(this->_stack_start == nullptr); - this->_stack_start = (char*)1; -} - -inline void StackState::set_inactive() noexcept -{ - this->_stack_start = nullptr; - // XXX: What if we still have memory out there? - // That case is actually triggered by - // test_issue251_issue252_explicit_reference_not_collectable (greenlet.tests.test_leaks.TestLeaks) - // and - // test_issue251_issue252_need_to_collect_in_background - // (greenlet.tests.test_leaks.TestLeaks) - // - // Those objects never get deallocated, so the destructor never - // runs. - // It *seems* safe to clean up the memory here? - if (this->_stack_saved) { - this->free_stack_copy(); - } -} - -inline intptr_t StackState::stack_saved() const noexcept -{ - return this->_stack_saved; -} - -inline char* StackState::stack_start() const noexcept -{ - return this->_stack_start; -} - - -inline StackState StackState::make_main() noexcept -{ - StackState s; - s._stack_start = (char*)1; - s.stack_stop = (char*)-1; - return s; -} - -StackState::~StackState() -{ - if (this->_stack_saved != 0) { - this->free_stack_copy(); - } -} - -void StackState::copy_from_stack(void* vdest, const void* vsrc, size_t n) const -{ - char* dest = static_cast(vdest); - const char* src = static_cast(vsrc); - if (src + n <= this->_stack_start - || src >= this->_stack_start + this->_stack_saved - || this->_stack_saved == 0) { - // Nothing we're copying was spilled from the stack - memcpy(dest, src, n); - return; - } - - if (src < this->_stack_start) { - // Copy the part before the saved stack. - // We know src + n > _stack_start due to the test above. - const size_t nbefore = this->_stack_start - src; - memcpy(dest, src, nbefore); - dest += nbefore; - src += nbefore; - n -= nbefore; - } - // We know src >= _stack_start after the before-copy, and - // src < _stack_start + _stack_saved due to the first if condition - size_t nspilled = std::min(n, this->_stack_start + this->_stack_saved - src); - memcpy(dest, this->stack_copy + (src - this->_stack_start), nspilled); - dest += nspilled; - src += nspilled; - n -= nspilled; - if (n > 0) { - // Copy the part after the saved stack - memcpy(dest, src, n); - } -} - -}; // namespace greenlet - -#endif // GREENLET_STACK_STATE_CPP diff --git a/blog-app/venv/Lib/site-packages/greenlet/TThreadState.hpp b/blog-app/venv/Lib/site-packages/greenlet/TThreadState.hpp deleted file mode 100644 index e4e6f6c..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/TThreadState.hpp +++ /dev/null @@ -1,497 +0,0 @@ -#ifndef GREENLET_THREAD_STATE_HPP -#define GREENLET_THREAD_STATE_HPP - -#include -#include - -#include "greenlet_internal.hpp" -#include "greenlet_refs.hpp" -#include "greenlet_thread_support.hpp" - -using greenlet::refs::BorrowedObject; -using greenlet::refs::BorrowedGreenlet; -using greenlet::refs::BorrowedMainGreenlet; -using greenlet::refs::OwnedMainGreenlet; -using greenlet::refs::OwnedObject; -using greenlet::refs::OwnedGreenlet; -using greenlet::refs::OwnedList; -using greenlet::refs::PyErrFetchParam; -using greenlet::refs::PyArgParseParam; -using greenlet::refs::ImmortalString; -using greenlet::refs::CreatedModule; -using greenlet::refs::PyErrPieces; -using greenlet::refs::NewReference; - -namespace greenlet { -/** - * Thread-local state of greenlets. - * - * Each native thread will get exactly one of these objects, - * automatically accessed through the best available thread-local - * mechanism the compiler supports (``thread_local`` for C++11 - * compilers or ``__thread``/``declspec(thread)`` for older GCC/clang - * or MSVC, respectively.) - * - * Previously, we kept thread-local state mostly in a bunch of - * ``static volatile`` variables in the main greenlet file.. This had - * the problem of requiring extra checks, loops, and great care - * accessing these variables if we potentially invoked any Python code - * that could release the GIL, because the state could change out from - * under us. Making the variables thread-local solves this problem. - * - * When we detected that a greenlet API accessing the current greenlet - * was invoked from a different thread than the greenlet belonged to, - * we stored a reference to the greenlet in the Python thread - * dictionary for the thread the greenlet belonged to. This could lead - * to memory leaks if the thread then exited (because of a reference - * cycle, as greenlets referred to the thread dictionary, and deleting - * non-current greenlets leaked their frame plus perhaps arguments on - * the C stack). If a thread exited while still having running - * greenlet objects (perhaps that had just switched back to the main - * greenlet), and did not invoke one of the greenlet APIs *in that - * thread, immediately before it exited, without some other thread - * then being invoked*, such a leak was guaranteed. - * - * This can be partly solved by using compiler thread-local variables - * instead of the Python thread dictionary, thus avoiding a cycle. - * - * To fully solve this problem, we need a reliable way to know that a - * thread is done and we should clean up the main greenlet. On POSIX, - * we can use the destructor function of ``pthread_key_create``, but - * there's nothing similar on Windows; a C++11 thread local object - * reliably invokes its destructor when the thread it belongs to exits - * (non-C++11 compilers offer ``__thread`` or ``declspec(thread)`` to - * create thread-local variables, but they can't hold C++ objects that - * invoke destructors; the C++11 version is the most portable solution - * I found). When the thread exits, we can drop references and - * otherwise manipulate greenlets and frames that we know can no - * longer be switched to. For compilers that don't support C++11 - * thread locals, we have a solution that uses the python thread - * dictionary, though it may not collect everything as promptly as - * other compilers do, if some other library is using the thread - * dictionary and has a cycle or extra reference. - * - * There are two small wrinkles. The first is that when the thread - * exits, it is too late to actually invoke Python APIs: the Python - * thread state is gone, and the GIL is released. To solve *this* - * problem, our destructor uses ``Py_AddPendingCall`` to transfer the - * destruction work to the main thread. (This is not an issue for the - * dictionary solution.) - * - * The second is that once the thread exits, the thread local object - * is invalid and we can't even access a pointer to it, so we can't - * pass it to ``Py_AddPendingCall``. This is handled by actually using - * a second object that's thread local (ThreadStateCreator) and having - * it dynamically allocate this object so it can live until the - * pending call runs. - */ - - - -class ThreadState { -private: - // As of commit 08ad1dd7012b101db953f492e0021fb08634afad - // this class needed 56 bytes in o Py_DEBUG build - // on 64-bit macOS 11. - // Adding the vector takes us up to 80 bytes () - - /* Strong reference to the main greenlet */ - OwnedMainGreenlet main_greenlet; - - /* Strong reference to the current greenlet. */ - OwnedGreenlet current_greenlet; - - /* Strong reference to the trace function, if any. */ - OwnedObject tracefunc; - - typedef std::vector > deleteme_t; - /* A vector of raw PyGreenlet pointers representing things that need - deleted when this thread is running. The vector owns the - references, but you need to manually INCREF/DECREF as you use - them. We don't use a vector because we - make copy of this vector, and that would become O(n) as all the - refcounts are incremented in the copy. - */ - deleteme_t deleteme; - -#ifdef GREENLET_NEEDS_EXCEPTION_STATE_SAVED - void* exception_state; -#endif - - static std::clock_t _clocks_used_doing_gc; - static ImmortalString get_referrers_name; - static PythonAllocator allocator; - - G_NO_COPIES_OF_CLS(ThreadState); - - - // Allocates a main greenlet for the thread state. If this fails, - // exits the process. Called only during constructing a ThreadState. - MainGreenlet* alloc_main() - { - PyGreenlet* gmain; - - /* create the main greenlet for this thread */ - gmain = reinterpret_cast(PyType_GenericAlloc(&PyGreenlet_Type, 0)); - if (gmain == NULL) { - throw PyFatalError("alloc_main failed to alloc"); //exits the process - } - - MainGreenlet* const main = new MainGreenlet(gmain, this); - - assert(Py_REFCNT(gmain) == 1); - assert(gmain->pimpl == main); - return main; - } - - -public: - static void* operator new(size_t UNUSED(count)) - { - return ThreadState::allocator.allocate(1); - } - - static void operator delete(void* ptr) - { - return ThreadState::allocator.deallocate(static_cast(ptr), - 1); - } - - static void init() - { - ThreadState::get_referrers_name = "get_referrers"; - ThreadState::_clocks_used_doing_gc = 0; - } - - ThreadState() - { - -#ifdef GREENLET_NEEDS_EXCEPTION_STATE_SAVED - this->exception_state = slp_get_exception_state(); -#endif - - // XXX: Potentially dangerous, exposing a not fully - // constructed object. - MainGreenlet* const main = this->alloc_main(); - this->main_greenlet = OwnedMainGreenlet::consuming( - main->self() - ); - assert(this->main_greenlet); - this->current_greenlet = main->self(); - // The main greenlet starts with 1 refs: The returned one. We - // then copied it to the current greenlet. - assert(this->main_greenlet.REFCNT() == 2); - } - - inline void restore_exception_state() - { -#ifdef GREENLET_NEEDS_EXCEPTION_STATE_SAVED - // It's probably important this be inlined and only call C - // functions to avoid adding an SEH frame. - slp_set_exception_state(this->exception_state); -#endif - } - - inline bool has_main_greenlet() const noexcept - { - return bool(this->main_greenlet); - } - - // Called from the ThreadStateCreator when we're in non-standard - // threading mode. In that case, there is an object in the Python - // thread state dictionary that points to us. The main greenlet - // also traverses into us, in which case it's crucial not to - // traverse back into the main greenlet. - int tp_traverse(visitproc visit, void* arg, bool traverse_main=true) - { - if (traverse_main) { - Py_VISIT(main_greenlet.borrow_o()); - } - if (traverse_main || current_greenlet != main_greenlet) { - Py_VISIT(current_greenlet.borrow_o()); - } - Py_VISIT(tracefunc.borrow()); - return 0; - } - - inline BorrowedMainGreenlet borrow_main_greenlet() const noexcept - { - assert(this->main_greenlet); - assert(this->main_greenlet.REFCNT() >= 2); - return this->main_greenlet; - }; - - inline OwnedMainGreenlet get_main_greenlet() const noexcept - { - return this->main_greenlet; - } - - /** - * In addition to returning a new reference to the currunt - * greenlet, this performs any maintenance needed. - */ - inline OwnedGreenlet get_current() - { - /* green_dealloc() cannot delete greenlets from other threads, so - it stores them in the thread dict; delete them now. */ - this->clear_deleteme_list(); - //assert(this->current_greenlet->main_greenlet == this->main_greenlet); - //assert(this->main_greenlet->main_greenlet == this->main_greenlet); - return this->current_greenlet; - } - - /** - * As for non-const get_current(); - */ - inline BorrowedGreenlet borrow_current() - { - this->clear_deleteme_list(); - return this->current_greenlet; - } - - /** - * Does no maintenance. - */ - inline OwnedGreenlet get_current() const - { - return this->current_greenlet; - } - - template - inline bool is_current(const refs::PyObjectPointer& obj) const - { - return this->current_greenlet.borrow_o() == obj.borrow_o(); - } - - inline void set_current(const OwnedGreenlet& target) - { - this->current_greenlet = target; - } - -private: - /** - * Deref and remove the greenlets from the deleteme list. Must be - * holding the GIL. - * - * If *murder* is true, then we must be called from a different - * thread than the one that these greenlets were running in. - * In that case, if the greenlet was actually running, we destroy - * the frame reference and otherwise make it appear dead before - * proceeding; otherwise, we would try (and fail) to raise an - * exception in it and wind up right back in this list. - */ - inline void clear_deleteme_list(const bool murder=false) - { - if (!this->deleteme.empty()) { - // It's possible we could add items to this list while - // running Python code if there's a thread switch, so we - // need to defensively copy it before that can happen. - deleteme_t copy = this->deleteme; - this->deleteme.clear(); // in case things come back on the list - for(deleteme_t::iterator it = copy.begin(), end = copy.end(); - it != end; - ++it ) { - PyGreenlet* to_del = *it; - if (murder) { - // Force each greenlet to appear dead; we can't raise an - // exception into it anymore anyway. - to_del->pimpl->murder_in_place(); - } - - // The only reference to these greenlets should be in - // this list, decreffing them should let them be - // deleted again, triggering calls to green_dealloc() - // in the correct thread (if we're not murdering). - // This may run arbitrary Python code and switch - // threads or greenlets! - Py_DECREF(to_del); - if (PyErr_Occurred()) { - PyErr_WriteUnraisable(nullptr); - PyErr_Clear(); - } - } - } - } - -public: - - /** - * Returns a new reference, or a false object. - */ - inline OwnedObject get_tracefunc() const - { - return tracefunc; - }; - - - inline void set_tracefunc(BorrowedObject tracefunc) - { - assert(tracefunc); - if (tracefunc == BorrowedObject(Py_None)) { - this->tracefunc.CLEAR(); - } - else { - this->tracefunc = tracefunc; - } - } - - /** - * Given a reference to a greenlet that some other thread - * attempted to delete (has a refcount of 0) store it for later - * deletion when the thread this state belongs to is current. - */ - inline void delete_when_thread_running(PyGreenlet* to_del) - { - Py_INCREF(to_del); - this->deleteme.push_back(to_del); - } - - /** - * Set to std::clock_t(-1) to disable. - */ - inline static std::clock_t& clocks_used_doing_gc() - { - return ThreadState::_clocks_used_doing_gc; - } - - ~ThreadState() - { - if (!PyInterpreterState_Head()) { - // We shouldn't get here (our callers protect us) - // but if we do, all we can do is bail early. - return; - } - - // We should not have an "origin" greenlet; that only exists - // for the temporary time during a switch, which should not - // be in progress as the thread dies. - //assert(!this->switching_state.origin); - - this->tracefunc.CLEAR(); - - // Forcibly GC as much as we can. - this->clear_deleteme_list(true); - - // The pending call did this. - assert(this->main_greenlet->thread_state() == nullptr); - - // If the main greenlet is the current greenlet, - // then we "fell off the end" and the thread died. - // It's possible that there is some other greenlet that - // switched to us, leaving a reference to the main greenlet - // on the stack, somewhere uncollectible. Try to detect that. - if (this->current_greenlet == this->main_greenlet && this->current_greenlet) { - assert(this->current_greenlet->is_currently_running_in_some_thread()); - // Drop one reference we hold. - this->current_greenlet.CLEAR(); - assert(!this->current_greenlet); - // Only our reference to the main greenlet should be left, - // But hold onto the pointer in case we need to do extra cleanup. - PyGreenlet* old_main_greenlet = this->main_greenlet.borrow(); - Py_ssize_t cnt = this->main_greenlet.REFCNT(); - this->main_greenlet.CLEAR(); - if (ThreadState::_clocks_used_doing_gc != std::clock_t(-1) - && cnt == 2 && Py_REFCNT(old_main_greenlet) == 1) { - // Highly likely that the reference is somewhere on - // the stack, not reachable by GC. Verify. - // XXX: This is O(n) in the total number of objects. - // TODO: Add a way to disable this at runtime, and - // another way to report on it. - std::clock_t begin = std::clock(); - NewReference gc(PyImport_ImportModule("gc")); - if (gc) { - OwnedObject get_referrers = gc.PyRequireAttr(ThreadState::get_referrers_name); - OwnedList refs(get_referrers.PyCall(old_main_greenlet)); - if (refs && refs.empty()) { - assert(refs.REFCNT() == 1); - // We found nothing! So we left a dangling - // reference: Probably the last thing some - // other greenlet did was call - // 'getcurrent().parent.switch()' to switch - // back to us. Clean it up. This will be the - // case on CPython 3.7 and newer, as they use - // an internal calling conversion that avoids - // creating method objects and storing them on - // the stack. - Py_DECREF(old_main_greenlet); - } - else if (refs - && refs.size() == 1 - && PyCFunction_Check(refs.at(0)) - && Py_REFCNT(refs.at(0)) == 2) { - assert(refs.REFCNT() == 1); - // Ok, we found a C method that refers to the - // main greenlet, and its only referenced - // twice, once in the list we just created, - // once from...somewhere else. If we can't - // find where else, then this is a leak. - // This happens in older versions of CPython - // that create a bound method object somewhere - // on the stack that we'll never get back to. - if (PyCFunction_GetFunction(refs.at(0).borrow()) == (PyCFunction)green_switch) { - BorrowedObject function_w = refs.at(0); - refs.clear(); // destroy the reference - // from the list. - // back to one reference. Can *it* be - // found? - assert(function_w.REFCNT() == 1); - refs = get_referrers.PyCall(function_w); - if (refs && refs.empty()) { - // Nope, it can't be found so it won't - // ever be GC'd. Drop it. - Py_CLEAR(function_w); - } - } - } - std::clock_t end = std::clock(); - ThreadState::_clocks_used_doing_gc += (end - begin); - } - } - } - - // We need to make sure this greenlet appears to be dead, - // because otherwise deallocing it would fail to raise an - // exception in it (the thread is dead) and put it back in our - // deleteme list. - if (this->current_greenlet) { - this->current_greenlet->murder_in_place(); - this->current_greenlet.CLEAR(); - } - - if (this->main_greenlet) { - // Couldn't have been the main greenlet that was running - // when the thread exited (because we already cleared this - // pointer if it was). This shouldn't be possible? - - // If the main greenlet was current when the thread died (it - // should be, right?) then we cleared its self pointer above - // when we cleared the current greenlet's main greenlet pointer. - // assert(this->main_greenlet->main_greenlet == this->main_greenlet - // || !this->main_greenlet->main_greenlet); - // // self reference, probably gone - // this->main_greenlet->main_greenlet.CLEAR(); - - // This will actually go away when the ivar is destructed. - this->main_greenlet.CLEAR(); - } - - if (PyErr_Occurred()) { - PyErr_WriteUnraisable(NULL); - PyErr_Clear(); - } - - } - -}; - -ImmortalString ThreadState::get_referrers_name(nullptr); -PythonAllocator ThreadState::allocator; -std::clock_t ThreadState::_clocks_used_doing_gc(0); - - - - - -}; // namespace greenlet - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/TThreadStateCreator.hpp b/blog-app/venv/Lib/site-packages/greenlet/TThreadStateCreator.hpp deleted file mode 100644 index 2ec7ab5..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/TThreadStateCreator.hpp +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef GREENLET_THREAD_STATE_CREATOR_HPP -#define GREENLET_THREAD_STATE_CREATOR_HPP - -#include -#include - -#include "greenlet_internal.hpp" -#include "greenlet_refs.hpp" -#include "greenlet_thread_support.hpp" - -#include "TThreadState.hpp" - -namespace greenlet { - - -typedef void (*ThreadStateDestructor)(ThreadState* const); - -template -class ThreadStateCreator -{ -private: - // Initialized to 1, and, if still 1, created on access. - // Set to 0 on destruction. - ThreadState* _state; - G_NO_COPIES_OF_CLS(ThreadStateCreator); - - inline bool has_initialized_state() const noexcept - { - return this->_state != (ThreadState*)1; - } - - inline bool has_state() const noexcept - { - return this->has_initialized_state() && this->_state != nullptr; - } - -public: - - // Only one of these, auto created per thread. - // Constructing the state constructs the MainGreenlet. - ThreadStateCreator() : - _state((ThreadState*)1) - { - } - - ~ThreadStateCreator() - { - if (this->has_state()) { - Destructor(this->_state); - } - - this->_state = nullptr; - } - - inline ThreadState& state() - { - // The main greenlet will own this pointer when it is created, - // which will be right after this. The plan is to give every - // greenlet a pointer to the main greenlet for the thread it - // runs in; if we are doing something cross-thread, we need to - // access the pointer from the main greenlet. Deleting the - // thread, and hence the thread-local storage, will delete the - // state pointer in the main greenlet. - if (!this->has_initialized_state()) { - // XXX: Assuming allocation never fails - this->_state = new ThreadState; - // For non-standard threading, we need to store an object - // in the Python thread state dictionary so that it can be - // DECREF'd when the thread ends (ideally; the dict could - // last longer) and clean this object up. - } - if (!this->_state) { - throw std::runtime_error("Accessing state after destruction."); - } - return *this->_state; - } - - operator ThreadState&() - { - return this->state(); - } - - operator ThreadState*() - { - return &this->state(); - } - - inline int tp_traverse(visitproc visit, void* arg) - { - if (this->has_state()) { - return this->_state->tp_traverse(visit, arg); - } - return 0; - } - -}; - - - -}; // namespace greenlet - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/TThreadStateDestroy.cpp b/blog-app/venv/Lib/site-packages/greenlet/TThreadStateDestroy.cpp deleted file mode 100644 index 449b788..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/TThreadStateDestroy.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -/** - * Implementation of the ThreadState destructors. - * - * Format with: - * clang-format -i --style=file src/greenlet/greenlet.c - * - * - * Fix missing braces with: - * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" -*/ -#ifndef T_THREADSTATE_DESTROY -#define T_THREADSTATE_DESTROY - -#include "TGreenlet.hpp" - -#include "greenlet_thread_support.hpp" -#include "greenlet_compiler_compat.hpp" -#include "TGreenletGlobals.cpp" -#include "TThreadState.hpp" -#include "TThreadStateCreator.hpp" - -namespace greenlet { - -extern "C" { - -struct ThreadState_DestroyNoGIL -{ - /** - This function uses the same lock that the PendingCallback does - */ - static void - MarkGreenletDeadAndQueueCleanup(ThreadState* const state) - { -#if GREENLET_BROKEN_THREAD_LOCAL_CLEANUP_JUST_LEAK - return; -#endif - // We are *NOT* holding the GIL. Our thread is in the middle - // of its death throes and the Python thread state is already - // gone so we can't use most Python APIs. One that is safe is - // ``Py_AddPendingCall``, unless the interpreter itself has - // been torn down. There is a limited number of calls that can - // be queued: 32 (NPENDINGCALLS) in CPython 3.10, so we - // coalesce these calls using our own queue. - - if (!MarkGreenletDeadIfNeeded(state)) { - // No state, or no greenlet - return; - } - - // XXX: Because we don't have the GIL, this is a race condition. - if (!PyInterpreterState_Head()) { - // We have to leak the thread state, if the - // interpreter has shut down when we're getting - // deallocated, we can't run the cleanup code that - // deleting it would imply. - return; - } - - AddToCleanupQueue(state); - - } - -private: - - // If the state has an allocated main greenlet: - // - mark the greenlet as dead by disassociating it from the state; - // - return 1 - // Otherwise, return 0. - static bool - MarkGreenletDeadIfNeeded(ThreadState* const state) - { - if (state && state->has_main_greenlet()) { - // mark the thread as dead ASAP. - // this is racy! If we try to throw or switch to a - // greenlet from this thread from some other thread before - // we clear the state pointer, it won't realize the state - // is dead which can crash the process. - PyGreenlet* p(state->borrow_main_greenlet().borrow()); - assert(p->pimpl->thread_state() == state || p->pimpl->thread_state() == nullptr); - dynamic_cast(p->pimpl)->thread_state(nullptr); - return true; - } - return false; - } - - static void - AddToCleanupQueue(ThreadState* const state) - { - assert(state && state->has_main_greenlet()); - - // NOTE: Because we're not holding the GIL here, some other - // Python thread could run and call ``os.fork()``, which would - // be bad if that happened while we are holding the cleanup - // lock (it wouldn't function in the child process). - // Make a best effort to try to keep the duration we hold the - // lock short. - // TODO: On platforms that support it, use ``pthread_atfork`` to - // drop this lock. - LockGuard cleanup_lock(*mod_globs->thread_states_to_destroy_lock); - - mod_globs->queue_to_destroy(state); - if (mod_globs->thread_states_to_destroy.size() == 1) { - // We added the first item to the queue. We need to schedule - // the cleanup. - - // A size greater than 1 means that we have already added the pending call, - // and in fact, it may be executing now. - // If it is executing, our lock makes sure that it will see the item we just added - // to the queue on its next iteration (after we release the lock) - // - // A size of 1 means there is no pending call, OR the pending call is - // currently executing, has dropped the lock, and is deleting the last item - // from the queue; its next iteration will go ahead and delete the item we just added. - // And the pending call we schedule here will have no work to do. - int result = AddPendingCall( - PendingCallback_DestroyQueueWithGIL, - nullptr); - if (result < 0) { - // Hmm, what can we do here? - fprintf(stderr, - "greenlet: WARNING: failed in call to Py_AddPendingCall; " - "expect a memory leak.\n"); - } - } - } - - static int - PendingCallback_DestroyQueueWithGIL(void* UNUSED(arg)) - { - // We're holding the GIL here, so no Python code should be able to - // run to call ``os.fork()``. - while (1) { - ThreadState* to_destroy; - { - LockGuard cleanup_lock(*mod_globs->thread_states_to_destroy_lock); - if (mod_globs->thread_states_to_destroy.empty()) { - break; - } - to_destroy = mod_globs->take_next_to_destroy(); - } - assert(to_destroy); - assert(to_destroy->has_main_greenlet()); - // Drop the lock while we do the actual deletion. - // This allows other calls to MarkGreenletDeadAndQueueCleanup - // to enter and add to our queue. - DestroyOneWithGIL(to_destroy); - } - return 0; - } - - static void - DestroyOneWithGIL(const ThreadState* const state) - { - // Holding the GIL. - // Passed a non-shared pointer to the actual thread state. - // state -> main greenlet - assert(state->has_main_greenlet()); - PyGreenlet* main(state->borrow_main_greenlet()); - // When we need to do cross-thread operations, we check this. - // A NULL value means the thread died some time ago. - // We do this here, rather than in a Python dealloc function - // for the greenlet, in case there's still a reference out - // there. - dynamic_cast(main->pimpl)->thread_state(nullptr); - - delete state; // Deleting this runs the destructor, DECREFs the main greenlet. - } - - - static int AddPendingCall(int (*func)(void*), void* arg) - { - // If the interpreter is in the middle of finalizing, we can't add a - // pending call. Trying to do so will end up in a SIGSEGV, as - // Py_AddPendingCall will not be able to get the interpreter and will - // try to dereference a NULL pointer. It's possible this can still - // segfault if we happen to get context switched, and maybe we should - // just always implement our own AddPendingCall, but I'd like to see if - // this works first -#if GREENLET_PY313 - if (Py_IsFinalizing()) { -#else - if (_Py_IsFinalizing()) { -#endif -#ifdef GREENLET_DEBUG - // No need to log in the general case. Yes, we'll leak, - // but we're shutting down so it should be ok. - fprintf(stderr, - "greenlet: WARNING: Interpreter is finalizing. Ignoring " - "call to Py_AddPendingCall; \n"); -#endif - return 0; - } - return Py_AddPendingCall(func, arg); - } - - - - - -}; -}; - -}; // namespace greenlet - -// The intent when GET_THREAD_STATE() is needed multiple times in a -// function is to take a reference to its return value in a local -// variable, to avoid the thread-local indirection. On some platforms -// (macOS), accessing a thread-local involves a function call (plus an -// initial function call in each function that uses a thread local); -// in contrast, static volatile variables are at some pre-computed -// offset. -typedef greenlet::ThreadStateCreator ThreadStateCreator; -static thread_local ThreadStateCreator g_thread_state_global; -#define GET_THREAD_STATE() g_thread_state_global - -#endif //T_THREADSTATE_DESTROY diff --git a/blog-app/venv/Lib/site-packages/greenlet/TUserGreenlet.cpp b/blog-app/venv/Lib/site-packages/greenlet/TUserGreenlet.cpp deleted file mode 100644 index 73a8133..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/TUserGreenlet.cpp +++ /dev/null @@ -1,662 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -/** - * Implementation of greenlet::UserGreenlet. - * - * Format with: - * clang-format -i --style=file src/greenlet/greenlet.c - * - * - * Fix missing braces with: - * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" -*/ -#ifndef T_USER_GREENLET_CPP -#define T_USER_GREENLET_CPP - -#include "greenlet_internal.hpp" -#include "TGreenlet.hpp" - -#include "TThreadStateDestroy.cpp" - - -namespace greenlet { -using greenlet::refs::BorrowedMainGreenlet; -greenlet::PythonAllocator UserGreenlet::allocator; - -void* UserGreenlet::operator new(size_t UNUSED(count)) -{ - return allocator.allocate(1); -} - - -void UserGreenlet::operator delete(void* ptr) -{ - return allocator.deallocate(static_cast(ptr), - 1); -} - - -UserGreenlet::UserGreenlet(PyGreenlet* p, BorrowedGreenlet the_parent) - : Greenlet(p), _parent(the_parent) -{ -} - -UserGreenlet::~UserGreenlet() -{ - // Python 3.11: If we don't clear out the raw frame datastack - // when deleting an unfinished greenlet, - // TestLeaks.test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_main fails. - this->python_state.did_finish(nullptr); - this->tp_clear(); -} - - -const BorrowedMainGreenlet -UserGreenlet::main_greenlet() const -{ - return this->_main_greenlet; -} - - -BorrowedMainGreenlet -UserGreenlet::find_main_greenlet_in_lineage() const -{ - if (this->started()) { - assert(this->_main_greenlet); - return BorrowedMainGreenlet(this->_main_greenlet); - } - - if (!this->_parent) { - /* garbage collected greenlet in chain */ - // XXX: WHAT? - return BorrowedMainGreenlet(nullptr); - } - - return this->_parent->find_main_greenlet_in_lineage(); -} - - -/** - * CAUTION: This will allocate memory and may trigger garbage - * collection and arbitrary Python code. - */ -OwnedObject -UserGreenlet::throw_GreenletExit_during_dealloc(const ThreadState& current_thread_state) -{ - /* The dying greenlet cannot be a parent of ts_current - because the 'parent' field chain would hold a - reference */ - UserGreenlet::ParentIsCurrentGuard with_current_parent(this, current_thread_state); - - // We don't care about the return value, only whether an - // exception happened. Whether or not an exception happens, - // we need to restore the parent in case the greenlet gets - // resurrected. - return Greenlet::throw_GreenletExit_during_dealloc(current_thread_state); -} - -ThreadState* -UserGreenlet::thread_state() const noexcept -{ - // TODO: maybe make this throw, if the thread state isn't there? - // if (!this->main_greenlet) { - // throw std::runtime_error("No thread state"); // TODO: Better exception - // } - if (!this->_main_greenlet) { - return nullptr; - } - return this->_main_greenlet->thread_state(); -} - - -bool -UserGreenlet::was_running_in_dead_thread() const noexcept -{ - return this->_main_greenlet && !this->thread_state(); -} - -OwnedObject -UserGreenlet::g_switch() -{ - assert(this->args() || PyErr_Occurred()); - - try { - this->check_switch_allowed(); - } - catch (const PyErrOccurred&) { - this->release_args(); - throw; - } - - // Switching greenlets used to attempt to clean out ones that need - // deleted *if* we detected a thread switch. Should it still do - // that? - // An issue is that if we delete a greenlet from another thread, - // it gets queued to this thread, and ``kill_greenlet()`` switches - // back into the greenlet - - /* find the real target by ignoring dead greenlets, - and if necessary starting a greenlet. */ - switchstack_result_t err; - Greenlet* target = this; - // TODO: probably cleaner to handle the case where we do - // switch to ourself separately from the other cases. - // This can probably even further be simplified if we keep - // track of the switching_state we're going for and just call - // into g_switch() if it's not ourself. The main problem with that - // is that we would be using more stack space. - bool target_was_me = true; - bool was_initial_stub = false; - while (target) { - if (target->active()) { - if (!target_was_me) { - target->args() <<= this->args(); - assert(!this->args()); - } - err = target->g_switchstack(); - break; - } - if (!target->started()) { - // We never encounter a main greenlet that's not started. - assert(!target->main()); - UserGreenlet* real_target = static_cast(target); - assert(real_target); - void* dummymarker; - was_initial_stub = true; - if (!target_was_me) { - target->args() <<= this->args(); - assert(!this->args()); - } - try { - // This can only throw back to us while we're - // still in this greenlet. Once the new greenlet - // is bootstrapped, it has its own exception state. - err = real_target->g_initialstub(&dummymarker); - } - catch (const PyErrOccurred&) { - this->release_args(); - throw; - } - catch (const GreenletStartedWhileInPython&) { - // The greenlet was started sometime before this - // greenlet actually switched to it, i.e., - // "concurrent" calls to switch() or throw(). - // We need to retry the switch. - // Note that the current greenlet has been reset - // to this one (or we wouldn't be running!) - continue; - } - break; - } - - target = target->parent(); - target_was_me = false; - } - // The ``this`` pointer and all other stack or register based - // variables are invalid now, at least where things succeed - // above. - // But this one, probably not so much? It's not clear if it's - // safe to throw an exception at this point. - - if (err.status < 0) { - // If we get here, either g_initialstub() - // failed, or g_switchstack() failed. Either one of those - // cases SHOULD leave us in the original greenlet with a valid - // stack. - return this->on_switchstack_or_initialstub_failure(target, err, target_was_me, was_initial_stub); - } - - // err.the_new_current_greenlet would be the same as ``target``, - // if target wasn't probably corrupt. - return err.the_new_current_greenlet->g_switch_finish(err); -} - - - -Greenlet::switchstack_result_t -UserGreenlet::g_initialstub(void* mark) -{ - OwnedObject run; - - // We need to grab a reference to the current switch arguments - // in case we're entered concurrently during the call to - // GetAttr() and have to try again. - // We'll restore them when we return in that case. - // Scope them tightly to avoid ref leaks. - { - SwitchingArgs args(this->args()); - - /* save exception in case getattr clears it */ - PyErrPieces saved; - - /* - self.run is the object to call in the new greenlet. - This could run arbitrary python code and switch greenlets! - */ - run = this->self().PyRequireAttr(mod_globs->str_run); - /* restore saved exception */ - saved.PyErrRestore(); - - - /* recheck that it's safe to switch in case greenlet reparented anywhere above */ - this->check_switch_allowed(); - - /* by the time we got here another start could happen elsewhere, - * that means it should now be a regular switch. - * This can happen if the Python code is a subclass that implements - * __getattribute__ or __getattr__, or makes ``run`` a descriptor; - * all of those can run arbitrary code that switches back into - * this greenlet. - */ - if (this->stack_state.started()) { - // the successful switch cleared these out, we need to - // restore our version. They will be copied on up to the - // next target. - assert(!this->args()); - this->args() <<= args; - throw GreenletStartedWhileInPython(); - } - } - - // Sweet, if we got here, we have the go-ahead and will switch - // greenlets. - // Nothing we do from here on out should allow for a thread or - // greenlet switch: No arbitrary calls to Python, including - // decref'ing - -#if GREENLET_USE_CFRAME - /* OK, we need it, we're about to switch greenlets, save the state. */ - /* - See green_new(). This is a stack-allocated variable used - while *self* is in PyObject_Call(). - We want to defer copying the state info until we're sure - we need it and are in a stable place to do so. - */ - _PyCFrame trace_info; - - this->python_state.set_new_cframe(trace_info); -#endif - /* start the greenlet */ - ThreadState& thread_state = GET_THREAD_STATE().state(); - this->stack_state = StackState(mark, - thread_state.borrow_current()->stack_state); - this->python_state.set_initial_state(PyThreadState_GET()); - this->exception_state.clear(); - this->_main_greenlet = thread_state.get_main_greenlet(); - - /* perform the initial switch */ - switchstack_result_t err = this->g_switchstack(); - /* returns twice! - The 1st time with ``err == 1``: we are in the new greenlet. - This one owns a greenlet that used to be current. - The 2nd time with ``err <= 0``: back in the caller's - greenlet; this happens if the child finishes or switches - explicitly to us. Either way, the ``err`` variable is - created twice at the same memory location, but possibly - having different ``origin`` values. Note that it's not - constructed for the second time until the switch actually happens. - */ - if (err.status == 1) { - // In the new greenlet. - - // This never returns! Calling inner_bootstrap steals - // the contents of our run object within this stack frame, so - // it is not valid to do anything with it. - try { - this->inner_bootstrap(err.origin_greenlet.relinquish_ownership(), - run.relinquish_ownership()); - } - // Getting a C++ exception here isn't good. It's probably a - // bug in the underlying greenlet, meaning it's probably a - // C++ extension. We're going to abort anyway, but try to - // display some nice information *if* possible. Some obscure - // platforms don't properly support this (old 32-bit Arm, see see - // https://github.com/python-greenlet/greenlet/issues/385); that's not - // great, but should usually be OK because, as mentioned above, we're - // terminating anyway. - // - // The catching is tested by - // ``test_cpp.CPPTests.test_unhandled_exception_in_greenlet_aborts``. - // - // PyErrOccurred can theoretically be thrown by - // inner_bootstrap() -> g_switch_finish(), but that should - // never make it back to here. It is a std::exception and - // would be caught if it is. - catch (const std::exception& e) { - std::string base = "greenlet: Unhandled C++ exception: "; - base += e.what(); - Py_FatalError(base.c_str()); - } - catch (...) { - // Some compilers/runtimes use exceptions internally. - // It appears that GCC on Linux with libstdc++ throws an - // exception internally at process shutdown time to unwind - // stacks and clean up resources. Depending on exactly - // where we are when the process exits, that could result - // in an unknown exception getting here. If we - // Py_FatalError() or abort() here, we interfere with - // orderly process shutdown. Throwing the exception on up - // is the right thing to do. - // - // gevent's ``examples/dns_mass_resolve.py`` demonstrates this. -#ifndef NDEBUG - fprintf(stderr, - "greenlet: inner_bootstrap threw unknown exception; " - "is the process terminating?\n"); -#endif - throw; - } - Py_FatalError("greenlet: inner_bootstrap returned with no exception.\n"); - } - - - // In contrast, notice that we're keeping the origin greenlet - // around as an owned reference; we need it to call the trace - // function for the switch back into the parent. It was only - // captured at the time the switch actually happened, though, - // so we haven't been keeping an extra reference around this - // whole time. - - /* back in the parent */ - if (err.status < 0) { - /* start failed badly, restore greenlet state */ - this->stack_state = StackState(); - this->_main_greenlet.CLEAR(); - // CAUTION: This may run arbitrary Python code. - run.CLEAR(); // inner_bootstrap didn't run, we own the reference. - } - - // In the success case, the spawned code (inner_bootstrap) will - // take care of decrefing this, so we relinquish ownership so as - // to not double-decref. - - run.relinquish_ownership(); - - return err; -} - - -void -UserGreenlet::inner_bootstrap(PyGreenlet* origin_greenlet, PyObject* run) -{ - // The arguments here would be another great place for move. - // As it is, we take them as a reference so that when we clear - // them we clear what's on the stack above us. Do that NOW, and - // without using a C++ RAII object, - // so there's no way that exiting the parent frame can clear it, - // or we clear it unexpectedly. This arises in the context of the - // interpreter shutting down. See https://github.com/python-greenlet/greenlet/issues/325 - //PyObject* run = _run.relinquish_ownership(); - - /* in the new greenlet */ - assert(this->thread_state()->borrow_current() == BorrowedGreenlet(this->_self)); - // C++ exceptions cannot propagate to the parent greenlet from - // here. (TODO: Do we need a catch(...) clause, perhaps on the - // function itself? ALl we could do is terminate the program.) - // NOTE: On 32-bit Windows, the call chain is extremely - // important here in ways that are subtle, having to do with - // the depth of the SEH list. The call to restore it MUST NOT - // add a new SEH handler to the list, or we'll restore it to - // the wrong thing. - this->thread_state()->restore_exception_state(); - /* stack variables from above are no good and also will not unwind! */ - // EXCEPT: That can't be true, we access run, among others, here. - - this->stack_state.set_active(); /* running */ - - // We're about to possibly run Python code again, which - // could switch back/away to/from us, so we need to grab the - // arguments locally. - SwitchingArgs args; - args <<= this->args(); - assert(!this->args()); - - // XXX: We could clear this much earlier, right? - // Or would that introduce the possibility of running Python - // code when we don't want to? - // CAUTION: This may run arbitrary Python code. - this->_run_callable.CLEAR(); - - - // The first switch we need to manually call the trace - // function here instead of in g_switch_finish, because we - // never return there. - if (OwnedObject tracefunc = this->thread_state()->get_tracefunc()) { - OwnedGreenlet trace_origin; - trace_origin = origin_greenlet; - try { - g_calltrace(tracefunc, - args ? mod_globs->event_switch : mod_globs->event_throw, - trace_origin, - this->_self); - } - catch (const PyErrOccurred&) { - /* Turn trace errors into switch throws */ - args.CLEAR(); - } - } - - // We no longer need the origin, it was only here for - // tracing. - // We may never actually exit this stack frame so we need - // to explicitly clear it. - // This could run Python code and switch. - Py_CLEAR(origin_greenlet); - - OwnedObject result; - if (!args) { - /* pending exception */ - result = NULL; - } - else { - /* call g.run(*args, **kwargs) */ - // This could result in further switches - try { - //result = run.PyCall(args.args(), args.kwargs()); - // CAUTION: Just invoking this, before the function even - // runs, may cause memory allocations, which may trigger - // GC, which may run arbitrary Python code. - result = OwnedObject::consuming(PyObject_Call(run, args.args().borrow(), args.kwargs().borrow())); - } - catch (...) { - // Unhandled C++ exception! - - // If we declare ourselves as noexcept, if we don't catch - // this here, most platforms will just abort() the - // process. But on 64-bit Windows with older versions of - // the C runtime, this can actually corrupt memory and - // just return. We see this when compiling with the - // Windows 7.0 SDK targeting Windows Server 2008, but not - // when using the Appveyor Visual Studio 2019 image. So - // this currently only affects Python 2.7 on Windows 64. - // That is, the tests pass and the runtime aborts - // everywhere else. - // - // However, if we catch it and try to continue with a - // Python error, then all Windows 64 bit platforms corrupt - // memory. So all we can do is manually abort, hopefully - // with a good error message. (Note that the above was - // tested WITHOUT the `/EHr` switch being used at compile - // time, so MSVC may have "optimized" out important - // checking. Using that switch, we may be in a better - // place in terms of memory corruption.) But sometimes it - // can't be caught here at all, which is confusing but not - // terribly surprising; so again, the G_NOEXCEPT_WIN32 - // plus "/EHr". - // - // Hopefully the basic C stdlib is still functional enough - // for us to at least print an error. - // - // It gets more complicated than that, though, on some - // platforms, specifically at least Linux/gcc/libstdc++. They use - // an exception to unwind the stack when a background - // thread exits. (See comments about noexcept.) So this - // may not actually represent anything untoward. On those - // platforms we allow throws of this to propagate, or - // attempt to anyway. -# if defined(WIN32) || defined(_WIN32) - Py_FatalError( - "greenlet: Unhandled C++ exception from a greenlet run function. " - "Because memory is likely corrupted, terminating process."); - std::abort(); -#else - throw; -#endif - } - } - // These lines may run arbitrary code - args.CLEAR(); - Py_CLEAR(run); - - if (!result - && mod_globs->PyExc_GreenletExit.PyExceptionMatches() - && (this->args())) { - // This can happen, for example, if our only reference - // goes away after we switch back to the parent. - // See test_dealloc_switch_args_not_lost - PyErrPieces clear_error; - result <<= this->args(); - result = single_result(result); - } - this->release_args(); - this->python_state.did_finish(PyThreadState_GET()); - - result = g_handle_exit(result); - assert(this->thread_state()->borrow_current() == this->_self); - - /* jump back to parent */ - this->stack_state.set_inactive(); /* dead */ - - - // TODO: Can we decref some things here? Release our main greenlet - // and maybe parent? - for (Greenlet* parent = this->_parent; - parent; - parent = parent->parent()) { - // We need to somewhere consume a reference to - // the result; in most cases we'll never have control - // back in this stack frame again. Calling - // green_switch actually adds another reference! - // This would probably be clearer with a specific API - // to hand results to the parent. - parent->args() <<= result; - assert(!result); - // The parent greenlet now owns the result; in the - // typical case we'll never get back here to assign to - // result and thus release the reference. - try { - result = parent->g_switch(); - } - catch (const PyErrOccurred&) { - // Ignore, keep passing the error on up. - } - - /* Return here means switch to parent failed, - * in which case we throw *current* exception - * to the next parent in chain. - */ - assert(!result); - } - /* We ran out of parents, cannot continue */ - PyErr_WriteUnraisable(this->self().borrow_o()); - Py_FatalError("greenlet: ran out of parent greenlets while propagating exception; " - "cannot continue"); - std::abort(); -} - -void -UserGreenlet::run(const BorrowedObject nrun) -{ - if (this->started()) { - throw AttributeError( - "run cannot be set " - "after the start of the greenlet"); - } - this->_run_callable = nrun; -} - -const OwnedGreenlet -UserGreenlet::parent() const -{ - return this->_parent; -} - -void -UserGreenlet::parent(const BorrowedObject raw_new_parent) -{ - if (!raw_new_parent) { - throw AttributeError("can't delete attribute"); - } - - BorrowedMainGreenlet main_greenlet_of_new_parent; - BorrowedGreenlet new_parent(raw_new_parent.borrow()); // could - // throw - // TypeError! - for (BorrowedGreenlet p = new_parent; p; p = p->parent()) { - if (p == this->self()) { - throw ValueError("cyclic parent chain"); - } - main_greenlet_of_new_parent = p->main_greenlet(); - } - - if (!main_greenlet_of_new_parent) { - throw ValueError("parent must not be garbage collected"); - } - - if (this->started() - && this->_main_greenlet != main_greenlet_of_new_parent) { - throw ValueError("parent cannot be on a different thread"); - } - - this->_parent = new_parent; -} - -void -UserGreenlet::murder_in_place() -{ - this->_main_greenlet.CLEAR(); - Greenlet::murder_in_place(); -} - -bool -UserGreenlet::belongs_to_thread(const ThreadState* thread_state) const -{ - return Greenlet::belongs_to_thread(thread_state) && this->_main_greenlet == thread_state->borrow_main_greenlet(); -} - - -int -UserGreenlet::tp_traverse(visitproc visit, void* arg) -{ - Py_VISIT(this->_parent.borrow_o()); - Py_VISIT(this->_main_greenlet.borrow_o()); - Py_VISIT(this->_run_callable.borrow_o()); - - return Greenlet::tp_traverse(visit, arg); -} - -int -UserGreenlet::tp_clear() -{ - Greenlet::tp_clear(); - this->_parent.CLEAR(); - this->_main_greenlet.CLEAR(); - this->_run_callable.CLEAR(); - return 0; -} - -UserGreenlet::ParentIsCurrentGuard::ParentIsCurrentGuard(UserGreenlet* p, - const ThreadState& thread_state) - : oldparent(p->_parent), - greenlet(p) -{ - p->_parent = thread_state.get_current(); -} - -UserGreenlet::ParentIsCurrentGuard::~ParentIsCurrentGuard() -{ - this->greenlet->_parent = oldparent; - oldparent.CLEAR(); -} - -}; //namespace greenlet -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/__init__.py b/blog-app/venv/Lib/site-packages/greenlet/__init__.py deleted file mode 100644 index 9483b7c..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/__init__.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -""" -The root of the greenlet package. -""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -__all__ = [ - '__version__', - '_C_API', - - 'GreenletExit', - 'error', - - 'getcurrent', - 'greenlet', - - 'gettrace', - 'settrace', -] - -# pylint:disable=no-name-in-module - -### -# Metadata -### -__version__ = '3.2.2' -from ._greenlet import _C_API # pylint:disable=no-name-in-module - -### -# Exceptions -### -from ._greenlet import GreenletExit -from ._greenlet import error - -### -# greenlets -### -from ._greenlet import getcurrent -from ._greenlet import greenlet - -### -# tracing -### -try: - from ._greenlet import gettrace - from ._greenlet import settrace -except ImportError: - # Tracing wasn't supported. - # XXX: The option to disable it was removed in 1.0, - # so this branch should be dead code. - pass - -### -# Constants -# These constants aren't documented and aren't recommended. -# In 1.0, USE_GC and USE_TRACING are always true, and USE_CONTEXT_VARS -# is the same as ``sys.version_info[:2] >= 3.7`` -### -from ._greenlet import GREENLET_USE_CONTEXT_VARS # pylint:disable=unused-import -from ._greenlet import GREENLET_USE_GC # pylint:disable=unused-import -from ._greenlet import GREENLET_USE_TRACING # pylint:disable=unused-import - -# Controlling the use of the gc module. Provisional API for this greenlet -# implementation in 2.0. -from ._greenlet import CLOCKS_PER_SEC # pylint:disable=unused-import -from ._greenlet import enable_optional_cleanup # pylint:disable=unused-import -from ._greenlet import get_clocks_used_doing_optional_cleanup # pylint:disable=unused-import - -# Other APIS in the _greenlet module are for test support. diff --git a/blog-app/venv/Lib/site-packages/greenlet/__pycache__/__init__.cpython-310.pyc b/blog-app/venv/Lib/site-packages/greenlet/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 11c4be45778616fba8f20a34c0dc33a3c5c17c8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1016 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 r`F3sg(7u*YVqGn1w4-&jpZl@Z3|h -#include -#include -#include - - -#define PY_SSIZE_T_CLEAN -#include -#include "structmember.h" // PyMemberDef - -#include "greenlet_internal.hpp" -// Code after this point can assume access to things declared in stdint.h, -// including the fixed-width types. This goes for the platform-specific switch functions -// as well. -#include "greenlet_refs.hpp" -#include "greenlet_slp_switch.hpp" - -#include "greenlet_thread_support.hpp" -#include "TGreenlet.hpp" - -#include "TGreenletGlobals.cpp" - -#include "TGreenlet.cpp" -#include "TMainGreenlet.cpp" -#include "TUserGreenlet.cpp" -#include "TBrokenGreenlet.cpp" -#include "TExceptionState.cpp" -#include "TPythonState.cpp" -#include "TStackState.cpp" - -#include "TThreadState.hpp" -#include "TThreadStateCreator.hpp" -#include "TThreadStateDestroy.cpp" - -#include "PyGreenlet.cpp" -#include "PyGreenletUnswitchable.cpp" -#include "CObjects.cpp" - -using greenlet::LockGuard; -using greenlet::LockInitError; -using greenlet::PyErrOccurred; -using greenlet::Require; - -using greenlet::g_handle_exit; -using greenlet::single_result; - -using greenlet::Greenlet; -using greenlet::UserGreenlet; -using greenlet::MainGreenlet; -using greenlet::BrokenGreenlet; -using greenlet::ThreadState; -using greenlet::PythonState; - - - -// ******* Implementation of things from included files -template -greenlet::refs::_BorrowedGreenlet& greenlet::refs::_BorrowedGreenlet::operator=(const greenlet::refs::BorrowedObject& other) -{ - this->_set_raw_pointer(static_cast(other)); - return *this; -} - -template -inline greenlet::refs::_BorrowedGreenlet::operator Greenlet*() const noexcept -{ - if (!this->p) { - return nullptr; - } - return reinterpret_cast(this->p)->pimpl; -} - -template -greenlet::refs::_BorrowedGreenlet::_BorrowedGreenlet(const BorrowedObject& p) - : BorrowedReference(nullptr) -{ - - this->_set_raw_pointer(p.borrow()); -} - -template -inline greenlet::refs::_OwnedGreenlet::operator Greenlet*() const noexcept -{ - if (!this->p) { - return nullptr; - } - return reinterpret_cast(this->p)->pimpl; -} - - - -#ifdef __clang__ -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wmissing-field-initializers" -# pragma clang diagnostic ignored "-Wwritable-strings" -#elif defined(__GNUC__) -# pragma GCC diagnostic push -// warning: ISO C++ forbids converting a string constant to ‘char*’ -// (The python APIs aren't const correct and accept writable char*) -# pragma GCC diagnostic ignored "-Wwrite-strings" -#endif - - -/*********************************************************** - -A PyGreenlet is a range of C stack addresses that must be -saved and restored in such a way that the full range of the -stack contains valid data when we switch to it. - -Stack layout for a greenlet: - - | ^^^ | - | older data | - | | - stack_stop . |_______________| - . | | - . | greenlet data | - . | in stack | - . * |_______________| . . _____________ stack_copy + stack_saved - . | | | | - . | data | |greenlet data| - . | unrelated | | saved | - . | to | | in heap | - stack_start . | this | . . |_____________| stack_copy - | greenlet | - | | - | newer data | - | vvv | - - -Note that a greenlet's stack data is typically partly at its correct -place in the stack, and partly saved away in the heap, but always in -the above configuration: two blocks, the more recent one in the heap -and the older one still in the stack (either block may be empty). - -Greenlets are chained: each points to the previous greenlet, which is -the one that owns the data currently in the C stack above my -stack_stop. The currently running greenlet is the first element of -this chain. The main (initial) greenlet is the last one. Greenlets -whose stack is entirely in the heap can be skipped from the chain. - -The chain is not related to execution order, but only to the order -in which bits of C stack happen to belong to greenlets at a particular -point in time. - -The main greenlet doesn't have a stack_stop: it is responsible for the -complete rest of the C stack, and we don't know where it begins. We -use (char*) -1, the largest possible address. - -States: - stack_stop == NULL && stack_start == NULL: did not start yet - stack_stop != NULL && stack_start == NULL: already finished - stack_stop != NULL && stack_start != NULL: active - -The running greenlet's stack_start is undefined but not NULL. - - ***********************************************************/ - - - - -/***********************************************************/ - -/* Some functions must not be inlined: - * slp_restore_state, when inlined into slp_switch might cause - it to restore stack over its own local variables - * slp_save_state, when inlined would add its own local - variables to the saved stack, wasting space - * slp_switch, cannot be inlined for obvious reasons - * g_initialstub, when inlined would receive a pointer into its - own stack frame, leading to incomplete stack save/restore - -g_initialstub is a member function and declared virtual so that the -compiler always calls it through a vtable. - -slp_save_state and slp_restore_state are also member functions. They -are called from trampoline functions that themselves are declared as -not eligible for inlining. -*/ - -extern "C" { -static int GREENLET_NOINLINE(slp_save_state_trampoline)(char* stackref) -{ - return switching_thread_state->slp_save_state(stackref); -} -static void GREENLET_NOINLINE(slp_restore_state_trampoline)() -{ - switching_thread_state->slp_restore_state(); -} -} - - -/***********************************************************/ - - -#include "PyModule.cpp" - - - -static PyObject* -greenlet_internal_mod_init() noexcept -{ - static void* _PyGreenlet_API[PyGreenlet_API_pointers]; - - try { - CreatedModule m(greenlet_module_def); - - Require(PyType_Ready(&PyGreenlet_Type)); - Require(PyType_Ready(&PyGreenletUnswitchable_Type)); - - mod_globs = new greenlet::GreenletGlobals; - ThreadState::init(); - - m.PyAddObject("greenlet", PyGreenlet_Type); - m.PyAddObject("UnswitchableGreenlet", PyGreenletUnswitchable_Type); - m.PyAddObject("error", mod_globs->PyExc_GreenletError); - m.PyAddObject("GreenletExit", mod_globs->PyExc_GreenletExit); - - m.PyAddObject("GREENLET_USE_GC", 1); - m.PyAddObject("GREENLET_USE_TRACING", 1); - m.PyAddObject("GREENLET_USE_CONTEXT_VARS", 1L); - m.PyAddObject("GREENLET_USE_STANDARD_THREADING", 1L); - - OwnedObject clocks_per_sec = OwnedObject::consuming(PyLong_FromSsize_t(CLOCKS_PER_SEC)); - m.PyAddObject("CLOCKS_PER_SEC", clocks_per_sec); - - /* also publish module-level data as attributes of the greentype. */ - // XXX: This is weird, and enables a strange pattern of - // confusing the class greenlet with the module greenlet; with - // the exception of (possibly) ``getcurrent()``, this - // shouldn't be encouraged so don't add new items here. - for (const char* const* p = copy_on_greentype; *p; p++) { - OwnedObject o = m.PyRequireAttr(*p); - PyDict_SetItemString(PyGreenlet_Type.tp_dict, *p, o.borrow()); - } - - /* - * Expose C API - */ - - /* types */ - _PyGreenlet_API[PyGreenlet_Type_NUM] = (void*)&PyGreenlet_Type; - - /* exceptions */ - _PyGreenlet_API[PyExc_GreenletError_NUM] = (void*)mod_globs->PyExc_GreenletError; - _PyGreenlet_API[PyExc_GreenletExit_NUM] = (void*)mod_globs->PyExc_GreenletExit; - - /* methods */ - _PyGreenlet_API[PyGreenlet_New_NUM] = (void*)PyGreenlet_New; - _PyGreenlet_API[PyGreenlet_GetCurrent_NUM] = (void*)PyGreenlet_GetCurrent; - _PyGreenlet_API[PyGreenlet_Throw_NUM] = (void*)PyGreenlet_Throw; - _PyGreenlet_API[PyGreenlet_Switch_NUM] = (void*)PyGreenlet_Switch; - _PyGreenlet_API[PyGreenlet_SetParent_NUM] = (void*)PyGreenlet_SetParent; - - /* Previously macros, but now need to be functions externally. */ - _PyGreenlet_API[PyGreenlet_MAIN_NUM] = (void*)Extern_PyGreenlet_MAIN; - _PyGreenlet_API[PyGreenlet_STARTED_NUM] = (void*)Extern_PyGreenlet_STARTED; - _PyGreenlet_API[PyGreenlet_ACTIVE_NUM] = (void*)Extern_PyGreenlet_ACTIVE; - _PyGreenlet_API[PyGreenlet_GET_PARENT_NUM] = (void*)Extern_PyGreenlet_GET_PARENT; - - /* XXX: Note that our module name is ``greenlet._greenlet``, but for - backwards compatibility with existing C code, we need the _C_API to - be directly in greenlet. - */ - const NewReference c_api_object(Require( - PyCapsule_New( - (void*)_PyGreenlet_API, - "greenlet._C_API", - NULL))); - m.PyAddObject("_C_API", c_api_object); - assert(c_api_object.REFCNT() == 2); - - // cerr << "Sizes:" - // << "\n\tGreenlet : " << sizeof(Greenlet) - // << "\n\tUserGreenlet : " << sizeof(UserGreenlet) - // << "\n\tMainGreenlet : " << sizeof(MainGreenlet) - // << "\n\tExceptionState : " << sizeof(greenlet::ExceptionState) - // << "\n\tPythonState : " << sizeof(greenlet::PythonState) - // << "\n\tStackState : " << sizeof(greenlet::StackState) - // << "\n\tSwitchingArgs : " << sizeof(greenlet::SwitchingArgs) - // << "\n\tOwnedObject : " << sizeof(greenlet::refs::OwnedObject) - // << "\n\tBorrowedObject : " << sizeof(greenlet::refs::BorrowedObject) - // << "\n\tPyGreenlet : " << sizeof(PyGreenlet) - // << endl; - - return m.borrow(); // But really it's the main reference. - } - catch (const LockInitError& e) { - PyErr_SetString(PyExc_MemoryError, e.what()); - return NULL; - } - catch (const PyErrOccurred&) { - return NULL; - } - -} - -extern "C" { - -PyMODINIT_FUNC -PyInit__greenlet(void) -{ - return greenlet_internal_mod_init(); -} - -}; // extern C - -#ifdef __clang__ -# pragma clang diagnostic pop -#elif defined(__GNUC__) -# pragma GCC diagnostic pop -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/greenlet.h b/blog-app/venv/Lib/site-packages/greenlet/greenlet.h deleted file mode 100644 index d02a16e..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/greenlet.h +++ /dev/null @@ -1,164 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ - -/* Greenlet object interface */ - -#ifndef Py_GREENLETOBJECT_H -#define Py_GREENLETOBJECT_H - - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* This is deprecated and undocumented. It does not change. */ -#define GREENLET_VERSION "1.0.0" - -#ifndef GREENLET_MODULE -#define implementation_ptr_t void* -#endif - -typedef struct _greenlet { - PyObject_HEAD - PyObject* weakreflist; - PyObject* dict; - implementation_ptr_t pimpl; -} PyGreenlet; - -#define PyGreenlet_Check(op) (op && PyObject_TypeCheck(op, &PyGreenlet_Type)) - - -/* C API functions */ - -/* Total number of symbols that are exported */ -#define PyGreenlet_API_pointers 12 - -#define PyGreenlet_Type_NUM 0 -#define PyExc_GreenletError_NUM 1 -#define PyExc_GreenletExit_NUM 2 - -#define PyGreenlet_New_NUM 3 -#define PyGreenlet_GetCurrent_NUM 4 -#define PyGreenlet_Throw_NUM 5 -#define PyGreenlet_Switch_NUM 6 -#define PyGreenlet_SetParent_NUM 7 - -#define PyGreenlet_MAIN_NUM 8 -#define PyGreenlet_STARTED_NUM 9 -#define PyGreenlet_ACTIVE_NUM 10 -#define PyGreenlet_GET_PARENT_NUM 11 - -#ifndef GREENLET_MODULE -/* This section is used by modules that uses the greenlet C API */ -static void** _PyGreenlet_API = NULL; - -# define PyGreenlet_Type \ - (*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM]) - -# define PyExc_GreenletError \ - ((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM]) - -# define PyExc_GreenletExit \ - ((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM]) - -/* - * PyGreenlet_New(PyObject *args) - * - * greenlet.greenlet(run, parent=None) - */ -# define PyGreenlet_New \ - (*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \ - _PyGreenlet_API[PyGreenlet_New_NUM]) - -/* - * PyGreenlet_GetCurrent(void) - * - * greenlet.getcurrent() - */ -# define PyGreenlet_GetCurrent \ - (*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) - -/* - * PyGreenlet_Throw( - * PyGreenlet *greenlet, - * PyObject *typ, - * PyObject *val, - * PyObject *tb) - * - * g.throw(...) - */ -# define PyGreenlet_Throw \ - (*(PyObject * (*)(PyGreenlet * self, \ - PyObject * typ, \ - PyObject * val, \ - PyObject * tb)) \ - _PyGreenlet_API[PyGreenlet_Throw_NUM]) - -/* - * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) - * - * g.switch(*args, **kwargs) - */ -# define PyGreenlet_Switch \ - (*(PyObject * \ - (*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \ - _PyGreenlet_API[PyGreenlet_Switch_NUM]) - -/* - * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) - * - * g.parent = new_parent - */ -# define PyGreenlet_SetParent \ - (*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \ - _PyGreenlet_API[PyGreenlet_SetParent_NUM]) - -/* - * PyGreenlet_GetParent(PyObject* greenlet) - * - * return greenlet.parent; - * - * This could return NULL even if there is no exception active. - * If it does not return NULL, you are responsible for decrementing the - * reference count. - */ -# define PyGreenlet_GetParent \ - (*(PyGreenlet* (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_GET_PARENT_NUM]) - -/* - * deprecated, undocumented alias. - */ -# define PyGreenlet_GET_PARENT PyGreenlet_GetParent - -# define PyGreenlet_MAIN \ - (*(int (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_MAIN_NUM]) - -# define PyGreenlet_STARTED \ - (*(int (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_STARTED_NUM]) - -# define PyGreenlet_ACTIVE \ - (*(int (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_ACTIVE_NUM]) - - - - -/* Macro that imports greenlet and initializes C API */ -/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we - keep the older definition to be sure older code that might have a copy of - the header still works. */ -# define PyGreenlet_Import() \ - { \ - _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ - } - -#endif /* GREENLET_MODULE */ - -#ifdef __cplusplus -} -#endif -#endif /* !Py_GREENLETOBJECT_H */ diff --git a/blog-app/venv/Lib/site-packages/greenlet/greenlet_allocator.hpp b/blog-app/venv/Lib/site-packages/greenlet/greenlet_allocator.hpp deleted file mode 100644 index b452f54..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/greenlet_allocator.hpp +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef GREENLET_ALLOCATOR_HPP -#define GREENLET_ALLOCATOR_HPP - -#define PY_SSIZE_T_CLEAN -#include -#include -#include "greenlet_compiler_compat.hpp" - - -namespace greenlet -{ - // This allocator is stateless; all instances are identical. - // It can *ONLY* be used when we're sure we're holding the GIL - // (Python's allocators require the GIL). - template - struct PythonAllocator : public std::allocator { - - PythonAllocator(const PythonAllocator& UNUSED(other)) - : std::allocator() - { - } - - PythonAllocator(const std::allocator other) - : std::allocator(other) - {} - - template - PythonAllocator(const std::allocator& other) - : std::allocator(other) - { - } - - PythonAllocator() : std::allocator() {} - - T* allocate(size_t number_objects, const void* UNUSED(hint)=0) - { - void* p; - if (number_objects == 1) - p = PyObject_Malloc(sizeof(T)); - else - p = PyMem_Malloc(sizeof(T) * number_objects); - return static_cast(p); - } - - void deallocate(T* t, size_t n) - { - void* p = t; - if (n == 1) { - PyObject_Free(p); - } - else - PyMem_Free(p); - } - // This member is deprecated in C++17 and removed in C++20 - template< class U > - struct rebind { - typedef PythonAllocator other; - }; - - }; -} - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/greenlet_compiler_compat.hpp b/blog-app/venv/Lib/site-packages/greenlet/greenlet_compiler_compat.hpp deleted file mode 100644 index af24bd8..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/greenlet_compiler_compat.hpp +++ /dev/null @@ -1,98 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -#ifndef GREENLET_COMPILER_COMPAT_HPP -#define GREENLET_COMPILER_COMPAT_HPP - -/** - * Definitions to aid with compatibility with different compilers. - * - * .. caution:: Use extreme care with noexcept. - * Some compilers and runtimes, specifically gcc/libgcc/libstdc++ on - * Linux, implement stack unwinding by throwing an uncatchable - * exception, one that specifically does not appear to be an active - * exception to the rest of the runtime. If this happens while we're in a noexcept function, - * we have violated our dynamic exception contract, and so the runtime - * will call std::terminate(), which kills the process with the - * unhelpful message "terminate called without an active exception". - * - * This has happened in this scenario: A background thread is running - * a greenlet that has made a native call and released the GIL. - * Meanwhile, the main thread finishes and starts shutting down the - * interpreter. When the background thread is scheduled again and - * attempts to obtain the GIL, it notices that the interpreter is - * exiting and calls ``pthread_exit()``. This in turn starts to unwind - * the stack by throwing that exception. But we had the ``PyCall`` - * functions annotated as noexcept, so the runtime terminated us. - * - * #2 0x00007fab26fec2b7 in std::terminate() () from /lib/x86_64-linux-gnu/libstdc++.so.6 - * #3 0x00007fab26febb3c in __gxx_personality_v0 () from /lib/x86_64-linux-gnu/libstdc++.so.6 - * #4 0x00007fab26f34de6 in ?? () from /lib/x86_64-linux-gnu/libgcc_s.so.1 - * #6 0x00007fab276a34c6 in __GI___pthread_unwind at ./nptl/unwind.c:130 - * #7 0x00007fab2769bd3a in __do_cancel () at ../sysdeps/nptl/pthreadP.h:280 - * #8 __GI___pthread_exit (value=value@entry=0x0) at ./nptl/pthread_exit.c:36 - * #9 0x000000000052e567 in PyThread_exit_thread () at ../Python/thread_pthread.h:370 - * #10 0x00000000004d60b5 in take_gil at ../Python/ceval_gil.h:224 - * #11 0x00000000004d65f9 in PyEval_RestoreThread at ../Python/ceval.c:467 - * #12 0x000000000060cce3 in setipaddr at ../Modules/socketmodule.c:1203 - * #13 0x00000000006101cd in socket_gethostbyname - */ - -#include - -# define G_NO_COPIES_OF_CLS(Cls) private: \ - Cls(const Cls& other) = delete; \ - Cls& operator=(const Cls& other) = delete - -# define G_NO_ASSIGNMENT_OF_CLS(Cls) private: \ - Cls& operator=(const Cls& other) = delete - -# define G_NO_COPY_CONSTRUCTOR_OF_CLS(Cls) private: \ - Cls(const Cls& other) = delete; - - -// CAUTION: MSVC is stupidly picky: -// -// "The compiler ignores, without warning, any __declspec keywords -// placed after * or & and in front of the variable identifier in a -// declaration." -// (https://docs.microsoft.com/en-us/cpp/cpp/declspec?view=msvc-160) -// -// So pointer return types must be handled differently (because of the -// trailing *), or you get inscrutable compiler warnings like "error -// C2059: syntax error: ''" -// -// In C++ 11, there is a standard syntax for attributes, and -// GCC defines an attribute to use with this: [[gnu:noinline]]. -// In the future, this is expected to become standard. - -#if defined(__GNUC__) || defined(__clang__) -/* We used to check for GCC 4+ or 3.4+, but those compilers are - laughably out of date. Just assume they support it. */ -# define GREENLET_NOINLINE(name) __attribute__((noinline)) name -# define GREENLET_NOINLINE_P(rtype, name) rtype __attribute__((noinline)) name -# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__)) -#elif defined(_MSC_VER) -/* We used to check for && (_MSC_VER >= 1300) but that's also out of date. */ -# define GREENLET_NOINLINE(name) __declspec(noinline) name -# define GREENLET_NOINLINE_P(rtype, name) __declspec(noinline) rtype name -# define UNUSED(x) UNUSED_ ## x -#endif - -#if defined(_MSC_VER) -# define G_NOEXCEPT_WIN32 noexcept -#else -# define G_NOEXCEPT_WIN32 -#endif - -#if defined(__GNUC__) && defined(__POWERPC__) && defined(__APPLE__) -// 32-bit PPC/MacOSX. Only known to be tested on unreleased versions -// of macOS 10.6 using a macports build gcc 14. It appears that -// running C++ destructors of thread-local variables is broken. - -// See https://github.com/python-greenlet/greenlet/pull/419 -# define GREENLET_BROKEN_THREAD_LOCAL_CLEANUP_JUST_LEAK 1 -#else -# define GREENLET_BROKEN_THREAD_LOCAL_CLEANUP_JUST_LEAK 0 -#endif - - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/greenlet_cpython_compat.hpp b/blog-app/venv/Lib/site-packages/greenlet/greenlet_cpython_compat.hpp deleted file mode 100644 index 979d6f9..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/greenlet_cpython_compat.hpp +++ /dev/null @@ -1,148 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -#ifndef GREENLET_CPYTHON_COMPAT_H -#define GREENLET_CPYTHON_COMPAT_H - -/** - * Helpers for compatibility with multiple versions of CPython. - */ - -#define PY_SSIZE_T_CLEAN -#include "Python.h" - - -#if PY_VERSION_HEX >= 0x30A00B1 -# define GREENLET_PY310 1 -#else -# define GREENLET_PY310 0 -#endif - -/* -Python 3.10 beta 1 changed tstate->use_tracing to a nested cframe member. -See https://github.com/python/cpython/pull/25276 -We have to save and restore this as well. - -Python 3.13 removed PyThreadState.cframe (GH-108035). -*/ -#if GREENLET_PY310 && PY_VERSION_HEX < 0x30D0000 -# define GREENLET_USE_CFRAME 1 -#else -# define GREENLET_USE_CFRAME 0 -#endif - - -#if PY_VERSION_HEX >= 0x30B00A4 -/* -Greenlet won't compile on anything older than Python 3.11 alpha 4 (see -https://bugs.python.org/issue46090). Summary of breaking internal changes: -- Python 3.11 alpha 1 changed how frame objects are represented internally. - - https://github.com/python/cpython/pull/30122 -- Python 3.11 alpha 3 changed how recursion limits are stored. - - https://github.com/python/cpython/pull/29524 -- Python 3.11 alpha 4 changed how exception state is stored. It also includes a - change to help greenlet save and restore the interpreter frame "data stack". - - https://github.com/python/cpython/pull/30122 - - https://github.com/python/cpython/pull/30234 -*/ -# define GREENLET_PY311 1 -#else -# define GREENLET_PY311 0 -#endif - - -#if PY_VERSION_HEX >= 0x30C0000 -# define GREENLET_PY312 1 -#else -# define GREENLET_PY312 0 -#endif - -#if PY_VERSION_HEX >= 0x30D0000 -# define GREENLET_PY313 1 -#else -# define GREENLET_PY313 0 -#endif - -#if PY_VERSION_HEX >= 0x30E0000 -# define GREENLET_PY314 1 -#else -# define GREENLET_PY314 0 -#endif - -#ifndef Py_SET_REFCNT -/* Py_REFCNT and Py_SIZE macros are converted to functions -https://bugs.python.org/issue39573 */ -# define Py_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) -#endif - -#ifndef _Py_DEC_REFTOTAL -/* _Py_DEC_REFTOTAL macro has been removed from Python 3.9 by: - https://github.com/python/cpython/commit/49932fec62c616ec88da52642339d83ae719e924 - - The symbol we use to replace it was removed by at least 3.12. -*/ -# ifdef Py_REF_DEBUG -# if GREENLET_PY312 -# define _Py_DEC_REFTOTAL -# else -# define _Py_DEC_REFTOTAL _Py_RefTotal-- -# endif -# else -# define _Py_DEC_REFTOTAL -# endif -#endif -// Define these flags like Cython does if we're on an old version. -#ifndef Py_TPFLAGS_CHECKTYPES - #define Py_TPFLAGS_CHECKTYPES 0 -#endif -#ifndef Py_TPFLAGS_HAVE_INDEX - #define Py_TPFLAGS_HAVE_INDEX 0 -#endif -#ifndef Py_TPFLAGS_HAVE_NEWBUFFER - #define Py_TPFLAGS_HAVE_NEWBUFFER 0 -#endif - -#ifndef Py_TPFLAGS_HAVE_VERSION_TAG - #define Py_TPFLAGS_HAVE_VERSION_TAG 0 -#endif - -#define G_TPFLAGS_DEFAULT Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_VERSION_TAG | Py_TPFLAGS_CHECKTYPES | Py_TPFLAGS_HAVE_NEWBUFFER | Py_TPFLAGS_HAVE_GC - - -#if PY_VERSION_HEX < 0x03090000 -// The official version only became available in 3.9 -# define PyObject_GC_IsTracked(o) _PyObject_GC_IS_TRACKED(o) -#endif - - -// bpo-43760 added PyThreadState_EnterTracing() to Python 3.11.0a2 -#if PY_VERSION_HEX < 0x030B00A2 && !defined(PYPY_VERSION) -static inline void PyThreadState_EnterTracing(PyThreadState *tstate) -{ - tstate->tracing++; -#if PY_VERSION_HEX >= 0x030A00A1 - tstate->cframe->use_tracing = 0; -#else - tstate->use_tracing = 0; -#endif -} -#endif - -// bpo-43760 added PyThreadState_LeaveTracing() to Python 3.11.0a2 -#if PY_VERSION_HEX < 0x030B00A2 && !defined(PYPY_VERSION) -static inline void PyThreadState_LeaveTracing(PyThreadState *tstate) -{ - tstate->tracing--; - int use_tracing = (tstate->c_tracefunc != NULL - || tstate->c_profilefunc != NULL); -#if PY_VERSION_HEX >= 0x030A00A1 - tstate->cframe->use_tracing = use_tracing; -#else - tstate->use_tracing = use_tracing; -#endif -} -#endif - -#if !defined(Py_C_RECURSION_LIMIT) && defined(C_RECURSION_LIMIT) -# define Py_C_RECURSION_LIMIT C_RECURSION_LIMIT -#endif - -#endif /* GREENLET_CPYTHON_COMPAT_H */ diff --git a/blog-app/venv/Lib/site-packages/greenlet/greenlet_exceptions.hpp b/blog-app/venv/Lib/site-packages/greenlet/greenlet_exceptions.hpp deleted file mode 100644 index 617f07c..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/greenlet_exceptions.hpp +++ /dev/null @@ -1,171 +0,0 @@ -#ifndef GREENLET_EXCEPTIONS_HPP -#define GREENLET_EXCEPTIONS_HPP - -#define PY_SSIZE_T_CLEAN -#include -#include -#include - -#ifdef __clang__ -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wunused-function" -#endif - -namespace greenlet { - - class PyErrOccurred : public std::runtime_error - { - public: - - // CAUTION: In debug builds, may run arbitrary Python code. - static const PyErrOccurred - from_current() - { - assert(PyErr_Occurred()); -#ifndef NDEBUG - // This is not exception safe, and - // not necessarily safe in general (what if it switches?) - // But we only do this in debug mode, where we are in - // tight control of what exceptions are getting raised and - // can prevent those issues. - - // You can't call PyObject_Str with a pending exception. - PyObject* typ; - PyObject* val; - PyObject* tb; - - PyErr_Fetch(&typ, &val, &tb); - PyObject* typs = PyObject_Str(typ); - PyObject* vals = PyObject_Str(val ? val : typ); - const char* typ_msg = PyUnicode_AsUTF8(typs); - const char* val_msg = PyUnicode_AsUTF8(vals); - PyErr_Restore(typ, val, tb); - - std::string msg(typ_msg); - msg += ": "; - msg += val_msg; - PyErrOccurred ex(msg); - Py_XDECREF(typs); - Py_XDECREF(vals); - - return ex; -#else - return PyErrOccurred(); -#endif - } - - PyErrOccurred() : std::runtime_error("") - { - assert(PyErr_Occurred()); - } - - PyErrOccurred(const std::string& msg) : std::runtime_error(msg) - { - assert(PyErr_Occurred()); - } - - PyErrOccurred(PyObject* exc_kind, const char* const msg) - : std::runtime_error(msg) - { - PyErr_SetString(exc_kind, msg); - } - - PyErrOccurred(PyObject* exc_kind, const std::string msg) - : std::runtime_error(msg) - { - // This copies the c_str, so we don't have any lifetime - // issues to worry about. - PyErr_SetString(exc_kind, msg.c_str()); - } - - PyErrOccurred(PyObject* exc_kind, - const std::string msg, //This is the format - //string; that's not - //usually safe! - - PyObject* borrowed_obj_one, PyObject* borrowed_obj_two) - : std::runtime_error(msg) - { - - //This is designed specifically for the - //``check_switch_allowed`` function. - - // PyObject_Str and PyObject_Repr are safe to call with - // NULL pointers; they return the string "" in that - // case. - // This function always returns null. - PyErr_Format(exc_kind, - msg.c_str(), - borrowed_obj_one, borrowed_obj_two); - } - }; - - class TypeError : public PyErrOccurred - { - public: - TypeError(const char* const what) - : PyErrOccurred(PyExc_TypeError, what) - { - } - TypeError(const std::string what) - : PyErrOccurred(PyExc_TypeError, what) - { - } - }; - - class ValueError : public PyErrOccurred - { - public: - ValueError(const char* const what) - : PyErrOccurred(PyExc_ValueError, what) - { - } - }; - - class AttributeError : public PyErrOccurred - { - public: - AttributeError(const char* const what) - : PyErrOccurred(PyExc_AttributeError, what) - { - } - }; - - /** - * Calls `Py_FatalError` when constructed, so you can't actually - * throw this. It just makes static analysis easier. - */ - class PyFatalError : public std::runtime_error - { - public: - PyFatalError(const char* const msg) - : std::runtime_error(msg) - { - Py_FatalError(msg); - } - }; - - static inline PyObject* - Require(PyObject* p, const std::string& msg="") - { - if (!p) { - throw PyErrOccurred(msg); - } - return p; - }; - - static inline void - Require(const int retval) - { - if (retval < 0) { - throw PyErrOccurred(); - } - }; - - -}; -#ifdef __clang__ -# pragma clang diagnostic pop -#endif - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/greenlet_internal.hpp b/blog-app/venv/Lib/site-packages/greenlet/greenlet_internal.hpp deleted file mode 100644 index f2b15d5..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/greenlet_internal.hpp +++ /dev/null @@ -1,107 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -#ifndef GREENLET_INTERNAL_H -#define GREENLET_INTERNAL_H -#ifdef __clang__ -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wunused-function" -#endif - -/** - * Implementation helpers. - * - * C++ templates and inline functions should go here. - */ -#define PY_SSIZE_T_CLEAN -#include "greenlet_compiler_compat.hpp" -#include "greenlet_cpython_compat.hpp" -#include "greenlet_exceptions.hpp" -#include "TGreenlet.hpp" -#include "greenlet_allocator.hpp" - -#include -#include - -#define GREENLET_MODULE -struct _greenlet; -typedef struct _greenlet PyGreenlet; -namespace greenlet { - - class ThreadState; - // We can't use the PythonAllocator for this, because we push to it - // from the thread state destructor, which doesn't have the GIL, - // and Python's allocators can only be called with the GIL. - typedef std::vector cleanup_queue_t; - -}; - - -#define implementation_ptr_t greenlet::Greenlet* - - -#include "greenlet.h" - -void -greenlet::refs::MainGreenletExactChecker(void *p) -{ - if (!p) { - return; - } - // We control the class of the main greenlet exactly. - if (Py_TYPE(p) != &PyGreenlet_Type) { - std::string err("MainGreenlet: Expected exactly a greenlet, not a "); - err += Py_TYPE(p)->tp_name; - throw greenlet::TypeError(err); - } - - // Greenlets from dead threads no longer respond to main() with a - // true value; so in that case we need to perform an additional - // check. - Greenlet* g = static_cast(p)->pimpl; - if (g->main()) { - return; - } - if (!dynamic_cast(g)) { - std::string err("MainGreenlet: Expected exactly a main greenlet, not a "); - err += Py_TYPE(p)->tp_name; - throw greenlet::TypeError(err); - } -} - - - -template -inline greenlet::Greenlet* greenlet::refs::_OwnedGreenlet::operator->() const noexcept -{ - return reinterpret_cast(this->p)->pimpl; -} - -template -inline greenlet::Greenlet* greenlet::refs::_BorrowedGreenlet::operator->() const noexcept -{ - return reinterpret_cast(this->p)->pimpl; -} - -#include -#include - - -extern PyTypeObject PyGreenlet_Type; - - - -/** - * Forward declarations needed in multiple files. - */ -static PyObject* green_switch(PyGreenlet* self, PyObject* args, PyObject* kwargs); - - -#ifdef __clang__ -# pragma clang diagnostic pop -#endif - - -#endif - -// Local Variables: -// flycheck-clang-include-path: ("../../include" "/opt/local/Library/Frameworks/Python.framework/Versions/3.10/include/python3.10") -// End: diff --git a/blog-app/venv/Lib/site-packages/greenlet/greenlet_refs.hpp b/blog-app/venv/Lib/site-packages/greenlet/greenlet_refs.hpp deleted file mode 100644 index b7e5e3f..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/greenlet_refs.hpp +++ /dev/null @@ -1,1118 +0,0 @@ -#ifndef GREENLET_REFS_HPP -#define GREENLET_REFS_HPP - -#define PY_SSIZE_T_CLEAN -#include - -#include - -//#include "greenlet_internal.hpp" -#include "greenlet_compiler_compat.hpp" -#include "greenlet_cpython_compat.hpp" -#include "greenlet_exceptions.hpp" - -struct _greenlet; -struct _PyMainGreenlet; - -typedef struct _greenlet PyGreenlet; -extern PyTypeObject PyGreenlet_Type; - - -#ifdef GREENLET_USE_STDIO -#include -using std::cerr; -using std::endl; -#endif - -namespace greenlet -{ - class Greenlet; - - namespace refs - { - // Type checkers throw a TypeError if the argument is not - // null, and isn't of the required Python type. - // (We can't use most of the defined type checkers - // like PyList_Check, etc, directly, because they are - // implemented as macros.) - typedef void (*TypeChecker)(void*); - - void - NoOpChecker(void*) - { - return; - } - - void - GreenletChecker(void *p) - { - if (!p) { - return; - } - - PyTypeObject* typ = Py_TYPE(p); - // fast, common path. (PyObject_TypeCheck is a macro or - // static inline function, and it also does a - // direct comparison of the type pointers, but its fast - // path only handles one type) - if (typ == &PyGreenlet_Type) { - return; - } - - if (!PyObject_TypeCheck(p, &PyGreenlet_Type)) { - std::string err("GreenletChecker: Expected any type of greenlet, not "); - err += Py_TYPE(p)->tp_name; - throw TypeError(err); - } - } - - void - MainGreenletExactChecker(void *p); - - template - class PyObjectPointer; - - template - class OwnedReference; - - - template - class BorrowedReference; - - typedef BorrowedReference BorrowedObject; - typedef OwnedReference OwnedObject; - - class ImmortalObject; - class ImmortalString; - - template - class _OwnedGreenlet; - - typedef _OwnedGreenlet OwnedGreenlet; - typedef _OwnedGreenlet OwnedMainGreenlet; - - template - class _BorrowedGreenlet; - - typedef _BorrowedGreenlet BorrowedGreenlet; - - void - ContextExactChecker(void *p) - { - if (!p) { - return; - } - if (!PyContext_CheckExact(p)) { - throw TypeError( - "greenlet context must be a contextvars.Context or None" - ); - } - } - - typedef OwnedReference OwnedContext; - } -} - -namespace greenlet { - - - namespace refs { - // A set of classes to make reference counting rules in python - // code explicit. - // - // Rules of use: - // (1) Functions returning a new reference that the caller of the - // function is expected to dispose of should return a - // ``OwnedObject`` object. This object automatically releases its - // reference when it goes out of scope. It works like a ``std::shared_ptr`` - // and can be copied or used as a function parameter (but don't do - // that). Note that constructing a ``OwnedObject`` from a - // PyObject* steals the reference. - // (2) Parameters to functions should be either a - // ``OwnedObject&``, or, more generally, a ``PyObjectPointer&``. - // If the function needs to create its own new reference, it can - // do so by copying to a local ``OwnedObject``. - // (3) Functions returning an existing pointer that is NOT - // incref'd, and which the caller MUST NOT decref, - // should return a ``BorrowedObject``. - - // XXX: The following two paragraphs do not hold for all platforms. - // Notably, 32-bit PPC Linux passes structs by reference, not by - // value, so this actually doesn't work. (Although that's the only - // platform that doesn't work on.) DO NOT ATTEMPT IT. The - // unfortunate consequence of that is that the slots which we - // *know* are already type safe will wind up calling the type - // checker function (when we had the slots accepting - // BorrowedGreenlet, this was bypassed), so this slows us down. - // TODO: Optimize this again. - - // For a class with a single pointer member, whose constructor - // does nothing but copy a pointer parameter into the member, and - // which can then be converted back to the pointer type, compilers - // generate code that's the same as just passing the pointer. - // That is, func(BorrowedObject x) called like ``PyObject* p = - // ...; f(p)`` has 0 overhead. Similarly, they "unpack" to the - // pointer type with 0 overhead. - // - // If there are no virtual functions, no complex inheritance (maybe?) and - // no destructor, these can be directly used as parameters in - // Python callbacks like tp_init: the layout is the same as a - // single pointer. Only subclasses with trivial constructors that - // do nothing but set the single pointer member are safe to use - // that way. - - - // This is the base class for things that can be done with a - // PyObject pointer. It assumes nothing about memory management. - // NOTE: Nothing is virtual, so subclasses shouldn't add new - // storage fields or try to override these methods. - template - class PyObjectPointer - { - public: - typedef T PyType; - protected: - T* p; - public: - PyObjectPointer(T* it=nullptr) : p(it) - { - TC(p); - } - - // We don't allow automatic casting to PyObject* at this - // level, because then we could be passed to Py_DECREF/INCREF, - // but we want nothing to do with memory management. If you - // know better, then you can use the get() method, like on a - // std::shared_ptr. Except we name it borrow() to clarify that - // if this is a reference-tracked object, the pointer you get - // back will go away when the object does. - // TODO: This should probably not exist here, but be moved - // down to relevant sub-types. - - T* borrow() const noexcept - { - return this->p; - } - - PyObject* borrow_o() const noexcept - { - return reinterpret_cast(this->p); - } - - T* operator->() const noexcept - { - return this->p; - } - - bool is_None() const noexcept - { - return this->p == Py_None; - } - - PyObject* acquire_or_None() const noexcept - { - PyObject* result = this->p ? reinterpret_cast(this->p) : Py_None; - Py_INCREF(result); - return result; - } - - explicit operator bool() const noexcept - { - return this->p != nullptr; - } - - bool operator!() const noexcept - { - return this->p == nullptr; - } - - Py_ssize_t REFCNT() const noexcept - { - return p ? Py_REFCNT(p) : -42; - } - - PyTypeObject* TYPE() const noexcept - { - return p ? Py_TYPE(p) : nullptr; - } - - inline OwnedObject PyStr() const noexcept; - inline const std::string as_str() const noexcept; - inline OwnedObject PyGetAttr(const ImmortalObject& name) const noexcept; - inline OwnedObject PyRequireAttr(const char* const name) const; - inline OwnedObject PyRequireAttr(const ImmortalString& name) const; - inline OwnedObject PyCall(const BorrowedObject& arg) const; - inline OwnedObject PyCall(PyGreenlet* arg) const ; - inline OwnedObject PyCall(PyObject* arg) const ; - // PyObject_Call(this, args, kwargs); - inline OwnedObject PyCall(const BorrowedObject args, - const BorrowedObject kwargs) const; - inline OwnedObject PyCall(const OwnedObject& args, - const OwnedObject& kwargs) const; - - protected: - void _set_raw_pointer(void* t) - { - TC(t); - p = reinterpret_cast(t); - } - void* _get_raw_pointer() const - { - return p; - } - }; - -#ifdef GREENLET_USE_STDIO - template - std::ostream& operator<<(std::ostream& os, const PyObjectPointer& s) - { - const std::type_info& t = typeid(s); - os << t.name() - << "(addr=" << s.borrow() - << ", refcnt=" << s.REFCNT() - << ", value=" << s.as_str() - << ")"; - - return os; - } -#endif - - template - inline bool operator==(const PyObjectPointer& lhs, const PyObject* const rhs) noexcept - { - return static_cast(lhs.borrow_o()) == static_cast(rhs); - } - - template - inline bool operator==(const PyObjectPointer& lhs, const PyObjectPointer& rhs) noexcept - { - return lhs.borrow_o() == rhs.borrow_o(); - } - - template - inline bool operator!=(const PyObjectPointer& lhs, - const PyObjectPointer& rhs) noexcept - { - return lhs.borrow_o() != rhs.borrow_o(); - } - - template - class OwnedReference : public PyObjectPointer - { - private: - friend class OwnedList; - - protected: - explicit OwnedReference(T* it) : PyObjectPointer(it) - { - } - - public: - - // Constructors - - static OwnedReference consuming(PyObject* p) - { - return OwnedReference(reinterpret_cast(p)); - } - - static OwnedReference owning(T* p) - { - OwnedReference result(p); - Py_XINCREF(result.p); - return result; - } - - OwnedReference() : PyObjectPointer(nullptr) - {} - - explicit OwnedReference(const PyObjectPointer<>& other) - : PyObjectPointer(nullptr) - { - T* op = other.borrow(); - TC(op); - this->p = other.borrow(); - Py_XINCREF(this->p); - } - - // It would be good to make use of the C++11 distinction - // between move and copy operations, e.g., constructing from a - // pointer should be a move operation. - // In the common case of ``OwnedObject x = Py_SomeFunction()``, - // the call to the copy constructor will be elided completely. - OwnedReference(const OwnedReference& other) - : PyObjectPointer(other.p) - { - Py_XINCREF(this->p); - } - - static OwnedReference None() - { - Py_INCREF(Py_None); - return OwnedReference(Py_None); - } - - // We can assign from exactly our type without any extra checking - OwnedReference& operator=(const OwnedReference& other) - { - Py_XINCREF(other.p); - const T* tmp = this->p; - this->p = other.p; - Py_XDECREF(tmp); - return *this; - } - - OwnedReference& operator=(const BorrowedReference other) - { - return this->operator=(other.borrow()); - } - - OwnedReference& operator=(T* const other) - { - TC(other); - Py_XINCREF(other); - T* tmp = this->p; - this->p = other; - Py_XDECREF(tmp); - return *this; - } - - // We can assign from an arbitrary reference type - // if it passes our check. - template - OwnedReference& operator=(const OwnedReference& other) - { - X* op = other.borrow(); - TC(op); - return this->operator=(reinterpret_cast(op)); - } - - inline void steal(T* other) - { - assert(this->p == nullptr); - TC(other); - this->p = other; - } - - T* relinquish_ownership() - { - T* result = this->p; - this->p = nullptr; - return result; - } - - T* acquire() const - { - // Return a new reference. - // TODO: This may go away when we have reference objects - // throughout the code. - Py_XINCREF(this->p); - return this->p; - } - - // Nothing else declares a destructor, we're the leaf, so we - // should be able to get away without virtual. - ~OwnedReference() - { - Py_CLEAR(this->p); - } - - void CLEAR() - { - Py_CLEAR(this->p); - assert(this->p == nullptr); - } - }; - - static inline - void operator<<=(PyObject*& target, OwnedObject& o) - { - target = o.relinquish_ownership(); - } - - - class NewReference : public OwnedObject - { - private: - G_NO_COPIES_OF_CLS(NewReference); - public: - // Consumes the reference. Only use this - // for API return values. - NewReference(PyObject* it) : OwnedObject(it) - { - } - }; - - class NewDictReference : public NewReference - { - private: - G_NO_COPIES_OF_CLS(NewDictReference); - public: - NewDictReference() : NewReference(PyDict_New()) - { - if (!this->p) { - throw PyErrOccurred(); - } - } - - void SetItem(const char* const key, PyObject* value) - { - Require(PyDict_SetItemString(this->p, key, value)); - } - - void SetItem(const PyObjectPointer<>& key, PyObject* value) - { - Require(PyDict_SetItem(this->p, key.borrow_o(), value)); - } - }; - - template - class _OwnedGreenlet: public OwnedReference - { - private: - protected: - _OwnedGreenlet(T* it) : OwnedReference(it) - {} - - public: - _OwnedGreenlet() : OwnedReference() - {} - - _OwnedGreenlet(const _OwnedGreenlet& other) : OwnedReference(other) - { - } - _OwnedGreenlet(OwnedMainGreenlet& other) : - OwnedReference(reinterpret_cast(other.acquire())) - { - } - _OwnedGreenlet(const BorrowedGreenlet& other); - // Steals a reference. - static _OwnedGreenlet consuming(PyGreenlet* it) - { - return _OwnedGreenlet(reinterpret_cast(it)); - } - - inline _OwnedGreenlet& operator=(const OwnedGreenlet& other) - { - return this->operator=(other.borrow()); - } - - inline _OwnedGreenlet& operator=(const BorrowedGreenlet& other); - - _OwnedGreenlet& operator=(const OwnedMainGreenlet& other) - { - PyGreenlet* owned = other.acquire(); - Py_XDECREF(this->p); - this->p = reinterpret_cast(owned); - return *this; - } - - _OwnedGreenlet& operator=(T* const other) - { - OwnedReference::operator=(other); - return *this; - } - - T* relinquish_ownership() - { - T* result = this->p; - this->p = nullptr; - return result; - } - - PyObject* relinquish_ownership_o() - { - return reinterpret_cast(relinquish_ownership()); - } - - inline Greenlet* operator->() const noexcept; - inline operator Greenlet*() const noexcept; - }; - - template - class BorrowedReference : public PyObjectPointer - { - public: - // Allow implicit creation from PyObject* pointers as we - // transition to using these classes. Also allow automatic - // conversion to PyObject* for passing to C API calls and even - // for Py_INCREF/DECREF, because we ourselves do no memory management. - BorrowedReference(T* it) : PyObjectPointer(it) - {} - - BorrowedReference(const PyObjectPointer& ref) : PyObjectPointer(ref.borrow()) - {} - - BorrowedReference() : PyObjectPointer(nullptr) - {} - - operator T*() const - { - return this->p; - } - }; - - typedef BorrowedReference BorrowedObject; - //typedef BorrowedReference BorrowedGreenlet; - - template - class _BorrowedGreenlet : public BorrowedReference - { - public: - _BorrowedGreenlet() : - BorrowedReference(nullptr) - {} - - _BorrowedGreenlet(T* it) : - BorrowedReference(it) - {} - - _BorrowedGreenlet(const BorrowedObject& it); - - _BorrowedGreenlet(const OwnedGreenlet& it) : - BorrowedReference(it.borrow()) - {} - - _BorrowedGreenlet& operator=(const BorrowedObject& other); - - // We get one of these for PyGreenlet, but one for PyObject - // is handy as well - operator PyObject*() const - { - return reinterpret_cast(this->p); - } - Greenlet* operator->() const noexcept; - operator Greenlet*() const noexcept; - }; - - typedef _BorrowedGreenlet BorrowedGreenlet; - - template - _OwnedGreenlet::_OwnedGreenlet(const BorrowedGreenlet& other) - : OwnedReference(reinterpret_cast(other.borrow())) - { - Py_XINCREF(this->p); - } - - - class BorrowedMainGreenlet - : public _BorrowedGreenlet - { - public: - BorrowedMainGreenlet(const OwnedMainGreenlet& it) : - _BorrowedGreenlet(it.borrow()) - {} - BorrowedMainGreenlet(PyGreenlet* it=nullptr) - : _BorrowedGreenlet(it) - {} - }; - - template - _OwnedGreenlet& _OwnedGreenlet::operator=(const BorrowedGreenlet& other) - { - return this->operator=(other.borrow()); - } - - - class ImmortalObject : public PyObjectPointer<> - { - private: - G_NO_ASSIGNMENT_OF_CLS(ImmortalObject); - public: - explicit ImmortalObject(PyObject* it) : PyObjectPointer<>(it) - { - } - - ImmortalObject(const ImmortalObject& other) - : PyObjectPointer<>(other.p) - { - - } - - /** - * Become the new owner of the object. Does not change the - * reference count. - */ - ImmortalObject& operator=(PyObject* it) - { - assert(this->p == nullptr); - this->p = it; - return *this; - } - - static ImmortalObject consuming(PyObject* it) - { - return ImmortalObject(it); - } - - inline operator PyObject*() const - { - return this->p; - } - }; - - class ImmortalString : public ImmortalObject - { - private: - G_NO_COPIES_OF_CLS(ImmortalString); - const char* str; - public: - ImmortalString(const char* const str) : - ImmortalObject(str ? Require(PyUnicode_InternFromString(str)) : nullptr) - { - this->str = str; - } - - inline ImmortalString& operator=(const char* const str) - { - if (!this->p) { - this->p = Require(PyUnicode_InternFromString(str)); - this->str = str; - } - else { - assert(this->str == str); - } - return *this; - } - - inline operator std::string() const - { - return this->str; - } - - }; - - class ImmortalEventName : public ImmortalString - { - private: - G_NO_COPIES_OF_CLS(ImmortalEventName); - public: - ImmortalEventName(const char* const str) : ImmortalString(str) - {} - }; - - class ImmortalException : public ImmortalObject - { - private: - G_NO_COPIES_OF_CLS(ImmortalException); - public: - ImmortalException(const char* const name, PyObject* base=nullptr) : - ImmortalObject(name - // Python 2.7 isn't const correct - ? Require(PyErr_NewException((char*)name, base, nullptr)) - : nullptr) - {} - - inline bool PyExceptionMatches() const - { - return PyErr_ExceptionMatches(this->p) > 0; - } - - }; - - template - inline OwnedObject PyObjectPointer::PyStr() const noexcept - { - if (!this->p) { - return OwnedObject(); - } - return OwnedObject::consuming(PyObject_Str(reinterpret_cast(this->p))); - } - - template - inline const std::string PyObjectPointer::as_str() const noexcept - { - // NOTE: This is not Python exception safe. - if (this->p) { - // The Python APIs return a cached char* value that's only valid - // as long as the original object stays around, and we're - // about to (probably) toss it. Hence the copy to std::string. - OwnedObject py_str = this->PyStr(); - if (!py_str) { - return "(nil)"; - } - return PyUnicode_AsUTF8(py_str.borrow()); - } - return "(nil)"; - } - - template - inline OwnedObject PyObjectPointer::PyGetAttr(const ImmortalObject& name) const noexcept - { - assert(this->p); - return OwnedObject::consuming(PyObject_GetAttr(reinterpret_cast(this->p), name)); - } - - template - inline OwnedObject PyObjectPointer::PyRequireAttr(const char* const name) const - { - assert(this->p); - return OwnedObject::consuming(Require(PyObject_GetAttrString(this->p, name), name)); - } - - template - inline OwnedObject PyObjectPointer::PyRequireAttr(const ImmortalString& name) const - { - assert(this->p); - return OwnedObject::consuming(Require( - PyObject_GetAttr( - reinterpret_cast(this->p), - name - ), - name - )); - } - - template - inline OwnedObject PyObjectPointer::PyCall(const BorrowedObject& arg) const - { - return this->PyCall(arg.borrow()); - } - - template - inline OwnedObject PyObjectPointer::PyCall(PyGreenlet* arg) const - { - return this->PyCall(reinterpret_cast(arg)); - } - - template - inline OwnedObject PyObjectPointer::PyCall(PyObject* arg) const - { - assert(this->p); - return OwnedObject::consuming(PyObject_CallFunctionObjArgs(this->p, arg, NULL)); - } - - template - inline OwnedObject PyObjectPointer::PyCall(const BorrowedObject args, - const BorrowedObject kwargs) const - { - assert(this->p); - return OwnedObject::consuming(PyObject_Call(this->p, args, kwargs)); - } - - template - inline OwnedObject PyObjectPointer::PyCall(const OwnedObject& args, - const OwnedObject& kwargs) const - { - assert(this->p); - return OwnedObject::consuming(PyObject_Call(this->p, args.borrow(), kwargs.borrow())); - } - - inline void - ListChecker(void * p) - { - if (!p) { - return; - } - if (!PyList_Check(p)) { - throw TypeError("Expected a list"); - } - } - - class OwnedList : public OwnedReference - { - private: - G_NO_ASSIGNMENT_OF_CLS(OwnedList); - public: - // TODO: Would like to use move. - explicit OwnedList(const OwnedObject& other) - : OwnedReference(other) - { - } - - OwnedList& operator=(const OwnedObject& other) - { - if (other && PyList_Check(other.p)) { - // Valid list. Own a new reference to it, discard the - // reference to what we did own. - PyObject* new_ptr = other.p; - Py_INCREF(new_ptr); - Py_XDECREF(this->p); - this->p = new_ptr; - } - else { - // Either the other object was NULL (an error) or it - // wasn't a list. Either way, we're now invalidated. - Py_XDECREF(this->p); - this->p = nullptr; - } - return *this; - } - - inline bool empty() const - { - return PyList_GET_SIZE(p) == 0; - } - - inline Py_ssize_t size() const - { - return PyList_GET_SIZE(p); - } - - inline BorrowedObject at(const Py_ssize_t index) const - { - return PyList_GET_ITEM(p, index); - } - - inline void clear() - { - PyList_SetSlice(p, 0, PyList_GET_SIZE(p), NULL); - } - }; - - // Use this to represent the module object used at module init - // time. - // This could either be a borrowed (Py2) or new (Py3) reference; - // either way, we don't want to do any memory management - // on it here, Python itself will handle that. - // XXX: Actually, that's not quite right. On Python 3, if an - // exception occurs before we return to the interpreter, this will - // leak; but all previous versions also had that problem. - class CreatedModule : public PyObjectPointer<> - { - private: - G_NO_COPIES_OF_CLS(CreatedModule); - public: - CreatedModule(PyModuleDef& mod_def) : PyObjectPointer<>( - Require(PyModule_Create(&mod_def))) - { - } - - // PyAddObject(): Add a reference to the object to the module. - // On return, the reference count of the object is unchanged. - // - // The docs warn that PyModule_AddObject only steals the - // reference on success, so if it fails after we've incref'd - // or allocated, we're responsible for the decref. - void PyAddObject(const char* name, const long new_bool) - { - OwnedObject p = OwnedObject::consuming(Require(PyBool_FromLong(new_bool))); - this->PyAddObject(name, p); - } - - void PyAddObject(const char* name, const OwnedObject& new_object) - { - // The caller already owns a reference they will decref - // when their variable goes out of scope, we still need to - // incref/decref. - this->PyAddObject(name, new_object.borrow()); - } - - void PyAddObject(const char* name, const ImmortalObject& new_object) - { - this->PyAddObject(name, new_object.borrow()); - } - - void PyAddObject(const char* name, PyTypeObject& type) - { - this->PyAddObject(name, reinterpret_cast(&type)); - } - - void PyAddObject(const char* name, PyObject* new_object) - { - Py_INCREF(new_object); - try { - Require(PyModule_AddObject(this->p, name, new_object)); - } - catch (const PyErrOccurred&) { - Py_DECREF(p); - throw; - } - } - }; - - class PyErrFetchParam : public PyObjectPointer<> - { - // Not an owned object, because we can't be initialized with - // one, and we only sometimes acquire ownership. - private: - G_NO_COPIES_OF_CLS(PyErrFetchParam); - public: - // To allow declaring these and passing them to - // PyErr_Fetch we implement the empty constructor, - // and the address operator. - PyErrFetchParam() : PyObjectPointer<>(nullptr) - { - } - - PyObject** operator&() - { - return &this->p; - } - - // This allows us to pass one directly without the &, - // BUT it has higher precedence than the bool operator - // if it's not explicit. - operator PyObject**() - { - return &this->p; - } - - // We don't want to be able to pass these to Py_DECREF and - // such so we don't have the implicit PyObject* conversion. - - inline PyObject* relinquish_ownership() - { - PyObject* result = this->p; - this->p = nullptr; - return result; - } - - ~PyErrFetchParam() - { - Py_XDECREF(p); - } - }; - - class OwnedErrPiece : public OwnedObject - { - private: - - public: - // Unlike OwnedObject, this increments the refcount. - OwnedErrPiece(PyObject* p=nullptr) : OwnedObject(p) - { - this->acquire(); - } - - PyObject** operator&() - { - return &this->p; - } - - inline operator PyObject*() const - { - return this->p; - } - - operator PyTypeObject*() const - { - return reinterpret_cast(this->p); - } - }; - - class PyErrPieces - { - private: - OwnedErrPiece type; - OwnedErrPiece instance; - OwnedErrPiece traceback; - bool restored; - public: - // Takes new references; if we're destroyed before - // restoring the error, we drop the references. - PyErrPieces(PyObject* t, PyObject* v, PyObject* tb) : - type(t), - instance(v), - traceback(tb), - restored(0) - { - this->normalize(); - } - - PyErrPieces() : - restored(0) - { - // PyErr_Fetch transfers ownership to us, so - // we don't actually need to INCREF; but we *do* - // need to DECREF if we're not restored. - PyErrFetchParam t, v, tb; - PyErr_Fetch(&t, &v, &tb); - type.steal(t.relinquish_ownership()); - instance.steal(v.relinquish_ownership()); - traceback.steal(tb.relinquish_ownership()); - } - - void PyErrRestore() - { - // can only do this once - assert(!this->restored); - this->restored = true; - PyErr_Restore( - this->type.relinquish_ownership(), - this->instance.relinquish_ownership(), - this->traceback.relinquish_ownership()); - assert(!this->type && !this->instance && !this->traceback); - } - - private: - void normalize() - { - // First, check the traceback argument, replacing None, - // with NULL - if (traceback.is_None()) { - traceback = nullptr; - } - - if (traceback && !PyTraceBack_Check(traceback.borrow())) { - throw PyErrOccurred(PyExc_TypeError, - "throw() third argument must be a traceback object"); - } - - if (PyExceptionClass_Check(type)) { - // If we just had a type, we'll now have a type and - // instance. - // The type's refcount will have gone up by one - // because of the instance and the instance will have - // a refcount of one. Either way, we owned, and still - // do own, exactly one reference. - PyErr_NormalizeException(&type, &instance, &traceback); - - } - else if (PyExceptionInstance_Check(type)) { - /* Raising an instance --- usually that means an - object that is a subclass of BaseException, but on - Python 2, that can also mean an arbitrary old-style - object. The value should be a dummy. */ - if (instance && !instance.is_None()) { - throw PyErrOccurred( - PyExc_TypeError, - "instance exception may not have a separate value"); - } - /* Normalize to raise , */ - this->instance = this->type; - this->type = PyExceptionInstance_Class(instance.borrow()); - - /* - It would be tempting to do this: - - Py_ssize_t type_count = Py_REFCNT(Py_TYPE(instance.borrow())); - this->type = PyExceptionInstance_Class(instance.borrow()); - assert(this->type.REFCNT() == type_count + 1); - - But that doesn't work on Python 2 in the case of - old-style instances: The result of Py_TYPE is going to - be the global shared that all - old-style classes have, while the return of Instance_Class() - will be the Python-level class object. The two are unrelated. - */ - } - else { - /* Not something you can raise. throw() fails. */ - PyErr_Format(PyExc_TypeError, - "exceptions must be classes, or instances, not %s", - Py_TYPE(type.borrow())->tp_name); - throw PyErrOccurred(); - } - } - }; - - // PyArg_Parse's O argument returns a borrowed reference. - class PyArgParseParam : public BorrowedObject - { - private: - G_NO_COPIES_OF_CLS(PyArgParseParam); - public: - explicit PyArgParseParam(PyObject* p=nullptr) : BorrowedObject(p) - { - } - - inline PyObject** operator&() - { - return &this->p; - } - }; - -};}; - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/greenlet_slp_switch.hpp b/blog-app/venv/Lib/site-packages/greenlet/greenlet_slp_switch.hpp deleted file mode 100644 index bd4b7ae..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/greenlet_slp_switch.hpp +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef GREENLET_SLP_SWITCH_HPP -#define GREENLET_SLP_SWITCH_HPP - -#include "greenlet_compiler_compat.hpp" -#include "greenlet_refs.hpp" - -/* - * the following macros are spliced into the OS/compiler - * specific code, in order to simplify maintenance. - */ -// We can save about 10% of the time it takes to switch greenlets if -// we thread the thread state through the slp_save_state() and the -// following slp_restore_state() calls from -// slp_switch()->g_switchstack() (which already needs to access it). -// -// However: -// -// that requires changing the prototypes and implementations of the -// switching functions. If we just change the prototype of -// slp_switch() to accept the argument and update the macros, without -// changing the implementation of slp_switch(), we get crashes on -// 64-bit Linux and 32-bit x86 (for reasons that aren't 100% clear); -// on the other hand, 64-bit macOS seems to be fine. Also, 64-bit -// windows is an issue because slp_switch is written fully in assembly -// and currently ignores its argument so some code would have to be -// adjusted there to pass the argument on to the -// ``slp_save_state_asm()`` function (but interestingly, because of -// the calling convention, the extra argument is just ignored and -// things function fine, albeit slower, if we just modify -// ``slp_save_state_asm`()` to fetch the pointer to pass to the -// macro.) -// -// Our compromise is to use a *glabal*, untracked, weak, pointer -// to the necessary thread state during the process of switching only. -// This is safe because we're protected by the GIL, and if we're -// running this code, the thread isn't exiting. This also nets us a -// 10-12% speed improvement. - -static greenlet::Greenlet* volatile switching_thread_state = nullptr; - - -extern "C" { -static int GREENLET_NOINLINE(slp_save_state_trampoline)(char* stackref); -static void GREENLET_NOINLINE(slp_restore_state_trampoline)(); -} - - -#define SLP_SAVE_STATE(stackref, stsizediff) \ -do { \ - assert(switching_thread_state); \ - stackref += STACK_MAGIC; \ - if (slp_save_state_trampoline((char*)stackref)) \ - return -1; \ - if (!switching_thread_state->active()) \ - return 1; \ - stsizediff = switching_thread_state->stack_start() - (char*)stackref; \ -} while (0) - -#define SLP_RESTORE_STATE() slp_restore_state_trampoline() - -#define SLP_EVAL -extern "C" { -#define slp_switch GREENLET_NOINLINE(slp_switch) -#include "slp_platformselect.h" -} -#undef slp_switch - -#ifndef STACK_MAGIC -# error \ - "greenlet needs to be ported to this platform, or taught how to detect your compiler properly." -#endif /* !STACK_MAGIC */ - - - -#ifdef EXTERNAL_ASM -/* CCP addition: Make these functions, to be called from assembler. - * The token include file for the given platform should enable the - * EXTERNAL_ASM define so that this is included. - */ -extern "C" { -intptr_t -slp_save_state_asm(intptr_t* ref) -{ - intptr_t diff; - SLP_SAVE_STATE(ref, diff); - return diff; -} - -void -slp_restore_state_asm(void) -{ - SLP_RESTORE_STATE(); -} - -extern int slp_switch(void); -}; -#endif - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/greenlet_thread_support.hpp b/blog-app/venv/Lib/site-packages/greenlet/greenlet_thread_support.hpp deleted file mode 100644 index 3ded7d2..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/greenlet_thread_support.hpp +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef GREENLET_THREAD_SUPPORT_HPP -#define GREENLET_THREAD_SUPPORT_HPP - -/** - * Defines various utility functions to help greenlet integrate well - * with threads. This used to be needed when we supported Python - * 2.7 on Windows, which used a very old compiler. We wrote an - * alternative implementation using Python APIs and POSIX or Windows - * APIs, but that's no longer needed. So this file is a shadow of its - * former self --- but may be needed in the future. - */ - -#include -#include -#include - -#include "greenlet_compiler_compat.hpp" - -namespace greenlet { - typedef std::mutex Mutex; - typedef std::lock_guard LockGuard; - class LockInitError : public std::runtime_error - { - public: - LockInitError(const char* what) : std::runtime_error(what) - {}; - }; -}; - - -#endif /* GREENLET_THREAD_SUPPORT_HPP */ diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/__init__.py b/blog-app/venv/Lib/site-packages/greenlet/platform/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/__pycache__/__init__.cpython-310.pyc b/blog-app/venv/Lib/site-packages/greenlet/platform/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 3054fd3b763fcc35e1d9057fa3ff74a3eb59b103..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmYk0u?oU46h%{U5TPI9P&+FkqT(dApl%Ops?RnwO+u0eieKc{xV!onPNpt;;hxLA zyy3|(91^e7V^Vhc>hQ0?mxZ_KdtAt#jDqA&bT|L-zOANkG^h?}DouoJk}%poir zjkNjhYjkiZF-l7YX=_UEq$hj;csuVaB4z?@@!z@OMo-10QfkGn+jy6`D+N;!c aoMlWfn`L9wJ_oZ}UK)<`?kUsr=#vkOqC9v2 diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/setup_switch_x64_masm.cmd b/blog-app/venv/Lib/site-packages/greenlet/platform/setup_switch_x64_masm.cmd deleted file mode 100644 index 038ced2..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/setup_switch_x64_masm.cmd +++ /dev/null @@ -1,2 +0,0 @@ -call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" amd64 -ml64 /nologo /c /Fo switch_x64_masm.obj switch_x64_masm.asm diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_aarch64_gcc.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_aarch64_gcc.h deleted file mode 100644 index 058617c..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_aarch64_gcc.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 07-Sep-16 Add clang support using x register naming. Fredrik Fornwall - * 13-Apr-13 Add support for strange GCC caller-save decisions - * 08-Apr-13 File creation. Michael Matz - * - * NOTES - * - * Simply save all callee saved registers - * - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL -#define STACK_MAGIC 0 -#define REGS_TO_SAVE "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", \ - "x27", "x28", "x30" /* aka lr */, \ - "v8", "v9", "v10", "v11", \ - "v12", "v13", "v14", "v15" - -/* - * Recall: - asm asm-qualifiers ( AssemblerTemplate - : OutputOperands - [ : InputOperands - [ : Clobbers ] ]) - - or (if asm-qualifiers contains 'goto') - - asm asm-qualifiers ( AssemblerTemplate - : OutputOperands - : InputOperands - : Clobbers - : GotoLabels) - - and OutputOperands are - - [ [asmSymbolicName] ] constraint (cvariablename) - - When a name is given, refer to it as ``%[the name]``. - When not given, ``%i`` where ``i`` is the zero-based index. - - constraints starting with ``=`` means only writing; ``+`` means - reading and writing. - - This is followed by ``r`` (must be register) or ``m`` (must be memory) - and these can be combined. - - The ``cvariablename`` is actually an lvalue expression. - - In AArch65, 31 general purpose registers. If named X0... they are - 64-bit. If named W0... they are the bottom 32 bits of the - corresponding 64 bit register. - - XZR and WZR are hardcoded to 0, and ignore writes. - - Arguments are in X0..X7. C++ uses X0 for ``this``. X0 holds simple return - values (?) - - Whenever a W register is written, the top half of the X register is zeroed. - */ - -static int -slp_switch(void) -{ - int err; - void *fp; - /* Windowz uses a 32-bit long on a 64-bit platform, unlike the rest of - the world, and in theory we can be compiled with GCC/llvm on 64-bit - windows. So we need a fixed-width type. - */ - int64_t *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("str x29, %0" : "=m"(fp) : : ); - __asm__ ("mov %0, sp" : "=r" (stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "add sp,sp,%0\n" - "add x29,x29,%0\n" - : - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - /* SLP_SAVE_STATE macro contains some return statements - (of -1 and 1). It falls through only when - the return value of slp_save_state() is zero, which - is placed in x0. - In that case we (slp_switch) also want to return zero - (also in x0 of course). - Now, some GCC versions (seen with 4.8) think it's a - good idea to save/restore x0 around the call to - slp_restore_state(), instead of simply zeroing it - at the return below. But slp_restore_state - writes random values to the stack slot used for this - save/restore (from when it once was saved above in - SLP_SAVE_STATE, when it was still uninitialized), so - "restoring" that precious zero actually makes us - return random values. There are some ways to make - GCC not use that zero value in the normal return path - (e.g. making err volatile, but that costs a little - stack space), and the simplest is to call a function - that returns an unknown value (which happens to be zero), - so the saved/restored value is unused. - - Thus, this line stores a 0 into the ``err`` variable - (which must be held in a register for this instruction, - of course). The ``w`` qualifier causes the instruction - to use W0 instead of X0, otherwise we get a warning - about a value size mismatch (because err is an int, - and aarch64 platforms are LP64: 32-bit int, 64 bit long - and pointer). - */ - __asm__ volatile ("mov %w0, #0" : "=r" (err)); - } - __asm__ volatile ("ldr x29, %0" : : "m" (fp) :); - __asm__ volatile ("" : : : REGS_TO_SAVE); - return err; -} - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_alpha_unix.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_alpha_unix.h deleted file mode 100644 index 7e07abf..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_alpha_unix.h +++ /dev/null @@ -1,30 +0,0 @@ -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL -#define STACK_MAGIC 0 - -#define REGS_TO_SAVE "$9", "$10", "$11", "$12", "$13", "$14", "$15", \ - "$f2", "$f3", "$f4", "$f5", "$f6", "$f7", "$f8", "$f9" - -static int -slp_switch(void) -{ - int ret; - long *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("mov $30, %0" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "addq $30, %0, $30\n\t" - : /* no outputs */ - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("mov $31, %0" : "=r" (ret) : ); - return ret; -} - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_amd64_unix.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_amd64_unix.h deleted file mode 100644 index d470110..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_amd64_unix.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 3-May-13 Ralf Schmitt - * Add support for strange GCC caller-save decisions - * (ported from switch_aarch64_gcc.h) - * 18-Aug-11 Alexey Borzenkov - * Correctly save rbp, csr and cw - * 01-Apr-04 Hye-Shik Chang - * Ported from i386 to amd64. - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for spark - * 31-Avr-02 Armin Rigo - * Added ebx, esi and edi register-saves. - * 01-Mar-02 Samual M. Rushing - * Ported from i386. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -/* #define STACK_MAGIC 3 */ -/* the above works fine with gcc 2.96, but 2.95.3 wants this */ -#define STACK_MAGIC 0 - -#define REGS_TO_SAVE "r12", "r13", "r14", "r15" - -static int -slp_switch(void) -{ - int err; - void* rbp; - void* rbx; - unsigned int csr; - unsigned short cw; - /* This used to be declared 'register', but that does nothing in - modern compilers and is explicitly forbidden in some new - standards. */ - long *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("fstcw %0" : "=m" (cw)); - __asm__ volatile ("stmxcsr %0" : "=m" (csr)); - __asm__ volatile ("movq %%rbp, %0" : "=m" (rbp)); - __asm__ volatile ("movq %%rbx, %0" : "=m" (rbx)); - __asm__ ("movq %%rsp, %0" : "=g" (stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "addq %0, %%rsp\n" - "addq %0, %%rbp\n" - : - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - __asm__ volatile ("xorq %%rax, %%rax" : "=a" (err)); - } - __asm__ volatile ("movq %0, %%rbx" : : "m" (rbx)); - __asm__ volatile ("movq %0, %%rbp" : : "m" (rbp)); - __asm__ volatile ("ldmxcsr %0" : : "m" (csr)); - __asm__ volatile ("fldcw %0" : : "m" (cw)); - __asm__ volatile ("" : : : REGS_TO_SAVE); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm32_gcc.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm32_gcc.h deleted file mode 100644 index 655003a..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm32_gcc.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 14-Aug-06 File creation. Ported from Arm Thumb. Sylvain Baro - * 3-Sep-06 Commented out saving of r1-r3 (r4 already commented out) as I - * read that these do not need to be saved. Also added notes and - * errors related to the frame pointer. Richard Tew. - * - * NOTES - * - * It is not possible to detect if fp is used or not, so the supplied - * switch function needs to support it, so that you can remove it if - * it does not apply to you. - * - * POSSIBLE ERRORS - * - * "fp cannot be used in asm here" - * - * - Try commenting out "fp" in REGS_TO_SAVE. - * - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL -#define STACK_MAGIC 0 -#define REG_SP "sp" -#define REG_SPSP "sp,sp" -#ifdef __thumb__ -#define REG_FP "r7" -#define REG_FPFP "r7,r7" -#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r8", "r9", "r10", "r11", "lr" -#else -#define REG_FP "fp" -#define REG_FPFP "fp,fp" -#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr" -#endif -#if defined(__SOFTFP__) -#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL -#elif defined(__VFP_FP__) -#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "d8", "d9", "d10", "d11", \ - "d12", "d13", "d14", "d15" -#elif defined(__MAVERICK__) -#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "mvf4", "mvf5", "mvf6", "mvf7", \ - "mvf8", "mvf9", "mvf10", "mvf11", \ - "mvf12", "mvf13", "mvf14", "mvf15" -#else -#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "f4", "f5", "f6", "f7" -#endif - -static int -#ifdef __GNUC__ -__attribute__((optimize("no-omit-frame-pointer"))) -#endif -slp_switch(void) -{ - void *fp; - int *stackref, stsizediff; - int result; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("mov r0," REG_FP "\n\tstr r0,%0" : "=m" (fp) : : "r0"); - __asm__ ("mov %0," REG_SP : "=r" (stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "add " REG_SPSP ",%0\n" - "add " REG_FPFP ",%0\n" - : - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("ldr r0,%1\n\tmov " REG_FP ",r0\n\tmov %0, #0" : "=r" (result) : "m" (fp) : "r0"); - __asm__ volatile ("" : : : REGS_TO_SAVE); - return result; -} - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm32_ios.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm32_ios.h deleted file mode 100644 index 9e640e1..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm32_ios.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 31-May-15 iOS support. Ported from arm32. Proton - * - * NOTES - * - * It is not possible to detect if fp is used or not, so the supplied - * switch function needs to support it, so that you can remove it if - * it does not apply to you. - * - * POSSIBLE ERRORS - * - * "fp cannot be used in asm here" - * - * - Try commenting out "fp" in REGS_TO_SAVE. - * - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 0 -#define REG_SP "sp" -#define REG_SPSP "sp,sp" -#define REG_FP "r7" -#define REG_FPFP "r7,r7" -#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r8", "r10", "r11", "lr" -#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "d8", "d9", "d10", "d11", \ - "d12", "d13", "d14", "d15" - -static int -#ifdef __GNUC__ -__attribute__((optimize("no-omit-frame-pointer"))) -#endif -slp_switch(void) -{ - void *fp; - int *stackref, stsizediff, result; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("str " REG_FP ",%0" : "=m" (fp)); - __asm__ ("mov %0," REG_SP : "=r" (stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "add " REG_SPSP ",%0\n" - "add " REG_FPFP ",%0\n" - : - : "r" (stsizediff) - : REGS_TO_SAVE /* Clobber registers, force compiler to - * recalculate address of void *fp from REG_SP or REG_FP */ - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ( - "ldr " REG_FP ", %1\n\t" - "mov %0, #0" - : "=r" (result) - : "m" (fp) - : REGS_TO_SAVE /* Force compiler to restore saved registers after this */ - ); - return result; -} - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm64_masm.asm b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm64_masm.asm deleted file mode 100644 index 29f9c22..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm64_masm.asm +++ /dev/null @@ -1,53 +0,0 @@ - AREA switch_arm64_masm, CODE, READONLY; - GLOBAL slp_switch [FUNC] - EXTERN slp_save_state_asm - EXTERN slp_restore_state_asm - -slp_switch - ; push callee saved registers to stack - stp x19, x20, [sp, #-16]! - stp x21, x22, [sp, #-16]! - stp x23, x24, [sp, #-16]! - stp x25, x26, [sp, #-16]! - stp x27, x28, [sp, #-16]! - stp x29, x30, [sp, #-16]! - stp d8, d9, [sp, #-16]! - stp d10, d11, [sp, #-16]! - stp d12, d13, [sp, #-16]! - stp d14, d15, [sp, #-16]! - - ; call slp_save_state_asm with stack pointer - mov x0, sp - bl slp_save_state_asm - - ; early return for return value of 1 and -1 - cmp x0, #-1 - b.eq RETURN - cmp x0, #1 - b.eq RETURN - - ; increment stack and frame pointer - add sp, sp, x0 - add x29, x29, x0 - - bl slp_restore_state_asm - - ; store return value for successful completion of routine - mov x0, #0 - -RETURN - ; pop registers from stack - ldp d14, d15, [sp], #16 - ldp d12, d13, [sp], #16 - ldp d10, d11, [sp], #16 - ldp d8, d9, [sp], #16 - ldp x29, x30, [sp], #16 - ldp x27, x28, [sp], #16 - ldp x25, x26, [sp], #16 - ldp x23, x24, [sp], #16 - ldp x21, x22, [sp], #16 - ldp x19, x20, [sp], #16 - - ret - - END diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm64_masm.obj b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm64_masm.obj deleted file mode 100644 index f6f220e4310baaa9756110685ce7d6a2bdf90c37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 746 zcma)4PiqrF6n~qoo~*PNZ{i+=wji4b#Xu2~wiJpGk)*AMF07NyB(9n1#+i+!)I;v| zBKQG3?t1eB$T(lYgGb4+lu{_QmQrebldQB_4?cMF-uu0IZ{DA2e8@rZ+e^~30488W z`B{KPh%yV{HEIpyeum^wI#7P*HfX)ux?9U&c!SFK-$o|OFtKn{Q|a-#N>2inp0-tb zCRKXAtg2SolaoLv$Ll&ds_Epj?SH+8K{t?XSjKaFsEy%yh}=V70BaHj zEY5kWk_zcJo{$SSUL~=K(zW|tnhm$rA z<%dZ$q?>RX*18r{!azhaYR1lVb;g;mR-6h!#F>|p@;aje%0a|CZrE7s+SXuT>MS=Y ziQPiMY-5DD&5+S7^H03fy7qt7ir}L34kK|h68s-MU>{lXOqlr?!Y=`~WwviNenFS_ zZalVSHh-0FU4lj#X8u5`ODn6@#{f?dHE&%XdP~_I3;$RS9-(z*>>ydkm*f@oWlUn~ Qn+^;lsEi}=H#!Q3U&UU-WdHyG diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm64_msvc.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm64_msvc.h deleted file mode 100644 index 7ab7f45..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_arm64_msvc.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 21-Oct-21 Niyas Sait - * First version to enable win/arm64 support. - */ - -#define STACK_REFPLUS 1 -#define STACK_MAGIC 0 - -/* Use the generic support for an external assembly language slp_switch function. */ -#define EXTERNAL_ASM - -#ifdef SLP_EVAL -/* This always uses the external masm assembly file. */ -#endif \ No newline at end of file diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_csky_gcc.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_csky_gcc.h deleted file mode 100644 index ac469d3..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_csky_gcc.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifdef SLP_EVAL -#define STACK_MAGIC 0 -#define REG_FP "r8" -#ifdef __CSKYABIV2__ -#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r7", "r9", "r10", "r11", "r15",\ - "r16", "r17", "r18", "r19", "r20", "r21", "r22",\ - "r23", "r24", "r25" - -#if defined (__CSKY_HARD_FLOAT__) || (__CSKY_VDSP__) -#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "vr8", "vr9", "vr10", "vr11", "vr12",\ - "vr13", "vr14", "vr15" -#else -#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL -#endif -#else -#define REGS_TO_SAVE "r9", "r10", "r11", "r12", "r13", "r15" -#endif - - -static int -#ifdef __GNUC__ -__attribute__((optimize("no-omit-frame-pointer"))) -#endif -slp_switch(void) -{ - int *stackref, stsizediff; - int result; - - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ ("mov %0, sp" : "=r" (stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "addu sp,%0\n" - "addu "REG_FP",%0\n" - : - : "r" (stsizediff) - ); - - SLP_RESTORE_STATE(); - } - __asm__ volatile ("movi %0, 0" : "=r" (result)); - __asm__ volatile ("" : : : REGS_TO_SAVE); - - return result; -} - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_loongarch64_linux.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_loongarch64_linux.h deleted file mode 100644 index 9eaf34e..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_loongarch64_linux.h +++ /dev/null @@ -1,31 +0,0 @@ -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL -#define STACK_MAGIC 0 - -#define REGS_TO_SAVE "s0", "s1", "s2", "s3", "s4", "s5", \ - "s6", "s7", "s8", "fp", \ - "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31" - -static int -slp_switch(void) -{ - int ret; - long *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("move %0, $sp" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "add.d $sp, $sp, %0\n\t" - : /* no outputs */ - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("move %0, $zero" : "=r" (ret) : ); - return ret; -} - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_m68k_gcc.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_m68k_gcc.h deleted file mode 100644 index da761c2..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_m68k_gcc.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 2014-01-06 Andreas Schwab - * File created. - */ - -#ifdef SLP_EVAL - -#define STACK_MAGIC 0 - -#define REGS_TO_SAVE "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", \ - "%a2", "%a3", "%a4" - -static int -slp_switch(void) -{ - int err; - int *stackref, stsizediff; - void *fp, *a5; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("move.l %%fp, %0" : "=m"(fp)); - __asm__ volatile ("move.l %%a5, %0" : "=m"(a5)); - __asm__ ("move.l %%sp, %0" : "=r"(stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ("add.l %0, %%sp; add.l %0, %%fp" : : "r"(stsizediff)); - SLP_RESTORE_STATE(); - __asm__ volatile ("clr.l %0" : "=g" (err)); - } - __asm__ volatile ("move.l %0, %%a5" : : "m"(a5)); - __asm__ volatile ("move.l %0, %%fp" : : "m"(fp)); - __asm__ volatile ("" : : : REGS_TO_SAVE); - return err; -} - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_mips_unix.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_mips_unix.h deleted file mode 100644 index b9003e9..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_mips_unix.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 20-Sep-14 Matt Madison - * Re-code the saving of the gp register for MIPS64. - * 05-Jan-08 Thiemo Seufer - * Ported from ppc. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 0 - -#define REGS_TO_SAVE "$16", "$17", "$18", "$19", "$20", "$21", "$22", \ - "$23", "$30" -static int -slp_switch(void) -{ - int err; - int *stackref, stsizediff; -#ifdef __mips64 - uint64_t gpsave; -#endif - __asm__ __volatile__ ("" : : : REGS_TO_SAVE); -#ifdef __mips64 - __asm__ __volatile__ ("sd $28,%0" : "=m" (gpsave) : : ); -#endif - __asm__ ("move %0, $29" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ __volatile__ ( -#ifdef __mips64 - "daddu $29, %0\n" -#else - "addu $29, %0\n" -#endif - : /* no outputs */ - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - } -#ifdef __mips64 - __asm__ __volatile__ ("ld $28,%0" : : "m" (gpsave) : ); -#endif - __asm__ __volatile__ ("" : : : REGS_TO_SAVE); - __asm__ __volatile__ ("move %0, $0" : "=r" (err)); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc64_aix.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc64_aix.h deleted file mode 100644 index e7e0b87..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc64_aix.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 16-Oct-20 Jesse Gorzinski - * Copied from Linux PPC64 implementation - * 04-Sep-18 Alexey Borzenkov - * Workaround a gcc bug using manual save/restore of r30 - * 21-Mar-18 Tulio Magno Quites Machado Filho - * Added r30 to the list of saved registers in order to fully comply with - * both ppc64 ELFv1 ABI and the ppc64le ELFv2 ABI, that classify this - * register as a nonvolatile register used for local variables. - * 21-Mar-18 Laszlo Boszormenyi - * Save r2 (TOC pointer) manually. - * 10-Dec-13 Ulrich Weigand - * Support ELFv2 ABI. Save float/vector registers. - * 09-Mar-12 Michael Ellerman - * 64-bit implementation, copied from 32-bit. - * 07-Sep-05 (py-dev mailing list discussion) - * removed 'r31' from the register-saved. !!!! WARNING !!!! - * It means that this file can no longer be compiled statically! - * It is now only suitable as part of a dynamic library! - * 14-Jan-04 Bob Ippolito - * added cr2-cr4 to the registers to be saved. - * Open questions: Should we save FP registers? - * What about vector registers? - * Differences between darwin and unix? - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 04-Oct-02 Gustavo Niemeyer - * Ported from MacOS version. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 29-Jun-02 Christian Tismer - * Added register 13-29, 31 saves. The same way as - * Armin Rigo did for the x86_unix version. - * This seems to be now fully functional! - * 04-Mar-02 Hye-Shik Chang - * Ported from i386. - * 31-Jul-12 Trevor Bowen - * Changed memory constraints to register only. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 6 - -#if defined(__ALTIVEC__) -#define ALTIVEC_REGS \ - "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", \ - "v28", "v29", "v30", "v31", -#else -#define ALTIVEC_REGS -#endif - -#define REGS_TO_SAVE "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ - "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ - "r31", \ - "fr14", "fr15", "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", \ - "fr22", "fr23", "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", \ - "fr30", "fr31", \ - ALTIVEC_REGS \ - "cr2", "cr3", "cr4" - -static int -slp_switch(void) -{ - int err; - long *stackref, stsizediff; - void * toc; - void * r30; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("std 2, %0" : "=m" (toc)); - __asm__ volatile ("std 30, %0" : "=m" (r30)); - __asm__ ("mr %0, 1" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "mr 11, %0\n" - "add 1, 1, 11\n" - : /* no outputs */ - : "r" (stsizediff) - : "11" - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("ld 30, %0" : : "m" (r30)); - __asm__ volatile ("ld 2, %0" : : "m" (toc)); - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("li %0, 0" : "=r" (err)); - return err; -} - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc64_linux.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc64_linux.h deleted file mode 100644 index 3c324d0..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc64_linux.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 04-Sep-18 Alexey Borzenkov - * Workaround a gcc bug using manual save/restore of r30 - * 21-Mar-18 Tulio Magno Quites Machado Filho - * Added r30 to the list of saved registers in order to fully comply with - * both ppc64 ELFv1 ABI and the ppc64le ELFv2 ABI, that classify this - * register as a nonvolatile register used for local variables. - * 21-Mar-18 Laszlo Boszormenyi - * Save r2 (TOC pointer) manually. - * 10-Dec-13 Ulrich Weigand - * Support ELFv2 ABI. Save float/vector registers. - * 09-Mar-12 Michael Ellerman - * 64-bit implementation, copied from 32-bit. - * 07-Sep-05 (py-dev mailing list discussion) - * removed 'r31' from the register-saved. !!!! WARNING !!!! - * It means that this file can no longer be compiled statically! - * It is now only suitable as part of a dynamic library! - * 14-Jan-04 Bob Ippolito - * added cr2-cr4 to the registers to be saved. - * Open questions: Should we save FP registers? - * What about vector registers? - * Differences between darwin and unix? - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 04-Oct-02 Gustavo Niemeyer - * Ported from MacOS version. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 29-Jun-02 Christian Tismer - * Added register 13-29, 31 saves. The same way as - * Armin Rigo did for the x86_unix version. - * This seems to be now fully functional! - * 04-Mar-02 Hye-Shik Chang - * Ported from i386. - * 31-Jul-12 Trevor Bowen - * Changed memory constraints to register only. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#if _CALL_ELF == 2 -#define STACK_MAGIC 4 -#else -#define STACK_MAGIC 6 -#endif - -#if defined(__ALTIVEC__) -#define ALTIVEC_REGS \ - "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", \ - "v28", "v29", "v30", "v31", -#else -#define ALTIVEC_REGS -#endif - -#define REGS_TO_SAVE "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ - "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ - "r31", \ - "fr14", "fr15", "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", \ - "fr22", "fr23", "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", \ - "fr30", "fr31", \ - ALTIVEC_REGS \ - "cr2", "cr3", "cr4" - -static int -slp_switch(void) -{ - int err; - long *stackref, stsizediff; - void * toc; - void * r30; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("std 2, %0" : "=m" (toc)); - __asm__ volatile ("std 30, %0" : "=m" (r30)); - __asm__ ("mr %0, 1" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "mr 11, %0\n" - "add 1, 1, 11\n" - : /* no outputs */ - : "r" (stsizediff) - : "11" - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("ld 30, %0" : : "m" (r30)); - __asm__ volatile ("ld 2, %0" : : "m" (toc)); - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("li %0, 0" : "=r" (err)); - return err; -} - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_aix.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_aix.h deleted file mode 100644 index 6d93c13..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_aix.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 07-Mar-11 Floris Bruynooghe - * Do not add stsizediff to general purpose - * register (GPR) 30 as this is a non-volatile and - * unused by the PowerOpen Environment, therefore - * this was modifying a user register instead of the - * frame pointer (which does not seem to exist). - * 07-Sep-05 (py-dev mailing list discussion) - * removed 'r31' from the register-saved. !!!! WARNING !!!! - * It means that this file can no longer be compiled statically! - * It is now only suitable as part of a dynamic library! - * 14-Jan-04 Bob Ippolito - * added cr2-cr4 to the registers to be saved. - * Open questions: Should we save FP registers? - * What about vector registers? - * Differences between darwin and unix? - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 04-Oct-02 Gustavo Niemeyer - * Ported from MacOS version. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 29-Jun-02 Christian Tismer - * Added register 13-29, 31 saves. The same way as - * Armin Rigo did for the x86_unix version. - * This seems to be now fully functional! - * 04-Mar-02 Hye-Shik Chang - * Ported from i386. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 3 - -/* !!!!WARNING!!!! need to add "r31" in the next line if this header file - * is meant to be compiled non-dynamically! - */ -#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ - "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ - "cr2", "cr3", "cr4" -static int -slp_switch(void) -{ - int err; - int *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ ("mr %0, 1" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "mr 11, %0\n" - "add 1, 1, 11\n" - : /* no outputs */ - : "r" (stsizediff) - : "11" - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("li %0, 0" : "=r" (err)); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_linux.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_linux.h deleted file mode 100644 index e83ad70..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_linux.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 07-Sep-05 (py-dev mailing list discussion) - * removed 'r31' from the register-saved. !!!! WARNING !!!! - * It means that this file can no longer be compiled statically! - * It is now only suitable as part of a dynamic library! - * 14-Jan-04 Bob Ippolito - * added cr2-cr4 to the registers to be saved. - * Open questions: Should we save FP registers? - * What about vector registers? - * Differences between darwin and unix? - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 04-Oct-02 Gustavo Niemeyer - * Ported from MacOS version. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 29-Jun-02 Christian Tismer - * Added register 13-29, 31 saves. The same way as - * Armin Rigo did for the x86_unix version. - * This seems to be now fully functional! - * 04-Mar-02 Hye-Shik Chang - * Ported from i386. - * 31-Jul-12 Trevor Bowen - * Changed memory constraints to register only. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 3 - -/* !!!!WARNING!!!! need to add "r31" in the next line if this header file - * is meant to be compiled non-dynamically! - */ -#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ - "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ - "cr2", "cr3", "cr4" -static int -slp_switch(void) -{ - int err; - int *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ ("mr %0, 1" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "mr 11, %0\n" - "add 1, 1, 11\n" - "add 30, 30, 11\n" - : /* no outputs */ - : "r" (stsizediff) - : "11" - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("li %0, 0" : "=r" (err)); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_macosx.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_macosx.h deleted file mode 100644 index bd414c6..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_macosx.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 07-Sep-05 (py-dev mailing list discussion) - * removed 'r31' from the register-saved. !!!! WARNING !!!! - * It means that this file can no longer be compiled statically! - * It is now only suitable as part of a dynamic library! - * 14-Jan-04 Bob Ippolito - * added cr2-cr4 to the registers to be saved. - * Open questions: Should we save FP registers? - * What about vector registers? - * Differences between darwin and unix? - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 29-Jun-02 Christian Tismer - * Added register 13-29, 31 saves. The same way as - * Armin Rigo did for the x86_unix version. - * This seems to be now fully functional! - * 04-Mar-02 Hye-Shik Chang - * Ported from i386. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 3 - -/* !!!!WARNING!!!! need to add "r31" in the next line if this header file - * is meant to be compiled non-dynamically! - */ -#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ - "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ - "cr2", "cr3", "cr4" - -static int -slp_switch(void) -{ - int err; - int *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ ("; asm block 2\n\tmr %0, r1" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "; asm block 3\n" - "\tmr r11, %0\n" - "\tadd r1, r1, r11\n" - "\tadd r30, r30, r11\n" - : /* no outputs */ - : "r" (stsizediff) - : "r11" - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("li %0, 0" : "=r" (err)); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_unix.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_unix.h deleted file mode 100644 index bb18808..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_ppc_unix.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 07-Sep-05 (py-dev mailing list discussion) - * removed 'r31' from the register-saved. !!!! WARNING !!!! - * It means that this file can no longer be compiled statically! - * It is now only suitable as part of a dynamic library! - * 14-Jan-04 Bob Ippolito - * added cr2-cr4 to the registers to be saved. - * Open questions: Should we save FP registers? - * What about vector registers? - * Differences between darwin and unix? - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 04-Oct-02 Gustavo Niemeyer - * Ported from MacOS version. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 29-Jun-02 Christian Tismer - * Added register 13-29, 31 saves. The same way as - * Armin Rigo did for the x86_unix version. - * This seems to be now fully functional! - * 04-Mar-02 Hye-Shik Chang - * Ported from i386. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 3 - -/* !!!!WARNING!!!! need to add "r31" in the next line if this header file - * is meant to be compiled non-dynamically! - */ -#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ - "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ - "cr2", "cr3", "cr4" -static int -slp_switch(void) -{ - int err; - int *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ ("mr %0, 1" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "mr 11, %0\n" - "add 1, 1, 11\n" - "add 30, 30, 11\n" - : /* no outputs */ - : "r" (stsizediff) - : "11" - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("li %0, 0" : "=r" (err)); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_riscv_unix.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_riscv_unix.h deleted file mode 100644 index 8761122..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_riscv_unix.h +++ /dev/null @@ -1,41 +0,0 @@ -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL -#define STACK_MAGIC 0 - -#define REGS_TO_SAVE "s1", "s2", "s3", "s4", "s5", \ - "s6", "s7", "s8", "s9", "s10", "s11", "fs0", "fs1", \ - "fs2", "fs3", "fs4", "fs5", "fs6", "fs7", "fs8", "fs9", \ - "fs10", "fs11" - -static int -slp_switch(void) -{ - int ret; - long fp; - long *stackref, stsizediff; - - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("mv %0, fp" : "=r" (fp) : ); - __asm__ volatile ("mv %0, sp" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "add sp, sp, %0\n\t" - "add fp, fp, %0\n\t" - : /* no outputs */ - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("" : : : REGS_TO_SAVE); -#if __riscv_xlen == 32 - __asm__ volatile ("lw fp, %0" : : "m" (fp)); -#else - __asm__ volatile ("ld fp, %0" : : "m" (fp)); -#endif - __asm__ volatile ("mv %0, zero" : "=r" (ret) : ); - return ret; -} - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_s390_unix.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_s390_unix.h deleted file mode 100644 index 9199367..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_s390_unix.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 25-Jan-12 Alexey Borzenkov - * Fixed Linux/S390 port to work correctly with - * different optimization options both on 31-bit - * and 64-bit. Thanks to Stefan Raabe for lots - * of testing. - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 06-Oct-02 Gustavo Niemeyer - * Ported to Linux/S390. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#ifdef __s390x__ -#define STACK_MAGIC 20 /* 20 * 8 = 160 bytes of function call area */ -#else -#define STACK_MAGIC 24 /* 24 * 4 = 96 bytes of function call area */ -#endif - -/* Technically, r11-r13 also need saving, but function prolog starts - with stm(g) and since there are so many saved registers already - it won't be optimized, resulting in all r6-r15 being saved */ -#define REGS_TO_SAVE "r6", "r7", "r8", "r9", "r10", "r14", \ - "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \ - "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15" - -static int -slp_switch(void) -{ - int ret; - long *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); -#ifdef __s390x__ - __asm__ volatile ("lgr %0, 15" : "=r" (stackref) : ); -#else - __asm__ volatile ("lr %0, 15" : "=r" (stackref) : ); -#endif - { - SLP_SAVE_STATE(stackref, stsizediff); -/* N.B. - r11 may be used as the frame pointer, and in that case it cannot be - clobbered and needs offsetting just like the stack pointer (but in cases - where frame pointer isn't used we might clobber it accidentally). What's - scary is that r11 is 2nd (and even 1st when GOT is used) callee saved - register that gcc would chose for surviving function calls. However, - since r6-r10 are clobbered above, their cost for reuse is reduced, so - gcc IRA will chose them over r11 (not seeing r11 is implicitly saved), - making it relatively safe to offset in all cases. :) */ - __asm__ volatile ( -#ifdef __s390x__ - "agr 15, %0\n\t" - "agr 11, %0" -#else - "ar 15, %0\n\t" - "ar 11, %0" -#endif - : /* no outputs */ - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("lhi %0, 0" : "=r" (ret) : ); - return ret; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_sh_gcc.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_sh_gcc.h deleted file mode 100644 index 5ecc3b3..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_sh_gcc.h +++ /dev/null @@ -1,36 +0,0 @@ -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL -#define STACK_MAGIC 0 -#define REGS_TO_SAVE "r8", "r9", "r10", "r11", "r13", \ - "fr12", "fr13", "fr14", "fr15" - -// r12 Global context pointer, GP -// r14 Frame pointer, FP -// r15 Stack pointer, SP - -static int -slp_switch(void) -{ - int err; - void* fp; - int *stackref, stsizediff; - __asm__ volatile("" : : : REGS_TO_SAVE); - __asm__ volatile("mov.l r14, %0" : "=m"(fp) : :); - __asm__("mov r15, %0" : "=r"(stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile( - "add %0, r15\n" - "add %0, r14\n" - : /* no outputs */ - : "r"(stsizediff)); - SLP_RESTORE_STATE(); - __asm__ volatile("mov r0, %0" : "=r"(err) : :); - } - __asm__ volatile("mov.l %0, r14" : : "m"(fp) :); - __asm__ volatile("" : : : REGS_TO_SAVE); - return err; -} - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_sparc_sun_gcc.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_sparc_sun_gcc.h deleted file mode 100644 index 96990c3..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_sparc_sun_gcc.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 16-May-15 Alexey Borzenkov - * Move stack spilling code inside save/restore functions - * 30-Aug-13 Floris Bruynooghe - Clean the register windows again before returning. - This does not clobber the PIC register as it leaves - the current window intact and is required for multi- - threaded code to work correctly. - * 08-Mar-11 Floris Bruynooghe - * No need to set return value register explicitly - * before the stack and framepointer are adjusted - * as none of the other registers are influenced by - * this. Also don't needlessly clean the windows - * ('ta %0" :: "i" (ST_CLEAN_WINDOWS)') as that - * clobbers the gcc PIC register (%l7). - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * added support for SunOS sparc with gcc - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - - -#define STACK_MAGIC 0 - - -#if defined(__sparcv9) -#define SLP_FLUSHW __asm__ volatile ("flushw") -#else -#define SLP_FLUSHW __asm__ volatile ("ta 3") /* ST_FLUSH_WINDOWS */ -#endif - -/* On sparc we need to spill register windows inside save/restore functions */ -#define SLP_BEFORE_SAVE_STATE() SLP_FLUSHW -#define SLP_BEFORE_RESTORE_STATE() SLP_FLUSHW - - -static int -slp_switch(void) -{ - int err; - int *stackref, stsizediff; - - /* Put current stack pointer into stackref. - * Register spilling is done in save/restore. - */ - __asm__ volatile ("mov %%sp, %0" : "=r" (stackref)); - - { - /* Thou shalt put SLP_SAVE_STATE into a local block */ - /* Copy the current stack onto the heap */ - SLP_SAVE_STATE(stackref, stsizediff); - - /* Increment stack and frame pointer by stsizediff */ - __asm__ volatile ( - "add %0, %%sp, %%sp\n\t" - "add %0, %%fp, %%fp" - : : "r" (stsizediff)); - - /* Copy new stack from it's save store on the heap */ - SLP_RESTORE_STATE(); - - __asm__ volatile ("mov %1, %0" : "=r" (err) : "i" (0)); - return err; - } -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x32_unix.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x32_unix.h deleted file mode 100644 index 893369c..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x32_unix.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 17-Aug-12 Fantix King - * Ported from amd64. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 0 - -#define REGS_TO_SAVE "r12", "r13", "r14", "r15" - - -static int -slp_switch(void) -{ - void* ebp; - void* ebx; - unsigned int csr; - unsigned short cw; - int err; - int *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("fstcw %0" : "=m" (cw)); - __asm__ volatile ("stmxcsr %0" : "=m" (csr)); - __asm__ volatile ("movl %%ebp, %0" : "=m" (ebp)); - __asm__ volatile ("movl %%ebx, %0" : "=m" (ebx)); - __asm__ ("movl %%esp, %0" : "=g" (stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "addl %0, %%esp\n" - "addl %0, %%ebp\n" - : - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("movl %0, %%ebx" : : "m" (ebx)); - __asm__ volatile ("movl %0, %%ebp" : : "m" (ebp)); - __asm__ volatile ("ldmxcsr %0" : : "m" (csr)); - __asm__ volatile ("fldcw %0" : : "m" (cw)); - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("xorl %%eax, %%eax" : "=a" (err)); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x64_masm.asm b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x64_masm.asm deleted file mode 100644 index f5c72a2..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x64_masm.asm +++ /dev/null @@ -1,111 +0,0 @@ -; -; stack switching code for MASM on x641 -; Kristjan Valur Jonsson, sept 2005 -; - - -;prototypes for our calls -slp_save_state_asm PROTO -slp_restore_state_asm PROTO - - -pushxmm MACRO reg - sub rsp, 16 - .allocstack 16 - movaps [rsp], reg ; faster than movups, but we must be aligned - ; .savexmm128 reg, offset (don't know what offset is, no documentation) -ENDM -popxmm MACRO reg - movaps reg, [rsp] ; faster than movups, but we must be aligned - add rsp, 16 -ENDM - -pushreg MACRO reg - push reg - .pushreg reg -ENDM -popreg MACRO reg - pop reg -ENDM - - -.code -slp_switch PROC FRAME - ;realign stack to 16 bytes after return address push, makes the following faster - sub rsp,8 - .allocstack 8 - - pushxmm xmm15 - pushxmm xmm14 - pushxmm xmm13 - pushxmm xmm12 - pushxmm xmm11 - pushxmm xmm10 - pushxmm xmm9 - pushxmm xmm8 - pushxmm xmm7 - pushxmm xmm6 - - pushreg r15 - pushreg r14 - pushreg r13 - pushreg r12 - - pushreg rbp - pushreg rbx - pushreg rdi - pushreg rsi - - sub rsp, 10h ;allocate the singlefunction argument (must be multiple of 16) - .allocstack 10h -.endprolog - - lea rcx, [rsp+10h] ;load stack base that we are saving - call slp_save_state_asm ;pass stackpointer, return offset in eax - cmp rax, 1 - je EXIT1 - cmp rax, -1 - je EXIT2 - ;actual stack switch: - add rsp, rax - call slp_restore_state_asm - xor rax, rax ;return 0 - -EXIT: - - add rsp, 10h - popreg rsi - popreg rdi - popreg rbx - popreg rbp - - popreg r12 - popreg r13 - popreg r14 - popreg r15 - - popxmm xmm6 - popxmm xmm7 - popxmm xmm8 - popxmm xmm9 - popxmm xmm10 - popxmm xmm11 - popxmm xmm12 - popxmm xmm13 - popxmm xmm14 - popxmm xmm15 - - add rsp, 8 - ret - -EXIT1: - mov rax, 1 - jmp EXIT - -EXIT2: - sar rax, 1 - jmp EXIT - -slp_switch ENDP - -END \ No newline at end of file diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x64_masm.obj b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x64_masm.obj deleted file mode 100644 index 64e3e6b898ec765d4e37075f7b1635ad24c9efa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmZ{j&ubG=5XWb`DJB@*%~BA=L%=;Gk}d_~52VO$4J4q2U~MY6&1RFl{E&?scGnt@ zn(9GNy!ihFEO@PV4?T&H9`x2*oO!!jlNJZwd!P4xlX&_;U$Bg3z>p zje>}2kp+MsxE|w5hOUr>YC~(=fz6fwPdZd5+Hlb^P3{;ZO@Yuv96GG&+Gx?QfclNd zhy2KN&~>fNnlHQRR;U1cMyQ?hlQ$~k<0KBbB<0uD2#PTjVo+na7Q;#m=@=3m;xJOa zs2V#)&Db`cY;WzTF9)11;SjkVQWE!?bPTC%x3h3^F2;aBns5!i%m4&-*h69;~AUpZR%rDpm!zuXY+kc zFCz-n*^4&c)5~}y3e?r-Evy*n*(lp9r%ti58Y#l5&)rDjx5EbRd}nC+_8znRzz&#& XZ_Fi+`GM=5Rl{n4%KxAK>jC@)Nz=zi diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x64_msvc.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x64_msvc.h deleted file mode 100644 index 601ea56..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x64_msvc.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 26-Sep-02 Christian Tismer - * again as a result of virtualized stack access, - * the compiler used less registers. Needed to - * explicit mention registers in order to get them saved. - * Thanks to Jeff Senn for pointing this out and help. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 01-Mar-02 Christian Tismer - * Initial final version after lots of iterations for i386. - */ - -/* Avoid alloca redefined warning on mingw64 */ -#ifndef alloca -#define alloca _alloca -#endif - -#define STACK_REFPLUS 1 -#define STACK_MAGIC 0 - -/* Use the generic support for an external assembly language slp_switch function. */ -#define EXTERNAL_ASM - -#ifdef SLP_EVAL -/* This always uses the external masm assembly file. */ -#endif - -/* - * further self-processing support - */ - -/* we have IsBadReadPtr available, so we can peek at objects */ -/* -#define STACKLESS_SPY - -#ifdef IMPLEMENT_STACKLESSMODULE -#include "Windows.h" -#define CANNOT_READ_MEM(p, bytes) IsBadReadPtr(p, bytes) - -static int IS_ON_STACK(void*p) -{ - int stackref; - intptr_t stackbase = ((intptr_t)&stackref) & 0xfffff000; - return (intptr_t)p >= stackbase && (intptr_t)p < stackbase + 0x00100000; -} - -#endif -*/ \ No newline at end of file diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x86_msvc.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x86_msvc.h deleted file mode 100644 index 0f3a59f..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x86_msvc.h +++ /dev/null @@ -1,326 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 26-Sep-02 Christian Tismer - * again as a result of virtualized stack access, - * the compiler used less registers. Needed to - * explicit mention registers in order to get them saved. - * Thanks to Jeff Senn for pointing this out and help. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 01-Mar-02 Christian Tismer - * Initial final version after lots of iterations for i386. - */ - -#define alloca _alloca - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 0 - -/* Some magic to quell warnings and keep slp_switch() from crashing when built - with VC90. Disable global optimizations, and the warning: frame pointer - register 'ebp' modified by inline assembly code. - - We used to just disable global optimizations ("g") but upstream stackless - Python, as well as stackman, turn off all optimizations. - -References: -https://github.com/stackless-dev/stackman/blob/dbc72fe5207a2055e658c819fdeab9731dee78b9/stackman/platforms/switch_x86_msvc.h -https://github.com/stackless-dev/stackless/blob/main-slp/Stackless/platf/switch_x86_msvc.h -*/ -#define WIN32_LEAN_AND_MEAN -#include - -#pragma optimize("", off) /* so that autos are stored on the stack */ -#pragma warning(disable:4731) -#pragma warning(disable:4733) /* disable warning about modifying FS[0] */ - -/** - * Most modern compilers and environments handle C++ exceptions without any - * special help from us. MSVC on 32-bit windows is an exception. There, C++ - * exceptions are dealt with using Windows' Structured Exception Handling - * (SEH). - * - * SEH is implemented as a singly linked list of nodes. The - * head of this list is stored in the Thread Information Block, which itself - * is pointed to from the FS register. It's the first field in the structure, - * or offset 0, so we can access it using assembly FS:[0], or the compiler - * intrinsics and field offset information from the headers (as we do below). - * Somewhat unusually, the tail of the list doesn't have prev == NULL, it has - * prev == 0xFFFFFFFF. - * - * SEH was designed for C, and traditionally uses the MSVC compiler - * intrinsincs __try{}/__except{}. It is also utilized for C++ exceptions by - * MSVC; there, every throw of a C++ exception raises a SEH error with the - * ExceptionCode 0xE06D7363; the SEH handler list is then traversed to - * deal with the exception. - * - * If the SEH list is corrupt, then when a C++ exception is thrown the program - * will abruptly exit with exit code 1. This does not use std::terminate(), so - * std::set_terminate() is useless to debug this. - * - * The SEH list is closely tied to the call stack; entering a function that - * uses __try{} or most C++ functions will push a new handler onto the front - * of the list. Returning from the function will remove the handler. Saving - * and restoring the head node of the SEH list (FS:[0]) per-greenlet is NOT - * ENOUGH to make SEH or exceptions work. - * - * Stack switching breaks SEH because the call stack no longer necessarily - * matches the SEH list. For example, given greenlet A that switches to - * greenlet B, at the moment of entering greenlet B, we will have any SEH - * handlers from greenlet A on the SEH list; greenlet B can then add its own - * handlers to the SEH list. When greenlet B switches back to greenlet A, - * greenlet B's handlers would still be on the SEH stack, but when switch() - * returns control to greenlet A, we have replaced the contents of the stack - * in memory, so all the address that greenlet B added to the SEH list are now - * invalid: part of the call stack has been unwound, but the SEH list was out - * of sync with the call stack. The net effect is that exception handling - * stops working. - * - * Thus, when switching greenlets, we need to be sure that the SEH list - * matches the effective call stack, "cutting out" any handlers that were - * pushed by the greenlet that switched out and which are no longer valid. - * - * The easiest way to do this is to capture the SEH list at the time the main - * greenlet for a thread is created, and, when initially starting a greenlet, - * start a new SEH list for it, which contains nothing but the handler - * established for the new greenlet itself, with the tail being the handlers - * for the main greenlet. If we then save and restore the SEH per-greenlet, - * they won't interfere with each others SEH lists. (No greenlet can unwind - * the call stack past the handlers established by the main greenlet). - * - * By observation, a new thread starts with three SEH handlers on the list. By - * the time we get around to creating the main greenlet, though, there can be - * many more, established by transient calls that lead to the creation of the - * main greenlet. Therefore, 3 is a magic constant telling us when to perform - * the initial slice. - * - * All of this can be debugged using a vectored exception handler, which - * operates independently of the SEH handler list, and is called first. - * Walking the SEH list at key points can also be helpful. - * - * References: - * https://en.wikipedia.org/wiki/Win32_Thread_Information_Block - * https://devblogs.microsoft.com/oldnewthing/20100730-00/?p=13273 - * https://docs.microsoft.com/en-us/cpp/cpp/try-except-statement?view=msvc-160 - * https://docs.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp?view=msvc-160 - * https://docs.microsoft.com/en-us/windows/win32/debug/structured-exception-handling - * https://docs.microsoft.com/en-us/windows/win32/debug/using-a-vectored-exception-handler - * https://bytepointer.com/resources/pietrek_crash_course_depths_of_win32_seh.htm - */ -#define GREENLET_NEEDS_EXCEPTION_STATE_SAVED - - -typedef struct _GExceptionRegistration { - struct _GExceptionRegistration* prev; - void* handler_f; -} GExceptionRegistration; - -static void -slp_set_exception_state(const void *const seh_state) -{ - // Because the stack from from which we do this is ALSO a handler, and - // that one we want to keep, we need to relink the current SEH handler - // frame to point to this one, cutting out the middle men, as it were. - // - // Entering a try block doesn't change the SEH frame, but entering a - // function containing a try block does. - GExceptionRegistration* current_seh_state = (GExceptionRegistration*)__readfsdword(FIELD_OFFSET(NT_TIB, ExceptionList)); - current_seh_state->prev = (GExceptionRegistration*)seh_state; -} - - -static GExceptionRegistration* -x86_slp_get_third_oldest_handler() -{ - GExceptionRegistration* a = NULL; /* Closest to the top */ - GExceptionRegistration* b = NULL; /* second */ - GExceptionRegistration* c = NULL; - GExceptionRegistration* seh_state = (GExceptionRegistration*)__readfsdword(FIELD_OFFSET(NT_TIB, ExceptionList)); - a = b = c = seh_state; - - while (seh_state && seh_state != (GExceptionRegistration*)0xFFFFFFFF) { - if ((void*)seh_state->prev < (void*)100) { - fprintf(stderr, "\tERROR: Broken SEH chain.\n"); - return NULL; - } - a = b; - b = c; - c = seh_state; - - seh_state = seh_state->prev; - } - return a ? a : (b ? b : c); -} - - -static void* -slp_get_exception_state() -{ - // XXX: There appear to be three SEH handlers on the stack already at the - // start of the thread. Is that a guarantee? Almost certainly not. Yet in - // all observed cases it has been three. This is consistent with - // faulthandler off or on, and optimizations off or on. It may not be - // consistent with other operating system versions, though: we only have - // CI on one or two versions (don't ask what there are). - // In theory we could capture the number of handlers on the chain when - // PyInit__greenlet is called: there are probably only the default - // handlers at that point (unless we're embedded and people have used - // __try/__except or a C++ handler)? - return x86_slp_get_third_oldest_handler(); -} - -static int -slp_switch(void) -{ - /* MASM syntax is typically reversed from other assemblers. - It is usually - */ - int *stackref, stsizediff; - /* store the structured exception state for this stack */ - DWORD seh_state = __readfsdword(FIELD_OFFSET(NT_TIB, ExceptionList)); - __asm mov stackref, esp; - /* modify EBX, ESI and EDI in order to get them preserved */ - __asm mov ebx, ebx; - __asm xchg esi, edi; - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm { - mov eax, stsizediff - add esp, eax - add ebp, eax - } - SLP_RESTORE_STATE(); - } - __writefsdword(FIELD_OFFSET(NT_TIB, ExceptionList), seh_state); - return 0; -} - -/* re-enable ebp warning and global optimizations. */ -#pragma optimize("", on) -#pragma warning(default:4731) -#pragma warning(default:4733) /* disable warning about modifying FS[0] */ - - -#endif - -/* - * further self-processing support - */ - -/* we have IsBadReadPtr available, so we can peek at objects */ -#define STACKLESS_SPY - -#ifdef GREENLET_DEBUG - -#define CANNOT_READ_MEM(p, bytes) IsBadReadPtr(p, bytes) - -static int IS_ON_STACK(void*p) -{ - int stackref; - int stackbase = ((int)&stackref) & 0xfffff000; - return (int)p >= stackbase && (int)p < stackbase + 0x00100000; -} - -static void -x86_slp_show_seh_chain() -{ - GExceptionRegistration* seh_state = (GExceptionRegistration*)__readfsdword(FIELD_OFFSET(NT_TIB, ExceptionList)); - fprintf(stderr, "====== SEH Chain ======\n"); - while (seh_state && seh_state != (GExceptionRegistration*)0xFFFFFFFF) { - fprintf(stderr, "\tSEH_chain addr: %p handler: %p prev: %p\n", - seh_state, - seh_state->handler_f, seh_state->prev); - if ((void*)seh_state->prev < (void*)100) { - fprintf(stderr, "\tERROR: Broken chain.\n"); - break; - } - seh_state = seh_state->prev; - } - fprintf(stderr, "====== End SEH Chain ======\n"); - fflush(NULL); - return; -} - -//addVectoredExceptionHandler constants: -//CALL_FIRST means call this exception handler first; -//CALL_LAST means call this exception handler last -#define CALL_FIRST 1 -#define CALL_LAST 0 - -LONG WINAPI -GreenletVectorHandler(PEXCEPTION_POINTERS ExceptionInfo) -{ - // We get one of these for every C++ exception, with code - // E06D7363 - // This is a special value that means "C++ exception from MSVC" - // https://devblogs.microsoft.com/oldnewthing/20100730-00/?p=13273 - // - // Install in the module init function with: - // AddVectoredExceptionHandler(CALL_FIRST, GreenletVectorHandler); - PEXCEPTION_RECORD ExceptionRecord = ExceptionInfo->ExceptionRecord; - - fprintf(stderr, - "GOT VECTORED EXCEPTION:\n" - "\tExceptionCode : %p\n" - "\tExceptionFlags : %p\n" - "\tExceptionAddr : %p\n" - "\tNumberparams : %ld\n", - ExceptionRecord->ExceptionCode, - ExceptionRecord->ExceptionFlags, - ExceptionRecord->ExceptionAddress, - ExceptionRecord->NumberParameters - ); - if (ExceptionRecord->ExceptionFlags & 1) { - fprintf(stderr, "\t\tEH_NONCONTINUABLE\n" ); - } - if (ExceptionRecord->ExceptionFlags & 2) { - fprintf(stderr, "\t\tEH_UNWINDING\n" ); - } - if (ExceptionRecord->ExceptionFlags & 4) { - fprintf(stderr, "\t\tEH_EXIT_UNWIND\n" ); - } - if (ExceptionRecord->ExceptionFlags & 8) { - fprintf(stderr, "\t\tEH_STACK_INVALID\n" ); - } - if (ExceptionRecord->ExceptionFlags & 0x10) { - fprintf(stderr, "\t\tEH_NESTED_CALL\n" ); - } - if (ExceptionRecord->ExceptionFlags & 0x20) { - fprintf(stderr, "\t\tEH_TARGET_UNWIND\n" ); - } - if (ExceptionRecord->ExceptionFlags & 0x40) { - fprintf(stderr, "\t\tEH_COLLIDED_UNWIND\n" ); - } - fprintf(stderr, "\n"); - fflush(NULL); - for(DWORD i = 0; i < ExceptionRecord->NumberParameters; i++) { - fprintf(stderr, "\t\t\tParam %ld: %lX\n", i, ExceptionRecord->ExceptionInformation[i]); - } - - if (ExceptionRecord->NumberParameters == 3) { - fprintf(stderr, "\tAbout to traverse SEH chain\n"); - // C++ Exception records have 3 params. - x86_slp_show_seh_chain(); - } - - return EXCEPTION_CONTINUE_SEARCH; -} - - - - -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x86_unix.h b/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x86_unix.h deleted file mode 100644 index 493fa6b..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/platform/switch_x86_unix.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 3-May-13 Ralf Schmitt - * Add support for strange GCC caller-save decisions - * (ported from switch_aarch64_gcc.h) - * 19-Aug-11 Alexey Borzenkov - * Correctly save ebp, ebx and cw - * 07-Sep-05 (py-dev mailing list discussion) - * removed 'ebx' from the register-saved. !!!! WARNING !!!! - * It means that this file can no longer be compiled statically! - * It is now only suitable as part of a dynamic library! - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for spark - * 31-Avr-02 Armin Rigo - * Added ebx, esi and edi register-saves. - * 01-Mar-02 Samual M. Rushing - * Ported from i386. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -/* #define STACK_MAGIC 3 */ -/* the above works fine with gcc 2.96, but 2.95.3 wants this */ -#define STACK_MAGIC 0 - -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) -# define ATTR_NOCLONE __attribute__((noclone)) -#else -# define ATTR_NOCLONE -#endif - -static int -slp_switch(void) -{ - int err; -#ifdef _WIN32 - void *seh; -#endif - void *ebp, *ebx; - unsigned short cw; - int *stackref, stsizediff; - __asm__ volatile ("" : : : "esi", "edi"); - __asm__ volatile ("fstcw %0" : "=m" (cw)); - __asm__ volatile ("movl %%ebp, %0" : "=m" (ebp)); - __asm__ volatile ("movl %%ebx, %0" : "=m" (ebx)); -#ifdef _WIN32 - __asm__ volatile ( - "movl %%fs:0x0, %%eax\n" - "movl %%eax, %0\n" - : "=m" (seh) - : - : "eax"); -#endif - __asm__ ("movl %%esp, %0" : "=g" (stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "addl %0, %%esp\n" - "addl %0, %%ebp\n" - : - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - __asm__ volatile ("xorl %%eax, %%eax" : "=a" (err)); - } -#ifdef _WIN32 - __asm__ volatile ( - "movl %0, %%eax\n" - "movl %%eax, %%fs:0x0\n" - : - : "m" (seh) - : "eax"); -#endif - __asm__ volatile ("movl %0, %%ebx" : : "m" (ebx)); - __asm__ volatile ("movl %0, %%ebp" : : "m" (ebp)); - __asm__ volatile ("fldcw %0" : : "m" (cw)); - __asm__ volatile ("" : : : "esi", "edi"); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/blog-app/venv/Lib/site-packages/greenlet/slp_platformselect.h b/blog-app/venv/Lib/site-packages/greenlet/slp_platformselect.h deleted file mode 100644 index 225c67b..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/slp_platformselect.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Platform Selection for Stackless Python - */ -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(MS_WIN32) && !defined(MS_WIN64) && defined(_M_IX86) && defined(_MSC_VER) -# include "platform/switch_x86_msvc.h" /* MS Visual Studio on X86 */ -#elif defined(MS_WIN64) && defined(_M_X64) && defined(_MSC_VER) || defined(__MINGW64__) -# include "platform/switch_x64_msvc.h" /* MS Visual Studio on X64 */ -#elif defined(MS_WIN64) && defined(_M_ARM64) -# include "platform/switch_arm64_msvc.h" /* MS Visual Studio on ARM64 */ -#elif defined(__GNUC__) && defined(__amd64__) && defined(__ILP32__) -# include "platform/switch_x32_unix.h" /* gcc on amd64 with x32 ABI */ -#elif defined(__GNUC__) && defined(__amd64__) -# include "platform/switch_amd64_unix.h" /* gcc on amd64 */ -#elif defined(__GNUC__) && defined(__i386__) -# include "platform/switch_x86_unix.h" /* gcc on X86 */ -#elif defined(__GNUC__) && defined(__powerpc64__) && (defined(__linux__) || defined(__FreeBSD__)) -# include "platform/switch_ppc64_linux.h" /* gcc on PowerPC 64-bit */ -#elif defined(__GNUC__) && defined(__PPC__) && (defined(__linux__) || defined(__FreeBSD__)) -# include "platform/switch_ppc_linux.h" /* gcc on PowerPC */ -#elif defined(__GNUC__) && defined(__POWERPC__) && defined(__APPLE__) -# include "platform/switch_ppc_macosx.h" /* Apple MacOS X on 32-bit PowerPC */ -#elif defined(__GNUC__) && defined(__powerpc64__) && defined(_AIX) -# include "platform/switch_ppc64_aix.h" /* gcc on AIX/PowerPC 64-bit */ -#elif defined(__GNUC__) && defined(_ARCH_PPC) && defined(_AIX) -# include "platform/switch_ppc_aix.h" /* gcc on AIX/PowerPC */ -#elif defined(__GNUC__) && defined(__powerpc__) && defined(__NetBSD__) -#include "platform/switch_ppc_unix.h" /* gcc on NetBSD/powerpc */ -#elif defined(__GNUC__) && defined(sparc) -# include "platform/switch_sparc_sun_gcc.h" /* SunOS sparc with gcc */ -#elif defined(__SUNPRO_C) && defined(sparc) && defined(sun) -# include "platform/switch_sparc_sun_gcc.h" /* SunStudio on amd64 */ -#elif defined(__SUNPRO_C) && defined(__amd64__) && defined(sun) -# include "platform/switch_amd64_unix.h" /* SunStudio on amd64 */ -#elif defined(__SUNPRO_C) && defined(__i386__) && defined(sun) -# include "platform/switch_x86_unix.h" /* SunStudio on x86 */ -#elif defined(__GNUC__) && defined(__s390__) && defined(__linux__) -# include "platform/switch_s390_unix.h" /* Linux/S390 */ -#elif defined(__GNUC__) && defined(__s390x__) && defined(__linux__) -# include "platform/switch_s390_unix.h" /* Linux/S390 zSeries (64-bit) */ -#elif defined(__GNUC__) && defined(__arm__) -# ifdef __APPLE__ -# include -# endif -# if TARGET_OS_IPHONE -# include "platform/switch_arm32_ios.h" /* iPhone OS on arm32 */ -# else -# include "platform/switch_arm32_gcc.h" /* gcc using arm32 */ -# endif -#elif defined(__GNUC__) && defined(__mips__) && defined(__linux__) -# include "platform/switch_mips_unix.h" /* Linux/MIPS */ -#elif defined(__GNUC__) && defined(__aarch64__) -# include "platform/switch_aarch64_gcc.h" /* Aarch64 ABI */ -#elif defined(__GNUC__) && defined(__mc68000__) -# include "platform/switch_m68k_gcc.h" /* gcc on m68k */ -#elif defined(__GNUC__) && defined(__csky__) -#include "platform/switch_csky_gcc.h" /* gcc on csky */ -# elif defined(__GNUC__) && defined(__riscv) -# include "platform/switch_riscv_unix.h" /* gcc on RISC-V */ -#elif defined(__GNUC__) && defined(__alpha__) -# include "platform/switch_alpha_unix.h" /* gcc on DEC Alpha */ -#elif defined(MS_WIN32) && defined(__llvm__) && defined(__aarch64__) -# include "platform/switch_aarch64_gcc.h" /* LLVM Aarch64 ABI for Windows */ -#elif defined(__GNUC__) && defined(__loongarch64) && defined(__linux__) -# include "platform/switch_loongarch64_linux.h" /* LoongArch64 */ -#elif defined(__GNUC__) && defined(__sh__) -# include "platform/switch_sh_gcc.h" /* SuperH */ -#endif - -#ifdef __cplusplus -}; -#endif diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/__init__.py b/blog-app/venv/Lib/site-packages/greenlet/tests/__init__.py deleted file mode 100644 index 5929f2a..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/__init__.py +++ /dev/null @@ -1,240 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tests for greenlet. - -""" -import os -import sys -import unittest - -from gc import collect -from gc import get_objects -from threading import active_count as active_thread_count -from time import sleep -from time import time - -import psutil - -from greenlet import greenlet as RawGreenlet -from greenlet import getcurrent - -from greenlet._greenlet import get_pending_cleanup_count -from greenlet._greenlet import get_total_main_greenlets - -from . import leakcheck - -PY312 = sys.version_info[:2] >= (3, 12) -PY313 = sys.version_info[:2] >= (3, 13) -# XXX: First tested on 3.14a7. Revisit all uses of this on later versions to ensure they -# are still valid. -PY314 = sys.version_info[:2] >= (3, 14) - -WIN = sys.platform.startswith("win") -RUNNING_ON_GITHUB_ACTIONS = os.environ.get('GITHUB_ACTIONS') -RUNNING_ON_TRAVIS = os.environ.get('TRAVIS') or RUNNING_ON_GITHUB_ACTIONS -RUNNING_ON_APPVEYOR = os.environ.get('APPVEYOR') -RUNNING_ON_CI = RUNNING_ON_TRAVIS or RUNNING_ON_APPVEYOR -RUNNING_ON_MANYLINUX = os.environ.get('GREENLET_MANYLINUX') - -class TestCaseMetaClass(type): - # wrap each test method with - # a) leak checks - def __new__(cls, classname, bases, classDict): - # pylint and pep8 fight over what this should be called (mcs or cls). - # pylint gets it right, but we can't scope disable pep8, so we go with - # its convention. - # pylint: disable=bad-mcs-classmethod-argument - check_totalrefcount = True - - # Python 3: must copy, we mutate the classDict. Interestingly enough, - # it doesn't actually error out, but under 3.6 we wind up wrapping - # and re-wrapping the same items over and over and over. - for key, value in list(classDict.items()): - if key.startswith('test') and callable(value): - classDict.pop(key) - if check_totalrefcount: - value = leakcheck.wrap_refcount(value) - classDict[key] = value - return type.__new__(cls, classname, bases, classDict) - - -class TestCase(unittest.TestCase, metaclass=TestCaseMetaClass): - - cleanup_attempt_sleep_duration = 0.001 - cleanup_max_sleep_seconds = 1 - - def wait_for_pending_cleanups(self, - initial_active_threads=None, - initial_main_greenlets=None): - initial_active_threads = initial_active_threads or self.threads_before_test - initial_main_greenlets = initial_main_greenlets or self.main_greenlets_before_test - sleep_time = self.cleanup_attempt_sleep_duration - # NOTE: This is racy! A Python-level thread object may be dead - # and gone, but the C thread may not yet have fired its - # destructors and added to the queue. There's no particular - # way to know that's about to happen. We try to watch the - # Python threads to make sure they, at least, have gone away. - # Counting the main greenlets, which we can easily do deterministically, - # also helps. - - # Always sleep at least once to let other threads run - sleep(sleep_time) - quit_after = time() + self.cleanup_max_sleep_seconds - # TODO: We could add an API that calls us back when a particular main greenlet is deleted? - # It would have to drop the GIL - while ( - get_pending_cleanup_count() - or active_thread_count() > initial_active_threads - or (not self.expect_greenlet_leak - and get_total_main_greenlets() > initial_main_greenlets)): - sleep(sleep_time) - if time() > quit_after: - print("Time limit exceeded.") - print("Threads: Waiting for only", initial_active_threads, - "-->", active_thread_count()) - print("MGlets : Waiting for only", initial_main_greenlets, - "-->", get_total_main_greenlets()) - break - collect() - - def count_objects(self, kind=list, exact_kind=True): - # pylint:disable=unidiomatic-typecheck - # Collect the garbage. - for _ in range(3): - collect() - if exact_kind: - return sum( - 1 - for x in get_objects() - if type(x) is kind - ) - # instances - return sum( - 1 - for x in get_objects() - if isinstance(x, kind) - ) - - greenlets_before_test = 0 - threads_before_test = 0 - main_greenlets_before_test = 0 - expect_greenlet_leak = False - - def count_greenlets(self): - """ - Find all the greenlets and subclasses tracked by the GC. - """ - return self.count_objects(RawGreenlet, False) - - def setUp(self): - # Ensure the main greenlet exists, otherwise the first test - # gets a false positive leak - super().setUp() - getcurrent() - self.threads_before_test = active_thread_count() - self.main_greenlets_before_test = get_total_main_greenlets() - self.wait_for_pending_cleanups(self.threads_before_test, self.main_greenlets_before_test) - self.greenlets_before_test = self.count_greenlets() - - def tearDown(self): - if getattr(self, 'skipTearDown', False): - return - - self.wait_for_pending_cleanups(self.threads_before_test, self.main_greenlets_before_test) - super().tearDown() - - def get_expected_returncodes_for_aborted_process(self): - import signal - # The child should be aborted in an unusual way. On POSIX - # platforms, this is done with abort() and signal.SIGABRT, - # which is reflected in a negative return value; however, on - # Windows, even though we observe the child print "Fatal - # Python error: Aborted" and in older versions of the C - # runtime "This application has requested the Runtime to - # terminate it in an unusual way," it always has an exit code - # of 3. This is interesting because 3 is the error code for - # ERROR_PATH_NOT_FOUND; BUT: the C runtime abort() function - # also uses this code. - # - # If we link to the static C library on Windows, the error - # code changes to '0xc0000409' (hex(3221226505)), which - # apparently is STATUS_STACK_BUFFER_OVERRUN; but "What this - # means is that nowadays when you get a - # STATUS_STACK_BUFFER_OVERRUN, it doesn’t actually mean that - # there is a stack buffer overrun. It just means that the - # application decided to terminate itself with great haste." - # - # - # On windows, we've also seen '0xc0000005' (hex(3221225477)). - # That's "Access Violation" - # - # See - # https://devblogs.microsoft.com/oldnewthing/20110519-00/?p=10623 - # and - # https://docs.microsoft.com/en-us/previous-versions/k089yyh0(v=vs.140)?redirectedfrom=MSDN - # and - # https://devblogs.microsoft.com/oldnewthing/20190108-00/?p=100655 - expected_exit = ( - -signal.SIGABRT, - # But beginning on Python 3.11, the faulthandler - # that prints the C backtraces sometimes segfaults after - # reporting the exception but before printing the stack. - # This has only been seen on linux/gcc. - -signal.SIGSEGV, - ) if not WIN else ( - 3, - 0xc0000409, - 0xc0000005, - ) - return expected_exit - - def get_process_uss(self): - """ - Return the current process's USS in bytes. - - uss is available on Linux, macOS, Windows. Also known as - "Unique Set Size", this is the memory which is unique to a - process and which would be freed if the process was terminated - right now. - - If this is not supported by ``psutil``, this raises the - :exc:`unittest.SkipTest` exception. - """ - try: - return psutil.Process().memory_full_info().uss - except AttributeError as e: - raise unittest.SkipTest("uss not supported") from e - - def run_script(self, script_name, show_output=True): - import subprocess - script = os.path.join( - os.path.dirname(__file__), - script_name, - ) - - try: - return subprocess.check_output([sys.executable, script], - encoding='utf-8', - stderr=subprocess.STDOUT) - except subprocess.CalledProcessError as ex: - if show_output: - print('-----') - print('Failed to run script', script) - print('~~~~~') - print(ex.output) - print('------') - raise - - - def assertScriptRaises(self, script_name, exitcodes=None): - import subprocess - with self.assertRaises(subprocess.CalledProcessError) as exc: - output = self.run_script(script_name, show_output=False) - __traceback_info__ = output - # We're going to fail the assertion if we get here, at least - # preserve the output in the traceback. - - if exitcodes is None: - exitcodes = self.get_expected_returncodes_for_aborted_process() - self.assertIn(exc.exception.returncode, exitcodes) - return exc.exception diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/__init__.cpython-310.pyc b/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 0c501b035633834dbaaeaa7016ce673324ee8d79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5882 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 diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_clearing_run_switches.cpython-310.pyc b/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_clearing_run_switches.cpython-310.pyc deleted file mode 100644 index 5a8fe84c363168d5b2bdeeab69f9dc648dd8823b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1541 zcmZ`(OK%%D5GMB_tyhn_PK&lc4@57CfY>=VD2kv?YXk_?Aa*W`1?bgsByGIjRY|T~ z8@VZmqCo$HeC)63eXl+B)I)ALb%shDHBAX|#36_C_`c!RgF(!2oc{6k{O^FVKS|jh zAu11WnqN>TmN3PYSMmg9;sIa#*DMKUED4X8@>TGXsbJ+L9n?bAL9GM)IbZonS9MkN zk|hyzp|fHuj<>z_4&II-T=&!t#8dB@a|V4CL#%qL|C^7RvvIov2v;6w$~$JGVHR=5 z;zv_)0b-slL1aQVmB_QQ%qAs>MP>{rVQXRMAo990RyVn=wZNYND>5UpD$cCc#iX%t zSD++ks;+M1X>J>IbtxJH=pnP>&IIy|w9`{5XJBt`N_l!3qf?4g7H1%e%7UJP1~a-# zyOp?b0@ElV)9-Sez_ivNCNL|is;Fi$W{X9*OB!xdf}&n5YHgdUu$Ka@#gj`rud&Wr zVP4MsAdde+YS=g@xjj5o9^icS2?}6H8B08(4{7j~k1z&p?`cyVz5y*qNN)zMeVm6l z&F3gATXV&UA?vMu<+xG|o%rLCr^&SKN~xff@@jXg>vOT?8Y6WPkfyYz?PQAuRH_Zm zv!ZG{=Ay9qe8k(pKso)LY3j$7>Q+QV=2#T)s(dEOZgLa z)8@o^b2V;>9y)dq?&9JVg^5^y1M2^>s)=5V$&Yecy&beB2adO|aPb0JJM(nU@#k2x z_=2pz4qo8dHN7T(-1=Db$a}qagysCZyYL`}nU1B!(o&c*_AbhjwrgRG*Rd5ed@% z0~Ix;!+|`#>tENk9(C<4+)qNF2aDQGg&&MZwgRUigooVSz1pQ7zAt76n|`@7y6Qiw z1Z@gz>-h<`bvP{>Gf%otzdwHV_~dvraL=U9rA(r?ZP@Zz5+m$+qcvuuyBK1V4wc}F zbMZ7G*7Bb>JcJ94-$W diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_cpp_exception.cpython-310.pyc b/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_cpp_exception.cpython-310.pyc deleted file mode 100644 index 35c35a53b72a215af1f433fd0a3107d8cb5c14dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1203 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 T%(ENRbM7(UGCKx&V-5B{{B^&% diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_slp_switch.cpython-310.pyc b/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_slp_switch.cpython-310.pyc deleted file mode 100644 index 8b08917045ca3344b3bfd14e855a25fe2d74c266..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 776 zcmZ`%L5tH+5Pp-SX&T$&K}0+Syx2pxXGNA>cTo_j3+`URgP7(`lWgNlcrWR)dlAH| z|DiqlYrN;`sei$f^IFRm!3Q(Re3{IA-@GXY1E10P^z%j5w;20ng2Urba6+ala)O0S zfUpV(0WDz*M|8ehz)}|4!WG?bEOZdAJ1ZBRHH2O4uDmq^hPLohSXlbmJN6Y0QPE2+ z!Y2k74tAs7{;RM)vXOsx;-3aJ>N?16^Sx zvgadz9_NKV@;AhrP4AwXFuG3&avi8fN-A_Yg0?d+8l5F3_wd*hoRR5cay46lfHeTC zt(CoI*UqYA)NOI=Ke%mh!AOfU-2heD(3IK66dt*)LlkuDZZ(M3OBJFlunzqc>!eW% zW!<_}ynF7H{b1?={k(O*zns0~R~nV((>y7QSo04O&sDxe{<={ZH(UH1m;5rr@kN&N zi`zOYC4WP?3qC8#bWF|p66KP=&u3icHIAz|S;Q%7zUMPBH=rl~jPR(sZJl`|lOgfZ zW{rFpg0Uf}f#GOWDziZ&zwJhmD3d5s9>r~^Qn{>^YZ6Rq*o*ef!bewfCpDfG`1bEe zT1b^?5k963Nbuk$BUGwX_e0se^-UM=)#p+)1snG$K@Z7%bSRVAd9`W?xA-K@D F{{Z(Z%kcmJ diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_switch_three_greenlets.cpython-310.pyc b/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_switch_three_greenlets.cpython-310.pyc deleted file mode 100644 index b20a7f502fbacd4a0b90243d565adf9ef4afb084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1166 zcmZuv&2G~`5Z-lc$8nNURfrQpzDA-gt$G0=ME`=2s!)}}A+ls#@78vk*wOAfrBOMR z8xqfuaN`|#2kyRd>ML+!X5G;8v(nDa&dkoY^UdV#wo72W`~EojRwLvGUT!b2k>{{w z27-}3VU!sI+6UP;VAohJG?~e)kECxgo7Lg8nZp`z);XOz+?r8JK%?BA(Y~RzI%qX+ zOdHJAUY9j5F$yg$v@qi}>9i+P_l@Mz3q2*mhH^O7SC@4tV3)pf4gaXoHdO^O>1M-2g^*Bri!Tf6pv?rJc$d%D~+0d=TPA(unIDL!M zG)(HyyHw!yzhrJ>@FNgNCeF$YfhXqFnvoBhM)W|0c|k4>h(RK)-lPFj5U&NI$POoq z2V50Gk5FZrG`lzgqY%5_u?4nHm>^1L{_)a{xw@W@(yk(f4Iv%cZ{h$2*EXbEb1oW~ zz^)MPfvyX6pwI;p{TsCe+f}n|Gw*?G0@S}@?097N>8r8BiAgM_$ zB&&2;^c!Zn>(>pQIlFfqlryz>cHqwm-b+E8D937y}}rQhncg& z6QVsAJcE&?M?LWR%vug;pY?Bu#t!L#_1_ZMr4YjoG1@{r*h1`dh}{lhEWH(4pS;&a zhjgD=>SRhT(fDC~?VV+}%)g1VJQA-mnamB|}OlQ_@)tdOOj z9!0z={8wd_Q$J2*1uOUdlzEFd&*-7|H^_y~uM#zE8U_b6Mqfi0-++;5i79>!FZmd? zyd|MV3X$LN1^N|XBn|!vHDg1XON&}c89>fvWcy@epTJNTT zf5Xc=U$5O%MN$uXXD83TKk+qUY&Q;PqRORc?07zB1#PT32ZGIDBSjgdK|`S1ZDfoa zGv=xI9q~Tg_0KQIkHc%hxCqa)q|9Rxepj#;JX^5vdBs^=>G%t_2(M=B;N>g}U*5}E zS%jy6y$z>%nI6E^;er*5@GP5#B9rW39w)bP%0#$H!XwFq6p#KVOTpp%zUg&LM@r-Y zm_59MO=4mXKg4_pfkbJvX#^ZqGDC|D%Fjpxk5i$OPd-i{03{3`5Lz< zYC#U{^V&|2e9)%ueOs&xr0#3|+iIytu&(Fxn6pCG4$Ns;u(89{8@MVCZi8vu4e!QF znM^9K@QvN><2`_kNn^lW6MaFnUQij)Y2k`_1Mg8)`Vsg-ee)4^L5vYLG2esfhlThY zR^Jt3X@CH#4B>;m!SL2^ysj21907olgsO~tINmZQR74rEt4qXiXZ%?Bkn3Tidma?Rh2p;Ts^sQ z1(WS>Rthxur~eA0P3}7qxKHj%TIKAiDr|8G#zd~EY92aqiQ97>&+~|fJrD*glt61; H@J9Gw&7N|v diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_switch_two_greenlets.cpython-310.pyc b/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/fail_switch_two_greenlets.cpython-310.pyc deleted file mode 100644 index 17688d7e0609135797e3b3235e4f65cec99da97a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1185 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 diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_contextvars.cpython-310.pyc b/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_contextvars.cpython-310.pyc deleted file mode 100644 index f250750312ba0ed28251fc911c26cf1b32c9dd29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8068 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 Qek*=Uaf*Kof%&8V1wUzZn*aa+ diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_cpp.cpython-310.pyc b/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_cpp.cpython-310.pyc deleted file mode 100644 index afb163dba8b27ab7374630cb45a44f96eb90edee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2798 zcma)7&2QT_6c;I3mK`Te)6Z>f;h|VDZ%w*x-Ov`@ur2Af0)rc@DVhl$G)1IsIWpyv zRFWF$FP@&R8u0!4*RAd! zK>dxAgP#SHuc4_FI%Y5u8GYgsf;0u1x-_TF$aGCuGb78j^0DNWn8iww-7mXk;IWtu zwBtHCT?V@1R*3Pv!5mh3YOo4-woSLnr&x8J$~)ZJsf`WbH6P@yG4&iYFd8JA8OTs* zubqfMhp~W_6aJctqeOEr>KDyTo zQ1ZcV&*~pwl^ZT$hD#Y?^r-<>n#_U`Y-2WzC01q*j5aUtIK09tW6G**>Z!3!+$yWF zY1o@$GY^c$iOgACUdFpsfC^4NysZRn5t>?su49ad248QJCF7U55!GaeXxcN!WMro1 zj+N3eL?9(Qr4-hP@z~aOT5#7|bVPy6*eN6D*Z^LL(Bq5D01asKIbPOqvXb;ghi6Vl zaxNmSB`T1e*>zXI2k2T)ZH7ANX7*(C2LmoxR^cM)bLngDPWei4sqa2c{HS4Nmf}&{ ztxTk1_^Z%n$sDm>4lhl@vT&sR0fj@851)$zEf3b8KtNg;kuk#bFd_^P?a`g0 zw{&R?Ni(J+D>Zv|YUy%Hw6jgsrIhq4f~2Hlj!J21WJAEJda73&liyE{%0Nx0C1%1n z!>r#-VmyKeXTiS>v~aE)>dQ?CJpMmJOUu0zBL`&6j*U?T#*?Yjn@b@TVGm}k1oKn* z3`R%m?yja6o><+F`^!FRSt`9wgddi+ENIRVbA9MZn># zmdJ+ep6Awz1pCPk6<1kRC2Ip22VALaZqbh-&X$YmT`6Ok)q*Y$*1b5xC&sx~I~?&~zyr;hC%H}}TF8~xj-}_X0eZmtdH=h;LLSW>aQs zUxHM54kq$^zM=vd4s>S0hH~dTPfI`GYmld2DB3X?Z-Pb{J|`{9rH7 z-z4`HY{D!tp<%lJgXTgy8JhHR1VT)CMw$&%F2GI>A?|yJo{;X!c+(RxgqJ-dxyKG$ zc_lxxZ(+f_Z)gz~HIFLbQ=Fy4YkQWw-PvPplGjl4PoR6nit|TW0Vc@n$d71tAWWAJ zDFJ-1X`i3_49*R&9;f?J$A*_zS66S>SGw@VSj<&j#JV0xUv=xTs6Pq?i#K1bCg>pq z`5d6$1p*_+2-FS&6u?nR5D4;mU^d;e@Nzw0c@yyTifkUfvx0#W^|p-rbzju?YUo0P z7U8}EvVq2=keG&ty>j!-UO8~(q?GRl`g0Jb5NE59%(O&_^J4hTTRQD{smG>(nt`h( zPTF-0ZMq+!WA>AB4?^Gx?>j384AmfoM~=#kj}Lj_O>**(Vf<$3@Wyclzezx|QImBz zpH)4tAG0I}+M4HKbuREUuY`rRp8})2f!t0aLXCR5wptGd_u8_Idl(1#1$O)So>PcT z5{n>~)x4xS2tpO-oMTn3Dy`M>T}1J|5AO0B)2LB90kj27muR9yRFUsvcMH2I=&}Ms tq>T%?3V2Cjk%f|uQY3Tk6sCTKSfvnvYetPY6f~k(=%LJ0=S~d@{r^(`1{nYV diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_extension_interface.cpython-310.pyc b/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_extension_interface.cpython-310.pyc deleted file mode 100644 index 47af2145f5c6e9004201a0ac8939ec313d4c2512..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4687 zcma)ATW=f372erhl1qxBWm|T9QQCFV#AXvaaZm(J>KcwO4GI*hQM+kP5ZJDEMj~Z$ zSDhJ379qbx2I@W({R`rwe@)-_wNH91g1!`O)bGrQS5amjIrE)!zH^q@;$p?Y z=MR7TqV><3iPDD(1jSAK5RRT>phIanAtSmQl0rCvG2sZO2c zwJq6Bb+q0~6Wz{IjGT$rRMzQf5w*KpnbfO?%uYQMX`yr^UTBdjJ2!ZWkq5C732is| zaq(~uMR8QZX)x|IT+X=r%E5I!?xV$JcoA*E3g0O5GOysd#20uKZNL|K4Q-j9;Y(;M z{476*c7dPg%V?|o0>6lMk-ziAsb9*=559W*OOi+>B=Yb>{W8h}6cwV{a}I#FW(ThJ z4m|F1@0BxP_!`8qmA`uU8Rnh16z%i`d;{ zq}$D3wbz=et;Nl)IC&m#2-Vz>LZls`KOvPUQ;!uBL8C&h$BDSLwVMZbI&pW6$9K<= z0ci~b;~GK?X-2$x^<_MC2>dHMaQnG`}snwa1Z_HkG;4f3s{~nOf1QRp(t-y z?kmw*AA=wl2opMX5k(bI`D~d5NBs+PkDt<-huH+J(b_F^tns{L8rs`~wqCl>BjcWS zH@!WVJcAei;*E4zT21J#!w>bTkopwuyN6Ad@%VzFeX{Si!M?o|^#lc%Qmw&Xn(9QqDGJ zq>@)Ld=|xk8nBAH!ul(3lj{VwB$&bWV{~S*JzxXJ;OlY+KH~4W6W-yiCRj51(7nhX z46^spIo`}Mih^UkWP6M@WHjOqoK5clBLh&~=-Jl=?(Lf~j*Z}eQ%BHQbc{LTN9bT7 zHr#X%yyI;rpM1{t*|!Y7*?<2@E9-T5n2K#7!&ba4Lik?N5sm_aAv2CqiTR-=qVqj}=U5AZWtxHV(9R=ddh zmrfI7%7lrE$s~*kSJAO1K_T;rBhO<1Kp3_vbacY7he1VBjG};Y9qojCRGzoOl8o;swIyJK{aUMzc)>-A#W; z(^gZ3ylR8YZ{oHR%KBsV>*E;r=tWx_RW>dektI!vxQO}as`DhzCua{aG0Q$BiEK0q z$nf8rxsp9#YRRcLlXYx%d<#hyWQ8vX!xP2;FHcB4+SL9&&lEqwCO@H#2=)H^ZihNkw=r>e6fEnwK3N z?7O^hJnHMR9mUKdFAY5Fc=g~UaZ|7*e^jfe`ju(w{+;nx-_ic=y9^P6Ij^0Af-WAE z28bh<5j~jmY&gf+40b=Xvvm1ewqv}7Osrn9tT-Y>!%lhSo4C^xhOzS^k|~k$+*7+M z55$WENz!^IKf-E5o5ta63L{eMea790zR+4DjUnN&*MapU zNhis}`|pi~33p-@rkM_nq4BVthM0S!-e1!3a{;oCb*OsC^seSv9Dd%2Cq>YO8s;9Ci@=9B^Q>EiH5t1ALNN71p({hDmHEd(d z&s_g=jQtcvQJC>r)vc5eH4rn*X$c(9Z(V1GRi zyMz^L|DZ5%bWs=g@!P;>4jG7#?>;On4Q@N?>JChTzRyswzNCXawpoT9j`Md!{@VtN z8+8hul7~pmdR;{Ju-j8QToYj&YKa7S4GDFat!;`#161=`%NmW1A4_9skz&V* z9@|=8e)J*{TlC^&iS-M!0j$dozHv)23r8Tp zWOt3VoAfIVm7r^C5pI)r))y>mehI-0-jcj+46(d}$9(ZV-ZAH3Eq_jv?@~1#CiAOC zYeQ+GY(3hMS-KHvDEArWPay1%5e^K(vx(6BT}}u2DfS z0PGHiDTKG0d+}P*zdZt1jSM=$dn01!$6+QxDAv*OL^MN=Uj8326KO~?-_s$rZzns#MfEDlw%*ftZI2>J940BaO8SeyM*CySrIf-fmXFYD1iiGa$qaL!cA6&; dUe4{M?^2AgHVMBE+`z4ZV3+(r1Ze&5{|kT;G8+H@ diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_gc.cpython-310.pyc b/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_gc.cpython-310.pyc deleted file mode 100644 index ccf6d61add2b3d97b9e239d0acff6c54b635ca76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3172 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 diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_version.cpython-310.pyc b/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_version.cpython-310.pyc deleted file mode 100644 index 9699ba0af115787b41a16aa07bec691edbe680d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1593 zcmZ`(&2HO95Z>jV7+L;lAXH8pw7le?0#?ye(K-my*l90;YQRa25G+_)yOL;8OJ;W| z#{yLpb0X98v?K}lw(@oajC!)I#B}(2XCGROpt~H80vQrYs&?ldlhB& zC0$r2M11HFO)ef#val(cZ&zeVnWL==_B&(+l$?;4K+D4Z(H8FdeNN9IZEc@9l{K{9 zCkscrORsWP^w+J0Te-`|iY)yVS$HR4>A>$2d<*|Gq7Kf%BmQ2(fLM1bPdCptRyEy_ zkJtZC3Q#|Cj4AvELX$JPv?>55{R-40vY@rjt|b6j(G?`7Jw`9-A^HB3h0UxHt?V|y ztZ?RZAn*v1TexU*)~MWH0P5OH<$*QOv-ELBZ{opRKB+tlKp&G=yBg|Tkq-1jhv;Sn zkvim({!F`W|1B~;w|c#K`yekf7KmI2!&ER384u>o{a`TWg9&Frcf(k@GER}`vGMrp z6bfh>&@#26!BQ!bDK~x`qiGx)S0-Y_jdPZ#!gxthaKX&hS4we-z4TPdTpC+x*=-mH zZ9`Yflr!Uux#WhX#wrWx13=>rasLk@JFxn@I`}er0bW$pPX~FHsOVe44`n*z(UVg0 zq^$Lad=@<)^Sz^S8XaBeaW0~-;p`+j&GOM6z=>vD%%W%MX{1uk_ljgNNk&{nBgwhQ zxc*dQkJd7tt-H2YT$nb}6SI7pibSVkRHwTQxYT_RE$UFmYSR{N(jAcaZc(3FSG(5y z^V`keL-+qWewgKhBvX%i@A5wP71w0}(dWGvA~}W1=zLwKn~nWoS}Gl!@*ppDkPib5 zS@eSW_5&5be{b(PgKkUi0L;)=leEB(P`(FCD8q#^P5zn>N{#*{evQU0awwW{fKz5% zIGYyXMp75>>8moyjDN$G*@$maiDRs%;@ME%LnmwOF)&AY*h*1Ap47HAZzfykW}-J%~+|0nBe%fb2mtGo96-v3hDhg%1l5*rAbvKhzIoRxKh zw&EDGSntRO;Qkf}>@` u4T+ZF-F_~f@nix$gT&(%DnG`<7~oxzjsI|s^%35a3Q53*@-4rXZRZ~-jHXin diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_weakref.cpython-310.pyc b/blog-app/venv/Lib/site-packages/greenlet/tests/__pycache__/test_weakref.cpython-310.pyc deleted file mode 100644 index 5fdf093daf40b85ba01b291a7904c7bf96ab51b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1886 zcmbVM&uFA;>@il-m~{7sX#E&Jdf@1=l4E;pS#P;6^74WuYYZ8kFkHL zGynM5xr49%1%qG$a@KS$G{N?HlM61q+}rn?KCt^t_#$}0L?HcRuNeq#M@chHEa|d7j9R|s03xo&3U$CYpJmF)D@FK)E5K9Ohnd&o{?md>f z1gbOIV)9@?j0)JoSJyE(q$4QVDGcG5jo^rv{L~vUU_*B55BV_`H{yU1vAxDZf&@)) zPYCX737y(EgO?VcA5L;XsE+8dP`^hM5-19jk4U0WdZ+$aq5;WvCQ(JK)I#+IHfogu9h|yE z;WC9UG1RzPqwgyeW^%JkU$K>RiZm-xVv{4KrBlMOmK*15d4I`5JrmZhA@Ix>}2d4>n3aQ6SSZ+=8)4Lf*oyJR6Ok!M^j z(-?|H7LHoWYIxXHds1DaOz4C-tin1U{BWK|G*XWCnGiqoj6+zse-LPTiKqZOHsQGw zT|8SwWL&4;$UlRhK4J5zVI3K^@HvfHQF%^O-yk*`=|`6a-HOh_YZHsimv?m5vddK>StYnxX5!=cC!@?WW<*`ZEyC$Y10`#h|#@_)A6t8Ol diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/_test_extension.c b/blog-app/venv/Lib/site-packages/greenlet/tests/_test_extension.c deleted file mode 100644 index 05e81c0..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/_test_extension.c +++ /dev/null @@ -1,231 +0,0 @@ -/* This is a set of functions used by test_extension_interface.py to test the - * Greenlet C API. - */ - -#include "../greenlet.h" - -#ifndef Py_RETURN_NONE -# define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None -#endif - -#define TEST_MODULE_NAME "_test_extension" - -static PyObject* -test_switch(PyObject* self, PyObject* greenlet) -{ - PyObject* result = NULL; - - if (greenlet == NULL || !PyGreenlet_Check(greenlet)) { - PyErr_BadArgument(); - return NULL; - } - - result = PyGreenlet_Switch((PyGreenlet*)greenlet, NULL, NULL); - if (result == NULL) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_AssertionError, - "greenlet.switch() failed for some reason."); - } - return NULL; - } - Py_INCREF(result); - return result; -} - -static PyObject* -test_switch_kwargs(PyObject* self, PyObject* args, PyObject* kwargs) -{ - PyGreenlet* g = NULL; - PyObject* result = NULL; - - PyArg_ParseTuple(args, "O!", &PyGreenlet_Type, &g); - - if (g == NULL || !PyGreenlet_Check(g)) { - PyErr_BadArgument(); - return NULL; - } - - result = PyGreenlet_Switch(g, NULL, kwargs); - if (result == NULL) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_AssertionError, - "greenlet.switch() failed for some reason."); - } - return NULL; - } - Py_XINCREF(result); - return result; -} - -static PyObject* -test_getcurrent(PyObject* self) -{ - PyGreenlet* g = PyGreenlet_GetCurrent(); - if (g == NULL || !PyGreenlet_Check(g) || !PyGreenlet_ACTIVE(g)) { - PyErr_SetString(PyExc_AssertionError, - "getcurrent() returned an invalid greenlet"); - Py_XDECREF(g); - return NULL; - } - Py_DECREF(g); - Py_RETURN_NONE; -} - -static PyObject* -test_setparent(PyObject* self, PyObject* arg) -{ - PyGreenlet* current; - PyGreenlet* greenlet = NULL; - - if (arg == NULL || !PyGreenlet_Check(arg)) { - PyErr_BadArgument(); - return NULL; - } - if ((current = PyGreenlet_GetCurrent()) == NULL) { - return NULL; - } - greenlet = (PyGreenlet*)arg; - if (PyGreenlet_SetParent(greenlet, current)) { - Py_DECREF(current); - return NULL; - } - Py_DECREF(current); - if (PyGreenlet_Switch(greenlet, NULL, NULL) == NULL) { - return NULL; - } - Py_RETURN_NONE; -} - -static PyObject* -test_new_greenlet(PyObject* self, PyObject* callable) -{ - PyObject* result = NULL; - PyGreenlet* greenlet = PyGreenlet_New(callable, NULL); - - if (!greenlet) { - return NULL; - } - - result = PyGreenlet_Switch(greenlet, NULL, NULL); - Py_CLEAR(greenlet); - if (result == NULL) { - return NULL; - } - - Py_INCREF(result); - return result; -} - -static PyObject* -test_raise_dead_greenlet(PyObject* self) -{ - PyErr_SetString(PyExc_GreenletExit, "test GreenletExit exception."); - return NULL; -} - -static PyObject* -test_raise_greenlet_error(PyObject* self) -{ - PyErr_SetString(PyExc_GreenletError, "test greenlet.error exception"); - return NULL; -} - -static PyObject* -test_throw(PyObject* self, PyGreenlet* g) -{ - const char msg[] = "take that sucka!"; - PyObject* msg_obj = Py_BuildValue("s", msg); - PyGreenlet_Throw(g, PyExc_ValueError, msg_obj, NULL); - Py_DECREF(msg_obj); - if (PyErr_Occurred()) { - return NULL; - } - Py_RETURN_NONE; -} - -static PyObject* -test_throw_exact(PyObject* self, PyObject* args) -{ - PyGreenlet* g = NULL; - PyObject* typ = NULL; - PyObject* val = NULL; - PyObject* tb = NULL; - - if (!PyArg_ParseTuple(args, "OOOO:throw", &g, &typ, &val, &tb)) { - return NULL; - } - - PyGreenlet_Throw(g, typ, val, tb); - if (PyErr_Occurred()) { - return NULL; - } - Py_RETURN_NONE; -} - -static PyMethodDef test_methods[] = { - {"test_switch", - (PyCFunction)test_switch, - METH_O, - "Switch to the provided greenlet sending provided arguments, and \n" - "return the results."}, - {"test_switch_kwargs", - (PyCFunction)test_switch_kwargs, - METH_VARARGS | METH_KEYWORDS, - "Switch to the provided greenlet sending the provided keyword args."}, - {"test_getcurrent", - (PyCFunction)test_getcurrent, - METH_NOARGS, - "Test PyGreenlet_GetCurrent()"}, - {"test_setparent", - (PyCFunction)test_setparent, - METH_O, - "Se the parent of the provided greenlet and switch to it."}, - {"test_new_greenlet", - (PyCFunction)test_new_greenlet, - METH_O, - "Test PyGreenlet_New()"}, - {"test_raise_dead_greenlet", - (PyCFunction)test_raise_dead_greenlet, - METH_NOARGS, - "Just raise greenlet.GreenletExit"}, - {"test_raise_greenlet_error", - (PyCFunction)test_raise_greenlet_error, - METH_NOARGS, - "Just raise greenlet.error"}, - {"test_throw", - (PyCFunction)test_throw, - METH_O, - "Throw a ValueError at the provided greenlet"}, - {"test_throw_exact", - (PyCFunction)test_throw_exact, - METH_VARARGS, - "Throw exactly the arguments given at the provided greenlet"}, - {NULL, NULL, 0, NULL} -}; - - -#define INITERROR return NULL - -static struct PyModuleDef moduledef = {PyModuleDef_HEAD_INIT, - TEST_MODULE_NAME, - NULL, - 0, - test_methods, - NULL, - NULL, - NULL, - NULL}; - -PyMODINIT_FUNC -PyInit__test_extension(void) -{ - PyObject* module = NULL; - module = PyModule_Create(&moduledef); - - if (module == NULL) { - return NULL; - } - - PyGreenlet_Import(); - return module; -} diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/_test_extension.cp310-win_amd64.pyd b/blog-app/venv/Lib/site-packages/greenlet/tests/_test_extension.cp310-win_amd64.pyd deleted file mode 100644 index d9a6c6aab2d24916b4c66924560dfe81556ef5cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14336 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 HH2%K;St{oV diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/_test_extension_cpp.cp310-win_amd64.pyd b/blog-app/venv/Lib/site-packages/greenlet/tests/_test_extension_cpp.cp310-win_amd64.pyd deleted file mode 100644 index ebc3cbf80721dc9792032e071a382394216708d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15872 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 mw@TN51F4FFZvqL?zuZOhD&TX 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 -#include - -struct exception_t { - int depth; - exception_t(int depth) : depth(depth) {} -}; - -/* Functions are called via pointers to prevent inlining */ -static void (*p_test_exception_throw_nonstd)(int depth); -static void (*p_test_exception_throw_std)(); -static PyObject* (*p_test_exception_switch_recurse)(int depth, int left); - -static void -test_exception_throw_nonstd(int depth) -{ - throw exception_t(depth); -} - -static void -test_exception_throw_std() -{ - throw std::runtime_error("Thrown from an extension."); -} - -static PyObject* -test_exception_switch_recurse(int depth, int left) -{ - if (left > 0) { - return p_test_exception_switch_recurse(depth, left - 1); - } - - PyObject* result = NULL; - PyGreenlet* self = PyGreenlet_GetCurrent(); - if (self == NULL) - return NULL; - - try { - if (PyGreenlet_Switch(PyGreenlet_GET_PARENT(self), NULL, NULL) == NULL) { - Py_DECREF(self); - return NULL; - } - p_test_exception_throw_nonstd(depth); - PyErr_SetString(PyExc_RuntimeError, - "throwing C++ exception didn't work"); - } - catch (const exception_t& e) { - if (e.depth != depth) - PyErr_SetString(PyExc_AssertionError, "depth mismatch"); - else - result = PyLong_FromLong(depth); - } - catch (...) { - PyErr_SetString(PyExc_RuntimeError, "unexpected C++ exception"); - } - - Py_DECREF(self); - return result; -} - -/* test_exception_switch(int depth) - * - recurses depth times - * - switches to parent inside try/catch block - * - throws an exception that (expected to be caught in the same function) - * - verifies depth matches (exceptions shouldn't be caught in other greenlets) - */ -static PyObject* -test_exception_switch(PyObject* UNUSED(self), PyObject* args) -{ - int depth; - if (!PyArg_ParseTuple(args, "i", &depth)) - return NULL; - return p_test_exception_switch_recurse(depth, depth); -} - - -static PyObject* -py_test_exception_throw_nonstd(PyObject* self, PyObject* args) -{ - if (!PyArg_ParseTuple(args, "")) - return NULL; - p_test_exception_throw_nonstd(0); - PyErr_SetString(PyExc_AssertionError, "unreachable code running after throw"); - return NULL; -} - -static PyObject* -py_test_exception_throw_std(PyObject* self, PyObject* args) -{ - if (!PyArg_ParseTuple(args, "")) - return NULL; - p_test_exception_throw_std(); - PyErr_SetString(PyExc_AssertionError, "unreachable code running after throw"); - return NULL; -} - -static PyObject* -py_test_call(PyObject* self, PyObject* arg) -{ - PyObject* noargs = PyTuple_New(0); - PyObject* ret = PyObject_Call(arg, noargs, nullptr); - Py_DECREF(noargs); - return ret; -} - - - -/* test_exception_switch_and_do_in_g2(g2func) - * - creates new greenlet g2 to run g2func - * - switches to g2 inside try/catch block - * - verifies that no exception has been caught - * - * it is used together with test_exception_throw to verify that unhandled - * exceptions thrown in one greenlet do not propagate to other greenlet nor - * segfault the process. - */ -static PyObject* -test_exception_switch_and_do_in_g2(PyObject* self, PyObject* args) -{ - PyObject* g2func = NULL; - PyObject* result = NULL; - - if (!PyArg_ParseTuple(args, "O", &g2func)) - return NULL; - PyGreenlet* g2 = PyGreenlet_New(g2func, NULL); - if (!g2) { - return NULL; - } - - try { - result = PyGreenlet_Switch(g2, NULL, NULL); - if (!result) { - return NULL; - } - } - catch (const exception_t& e) { - /* if we are here the memory can be already corrupted and the program - * might crash before below py-level exception might become printed. - * -> print something to stderr to make it clear that we had entered - * this catch block. - * See comments in inner_bootstrap() - */ -#if defined(WIN32) || defined(_WIN32) - fprintf(stderr, "C++ exception unexpectedly caught in g1\n"); - PyErr_SetString(PyExc_AssertionError, "C++ exception unexpectedly caught in g1"); - Py_XDECREF(result); - return NULL; -#else - throw; -#endif - } - - Py_XDECREF(result); - Py_RETURN_NONE; -} - -static PyMethodDef test_methods[] = { - {"test_exception_switch", - (PyCFunction)&test_exception_switch, - METH_VARARGS, - "Switches to parent twice, to test exception handling and greenlet " - "switching."}, - {"test_exception_switch_and_do_in_g2", - (PyCFunction)&test_exception_switch_and_do_in_g2, - METH_VARARGS, - "Creates new greenlet g2 to run g2func and switches to it inside try/catch " - "block. Used together with test_exception_throw to verify that unhandled " - "C++ exceptions thrown in a greenlet doe not corrupt memory."}, - {"test_exception_throw_nonstd", - (PyCFunction)&py_test_exception_throw_nonstd, - METH_VARARGS, - "Throws non-standard C++ exception. Calling this function directly should abort the process." - }, - {"test_exception_throw_std", - (PyCFunction)&py_test_exception_throw_std, - METH_VARARGS, - "Throws standard C++ exception. Calling this function directly should abort the process." - }, - {"test_call", - (PyCFunction)&py_test_call, - METH_O, - "Call the given callable. Unlike calling it directly, this creates a " - "new C-level stack frame, which may be helpful in testing." - }, - {NULL, NULL, 0, NULL} -}; - - -static struct PyModuleDef moduledef = {PyModuleDef_HEAD_INIT, - "greenlet.tests._test_extension_cpp", - NULL, - 0, - test_methods, - NULL, - NULL, - NULL, - NULL}; - -PyMODINIT_FUNC -PyInit__test_extension_cpp(void) -{ - PyObject* module = NULL; - - module = PyModule_Create(&moduledef); - - if (module == NULL) { - return NULL; - } - - PyGreenlet_Import(); - if (_PyGreenlet_API == NULL) { - return NULL; - } - - p_test_exception_throw_nonstd = test_exception_throw_nonstd; - p_test_exception_throw_std = test_exception_throw_std; - p_test_exception_switch_recurse = test_exception_switch_recurse; - - return module; -} diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/fail_clearing_run_switches.py b/blog-app/venv/Lib/site-packages/greenlet/tests/fail_clearing_run_switches.py deleted file mode 100644 index 6dd1492..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/fail_clearing_run_switches.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -""" -If we have a run callable passed to the constructor or set as an -attribute, but we don't actually use that (because ``__getattribute__`` -or the like interferes), then when we clear callable before beginning -to run, there's an opportunity for Python code to run. - -""" -import greenlet - -g = None -main = greenlet.getcurrent() - -results = [] - -class RunCallable: - - def __del__(self): - results.append(('RunCallable', '__del__')) - main.switch('from RunCallable') - - -class G(greenlet.greenlet): - - def __getattribute__(self, name): - if name == 'run': - results.append(('G.__getattribute__', 'run')) - return run_func - return object.__getattribute__(self, name) - - -def run_func(): - results.append(('run_func', 'enter')) - - -g = G(RunCallable()) -# Try to start G. It will get to the point where it deletes -# its run callable C++ variable in inner_bootstrap. That triggers -# the __del__ method, which switches back to main before g -# actually even starts running. -x = g.switch() -results.append(('main: g.switch()', x)) -# In the C++ code, this results in g->g_switch() appearing to return, even though -# it has yet to run. -print('In main with', x, flush=True) -g.switch() -print('RESULTS', results) diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/fail_cpp_exception.py b/blog-app/venv/Lib/site-packages/greenlet/tests/fail_cpp_exception.py deleted file mode 100644 index fa4dc2e..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/fail_cpp_exception.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Helper for testing a C++ exception throw aborts the process. - -Takes one argument, the name of the function in :mod:`_test_extension_cpp` to call. -""" -import sys -import greenlet -from greenlet.tests import _test_extension_cpp -print('fail_cpp_exception is running') - -def run_unhandled_exception_in_greenlet_aborts(): - def _(): - _test_extension_cpp.test_exception_switch_and_do_in_g2( - _test_extension_cpp.test_exception_throw_nonstd - ) - g1 = greenlet.greenlet(_) - g1.switch() - - -func_name = sys.argv[1] -try: - func = getattr(_test_extension_cpp, func_name) -except AttributeError: - if func_name == run_unhandled_exception_in_greenlet_aborts.__name__: - func = run_unhandled_exception_in_greenlet_aborts - elif func_name == 'run_as_greenlet_target': - g = greenlet.greenlet(_test_extension_cpp.test_exception_throw_std) - func = g.switch - else: - raise -print('raising', func, flush=True) -func() diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/fail_initialstub_already_started.py b/blog-app/venv/Lib/site-packages/greenlet/tests/fail_initialstub_already_started.py deleted file mode 100644 index c1a44ef..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/fail_initialstub_already_started.py +++ /dev/null @@ -1,78 +0,0 @@ -""" -Testing initialstub throwing an already started exception. -""" - -import greenlet - -a = None -b = None -c = None -main = greenlet.getcurrent() - -# If we switch into a dead greenlet, -# we go looking for its parents. -# if a parent is not yet started, we start it. - -results = [] - -def a_run(*args): - #results.append('A') - results.append(('Begin A', args)) - - -def c_run(): - results.append('Begin C') - b.switch('From C') - results.append('C done') - -class A(greenlet.greenlet): pass - -class B(greenlet.greenlet): - doing_it = False - def __getattribute__(self, name): - if name == 'run' and not self.doing_it: - assert greenlet.getcurrent() is c - self.doing_it = True - results.append('Switch to b from B.__getattribute__ in ' - + type(greenlet.getcurrent()).__name__) - b.switch() - results.append('B.__getattribute__ back from main in ' - + type(greenlet.getcurrent()).__name__) - if name == 'run': - name = '_B_run' - return object.__getattribute__(self, name) - - def _B_run(self, *arg): - results.append(('Begin B', arg)) - results.append('_B_run switching to main') - main.switch('From B') - -class C(greenlet.greenlet): - pass -a = A(a_run) -b = B(parent=a) -c = C(c_run, b) - -# Start a child; while running, it will start B, -# but starting B will ALSO start B. -result = c.switch() -results.append(('main from c', result)) - -# Switch back to C, which was in the middle of switching -# already. This will throw the ``GreenletStartedWhileInPython`` -# exception, which results in parent A getting started (B is finished) -c.switch() - -results.append(('A dead?', a.dead, 'B dead?', b.dead, 'C dead?', c.dead)) - -# A and B should both be dead now. -assert a.dead -assert b.dead -assert not c.dead - -result = c.switch() -results.append(('main from c.2', result)) -# Now C is dead -assert c.dead - -print("RESULTS:", results) diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/fail_slp_switch.py b/blog-app/venv/Lib/site-packages/greenlet/tests/fail_slp_switch.py deleted file mode 100644 index 0990526..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/fail_slp_switch.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -""" -A test helper for seeing what happens when slp_switch() -fails. -""" -# pragma: no cover - -import greenlet - - -print('fail_slp_switch is running', flush=True) - -runs = [] -def func(): - runs.append(1) - greenlet.getcurrent().parent.switch() - runs.append(2) - greenlet.getcurrent().parent.switch() - runs.append(3) - -g = greenlet._greenlet.UnswitchableGreenlet(func) -g.switch() -assert runs == [1] -g.switch() -assert runs == [1, 2] -g.force_slp_switch_error = True - -# This should crash. -g.switch() diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets.py b/blog-app/venv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets.py deleted file mode 100644 index e151b19..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets.py +++ /dev/null @@ -1,44 +0,0 @@ -""" -Uses a trace function to switch greenlets at unexpected times. - -In the trace function, we switch from the current greenlet to another -greenlet, which switches -""" -import greenlet - -g1 = None -g2 = None - -switch_to_g2 = False - -def tracefunc(*args): - print('TRACE', *args) - global switch_to_g2 - if switch_to_g2: - switch_to_g2 = False - g2.switch() - print('\tLEAVE TRACE', *args) - -def g1_run(): - print('In g1_run') - global switch_to_g2 - switch_to_g2 = True - from_parent = greenlet.getcurrent().parent.switch() - print('Return to g1_run') - print('From parent', from_parent) - -def g2_run(): - #g1.switch() - greenlet.getcurrent().parent.switch() - -greenlet.settrace(tracefunc) - -g1 = greenlet.greenlet(g1_run) -g2 = greenlet.greenlet(g2_run) - -# This switch didn't actually finish! -# And if it did, it would raise TypeError -# because g1_run() doesn't take any arguments. -g1.switch(1) -print('Back in main') -g1.switch(2) diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets2.py b/blog-app/venv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets2.py deleted file mode 100644 index 1f6b66b..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets2.py +++ /dev/null @@ -1,55 +0,0 @@ -""" -Like fail_switch_three_greenlets, but the call into g1_run would actually be -valid. -""" -import greenlet - -g1 = None -g2 = None - -switch_to_g2 = True - -results = [] - -def tracefunc(*args): - results.append(('trace', args[0])) - print('TRACE', *args) - global switch_to_g2 - if switch_to_g2: - switch_to_g2 = False - g2.switch('g2 from tracefunc') - print('\tLEAVE TRACE', *args) - -def g1_run(arg): - results.append(('g1 arg', arg)) - print('In g1_run') - from_parent = greenlet.getcurrent().parent.switch('from g1_run') - results.append(('g1 from parent', from_parent)) - return 'g1 done' - -def g2_run(arg): - #g1.switch() - results.append(('g2 arg', arg)) - parent = greenlet.getcurrent().parent.switch('from g2_run') - global switch_to_g2 - switch_to_g2 = False - results.append(('g2 from parent', parent)) - return 'g2 done' - - -greenlet.settrace(tracefunc) - -g1 = greenlet.greenlet(g1_run) -g2 = greenlet.greenlet(g2_run) - -x = g1.switch('g1 from main') -results.append(('main g1', x)) -print('Back in main', x) -x = g1.switch('g2 from main') -results.append(('main g2', x)) -print('back in amain again', x) -x = g1.switch('g1 from main 2') -results.append(('main g1.2', x)) -x = g2.switch() -results.append(('main g2.2', x)) -print("RESULTS:", results) diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/fail_switch_two_greenlets.py b/blog-app/venv/Lib/site-packages/greenlet/tests/fail_switch_two_greenlets.py deleted file mode 100644 index 3e52345..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/fail_switch_two_greenlets.py +++ /dev/null @@ -1,41 +0,0 @@ -""" -Uses a trace function to switch greenlets at unexpected times. - -In the trace function, we switch from the current greenlet to another -greenlet, which switches -""" -import greenlet - -g1 = None -g2 = None - -switch_to_g2 = False - -def tracefunc(*args): - print('TRACE', *args) - global switch_to_g2 - if switch_to_g2: - switch_to_g2 = False - g2.switch() - print('\tLEAVE TRACE', *args) - -def g1_run(): - print('In g1_run') - global switch_to_g2 - switch_to_g2 = True - greenlet.getcurrent().parent.switch() - print('Return to g1_run') - print('Falling off end of g1_run') - -def g2_run(): - g1.switch() - print('Falling off end of g2') - -greenlet.settrace(tracefunc) - -g1 = greenlet.greenlet(g1_run) -g2 = greenlet.greenlet(g2_run) - -g1.switch() -print('Falling off end of main') -g2.switch() diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/leakcheck.py b/blog-app/venv/Lib/site-packages/greenlet/tests/leakcheck.py deleted file mode 100644 index a5152fb..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/leakcheck.py +++ /dev/null @@ -1,319 +0,0 @@ -# Copyright (c) 2018 gevent community -# Copyright (c) 2021 greenlet community -# -# This was originally part of gevent's test suite. The main author -# (Jason Madden) vendored a copy of it into greenlet. -# -# 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. -from __future__ import print_function - -import os -import sys -import gc - -from functools import wraps -import unittest - - -import objgraph - -# graphviz 0.18 (Nov 7 2021), available only on Python 3.6 and newer, -# has added type hints (sigh). It wants to use ``typing.Literal`` for -# some stuff, but that's only available on Python 3.9+. If that's not -# found, it creates a ``unittest.mock.MagicMock`` object and annotates -# with that. These are GC'able objects, and doing almost *anything* -# with them results in an explosion of objects. For example, trying to -# compare them for equality creates new objects. This causes our -# leakchecks to fail, with reports like: -# -# greenlet.tests.leakcheck.LeakCheckError: refcount increased by [337, 1333, 343, 430, 530, 643, 769] -# _Call 1820 +546 -# dict 4094 +76 -# MagicProxy 585 +73 -# tuple 2693 +66 -# _CallList 24 +3 -# weakref 1441 +1 -# function 5996 +1 -# type 736 +1 -# cell 592 +1 -# MagicMock 8 +1 -# -# To avoid this, we *could* filter this type of object out early. In -# principle it could leak, but we don't use mocks in greenlet, so it -# doesn't leak from us. However, a further issue is that ``MagicMock`` -# objects have subobjects that are also GC'able, like ``_Call``, and -# those create new mocks of their own too. So we'd have to filter them -# as well, and they're not public. That's OK, we can workaround the -# problem by being very careful to never compare by equality or other -# user-defined operators, only using object identity or other builtin -# functions. - -RUNNING_ON_GITHUB_ACTIONS = os.environ.get('GITHUB_ACTIONS') -RUNNING_ON_TRAVIS = os.environ.get('TRAVIS') or RUNNING_ON_GITHUB_ACTIONS -RUNNING_ON_APPVEYOR = os.environ.get('APPVEYOR') -RUNNING_ON_CI = RUNNING_ON_TRAVIS or RUNNING_ON_APPVEYOR -RUNNING_ON_MANYLINUX = os.environ.get('GREENLET_MANYLINUX') -SKIP_LEAKCHECKS = RUNNING_ON_MANYLINUX or os.environ.get('GREENLET_SKIP_LEAKCHECKS') -SKIP_FAILING_LEAKCHECKS = os.environ.get('GREENLET_SKIP_FAILING_LEAKCHECKS') -ONLY_FAILING_LEAKCHECKS = os.environ.get('GREENLET_ONLY_FAILING_LEAKCHECKS') - -def ignores_leakcheck(func): - """ - Ignore the given object during leakchecks. - - Can be applied to a method, in which case the method will run, but - will not be subject to leak checks. - - If applied to a class, the entire class will be skipped during leakchecks. This - is intended to be used for classes that are very slow and cause problems such as - test timeouts; typically it will be used for classes that are subclasses of a base - class and specify variants of behaviour (such as pool sizes). - """ - func.ignore_leakcheck = True - return func - -def fails_leakcheck(func): - """ - Mark that the function is known to leak. - """ - func.fails_leakcheck = True - if SKIP_FAILING_LEAKCHECKS: - func = unittest.skip("Skipping known failures")(func) - return func - -class LeakCheckError(AssertionError): - pass - -if hasattr(sys, 'getobjects'): - # In a Python build with ``--with-trace-refs``, make objgraph - # trace *all* the objects, not just those that are tracked by the - # GC - class _MockGC(object): - def get_objects(self): - return sys.getobjects(0) # pylint:disable=no-member - def __getattr__(self, name): - return getattr(gc, name) - objgraph.gc = _MockGC() - fails_strict_leakcheck = fails_leakcheck -else: - def fails_strict_leakcheck(func): - """ - Decorator for a function that is known to fail when running - strict (``sys.getobjects()``) leakchecks. - - This type of leakcheck finds all objects, even those, such as - strings, which are not tracked by the garbage collector. - """ - return func - -class ignores_types_in_strict_leakcheck(object): - def __init__(self, types): - self.types = types - def __call__(self, func): - func.leakcheck_ignore_types = self.types - return func - -class _RefCountChecker(object): - - # Some builtin things that we ignore - # XXX: Those things were ignored by gevent, but they're important here, - # presumably. - IGNORED_TYPES = () #(tuple, dict, types.FrameType, types.TracebackType) - - def __init__(self, testcase, function): - self.testcase = testcase - self.function = function - self.deltas = [] - self.peak_stats = {} - self.ignored_types = () - - # The very first time we are called, we have already been - # self.setUp() by the test runner, so we don't need to do it again. - self.needs_setUp = False - - def _include_object_p(self, obj): - # pylint:disable=too-many-return-statements - # - # See the comment block at the top. We must be careful to - # avoid invoking user-defined operations. - if obj is self: - return False - kind = type(obj) - # ``self._include_object_p == obj`` returns NotImplemented - # for non-function objects, which causes the interpreter - # to try to reverse the order of arguments...which leads - # to the explosion of mock objects. We don't want that, so we implement - # the check manually. - if kind == type(self._include_object_p): - try: - # pylint:disable=not-callable - exact_method_equals = self._include_object_p.__eq__(obj) - except AttributeError: - # Python 2.7 methods may only have __cmp__, and that raises a - # TypeError for non-method arguments - # pylint:disable=no-member - exact_method_equals = self._include_object_p.__cmp__(obj) == 0 - - if exact_method_equals is not NotImplemented and exact_method_equals: - return False - - # Similarly, we need to check identity in our __dict__ to avoid mock explosions. - for x in self.__dict__.values(): - if obj is x: - return False - - - if kind in self.ignored_types or kind in self.IGNORED_TYPES: - return False - - return True - - def _growth(self): - return objgraph.growth(limit=None, peak_stats=self.peak_stats, - filter=self._include_object_p) - - def _report_diff(self, growth): - if not growth: - return "" - - lines = [] - width = max(len(name) for name, _, _ in growth) - for name, count, delta in growth: - lines.append('%-*s%9d %+9d' % (width, name, count, delta)) - - diff = '\n'.join(lines) - return diff - - - def _run_test(self, args, kwargs): - gc_enabled = gc.isenabled() - gc.disable() - - if self.needs_setUp: - self.testcase.setUp() - self.testcase.skipTearDown = False - try: - self.function(self.testcase, *args, **kwargs) - finally: - self.testcase.tearDown() - self.testcase.doCleanups() - self.testcase.skipTearDown = True - self.needs_setUp = True - if gc_enabled: - gc.enable() - - def _growth_after(self): - # Grab post snapshot - # pylint:disable=no-member - if 'urlparse' in sys.modules: - sys.modules['urlparse'].clear_cache() - if 'urllib.parse' in sys.modules: - sys.modules['urllib.parse'].clear_cache() - - return self._growth() - - def _check_deltas(self, growth): - # Return false when we have decided there is no leak, - # true if we should keep looping, raises an assertion - # if we have decided there is a leak. - - deltas = self.deltas - if not deltas: - # We haven't run yet, no data, keep looping - return True - - if gc.garbage: - raise LeakCheckError("Generated uncollectable garbage %r" % (gc.garbage,)) - - - # the following configurations are classified as "no leak" - # [0, 0] - # [x, 0, 0] - # [... a, b, c, d] where a+b+c+d = 0 - # - # the following configurations are classified as "leak" - # [... z, z, z] where z > 0 - - if deltas[-2:] == [0, 0] and len(deltas) in (2, 3): - return False - - if deltas[-3:] == [0, 0, 0]: - return False - - if len(deltas) >= 4 and sum(deltas[-4:]) == 0: - return False - - if len(deltas) >= 3 and deltas[-1] > 0 and deltas[-1] == deltas[-2] and deltas[-2] == deltas[-3]: - diff = self._report_diff(growth) - raise LeakCheckError('refcount increased by %r\n%s' % (deltas, diff)) - - # OK, we don't know for sure yet. Let's search for more - if sum(deltas[-3:]) <= 0 or sum(deltas[-4:]) <= 0 or deltas[-4:].count(0) >= 2: - # this is suspicious, so give a few more runs - limit = 11 - else: - limit = 7 - if len(deltas) >= limit: - raise LeakCheckError('refcount increased by %r\n%s' - % (deltas, - self._report_diff(growth))) - - # We couldn't decide yet, keep going - return True - - def __call__(self, args, kwargs): - for _ in range(3): - gc.collect() - - expect_failure = getattr(self.function, 'fails_leakcheck', False) - if expect_failure: - self.testcase.expect_greenlet_leak = True - self.ignored_types = getattr(self.function, "leakcheck_ignore_types", ()) - - # Capture state before; the incremental will be - # updated by each call to _growth_after - growth = self._growth() - - try: - while self._check_deltas(growth): - self._run_test(args, kwargs) - - growth = self._growth_after() - - self.deltas.append(sum((stat[2] for stat in growth))) - except LeakCheckError: - if not expect_failure: - raise - else: - if expect_failure: - raise LeakCheckError("Expected %s to leak but it did not." % (self.function,)) - -def wrap_refcount(method): - if getattr(method, 'ignore_leakcheck', False) or SKIP_LEAKCHECKS: - return method - - @wraps(method) - def wrapper(self, *args, **kwargs): # pylint:disable=too-many-branches - if getattr(self, 'ignore_leakcheck', False): - raise unittest.SkipTest("This class ignored during leakchecks") - if ONLY_FAILING_LEAKCHECKS and not getattr(method, 'fails_leakcheck', False): - raise unittest.SkipTest("Only running tests that fail leakchecks.") - return _RefCountChecker(self, method)(args, kwargs) - - return wrapper diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/test_contextvars.py b/blog-app/venv/Lib/site-packages/greenlet/tests/test_contextvars.py deleted file mode 100644 index b0d1ccf..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/test_contextvars.py +++ /dev/null @@ -1,312 +0,0 @@ -from __future__ import print_function - -import gc -import sys -import unittest - -from functools import partial -from unittest import skipUnless -from unittest import skipIf - -from greenlet import greenlet -from greenlet import getcurrent -from . import TestCase -from . import PY314 - -try: - from contextvars import Context - from contextvars import ContextVar - from contextvars import copy_context - # From the documentation: - # - # Important: Context Variables should be created at the top module - # level and never in closures. Context objects hold strong - # references to context variables which prevents context variables - # from being properly garbage collected. - ID_VAR = ContextVar("id", default=None) - VAR_VAR = ContextVar("var", default=None) - ContextVar = None -except ImportError: - Context = ContextVar = copy_context = None - -# We don't support testing if greenlet's built-in context var support is disabled. -@skipUnless(Context is not None, "ContextVar not supported") -class ContextVarsTests(TestCase): - def _new_ctx_run(self, *args, **kwargs): - return copy_context().run(*args, **kwargs) - - def _increment(self, greenlet_id, callback, counts, expect): - ctx_var = ID_VAR - if expect is None: - self.assertIsNone(ctx_var.get()) - else: - self.assertEqual(ctx_var.get(), expect) - ctx_var.set(greenlet_id) - for _ in range(2): - counts[ctx_var.get()] += 1 - callback() - - def _test_context(self, propagate_by): - # pylint:disable=too-many-branches - ID_VAR.set(0) - - callback = getcurrent().switch - counts = dict((i, 0) for i in range(5)) - - lets = [ - greenlet(partial( - partial( - copy_context().run, - self._increment - ) if propagate_by == "run" else self._increment, - greenlet_id=i, - callback=callback, - counts=counts, - expect=( - i - 1 if propagate_by == "share" else - 0 if propagate_by in ("set", "run") else None - ) - )) - for i in range(1, 5) - ] - - for let in lets: - if propagate_by == "set": - let.gr_context = copy_context() - elif propagate_by == "share": - let.gr_context = getcurrent().gr_context - - for i in range(2): - counts[ID_VAR.get()] += 1 - for let in lets: - let.switch() - - if propagate_by == "run": - # Must leave each context.run() in reverse order of entry - for let in reversed(lets): - let.switch() - else: - # No context.run(), so fine to exit in any order. - for let in lets: - let.switch() - - for let in lets: - self.assertTrue(let.dead) - # When using run(), we leave the run() as the greenlet dies, - # and there's no context "underneath". When not using run(), - # gr_context still reflects the context the greenlet was - # running in. - if propagate_by == 'run': - self.assertIsNone(let.gr_context) - else: - self.assertIsNotNone(let.gr_context) - - - if propagate_by == "share": - self.assertEqual(counts, {0: 1, 1: 1, 2: 1, 3: 1, 4: 6}) - else: - self.assertEqual(set(counts.values()), set([2])) - - def test_context_propagated_by_context_run(self): - self._new_ctx_run(self._test_context, "run") - - def test_context_propagated_by_setting_attribute(self): - self._new_ctx_run(self._test_context, "set") - - def test_context_not_propagated(self): - self._new_ctx_run(self._test_context, None) - - def test_context_shared(self): - self._new_ctx_run(self._test_context, "share") - - def test_break_ctxvars(self): - let1 = greenlet(copy_context().run) - let2 = greenlet(copy_context().run) - let1.switch(getcurrent().switch) - let2.switch(getcurrent().switch) - # Since let2 entered the current context and let1 exits its own, the - # interpreter emits: - # RuntimeError: cannot exit context: thread state references a different context object - let1.switch() - - def test_not_broken_if_using_attribute_instead_of_context_run(self): - let1 = greenlet(getcurrent().switch) - let2 = greenlet(getcurrent().switch) - let1.gr_context = copy_context() - let2.gr_context = copy_context() - let1.switch() - let2.switch() - let1.switch() - let2.switch() - - def test_context_assignment_while_running(self): - # pylint:disable=too-many-statements - ID_VAR.set(None) - - def target(): - self.assertIsNone(ID_VAR.get()) - self.assertIsNone(gr.gr_context) - - # Context is created on first use - ID_VAR.set(1) - self.assertIsInstance(gr.gr_context, Context) - self.assertEqual(ID_VAR.get(), 1) - self.assertEqual(gr.gr_context[ID_VAR], 1) - - # Clearing the context makes it get re-created as another - # empty context when next used - old_context = gr.gr_context - gr.gr_context = None # assign None while running - self.assertIsNone(ID_VAR.get()) - self.assertIsNone(gr.gr_context) - ID_VAR.set(2) - self.assertIsInstance(gr.gr_context, Context) - self.assertEqual(ID_VAR.get(), 2) - self.assertEqual(gr.gr_context[ID_VAR], 2) - - new_context = gr.gr_context - getcurrent().parent.switch((old_context, new_context)) - # parent switches us back to old_context - - self.assertEqual(ID_VAR.get(), 1) - gr.gr_context = new_context # assign non-None while running - self.assertEqual(ID_VAR.get(), 2) - - getcurrent().parent.switch() - # parent switches us back to no context - self.assertIsNone(ID_VAR.get()) - self.assertIsNone(gr.gr_context) - gr.gr_context = old_context - self.assertEqual(ID_VAR.get(), 1) - - getcurrent().parent.switch() - # parent switches us back to no context - self.assertIsNone(ID_VAR.get()) - self.assertIsNone(gr.gr_context) - - gr = greenlet(target) - - with self.assertRaisesRegex(AttributeError, "can't delete context attribute"): - del gr.gr_context - - self.assertIsNone(gr.gr_context) - old_context, new_context = gr.switch() - self.assertIs(new_context, gr.gr_context) - self.assertEqual(old_context[ID_VAR], 1) - self.assertEqual(new_context[ID_VAR], 2) - self.assertEqual(new_context.run(ID_VAR.get), 2) - gr.gr_context = old_context # assign non-None while suspended - gr.switch() - self.assertIs(gr.gr_context, new_context) - gr.gr_context = None # assign None while suspended - gr.switch() - self.assertIs(gr.gr_context, old_context) - gr.gr_context = None - gr.switch() - self.assertIsNone(gr.gr_context) - - # Make sure there are no reference leaks - gr = None - gc.collect() - # Python 3.14 elides reference counting operations - # in some cases. See https://github.com/python/cpython/pull/130708 - self.assertEqual(sys.getrefcount(old_context), 2 if not PY314 else 1) - self.assertEqual(sys.getrefcount(new_context), 2 if not PY314 else 1) - - def test_context_assignment_different_thread(self): - import threading - VAR_VAR.set(None) - ctx = Context() - - is_running = threading.Event() - should_suspend = threading.Event() - did_suspend = threading.Event() - should_exit = threading.Event() - holder = [] - - def greenlet_in_thread_fn(): - VAR_VAR.set(1) - is_running.set() - should_suspend.wait(10) - VAR_VAR.set(2) - getcurrent().parent.switch() - holder.append(VAR_VAR.get()) - - def thread_fn(): - gr = greenlet(greenlet_in_thread_fn) - gr.gr_context = ctx - holder.append(gr) - gr.switch() - did_suspend.set() - should_exit.wait(10) - gr.switch() - del gr - greenlet() # trigger cleanup - - thread = threading.Thread(target=thread_fn, daemon=True) - thread.start() - is_running.wait(10) - gr = holder[0] - - # Can't access or modify context if the greenlet is running - # in a different thread - with self.assertRaisesRegex(ValueError, "running in a different"): - getattr(gr, 'gr_context') - with self.assertRaisesRegex(ValueError, "running in a different"): - gr.gr_context = None - - should_suspend.set() - did_suspend.wait(10) - - # OK to access and modify context if greenlet is suspended - self.assertIs(gr.gr_context, ctx) - self.assertEqual(gr.gr_context[VAR_VAR], 2) - gr.gr_context = None - - should_exit.set() - thread.join(10) - - self.assertEqual(holder, [gr, None]) - - # Context can still be accessed/modified when greenlet is dead: - self.assertIsNone(gr.gr_context) - gr.gr_context = ctx - self.assertIs(gr.gr_context, ctx) - - # Otherwise we leak greenlets on some platforms. - # XXX: Should be able to do this automatically - del holder[:] - gr = None - thread = None - - def test_context_assignment_wrong_type(self): - g = greenlet() - with self.assertRaisesRegex(TypeError, - "greenlet context must be a contextvars.Context or None"): - g.gr_context = self - - -@skipIf(Context is not None, "ContextVar supported") -class NoContextVarsTests(TestCase): - def test_contextvars_errors(self): - let1 = greenlet(getcurrent().switch) - self.assertFalse(hasattr(let1, 'gr_context')) - with self.assertRaises(AttributeError): - getattr(let1, 'gr_context') - - with self.assertRaises(AttributeError): - let1.gr_context = None - - let1.switch() - - with self.assertRaises(AttributeError): - getattr(let1, 'gr_context') - - with self.assertRaises(AttributeError): - let1.gr_context = None - - del let1 - - -if __name__ == '__main__': - unittest.main() diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/test_cpp.py b/blog-app/venv/Lib/site-packages/greenlet/tests/test_cpp.py deleted file mode 100644 index 2d0cc9c..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/test_cpp.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import print_function -from __future__ import absolute_import - -import subprocess -import unittest - -import greenlet -from . import _test_extension_cpp -from . import TestCase -from . import WIN - -class CPPTests(TestCase): - def test_exception_switch(self): - greenlets = [] - for i in range(4): - g = greenlet.greenlet(_test_extension_cpp.test_exception_switch) - g.switch(i) - greenlets.append(g) - for i, g in enumerate(greenlets): - self.assertEqual(g.switch(), i) - - def _do_test_unhandled_exception(self, target): - import os - import sys - script = os.path.join( - os.path.dirname(__file__), - 'fail_cpp_exception.py', - ) - args = [sys.executable, script, target.__name__ if not isinstance(target, str) else target] - __traceback_info__ = args - with self.assertRaises(subprocess.CalledProcessError) as exc: - subprocess.check_output( - args, - encoding='utf-8', - stderr=subprocess.STDOUT - ) - - ex = exc.exception - expected_exit = self.get_expected_returncodes_for_aborted_process() - self.assertIn(ex.returncode, expected_exit) - self.assertIn('fail_cpp_exception is running', ex.output) - return ex.output - - - def test_unhandled_nonstd_exception_aborts(self): - # verify that plain unhandled throw aborts - self._do_test_unhandled_exception(_test_extension_cpp.test_exception_throw_nonstd) - - def test_unhandled_std_exception_aborts(self): - # verify that plain unhandled throw aborts - self._do_test_unhandled_exception(_test_extension_cpp.test_exception_throw_std) - - @unittest.skipIf(WIN, "XXX: This does not crash on Windows") - # Meaning the exception is getting lost somewhere... - def test_unhandled_std_exception_as_greenlet_function_aborts(self): - # verify that plain unhandled throw aborts - output = self._do_test_unhandled_exception('run_as_greenlet_target') - self.assertIn( - # We really expect this to be prefixed with "greenlet: Unhandled C++ exception:" - # as added by our handler for std::exception (see TUserGreenlet.cpp), but - # that's not correct everywhere --- our handler never runs before std::terminate - # gets called (for example, on arm32). - 'Thrown from an extension.', - output - ) - - def test_unhandled_exception_in_greenlet_aborts(self): - # verify that unhandled throw called in greenlet aborts too - self._do_test_unhandled_exception('run_unhandled_exception_in_greenlet_aborts') - - -if __name__ == '__main__': - unittest.main() diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/test_extension_interface.py b/blog-app/venv/Lib/site-packages/greenlet/tests/test_extension_interface.py deleted file mode 100644 index 34b6656..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/test_extension_interface.py +++ /dev/null @@ -1,115 +0,0 @@ -from __future__ import print_function -from __future__ import absolute_import - -import sys - -import greenlet -from . import _test_extension -from . import TestCase - -# pylint:disable=c-extension-no-member - -class CAPITests(TestCase): - def test_switch(self): - self.assertEqual( - 50, _test_extension.test_switch(greenlet.greenlet(lambda: 50))) - - def test_switch_kwargs(self): - def adder(x, y): - return x * y - g = greenlet.greenlet(adder) - self.assertEqual(6, _test_extension.test_switch_kwargs(g, x=3, y=2)) - - def test_setparent(self): - # pylint:disable=disallowed-name - def foo(): - def bar(): - greenlet.getcurrent().parent.switch() - - # This final switch should go back to the main greenlet, since - # the test_setparent() function in the C extension should have - # reparented this greenlet. - greenlet.getcurrent().parent.switch() - raise AssertionError("Should never have reached this code") - child = greenlet.greenlet(bar) - child.switch() - greenlet.getcurrent().parent.switch(child) - greenlet.getcurrent().parent.throw( - AssertionError("Should never reach this code")) - foo_child = greenlet.greenlet(foo).switch() - self.assertEqual(None, _test_extension.test_setparent(foo_child)) - - def test_getcurrent(self): - _test_extension.test_getcurrent() - - def test_new_greenlet(self): - self.assertEqual(-15, _test_extension.test_new_greenlet(lambda: -15)) - - def test_raise_greenlet_dead(self): - self.assertRaises( - greenlet.GreenletExit, _test_extension.test_raise_dead_greenlet) - - def test_raise_greenlet_error(self): - self.assertRaises( - greenlet.error, _test_extension.test_raise_greenlet_error) - - def test_throw(self): - seen = [] - - def foo(): # pylint:disable=disallowed-name - try: - greenlet.getcurrent().parent.switch() - except ValueError: - seen.append(sys.exc_info()[1]) - except greenlet.GreenletExit: - raise AssertionError - g = greenlet.greenlet(foo) - g.switch() - _test_extension.test_throw(g) - self.assertEqual(len(seen), 1) - self.assertTrue( - isinstance(seen[0], ValueError), - "ValueError was not raised in foo()") - self.assertEqual( - str(seen[0]), - 'take that sucka!', - "message doesn't match") - - def test_non_traceback_param(self): - with self.assertRaises(TypeError) as exc: - _test_extension.test_throw_exact( - greenlet.getcurrent(), - Exception, - Exception(), - self - ) - self.assertEqual(str(exc.exception), - "throw() third argument must be a traceback object") - - def test_instance_of_wrong_type(self): - with self.assertRaises(TypeError) as exc: - _test_extension.test_throw_exact( - greenlet.getcurrent(), - Exception(), - BaseException(), - None, - ) - - self.assertEqual(str(exc.exception), - "instance exception may not have a separate value") - - def test_not_throwable(self): - with self.assertRaises(TypeError) as exc: - _test_extension.test_throw_exact( - greenlet.getcurrent(), - "abc", - None, - None, - ) - self.assertEqual(str(exc.exception), - "exceptions must be classes, or instances, not str") - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/test_gc.py b/blog-app/venv/Lib/site-packages/greenlet/tests/test_gc.py deleted file mode 100644 index 994addb..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/test_gc.py +++ /dev/null @@ -1,86 +0,0 @@ -import gc - -import weakref - -import greenlet - - -from . import TestCase -from .leakcheck import fails_leakcheck -# These only work with greenlet gc support -# which is no longer optional. -assert greenlet.GREENLET_USE_GC - -class GCTests(TestCase): - def test_dead_circular_ref(self): - o = weakref.ref(greenlet.greenlet(greenlet.getcurrent).switch()) - gc.collect() - if o() is not None: - import sys - print("O IS NOT NONE.", sys.getrefcount(o())) - self.assertIsNone(o()) - self.assertFalse(gc.garbage, gc.garbage) - - def test_circular_greenlet(self): - class circular_greenlet(greenlet.greenlet): - self = None - o = circular_greenlet() - o.self = o - o = weakref.ref(o) - gc.collect() - self.assertIsNone(o()) - self.assertFalse(gc.garbage, gc.garbage) - - def test_inactive_ref(self): - class inactive_greenlet(greenlet.greenlet): - def __init__(self): - greenlet.greenlet.__init__(self, run=self.run) - - def run(self): - pass - o = inactive_greenlet() - o = weakref.ref(o) - gc.collect() - self.assertIsNone(o()) - self.assertFalse(gc.garbage, gc.garbage) - - @fails_leakcheck - def test_finalizer_crash(self): - # This test is designed to crash when active greenlets - # are made garbage collectable, until the underlying - # problem is resolved. How does it work: - # - order of object creation is important - # - array is created first, so it is moved to unreachable first - # - we create a cycle between a greenlet and this array - # - we create an object that participates in gc, is only - # referenced by a greenlet, and would corrupt gc lists - # on destruction, the easiest is to use an object with - # a finalizer - # - because array is the first object in unreachable it is - # cleared first, which causes all references to greenlet - # to disappear and causes greenlet to be destroyed, but since - # it is still live it causes a switch during gc, which causes - # an object with finalizer to be destroyed, which causes stack - # corruption and then a crash - - class object_with_finalizer(object): - def __del__(self): - pass - array = [] - parent = greenlet.getcurrent() - def greenlet_body(): - greenlet.getcurrent().object = object_with_finalizer() - try: - parent.switch() - except greenlet.GreenletExit: - print("Got greenlet exit!") - finally: - del greenlet.getcurrent().object - g = greenlet.greenlet(greenlet_body) - g.array = array - array.append(g) - g.switch() - del array - del g - greenlet.getcurrent() - gc.collect() diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/test_generator.py b/blog-app/venv/Lib/site-packages/greenlet/tests/test_generator.py deleted file mode 100644 index ca4a644..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/test_generator.py +++ /dev/null @@ -1,59 +0,0 @@ - -from greenlet import greenlet - -from . import TestCase - -class genlet(greenlet): - parent = None - def __init__(self, *args, **kwds): - self.args = args - self.kwds = kwds - - def run(self): - fn, = self.fn - fn(*self.args, **self.kwds) - - def __iter__(self): - return self - - def __next__(self): - self.parent = greenlet.getcurrent() - result = self.switch() - if self: - return result - - raise StopIteration - - next = __next__ - - -def Yield(value): - g = greenlet.getcurrent() - while not isinstance(g, genlet): - if g is None: - raise RuntimeError('yield outside a genlet') - g = g.parent - g.parent.switch(value) - - -def generator(func): - class Generator(genlet): - fn = (func,) - return Generator - -# ____________________________________________________________ - - -class GeneratorTests(TestCase): - def test_generator(self): - seen = [] - - def g(n): - for i in range(n): - seen.append(i) - Yield(i) - g = generator(g) - for _ in range(3): - for j in g(5): - seen.append(j) - self.assertEqual(seen, 3 * [0, 0, 1, 1, 2, 2, 3, 3, 4, 4]) diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/test_generator_nested.py b/blog-app/venv/Lib/site-packages/greenlet/tests/test_generator_nested.py deleted file mode 100644 index 8d752a6..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/test_generator_nested.py +++ /dev/null @@ -1,168 +0,0 @@ - -from greenlet import greenlet -from . import TestCase -from .leakcheck import fails_leakcheck - -class genlet(greenlet): - parent = None - def __init__(self, *args, **kwds): - self.args = args - self.kwds = kwds - self.child = None - - def run(self): - # Note the function is packed in a tuple - # to avoid creating a bound method for it. - fn, = self.fn - fn(*self.args, **self.kwds) - - def __iter__(self): - return self - - def set_child(self, child): - self.child = child - - def __next__(self): - if self.child: - child = self.child - while child.child: - tmp = child - child = child.child - tmp.child = None - - result = child.switch() - else: - self.parent = greenlet.getcurrent() - result = self.switch() - - if self: - return result - - raise StopIteration - - next = __next__ - -def Yield(value, level=1): - g = greenlet.getcurrent() - - while level != 0: - if not isinstance(g, genlet): - raise RuntimeError('yield outside a genlet') - if level > 1: - g.parent.set_child(g) - g = g.parent - level -= 1 - - g.switch(value) - - -def Genlet(func): - class TheGenlet(genlet): - fn = (func,) - return TheGenlet - -# ____________________________________________________________ - - -def g1(n, seen): - for i in range(n): - seen.append(i + 1) - yield i - - -def g2(n, seen): - for i in range(n): - seen.append(i + 1) - Yield(i) - -g2 = Genlet(g2) - - -def nested(i): - Yield(i) - - -def g3(n, seen): - for i in range(n): - seen.append(i + 1) - nested(i) -g3 = Genlet(g3) - - -def a(n): - if n == 0: - return - for ii in ax(n - 1): - Yield(ii) - Yield(n) -ax = Genlet(a) - - -def perms(l): - if len(l) > 1: - for e in l: - # No syntactical sugar for generator expressions - x = [Yield([e] + p) for p in perms([x for x in l if x != e])] - assert x - else: - Yield(l) -perms = Genlet(perms) - - -def gr1(n): - for ii in range(1, n): - Yield(ii) - Yield(ii * ii, 2) - -gr1 = Genlet(gr1) - - -def gr2(n, seen): - for ii in gr1(n): - seen.append(ii) - -gr2 = Genlet(gr2) - - -class NestedGeneratorTests(TestCase): - def test_layered_genlets(self): - seen = [] - for ii in gr2(5, seen): - seen.append(ii) - self.assertEqual(seen, [1, 1, 2, 4, 3, 9, 4, 16]) - - @fails_leakcheck - def test_permutations(self): - gen_perms = perms(list(range(4))) - permutations = list(gen_perms) - self.assertEqual(len(permutations), 4 * 3 * 2 * 1) - self.assertIn([0, 1, 2, 3], permutations) - self.assertIn([3, 2, 1, 0], permutations) - res = [] - for ii in zip(perms(list(range(4))), perms(list(range(3)))): - res.append(ii) - self.assertEqual( - res, - [([0, 1, 2, 3], [0, 1, 2]), ([0, 1, 3, 2], [0, 2, 1]), - ([0, 2, 1, 3], [1, 0, 2]), ([0, 2, 3, 1], [1, 2, 0]), - ([0, 3, 1, 2], [2, 0, 1]), ([0, 3, 2, 1], [2, 1, 0])]) - # XXX Test to make sure we are working as a generator expression - - def test_genlet_simple(self): - for g in g1, g2, g3: - seen = [] - for _ in range(3): - for j in g(5, seen): - seen.append(j) - self.assertEqual(seen, 3 * [1, 0, 2, 1, 3, 2, 4, 3, 5, 4]) - - def test_genlet_bad(self): - try: - Yield(10) - except RuntimeError: - pass - - def test_nested_genlets(self): - seen = [] - for ii in ax(5): - seen.append(ii) diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/test_greenlet.py b/blog-app/venv/Lib/site-packages/greenlet/tests/test_greenlet.py deleted file mode 100644 index fd05c0d..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/test_greenlet.py +++ /dev/null @@ -1,1327 +0,0 @@ -import gc -import sys -import time -import threading -import unittest - -from abc import ABCMeta -from abc import abstractmethod - -import greenlet -from greenlet import greenlet as RawGreenlet -from . import TestCase -from . import RUNNING_ON_MANYLINUX -from . import PY313 -from . import PY314 -from .leakcheck import fails_leakcheck - - -# We manually manage locks in many tests -# pylint:disable=consider-using-with -# pylint:disable=too-many-public-methods -# This module is quite large. -# TODO: Refactor into separate test files. For example, -# put all the regression tests that used to produce -# crashes in test_greenlet_no_crash; put tests that DO deliberately crash -# the interpreter into test_greenlet_crash. -# pylint:disable=too-many-lines - -class SomeError(Exception): - pass - - -def fmain(seen): - try: - greenlet.getcurrent().parent.switch() - except: - seen.append(sys.exc_info()[0]) - raise - raise SomeError - - -def send_exception(g, exc): - # note: send_exception(g, exc) can be now done with g.throw(exc). - # the purpose of this test is to explicitly check the propagation rules. - def crasher(exc): - raise exc - g1 = RawGreenlet(crasher, parent=g) - g1.switch(exc) - - -class TestGreenlet(TestCase): - - def _do_simple_test(self): - lst = [] - - def f(): - lst.append(1) - greenlet.getcurrent().parent.switch() - lst.append(3) - g = RawGreenlet(f) - lst.append(0) - g.switch() - lst.append(2) - g.switch() - lst.append(4) - self.assertEqual(lst, list(range(5))) - - def test_simple(self): - self._do_simple_test() - - def test_switch_no_run_raises_AttributeError(self): - g = RawGreenlet() - with self.assertRaises(AttributeError) as exc: - g.switch() - - self.assertIn("run", str(exc.exception)) - - def test_throw_no_run_raises_AttributeError(self): - g = RawGreenlet() - with self.assertRaises(AttributeError) as exc: - g.throw(SomeError) - - self.assertIn("run", str(exc.exception)) - - def test_parent_equals_None(self): - g = RawGreenlet(parent=None) - self.assertIsNotNone(g) - self.assertIs(g.parent, greenlet.getcurrent()) - - def test_run_equals_None(self): - g = RawGreenlet(run=None) - self.assertIsNotNone(g) - self.assertIsNone(g.run) - - def test_two_children(self): - lst = [] - - def f(): - lst.append(1) - greenlet.getcurrent().parent.switch() - lst.extend([1, 1]) - g = RawGreenlet(f) - h = RawGreenlet(f) - g.switch() - self.assertEqual(len(lst), 1) - h.switch() - self.assertEqual(len(lst), 2) - h.switch() - self.assertEqual(len(lst), 4) - self.assertEqual(h.dead, True) - g.switch() - self.assertEqual(len(lst), 6) - self.assertEqual(g.dead, True) - - def test_two_recursive_children(self): - lst = [] - - def f(): - lst.append('b') - greenlet.getcurrent().parent.switch() - - def g(): - lst.append('a') - g = RawGreenlet(f) - g.switch() - lst.append('c') - self.assertEqual(sys.getrefcount(g), 2 if not PY314 else 1) - g = RawGreenlet(g) - # Python 3.14 elides reference counting operations - # in some cases. See https://github.com/python/cpython/pull/130708 - self.assertEqual(sys.getrefcount(g), 2 if not PY314 else 1) - g.switch() - self.assertEqual(lst, ['a', 'b', 'c']) - # Just the one in this frame, plus the one on the stack we pass to the function - self.assertEqual(sys.getrefcount(g), 2 if not PY314 else 1) - - def test_threads(self): - success = [] - - def f(): - self._do_simple_test() - success.append(True) - ths = [threading.Thread(target=f) for i in range(10)] - for th in ths: - th.start() - for th in ths: - th.join(10) - self.assertEqual(len(success), len(ths)) - - def test_exception(self): - seen = [] - g1 = RawGreenlet(fmain) - g2 = RawGreenlet(fmain) - g1.switch(seen) - g2.switch(seen) - g2.parent = g1 - - self.assertEqual(seen, []) - #with self.assertRaises(SomeError): - # p("***Switching back") - # g2.switch() - # Creating this as a bound method can reveal bugs that - # are hidden on newer versions of Python that avoid creating - # bound methods for direct expressions; IOW, don't use the `with` - # form! - self.assertRaises(SomeError, g2.switch) - self.assertEqual(seen, [SomeError]) - - value = g2.switch() - self.assertEqual(value, ()) - self.assertEqual(seen, [SomeError]) - - value = g2.switch(25) - self.assertEqual(value, 25) - self.assertEqual(seen, [SomeError]) - - - def test_send_exception(self): - seen = [] - g1 = RawGreenlet(fmain) - g1.switch(seen) - self.assertRaises(KeyError, send_exception, g1, KeyError) - self.assertEqual(seen, [KeyError]) - - def test_dealloc(self): - seen = [] - g1 = RawGreenlet(fmain) - g2 = RawGreenlet(fmain) - g1.switch(seen) - g2.switch(seen) - self.assertEqual(seen, []) - del g1 - gc.collect() - self.assertEqual(seen, [greenlet.GreenletExit]) - del g2 - gc.collect() - self.assertEqual(seen, [greenlet.GreenletExit, greenlet.GreenletExit]) - - def test_dealloc_catches_GreenletExit_throws_other(self): - def run(): - try: - greenlet.getcurrent().parent.switch() - except greenlet.GreenletExit: - raise SomeError from None - - g = RawGreenlet(run) - g.switch() - # Destroying the only reference to the greenlet causes it - # to get GreenletExit; when it in turn raises, even though we're the parent - # we don't get the exception, it just gets printed. - # When we run on 3.8 only, we can use sys.unraisablehook - oldstderr = sys.stderr - from io import StringIO - stderr = sys.stderr = StringIO() - try: - del g - finally: - sys.stderr = oldstderr - - v = stderr.getvalue() - self.assertIn("Exception", v) - self.assertIn('ignored', v) - self.assertIn("SomeError", v) - - - @unittest.skipIf( - PY313 and RUNNING_ON_MANYLINUX, - "Sometimes flaky (getting one GreenletExit in the second list)" - # Probably due to funky timing interactions? - # TODO: FIXME Make that work. - ) - - def test_dealloc_other_thread(self): - seen = [] - someref = [] - - bg_glet_created_running_and_no_longer_ref_in_bg = threading.Event() - fg_ref_released = threading.Event() - bg_should_be_clear = threading.Event() - ok_to_exit_bg_thread = threading.Event() - - def f(): - g1 = RawGreenlet(fmain) - g1.switch(seen) - someref.append(g1) - del g1 - gc.collect() - - bg_glet_created_running_and_no_longer_ref_in_bg.set() - fg_ref_released.wait(3) - - RawGreenlet() # trigger release - bg_should_be_clear.set() - ok_to_exit_bg_thread.wait(3) - RawGreenlet() # One more time - - t = threading.Thread(target=f) - t.start() - bg_glet_created_running_and_no_longer_ref_in_bg.wait(10) - - self.assertEqual(seen, []) - self.assertEqual(len(someref), 1) - del someref[:] - gc.collect() - # g1 is not released immediately because it's from another thread - self.assertEqual(seen, []) - fg_ref_released.set() - bg_should_be_clear.wait(3) - try: - self.assertEqual(seen, [greenlet.GreenletExit]) - finally: - ok_to_exit_bg_thread.set() - t.join(10) - del seen[:] - del someref[:] - - def test_frame(self): - def f1(): - f = sys._getframe(0) # pylint:disable=protected-access - self.assertEqual(f.f_back, None) - greenlet.getcurrent().parent.switch(f) - return "meaning of life" - g = RawGreenlet(f1) - frame = g.switch() - self.assertTrue(frame is g.gr_frame) - self.assertTrue(g) - - from_g = g.switch() - self.assertFalse(g) - self.assertEqual(from_g, 'meaning of life') - self.assertEqual(g.gr_frame, None) - - def test_thread_bug(self): - def runner(x): - g = RawGreenlet(lambda: time.sleep(x)) - g.switch() - t1 = threading.Thread(target=runner, args=(0.2,)) - t2 = threading.Thread(target=runner, args=(0.3,)) - t1.start() - t2.start() - t1.join(10) - t2.join(10) - - def test_switch_kwargs(self): - def run(a, b): - self.assertEqual(a, 4) - self.assertEqual(b, 2) - return 42 - x = RawGreenlet(run).switch(a=4, b=2) - self.assertEqual(x, 42) - - def test_switch_kwargs_to_parent(self): - def run(x): - greenlet.getcurrent().parent.switch(x=x) - greenlet.getcurrent().parent.switch(2, x=3) - return x, x ** 2 - g = RawGreenlet(run) - self.assertEqual({'x': 3}, g.switch(3)) - self.assertEqual(((2,), {'x': 3}), g.switch()) - self.assertEqual((3, 9), g.switch()) - - def test_switch_to_another_thread(self): - data = {} - created_event = threading.Event() - done_event = threading.Event() - - def run(): - data['g'] = RawGreenlet(lambda: None) - created_event.set() - done_event.wait(10) - thread = threading.Thread(target=run) - thread.start() - created_event.wait(10) - with self.assertRaises(greenlet.error): - data['g'].switch() - done_event.set() - thread.join(10) - # XXX: Should handle this automatically - data.clear() - - def test_exc_state(self): - def f(): - try: - raise ValueError('fun') - except: # pylint:disable=bare-except - exc_info = sys.exc_info() - RawGreenlet(h).switch() - self.assertEqual(exc_info, sys.exc_info()) - - def h(): - self.assertEqual(sys.exc_info(), (None, None, None)) - - RawGreenlet(f).switch() - - def test_instance_dict(self): - def f(): - greenlet.getcurrent().test = 42 - def deldict(g): - del g.__dict__ - def setdict(g, value): - g.__dict__ = value - g = RawGreenlet(f) - self.assertEqual(g.__dict__, {}) - g.switch() - self.assertEqual(g.test, 42) - self.assertEqual(g.__dict__, {'test': 42}) - g.__dict__ = g.__dict__ - self.assertEqual(g.__dict__, {'test': 42}) - self.assertRaises(TypeError, deldict, g) - self.assertRaises(TypeError, setdict, g, 42) - - def test_running_greenlet_has_no_run(self): - has_run = [] - def func(): - has_run.append( - hasattr(greenlet.getcurrent(), 'run') - ) - - g = RawGreenlet(func) - g.switch() - self.assertEqual(has_run, [False]) - - def test_deepcopy(self): - import copy - self.assertRaises(TypeError, copy.copy, RawGreenlet()) - self.assertRaises(TypeError, copy.deepcopy, RawGreenlet()) - - def test_parent_restored_on_kill(self): - hub = RawGreenlet(lambda: None) - main = greenlet.getcurrent() - result = [] - def worker(): - try: - # Wait to be killed by going back to the test. - main.switch() - except greenlet.GreenletExit: - # Resurrect and switch to parent - result.append(greenlet.getcurrent().parent) - result.append(greenlet.getcurrent()) - hub.switch() - g = RawGreenlet(worker, parent=hub) - g.switch() - # delete the only reference, thereby raising GreenletExit - del g - self.assertTrue(result) - self.assertIs(result[0], main) - self.assertIs(result[1].parent, hub) - # Delete them, thereby breaking the cycle between the greenlet - # and the frame, which otherwise would never be collectable - # XXX: We should be able to automatically fix this. - del result[:] - hub = None - main = None - - def test_parent_return_failure(self): - # No run causes AttributeError on switch - g1 = RawGreenlet() - # Greenlet that implicitly switches to parent - g2 = RawGreenlet(lambda: None, parent=g1) - # AttributeError should propagate to us, no fatal errors - with self.assertRaises(AttributeError): - g2.switch() - - def test_throw_exception_not_lost(self): - class mygreenlet(RawGreenlet): - def __getattribute__(self, name): - try: - raise Exception # pylint:disable=broad-exception-raised - except: # pylint:disable=bare-except - pass - return RawGreenlet.__getattribute__(self, name) - g = mygreenlet(lambda: None) - self.assertRaises(SomeError, g.throw, SomeError()) - - @fails_leakcheck - def _do_test_throw_to_dead_thread_doesnt_crash(self, wait_for_cleanup=False): - result = [] - def worker(): - greenlet.getcurrent().parent.switch() - - def creator(): - g = RawGreenlet(worker) - g.switch() - result.append(g) - if wait_for_cleanup: - # Let this greenlet eventually be cleaned up. - g.switch() - greenlet.getcurrent() - t = threading.Thread(target=creator) - t.start() - t.join(10) - del t - # But, depending on the operating system, the thread - # deallocator may not actually have run yet! So we can't be - # sure about the error message unless we wait. - if wait_for_cleanup: - self.wait_for_pending_cleanups() - with self.assertRaises(greenlet.error) as exc: - result[0].throw(SomeError) - - if not wait_for_cleanup: - s = str(exc.exception) - self.assertTrue( - s == "cannot switch to a different thread (which happens to have exited)" - or 'Cannot switch' in s - ) - else: - self.assertEqual( - str(exc.exception), - "cannot switch to a different thread (which happens to have exited)", - ) - - if hasattr(result[0].gr_frame, 'clear'): - # The frame is actually executing (it thinks), we can't clear it. - with self.assertRaises(RuntimeError): - result[0].gr_frame.clear() - # Unfortunately, this doesn't actually clear the references, they're in the - # fast local array. - if not wait_for_cleanup: - # f_locals has no clear method in Python 3.13 - if hasattr(result[0].gr_frame.f_locals, 'clear'): - result[0].gr_frame.f_locals.clear() - else: - self.assertIsNone(result[0].gr_frame) - - del creator - worker = None - del result[:] - # XXX: we ought to be able to automatically fix this. - # See issue 252 - self.expect_greenlet_leak = True # direct us not to wait for it to go away - - @fails_leakcheck - def test_throw_to_dead_thread_doesnt_crash(self): - self._do_test_throw_to_dead_thread_doesnt_crash() - - def test_throw_to_dead_thread_doesnt_crash_wait(self): - self._do_test_throw_to_dead_thread_doesnt_crash(True) - - @fails_leakcheck - def test_recursive_startup(self): - class convoluted(RawGreenlet): - def __init__(self): - RawGreenlet.__init__(self) - self.count = 0 - def __getattribute__(self, name): - if name == 'run' and self.count == 0: - self.count = 1 - self.switch(43) - return RawGreenlet.__getattribute__(self, name) - def run(self, value): - while True: - self.parent.switch(value) - g = convoluted() - self.assertEqual(g.switch(42), 43) - # Exits the running greenlet, otherwise it leaks - # XXX: We should be able to automatically fix this - #g.throw(greenlet.GreenletExit) - #del g - self.expect_greenlet_leak = True - - def test_threaded_updatecurrent(self): - # released when main thread should execute - lock1 = threading.Lock() - lock1.acquire() - # released when another thread should execute - lock2 = threading.Lock() - lock2.acquire() - class finalized(object): - def __del__(self): - # happens while in green_updatecurrent() in main greenlet - # should be very careful not to accidentally call it again - # at the same time we must make sure another thread executes - lock2.release() - lock1.acquire() - # now ts_current belongs to another thread - def deallocator(): - greenlet.getcurrent().parent.switch() - def fthread(): - lock2.acquire() - greenlet.getcurrent() - del g[0] - lock1.release() - lock2.acquire() - greenlet.getcurrent() - lock1.release() - main = greenlet.getcurrent() - g = [RawGreenlet(deallocator)] - g[0].bomb = finalized() - g[0].switch() - t = threading.Thread(target=fthread) - t.start() - # let another thread grab ts_current and deallocate g[0] - lock2.release() - lock1.acquire() - # this is the corner stone - # getcurrent() will notice that ts_current belongs to another thread - # and start the update process, which would notice that g[0] should - # be deallocated, and that will execute an object's finalizer. Now, - # that object will let another thread run so it can grab ts_current - # again, which would likely crash the interpreter if there's no - # check for this case at the end of green_updatecurrent(). This test - # passes if getcurrent() returns correct result, but it's likely - # to randomly crash if it's not anyway. - self.assertEqual(greenlet.getcurrent(), main) - # wait for another thread to complete, just in case - t.join(10) - - def test_dealloc_switch_args_not_lost(self): - seen = [] - def worker(): - # wait for the value - value = greenlet.getcurrent().parent.switch() - # delete all references to ourself - del worker[0] - initiator.parent = greenlet.getcurrent().parent - # switch to main with the value, but because - # ts_current is the last reference to us we - # return here immediately, where we resurrect ourself. - try: - greenlet.getcurrent().parent.switch(value) - finally: - seen.append(greenlet.getcurrent()) - def initiator(): - return 42 # implicitly falls thru to parent - - worker = [RawGreenlet(worker)] - - worker[0].switch() # prime worker - initiator = RawGreenlet(initiator, worker[0]) - value = initiator.switch() - self.assertTrue(seen) - self.assertEqual(value, 42) - - def test_tuple_subclass(self): - # The point of this test is to see what happens when a custom - # tuple subclass is used as an object passed directly to the C - # function ``green_switch``; part of ``green_switch`` checks - # the ``len()`` of the ``args`` tuple, and that can call back - # into Python. Here, when it calls back into Python, we - # recursively enter ``green_switch`` again. - - # This test is really only relevant on Python 2. The builtin - # `apply` function directly passes the given args tuple object - # to the underlying function, whereas the Python 3 version - # unpacks and repacks into an actual tuple. This could still - # happen using the C API on Python 3 though. We should write a - # builtin version of apply() ourself. - def _apply(func, a, k): - func(*a, **k) - - class mytuple(tuple): - def __len__(self): - greenlet.getcurrent().switch() - return tuple.__len__(self) - args = mytuple() - kwargs = dict(a=42) - def switchapply(): - _apply(greenlet.getcurrent().parent.switch, args, kwargs) - g = RawGreenlet(switchapply) - self.assertEqual(g.switch(), kwargs) - - def test_abstract_subclasses(self): - AbstractSubclass = ABCMeta( - 'AbstractSubclass', - (RawGreenlet,), - {'run': abstractmethod(lambda self: None)}) - - class BadSubclass(AbstractSubclass): - pass - - class GoodSubclass(AbstractSubclass): - def run(self): - pass - - GoodSubclass() # should not raise - self.assertRaises(TypeError, BadSubclass) - - def test_implicit_parent_with_threads(self): - if not gc.isenabled(): - return # cannot test with disabled gc - N = gc.get_threshold()[0] - if N < 50: - return # cannot test with such a small N - def attempt(): - lock1 = threading.Lock() - lock1.acquire() - lock2 = threading.Lock() - lock2.acquire() - recycled = [False] - def another_thread(): - lock1.acquire() # wait for gc - greenlet.getcurrent() # update ts_current - lock2.release() # release gc - t = threading.Thread(target=another_thread) - t.start() - class gc_callback(object): - def __del__(self): - lock1.release() - lock2.acquire() - recycled[0] = True - class garbage(object): - def __init__(self): - self.cycle = self - self.callback = gc_callback() - l = [] - x = range(N*2) - current = greenlet.getcurrent() - g = garbage() - for _ in x: - g = None # lose reference to garbage - if recycled[0]: - # gc callback called prematurely - t.join(10) - return False - last = RawGreenlet() - if recycled[0]: - break # yes! gc called in green_new - l.append(last) # increase allocation counter - else: - # gc callback not called when expected - gc.collect() - if recycled[0]: - t.join(10) - return False - self.assertEqual(last.parent, current) - for g in l: - self.assertEqual(g.parent, current) - return True - for _ in range(5): - if attempt(): - break - - def test_issue_245_reference_counting_subclass_no_threads(self): - # https://github.com/python-greenlet/greenlet/issues/245 - # Before the fix, this crashed pretty reliably on - # Python 3.10, at least on macOS; but much less reliably on other - # interpreters (memory layout must have changed). - # The threaded test crashed more reliably on more interpreters. - from greenlet import getcurrent - from greenlet import GreenletExit - - class Greenlet(RawGreenlet): - pass - - initial_refs = sys.getrefcount(Greenlet) - # This has to be an instance variable because - # Python 2 raises a SyntaxError if we delete a local - # variable referenced in an inner scope. - self.glets = [] # pylint:disable=attribute-defined-outside-init - - def greenlet_main(): - try: - getcurrent().parent.switch() - except GreenletExit: - self.glets.append(getcurrent()) - - # Before the - for _ in range(10): - Greenlet(greenlet_main).switch() - - del self.glets - self.assertEqual(sys.getrefcount(Greenlet), initial_refs) - - @unittest.skipIf( - PY313 and RUNNING_ON_MANYLINUX, - "The manylinux images appear to hang on this test on 3.13rc2" - # Or perhaps I just got tired of waiting for the 450s timeout. - # Still, it shouldn't take anywhere near that long. Does not reproduce in - # Ubuntu images, on macOS or Windows. - ) - def test_issue_245_reference_counting_subclass_threads(self): - # https://github.com/python-greenlet/greenlet/issues/245 - from threading import Thread - from threading import Event - - from greenlet import getcurrent - - class MyGreenlet(RawGreenlet): - pass - - glets = [] - ref_cleared = Event() - - def greenlet_main(): - getcurrent().parent.switch() - - def thread_main(greenlet_running_event): - mine = MyGreenlet(greenlet_main) - glets.append(mine) - # The greenlets being deleted must be active - mine.switch() - # Don't keep any reference to it in this thread - del mine - # Let main know we published our greenlet. - greenlet_running_event.set() - # Wait for main to let us know the references are - # gone and the greenlet objects no longer reachable - ref_cleared.wait(10) - # The creating thread must call getcurrent() (or a few other - # greenlet APIs) because that's when the thread-local list of dead - # greenlets gets cleared. - getcurrent() - - # We start with 3 references to the subclass: - # - This module - # - Its __mro__ - # - The __subclassess__ attribute of greenlet - # - (If we call gc.get_referents(), we find four entries, including - # some other tuple ``(greenlet)`` that I'm not sure about but must be part - # of the machinery.) - # - # On Python 3.10 it's often enough to just run 3 threads; on Python 2.7, - # more threads are needed, and the results are still - # non-deterministic. Presumably the memory layouts are different - initial_refs = sys.getrefcount(MyGreenlet) - thread_ready_events = [] - for _ in range( - initial_refs + 45 - ): - event = Event() - thread = Thread(target=thread_main, args=(event,)) - thread_ready_events.append(event) - thread.start() - - - for done_event in thread_ready_events: - done_event.wait(10) - - - del glets[:] - ref_cleared.set() - # Let any other thread run; it will crash the interpreter - # if not fixed (or silently corrupt memory and we possibly crash - # later). - self.wait_for_pending_cleanups() - self.assertEqual(sys.getrefcount(MyGreenlet), initial_refs) - - def test_falling_off_end_switches_to_unstarted_parent_raises_error(self): - def no_args(): - return 13 - - parent_never_started = RawGreenlet(no_args) - - def leaf(): - return 42 - - child = RawGreenlet(leaf, parent_never_started) - - # Because the run function takes to arguments - with self.assertRaises(TypeError): - child.switch() - - def test_falling_off_end_switches_to_unstarted_parent_works(self): - def one_arg(x): - return (x, 24) - - parent_never_started = RawGreenlet(one_arg) - - def leaf(): - return 42 - - child = RawGreenlet(leaf, parent_never_started) - - result = child.switch() - self.assertEqual(result, (42, 24)) - - def test_switch_to_dead_greenlet_with_unstarted_perverse_parent(self): - class Parent(RawGreenlet): - def __getattribute__(self, name): - if name == 'run': - raise SomeError - - - parent_never_started = Parent() - seen = [] - child = RawGreenlet(lambda: seen.append(42), parent_never_started) - # Because we automatically start the parent when the child is - # finished - with self.assertRaises(SomeError): - child.switch() - - self.assertEqual(seen, [42]) - - with self.assertRaises(SomeError): - child.switch() - self.assertEqual(seen, [42]) - - def test_switch_to_dead_greenlet_reparent(self): - seen = [] - parent_never_started = RawGreenlet(lambda: seen.append(24)) - child = RawGreenlet(lambda: seen.append(42)) - - child.switch() - self.assertEqual(seen, [42]) - - child.parent = parent_never_started - # This actually is the same as switching to the parent. - result = child.switch() - self.assertIsNone(result) - self.assertEqual(seen, [42, 24]) - - def test_can_access_f_back_of_suspended_greenlet(self): - # This tests our frame rewriting to work around Python 3.12+ having - # some interpreter frames on the C stack. It will crash in the absence - # of that logic. - main = greenlet.getcurrent() - - def outer(): - inner() - - def inner(): - main.switch(sys._getframe(0)) - - hub = RawGreenlet(outer) - # start it - hub.switch() - - # start another greenlet to make sure we aren't relying on - # anything in `hub` still being on the C stack - unrelated = RawGreenlet(lambda: None) - unrelated.switch() - - # now it is suspended - self.assertIsNotNone(hub.gr_frame) - self.assertEqual(hub.gr_frame.f_code.co_name, "inner") - self.assertIsNotNone(hub.gr_frame.f_back) - self.assertEqual(hub.gr_frame.f_back.f_code.co_name, "outer") - # The next line is what would crash - self.assertIsNone(hub.gr_frame.f_back.f_back) - - def test_get_stack_with_nested_c_calls(self): - from functools import partial - from . import _test_extension_cpp - - def recurse(v): - if v > 0: - return v * _test_extension_cpp.test_call(partial(recurse, v - 1)) - return greenlet.getcurrent().parent.switch() - - gr = RawGreenlet(recurse) - gr.switch(5) - frame = gr.gr_frame - for i in range(5): - self.assertEqual(frame.f_locals["v"], i) - frame = frame.f_back - self.assertEqual(frame.f_locals["v"], 5) - self.assertIsNone(frame.f_back) - self.assertEqual(gr.switch(10), 1200) # 1200 = 5! * 10 - - def test_frames_always_exposed(self): - # On Python 3.12 this will crash if we don't set the - # gr_frames_always_exposed attribute. More background: - # https://github.com/python-greenlet/greenlet/issues/388 - main = greenlet.getcurrent() - - def outer(): - inner(sys._getframe(0)) - - def inner(frame): - main.switch(frame) - - gr = RawGreenlet(outer) - frame = gr.switch() - - # Do something else to clobber the part of the C stack used by `gr`, - # so we can't skate by on "it just happened to still be there" - unrelated = RawGreenlet(lambda: None) - unrelated.switch() - - self.assertEqual(frame.f_code.co_name, "outer") - # The next line crashes on 3.12 if we haven't exposed the frames. - self.assertIsNone(frame.f_back) - - -class TestGreenletSetParentErrors(TestCase): - def test_threaded_reparent(self): - data = {} - created_event = threading.Event() - done_event = threading.Event() - - def run(): - data['g'] = RawGreenlet(lambda: None) - created_event.set() - done_event.wait(10) - - def blank(): - greenlet.getcurrent().parent.switch() - - thread = threading.Thread(target=run) - thread.start() - created_event.wait(10) - g = RawGreenlet(blank) - g.switch() - with self.assertRaises(ValueError) as exc: - g.parent = data['g'] - done_event.set() - thread.join(10) - - self.assertEqual(str(exc.exception), "parent cannot be on a different thread") - - def test_unexpected_reparenting(self): - another = [] - def worker(): - g = RawGreenlet(lambda: None) - another.append(g) - g.switch() - t = threading.Thread(target=worker) - t.start() - t.join(10) - # The first time we switch (running g_initialstub(), which is - # when we look up the run attribute) we attempt to change the - # parent to one from another thread (which also happens to be - # dead). ``g_initialstub()`` should detect this and raise a - # greenlet error. - # - # EXCEPT: With the fix for #252, this is actually detected - # sooner, when setting the parent itself. Prior to that fix, - # the main greenlet from the background thread kept a valid - # value for ``run_info``, and appeared to be a valid parent - # until we actually started the greenlet. But now that it's - # cleared, this test is catching whether ``green_setparent`` - # can detect the dead thread. - # - # Further refactoring once again changes this back to a greenlet.error - # - # We need to wait for the cleanup to happen, but we're - # deliberately leaking a main greenlet here. - self.wait_for_pending_cleanups(initial_main_greenlets=self.main_greenlets_before_test + 1) - - class convoluted(RawGreenlet): - def __getattribute__(self, name): - if name == 'run': - self.parent = another[0] # pylint:disable=attribute-defined-outside-init - return RawGreenlet.__getattribute__(self, name) - g = convoluted(lambda: None) - with self.assertRaises(greenlet.error) as exc: - g.switch() - self.assertEqual(str(exc.exception), - "cannot switch to a different thread (which happens to have exited)") - del another[:] - - def test_unexpected_reparenting_thread_running(self): - # Like ``test_unexpected_reparenting``, except the background thread is - # actually still alive. - another = [] - switched_to_greenlet = threading.Event() - keep_main_alive = threading.Event() - def worker(): - g = RawGreenlet(lambda: None) - another.append(g) - g.switch() - switched_to_greenlet.set() - keep_main_alive.wait(10) - class convoluted(RawGreenlet): - def __getattribute__(self, name): - if name == 'run': - self.parent = another[0] # pylint:disable=attribute-defined-outside-init - return RawGreenlet.__getattribute__(self, name) - - t = threading.Thread(target=worker) - t.start() - - switched_to_greenlet.wait(10) - try: - g = convoluted(lambda: None) - - with self.assertRaises(greenlet.error) as exc: - g.switch() - self.assertIn("Cannot switch to a different thread", str(exc.exception)) - self.assertIn("Expected", str(exc.exception)) - self.assertIn("Current", str(exc.exception)) - finally: - keep_main_alive.set() - t.join(10) - # XXX: Should handle this automatically. - del another[:] - - def test_cannot_delete_parent(self): - worker = RawGreenlet(lambda: None) - self.assertIs(worker.parent, greenlet.getcurrent()) - - with self.assertRaises(AttributeError) as exc: - del worker.parent - self.assertEqual(str(exc.exception), "can't delete attribute") - - def test_cannot_delete_parent_of_main(self): - with self.assertRaises(AttributeError) as exc: - del greenlet.getcurrent().parent - self.assertEqual(str(exc.exception), "can't delete attribute") - - - def test_main_greenlet_parent_is_none(self): - # assuming we're in a main greenlet here. - self.assertIsNone(greenlet.getcurrent().parent) - - def test_set_parent_wrong_types(self): - def bg(): - # Go back to main. - greenlet.getcurrent().parent.switch() - - def check(glet): - for p in None, 1, self, "42": - with self.assertRaises(TypeError) as exc: - glet.parent = p - - self.assertEqual( - str(exc.exception), - "GreenletChecker: Expected any type of greenlet, not " + type(p).__name__) - - # First, not running - g = RawGreenlet(bg) - self.assertFalse(g) - check(g) - - # Then when running. - g.switch() - self.assertTrue(g) - check(g) - - # Let it finish - g.switch() - - - def test_trivial_cycle(self): - glet = RawGreenlet(lambda: None) - with self.assertRaises(ValueError) as exc: - glet.parent = glet - self.assertEqual(str(exc.exception), "cyclic parent chain") - - def test_trivial_cycle_main(self): - # This used to produce a ValueError, but we catch it earlier than that now. - with self.assertRaises(AttributeError) as exc: - greenlet.getcurrent().parent = greenlet.getcurrent() - self.assertEqual(str(exc.exception), "cannot set the parent of a main greenlet") - - def test_deeper_cycle(self): - g1 = RawGreenlet(lambda: None) - g2 = RawGreenlet(lambda: None) - g3 = RawGreenlet(lambda: None) - - g1.parent = g2 - g2.parent = g3 - with self.assertRaises(ValueError) as exc: - g3.parent = g1 - self.assertEqual(str(exc.exception), "cyclic parent chain") - - -class TestRepr(TestCase): - - def assertEndsWith(self, got, suffix): - self.assertTrue(got.endswith(suffix), (got, suffix)) - - def test_main_while_running(self): - r = repr(greenlet.getcurrent()) - self.assertEndsWith(r, " current active started main>") - - def test_main_in_background(self): - main = greenlet.getcurrent() - def run(): - return repr(main) - - g = RawGreenlet(run) - r = g.switch() - self.assertEndsWith(r, ' suspended active started main>') - - def test_initial(self): - r = repr(RawGreenlet()) - self.assertEndsWith(r, ' pending>') - - def test_main_from_other_thread(self): - main = greenlet.getcurrent() - - class T(threading.Thread): - original_main = thread_main = None - main_glet = None - def run(self): - self.original_main = repr(main) - self.main_glet = greenlet.getcurrent() - self.thread_main = repr(self.main_glet) - - t = T() - t.start() - t.join(10) - - self.assertEndsWith(t.original_main, ' suspended active started main>') - self.assertEndsWith(t.thread_main, ' current active started main>') - # give the machinery time to notice the death of the thread, - # and clean it up. Note that we don't use - # ``expect_greenlet_leak`` or wait_for_pending_cleanups, - # because at this point we know we have an extra greenlet - # still reachable. - for _ in range(3): - time.sleep(0.001) - - # In the past, main greenlets, even from dead threads, never - # really appear dead. We have fixed that, and we also report - # that the thread is dead in the repr. (Do this multiple times - # to make sure that we don't self-modify and forget our state - # in the C++ code). - for _ in range(3): - self.assertTrue(t.main_glet.dead) - r = repr(t.main_glet) - self.assertEndsWith(r, ' (thread exited) dead>') - - def test_dead(self): - g = RawGreenlet(lambda: None) - g.switch() - self.assertEndsWith(repr(g), ' dead>') - self.assertNotIn('suspended', repr(g)) - self.assertNotIn('started', repr(g)) - self.assertNotIn('active', repr(g)) - - def test_formatting_produces_native_str(self): - # https://github.com/python-greenlet/greenlet/issues/218 - # %s formatting on Python 2 was producing unicode, not str. - - g_dead = RawGreenlet(lambda: None) - g_not_started = RawGreenlet(lambda: None) - g_cur = greenlet.getcurrent() - - for g in g_dead, g_not_started, g_cur: - - self.assertIsInstance( - '%s' % (g,), - str - ) - self.assertIsInstance( - '%r' % (g,), - str, - ) - - -class TestMainGreenlet(TestCase): - # Tests some implementation details, and relies on some - # implementation details. - - def _check_current_is_main(self): - # implementation detail - assert 'main' in repr(greenlet.getcurrent()) - - t = type(greenlet.getcurrent()) - assert 'main' not in repr(t) - return t - - def test_main_greenlet_type_can_be_subclassed(self): - main_type = self._check_current_is_main() - subclass = type('subclass', (main_type,), {}) - self.assertIsNotNone(subclass) - - def test_main_greenlet_is_greenlet(self): - self._check_current_is_main() - self.assertIsInstance(greenlet.getcurrent(), RawGreenlet) - - - -class TestBrokenGreenlets(TestCase): - # Tests for things that used to, or still do, terminate the interpreter. - # This often means doing unsavory things. - - def test_failed_to_initialstub(self): - def func(): - raise AssertionError("Never get here") - - - g = greenlet._greenlet.UnswitchableGreenlet(func) - g.force_switch_error = True - - with self.assertRaisesRegex(SystemError, - "Failed to switch stacks into a greenlet for the first time."): - g.switch() - - def test_failed_to_switch_into_running(self): - runs = [] - def func(): - runs.append(1) - greenlet.getcurrent().parent.switch() - runs.append(2) - greenlet.getcurrent().parent.switch() - runs.append(3) # pragma: no cover - - g = greenlet._greenlet.UnswitchableGreenlet(func) - g.switch() - self.assertEqual(runs, [1]) - g.switch() - self.assertEqual(runs, [1, 2]) - g.force_switch_error = True - - with self.assertRaisesRegex(SystemError, - "Failed to switch stacks into a running greenlet."): - g.switch() - - # If we stopped here, we would fail the leakcheck, because we've left - # the ``inner_bootstrap()`` C frame and its descendents hanging around, - # which have a bunch of Python references. They'll never get cleaned up - # if we don't let the greenlet finish. - g.force_switch_error = False - g.switch() - self.assertEqual(runs, [1, 2, 3]) - - def test_failed_to_slp_switch_into_running(self): - ex = self.assertScriptRaises('fail_slp_switch.py') - - self.assertIn('fail_slp_switch is running', ex.output) - self.assertIn(ex.returncode, self.get_expected_returncodes_for_aborted_process()) - - def test_reentrant_switch_two_greenlets(self): - # Before we started capturing the arguments in g_switch_finish, this could crash. - output = self.run_script('fail_switch_two_greenlets.py') - self.assertIn('In g1_run', output) - self.assertIn('TRACE', output) - self.assertIn('LEAVE TRACE', output) - self.assertIn('Falling off end of main', output) - self.assertIn('Falling off end of g1_run', output) - self.assertIn('Falling off end of g2', output) - - def test_reentrant_switch_three_greenlets(self): - # On debug builds of greenlet, this used to crash with an assertion error; - # on non-debug versions, it ran fine (which it should not do!). - # Now it always crashes correctly with a TypeError - ex = self.assertScriptRaises('fail_switch_three_greenlets.py', exitcodes=(1,)) - - self.assertIn('TypeError', ex.output) - self.assertIn('positional arguments', ex.output) - - def test_reentrant_switch_three_greenlets2(self): - # This actually passed on debug and non-debug builds. It - # should probably have been triggering some debug assertions - # but it didn't. - # - # I think the fixes for the above test also kicked in here. - output = self.run_script('fail_switch_three_greenlets2.py') - self.assertIn( - "RESULTS: [('trace', 'switch'), " - "('trace', 'switch'), ('g2 arg', 'g2 from tracefunc'), " - "('trace', 'switch'), ('main g1', 'from g2_run'), ('trace', 'switch'), " - "('g1 arg', 'g1 from main'), ('trace', 'switch'), ('main g2', 'from g1_run'), " - "('trace', 'switch'), ('g1 from parent', 'g1 from main 2'), ('trace', 'switch'), " - "('main g1.2', 'g1 done'), ('trace', 'switch'), ('g2 from parent', ()), " - "('trace', 'switch'), ('main g2.2', 'g2 done')]", - output - ) - - def test_reentrant_switch_GreenletAlreadyStartedInPython(self): - output = self.run_script('fail_initialstub_already_started.py') - - self.assertIn( - "RESULTS: ['Begin C', 'Switch to b from B.__getattribute__ in C', " - "('Begin B', ()), '_B_run switching to main', ('main from c', 'From B'), " - "'B.__getattribute__ back from main in C', ('Begin A', (None,)), " - "('A dead?', True, 'B dead?', True, 'C dead?', False), " - "'C done', ('main from c.2', None)]", - output - ) - - def test_reentrant_switch_run_callable_has_del(self): - output = self.run_script('fail_clearing_run_switches.py') - self.assertIn( - "RESULTS [" - "('G.__getattribute__', 'run'), ('RunCallable', '__del__'), " - "('main: g.switch()', 'from RunCallable'), ('run_func', 'enter')" - "]", - output - ) - -if __name__ == '__main__': - unittest.main() diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/test_greenlet_trash.py b/blog-app/venv/Lib/site-packages/greenlet/tests/test_greenlet_trash.py deleted file mode 100644 index c1fc137..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/test_greenlet_trash.py +++ /dev/null @@ -1,187 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tests for greenlets interacting with the CPython trash can API. - -The CPython trash can API is not designed to be re-entered from a -single thread. But this can happen using greenlets, if something -during the object deallocation process switches greenlets, and this second -greenlet then causes the trash can to get entered again. Here, we do this -very explicitly, but in other cases (like gevent) it could be arbitrarily more -complicated: for example, a weakref callback might try to acquire a lock that's -already held by another greenlet; that would allow a greenlet switch to occur. - -See https://github.com/gevent/gevent/issues/1909 - -This test is fragile and relies on details of the CPython -implementation (like most of the rest of this package): - - - We enter the trashcan and deferred deallocation after - ``_PyTrash_UNWIND_LEVEL`` calls. This constant, defined in - CPython's object.c, is generally 50. That's basically how many objects are required to - get us into the deferred deallocation situation. - - - The test fails by hitting an ``assert()`` in object.c; if the - build didn't enable assert, then we don't catch this. - - - If the test fails in that way, the interpreter crashes. -""" -from __future__ import print_function, absolute_import, division - -import unittest - - -class TestTrashCanReEnter(unittest.TestCase): - - def test_it(self): - try: - # pylint:disable-next=no-name-in-module - from greenlet._greenlet import get_tstate_trash_delete_nesting # pylint:disable=unused-import - except ImportError: - import sys - # Python 3.13 has not "trash delete nesting" anymore (but "delete later") - assert sys.version_info[:2] >= (3, 13) - self.skipTest("get_tstate_trash_delete_nesting is not available.") - - # Try several times to trigger it, because it isn't 100% - # reliable. - for _ in range(10): - self.check_it() - - def check_it(self): # pylint:disable=too-many-statements - import greenlet - from greenlet._greenlet import get_tstate_trash_delete_nesting # pylint:disable=no-name-in-module - main = greenlet.getcurrent() - - assert get_tstate_trash_delete_nesting() == 0 - - # We expect to be in deferred deallocation after this many - # deallocations have occurred. TODO: I wish we had a better way to do - # this --- that was before get_tstate_trash_delete_nesting; perhaps - # we can use that API to do better? - TRASH_UNWIND_LEVEL = 50 - # How many objects to put in a container; it's the container that - # queues objects for deferred deallocation. - OBJECTS_PER_CONTAINER = 500 - - class Dealloc: # define the class here because we alter class variables each time we run. - """ - An object with a ``__del__`` method. When it starts getting deallocated - from a deferred trash can run, it switches greenlets, allocates more objects - which then also go in the trash can. If we don't save state appropriately, - nesting gets out of order and we can crash the interpreter. - """ - - #: Has our deallocation actually run and switched greenlets? - #: When it does, this will be set to the current greenlet. This should - #: be happening in the main greenlet, so we check that down below. - SPAWNED = False - - #: Has the background greenlet run? - BG_RAN = False - - BG_GLET = None - - #: How many of these things have ever been allocated. - CREATED = 0 - - #: How many of these things have ever been deallocated. - DESTROYED = 0 - - #: How many were destroyed not in the main greenlet. There should always - #: be some. - #: If the test is broken or things change in the trashcan implementation, - #: this may not be correct. - DESTROYED_BG = 0 - - def __init__(self, sequence_number): - """ - :param sequence_number: The ordinal of this object during - one particular creation run. This is used to detect (guess, really) - when we have entered the trash can's deferred deallocation. - """ - self.i = sequence_number - Dealloc.CREATED += 1 - - def __del__(self): - if self.i == TRASH_UNWIND_LEVEL and not self.SPAWNED: - Dealloc.SPAWNED = greenlet.getcurrent() - other = Dealloc.BG_GLET = greenlet.greenlet(background_greenlet) - x = other.switch() - assert x == 42 - # It's important that we don't switch back to the greenlet, - # we leave it hanging there in an incomplete state. But we don't let it - # get collected, either. If we complete it now, while we're still - # in the scope of the initial trash can, things work out and we - # don't see the problem. We need this greenlet to complete - # at some point in the future, after we've exited this trash can invocation. - del other - elif self.i == 40 and greenlet.getcurrent() is not main: - Dealloc.BG_RAN = True - try: - main.switch(42) - except greenlet.GreenletExit as ex: - # We expect this; all references to us go away - # while we're still running, and we need to finish deleting - # ourself. - Dealloc.BG_RAN = type(ex) - del ex - - # Record the fact that we're dead last of all. This ensures that - # we actually get returned too. - Dealloc.DESTROYED += 1 - if greenlet.getcurrent() is not main: - Dealloc.DESTROYED_BG += 1 - - - def background_greenlet(): - # We direct through a second function, instead of - # directly calling ``make_some()``, so that we have complete - # control over when these objects are destroyed: we need them - # to be destroyed in the context of the background greenlet - t = make_some() - del t # Triggere deletion. - - def make_some(): - t = () - i = OBJECTS_PER_CONTAINER - while i: - # Nest the tuples; it's the recursion that gets us - # into trash. - t = (Dealloc(i), t) - i -= 1 - return t - - - some = make_some() - self.assertEqual(Dealloc.CREATED, OBJECTS_PER_CONTAINER) - self.assertEqual(Dealloc.DESTROYED, 0) - - # If we're going to crash, it should be on the following line. - # We only crash if ``assert()`` is enabled, of course. - del some - - # For non-debug builds of CPython, we won't crash. The best we can do is check - # the nesting level explicitly. - self.assertEqual(0, get_tstate_trash_delete_nesting()) - - # Discard this, raising GreenletExit into where it is waiting. - Dealloc.BG_GLET = None - # The same nesting level maintains. - self.assertEqual(0, get_tstate_trash_delete_nesting()) - - # We definitely cleaned some up in the background - self.assertGreater(Dealloc.DESTROYED_BG, 0) - - # Make sure all the cleanups happened. - self.assertIs(Dealloc.SPAWNED, main) - self.assertTrue(Dealloc.BG_RAN) - self.assertEqual(Dealloc.BG_RAN, greenlet.GreenletExit) - self.assertEqual(Dealloc.CREATED, Dealloc.DESTROYED ) - self.assertEqual(Dealloc.CREATED, OBJECTS_PER_CONTAINER * 2) - - import gc - gc.collect() - - -if __name__ == '__main__': - unittest.main() diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/test_leaks.py b/blog-app/venv/Lib/site-packages/greenlet/tests/test_leaks.py deleted file mode 100644 index 99da4eb..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/test_leaks.py +++ /dev/null @@ -1,447 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Testing scenarios that may have leaked. -""" -from __future__ import print_function, absolute_import, division - -import sys -import gc - -import time -import weakref -import threading - - -import greenlet -from . import TestCase -from . import PY314 -from .leakcheck import fails_leakcheck -from .leakcheck import ignores_leakcheck -from .leakcheck import RUNNING_ON_MANYLINUX - -# pylint:disable=protected-access - -assert greenlet.GREENLET_USE_GC # Option to disable this was removed in 1.0 - -class HasFinalizerTracksInstances(object): - EXTANT_INSTANCES = set() - def __init__(self, msg): - self.msg = sys.intern(msg) - self.EXTANT_INSTANCES.add(id(self)) - def __del__(self): - self.EXTANT_INSTANCES.remove(id(self)) - def __repr__(self): - return "" % ( - id(self), self.msg - ) - @classmethod - def reset(cls): - cls.EXTANT_INSTANCES.clear() - - -class TestLeaks(TestCase): - - def test_arg_refs(self): - args = ('a', 'b', 'c') - refcount_before = sys.getrefcount(args) - # pylint:disable=unnecessary-lambda - g = greenlet.greenlet( - lambda *args: greenlet.getcurrent().parent.switch(*args)) - for _ in range(100): - g.switch(*args) - self.assertEqual(sys.getrefcount(args), refcount_before) - - def test_kwarg_refs(self): - kwargs = {} - self.assertEqual(sys.getrefcount(kwargs), 2 if not PY314 else 1) - # pylint:disable=unnecessary-lambda - g = greenlet.greenlet( - lambda **gkwargs: greenlet.getcurrent().parent.switch(**gkwargs)) - for _ in range(100): - g.switch(**kwargs) - # Python 3.14 elides reference counting operations - # in some cases. See https://github.com/python/cpython/pull/130708 - self.assertEqual(sys.getrefcount(kwargs), 2 if not PY314 else 1) - - - @staticmethod - def __recycle_threads(): - # By introducing a thread that does sleep we allow other threads, - # that have triggered their __block condition, but did not have a - # chance to deallocate their thread state yet, to finally do so. - # The way it works is by requiring a GIL switch (different thread), - # which does a GIL release (sleep), which might do a GIL switch - # to finished threads and allow them to clean up. - def worker(): - time.sleep(0.001) - t = threading.Thread(target=worker) - t.start() - time.sleep(0.001) - t.join(10) - - def test_threaded_leak(self): - gg = [] - def worker(): - # only main greenlet present - gg.append(weakref.ref(greenlet.getcurrent())) - for _ in range(2): - t = threading.Thread(target=worker) - t.start() - t.join(10) - del t - greenlet.getcurrent() # update ts_current - self.__recycle_threads() - greenlet.getcurrent() # update ts_current - gc.collect() - greenlet.getcurrent() # update ts_current - for g in gg: - self.assertIsNone(g()) - - def test_threaded_adv_leak(self): - gg = [] - def worker(): - # main and additional *finished* greenlets - ll = greenlet.getcurrent().ll = [] - def additional(): - ll.append(greenlet.getcurrent()) - for _ in range(2): - greenlet.greenlet(additional).switch() - gg.append(weakref.ref(greenlet.getcurrent())) - for _ in range(2): - t = threading.Thread(target=worker) - t.start() - t.join(10) - del t - greenlet.getcurrent() # update ts_current - self.__recycle_threads() - greenlet.getcurrent() # update ts_current - gc.collect() - greenlet.getcurrent() # update ts_current - for g in gg: - self.assertIsNone(g()) - - def assertClocksUsed(self): - used = greenlet._greenlet.get_clocks_used_doing_optional_cleanup() - self.assertGreaterEqual(used, 0) - # we don't lose the value - greenlet._greenlet.enable_optional_cleanup(True) - used2 = greenlet._greenlet.get_clocks_used_doing_optional_cleanup() - self.assertEqual(used, used2) - self.assertGreater(greenlet._greenlet.CLOCKS_PER_SEC, 1) - - def _check_issue251(self, - manually_collect_background=True, - explicit_reference_to_switch=False): - # See https://github.com/python-greenlet/greenlet/issues/251 - # Killing a greenlet (probably not the main one) - # in one thread from another thread would - # result in leaking a list (the ts_delkey list). - # We no longer use lists to hold that stuff, though. - - # For the test to be valid, even empty lists have to be tracked by the - # GC - - assert gc.is_tracked([]) - HasFinalizerTracksInstances.reset() - greenlet.getcurrent() - greenlets_before = self.count_objects(greenlet.greenlet, exact_kind=False) - - background_glet_running = threading.Event() - background_glet_killed = threading.Event() - background_greenlets = [] - - # XXX: Switching this to a greenlet subclass that overrides - # run results in all callers failing the leaktest; that - # greenlet instance is leaked. There's a bound method for - # run() living on the stack of the greenlet in g_initialstub, - # and since we don't manually switch back to the background - # greenlet to let it "fall off the end" and exit the - # g_initialstub function, it never gets cleaned up. Making the - # garbage collector aware of this bound method (making it an - # attribute of the greenlet structure and traversing into it) - # doesn't help, for some reason. - def background_greenlet(): - # Throw control back to the main greenlet. - jd = HasFinalizerTracksInstances("DELETING STACK OBJECT") - greenlet._greenlet.set_thread_local( - 'test_leaks_key', - HasFinalizerTracksInstances("DELETING THREAD STATE")) - # Explicitly keeping 'switch' in a local variable - # breaks this test in all versions - if explicit_reference_to_switch: - s = greenlet.getcurrent().parent.switch - s([jd]) - else: - greenlet.getcurrent().parent.switch([jd]) - - bg_main_wrefs = [] - - def background_thread(): - glet = greenlet.greenlet(background_greenlet) - bg_main_wrefs.append(weakref.ref(glet.parent)) - - background_greenlets.append(glet) - glet.switch() # Be sure it's active. - # Control is ours again. - del glet # Delete one reference from the thread it runs in. - background_glet_running.set() - background_glet_killed.wait(10) - - # To trigger the background collection of the dead - # greenlet, thus clearing out the contents of the list, we - # need to run some APIs. See issue 252. - if manually_collect_background: - greenlet.getcurrent() - - - t = threading.Thread(target=background_thread) - t.start() - background_glet_running.wait(10) - greenlet.getcurrent() - lists_before = self.count_objects(list, exact_kind=True) - - assert len(background_greenlets) == 1 - self.assertFalse(background_greenlets[0].dead) - # Delete the last reference to the background greenlet - # from a different thread. This puts it in the background thread's - # ts_delkey list. - del background_greenlets[:] - background_glet_killed.set() - - # Now wait for the background thread to die. - t.join(10) - del t - # As part of the fix for 252, we need to cycle the ceval.c - # interpreter loop to be sure it has had a chance to process - # the pending call. - self.wait_for_pending_cleanups() - - lists_after = self.count_objects(list, exact_kind=True) - greenlets_after = self.count_objects(greenlet.greenlet, exact_kind=False) - - # On 2.7, we observe that lists_after is smaller than - # lists_before. No idea what lists got cleaned up. All the - # Python 3 versions match exactly. - self.assertLessEqual(lists_after, lists_before) - # On versions after 3.6, we've successfully cleaned up the - # greenlet references thanks to the internal "vectorcall" - # protocol; prior to that, there is a reference path through - # the ``greenlet.switch`` method still on the stack that we - # can't reach to clean up. The C code goes through terrific - # lengths to clean that up. - if not explicit_reference_to_switch \ - and greenlet._greenlet.get_clocks_used_doing_optional_cleanup() is not None: - # If cleanup was disabled, though, we may not find it. - self.assertEqual(greenlets_after, greenlets_before) - if manually_collect_background: - # TODO: Figure out how to make this work! - # The one on the stack is still leaking somehow - # in the non-manually-collect state. - self.assertEqual(HasFinalizerTracksInstances.EXTANT_INSTANCES, set()) - else: - # The explicit reference prevents us from collecting it - # and it isn't always found by the GC either for some - # reason. The entire frame is leaked somehow, on some - # platforms (e.g., MacPorts builds of Python (all - # versions!)), but not on other platforms (the linux and - # windows builds on GitHub actions and Appveyor). So we'd - # like to write a test that proves that the main greenlet - # sticks around, and we can on my machine (macOS 11.6, - # MacPorts builds of everything) but we can't write that - # same test on other platforms. However, hopefully iteration - # done by leakcheck will find it. - pass - - if greenlet._greenlet.get_clocks_used_doing_optional_cleanup() is not None: - self.assertClocksUsed() - - def test_issue251_killing_cross_thread_leaks_list(self): - self._check_issue251() - - def test_issue251_with_cleanup_disabled(self): - greenlet._greenlet.enable_optional_cleanup(False) - try: - self._check_issue251() - finally: - greenlet._greenlet.enable_optional_cleanup(True) - - @fails_leakcheck - def test_issue251_issue252_need_to_collect_in_background(self): - # Between greenlet 1.1.2 and the next version, this was still - # failing because the leak of the list still exists when we - # don't call a greenlet API before exiting the thread. The - # proximate cause is that neither of the two greenlets from - # the background thread are actually being destroyed, even - # though the GC is in fact visiting both objects. It's not - # clear where that leak is? For some reason the thread-local - # dict holding it isn't being cleaned up. - # - # The leak, I think, is in the CPYthon internal function that - # calls into green_switch(). The argument tuple is still on - # the C stack somewhere and can't be reached? That doesn't - # make sense, because the tuple should be collectable when - # this object goes away. - # - # Note that this test sometimes spuriously passes on Linux, - # for some reason, but I've never seen it pass on macOS. - self._check_issue251(manually_collect_background=False) - - @fails_leakcheck - def test_issue251_issue252_need_to_collect_in_background_cleanup_disabled(self): - self.expect_greenlet_leak = True - greenlet._greenlet.enable_optional_cleanup(False) - try: - self._check_issue251(manually_collect_background=False) - finally: - greenlet._greenlet.enable_optional_cleanup(True) - - @fails_leakcheck - def test_issue251_issue252_explicit_reference_not_collectable(self): - self._check_issue251( - manually_collect_background=False, - explicit_reference_to_switch=True) - - UNTRACK_ATTEMPTS = 100 - - def _only_test_some_versions(self): - # We're only looking for this problem specifically on 3.11, - # and this set of tests is relatively fragile, depending on - # OS and memory management details. So we want to run it on 3.11+ - # (obviously) but not every older 3.x version in order to reduce - # false negatives. At the moment, those false results seem to have - # resolved, so we are actually running this on 3.8+ - assert sys.version_info[0] >= 3 - if sys.version_info[:2] < (3, 8): - self.skipTest('Only observed on 3.11') - if RUNNING_ON_MANYLINUX: - self.skipTest("Slow and not worth repeating here") - - @ignores_leakcheck - # Because we're just trying to track raw memory, not objects, and running - # the leakcheck makes an already slow test slower. - def test_untracked_memory_doesnt_increase(self): - # See https://github.com/gevent/gevent/issues/1924 - # and https://github.com/python-greenlet/greenlet/issues/328 - self._only_test_some_versions() - def f(): - return 1 - - ITER = 10000 - def run_it(): - for _ in range(ITER): - greenlet.greenlet(f).switch() - - # Establish baseline - for _ in range(3): - run_it() - - # uss: (Linux, macOS, Windows): aka "Unique Set Size", this is - # the memory which is unique to a process and which would be - # freed if the process was terminated right now. - uss_before = self.get_process_uss() - - for count in range(self.UNTRACK_ATTEMPTS): - uss_before = max(uss_before, self.get_process_uss()) - run_it() - - uss_after = self.get_process_uss() - if uss_after <= uss_before and count > 1: - break - - self.assertLessEqual(uss_after, uss_before) - - def _check_untracked_memory_thread(self, deallocate_in_thread=True): - self._only_test_some_versions() - # Like the above test, but what if there are a bunch of - # unfinished greenlets in a thread that dies? - # Does it matter if we deallocate in the thread or not? - EXIT_COUNT = [0] - - def f(): - try: - greenlet.getcurrent().parent.switch() - except greenlet.GreenletExit: - EXIT_COUNT[0] += 1 - raise - return 1 - - ITER = 10000 - def run_it(): - glets = [] - for _ in range(ITER): - # Greenlet starts, switches back to us. - # We keep a strong reference to the greenlet though so it doesn't - # get a GreenletExit exception. - g = greenlet.greenlet(f) - glets.append(g) - g.switch() - - return glets - - test = self - - class ThreadFunc: - uss_before = uss_after = 0 - glets = () - ITER = 2 - def __call__(self): - self.uss_before = test.get_process_uss() - - for _ in range(self.ITER): - self.glets += tuple(run_it()) - - for g in self.glets: - test.assertIn('suspended active', str(g)) - # Drop them. - if deallocate_in_thread: - self.glets = () - self.uss_after = test.get_process_uss() - - # Establish baseline - uss_before = uss_after = None - for count in range(self.UNTRACK_ATTEMPTS): - EXIT_COUNT[0] = 0 - thread_func = ThreadFunc() - t = threading.Thread(target=thread_func) - t.start() - t.join(30) - self.assertFalse(t.is_alive()) - - if uss_before is None: - uss_before = thread_func.uss_before - - uss_before = max(uss_before, thread_func.uss_before) - if deallocate_in_thread: - self.assertEqual(thread_func.glets, ()) - self.assertEqual(EXIT_COUNT[0], ITER * thread_func.ITER) - - del thread_func # Deallocate the greenlets; but this won't raise into them - del t - if not deallocate_in_thread: - self.assertEqual(EXIT_COUNT[0], 0) - if deallocate_in_thread: - self.wait_for_pending_cleanups() - - uss_after = self.get_process_uss() - # See if we achieve a non-growth state at some point. Break when we do. - if uss_after <= uss_before and count > 1: - break - - self.wait_for_pending_cleanups() - uss_after = self.get_process_uss() - self.assertLessEqual(uss_after, uss_before, "after attempts %d" % (count,)) - - @ignores_leakcheck - # Because we're just trying to track raw memory, not objects, and running - # the leakcheck makes an already slow test slower. - def test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_thread(self): - self._check_untracked_memory_thread(deallocate_in_thread=True) - - @ignores_leakcheck - # Because the main greenlets from the background threads do not exit in a timely fashion, - # we fail the object-based leakchecks. - def test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_main(self): - self._check_untracked_memory_thread(deallocate_in_thread=False) - -if __name__ == '__main__': - __import__('unittest').main() diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/test_stack_saved.py b/blog-app/venv/Lib/site-packages/greenlet/tests/test_stack_saved.py deleted file mode 100644 index b362bf9..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/test_stack_saved.py +++ /dev/null @@ -1,19 +0,0 @@ -import greenlet -from . import TestCase - - -class Test(TestCase): - - def test_stack_saved(self): - main = greenlet.getcurrent() - self.assertEqual(main._stack_saved, 0) - - def func(): - main.switch(main._stack_saved) - - g = greenlet.greenlet(func) - x = g.switch() - self.assertGreater(x, 0) - self.assertGreater(g._stack_saved, 0) - g.switch() - self.assertEqual(g._stack_saved, 0) diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/test_throw.py b/blog-app/venv/Lib/site-packages/greenlet/tests/test_throw.py deleted file mode 100644 index f4f9a14..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/test_throw.py +++ /dev/null @@ -1,128 +0,0 @@ -import sys - - -from greenlet import greenlet -from . import TestCase - -def switch(*args): - return greenlet.getcurrent().parent.switch(*args) - - -class ThrowTests(TestCase): - def test_class(self): - def f(): - try: - switch("ok") - except RuntimeError: - switch("ok") - return - switch("fail") - g = greenlet(f) - res = g.switch() - self.assertEqual(res, "ok") - res = g.throw(RuntimeError) - self.assertEqual(res, "ok") - - def test_val(self): - def f(): - try: - switch("ok") - except RuntimeError: - val = sys.exc_info()[1] - if str(val) == "ciao": - switch("ok") - return - switch("fail") - - g = greenlet(f) - res = g.switch() - self.assertEqual(res, "ok") - res = g.throw(RuntimeError("ciao")) - self.assertEqual(res, "ok") - - g = greenlet(f) - res = g.switch() - self.assertEqual(res, "ok") - res = g.throw(RuntimeError, "ciao") - self.assertEqual(res, "ok") - - def test_kill(self): - def f(): - switch("ok") - switch("fail") - g = greenlet(f) - res = g.switch() - self.assertEqual(res, "ok") - res = g.throw() - self.assertTrue(isinstance(res, greenlet.GreenletExit)) - self.assertTrue(g.dead) - res = g.throw() # immediately eaten by the already-dead greenlet - self.assertTrue(isinstance(res, greenlet.GreenletExit)) - - def test_throw_goes_to_original_parent(self): - main = greenlet.getcurrent() - - def f1(): - try: - main.switch("f1 ready to catch") - except IndexError: - return "caught" - return "normal exit" - - def f2(): - main.switch("from f2") - - g1 = greenlet(f1) - g2 = greenlet(f2, parent=g1) - with self.assertRaises(IndexError): - g2.throw(IndexError) - self.assertTrue(g2.dead) - self.assertTrue(g1.dead) - - g1 = greenlet(f1) - g2 = greenlet(f2, parent=g1) - res = g1.switch() - self.assertEqual(res, "f1 ready to catch") - res = g2.throw(IndexError) - self.assertEqual(res, "caught") - self.assertTrue(g2.dead) - self.assertTrue(g1.dead) - - g1 = greenlet(f1) - g2 = greenlet(f2, parent=g1) - res = g1.switch() - self.assertEqual(res, "f1 ready to catch") - res = g2.switch() - self.assertEqual(res, "from f2") - res = g2.throw(IndexError) - self.assertEqual(res, "caught") - self.assertTrue(g2.dead) - self.assertTrue(g1.dead) - - def test_non_traceback_param(self): - with self.assertRaises(TypeError) as exc: - greenlet.getcurrent().throw( - Exception, - Exception(), - self - ) - self.assertEqual(str(exc.exception), - "throw() third argument must be a traceback object") - - def test_instance_of_wrong_type(self): - with self.assertRaises(TypeError) as exc: - greenlet.getcurrent().throw( - Exception(), - BaseException() - ) - - self.assertEqual(str(exc.exception), - "instance exception may not have a separate value") - - def test_not_throwable(self): - with self.assertRaises(TypeError) as exc: - greenlet.getcurrent().throw( - "abc" - ) - self.assertEqual(str(exc.exception), - "exceptions must be classes, or instances, not str") diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/test_tracing.py b/blog-app/venv/Lib/site-packages/greenlet/tests/test_tracing.py deleted file mode 100644 index c044d4b..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/test_tracing.py +++ /dev/null @@ -1,291 +0,0 @@ -from __future__ import print_function -import sys -import greenlet -import unittest - -from . import TestCase -from . import PY312 - -# https://discuss.python.org/t/cpython-3-12-greenlet-and-tracing-profiling-how-to-not-crash-and-get-correct-results/33144/2 -DEBUG_BUILD_PY312 = ( - PY312 and hasattr(sys, 'gettotalrefcount'), - "Broken on debug builds of Python 3.12" -) - -class SomeError(Exception): - pass - -class GreenletTracer(object): - oldtrace = None - - def __init__(self, error_on_trace=False): - self.actions = [] - self.error_on_trace = error_on_trace - - def __call__(self, *args): - self.actions.append(args) - if self.error_on_trace: - raise SomeError - - def __enter__(self): - self.oldtrace = greenlet.settrace(self) - return self.actions - - def __exit__(self, *args): - greenlet.settrace(self.oldtrace) - - -class TestGreenletTracing(TestCase): - """ - Tests of ``greenlet.settrace()`` - """ - - def test_a_greenlet_tracing(self): - main = greenlet.getcurrent() - def dummy(): - pass - def dummyexc(): - raise SomeError() - - with GreenletTracer() as actions: - g1 = greenlet.greenlet(dummy) - g1.switch() - g2 = greenlet.greenlet(dummyexc) - self.assertRaises(SomeError, g2.switch) - - self.assertEqual(actions, [ - ('switch', (main, g1)), - ('switch', (g1, main)), - ('switch', (main, g2)), - ('throw', (g2, main)), - ]) - - def test_b_exception_disables_tracing(self): - main = greenlet.getcurrent() - def dummy(): - main.switch() - g = greenlet.greenlet(dummy) - g.switch() - with GreenletTracer(error_on_trace=True) as actions: - self.assertRaises(SomeError, g.switch) - self.assertEqual(greenlet.gettrace(), None) - - self.assertEqual(actions, [ - ('switch', (main, g)), - ]) - - def test_set_same_tracer_twice(self): - # https://github.com/python-greenlet/greenlet/issues/332 - # Our logic in asserting that the tracefunction should - # gain a reference was incorrect if the same tracefunction was set - # twice. - tracer = GreenletTracer() - with tracer: - greenlet.settrace(tracer) - - -class PythonTracer(object): - oldtrace = None - - def __init__(self): - self.actions = [] - - def __call__(self, frame, event, arg): - # Record the co_name so we have an idea what function we're in. - self.actions.append((event, frame.f_code.co_name)) - - def __enter__(self): - self.oldtrace = sys.setprofile(self) - return self.actions - - def __exit__(self, *args): - sys.setprofile(self.oldtrace) - -def tpt_callback(): - return 42 - -class TestPythonTracing(TestCase): - """ - Tests of the interaction of ``sys.settrace()`` - with greenlet facilities. - - NOTE: Most of this is probably CPython specific. - """ - - maxDiff = None - - def test_trace_events_trivial(self): - with PythonTracer() as actions: - tpt_callback() - # If we use the sys.settrace instead of setprofile, we get - # this: - - # self.assertEqual(actions, [ - # ('call', 'tpt_callback'), - # ('call', '__exit__'), - # ]) - - self.assertEqual(actions, [ - ('return', '__enter__'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('call', '__exit__'), - ('c_call', '__exit__'), - ]) - - def _trace_switch(self, glet): - with PythonTracer() as actions: - glet.switch() - return actions - - def _check_trace_events_func_already_set(self, glet): - actions = self._trace_switch(glet) - self.assertEqual(actions, [ - ('return', '__enter__'), - ('c_call', '_trace_switch'), - ('call', 'run'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('return', 'run'), - ('c_return', '_trace_switch'), - ('call', '__exit__'), - ('c_call', '__exit__'), - ]) - - def test_trace_events_into_greenlet_func_already_set(self): - def run(): - return tpt_callback() - - self._check_trace_events_func_already_set(greenlet.greenlet(run)) - - def test_trace_events_into_greenlet_subclass_already_set(self): - class X(greenlet.greenlet): - def run(self): - return tpt_callback() - self._check_trace_events_func_already_set(X()) - - def _check_trace_events_from_greenlet_sets_profiler(self, g, tracer): - g.switch() - tpt_callback() - tracer.__exit__() - self.assertEqual(tracer.actions, [ - ('return', '__enter__'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('return', 'run'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('call', '__exit__'), - ('c_call', '__exit__'), - ]) - - - def test_trace_events_from_greenlet_func_sets_profiler(self): - tracer = PythonTracer() - def run(): - tracer.__enter__() - return tpt_callback() - - self._check_trace_events_from_greenlet_sets_profiler(greenlet.greenlet(run), - tracer) - - def test_trace_events_from_greenlet_subclass_sets_profiler(self): - tracer = PythonTracer() - class X(greenlet.greenlet): - def run(self): - tracer.__enter__() - return tpt_callback() - - self._check_trace_events_from_greenlet_sets_profiler(X(), tracer) - - @unittest.skipIf(*DEBUG_BUILD_PY312) - def test_trace_events_multiple_greenlets_switching(self): - tracer = PythonTracer() - - g1 = None - g2 = None - - def g1_run(): - tracer.__enter__() - tpt_callback() - g2.switch() - tpt_callback() - return 42 - - def g2_run(): - tpt_callback() - tracer.__exit__() - tpt_callback() - g1.switch() - - g1 = greenlet.greenlet(g1_run) - g2 = greenlet.greenlet(g2_run) - - x = g1.switch() - self.assertEqual(x, 42) - tpt_callback() # ensure not in the trace - self.assertEqual(tracer.actions, [ - ('return', '__enter__'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('c_call', 'g1_run'), - ('call', 'g2_run'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('call', '__exit__'), - ('c_call', '__exit__'), - ]) - - @unittest.skipIf(*DEBUG_BUILD_PY312) - def test_trace_events_multiple_greenlets_switching_siblings(self): - # Like the first version, but get both greenlets running first - # as "siblings" and then establish the tracing. - tracer = PythonTracer() - - g1 = None - g2 = None - - def g1_run(): - greenlet.getcurrent().parent.switch() - tracer.__enter__() - tpt_callback() - g2.switch() - tpt_callback() - return 42 - - def g2_run(): - greenlet.getcurrent().parent.switch() - - tpt_callback() - tracer.__exit__() - tpt_callback() - g1.switch() - - g1 = greenlet.greenlet(g1_run) - g2 = greenlet.greenlet(g2_run) - - # Start g1 - g1.switch() - # And it immediately returns control to us. - # Start g2 - g2.switch() - # Which also returns. Now kick of the real part of the - # test. - x = g1.switch() - self.assertEqual(x, 42) - - tpt_callback() # ensure not in the trace - self.assertEqual(tracer.actions, [ - ('return', '__enter__'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('c_call', 'g1_run'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('call', '__exit__'), - ('c_call', '__exit__'), - ]) - - -if __name__ == '__main__': - unittest.main() diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/test_version.py b/blog-app/venv/Lib/site-packages/greenlet/tests/test_version.py deleted file mode 100644 index 96c17cf..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/test_version.py +++ /dev/null @@ -1,41 +0,0 @@ -#! /usr/bin/env python -from __future__ import absolute_import -from __future__ import print_function - -import sys -import os -from unittest import TestCase as NonLeakingTestCase - -import greenlet - -# No reason to run this multiple times under leakchecks, -# it doesn't do anything. -class VersionTests(NonLeakingTestCase): - def test_version(self): - def find_dominating_file(name): - if os.path.exists(name): - return name - - tried = [] - here = os.path.abspath(os.path.dirname(__file__)) - for i in range(10): - up = ['..'] * i - path = [here] + up + [name] - fname = os.path.join(*path) - fname = os.path.abspath(fname) - tried.append(fname) - if os.path.exists(fname): - return fname - raise AssertionError("Could not find file " + name + "; checked " + str(tried)) - - try: - setup_py = find_dominating_file('setup.py') - except AssertionError as e: - self.skipTest("Unable to find setup.py; must be out of tree. " + str(e)) - - - invoke_setup = "%s %s --version" % (sys.executable, setup_py) - with os.popen(invoke_setup) as f: - sversion = f.read().strip() - - self.assertEqual(sversion, greenlet.__version__) diff --git a/blog-app/venv/Lib/site-packages/greenlet/tests/test_weakref.py b/blog-app/venv/Lib/site-packages/greenlet/tests/test_weakref.py deleted file mode 100644 index 05a38a7..0000000 --- a/blog-app/venv/Lib/site-packages/greenlet/tests/test_weakref.py +++ /dev/null @@ -1,35 +0,0 @@ -import gc -import weakref - - -import greenlet -from . import TestCase - -class WeakRefTests(TestCase): - def test_dead_weakref(self): - def _dead_greenlet(): - g = greenlet.greenlet(lambda: None) - g.switch() - return g - o = weakref.ref(_dead_greenlet()) - gc.collect() - self.assertEqual(o(), None) - - def test_inactive_weakref(self): - o = weakref.ref(greenlet.greenlet()) - gc.collect() - self.assertEqual(o(), None) - - def test_dealloc_weakref(self): - seen = [] - def worker(): - try: - greenlet.getcurrent().parent.switch() - finally: - seen.append(g()) - g = greenlet.greenlet(worker) - g.switch() - g2 = greenlet.greenlet(lambda: None, g) - g = weakref.ref(g2) - g2 = None - self.assertEqual(seen, [None]) diff --git a/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/INSTALLER b/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/METADATA b/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/METADATA deleted file mode 100644 index 10b290a..0000000 --- a/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/METADATA +++ /dev/null @@ -1,105 +0,0 @@ -Metadata-Version: 2.4 -Name: packaging -Version: 25.0 -Summary: Core utilities for Python packages -Author-email: Donald Stufft -Requires-Python: >=3.8 -Description-Content-Type: text/x-rst -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Apache Software License -Classifier: License :: OSI Approved :: BSD License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -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 :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Typing :: Typed -License-File: LICENSE -License-File: LICENSE.APACHE -License-File: LICENSE.BSD -Project-URL: Documentation, https://packaging.pypa.io/ -Project-URL: Source, https://github.com/pypa/packaging - -packaging -========= - -.. start-intro - -Reusable core utilities for various Python Packaging -`interoperability specifications `_. - -This library provides utilities that implement the interoperability -specifications which have clearly one correct behaviour (eg: :pep:`440`) -or benefit greatly from having a single shared implementation (eg: :pep:`425`). - -.. end-intro - -The ``packaging`` project includes the following: version handling, specifiers, -markers, requirements, tags, utilities. - -Documentation -------------- - -The `documentation`_ provides information and the API for the following: - -- Version Handling -- Specifiers -- Markers -- Requirements -- Tags -- Utilities - -Installation ------------- - -Use ``pip`` to install these utilities:: - - pip install packaging - -The ``packaging`` library uses calendar-based versioning (``YY.N``). - -Discussion ----------- - -If you run into bugs, you can file them in our `issue tracker`_. - -You can also join ``#pypa`` on Freenode to ask questions or get involved. - - -.. _`documentation`: https://packaging.pypa.io/ -.. _`issue tracker`: https://github.com/pypa/packaging/issues - - -Code of Conduct ---------------- - -Everyone interacting in the packaging project's codebases, issue trackers, chat -rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_. - -.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md - -Contributing ------------- - -The ``CONTRIBUTING.rst`` file outlines how to contribute to this project as -well as how to report a potential security issue. The documentation for this -project also covers information about `project development`_ and `security`_. - -.. _`project development`: https://packaging.pypa.io/en/latest/development/ -.. _`security`: https://packaging.pypa.io/en/latest/security/ - -Project History ---------------- - -Please review the ``CHANGELOG.rst`` file or the `Changelog documentation`_ for -recent changes and project history. - -.. _`Changelog documentation`: https://packaging.pypa.io/en/latest/changelog/ - diff --git a/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/RECORD b/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/RECORD deleted file mode 100644 index 9b69b4c..0000000 --- a/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/RECORD +++ /dev/null @@ -1,40 +0,0 @@ -packaging-25.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -packaging-25.0.dist-info/METADATA,sha256=W2EaYJw4_vw9YWv0XSCuyY-31T8kXayp4sMPyFx6woI,3281 -packaging-25.0.dist-info/RECORD,, -packaging-25.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 -packaging-25.0.dist-info/licenses/LICENSE,sha256=ytHvW9NA1z4HS6YU0m996spceUDD2MNIUuZcSQlobEg,197 -packaging-25.0.dist-info/licenses/LICENSE.APACHE,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174 -packaging-25.0.dist-info/licenses/LICENSE.BSD,sha256=tw5-m3QvHMb5SLNMFqo5_-zpQZY2S8iP8NIYDwAo-sU,1344 -packaging/__init__.py,sha256=_0cDiPVf2S-bNfVmZguxxzmrIYWlyASxpqph4qsJWUc,494 -packaging/__pycache__/__init__.cpython-310.pyc,, -packaging/__pycache__/_elffile.cpython-310.pyc,, -packaging/__pycache__/_manylinux.cpython-310.pyc,, -packaging/__pycache__/_musllinux.cpython-310.pyc,, -packaging/__pycache__/_parser.cpython-310.pyc,, -packaging/__pycache__/_structures.cpython-310.pyc,, -packaging/__pycache__/_tokenizer.cpython-310.pyc,, -packaging/__pycache__/markers.cpython-310.pyc,, -packaging/__pycache__/metadata.cpython-310.pyc,, -packaging/__pycache__/requirements.cpython-310.pyc,, -packaging/__pycache__/specifiers.cpython-310.pyc,, -packaging/__pycache__/tags.cpython-310.pyc,, -packaging/__pycache__/utils.cpython-310.pyc,, -packaging/__pycache__/version.cpython-310.pyc,, -packaging/_elffile.py,sha256=UkrbDtW7aeq3qqoAfU16ojyHZ1xsTvGke_WqMTKAKd0,3286 -packaging/_manylinux.py,sha256=t4y_-dTOcfr36gLY-ztiOpxxJFGO2ikC11HgfysGxiM,9596 -packaging/_musllinux.py,sha256=p9ZqNYiOItGee8KcZFeHF_YcdhVwGHdK6r-8lgixvGQ,2694 -packaging/_parser.py,sha256=gYfnj0pRHflVc4RHZit13KNTyN9iiVcU2RUCGi22BwM,10221 -packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431 -packaging/_tokenizer.py,sha256=OYzt7qKxylOAJ-q0XyK1qAycyPRYLfMPdGQKRXkZWyI,5310 -packaging/licenses/__init__.py,sha256=VsK4o27CJXWfTi8r2ybJmsBoCdhpnBWuNrskaCVKP7U,5715 -packaging/licenses/__pycache__/__init__.cpython-310.pyc,, -packaging/licenses/__pycache__/_spdx.cpython-310.pyc,, -packaging/licenses/_spdx.py,sha256=oAm1ztPFwlsmCKe7lAAsv_OIOfS1cWDu9bNBkeu-2ns,48398 -packaging/markers.py,sha256=P0we27jm1xUzgGMJxBjtUFCIWeBxTsMeJTOJ6chZmAY,12049 -packaging/metadata.py,sha256=8IZErqQQnNm53dZZuYq4FGU4_dpyinMeH1QFBIWIkfE,34739 -packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -packaging/requirements.py,sha256=gYyRSAdbrIyKDY66ugIDUQjRMvxkH2ALioTmX3tnL6o,2947 -packaging/specifiers.py,sha256=gtPu5DTc-F9baLq3FTGEK6dPhHGCuwwZetaY0PSV2gs,40055 -packaging/tags.py,sha256=41s97W9Zatrq2Ed7Rc3qeBDaHe8pKKvYq2mGjwahfXk,22745 -packaging/utils.py,sha256=0F3Hh9OFuRgrhTgGZUl5K22Fv1YP2tZl1z_2gO6kJiA,5050 -packaging/version.py,sha256=olfyuk_DPbflNkJ4wBWetXQ17c74x3DB501degUv7DY,16676 diff --git a/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/WHEEL b/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/WHEEL deleted file mode 100644 index d8b9936..0000000 --- a/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.12.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/licenses/LICENSE b/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/licenses/LICENSE deleted file mode 100644 index 6f62d44..0000000 --- a/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/licenses/LICENSE +++ /dev/null @@ -1,3 +0,0 @@ -This software is made available under the terms of *either* of the licenses -found in LICENSE.APACHE or LICENSE.BSD. Contributions to this software is made -under the terms of *both* these licenses. diff --git a/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/licenses/LICENSE.APACHE b/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/licenses/LICENSE.APACHE deleted file mode 100644 index f433b1a..0000000 --- a/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/licenses/LICENSE.APACHE +++ /dev/null @@ -1,177 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS diff --git a/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/licenses/LICENSE.BSD b/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/licenses/LICENSE.BSD deleted file mode 100644 index 42ce7b7..0000000 --- a/blog-app/venv/Lib/site-packages/packaging-25.0.dist-info/licenses/LICENSE.BSD +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) Donald Stufft and individual contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/blog-app/venv/Lib/site-packages/packaging/__init__.py b/blog-app/venv/Lib/site-packages/packaging/__init__.py deleted file mode 100644 index d45c22c..0000000 --- a/blog-app/venv/Lib/site-packages/packaging/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -__title__ = "packaging" -__summary__ = "Core utilities for Python packages" -__uri__ = "https://github.com/pypa/packaging" - -__version__ = "25.0" - -__author__ = "Donald Stufft and individual contributors" -__email__ = "donald@stufft.io" - -__license__ = "BSD-2-Clause or Apache-2.0" -__copyright__ = f"2014 {__author__}" diff --git a/blog-app/venv/Lib/site-packages/packaging/__pycache__/__init__.cpython-310.pyc b/blog-app/venv/Lib/site-packages/packaging/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index eb9b1c6db3c4f7d8ce29ee0821f99bab4b916fe3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 538 zcmYjOOK#gR5S0`;wo|ysx+|tT7m$@2?Ivi7G&Z^_(g1EZ0s(>+X=xCe6!;M!U8TqY za*v+E+wOaSt~$2S&kQ)=8$3P^AI)TP7GYd`zpj7AQS@UE{*MH~4KDWzi-?Ly#6>KU zA`vIWiAal742pp`El$Nyrr)B+q!^0PDw>XWg z8%>TR>H3S>`^H`6c?G@>>se{GdDAsK|0k2q-_9=k>C$Mf1X=m8*?7XWAfN@bAOcsU zG}>EO2XCzF&&7dy;||mrnEu7>YMITmh2p_Uf@6F@`C4Xk6duekU%w%D)6s6sm*z=1KG3x?RmPi! ywo{=aDD2iT`$wa0oONkQ*%5u3g0G0xF zq1go`pui+$Dz}_+bzDUq{R{F3{2OxEYfe17a$!FJMB|#KvE;8{xK`6R<9eHQ^qS6yH`+$cP=B*#s=rmU@Hg9q zPO(;G+NT<~c;UIm3&P$uY7=M|xsA3hj132pNk}HR1Bo+|OhGcqry!XcNv0v0<|Rl< z+j_0Ujr&?<#{W6fG-vV7ZMPA&h1>OIB4pKZ9<;*5?aFvFH)#7w;;yYh^EMRM z*4(t^r@21*BbQ8wXCmmO{yGeW5e6k;Cv5xD38PfVh93wwjbWn}c5@q5_iohg!;)~N z@HqyJ^)PwZ>9$2jK*X`08-60V8%LMjR+@H`%X4$hFiES;Fm3hLt3lkEYxk3c$9%3a ze`fx|C0|_Rm(B$j7v?Yc^YaVmebETcHX7@JuQuDlbV42&lcJGyMUYh6VbpuphCF*4ipBEKU%FLOMv6Z2l1_$kkO((~JS&o`R1 zVMmd@6$V$bM7XGq8qzIB3H_x2~SvY^N@tm6= zl}V6e_`ah7v>KZ!*<05m>C$5E!s7BRKlLSfMNWgfY3e)4dS-l4fU z(4tvWOZ5$-|31^U45kgN)a3d$8ya8g9Fjj8PuWu~wT5VM<1hMgZJTYGLzA124fzRl zt)cmq{xwE?$)IB#*Dyx`TtRWg!BIkJ!el=AcXOz16z~-ruv0g-Ea=+!Ca{hZSclVZ zjaE^D7A$*{TLtx>Qgm9;667;qAm7~AMtl9+ zp}o$$YO_*a$&51#HwHiKMGC@!)hZphNC8nAHo`!;XqQ4jUHL!3lY^NsM=iJGH^bnv zyGxh0Vhkp)EG;e5v$V7{n7E=?kZ%l0S3JLLAC6S79#*|NR+T?JWa-|$d;6Ba;~86` z8!Jy9vV^`|6_%9dJxMpGVpjBgT8i{BPou#rBO|%ui42bQA}NBn8HEERpTGwUhH2kD zHJGWmv2;Zg#2ldLp4wxT!Q89I*2yn0;+eaN2q>K(!!=^rQRi4GXS&zOERRxOR!CCW z3)0LIQpQpNX=bTV&+PHUnLVB{D|lV6(Mi=m<>xr4$uLVd{BRw2~S~ zf$4gQm6^lrKkF~cy3I<=(H%&2OK0?&|8=a{|C9UhxF9v zurfxI#-Ka`jp}&P%%JTXIJLc*w1-OJA&Q5O-DCb$W0b?$aqYOqbwaNvz#rQFs0Y|}T-i$}cL;m* zo#|1JnfJV4J0%XR(P8sGYEVj0gC&LDgy5(s02FBpHCzx&j+=twk7~NLwbcjS^2&q7 z&sR||j<3L|dfFeJw^ru$B^D;GE4eVQ^45{?z2&bvh-3x^+eD~9qO;ymKwS!SZl^I!2|HmT}Rq$O0Nf56b>J&=<1 z9)hxrkVbI6oYi&qE;|W+aAfS`L!(wIrn*j&GOPSCk)MD-dX4z&M3nRfN%fq+P5f&) zz36#74m?l(k_OR+GaGezSID$4?~?2w1{J3Q@ke9}-+oqiOy{(2l$lgLGjf#-p|))F zkVR2jN{ZOb6aWPIE3l(`koLO(I7tDTIluMWJ)ux0$EV_QlrGW$D!o+MqiO~<#hX@@ f*;n#X_9_K`LN$%4O*uAz!e&#fY|NUo7GC@R%TO4P diff --git a/blog-app/venv/Lib/site-packages/packaging/__pycache__/_manylinux.cpython-310.pyc b/blog-app/venv/Lib/site-packages/packaging/__pycache__/_manylinux.cpython-310.pyc deleted file mode 100644 index a24dd411def0d19f9e91d7496035974dafeee257..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6599 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 diff --git a/blog-app/venv/Lib/site-packages/packaging/__pycache__/_musllinux.cpython-310.pyc b/blog-app/venv/Lib/site-packages/packaging/__pycache__/_musllinux.cpython-310.pyc deleted file mode 100644 index d829670b9c76f2b877f8356695471f7c2b20c5df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3462 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 diff --git a/blog-app/venv/Lib/site-packages/packaging/__pycache__/_tokenizer.cpython-310.pyc b/blog-app/venv/Lib/site-packages/packaging/__pycache__/_tokenizer.cpython-310.pyc deleted file mode 100644 index 1ac65b65dbc3a766c96004c49519da36d7907932..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5969 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ⅈj z(eYL>&c#YRhBfF|4~lUnz-CLT*c9>lhwJgbUVdZMP10%mHsl;#gYf#L2fHT})5rL@w1Q{tF6OpI`s))x$Lo5Ia05!!T zpsIL6EQ=PPP&_FviOYa$;!%jpQ?@=IkpH=SiIe$2tVWLDnPwYU$>;U4HVW1TF@%_; zM#qqdMz6$r+#kdcLnI!0vxHi4vwgmCV<5xd0GtMNvXYN_LglO!&3@aJYCvV*Hz zkgpOm;3UW0WTgXT9@y5LmX{jq!P^E(nz72Q-zjq0XTap_LGrOIypI(B3}6x%a!8Np zx9m%jU+{^c2UjTh)}v%nHOzR2-VtaIy&stX>37~f-6w}^$3G<8hj(T4j39t3CV*ab z)ZQjwO?cIW(62dMa~2WwBSFSgt(p3rhN<60yT~k{9PM@@-V|gL%FiabM?39B+v33Q z*^REM;Iqpd^#~yABjwf`s|;2yjSWhY6|T|NP9kB0p(_L`L^*7XT<&wOYS;^Tsnf8n zd@ZvrbrHpZ`?j!Dp6(viDhKd1PYvhKKumAtB;|Y0Qdm{^#!3o_YP5)1ieEILwrQ_#NuZ?i3%SjvvH)b26MRhspbuvHSvcC&&M{p%re7V? zuP5w!d`#mByB4>r>Phg+`a4CM+dvn}NTHAr7aa9CqNky0dkVR7OSVgx+KB?6os)j`V|HSF&Ez&^uX3Q@57Ox!Gi^m zmvq5BqvTBejkh?I^EEKjxOxT=WDlCmzYkG7w@pe@TPe&yDutw3|7KBSXEq7)e!}Ml zbg-Hkdc-tTuT28=i|qJE6y6lyyR3KtBo*jYrZ@l`OmP)(b&5m4;V#TkF1u!RcuToXcCB{|8k15;PI@=|wN1 z>_NoX{m5f~Mn3yv(wfT*C?hxot^%%FmHQ3Hs>{%T6ccw&`W#A`au!%PXZW9`wet#j zEG^zZX;j9wiBdec72bB#v)H(;fm>6(ip^`-T*KycVGiLgb6nvk-EAo(K8+gDV$_Pf z$ZLj9+i73KYs}Ud4lTIGC=99%%)toGS{HbQbr8z7E6GY>)~YKginu9uWe(RmF_XZx@Rt0D>g=DT;aoB@v)N=-ZNE0{Wmti>?jHB1Od@sKvv+2XMi~ zE_C056yc>mM8%dnv1igYja%CtGEF*F>wZqsPTH9^&7_(Bk)&xe?H_NZj%U*8)alf< z~p?nQHOu$;r^;BQQyzx4H7?hp8o z{uJ==Y%XW`B_o$}b8|V@aLu~0YR;Jkt8L;l~=dSZ9$oWTdWVP4$ciqystjAx^-@=k@L2ATfN~Wb8l{Ln^$&A-Zr=Y%jVp6 zuaD`=rnf`hjkrhLA$RLL*4)mI=G~TlFoS)l^ zw4LrQr0w$dBF{draP1y<_jO}#zx$B8&%For-0M!b_qqoVJK!F554xj>-RDla54wjD zvr)sCJB}L0rG|rU{#0)K;f=poo}9E>p5OAl*81AiRJm;9v!t4<_L@_@;4Ie~%ai_^ zSFJ78JmuT9)wQN-*{7nEi6nZ;YfacE8yB5=&5hsps_r5xsx=!?U1#)T`8%AiaUNJ{- zS{0qy@G4=8Nbd_<3%0-3SaX!`xnTmT!0W+loGn z=kYyGB-@2ZE7#7ojH{;K-!j^{tHu>PpUS;w%#NEux#rgze#>c8J*jEjP=hG)UQTVt z&yDrtQ}eI+0L%Prt=gUBt~_U5(qHf{&YwQ-9ew3|ZT^+Zt@F*s z{0Zc}Fuz!DE+2K)*5)sIjf?XiuPx5|wU&2O&!^|l#}oT-GO?3umxHa9YSUBI7+m|% z7r%(0Y?KVkP$P&|@y&cV?q@mXVMM&#oPot;#H>x_}iDx zdkx!ZwY=4}7O>53HSH<}+45}1o~mL*{?tN@PYd>?TI)RC#9f!F{FaiU=be^a1D0wm zoYdGnGc%K5>DXw!S-<48M#rV#Y2{SCMPRx;w%YVtw(_c8qh$kc>Nc8gjZaB7E{e&? zNr}hcORbB^&QVT9DFC| z^i?Wuvs$SLYNUc4fVbL-z{c0N5R`HyLsGgXDW-m3K(=U-KwT_QjJ#{TV_h}o3i5ow zExLX3T$Jbg+%4{aJokAeNwGEEx@w?Izt_J~2CdmnN+!>&bJRWL?s9j(Q$WfVmg(Pt zwENwA-2IX^;O+owJP-^%@AzIkvuZ2)7UVILUF(WCb{shN1CG))P}tn~N<1&G%8K;u z)_KoHX-wgo@_fvqkPy4Mgg3y6xS^x<+6B*UF0Odh)}(zJ@8YWb^Ud|TYcG14N-iQd zEAf&#>>3DWeMut(kz-b7<~<{@nBFl>0p<`rt5lAn|35GhShnRI)H(w zLkvi!b--m96e|_)%}Qm8sWyU*kxp3g^^GkYq20D;n+@-_bNt=cvm*ymA5|UzRL#_G(;e& zTqBTPZWtUu+&Pr@LVP*G9%u1IjU(;j(MVP# zu%V`@(=r4ENL8qdJh0jX1;lGGSWJAap(#SlHaojJp4aG25+z;f=yOmCEA&q>hmD|< zB19R268a!=+Kv4u!`RslK?>s5x$rHdxL$8>3yPnML2=r-z%?Obmv%|72?r*+_EN2m zUI>F&wf!al0V$!`0G{hSm(JI!=i|yqI&K5I^qPaLfoe8`=EIvov#2}usTh_W6hprT z4v{OWdk{qNgN$364BgL{lH-9?jxn7>5Rd6P$3u)!NE*MfqI&|d``kC&lkUe5v)zij;C|fw1jcu;e;7}W`$_jzJdL`;5XTmS{#d+n zo&jVv`=RV^M`+6;4R?%^~;m?r<&__DAO^Q=eY4Q2aR6>)kpbDO?5%f1&Tniob$dag+f_6g3@Ko(WM$>*Jvv15Za_esepYW@X(aZKcpJHd$$)a+poO% ziv7eBj|i>51mZ3F1IQkrFXWFsDsvi_V;KaK;567fQF?%s>!zaNla)dUsy5e^v+O1K z6Ls#8y|@kpZB*;)F6N%VgMf5dB(yBFx<@tk%rVT~^f+PvGWn4PkQU!PyK5@CMl$ao z=}J5M#=QTL@pDI_33b$B4Rl#uj`1>-*jCoD-*uqyK-hr(05F*7sx2BOYXfX`2R+Q4 zE`a&1dTT8~4xl&`NkDCH!gg+15yZdRQ7AT`1L9a$9d!Xq(O+MqZV83Kv#})VO(;p0 zInQ3>*3|*}UNpK`>h&-sP3jj!^zl}+;7?WzN7&BPzxm=AgHCB&_7$705MZba3{)5a zMp17l!eT%g&3vjZCMKt_Oh$)^hkWuRJwBF)v0no1|7Y`Yf{UVNsjuYl^=M~;5@+(QS) zpGk@zvc0utO8Sc4=&UF+KdGbRNAT(p2*2!rx_fa*h<&*Bx!1t{C^Hw14U!-2peF1! zXnT?;2e7_~{Z3b}59v9KW(=TR*85S+)Us->uW@!(HT!U|wd1U>LLAk}O=z^54emmt zaYetqaE$NfC+9KHL-y-&-~G#w1H|49<9tz zp6i~`DF2vKUpw!#7s1ThsPAIUyTso%lG@d_s%F<(REod1t68SL_o&Bv_vcQBt#y4G zm(o2-$5GeO5c%4Ohn*cG=Cm=)wi*wUbT@ksbMt(k#HCi)>Nx(4$w~B;!X!xE_*DMx(RG zUJnVpV?PwhmR#MAeIz>roMXV9KOLXjFWV5Kx}eO8KG<@-RgIf0(+>QSwtJ4JV|bWS zuCZIvB>?7!TbsQ*cl$Mo&XHC0T9n!8yORa<9K_jB2^p>(Un?fG$PFvU`XY5p#1Gjx z0Jpp5^pL%oSmHJ(BSk3<8W0T5dzWnp=49v6M32fuW{LP6lqMY#N`p#4>QGRV?j_e7 z$o*37tsb?Bz(_GJX2vOZWuiA)qV9{v7= zcx-|rKiygbCZ1#fGZV zY5j4gU?BZE=#MvvZCp35# zS~DXr3u^dbY6(?YPF42YNi7Mrt}SJ{11A8ObRt_0u!YKv#0&$jvJly8WMIyEt4X~H zR5oZ%6e6JRnJTrBK`63#gro+iXwUZ}!*@I#*&&`x+bZH}Qbv1wtTyRQ+KUc$!?N`W zbz-Dy8#_Wfd%R^2sf`}U4;aPw%f*fD@!(s&>OQ>6YjKN6;A7$_f24aHx3yd+#4Ri9y zciz8w^XBOj;{|nw$*&;@N?ybDX+siMm0+;ur(hPDjb35)K?aE)UsU)sb^QsxKGVxq z(I^*6#&!UzY*~h7ZtP4zm6{1f<3*PdnWj8K>jz~-+VHBW0A8oGRpUKFcbVpbUVRt_ zxe(KP+04uWl5^R5ISa;K)C)uV0+&mKUX;Q_!5pJ)iokR@nM_YVI{Db-3Gxv3S$%wM-k~;KhPk;!pRt9bg5yK z*nfvX4{riNjC(N%wTK)W+ma~{>&=XSvq7&TSr<(!ct!gIcyNssp`~BZYx;Me+nnKp+oj|P!HZB^4qacv zJxbQGmT|P;oPwi_^_uwv!0}wiE9e&GvXIsIaI2~|tWRJ0^cA=j79nwfVQo%KXp?=K zAmthxD5Y0o=znx$E8IZq-dPN3g5x@u0WFKg(i}-Nog7!doc8Kpupu{p0Ul*v2HTQ1 zNNF2ObOkKTDj^b_9^pZ7mf9h_xB~M;jfTO>hNqh2rlOHn27$QX$Tm!Z_U4RSIXf{1 zzKd}dlIQ0m#4*hhtj5Lnhpdgg@f=NdjKVrHc5B}W^x8$HsiM#ydeZHxX-s>#0g zqIsiu@iA1RnU0Yr+>vipV#M!abp(|VK+=D-ZP1le?c3;Y=dPJ>D24YOBxvLHTw{lo zYvnKRHQ*{@B79?iG3vFYiaDj7SI5QYrhl3GuzuUDcbd&>S zgfJ_6jTAw=YnQ4R{e>fmvl{qO54Rf;2$vyFcP+Mf630ekCTmYmC(D-Uw(zIPM?x=8 za#~WbxOuL=)RK*B>b3Mxd0Y-Ypmw$;&E~V^gjgmkwyWjMh7flnZtsqZc2)UAYUn~j z;ySZjC~kAS1BjoAB$&8hwi>vRY$NWA8_5!5bVdz^W}B^(s~{oN;d-uK9}n_%md1-$ z$S1f;MKIi98r!i>ONM!Kz=WTNxiK6M2{JU@=K{0277QPU(uo_ImqUeFX65A34t-r^ z<)14g4eO?r-`JfRQaWb<54WZds?~xAmv$}ZNTLrZZXdof zs+SOH!Lht$Udy+v7WTxT1o&bbU~n4%M|13}UGu3NeskA~+$KO&#<-h@7}43vO0(7ota{CF1^uw^suo-r{h+@E8y5_|aLOO5U_(Gf zgulK79Uz`Vp$;3YIxNo{s5aVIeVR>hcNG-D^^v<1f;-|FNwghngd;auX8%6Gu~gUt z1hH;z+?#@CG>=KCj22=GO2>TbZ9HHD1$bct^(blSis@oI1)i11Q@o)H(=2SO;JI_9 zfZsfRix4!6?ZQ?c$mp_)T5UQ%ZnC;J0{))%pNSL`i!sg4`LHOSXJeE=aSh_ZHki{7>-(A|~j zA+T4AQ7hP*N+-SrWtk(r72c-f>HOQ#EW8>rbr_XkCuC*Sfb*6df7R%L-EWC z6M2V|N^j;eq`IO}yg6c(@}b{`v>Tk2p8L}jnN+c>d1aqy@UQhdF0DB&l1p|vPCq(E9k4o|G7R2}} zUJIG(oQniIV&MLBVh53q=nKYG9Klf;tI!iu;zFAb^Nr47T6aE703k2>qoX|laWn#i z`fF$c1et&chN#Setu0hXs=tmz^)7?2G3Y?WojvFL_Xq)=4N60xY=v;R?=~2a0R?9} zo^iUCav)cYYsU3(?inNX)Q+sC2p^<^m*7g;Yw;u#7Hhb_&+c+L@9Djq=maN$UtkYHm&9YcV>#lSSTsMC z${z!*^;UDo#;(+wOJz|cQSunFVssimA4@O@BKn zDYz>n%N59xSFE(CdQVlqc(CTNMl zQucf9l0gD``?+?IoOGACkr&H-*J_QsI5rwD(a8wK;-wf*M%SXfb@|REeP?BRnCJp)uS6lg?CW z0sa|8K98N(mHcwhX3TsL>>-(InpG5n9)*7kXYqRe2U{GY+A}>4WG}Y zjwi*6x(J=}kc^`=C zX*ZxWiP0|Cu)FZAJYBHaBOG9uynE6Yje$m)dcB5YAUvSx0{E^M3sxA7bRu3Q989`H zAph8=*<%#>UAS1u;CrbZsR63Nqn|$P9k%_5q!Mm&dhDW>33=cIWS>waX-zc?%XQo% zk;?SZD9U|4oZbNxVpYQyPyB@iJxwXKA(5b+aBhB=1>NF$)eW{vh{6-Be?YZDl}rC)lVY{s0r6V(@q>^#T)~VDKbU zE!ARN>XK6HOf4!=JBVr`X)CTZ^ImilNqM%4T4j51omI!BGG{$0`D;NT>AZB9_Vw{Y z9S1tqUZe&)VokR8rlEc&*dD<>m1Zh0=%eP9>fpXJFTVQx%coup$|pZM`|_(V9)IrC zi|UhX{w)SS#o!|hL~P-nBN0|qjgNA0w8_{g1D+n$Ld`pjQH!VkGJ~IE@be75&fsq_ zxW?d@7;y8n`N7f|yoErL^Qm{`!BVT=%3E&?8D+zI-z)-8QvZs7GO)$mhl8fOaqJYH zD`pAaE2Z*wvy9)qa=v_TxmX@4k0DmXzdhvx<@~@-^XTwR#dbChyfGFYBN&6{VSFkg zOuJvO;YL3xCe5x{i!1g11$>WFdU^v9$W5?kXzlfU{t9%~*o8qu(l*z&(sRzpK^_w4 zAV@vCsI`W4RKQ*h@(&$|t`*wFYsKq1k(YK!NxX%;ggEwama`ih$y3za$3h8MFEkC9 zU!3f3w4#HW6gxy?oO&e;kes@~vvAZsgp5Nw@Cq1; zCJ-EObY0j?Q{mVEoiU=C^o9<`>84HFga|XCk6O}4xR2o`2e~R{YH7VuomzS7$iy#S#;(_MFC5xU?yi3T(?FjJZ6L&lH^oP~vnW;1Oq5KmD(R~egj9%W)&+K-2J?hRNZ=w1ew8Mu}~YYq&8 zm5g^of?@(4?wW$HVi4k*B>> z7gyv*+4KafUjbCqKSh93~l&&D{XE-C&R+sul48@e7FFeK4 z?e>S|CDsbehT-qQLo4^i+!A~!T=Sihn|~q4n{{Zn7`J9K(}zZ+AlQrH@596AF@fhw zSB!T-4(L!T+a5Fah{F)d@L*Ccao&T4)0})nT}3&lmVO;SdL(qx3;K`oc=cOrYUZmP z3b$-vow)a@d~@Sq*1k7+Ol(g6%w${!cXZ`(CL%DLz*r1SRShial+k`32TRqzj@yzL z8&sc1@bhenj$WXsXh_mvY4nz`BCrzAw{F~{eNke{I3Z%C5Xo~HO)Ozg?kQCA4-r|$ zKNFT->;{3=+FB|Q2FPeF6*`%Z-@sn_4nY{b;Yxrn1$L(vEvjygw!Nqfd@-Q)>Uv{d zEAURZWupZT*(uBFQYSM`kei-1OCaIf;d+(Pe)v9jiO5i>@}5=wmzojKg^mz z(sc9cchS5yBmFzZevd)N^7#))`vtV6{v%(qwDuDECy0&r3uRTGVd`fYe2&2v5d=k? z=Z7&m$getY1%>K)u!~@j1f>$~ejye8HnaZ@vzLih+8`Zl5#$Q3(;eOU0y2MtcuBdn zZ0yVLlkY@+!Whcqnu+%nb5!xoe29O~a#?;8k@T$+{bqmOeH8aI;I;_dmSA}W_i^4D zA-6dcajQh1`vh+P3!mL5<>o(Yu7uc#yAwAr^y5Yc-Ya3@=831|1}zJ>O+2k{keD05 zTe&@AZqWTOZr!>c`G#=cgWMM}x3xcy)<1$+~Taa$;}N;bRa2W39%+5k_=A9mjY>jA)XB*ZQ9-qM zy@tNbff8E?@VH&VTAGG|k8yr7bRRe@i-T-O{5qB?oRsPBLiVE|WAgWB%{OViCDnyT z#%cUuoBbR32@Jo3H3a2jqyiMxX8t`%GMm_++Za#JT70}B&6c84H;jo{C>ge)oZfN& zDjVttm)P*YJ%o8cqdH3K-Zyga@_Rk&$|QoHLEh(AcFjz^_LP=QKZi-{D|v+SQh;@9Uq z>_S9@#3JWmCD$P!LJpKo__vX*b40(1wC{3679!^7MsgbuW#FFDa;88ZNs*A6&#=<} z!r-?U^zx8pHw(X9!h1x5=r4crj`dAhoi0aPnZb zDVG}|Gj}}D;bUtVXvF#=5&E$kd&xU%H{orlWe)j>J zmZC|^v#Ls5n?sCy#Jzo0y$~=#q0MVoe}FmZB13s33MHqWKqz_N6?(Tp zjO?K0;HH8$-$uqxv>`1YK~*6w-<8`qoL<-9OBh$B(wmO|D-^~#O8R@cnx6L}<rKXmd-Q5;6mNH-HKh>g!hU@%t(>j6ksQRt#6#}K zKr^g^0Ot2N*(IIdVwt`S$__AJF&cf6#)A~wT2PF&%&T;b;mI>OQ1LwIf7`_22wBCW z$w|R1@rxIP<`|DoMCI;;bM$OEjd){S-AI<=2k*!1#);$lia8DH)QK@5884~B1?8mw zav7BHuar^PZeri8V7&GxGqUM_0`e)W^_=?8376BJEL~ngx8YX3Sj^^UlzKLvtwLm#WMy>qC$pq_EIJ&w>Pp>wbazl& z&n$Q5@6~g-*`rN8vOKnF<*>ab`^OoeyGjR?A7b<#Rw2}KhpT1BB6m))5&fImVQsw zFLOT=xje-UrF21Yg<=@&8gAlgBZ8X9E4Nul&^%u7E>A-yNRa<*!WX!W5m^vEAn*!_ z`xNhkGQJ@^5K4{K=J4jN5y()foFQs(n#-jw;YH`r2EZX?>7uuL@QQiNqZst9fIVAlUi@K=X8STv#ySZi@$M3c>cr|fjaW{2zJF(I=s@o6! zHeLCls_DTOdIL=TO<7t>JCqTsZ@bBS-$eNJHL@j$e9eAh6b%$Q-9Om77Z~mwq*LyFH*o`t? z+%ZtQ$Uu5tdkA((Rh{(W7Nq5l>kP?8QdReAzMHx_{n78XwjSgl8GlTjlHPuBV8)g8 zXtMWQ&7R0ePGqOlZ#_=3!A+8AOT_-L0s;b(k^8b4>P+b8WUBv)OtYGfeH&5OA;gJJ zG;l)Gb|6*#CW3E*M1;B%*dH=NMGTH!%9B1VI#LMKiguDSIbsLLh<-;JaGZJX@! z)xVY7|K_!&UFCc5vV>ROg`a+=wH}pz5Lf*e(VuJBqvA6;+M!YAMVETc!_!5Xvoo;D z;zG45Y>`VTDVYP%S$0y8j>jk&FxQx2)MF!bxkgg zcHHiCgs$fQ5V$G3^K;iD@6rAp;Lxl{H_$JOG$VSd$0$rZz~Flf=-;M~WYBrJ>nMi4 zq@|>%1BRc!!|WoX(8H~B&&Rs|KE;#!5h+d3kY6@N_(wxw(8qNia@S)S=Pd@zVVuOk z#U5Erm~KY>J(PyN?OSZ&_Zdj<#~71S4fM!TR5>TdEaYefWT-<-{lhq?=;)rrBjh|O z`ac*Ck4aFik{px3JwS94k+I2}q|rZO#-w=xo_H2K&Dys2IyBMqd_#@(&_bq08T@w! zR1vE0GWb3N?wW6NWPxM)#}IRUx-{^}f>|<+fj=`J#KDAN97M>Mca{ec-dEmNw#sF5 z58nQ%IfX+AEQ!GnvW;Z$6icI2F&zq^ep#pf8uK!)0mb*o`|C_d@)97Juis{>b|}jPDUbPwRA?tw1qikiq;tu{Qhr@?PTe`=bk_Q2^=brzYr!aKk6Ux5*GyzeYf4_5mUlRub4iXk zFP?jc61l_1SvlBEQ@26dra(5^NZFu>lfHs9X__W!3bcPD{ii6<0=)>3MT!7b(x5<$ zq=gbk{r$dk@8v^uy=_U%nRCzkp7WjG_xrwcraL@b%HZ$mfBS{S|MFHQ^I!R}`7eiu zFJ&@TVB49@^^D3WtCeY6GnU1;-LhwF`F3U;`F3Yq`OeN{Bb}%z@z#s7+^BU%S@l`Oj;KZT zoO&LyXHc@K#?&}Uex_*iU)@v()rp_B)RH=_KL37x=2_KJXVi-*{n>3L+Ul%&86}RY zj{1T+j}phy5?%F0^(C}g^`D%#R8L)0m+t`<%M1-cdIYdm$eCs(M#_?fu-$ zDYd3*Y8E-CGiuyU}BlQ`aWmxcbHf!rJs}SKhc*o4WA&#B^j`z3*Zy4Zi5+KPG;OTOmZm z&&*gV1L3!3oCR!zpS2+Phbe%Vx~!j5Pf-xxckfs;d3hRE6?rPi(})_Cr=s%IUbPQ( zN)S3Dj6A8L`LJ6Nn9~Co%a)BIjCtVeMYY!`}r@`#tRke#fkW*PZvmMc)hS z3tp(3m{@PVtG&8+Yti>x<0Yvy*$KirratiM+V>h*yQcEBue@fv-4D4?UcIBxPT!PR ztOtus9rq@d`}I~cT=g1@eq*WGS&;UcDAo$PUeNFLx;pgLxFlEI$gS1qno+jK7NT;k z*?}NnxCob9CJcq@J9iMT0i&ifA6iq@T$F8fZ~0n3frj)U22Uc0 zTn=A9jwoL#@LTixFf%;{Pb2s+qmSY1LHFX>8`lG02REjgjc%(R+_=*5FX`rrf8&+D z_UnB~zvQpnxVGqzU0rP6xGG|K<5iShx-r-4E{xTCy&EfjXXVD_=G={-8Twu^at7tH&M4#2#k?Cv8*n z9v(5Mj2=UQLfLI(?(@hQn|`@u~&4I>(1Tu8)4+mb-S$w-!1uL z+`&i0>pUVM1T3`f*g-x75K@Q+)=g*0?jARSF(AMXmNG`xJ4o5|J|*k93elNts8kKSl1_ zpb_}C;&1!gneSwQZ}!v!Ypm*Q+k`ugB44WkEo!y5lR+G^)`rZBO8O^{VLxiHcl2#z zO*3~m3P<{P(f_$M$NQ4^z&a0|W;fN2ons1!y|vnnr1$;l6qt;uYQX@-Qz&83LSht2 zEwLkvJ%ivwTT7g&RaeU*pJ1k>o@8oVf;+uh;R1B(Z6B*ys@2+E)o(FguGNUpaSoqc;N??dEH&}JAog*gT;Dx%PJAWiuj16%pwwI?qt@n zQg-M^{?gHE`W#6+dW!`;!Jqv(Op7yNg25$N^w4R4TutR5%9pnc2JI*~& z*5$*?k1dZv6tU+Isas`ujc%KYK8Qz!wv3k5XD~^TH4Yx+ATi1YJ+uN1s+5`hVmd~MBc>Jl46hYL z8g`1{;#GkyzU#3lsz7aL#IIZWfOMJ-Pg-RgwR_fFJu|!O>Tc_iE%) zC?oe)U3WC)`N1gq_Xeb42t~0IMv^}V5f>i}*a|+2NC*iSWbRq(_5j94KcjaIEWInV z?>gMa_iQUOAT_n8*3Mt-cIKN4-b!6Jh0Gj%HaN`J}W_qWf{ zNNsBiJroVf2ufBNFpd9*uA^afWuhGB0+O<2KTuJp^T6GPodD#5?1SDYC;oQ%jknKE z=?S)E)kG{FSRMc@4>W4k8$NV9fpYr*chx!|VW4$uKG75dSVbwp^d~I+E^Ayy@Sxag z211>;Zdfi<3hig{VBl0)OSUf1S_rWLl{3Jg4`P|Hm91be)3Grf<#It)c3`i7fmCyA zKOwSyi43vb>|j+4o#k4|@&vtZM`4q4?}dw?RNSSd>~{+$vf-5*~pJ$iBl?m~W9`Nqx;Fcy+DV=-p7y9~*zJs)NoUAQhak$ZAK0q^<3I&v0YQ8uJWiKhiT=_Z2>Ehfk{ zOvB_<4P?93^n(vjLInPBUbopmskfTU^Oo5hMkZHZX0rgnFtfRyS;(y0oK3hjtRI0Z z;*PbBz3FDwU3{|mgQP7&bR$w3kEl0K<& z&}SbuvyxKi*zMUDkU}K^!kycQ9Hc|&!l5&=DO6FZUBBJ$ zz?M^fl!LJN9TnxE;=!G&!@9#}3H@ff=i|L$1dhZQL~9ku+UhnUx8Dd(N2OcMaIq$; zBPydiFi0~q5j(H>x5H>yilp_*ardU=jW;~m|D_#D7T74JCc^U3w1^t~T_a}G)e zGlSy1jj@#g86`6l92K^EGO8b2{-y$b<)>P%KMwd4%zV4)x2PbE4+uCc-k*yx@@}Gh zo3$f!opA#Jvb*zVrJ*se(L2`@_e8Q;&X1jgoFPnD;`vW5NqGIf3JRy*sl^t^F5aWw z@wSg*Tic%ZjCZ944_2aI;(Zu+s(T9>z3Wlo#ICRTZLN9TPHWW*dVZrh4^80Jy>|U3 z<}A^3n8=RT$A%wEjRKGnljgM-|NaIuo`p8_kVM~!_-$|4kH` z0%*`A{Lqf<@soOrQOj5msm&M_&n@^J|8`HG|8L0uh@{qj?@(s#sRYAlm5iSQSi+fj zempJxiKEkh3r#>ve1NYh{kIY7A7}6r4AOq}-@)U3CjDJT9^y|_feaiV{&l2A<#@T_ zO~ZyE{}m!3fEc+Xz7c$o?e2;nmEI)FpU@gk?BQf1&;$x(3WTc}5|P#Q&VpYZGAx9Q zP=L}H3uVkitJ#3>4(nii1DrO|9Z>YdC4jsqw?nY`!%El zmktG8M$3%AjqV-B55(a`j25c+KqU@eZ(S>{po%U;kw z$xlf;d*BYT3vd{%Q@|WBibJ78$5O{Njv$C7oJzfC!mQy0 z3htp5OOKOD&`O1S!LWo}%o6fp9$Y}2O2QIOFP~Hn#3Q@*Ya$*yE8=)MfcNQ1$fqmf zbDK)b|X1RPX%&Cq~kYPuE99>q5dZ*w27gTyzZ!1M3M$5{KK0JWxWSZ zVj6ewR~VQgBjc(ovbF3%xRK5ChHx6s zB18GLU)?N2F?maA4akD>g9eNdD0ol`P@hhh`-Y8;v_KbUXB>SGqw<=Sb_wQ%9y_xpvWxr-$MYO$SmWcTffZ& zTkI!zPN?CwTQ>V@u)sGNg{k0xgu5~AIk>zJe#bGI925tWn$|0>JEnY+v-~-s zN!hhO+`OP9jX`|=Ehn}l;Ntc*2eR!Rj?{S!OZ@ff2~TV!Yrr~2C_WuLdaKVFzx5*= zdn>F64~K7?Ywz0<_d7P zoqA!e8E*0CknB=sE>eN8F*qk717IN;dRf5`hPZxm>A{(boL&!>eDl;xXW&cyE{a2l z|2e+&uQ1q#R7KojfZjvrM4Es%Y{a2Qx1Oy@)P&AO1o;7n2sZ2I5^DN5X zd{V!RGWjJpI2D)ud|cL21!)T&cU45W%g8Um5T8ie;w=X%S1L(0ypqw^F$zn8g-OZ? zQobfBqmn{T^{%NXcl)I?wKJ#Tz~kJA$ENB;Sqfb%%FfrrGpFV2)C>Awpa2l$H(Bmq zBZwSigMaiItgn9qN%zT1^=~owRRl>Y5kRWw-$v{_CsqF|1W~rG+vuPK{|b?<-g@D@ zw7^XLZy2ysX-oQzifKt$PdU&a;IAk-3{0f<*V$~IHyY|;uw5GVh&0SKJ9WKUi_5er z7spX6C#s50n*s=t`KJ39A}!BQXCOrUKyrQu6&~!_EHpcvpKwYG_%tZle~yl*(C%9I zGU*8#(Lmwr=BGhY62%28@rPZwd$7(Me zEo^l!S{+GS&Hg{M`kmz;k6Znp94q91ALi=!!iw6Dn>_zN`yYflwRvv&QJ|dvim1)`_unsn_9XM3!pR>?@H-b`z8UHD*R1j5}wOuR?>H|GJfM9Xa*v9XI+uj8sxV-ejo za1n^7rk~p0E4bUSF=Y6H{P}vng@aXd;0k9h&cJa%h|$Qoois>q89QwBaTJK-$z(P> z{7vb9iTxz!YvSro5M~sqYtC3Oy=IR!*2Zw;fjdy?8@>#s2}C=Vyzw}d0;c6y^_`RN zRB)tH{A^Af64XZXb74LLg7vwQ*_N z_vv0W_9TH&PDO-sMR|1A4Q|);Oj<(V?cei}?sxs~5L8Fy5|fnX&@^$w_{p7iy{CEO zKrBUAh5b298*YvTk)!(^<2->$=r_#0vBbi~# zw}|}zrJc(Gdu_}8b9>1Cvm<2?3o%b!8(8e@MQNH8hs0^}$a8_F#zqPEymy@FcFs}$~JwuEbxHsX_R!Bogx3i^&J`lIJII5ANN-$r_sw~Jm420XL zL9~lYFTXD3**41$$K{E$WmQS*55@I~VjFea%Ra|a9jX8N_lH#-uelwn&I&pu1o^CY z;ZyL54Q!y3mmrg%0C#(`UsHq}_bwR(0aG^+l7Pgfri>L7k0o91vvSzE9mJj&uTeMc z`q3`Ev2-}ch)RM};#cO8^(???JUw8QJGkSxDjSQ~tjB9B$I}J?t)M%#W)Bx-{cbQz zPxS2VmrjF##fd=^mFqaanXP`}yQa;h{g^?S_uh_>atA^7_u5m4ulqC{&7m%MpcK~sj7i^PKr2%JM+En2WWsa%G`^xd8{Pt1`aiK?3R(uEDqAN? zE)~Z!rEjpEoZ)1efK|;Ktoj}sB6RW!MazeCFWSfM64|Ih`!VjDQT_poZ!-dhHwH#2X2uGN$^4RxTL5U%peHVC&tcnA= zH(cRgFNzgas{bUwPvmHmhwLoRUC++`^=r8Dnau8Ny7jyZVA|cL8uxIJ5-x&$%=bGD zIrcyt-qY@qxLu`H*s)`A`E*AG#{V%pn@-^Dtav(*GS_5WFZ6l!61)cNBDtUyv!Hl8 zbH>y9W=rFA7@MZ;&0e@V>B+*R8|2(#81{m*Cr&7?7jN5*c)jHx3mPhTrCAX7Uba(uDHaQ5jlj(ZTPe+=^|+_*oW;Y*E;R@o){r9 zavv7ll2fpElP+cVTDVW}Q2!a)r&}ZaqwP%G5zM)Z2r-9OzwXhqMjqnOpAx`_AdXY< zvB0Sh41&FMNI9?oaZg%&6`smU4VRYYJ^Kcj4-ti@L<@G)x(kooz*(@sY1}Y(H_wB9 z9KC0F^d1(rJ`Y@2g$2~cVL<9=o#2K4Y6%_)`Be$7&6;oHkBCa-{CyDe?)Gy;?`&MmtB z4DA)yRuKn^SgbgOqOzOL+B5}M@Ac!MyD5dvuFvok2W4^$aU%1w?D?zaRxdrRJ6NDb zvB>q^7IZq!)MHS{U8?I_%?@tOUzyf_!dJ{*<~o5TaO3L#!GHu`l(g&&nPqv=P5UjK zB3byaa8BsTF1tBUfQ?Vimi#Si#Er%^x=3fvenfb4<|dC^ox5;X-m`ioIxVZ#+CP*x zHAj=?MS1O3e9U-hm~6Zgu*2!obQh(za-_gptgrZ99qI(vA69$?B?^?t|igTM0UkZpMK zQ;1>8cj}v?yv@Ejv7?q8-E5g~2kD$}Bw9fW5kiOD)`t~}ZMaJg&Fl||&JNMJgX>Lq zGRaen_J@J?b_cf=I8aG-279^^JG zTtoFva&vzeQzn-IrgQ~S9xt4d+ba+j%DddZ&^)@7)t2K7ES?CV9DzfCtWk~(Cv@C0(tpz45GH5c`Xe-X|r1|oG8~JRh>P$^dfhkEN zKgyDq8PK*d$3_y{R`JJJG5*zzG*U8Gl0N*usqdOwo-%NG$$!dL3!6rAn9WI>uQMhi zk&@DX&KwZQB>f8WH(pGpD`&QzxEARI+xVG`Od<9xewS#<{4TS}3ruetquHGQy&d!a zn5qArfwx1xYtFAWMkenV&m80W90IKOwh4~c`-fO!V}jz;ZDnOL&hW=d^L@H-@lzxl z^`bm~PXV1|bZMPQ{24^Q5$gZUb_FGc_Urj51jEsssiq&HFy&@ z+Jn=?+AEXSYMXvQY%YLZVMBuT!U5;`*kGDJSDn4h+ R4=c}>_OSNoP^rAv{og%YDaHT* diff --git a/blog-app/venv/Lib/site-packages/packaging/__pycache__/utils.cpython-310.pyc b/blog-app/venv/Lib/site-packages/packaging/__pycache__/utils.cpython-310.pyc deleted file mode 100644 index 7a6d343c734f69a968bbb3e564b99ee1044f7324..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4666 zcmb7H-E-T<5yt@_0D=@n*{Z+ez=>lCvPjE`>!wQL#PLV!PRn>~IiAv#F%a)4!2tpG z07?;tOgoYD(1%X{fV4Bxqu=`6zV@%U*FNbvZ*HgR?(sviVmB^0JnY@=?(OaEZ*LJ# zOxOxM=l=20+TV^U%0IDl@X0~v6Gb7(6{09qp(Iq=q)rIZYN*y#`PS+hytPno=jyq( zQ8(IV-E3QR3;1-J3-fKeZnq2dg6tb%u{}|rXqW1x_GEpMD9mIAHBTzcU}ZMdQco)Q zuODGKYO$#;wSM$7h32XKRG~JT-qPwnfqsD&pHxu|?|V*tsWf4M#82cjyH<`Zj%+x^xbt&eQkkJgorr4pr|f?v-8ir%Ob^kD@sB z(;$wLnyU-5#x|BVJ51!3x}6YS4lxi_=19Qe`&2O_N8glT#MLvPU{k{wYQ|g2& zaG(SZ6AjlyVYn6wXAf-$p6ihl3=D8+kfc0V>Eec*2v|OFx(Qh2Bx`Xuqz-2-#+@{F z(lzFE{N|VbY7nhT9%r>1P*#;1YtM9Hc^)e8JYjoYJEq+b>7wWTw(Ez(8PoG<-1Iy? z0mkk(&pS638xL^ZMlEQ@p`SE9kJwEfth2_aUC#Wj9KXrd8%t}fa(69g+}%vq;;3;O zc)x6{gz;*{?{pgLELv~;Dp+YGLCPuvds)&L8-58k8Yb1wCP!}_f&ce9G?ro!Ir2*H z@=0I=Z%z-r`EZS~@OBU~+*tPO!*1QcX{R-ucQ*XQX~o@$&cDLDcW>QwuDtuRp)>gu zEVl2R0d)+=PC$cyetgt>ZHw>YQI9QteAwayr~eO&eK6Hiq}sMlRhUt?b3003O^wv-saq0~wQLF(b%JCB!$s#g zskoMy^hS1hoUO92M6T_p%{3XC;;7g3qc{qhG8qgRw4}Qta$&r|I5)s1UV_He_-Ul& zhH{{?%ML^n29lV1K^K}+h2g}4rbJ4ltlETMfX>(hK##p3J%9_1c2AWqfn-B!knN_t zXq>PHM)GsO>XLy?`@olW90`(x{AdWeHc_D|5k3pArDsGO#VpnFQtk&KGY%lSafIY!&scMlFiKVLlDQf%@3HKg_}RC;~nQK`N| z`UEzdTPOT2;582NZfjJBIr9YM#XdNOS|F#bbfRZ%muPVZvW28Tss$On zpN~{J)z7Dsp!0~d$nNRATrc0VTRI&2(ORZgH`c=Jy%7u!RR^=|s}v3bE3kGKF5wmC z%%H%GyXfrxdv9-#zX?a-s=JuOcCnbx7G9-lgU3*wMcwuaq!dV05KC!-dN2oaOol@B zysYr}QDdV)tKRb5`Rv$8S%=3@STmJ%;G)A#Txo7JdD!S+SV0c68?3>vpukw$3P#${ zltm}g;j(jNQ18N)_S~|tSVWVJAYGGXjmR~jLP|w0>4ZTlRLIG3}|^7i=6BT9TrXwgLE3$p~{!O@uSPKx1nvv53A`)NObV=(28+ zGinL@Y8h@`998#Jz_#^!bJ2j=A{&V!V^ zzUGlv-nIKusA)7WwZ3d#mmV41+fwUgl={KwFLCq&eqOe^P&>fqCC9WT@~v*vOrdU1 z_y^cG(#;OkL>w<{j!Bba(j3&sh(nHWkU3#sHzH$@S@3q{A7dkJy@nL-Ti9P<6@82I zn9FKhrmVq9o6Wf0fuj`mozH5Y-@A3=`u$tnLCLqUnZf2GY_Oh|6|E>GU|z`JldB`^ zdn`4C1tmXxgFzvWSGvTwJd*>*E{kVbH(MVLzOb)hN>4EH7IjOt$O$Ojr^yL8;j&gX e%7$(laQ3!l6I(57wx#QkX7==xM~Iy-UHmWXsGaHn diff --git a/blog-app/venv/Lib/site-packages/packaging/__pycache__/version.cpython-310.pyc b/blog-app/venv/Lib/site-packages/packaging/__pycache__/version.cpython-310.pyc deleted file mode 100644 index 044dbce45d1311d73712409b2a577d72adacbb16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15055 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 diff --git a/blog-app/venv/Lib/site-packages/packaging/_elffile.py b/blog-app/venv/Lib/site-packages/packaging/_elffile.py deleted file mode 100644 index 7a5afc3..0000000 --- a/blog-app/venv/Lib/site-packages/packaging/_elffile.py +++ /dev/null @@ -1,109 +0,0 @@ -""" -ELF file parser. - -This provides a class ``ELFFile`` that parses an ELF executable in a similar -interface to ``ZipFile``. Only the read interface is implemented. - -Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca -ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html -""" - -from __future__ import annotations - -import enum -import os -import struct -from typing import IO - - -class ELFInvalid(ValueError): - pass - - -class EIClass(enum.IntEnum): - C32 = 1 - C64 = 2 - - -class EIData(enum.IntEnum): - Lsb = 1 - Msb = 2 - - -class EMachine(enum.IntEnum): - I386 = 3 - S390 = 22 - Arm = 40 - X8664 = 62 - AArc64 = 183 - - -class ELFFile: - """ - Representation of an ELF executable. - """ - - def __init__(self, f: IO[bytes]) -> None: - self._f = f - - try: - ident = self._read("16B") - except struct.error as e: - raise ELFInvalid("unable to parse identification") from e - magic = bytes(ident[:4]) - if magic != b"\x7fELF": - raise ELFInvalid(f"invalid magic: {magic!r}") - - self.capacity = ident[4] # Format for program header (bitness). - self.encoding = ident[5] # Data structure encoding (endianness). - - try: - # e_fmt: Format for program header. - # p_fmt: Format for section header. - # p_idx: Indexes to find p_type, p_offset, and p_filesz. - e_fmt, self._p_fmt, self._p_idx = { - (1, 1): ("HHIIIIIHHH", ">IIIIIIII", (0, 1, 4)), # 32-bit MSB. - (2, 1): ("HHIQQQIHHH", ">IIQQQQQQ", (0, 2, 5)), # 64-bit MSB. - }[(self.capacity, self.encoding)] - except KeyError as e: - raise ELFInvalid( - f"unrecognized capacity ({self.capacity}) or encoding ({self.encoding})" - ) from e - - try: - ( - _, - self.machine, # Architecture type. - _, - _, - self._e_phoff, # Offset of program header. - _, - self.flags, # Processor-specific flags. - _, - self._e_phentsize, # Size of section. - self._e_phnum, # Number of sections. - ) = self._read(e_fmt) - except struct.error as e: - raise ELFInvalid("unable to parse machine and section information") from e - - def _read(self, fmt: str) -> tuple[int, ...]: - return struct.unpack(fmt, self._f.read(struct.calcsize(fmt))) - - @property - def interpreter(self) -> str | None: - """ - The path recorded in the ``PT_INTERP`` section header. - """ - for index in range(self._e_phnum): - self._f.seek(self._e_phoff + self._e_phentsize * index) - try: - data = self._read(self._p_fmt) - except struct.error: - continue - if data[self._p_idx[0]] != 3: # Not PT_INTERP. - continue - self._f.seek(data[self._p_idx[1]]) - return os.fsdecode(self._f.read(data[self._p_idx[2]])).strip("\0") - return None diff --git a/blog-app/venv/Lib/site-packages/packaging/_manylinux.py b/blog-app/venv/Lib/site-packages/packaging/_manylinux.py deleted file mode 100644 index 95f5576..0000000 --- a/blog-app/venv/Lib/site-packages/packaging/_manylinux.py +++ /dev/null @@ -1,262 +0,0 @@ -from __future__ import annotations - -import collections -import contextlib -import functools -import os -import re -import sys -import warnings -from typing import Generator, Iterator, NamedTuple, Sequence - -from ._elffile import EIClass, EIData, ELFFile, EMachine - -EF_ARM_ABIMASK = 0xFF000000 -EF_ARM_ABI_VER5 = 0x05000000 -EF_ARM_ABI_FLOAT_HARD = 0x00000400 - - -# `os.PathLike` not a generic type until Python 3.9, so sticking with `str` -# as the type for `path` until then. -@contextlib.contextmanager -def _parse_elf(path: str) -> Generator[ELFFile | None, None, None]: - try: - with open(path, "rb") as f: - yield ELFFile(f) - except (OSError, TypeError, ValueError): - yield None - - -def _is_linux_armhf(executable: str) -> bool: - # hard-float ABI can be detected from the ELF header of the running - # process - # https://static.docs.arm.com/ihi0044/g/aaelf32.pdf - with _parse_elf(executable) as f: - return ( - f is not None - and f.capacity == EIClass.C32 - and f.encoding == EIData.Lsb - and f.machine == EMachine.Arm - and f.flags & EF_ARM_ABIMASK == EF_ARM_ABI_VER5 - and f.flags & EF_ARM_ABI_FLOAT_HARD == EF_ARM_ABI_FLOAT_HARD - ) - - -def _is_linux_i686(executable: str) -> bool: - with _parse_elf(executable) as f: - return ( - f is not None - and f.capacity == EIClass.C32 - and f.encoding == EIData.Lsb - and f.machine == EMachine.I386 - ) - - -def _have_compatible_abi(executable: str, archs: Sequence[str]) -> bool: - if "armv7l" in archs: - return _is_linux_armhf(executable) - if "i686" in archs: - return _is_linux_i686(executable) - allowed_archs = { - "x86_64", - "aarch64", - "ppc64", - "ppc64le", - "s390x", - "loongarch64", - "riscv64", - } - return any(arch in allowed_archs for arch in archs) - - -# If glibc ever changes its major version, we need to know what the last -# minor version was, so we can build the complete list of all versions. -# For now, guess what the highest minor version might be, assume it will -# be 50 for testing. Once this actually happens, update the dictionary -# with the actual value. -_LAST_GLIBC_MINOR: dict[int, int] = collections.defaultdict(lambda: 50) - - -class _GLibCVersion(NamedTuple): - major: int - minor: int - - -def _glibc_version_string_confstr() -> str | None: - """ - Primary implementation of glibc_version_string using os.confstr. - """ - # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely - # to be broken or missing. This strategy is used in the standard library - # platform module. - # https://github.com/python/cpython/blob/fcf1d003bf4f0100c/Lib/platform.py#L175-L183 - try: - # Should be a string like "glibc 2.17". - version_string: str | None = os.confstr("CS_GNU_LIBC_VERSION") - assert version_string is not None - _, version = version_string.rsplit() - except (AssertionError, AttributeError, OSError, ValueError): - # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... - return None - return version - - -def _glibc_version_string_ctypes() -> str | None: - """ - Fallback implementation of glibc_version_string using ctypes. - """ - try: - import ctypes - except ImportError: - return None - - # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen - # manpage says, "If filename is NULL, then the returned handle is for the - # main program". This way we can let the linker do the work to figure out - # which libc our process is actually using. - # - # We must also handle the special case where the executable is not a - # dynamically linked executable. This can occur when using musl libc, - # for example. In this situation, dlopen() will error, leading to an - # OSError. Interestingly, at least in the case of musl, there is no - # errno set on the OSError. The single string argument used to construct - # OSError comes from libc itself and is therefore not portable to - # hard code here. In any case, failure to call dlopen() means we - # can proceed, so we bail on our attempt. - try: - process_namespace = ctypes.CDLL(None) - except OSError: - return None - - try: - gnu_get_libc_version = process_namespace.gnu_get_libc_version - except AttributeError: - # Symbol doesn't exist -> therefore, we are not linked to - # glibc. - return None - - # Call gnu_get_libc_version, which returns a string like "2.5" - gnu_get_libc_version.restype = ctypes.c_char_p - version_str: str = gnu_get_libc_version() - # py2 / py3 compatibility: - if not isinstance(version_str, str): - version_str = version_str.decode("ascii") - - return version_str - - -def _glibc_version_string() -> str | None: - """Returns glibc version string, or None if not using glibc.""" - return _glibc_version_string_confstr() or _glibc_version_string_ctypes() - - -def _parse_glibc_version(version_str: str) -> tuple[int, int]: - """Parse glibc version. - - We use a regexp instead of str.split because we want to discard any - random junk that might come after the minor version -- this might happen - in patched/forked versions of glibc (e.g. Linaro's version of glibc - uses version strings like "2.20-2014.11"). See gh-3588. - """ - m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) - if not m: - warnings.warn( - f"Expected glibc version with 2 components major.minor, got: {version_str}", - RuntimeWarning, - stacklevel=2, - ) - return -1, -1 - return int(m.group("major")), int(m.group("minor")) - - -@functools.lru_cache -def _get_glibc_version() -> tuple[int, int]: - version_str = _glibc_version_string() - if version_str is None: - return (-1, -1) - return _parse_glibc_version(version_str) - - -# From PEP 513, PEP 600 -def _is_compatible(arch: str, version: _GLibCVersion) -> bool: - sys_glibc = _get_glibc_version() - if sys_glibc < version: - return False - # Check for presence of _manylinux module. - try: - import _manylinux - except ImportError: - return True - if hasattr(_manylinux, "manylinux_compatible"): - result = _manylinux.manylinux_compatible(version[0], version[1], arch) - if result is not None: - return bool(result) - return True - if version == _GLibCVersion(2, 5): - if hasattr(_manylinux, "manylinux1_compatible"): - return bool(_manylinux.manylinux1_compatible) - if version == _GLibCVersion(2, 12): - if hasattr(_manylinux, "manylinux2010_compatible"): - return bool(_manylinux.manylinux2010_compatible) - if version == _GLibCVersion(2, 17): - if hasattr(_manylinux, "manylinux2014_compatible"): - return bool(_manylinux.manylinux2014_compatible) - return True - - -_LEGACY_MANYLINUX_MAP = { - # CentOS 7 w/ glibc 2.17 (PEP 599) - (2, 17): "manylinux2014", - # CentOS 6 w/ glibc 2.12 (PEP 571) - (2, 12): "manylinux2010", - # CentOS 5 w/ glibc 2.5 (PEP 513) - (2, 5): "manylinux1", -} - - -def platform_tags(archs: Sequence[str]) -> Iterator[str]: - """Generate manylinux tags compatible to the current platform. - - :param archs: Sequence of compatible architectures. - The first one shall be the closest to the actual architecture and be the part of - platform tag after the ``linux_`` prefix, e.g. ``x86_64``. - The ``linux_`` prefix is assumed as a prerequisite for the current platform to - be manylinux-compatible. - - :returns: An iterator of compatible manylinux tags. - """ - if not _have_compatible_abi(sys.executable, archs): - return - # Oldest glibc to be supported regardless of architecture is (2, 17). - too_old_glibc2 = _GLibCVersion(2, 16) - if set(archs) & {"x86_64", "i686"}: - # On x86/i686 also oldest glibc to be supported is (2, 5). - too_old_glibc2 = _GLibCVersion(2, 4) - current_glibc = _GLibCVersion(*_get_glibc_version()) - glibc_max_list = [current_glibc] - # We can assume compatibility across glibc major versions. - # https://sourceware.org/bugzilla/show_bug.cgi?id=24636 - # - # Build a list of maximum glibc versions so that we can - # output the canonical list of all glibc from current_glibc - # down to too_old_glibc2, including all intermediary versions. - for glibc_major in range(current_glibc.major - 1, 1, -1): - glibc_minor = _LAST_GLIBC_MINOR[glibc_major] - glibc_max_list.append(_GLibCVersion(glibc_major, glibc_minor)) - for arch in archs: - for glibc_max in glibc_max_list: - if glibc_max.major == too_old_glibc2.major: - min_minor = too_old_glibc2.minor - else: - # For other glibc major versions oldest supported is (x, 0). - min_minor = -1 - for glibc_minor in range(glibc_max.minor, min_minor, -1): - glibc_version = _GLibCVersion(glibc_max.major, glibc_minor) - tag = "manylinux_{}_{}".format(*glibc_version) - if _is_compatible(arch, glibc_version): - yield f"{tag}_{arch}" - # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags. - if glibc_version in _LEGACY_MANYLINUX_MAP: - legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version] - if _is_compatible(arch, glibc_version): - yield f"{legacy_tag}_{arch}" diff --git a/blog-app/venv/Lib/site-packages/packaging/_musllinux.py b/blog-app/venv/Lib/site-packages/packaging/_musllinux.py deleted file mode 100644 index d2bf30b..0000000 --- a/blog-app/venv/Lib/site-packages/packaging/_musllinux.py +++ /dev/null @@ -1,85 +0,0 @@ -"""PEP 656 support. - -This module implements logic to detect if the currently running Python is -linked against musl, and what musl version is used. -""" - -from __future__ import annotations - -import functools -import re -import subprocess -import sys -from typing import Iterator, NamedTuple, Sequence - -from ._elffile import ELFFile - - -class _MuslVersion(NamedTuple): - major: int - minor: int - - -def _parse_musl_version(output: str) -> _MuslVersion | None: - lines = [n for n in (n.strip() for n in output.splitlines()) if n] - if len(lines) < 2 or lines[0][:4] != "musl": - return None - m = re.match(r"Version (\d+)\.(\d+)", lines[1]) - if not m: - return None - return _MuslVersion(major=int(m.group(1)), minor=int(m.group(2))) - - -@functools.lru_cache -def _get_musl_version(executable: str) -> _MuslVersion | None: - """Detect currently-running musl runtime version. - - This is done by checking the specified executable's dynamic linking - information, and invoking the loader to parse its output for a version - string. If the loader is musl, the output would be something like:: - - musl libc (x86_64) - Version 1.2.2 - Dynamic Program Loader - """ - try: - with open(executable, "rb") as f: - ld = ELFFile(f).interpreter - except (OSError, TypeError, ValueError): - return None - if ld is None or "musl" not in ld: - return None - proc = subprocess.run([ld], stderr=subprocess.PIPE, text=True) - return _parse_musl_version(proc.stderr) - - -def platform_tags(archs: Sequence[str]) -> Iterator[str]: - """Generate musllinux tags compatible to the current platform. - - :param archs: Sequence of compatible architectures. - The first one shall be the closest to the actual architecture and be the part of - platform tag after the ``linux_`` prefix, e.g. ``x86_64``. - The ``linux_`` prefix is assumed as a prerequisite for the current platform to - be musllinux-compatible. - - :returns: An iterator of compatible musllinux tags. - """ - sys_musl = _get_musl_version(sys.executable) - if sys_musl is None: # Python not dynamically linked against musl. - return - for arch in archs: - for minor in range(sys_musl.minor, -1, -1): - yield f"musllinux_{sys_musl.major}_{minor}_{arch}" - - -if __name__ == "__main__": # pragma: no cover - import sysconfig - - plat = sysconfig.get_platform() - assert plat.startswith("linux-"), "not linux" - - print("plat:", plat) - print("musl:", _get_musl_version(sys.executable)) - print("tags:", end=" ") - for t in platform_tags(re.sub(r"[.-]", "_", plat.split("-", 1)[-1])): - print(t, end="\n ") diff --git a/blog-app/venv/Lib/site-packages/packaging/_parser.py b/blog-app/venv/Lib/site-packages/packaging/_parser.py deleted file mode 100644 index 0007c0a..0000000 --- a/blog-app/venv/Lib/site-packages/packaging/_parser.py +++ /dev/null @@ -1,353 +0,0 @@ -"""Handwritten parser of dependency specifiers. - -The docstring for each __parse_* function contains EBNF-inspired grammar representing -the implementation. -""" - -from __future__ import annotations - -import ast -from typing import NamedTuple, Sequence, Tuple, Union - -from ._tokenizer import DEFAULT_RULES, Tokenizer - - -class Node: - def __init__(self, value: str) -> None: - self.value = value - - def __str__(self) -> str: - return self.value - - def __repr__(self) -> str: - return f"<{self.__class__.__name__}('{self}')>" - - def serialize(self) -> str: - raise NotImplementedError - - -class Variable(Node): - def serialize(self) -> str: - return str(self) - - -class Value(Node): - def serialize(self) -> str: - return f'"{self}"' - - -class Op(Node): - def serialize(self) -> str: - return str(self) - - -MarkerVar = Union[Variable, Value] -MarkerItem = Tuple[MarkerVar, Op, MarkerVar] -MarkerAtom = Union[MarkerItem, Sequence["MarkerAtom"]] -MarkerList = Sequence[Union["MarkerList", MarkerAtom, str]] - - -class ParsedRequirement(NamedTuple): - name: str - url: str - extras: list[str] - specifier: str - marker: MarkerList | None - - -# -------------------------------------------------------------------------------------- -# Recursive descent parser for dependency specifier -# -------------------------------------------------------------------------------------- -def parse_requirement(source: str) -> ParsedRequirement: - return _parse_requirement(Tokenizer(source, rules=DEFAULT_RULES)) - - -def _parse_requirement(tokenizer: Tokenizer) -> ParsedRequirement: - """ - requirement = WS? IDENTIFIER WS? extras WS? requirement_details - """ - tokenizer.consume("WS") - - name_token = tokenizer.expect( - "IDENTIFIER", expected="package name at the start of dependency specifier" - ) - name = name_token.text - tokenizer.consume("WS") - - extras = _parse_extras(tokenizer) - tokenizer.consume("WS") - - url, specifier, marker = _parse_requirement_details(tokenizer) - tokenizer.expect("END", expected="end of dependency specifier") - - return ParsedRequirement(name, url, extras, specifier, marker) - - -def _parse_requirement_details( - tokenizer: Tokenizer, -) -> tuple[str, str, MarkerList | None]: - """ - requirement_details = AT URL (WS requirement_marker?)? - | specifier WS? (requirement_marker)? - """ - - specifier = "" - url = "" - marker = None - - if tokenizer.check("AT"): - tokenizer.read() - tokenizer.consume("WS") - - url_start = tokenizer.position - url = tokenizer.expect("URL", expected="URL after @").text - if tokenizer.check("END", peek=True): - return (url, specifier, marker) - - tokenizer.expect("WS", expected="whitespace after URL") - - # The input might end after whitespace. - if tokenizer.check("END", peek=True): - return (url, specifier, marker) - - marker = _parse_requirement_marker( - tokenizer, span_start=url_start, after="URL and whitespace" - ) - else: - specifier_start = tokenizer.position - specifier = _parse_specifier(tokenizer) - tokenizer.consume("WS") - - if tokenizer.check("END", peek=True): - return (url, specifier, marker) - - marker = _parse_requirement_marker( - tokenizer, - span_start=specifier_start, - after=( - "version specifier" - if specifier - else "name and no valid version specifier" - ), - ) - - return (url, specifier, marker) - - -def _parse_requirement_marker( - tokenizer: Tokenizer, *, span_start: int, after: str -) -> MarkerList: - """ - requirement_marker = SEMICOLON marker WS? - """ - - if not tokenizer.check("SEMICOLON"): - tokenizer.raise_syntax_error( - f"Expected end or semicolon (after {after})", - span_start=span_start, - ) - tokenizer.read() - - marker = _parse_marker(tokenizer) - tokenizer.consume("WS") - - return marker - - -def _parse_extras(tokenizer: Tokenizer) -> list[str]: - """ - extras = (LEFT_BRACKET wsp* extras_list? wsp* RIGHT_BRACKET)? - """ - if not tokenizer.check("LEFT_BRACKET", peek=True): - return [] - - with tokenizer.enclosing_tokens( - "LEFT_BRACKET", - "RIGHT_BRACKET", - around="extras", - ): - tokenizer.consume("WS") - extras = _parse_extras_list(tokenizer) - tokenizer.consume("WS") - - return extras - - -def _parse_extras_list(tokenizer: Tokenizer) -> list[str]: - """ - extras_list = identifier (wsp* ',' wsp* identifier)* - """ - extras: list[str] = [] - - if not tokenizer.check("IDENTIFIER"): - return extras - - extras.append(tokenizer.read().text) - - while True: - tokenizer.consume("WS") - if tokenizer.check("IDENTIFIER", peek=True): - tokenizer.raise_syntax_error("Expected comma between extra names") - elif not tokenizer.check("COMMA"): - break - - tokenizer.read() - tokenizer.consume("WS") - - extra_token = tokenizer.expect("IDENTIFIER", expected="extra name after comma") - extras.append(extra_token.text) - - return extras - - -def _parse_specifier(tokenizer: Tokenizer) -> str: - """ - specifier = LEFT_PARENTHESIS WS? version_many WS? RIGHT_PARENTHESIS - | WS? version_many WS? - """ - with tokenizer.enclosing_tokens( - "LEFT_PARENTHESIS", - "RIGHT_PARENTHESIS", - around="version specifier", - ): - tokenizer.consume("WS") - parsed_specifiers = _parse_version_many(tokenizer) - tokenizer.consume("WS") - - return parsed_specifiers - - -def _parse_version_many(tokenizer: Tokenizer) -> str: - """ - version_many = (SPECIFIER (WS? COMMA WS? SPECIFIER)*)? - """ - parsed_specifiers = "" - while tokenizer.check("SPECIFIER"): - span_start = tokenizer.position - parsed_specifiers += tokenizer.read().text - if tokenizer.check("VERSION_PREFIX_TRAIL", peek=True): - tokenizer.raise_syntax_error( - ".* suffix can only be used with `==` or `!=` operators", - span_start=span_start, - span_end=tokenizer.position + 1, - ) - if tokenizer.check("VERSION_LOCAL_LABEL_TRAIL", peek=True): - tokenizer.raise_syntax_error( - "Local version label can only be used with `==` or `!=` operators", - span_start=span_start, - span_end=tokenizer.position, - ) - tokenizer.consume("WS") - if not tokenizer.check("COMMA"): - break - parsed_specifiers += tokenizer.read().text - tokenizer.consume("WS") - - return parsed_specifiers - - -# -------------------------------------------------------------------------------------- -# Recursive descent parser for marker expression -# -------------------------------------------------------------------------------------- -def parse_marker(source: str) -> MarkerList: - return _parse_full_marker(Tokenizer(source, rules=DEFAULT_RULES)) - - -def _parse_full_marker(tokenizer: Tokenizer) -> MarkerList: - retval = _parse_marker(tokenizer) - tokenizer.expect("END", expected="end of marker expression") - return retval - - -def _parse_marker(tokenizer: Tokenizer) -> MarkerList: - """ - marker = marker_atom (BOOLOP marker_atom)+ - """ - expression = [_parse_marker_atom(tokenizer)] - while tokenizer.check("BOOLOP"): - token = tokenizer.read() - expr_right = _parse_marker_atom(tokenizer) - expression.extend((token.text, expr_right)) - return expression - - -def _parse_marker_atom(tokenizer: Tokenizer) -> MarkerAtom: - """ - marker_atom = WS? LEFT_PARENTHESIS WS? marker WS? RIGHT_PARENTHESIS WS? - | WS? marker_item WS? - """ - - tokenizer.consume("WS") - if tokenizer.check("LEFT_PARENTHESIS", peek=True): - with tokenizer.enclosing_tokens( - "LEFT_PARENTHESIS", - "RIGHT_PARENTHESIS", - around="marker expression", - ): - tokenizer.consume("WS") - marker: MarkerAtom = _parse_marker(tokenizer) - tokenizer.consume("WS") - else: - marker = _parse_marker_item(tokenizer) - tokenizer.consume("WS") - return marker - - -def _parse_marker_item(tokenizer: Tokenizer) -> MarkerItem: - """ - marker_item = WS? marker_var WS? marker_op WS? marker_var WS? - """ - tokenizer.consume("WS") - marker_var_left = _parse_marker_var(tokenizer) - tokenizer.consume("WS") - marker_op = _parse_marker_op(tokenizer) - tokenizer.consume("WS") - marker_var_right = _parse_marker_var(tokenizer) - tokenizer.consume("WS") - return (marker_var_left, marker_op, marker_var_right) - - -def _parse_marker_var(tokenizer: Tokenizer) -> MarkerVar: - """ - marker_var = VARIABLE | QUOTED_STRING - """ - if tokenizer.check("VARIABLE"): - return process_env_var(tokenizer.read().text.replace(".", "_")) - elif tokenizer.check("QUOTED_STRING"): - return process_python_str(tokenizer.read().text) - else: - tokenizer.raise_syntax_error( - message="Expected a marker variable or quoted string" - ) - - -def process_env_var(env_var: str) -> Variable: - if env_var in ("platform_python_implementation", "python_implementation"): - return Variable("platform_python_implementation") - else: - return Variable(env_var) - - -def process_python_str(python_str: str) -> Value: - value = ast.literal_eval(python_str) - return Value(str(value)) - - -def _parse_marker_op(tokenizer: Tokenizer) -> Op: - """ - marker_op = IN | NOT IN | OP - """ - if tokenizer.check("IN"): - tokenizer.read() - return Op("in") - elif tokenizer.check("NOT"): - tokenizer.read() - tokenizer.expect("WS", expected="whitespace after 'not'") - tokenizer.expect("IN", expected="'in' after 'not'") - return Op("not in") - elif tokenizer.check("OP"): - return Op(tokenizer.read().text) - else: - return tokenizer.raise_syntax_error( - "Expected marker operator, one of <=, <, !=, ==, >=, >, ~=, ===, in, not in" - ) diff --git a/blog-app/venv/Lib/site-packages/packaging/_structures.py b/blog-app/venv/Lib/site-packages/packaging/_structures.py deleted file mode 100644 index 90a6465..0000000 --- a/blog-app/venv/Lib/site-packages/packaging/_structures.py +++ /dev/null @@ -1,61 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - - -class InfinityType: - def __repr__(self) -> str: - return "Infinity" - - def __hash__(self) -> int: - return hash(repr(self)) - - def __lt__(self, other: object) -> bool: - return False - - def __le__(self, other: object) -> bool: - return False - - def __eq__(self, other: object) -> bool: - return isinstance(other, self.__class__) - - def __gt__(self, other: object) -> bool: - return True - - def __ge__(self, other: object) -> bool: - return True - - def __neg__(self: object) -> "NegativeInfinityType": - return NegativeInfinity - - -Infinity = InfinityType() - - -class NegativeInfinityType: - def __repr__(self) -> str: - return "-Infinity" - - def __hash__(self) -> int: - return hash(repr(self)) - - def __lt__(self, other: object) -> bool: - return True - - def __le__(self, other: object) -> bool: - return True - - def __eq__(self, other: object) -> bool: - return isinstance(other, self.__class__) - - def __gt__(self, other: object) -> bool: - return False - - def __ge__(self, other: object) -> bool: - return False - - def __neg__(self: object) -> InfinityType: - return Infinity - - -NegativeInfinity = NegativeInfinityType() diff --git a/blog-app/venv/Lib/site-packages/packaging/_tokenizer.py b/blog-app/venv/Lib/site-packages/packaging/_tokenizer.py deleted file mode 100644 index d28a9b6..0000000 --- a/blog-app/venv/Lib/site-packages/packaging/_tokenizer.py +++ /dev/null @@ -1,195 +0,0 @@ -from __future__ import annotations - -import contextlib -import re -from dataclasses import dataclass -from typing import Iterator, NoReturn - -from .specifiers import Specifier - - -@dataclass -class Token: - name: str - text: str - position: int - - -class ParserSyntaxError(Exception): - """The provided source text could not be parsed correctly.""" - - def __init__( - self, - message: str, - *, - source: str, - span: tuple[int, int], - ) -> None: - self.span = span - self.message = message - self.source = source - - super().__init__() - - def __str__(self) -> str: - marker = " " * self.span[0] + "~" * (self.span[1] - self.span[0]) + "^" - return "\n ".join([self.message, self.source, marker]) - - -DEFAULT_RULES: dict[str, str | re.Pattern[str]] = { - "LEFT_PARENTHESIS": r"\(", - "RIGHT_PARENTHESIS": r"\)", - "LEFT_BRACKET": r"\[", - "RIGHT_BRACKET": r"\]", - "SEMICOLON": r";", - "COMMA": r",", - "QUOTED_STRING": re.compile( - r""" - ( - ('[^']*') - | - ("[^"]*") - ) - """, - re.VERBOSE, - ), - "OP": r"(===|==|~=|!=|<=|>=|<|>)", - "BOOLOP": r"\b(or|and)\b", - "IN": r"\bin\b", - "NOT": r"\bnot\b", - "VARIABLE": re.compile( - r""" - \b( - python_version - |python_full_version - |os[._]name - |sys[._]platform - |platform_(release|system) - |platform[._](version|machine|python_implementation) - |python_implementation - |implementation_(name|version) - |extras? - |dependency_groups - )\b - """, - re.VERBOSE, - ), - "SPECIFIER": re.compile( - Specifier._operator_regex_str + Specifier._version_regex_str, - re.VERBOSE | re.IGNORECASE, - ), - "AT": r"\@", - "URL": r"[^ \t]+", - "IDENTIFIER": r"\b[a-zA-Z0-9][a-zA-Z0-9._-]*\b", - "VERSION_PREFIX_TRAIL": r"\.\*", - "VERSION_LOCAL_LABEL_TRAIL": r"\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*", - "WS": r"[ \t]+", - "END": r"$", -} - - -class Tokenizer: - """Context-sensitive token parsing. - - Provides methods to examine the input stream to check whether the next token - matches. - """ - - def __init__( - self, - source: str, - *, - rules: dict[str, str | re.Pattern[str]], - ) -> None: - self.source = source - self.rules: dict[str, re.Pattern[str]] = { - name: re.compile(pattern) for name, pattern in rules.items() - } - self.next_token: Token | None = None - self.position = 0 - - def consume(self, name: str) -> None: - """Move beyond provided token name, if at current position.""" - if self.check(name): - self.read() - - def check(self, name: str, *, peek: bool = False) -> bool: - """Check whether the next token has the provided name. - - By default, if the check succeeds, the token *must* be read before - another check. If `peek` is set to `True`, the token is not loaded and - would need to be checked again. - """ - assert self.next_token is None, ( - f"Cannot check for {name!r}, already have {self.next_token!r}" - ) - assert name in self.rules, f"Unknown token name: {name!r}" - - expression = self.rules[name] - - match = expression.match(self.source, self.position) - if match is None: - return False - if not peek: - self.next_token = Token(name, match[0], self.position) - return True - - def expect(self, name: str, *, expected: str) -> Token: - """Expect a certain token name next, failing with a syntax error otherwise. - - The token is *not* read. - """ - if not self.check(name): - raise self.raise_syntax_error(f"Expected {expected}") - return self.read() - - def read(self) -> Token: - """Consume the next token and return it.""" - token = self.next_token - assert token is not None - - self.position += len(token.text) - self.next_token = None - - return token - - def raise_syntax_error( - self, - message: str, - *, - span_start: int | None = None, - span_end: int | None = None, - ) -> NoReturn: - """Raise ParserSyntaxError at the given position.""" - span = ( - self.position if span_start is None else span_start, - self.position if span_end is None else span_end, - ) - raise ParserSyntaxError( - message, - source=self.source, - span=span, - ) - - @contextlib.contextmanager - def enclosing_tokens( - self, open_token: str, close_token: str, *, around: str - ) -> Iterator[None]: - if self.check(open_token): - open_position = self.position - self.read() - else: - open_position = None - - yield - - if open_position is None: - return - - if not self.check(close_token): - self.raise_syntax_error( - f"Expected matching {close_token} for {open_token}, after {around}", - span_start=open_position, - ) - - self.read() diff --git a/blog-app/venv/Lib/site-packages/packaging/licenses/__init__.py b/blog-app/venv/Lib/site-packages/packaging/licenses/__init__.py deleted file mode 100644 index 6f7f9e6..0000000 --- a/blog-app/venv/Lib/site-packages/packaging/licenses/__init__.py +++ /dev/null @@ -1,145 +0,0 @@ -####################################################################################### -# -# Adapted from: -# https://github.com/pypa/hatch/blob/5352e44/backend/src/hatchling/licenses/parse.py -# -# MIT License -# -# Copyright (c) 2017-present Ofek Lev -# -# 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. -# -# -# With additional allowance of arbitrary `LicenseRef-` identifiers, not just -# `LicenseRef-Public-Domain` and `LicenseRef-Proprietary`. -# -####################################################################################### -from __future__ import annotations - -import re -from typing import NewType, cast - -from packaging.licenses._spdx import EXCEPTIONS, LICENSES - -__all__ = [ - "InvalidLicenseExpression", - "NormalizedLicenseExpression", - "canonicalize_license_expression", -] - -license_ref_allowed = re.compile("^[A-Za-z0-9.-]*$") - -NormalizedLicenseExpression = NewType("NormalizedLicenseExpression", str) - - -class InvalidLicenseExpression(ValueError): - """Raised when a license-expression string is invalid - - >>> canonicalize_license_expression("invalid") - Traceback (most recent call last): - ... - packaging.licenses.InvalidLicenseExpression: Invalid license expression: 'invalid' - """ - - -def canonicalize_license_expression( - raw_license_expression: str, -) -> NormalizedLicenseExpression: - if not raw_license_expression: - message = f"Invalid license expression: {raw_license_expression!r}" - raise InvalidLicenseExpression(message) - - # Pad any parentheses so tokenization can be achieved by merely splitting on - # whitespace. - license_expression = raw_license_expression.replace("(", " ( ").replace(")", " ) ") - licenseref_prefix = "LicenseRef-" - license_refs = { - ref.lower(): "LicenseRef-" + ref[len(licenseref_prefix) :] - for ref in license_expression.split() - if ref.lower().startswith(licenseref_prefix.lower()) - } - - # Normalize to lower case so we can look up licenses/exceptions - # and so boolean operators are Python-compatible. - license_expression = license_expression.lower() - - tokens = license_expression.split() - - # Rather than implementing boolean logic, we create an expression that Python can - # parse. Everything that is not involved with the grammar itself is treated as - # `False` and the expression should evaluate as such. - python_tokens = [] - for token in tokens: - if token not in {"or", "and", "with", "(", ")"}: - python_tokens.append("False") - elif token == "with": - python_tokens.append("or") - elif token == "(" and python_tokens and python_tokens[-1] not in {"or", "and"}: - message = f"Invalid license expression: {raw_license_expression!r}" - raise InvalidLicenseExpression(message) - else: - python_tokens.append(token) - - python_expression = " ".join(python_tokens) - try: - invalid = eval(python_expression, globals(), locals()) - except Exception: - invalid = True - - if invalid is not False: - message = f"Invalid license expression: {raw_license_expression!r}" - raise InvalidLicenseExpression(message) from None - - # Take a final pass to check for unknown licenses/exceptions. - normalized_tokens = [] - for token in tokens: - if token in {"or", "and", "with", "(", ")"}: - normalized_tokens.append(token.upper()) - continue - - if normalized_tokens and normalized_tokens[-1] == "WITH": - if token not in EXCEPTIONS: - message = f"Unknown license exception: {token!r}" - raise InvalidLicenseExpression(message) - - normalized_tokens.append(EXCEPTIONS[token]["id"]) - else: - if token.endswith("+"): - final_token = token[:-1] - suffix = "+" - else: - final_token = token - suffix = "" - - if final_token.startswith("licenseref-"): - if not license_ref_allowed.match(final_token): - message = f"Invalid licenseref: {final_token!r}" - raise InvalidLicenseExpression(message) - normalized_tokens.append(license_refs[final_token] + suffix) - else: - if final_token not in LICENSES: - message = f"Unknown license: {final_token!r}" - raise InvalidLicenseExpression(message) - normalized_tokens.append(LICENSES[final_token]["id"] + suffix) - - normalized_expression = " ".join(normalized_tokens) - - return cast( - NormalizedLicenseExpression, - normalized_expression.replace("( ", "(").replace(" )", ")"), - ) diff --git a/blog-app/venv/Lib/site-packages/packaging/licenses/__pycache__/__init__.cpython-310.pyc b/blog-app/venv/Lib/site-packages/packaging/licenses/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index fa23a6ad9ac12f65be53f47197af5e9df0735acf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2625 zcmah~&2Jk;6rY)0uh(lkalV>_6uMN1#vr>9Tp$Wjp-D@m$gP@`(#2)9@l28>>s@zt zoeyh$X^JQkH*O##n_Ewudq?7bm;)Cs^bhDI5-o4mP8>p^V|n+@+xOo5-p9NbbuCTrJg9a07%?Tr57|WkuUB0=#a-*^)^wpKC%ayg|wW1=X zR{UMZbLpyEV}8h%_ZysrA(#;}m4MgbQ;WUi4jl)MFy_`1Va|42m*#JC2>#TX<)aW-E!QJQFCvb`KDv` zPb&>hGsB3x{+8*6rrUGJFicpBi;LzffX-g*Yg{ZQD(l>-u??rTW6sutFfuuVxI|#Z z^Gr{May}80*30E`LN`F#*@E-SePm(zzk)h%_P-oEVGf*_H!t;}TuRJVimK3U+jr{B zwuNEa^?)`#N#|_)e$(;#U(&WsgPLtWMtlgOl{}8(tMk>{A>(1S;?@EHUcKS7CGPIB z>L*RkoMysbV!PG#ZC1Lu?N)CdMB9O1y#}&7)eSG$Dmjftb(i_O)m3++8oCiH^*m)^ z^~B}N$1Y#CZP#}r+b%Z_lB~T4SVDO>bfn{iBhGPW?UpK<3s!a_8m+KRk{S;Dou4sn^5gr^bOj?G)?t~dQ3W` zio0UH*3QHcG^1>+fj8sR$J$yaM<=?N{|0eDH2*c3Ms0&mw6i{(0@S&7Ha0qW zItem=Mnj$97~&TGPN!ny-_~O#Hl|UWojkT~LP4qHA}s-vi@mn=C;4%2YddhPFG_MIiTiEL0o!--xa8p z9k^L)ji1RGxIJ&SM$Q-l7MX>=SuBqA`bwI!h6in1q{4>hMjWOz5*oBG2DsI)0@oKR zgDEG{TVAjMZV0XCzQ`=^_d$tN6XZEhf}n$9k{CWIO^x+I+AxI2boCMVTd|g%o;sb9rSrCcgzEG03`}`VDeh|M$&-o-d3cNw>8q|4%9`u zKP9XY|71Y-wXE!>>pNa=C$zA+33X#loRS;Z>6O!rL@sNJXW+2_|1g4wsu)A=e+|0&=DO$0n1ni zO2=S_z`~zT b3%#MdD5q8^@#Ze*a1FtCVrT{_C_~2IBQe%| diff --git a/blog-app/venv/Lib/site-packages/packaging/licenses/__pycache__/_spdx.cpython-310.pyc b/blog-app/venv/Lib/site-packages/packaging/licenses/__pycache__/_spdx.cpython-310.pyc deleted file mode 100644 index b2314688643f5fcd6eb15cce16a8a8b2bfc66c10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40997 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 Any: - """ - Normalize extra values. - """ - if isinstance(results[0], tuple): - lhs, op, rhs = results[0] - if isinstance(lhs, Variable) and lhs.value == "extra": - normalized_extra = canonicalize_name(rhs.value) - rhs = Value(normalized_extra) - elif isinstance(rhs, Variable) and rhs.value == "extra": - normalized_extra = canonicalize_name(lhs.value) - lhs = Value(normalized_extra) - results[0] = lhs, op, rhs - return results - - -def _format_marker( - marker: list[str] | MarkerAtom | str, first: bool | None = True -) -> str: - assert isinstance(marker, (list, tuple, str)) - - # Sometimes we have a structure like [[...]] which is a single item list - # where the single item is itself it's own list. In that case we want skip - # the rest of this function so that we don't get extraneous () on the - # outside. - if ( - isinstance(marker, list) - and len(marker) == 1 - and isinstance(marker[0], (list, tuple)) - ): - return _format_marker(marker[0]) - - if isinstance(marker, list): - inner = (_format_marker(m, first=False) for m in marker) - if first: - return " ".join(inner) - else: - return "(" + " ".join(inner) + ")" - elif isinstance(marker, tuple): - return " ".join([m.serialize() for m in marker]) - else: - return marker - - -_operators: dict[str, Operator] = { - "in": lambda lhs, rhs: lhs in rhs, - "not in": lambda lhs, rhs: lhs not in rhs, - "<": operator.lt, - "<=": operator.le, - "==": operator.eq, - "!=": operator.ne, - ">=": operator.ge, - ">": operator.gt, -} - - -def _eval_op(lhs: str, op: Op, rhs: str | AbstractSet[str]) -> bool: - if isinstance(rhs, str): - try: - spec = Specifier("".join([op.serialize(), rhs])) - except InvalidSpecifier: - pass - else: - return spec.contains(lhs, prereleases=True) - - oper: Operator | None = _operators.get(op.serialize()) - if oper is None: - raise UndefinedComparison(f"Undefined {op!r} on {lhs!r} and {rhs!r}.") - - return oper(lhs, rhs) - - -def _normalize( - lhs: str, rhs: str | AbstractSet[str], key: str -) -> tuple[str, str | AbstractSet[str]]: - # PEP 685 – Comparison of extra names for optional distribution dependencies - # https://peps.python.org/pep-0685/ - # > When comparing extra names, tools MUST normalize the names being - # > compared using the semantics outlined in PEP 503 for names - if key == "extra": - assert isinstance(rhs, str), "extra value must be a string" - return (canonicalize_name(lhs), canonicalize_name(rhs)) - if key in MARKERS_ALLOWING_SET: - if isinstance(rhs, str): # pragma: no cover - return (canonicalize_name(lhs), canonicalize_name(rhs)) - else: - return (canonicalize_name(lhs), {canonicalize_name(v) for v in rhs}) - - # other environment markers don't have such standards - return lhs, rhs - - -def _evaluate_markers( - markers: MarkerList, environment: dict[str, str | AbstractSet[str]] -) -> bool: - groups: list[list[bool]] = [[]] - - for marker in markers: - assert isinstance(marker, (list, tuple, str)) - - if isinstance(marker, list): - groups[-1].append(_evaluate_markers(marker, environment)) - elif isinstance(marker, tuple): - lhs, op, rhs = marker - - if isinstance(lhs, Variable): - environment_key = lhs.value - lhs_value = environment[environment_key] - rhs_value = rhs.value - else: - lhs_value = lhs.value - environment_key = rhs.value - rhs_value = environment[environment_key] - assert isinstance(lhs_value, str), "lhs must be a string" - lhs_value, rhs_value = _normalize(lhs_value, rhs_value, key=environment_key) - groups[-1].append(_eval_op(lhs_value, op, rhs_value)) - else: - assert marker in ["and", "or"] - if marker == "or": - groups.append([]) - - return any(all(item) for item in groups) - - -def format_full_version(info: sys._version_info) -> str: - version = f"{info.major}.{info.minor}.{info.micro}" - kind = info.releaselevel - if kind != "final": - version += kind[0] + str(info.serial) - return version - - -def default_environment() -> Environment: - iver = format_full_version(sys.implementation.version) - implementation_name = sys.implementation.name - return { - "implementation_name": implementation_name, - "implementation_version": iver, - "os_name": os.name, - "platform_machine": platform.machine(), - "platform_release": platform.release(), - "platform_system": platform.system(), - "platform_version": platform.version(), - "python_full_version": platform.python_version(), - "platform_python_implementation": platform.python_implementation(), - "python_version": ".".join(platform.python_version_tuple()[:2]), - "sys_platform": sys.platform, - } - - -class Marker: - def __init__(self, marker: str) -> None: - # Note: We create a Marker object without calling this constructor in - # packaging.requirements.Requirement. If any additional logic is - # added here, make sure to mirror/adapt Requirement. - try: - self._markers = _normalize_extra_values(_parse_marker(marker)) - # The attribute `_markers` can be described in terms of a recursive type: - # MarkerList = List[Union[Tuple[Node, ...], str, MarkerList]] - # - # For example, the following expression: - # python_version > "3.6" or (python_version == "3.6" and os_name == "unix") - # - # is parsed into: - # [ - # (, ')>, ), - # 'and', - # [ - # (, , ), - # 'or', - # (, , ) - # ] - # ] - except ParserSyntaxError as e: - raise InvalidMarker(str(e)) from e - - def __str__(self) -> str: - return _format_marker(self._markers) - - def __repr__(self) -> str: - return f"" - - def __hash__(self) -> int: - return hash((self.__class__.__name__, str(self))) - - def __eq__(self, other: Any) -> bool: - if not isinstance(other, Marker): - return NotImplemented - - return str(self) == str(other) - - def evaluate( - self, - environment: dict[str, str] | None = None, - context: EvaluateContext = "metadata", - ) -> bool: - """Evaluate a marker. - - Return the boolean from evaluating the given marker against the - environment. environment is an optional argument to override all or - part of the determined environment. The *context* parameter specifies what - context the markers are being evaluated for, which influences what markers - are considered valid. Acceptable values are "metadata" (for core metadata; - default), "lock_file", and "requirement" (i.e. all other situations). - - The environment is determined from the current Python process. - """ - current_environment = cast( - "dict[str, str | AbstractSet[str]]", default_environment() - ) - if context == "lock_file": - current_environment.update( - extras=frozenset(), dependency_groups=frozenset() - ) - elif context == "metadata": - current_environment["extra"] = "" - if environment is not None: - current_environment.update(environment) - # The API used to allow setting extra to None. We need to handle this - # case for backwards compatibility. - if "extra" in current_environment and current_environment["extra"] is None: - current_environment["extra"] = "" - - return _evaluate_markers( - self._markers, _repair_python_full_version(current_environment) - ) - - -def _repair_python_full_version( - env: dict[str, str | AbstractSet[str]], -) -> dict[str, str | AbstractSet[str]]: - """ - Work around platform.python_version() returning something that is not PEP 440 - compliant for non-tagged Python builds. - """ - python_full_version = cast(str, env["python_full_version"]) - if python_full_version.endswith("+"): - env["python_full_version"] = f"{python_full_version}local" - return env diff --git a/blog-app/venv/Lib/site-packages/packaging/metadata.py b/blog-app/venv/Lib/site-packages/packaging/metadata.py deleted file mode 100644 index 3bd8602..0000000 --- a/blog-app/venv/Lib/site-packages/packaging/metadata.py +++ /dev/null @@ -1,862 +0,0 @@ -from __future__ import annotations - -import email.feedparser -import email.header -import email.message -import email.parser -import email.policy -import pathlib -import sys -import typing -from typing import ( - Any, - Callable, - Generic, - Literal, - TypedDict, - cast, -) - -from . import licenses, requirements, specifiers, utils -from . import version as version_module -from .licenses import NormalizedLicenseExpression - -T = typing.TypeVar("T") - - -if sys.version_info >= (3, 11): # pragma: no cover - ExceptionGroup = ExceptionGroup -else: # pragma: no cover - - class ExceptionGroup(Exception): - """A minimal implementation of :external:exc:`ExceptionGroup` from Python 3.11. - - If :external:exc:`ExceptionGroup` is already defined by Python itself, - that version is used instead. - """ - - message: str - exceptions: list[Exception] - - def __init__(self, message: str, exceptions: list[Exception]) -> None: - self.message = message - self.exceptions = exceptions - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({self.message!r}, {self.exceptions!r})" - - -class InvalidMetadata(ValueError): - """A metadata field contains invalid data.""" - - field: str - """The name of the field that contains invalid data.""" - - def __init__(self, field: str, message: str) -> None: - self.field = field - super().__init__(message) - - -# The RawMetadata class attempts to make as few assumptions about the underlying -# serialization formats as possible. The idea is that as long as a serialization -# formats offer some very basic primitives in *some* way then we can support -# serializing to and from that format. -class RawMetadata(TypedDict, total=False): - """A dictionary of raw core metadata. - - Each field in core metadata maps to a key of this dictionary (when data is - provided). The key is lower-case and underscores are used instead of dashes - compared to the equivalent core metadata field. Any core metadata field that - can be specified multiple times or can hold multiple values in a single - field have a key with a plural name. See :class:`Metadata` whose attributes - match the keys of this dictionary. - - Core metadata fields that can be specified multiple times are stored as a - list or dict depending on which is appropriate for the field. Any fields - which hold multiple values in a single field are stored as a list. - - """ - - # Metadata 1.0 - PEP 241 - metadata_version: str - name: str - version: str - platforms: list[str] - summary: str - description: str - keywords: list[str] - home_page: str - author: str - author_email: str - license: str - - # Metadata 1.1 - PEP 314 - supported_platforms: list[str] - download_url: str - classifiers: list[str] - requires: list[str] - provides: list[str] - obsoletes: list[str] - - # Metadata 1.2 - PEP 345 - maintainer: str - maintainer_email: str - requires_dist: list[str] - provides_dist: list[str] - obsoletes_dist: list[str] - requires_python: str - requires_external: list[str] - project_urls: dict[str, str] - - # Metadata 2.0 - # PEP 426 attempted to completely revamp the metadata format - # but got stuck without ever being able to build consensus on - # it and ultimately ended up withdrawn. - # - # However, a number of tools had started emitting METADATA with - # `2.0` Metadata-Version, so for historical reasons, this version - # was skipped. - - # Metadata 2.1 - PEP 566 - description_content_type: str - provides_extra: list[str] - - # Metadata 2.2 - PEP 643 - dynamic: list[str] - - # Metadata 2.3 - PEP 685 - # No new fields were added in PEP 685, just some edge case were - # tightened up to provide better interoptability. - - # Metadata 2.4 - PEP 639 - license_expression: str - license_files: list[str] - - -_STRING_FIELDS = { - "author", - "author_email", - "description", - "description_content_type", - "download_url", - "home_page", - "license", - "license_expression", - "maintainer", - "maintainer_email", - "metadata_version", - "name", - "requires_python", - "summary", - "version", -} - -_LIST_FIELDS = { - "classifiers", - "dynamic", - "license_files", - "obsoletes", - "obsoletes_dist", - "platforms", - "provides", - "provides_dist", - "provides_extra", - "requires", - "requires_dist", - "requires_external", - "supported_platforms", -} - -_DICT_FIELDS = { - "project_urls", -} - - -def _parse_keywords(data: str) -> list[str]: - """Split a string of comma-separated keywords into a list of keywords.""" - return [k.strip() for k in data.split(",")] - - -def _parse_project_urls(data: list[str]) -> dict[str, str]: - """Parse a list of label/URL string pairings separated by a comma.""" - urls = {} - for pair in data: - # Our logic is slightly tricky here as we want to try and do - # *something* reasonable with malformed data. - # - # The main thing that we have to worry about, is data that does - # not have a ',' at all to split the label from the Value. There - # isn't a singular right answer here, and we will fail validation - # later on (if the caller is validating) so it doesn't *really* - # matter, but since the missing value has to be an empty str - # and our return value is dict[str, str], if we let the key - # be the missing value, then they'd have multiple '' values that - # overwrite each other in a accumulating dict. - # - # The other potentional issue is that it's possible to have the - # same label multiple times in the metadata, with no solid "right" - # answer with what to do in that case. As such, we'll do the only - # thing we can, which is treat the field as unparseable and add it - # to our list of unparsed fields. - parts = [p.strip() for p in pair.split(",", 1)] - parts.extend([""] * (max(0, 2 - len(parts)))) # Ensure 2 items - - # TODO: The spec doesn't say anything about if the keys should be - # considered case sensitive or not... logically they should - # be case-preserving and case-insensitive, but doing that - # would open up more cases where we might have duplicate - # entries. - label, url = parts - if label in urls: - # The label already exists in our set of urls, so this field - # is unparseable, and we can just add the whole thing to our - # unparseable data and stop processing it. - raise KeyError("duplicate labels in project urls") - urls[label] = url - - return urls - - -def _get_payload(msg: email.message.Message, source: bytes | str) -> str: - """Get the body of the message.""" - # If our source is a str, then our caller has managed encodings for us, - # and we don't need to deal with it. - if isinstance(source, str): - payload = msg.get_payload() - assert isinstance(payload, str) - return payload - # If our source is a bytes, then we're managing the encoding and we need - # to deal with it. - else: - bpayload = msg.get_payload(decode=True) - assert isinstance(bpayload, bytes) - try: - return bpayload.decode("utf8", "strict") - except UnicodeDecodeError as exc: - raise ValueError("payload in an invalid encoding") from exc - - -# The various parse_FORMAT functions here are intended to be as lenient as -# possible in their parsing, while still returning a correctly typed -# RawMetadata. -# -# To aid in this, we also generally want to do as little touching of the -# data as possible, except where there are possibly some historic holdovers -# that make valid data awkward to work with. -# -# While this is a lower level, intermediate format than our ``Metadata`` -# class, some light touch ups can make a massive difference in usability. - -# Map METADATA fields to RawMetadata. -_EMAIL_TO_RAW_MAPPING = { - "author": "author", - "author-email": "author_email", - "classifier": "classifiers", - "description": "description", - "description-content-type": "description_content_type", - "download-url": "download_url", - "dynamic": "dynamic", - "home-page": "home_page", - "keywords": "keywords", - "license": "license", - "license-expression": "license_expression", - "license-file": "license_files", - "maintainer": "maintainer", - "maintainer-email": "maintainer_email", - "metadata-version": "metadata_version", - "name": "name", - "obsoletes": "obsoletes", - "obsoletes-dist": "obsoletes_dist", - "platform": "platforms", - "project-url": "project_urls", - "provides": "provides", - "provides-dist": "provides_dist", - "provides-extra": "provides_extra", - "requires": "requires", - "requires-dist": "requires_dist", - "requires-external": "requires_external", - "requires-python": "requires_python", - "summary": "summary", - "supported-platform": "supported_platforms", - "version": "version", -} -_RAW_TO_EMAIL_MAPPING = {raw: email for email, raw in _EMAIL_TO_RAW_MAPPING.items()} - - -def parse_email(data: bytes | str) -> tuple[RawMetadata, dict[str, list[str]]]: - """Parse a distribution's metadata stored as email headers (e.g. from ``METADATA``). - - This function returns a two-item tuple of dicts. The first dict is of - recognized fields from the core metadata specification. Fields that can be - parsed and translated into Python's built-in types are converted - appropriately. All other fields are left as-is. Fields that are allowed to - appear multiple times are stored as lists. - - The second dict contains all other fields from the metadata. This includes - any unrecognized fields. It also includes any fields which are expected to - be parsed into a built-in type but were not formatted appropriately. Finally, - any fields that are expected to appear only once but are repeated are - included in this dict. - - """ - raw: dict[str, str | list[str] | dict[str, str]] = {} - unparsed: dict[str, list[str]] = {} - - if isinstance(data, str): - parsed = email.parser.Parser(policy=email.policy.compat32).parsestr(data) - else: - parsed = email.parser.BytesParser(policy=email.policy.compat32).parsebytes(data) - - # We have to wrap parsed.keys() in a set, because in the case of multiple - # values for a key (a list), the key will appear multiple times in the - # list of keys, but we're avoiding that by using get_all(). - for name in frozenset(parsed.keys()): - # Header names in RFC are case insensitive, so we'll normalize to all - # lower case to make comparisons easier. - name = name.lower() - - # We use get_all() here, even for fields that aren't multiple use, - # because otherwise someone could have e.g. two Name fields, and we - # would just silently ignore it rather than doing something about it. - headers = parsed.get_all(name) or [] - - # The way the email module works when parsing bytes is that it - # unconditionally decodes the bytes as ascii using the surrogateescape - # handler. When you pull that data back out (such as with get_all() ), - # it looks to see if the str has any surrogate escapes, and if it does - # it wraps it in a Header object instead of returning the string. - # - # As such, we'll look for those Header objects, and fix up the encoding. - value = [] - # Flag if we have run into any issues processing the headers, thus - # signalling that the data belongs in 'unparsed'. - valid_encoding = True - for h in headers: - # It's unclear if this can return more types than just a Header or - # a str, so we'll just assert here to make sure. - assert isinstance(h, (email.header.Header, str)) - - # If it's a header object, we need to do our little dance to get - # the real data out of it. In cases where there is invalid data - # we're going to end up with mojibake, but there's no obvious, good - # way around that without reimplementing parts of the Header object - # ourselves. - # - # That should be fine since, if mojibacked happens, this key is - # going into the unparsed dict anyways. - if isinstance(h, email.header.Header): - # The Header object stores it's data as chunks, and each chunk - # can be independently encoded, so we'll need to check each - # of them. - chunks: list[tuple[bytes, str | None]] = [] - for bin, encoding in email.header.decode_header(h): - try: - bin.decode("utf8", "strict") - except UnicodeDecodeError: - # Enable mojibake. - encoding = "latin1" - valid_encoding = False - else: - encoding = "utf8" - chunks.append((bin, encoding)) - - # Turn our chunks back into a Header object, then let that - # Header object do the right thing to turn them into a - # string for us. - value.append(str(email.header.make_header(chunks))) - # This is already a string, so just add it. - else: - value.append(h) - - # We've processed all of our values to get them into a list of str, - # but we may have mojibake data, in which case this is an unparsed - # field. - if not valid_encoding: - unparsed[name] = value - continue - - raw_name = _EMAIL_TO_RAW_MAPPING.get(name) - if raw_name is None: - # This is a bit of a weird situation, we've encountered a key that - # we don't know what it means, so we don't know whether it's meant - # to be a list or not. - # - # Since we can't really tell one way or another, we'll just leave it - # as a list, even though it may be a single item list, because that's - # what makes the most sense for email headers. - unparsed[name] = value - continue - - # If this is one of our string fields, then we'll check to see if our - # value is a list of a single item. If it is then we'll assume that - # it was emitted as a single string, and unwrap the str from inside - # the list. - # - # If it's any other kind of data, then we haven't the faintest clue - # what we should parse it as, and we have to just add it to our list - # of unparsed stuff. - if raw_name in _STRING_FIELDS and len(value) == 1: - raw[raw_name] = value[0] - # If this is one of our list of string fields, then we can just assign - # the value, since email *only* has strings, and our get_all() call - # above ensures that this is a list. - elif raw_name in _LIST_FIELDS: - raw[raw_name] = value - # Special Case: Keywords - # The keywords field is implemented in the metadata spec as a str, - # but it conceptually is a list of strings, and is serialized using - # ", ".join(keywords), so we'll do some light data massaging to turn - # this into what it logically is. - elif raw_name == "keywords" and len(value) == 1: - raw[raw_name] = _parse_keywords(value[0]) - # Special Case: Project-URL - # The project urls is implemented in the metadata spec as a list of - # specially-formatted strings that represent a key and a value, which - # is fundamentally a mapping, however the email format doesn't support - # mappings in a sane way, so it was crammed into a list of strings - # instead. - # - # We will do a little light data massaging to turn this into a map as - # it logically should be. - elif raw_name == "project_urls": - try: - raw[raw_name] = _parse_project_urls(value) - except KeyError: - unparsed[name] = value - # Nothing that we've done has managed to parse this, so it'll just - # throw it in our unparseable data and move on. - else: - unparsed[name] = value - - # We need to support getting the Description from the message payload in - # addition to getting it from the the headers. This does mean, though, there - # is the possibility of it being set both ways, in which case we put both - # in 'unparsed' since we don't know which is right. - try: - payload = _get_payload(parsed, data) - except ValueError: - unparsed.setdefault("description", []).append( - parsed.get_payload(decode=isinstance(data, bytes)) # type: ignore[call-overload] - ) - else: - if payload: - # Check to see if we've already got a description, if so then both - # it, and this body move to unparseable. - if "description" in raw: - description_header = cast(str, raw.pop("description")) - unparsed.setdefault("description", []).extend( - [description_header, payload] - ) - elif "description" in unparsed: - unparsed["description"].append(payload) - else: - raw["description"] = payload - - # We need to cast our `raw` to a metadata, because a TypedDict only support - # literal key names, but we're computing our key names on purpose, but the - # way this function is implemented, our `TypedDict` can only have valid key - # names. - return cast(RawMetadata, raw), unparsed - - -_NOT_FOUND = object() - - -# Keep the two values in sync. -_VALID_METADATA_VERSIONS = ["1.0", "1.1", "1.2", "2.1", "2.2", "2.3", "2.4"] -_MetadataVersion = Literal["1.0", "1.1", "1.2", "2.1", "2.2", "2.3", "2.4"] - -_REQUIRED_ATTRS = frozenset(["metadata_version", "name", "version"]) - - -class _Validator(Generic[T]): - """Validate a metadata field. - - All _process_*() methods correspond to a core metadata field. The method is - called with the field's raw value. If the raw value is valid it is returned - in its "enriched" form (e.g. ``version.Version`` for the ``Version`` field). - If the raw value is invalid, :exc:`InvalidMetadata` is raised (with a cause - as appropriate). - """ - - name: str - raw_name: str - added: _MetadataVersion - - def __init__( - self, - *, - added: _MetadataVersion = "1.0", - ) -> None: - self.added = added - - def __set_name__(self, _owner: Metadata, name: str) -> None: - self.name = name - self.raw_name = _RAW_TO_EMAIL_MAPPING[name] - - def __get__(self, instance: Metadata, _owner: type[Metadata]) -> T: - # With Python 3.8, the caching can be replaced with functools.cached_property(). - # No need to check the cache as attribute lookup will resolve into the - # instance's __dict__ before __get__ is called. - cache = instance.__dict__ - value = instance._raw.get(self.name) - - # To make the _process_* methods easier, we'll check if the value is None - # and if this field is NOT a required attribute, and if both of those - # things are true, we'll skip the the converter. This will mean that the - # converters never have to deal with the None union. - if self.name in _REQUIRED_ATTRS or value is not None: - try: - converter: Callable[[Any], T] = getattr(self, f"_process_{self.name}") - except AttributeError: - pass - else: - value = converter(value) - - cache[self.name] = value - try: - del instance._raw[self.name] # type: ignore[misc] - except KeyError: - pass - - return cast(T, value) - - def _invalid_metadata( - self, msg: str, cause: Exception | None = None - ) -> InvalidMetadata: - exc = InvalidMetadata( - self.raw_name, msg.format_map({"field": repr(self.raw_name)}) - ) - exc.__cause__ = cause - return exc - - def _process_metadata_version(self, value: str) -> _MetadataVersion: - # Implicitly makes Metadata-Version required. - if value not in _VALID_METADATA_VERSIONS: - raise self._invalid_metadata(f"{value!r} is not a valid metadata version") - return cast(_MetadataVersion, value) - - def _process_name(self, value: str) -> str: - if not value: - raise self._invalid_metadata("{field} is a required field") - # Validate the name as a side-effect. - try: - utils.canonicalize_name(value, validate=True) - except utils.InvalidName as exc: - raise self._invalid_metadata( - f"{value!r} is invalid for {{field}}", cause=exc - ) from exc - else: - return value - - def _process_version(self, value: str) -> version_module.Version: - if not value: - raise self._invalid_metadata("{field} is a required field") - try: - return version_module.parse(value) - except version_module.InvalidVersion as exc: - raise self._invalid_metadata( - f"{value!r} is invalid for {{field}}", cause=exc - ) from exc - - def _process_summary(self, value: str) -> str: - """Check the field contains no newlines.""" - if "\n" in value: - raise self._invalid_metadata("{field} must be a single line") - return value - - def _process_description_content_type(self, value: str) -> str: - content_types = {"text/plain", "text/x-rst", "text/markdown"} - message = email.message.EmailMessage() - message["content-type"] = value - - content_type, parameters = ( - # Defaults to `text/plain` if parsing failed. - message.get_content_type().lower(), - message["content-type"].params, - ) - # Check if content-type is valid or defaulted to `text/plain` and thus was - # not parseable. - if content_type not in content_types or content_type not in value.lower(): - raise self._invalid_metadata( - f"{{field}} must be one of {list(content_types)}, not {value!r}" - ) - - charset = parameters.get("charset", "UTF-8") - if charset != "UTF-8": - raise self._invalid_metadata( - f"{{field}} can only specify the UTF-8 charset, not {list(charset)}" - ) - - markdown_variants = {"GFM", "CommonMark"} - variant = parameters.get("variant", "GFM") # Use an acceptable default. - if content_type == "text/markdown" and variant not in markdown_variants: - raise self._invalid_metadata( - f"valid Markdown variants for {{field}} are {list(markdown_variants)}, " - f"not {variant!r}", - ) - return value - - def _process_dynamic(self, value: list[str]) -> list[str]: - for dynamic_field in map(str.lower, value): - if dynamic_field in {"name", "version", "metadata-version"}: - raise self._invalid_metadata( - f"{dynamic_field!r} is not allowed as a dynamic field" - ) - elif dynamic_field not in _EMAIL_TO_RAW_MAPPING: - raise self._invalid_metadata( - f"{dynamic_field!r} is not a valid dynamic field" - ) - return list(map(str.lower, value)) - - def _process_provides_extra( - self, - value: list[str], - ) -> list[utils.NormalizedName]: - normalized_names = [] - try: - for name in value: - normalized_names.append(utils.canonicalize_name(name, validate=True)) - except utils.InvalidName as exc: - raise self._invalid_metadata( - f"{name!r} is invalid for {{field}}", cause=exc - ) from exc - else: - return normalized_names - - def _process_requires_python(self, value: str) -> specifiers.SpecifierSet: - try: - return specifiers.SpecifierSet(value) - except specifiers.InvalidSpecifier as exc: - raise self._invalid_metadata( - f"{value!r} is invalid for {{field}}", cause=exc - ) from exc - - def _process_requires_dist( - self, - value: list[str], - ) -> list[requirements.Requirement]: - reqs = [] - try: - for req in value: - reqs.append(requirements.Requirement(req)) - except requirements.InvalidRequirement as exc: - raise self._invalid_metadata( - f"{req!r} is invalid for {{field}}", cause=exc - ) from exc - else: - return reqs - - def _process_license_expression( - self, value: str - ) -> NormalizedLicenseExpression | None: - try: - return licenses.canonicalize_license_expression(value) - except ValueError as exc: - raise self._invalid_metadata( - f"{value!r} is invalid for {{field}}", cause=exc - ) from exc - - def _process_license_files(self, value: list[str]) -> list[str]: - paths = [] - for path in value: - if ".." in path: - raise self._invalid_metadata( - f"{path!r} is invalid for {{field}}, " - "parent directory indicators are not allowed" - ) - if "*" in path: - raise self._invalid_metadata( - f"{path!r} is invalid for {{field}}, paths must be resolved" - ) - if ( - pathlib.PurePosixPath(path).is_absolute() - or pathlib.PureWindowsPath(path).is_absolute() - ): - raise self._invalid_metadata( - f"{path!r} is invalid for {{field}}, paths must be relative" - ) - if pathlib.PureWindowsPath(path).as_posix() != path: - raise self._invalid_metadata( - f"{path!r} is invalid for {{field}}, paths must use '/' delimiter" - ) - paths.append(path) - return paths - - -class Metadata: - """Representation of distribution metadata. - - Compared to :class:`RawMetadata`, this class provides objects representing - metadata fields instead of only using built-in types. Any invalid metadata - will cause :exc:`InvalidMetadata` to be raised (with a - :py:attr:`~BaseException.__cause__` attribute as appropriate). - """ - - _raw: RawMetadata - - @classmethod - def from_raw(cls, data: RawMetadata, *, validate: bool = True) -> Metadata: - """Create an instance from :class:`RawMetadata`. - - If *validate* is true, all metadata will be validated. All exceptions - related to validation will be gathered and raised as an :class:`ExceptionGroup`. - """ - ins = cls() - ins._raw = data.copy() # Mutations occur due to caching enriched values. - - if validate: - exceptions: list[Exception] = [] - try: - metadata_version = ins.metadata_version - metadata_age = _VALID_METADATA_VERSIONS.index(metadata_version) - except InvalidMetadata as metadata_version_exc: - exceptions.append(metadata_version_exc) - metadata_version = None - - # Make sure to check for the fields that are present, the required - # fields (so their absence can be reported). - fields_to_check = frozenset(ins._raw) | _REQUIRED_ATTRS - # Remove fields that have already been checked. - fields_to_check -= {"metadata_version"} - - for key in fields_to_check: - try: - if metadata_version: - # Can't use getattr() as that triggers descriptor protocol which - # will fail due to no value for the instance argument. - try: - field_metadata_version = cls.__dict__[key].added - except KeyError: - exc = InvalidMetadata(key, f"unrecognized field: {key!r}") - exceptions.append(exc) - continue - field_age = _VALID_METADATA_VERSIONS.index( - field_metadata_version - ) - if field_age > metadata_age: - field = _RAW_TO_EMAIL_MAPPING[key] - exc = InvalidMetadata( - field, - f"{field} introduced in metadata version " - f"{field_metadata_version}, not {metadata_version}", - ) - exceptions.append(exc) - continue - getattr(ins, key) - except InvalidMetadata as exc: - exceptions.append(exc) - - if exceptions: - raise ExceptionGroup("invalid metadata", exceptions) - - return ins - - @classmethod - def from_email(cls, data: bytes | str, *, validate: bool = True) -> Metadata: - """Parse metadata from email headers. - - If *validate* is true, the metadata will be validated. All exceptions - related to validation will be gathered and raised as an :class:`ExceptionGroup`. - """ - raw, unparsed = parse_email(data) - - if validate: - exceptions: list[Exception] = [] - for unparsed_key in unparsed: - if unparsed_key in _EMAIL_TO_RAW_MAPPING: - message = f"{unparsed_key!r} has invalid data" - else: - message = f"unrecognized field: {unparsed_key!r}" - exceptions.append(InvalidMetadata(unparsed_key, message)) - - if exceptions: - raise ExceptionGroup("unparsed", exceptions) - - try: - return cls.from_raw(raw, validate=validate) - except ExceptionGroup as exc_group: - raise ExceptionGroup( - "invalid or unparsed metadata", exc_group.exceptions - ) from None - - metadata_version: _Validator[_MetadataVersion] = _Validator() - """:external:ref:`core-metadata-metadata-version` - (required; validated to be a valid metadata version)""" - # `name` is not normalized/typed to NormalizedName so as to provide access to - # the original/raw name. - name: _Validator[str] = _Validator() - """:external:ref:`core-metadata-name` - (required; validated using :func:`~packaging.utils.canonicalize_name` and its - *validate* parameter)""" - version: _Validator[version_module.Version] = _Validator() - """:external:ref:`core-metadata-version` (required)""" - dynamic: _Validator[list[str] | None] = _Validator( - added="2.2", - ) - """:external:ref:`core-metadata-dynamic` - (validated against core metadata field names and lowercased)""" - platforms: _Validator[list[str] | None] = _Validator() - """:external:ref:`core-metadata-platform`""" - supported_platforms: _Validator[list[str] | None] = _Validator(added="1.1") - """:external:ref:`core-metadata-supported-platform`""" - summary: _Validator[str | None] = _Validator() - """:external:ref:`core-metadata-summary` (validated to contain no newlines)""" - description: _Validator[str | None] = _Validator() # TODO 2.1: can be in body - """:external:ref:`core-metadata-description`""" - description_content_type: _Validator[str | None] = _Validator(added="2.1") - """:external:ref:`core-metadata-description-content-type` (validated)""" - keywords: _Validator[list[str] | None] = _Validator() - """:external:ref:`core-metadata-keywords`""" - home_page: _Validator[str | None] = _Validator() - """:external:ref:`core-metadata-home-page`""" - download_url: _Validator[str | None] = _Validator(added="1.1") - """:external:ref:`core-metadata-download-url`""" - author: _Validator[str | None] = _Validator() - """:external:ref:`core-metadata-author`""" - author_email: _Validator[str | None] = _Validator() - """:external:ref:`core-metadata-author-email`""" - maintainer: _Validator[str | None] = _Validator(added="1.2") - """:external:ref:`core-metadata-maintainer`""" - maintainer_email: _Validator[str | None] = _Validator(added="1.2") - """:external:ref:`core-metadata-maintainer-email`""" - license: _Validator[str | None] = _Validator() - """:external:ref:`core-metadata-license`""" - license_expression: _Validator[NormalizedLicenseExpression | None] = _Validator( - added="2.4" - ) - """:external:ref:`core-metadata-license-expression`""" - license_files: _Validator[list[str] | None] = _Validator(added="2.4") - """:external:ref:`core-metadata-license-file`""" - classifiers: _Validator[list[str] | None] = _Validator(added="1.1") - """:external:ref:`core-metadata-classifier`""" - requires_dist: _Validator[list[requirements.Requirement] | None] = _Validator( - added="1.2" - ) - """:external:ref:`core-metadata-requires-dist`""" - requires_python: _Validator[specifiers.SpecifierSet | None] = _Validator( - added="1.2" - ) - """:external:ref:`core-metadata-requires-python`""" - # Because `Requires-External` allows for non-PEP 440 version specifiers, we - # don't do any processing on the values. - requires_external: _Validator[list[str] | None] = _Validator(added="1.2") - """:external:ref:`core-metadata-requires-external`""" - project_urls: _Validator[dict[str, str] | None] = _Validator(added="1.2") - """:external:ref:`core-metadata-project-url`""" - # PEP 685 lets us raise an error if an extra doesn't pass `Name` validation - # regardless of metadata version. - provides_extra: _Validator[list[utils.NormalizedName] | None] = _Validator( - added="2.1", - ) - """:external:ref:`core-metadata-provides-extra`""" - provides_dist: _Validator[list[str] | None] = _Validator(added="1.2") - """:external:ref:`core-metadata-provides-dist`""" - obsoletes_dist: _Validator[list[str] | None] = _Validator(added="1.2") - """:external:ref:`core-metadata-obsoletes-dist`""" - requires: _Validator[list[str] | None] = _Validator(added="1.1") - """``Requires`` (deprecated)""" - provides: _Validator[list[str] | None] = _Validator(added="1.1") - """``Provides`` (deprecated)""" - obsoletes: _Validator[list[str] | None] = _Validator(added="1.1") - """``Obsoletes`` (deprecated)""" diff --git a/blog-app/venv/Lib/site-packages/packaging/py.typed b/blog-app/venv/Lib/site-packages/packaging/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/blog-app/venv/Lib/site-packages/packaging/requirements.py b/blog-app/venv/Lib/site-packages/packaging/requirements.py deleted file mode 100644 index 4e068c9..0000000 --- a/blog-app/venv/Lib/site-packages/packaging/requirements.py +++ /dev/null @@ -1,91 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import annotations - -from typing import Any, Iterator - -from ._parser import parse_requirement as _parse_requirement -from ._tokenizer import ParserSyntaxError -from .markers import Marker, _normalize_extra_values -from .specifiers import SpecifierSet -from .utils import canonicalize_name - - -class InvalidRequirement(ValueError): - """ - An invalid requirement was found, users should refer to PEP 508. - """ - - -class Requirement: - """Parse a requirement. - - Parse a given requirement string into its parts, such as name, specifier, - URL, and extras. Raises InvalidRequirement on a badly-formed requirement - string. - """ - - # TODO: Can we test whether something is contained within a requirement? - # If so how do we do that? Do we need to test against the _name_ of - # the thing as well as the version? What about the markers? - # TODO: Can we normalize the name and extra name? - - def __init__(self, requirement_string: str) -> None: - try: - parsed = _parse_requirement(requirement_string) - except ParserSyntaxError as e: - raise InvalidRequirement(str(e)) from e - - self.name: str = parsed.name - self.url: str | None = parsed.url or None - self.extras: set[str] = set(parsed.extras or []) - self.specifier: SpecifierSet = SpecifierSet(parsed.specifier) - self.marker: Marker | None = None - if parsed.marker is not None: - self.marker = Marker.__new__(Marker) - self.marker._markers = _normalize_extra_values(parsed.marker) - - def _iter_parts(self, name: str) -> Iterator[str]: - yield name - - if self.extras: - formatted_extras = ",".join(sorted(self.extras)) - yield f"[{formatted_extras}]" - - if self.specifier: - yield str(self.specifier) - - if self.url: - yield f"@ {self.url}" - if self.marker: - yield " " - - if self.marker: - yield f"; {self.marker}" - - def __str__(self) -> str: - return "".join(self._iter_parts(self.name)) - - def __repr__(self) -> str: - return f"" - - def __hash__(self) -> int: - return hash( - ( - self.__class__.__name__, - *self._iter_parts(canonicalize_name(self.name)), - ) - ) - - def __eq__(self, other: Any) -> bool: - if not isinstance(other, Requirement): - return NotImplemented - - return ( - canonicalize_name(self.name) == canonicalize_name(other.name) - and self.extras == other.extras - and self.specifier == other.specifier - and self.url == other.url - and self.marker == other.marker - ) diff --git a/blog-app/venv/Lib/site-packages/packaging/specifiers.py b/blog-app/venv/Lib/site-packages/packaging/specifiers.py deleted file mode 100644 index c844804..0000000 --- a/blog-app/venv/Lib/site-packages/packaging/specifiers.py +++ /dev/null @@ -1,1019 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -""" -.. testsetup:: - - from packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier - from packaging.version import Version -""" - -from __future__ import annotations - -import abc -import itertools -import re -from typing import Callable, Iterable, Iterator, TypeVar, Union - -from .utils import canonicalize_version -from .version import Version - -UnparsedVersion = Union[Version, str] -UnparsedVersionVar = TypeVar("UnparsedVersionVar", bound=UnparsedVersion) -CallableOperator = Callable[[Version, str], bool] - - -def _coerce_version(version: UnparsedVersion) -> Version: - if not isinstance(version, Version): - version = Version(version) - return version - - -class InvalidSpecifier(ValueError): - """ - Raised when attempting to create a :class:`Specifier` with a specifier - string that is invalid. - - >>> Specifier("lolwat") - Traceback (most recent call last): - ... - packaging.specifiers.InvalidSpecifier: Invalid specifier: 'lolwat' - """ - - -class BaseSpecifier(metaclass=abc.ABCMeta): - @abc.abstractmethod - def __str__(self) -> str: - """ - Returns the str representation of this Specifier-like object. This - should be representative of the Specifier itself. - """ - - @abc.abstractmethod - def __hash__(self) -> int: - """ - Returns a hash value for this Specifier-like object. - """ - - @abc.abstractmethod - def __eq__(self, other: object) -> bool: - """ - Returns a boolean representing whether or not the two Specifier-like - objects are equal. - - :param other: The other object to check against. - """ - - @property - @abc.abstractmethod - def prereleases(self) -> bool | None: - """Whether or not pre-releases as a whole are allowed. - - This can be set to either ``True`` or ``False`` to explicitly enable or disable - prereleases or it can be set to ``None`` (the default) to use default semantics. - """ - - @prereleases.setter - def prereleases(self, value: bool) -> None: - """Setter for :attr:`prereleases`. - - :param value: The value to set. - """ - - @abc.abstractmethod - def contains(self, item: str, prereleases: bool | None = None) -> bool: - """ - Determines if the given item is contained within this specifier. - """ - - @abc.abstractmethod - def filter( - self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None - ) -> Iterator[UnparsedVersionVar]: - """ - Takes an iterable of items and filters them so that only items which - are contained within this specifier are allowed in it. - """ - - -class Specifier(BaseSpecifier): - """This class abstracts handling of version specifiers. - - .. tip:: - - It is generally not required to instantiate this manually. You should instead - prefer to work with :class:`SpecifierSet` instead, which can parse - comma-separated version specifiers (which is what package metadata contains). - """ - - _operator_regex_str = r""" - (?P(~=|==|!=|<=|>=|<|>|===)) - """ - _version_regex_str = r""" - (?P - (?: - # The identity operators allow for an escape hatch that will - # do an exact string match of the version you wish to install. - # This will not be parsed by PEP 440 and we cannot determine - # any semantic meaning from it. This operator is discouraged - # but included entirely as an escape hatch. - (?<====) # Only match for the identity operator - \s* - [^\s;)]* # The arbitrary version can be just about anything, - # we match everything except for whitespace, a - # semi-colon for marker support, and a closing paren - # since versions can be enclosed in them. - ) - | - (?: - # The (non)equality operators allow for wild card and local - # versions to be specified so we have to define these two - # operators separately to enable that. - (?<===|!=) # Only match for equals and not equals - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - - # You cannot use a wild card and a pre-release, post-release, a dev or - # local version together so group them with a | and make them optional. - (?: - \.\* # Wild card syntax of .* - | - (?: # pre release - [-_\.]? - (alpha|beta|preview|pre|a|b|c|rc) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local - )? - ) - | - (?: - # The compatible operator requires at least two digits in the - # release segment. - (?<=~=) # Only match for the compatible operator - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) - (?: # pre release - [-_\.]? - (alpha|beta|preview|pre|a|b|c|rc) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - | - (?: - # All other operators only allow a sub set of what the - # (non)equality operators do. Specifically they do not allow - # local versions to be specified nor do they allow the prefix - # matching wild cards. - (?=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - "===": "arbitrary", - } - - def __init__(self, spec: str = "", prereleases: bool | None = None) -> None: - """Initialize a Specifier instance. - - :param spec: - The string representation of a specifier which will be parsed and - normalized before use. - :param prereleases: - This tells the specifier if it should accept prerelease versions if - applicable or not. The default of ``None`` will autodetect it from the - given specifiers. - :raises InvalidSpecifier: - If the given specifier is invalid (i.e. bad syntax). - """ - match = self._regex.search(spec) - if not match: - raise InvalidSpecifier(f"Invalid specifier: {spec!r}") - - self._spec: tuple[str, str] = ( - match.group("operator").strip(), - match.group("version").strip(), - ) - - # Store whether or not this Specifier should accept prereleases - self._prereleases = prereleases - - # https://github.com/python/mypy/pull/13475#pullrequestreview-1079784515 - @property # type: ignore[override] - def prereleases(self) -> bool: - # If there is an explicit prereleases set for this, then we'll just - # blindly use that. - if self._prereleases is not None: - return self._prereleases - - # Look at all of our specifiers and determine if they are inclusive - # operators, and if they are if they are including an explicit - # prerelease. - operator, version = self._spec - if operator in ["==", ">=", "<=", "~=", "===", ">", "<"]: - # The == specifier can include a trailing .*, if it does we - # want to remove before parsing. - if operator == "==" and version.endswith(".*"): - version = version[:-2] - - # Parse the version, and if it is a pre-release than this - # specifier allows pre-releases. - if Version(version).is_prerelease: - return True - - return False - - @prereleases.setter - def prereleases(self, value: bool) -> None: - self._prereleases = value - - @property - def operator(self) -> str: - """The operator of this specifier. - - >>> Specifier("==1.2.3").operator - '==' - """ - return self._spec[0] - - @property - def version(self) -> str: - """The version of this specifier. - - >>> Specifier("==1.2.3").version - '1.2.3' - """ - return self._spec[1] - - def __repr__(self) -> str: - """A representation of the Specifier that shows all internal state. - - >>> Specifier('>=1.0.0') - =1.0.0')> - >>> Specifier('>=1.0.0', prereleases=False) - =1.0.0', prereleases=False)> - >>> Specifier('>=1.0.0', prereleases=True) - =1.0.0', prereleases=True)> - """ - pre = ( - f", prereleases={self.prereleases!r}" - if self._prereleases is not None - else "" - ) - - return f"<{self.__class__.__name__}({str(self)!r}{pre})>" - - def __str__(self) -> str: - """A string representation of the Specifier that can be round-tripped. - - >>> str(Specifier('>=1.0.0')) - '>=1.0.0' - >>> str(Specifier('>=1.0.0', prereleases=False)) - '>=1.0.0' - """ - return "{}{}".format(*self._spec) - - @property - def _canonical_spec(self) -> tuple[str, str]: - canonical_version = canonicalize_version( - self._spec[1], - strip_trailing_zero=(self._spec[0] != "~="), - ) - return self._spec[0], canonical_version - - def __hash__(self) -> int: - return hash(self._canonical_spec) - - def __eq__(self, other: object) -> bool: - """Whether or not the two Specifier-like objects are equal. - - :param other: The other object to check against. - - The value of :attr:`prereleases` is ignored. - - >>> Specifier("==1.2.3") == Specifier("== 1.2.3.0") - True - >>> (Specifier("==1.2.3", prereleases=False) == - ... Specifier("==1.2.3", prereleases=True)) - True - >>> Specifier("==1.2.3") == "==1.2.3" - True - >>> Specifier("==1.2.3") == Specifier("==1.2.4") - False - >>> Specifier("==1.2.3") == Specifier("~=1.2.3") - False - """ - if isinstance(other, str): - try: - other = self.__class__(str(other)) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._canonical_spec == other._canonical_spec - - def _get_operator(self, op: str) -> CallableOperator: - operator_callable: CallableOperator = getattr( - self, f"_compare_{self._operators[op]}" - ) - return operator_callable - - def _compare_compatible(self, prospective: Version, spec: str) -> bool: - # Compatible releases have an equivalent combination of >= and ==. That - # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to - # implement this in terms of the other specifiers instead of - # implementing it ourselves. The only thing we need to do is construct - # the other specifiers. - - # We want everything but the last item in the version, but we want to - # ignore suffix segments. - prefix = _version_join( - list(itertools.takewhile(_is_not_suffix, _version_split(spec)))[:-1] - ) - - # Add the prefix notation to the end of our string - prefix += ".*" - - return self._get_operator(">=")(prospective, spec) and self._get_operator("==")( - prospective, prefix - ) - - def _compare_equal(self, prospective: Version, spec: str) -> bool: - # We need special logic to handle prefix matching - if spec.endswith(".*"): - # In the case of prefix matching we want to ignore local segment. - normalized_prospective = canonicalize_version( - prospective.public, strip_trailing_zero=False - ) - # Get the normalized version string ignoring the trailing .* - normalized_spec = canonicalize_version(spec[:-2], strip_trailing_zero=False) - # Split the spec out by bangs and dots, and pretend that there is - # an implicit dot in between a release segment and a pre-release segment. - split_spec = _version_split(normalized_spec) - - # Split the prospective version out by bangs and dots, and pretend - # that there is an implicit dot in between a release segment and - # a pre-release segment. - split_prospective = _version_split(normalized_prospective) - - # 0-pad the prospective version before shortening it to get the correct - # shortened version. - padded_prospective, _ = _pad_version(split_prospective, split_spec) - - # Shorten the prospective version to be the same length as the spec - # so that we can determine if the specifier is a prefix of the - # prospective version or not. - shortened_prospective = padded_prospective[: len(split_spec)] - - return shortened_prospective == split_spec - else: - # Convert our spec string into a Version - spec_version = Version(spec) - - # If the specifier does not have a local segment, then we want to - # act as if the prospective version also does not have a local - # segment. - if not spec_version.local: - prospective = Version(prospective.public) - - return prospective == spec_version - - def _compare_not_equal(self, prospective: Version, spec: str) -> bool: - return not self._compare_equal(prospective, spec) - - def _compare_less_than_equal(self, prospective: Version, spec: str) -> bool: - # NB: Local version identifiers are NOT permitted in the version - # specifier, so local version labels can be universally removed from - # the prospective version. - return Version(prospective.public) <= Version(spec) - - def _compare_greater_than_equal(self, prospective: Version, spec: str) -> bool: - # NB: Local version identifiers are NOT permitted in the version - # specifier, so local version labels can be universally removed from - # the prospective version. - return Version(prospective.public) >= Version(spec) - - def _compare_less_than(self, prospective: Version, spec_str: str) -> bool: - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec_str) - - # Check to see if the prospective version is less than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective < spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a pre-release version, that we do not accept pre-release - # versions for the version mentioned in the specifier (e.g. <3.1 should - # not match 3.1.dev0, but should match 3.0.dev0). - if not spec.is_prerelease and prospective.is_prerelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # less than the spec version *and* it's not a pre-release of the same - # version in the spec. - return True - - def _compare_greater_than(self, prospective: Version, spec_str: str) -> bool: - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec_str) - - # Check to see if the prospective version is greater than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective > spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a post-release version, that we do not accept - # post-release versions for the version mentioned in the specifier - # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). - if not spec.is_postrelease and prospective.is_postrelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # Ensure that we do not allow a local version of the version mentioned - # in the specifier, which is technically greater than, to match. - if prospective.local is not None: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # greater than the spec version *and* it's not a pre-release of the - # same version in the spec. - return True - - def _compare_arbitrary(self, prospective: Version, spec: str) -> bool: - return str(prospective).lower() == str(spec).lower() - - def __contains__(self, item: str | Version) -> bool: - """Return whether or not the item is contained in this specifier. - - :param item: The item to check for. - - This is used for the ``in`` operator and behaves the same as - :meth:`contains` with no ``prereleases`` argument passed. - - >>> "1.2.3" in Specifier(">=1.2.3") - True - >>> Version("1.2.3") in Specifier(">=1.2.3") - True - >>> "1.0.0" in Specifier(">=1.2.3") - False - >>> "1.3.0a1" in Specifier(">=1.2.3") - False - >>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True) - True - """ - return self.contains(item) - - def contains(self, item: UnparsedVersion, prereleases: bool | None = None) -> bool: - """Return whether or not the item is contained in this specifier. - - :param item: - The item to check for, which can be a version string or a - :class:`Version` instance. - :param prereleases: - Whether or not to match prereleases with this Specifier. If set to - ``None`` (the default), it uses :attr:`prereleases` to determine - whether or not prereleases are allowed. - - >>> Specifier(">=1.2.3").contains("1.2.3") - True - >>> Specifier(">=1.2.3").contains(Version("1.2.3")) - True - >>> Specifier(">=1.2.3").contains("1.0.0") - False - >>> Specifier(">=1.2.3").contains("1.3.0a1") - False - >>> Specifier(">=1.2.3", prereleases=True).contains("1.3.0a1") - True - >>> Specifier(">=1.2.3").contains("1.3.0a1", prereleases=True) - True - """ - - # Determine if prereleases are to be allowed or not. - if prereleases is None: - prereleases = self.prereleases - - # Normalize item to a Version, this allows us to have a shortcut for - # "2.0" in Specifier(">=2") - normalized_item = _coerce_version(item) - - # Determine if we should be supporting prereleases in this specifier - # or not, if we do not support prereleases than we can short circuit - # logic if this version is a prereleases. - if normalized_item.is_prerelease and not prereleases: - return False - - # Actually do the comparison to determine if this item is contained - # within this Specifier or not. - operator_callable: CallableOperator = self._get_operator(self.operator) - return operator_callable(normalized_item, self.version) - - def filter( - self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None - ) -> Iterator[UnparsedVersionVar]: - """Filter items in the given iterable, that match the specifier. - - :param iterable: - An iterable that can contain version strings and :class:`Version` instances. - The items in the iterable will be filtered according to the specifier. - :param prereleases: - Whether or not to allow prereleases in the returned iterator. If set to - ``None`` (the default), it will be intelligently decide whether to allow - prereleases or not (based on the :attr:`prereleases` attribute, and - whether the only versions matching are prereleases). - - This method is smarter than just ``filter(Specifier().contains, [...])`` - because it implements the rule from :pep:`440` that a prerelease item - SHOULD be accepted if no other versions match the given specifier. - - >>> list(Specifier(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) - ['1.3'] - >>> list(Specifier(">=1.2.3").filter(["1.2", "1.2.3", "1.3", Version("1.4")])) - ['1.2.3', '1.3', ] - >>> list(Specifier(">=1.2.3").filter(["1.2", "1.5a1"])) - ['1.5a1'] - >>> list(Specifier(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) - ['1.3', '1.5a1'] - >>> list(Specifier(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) - ['1.3', '1.5a1'] - """ - - yielded = False - found_prereleases = [] - - kw = {"prereleases": prereleases if prereleases is not None else True} - - # Attempt to iterate over all the values in the iterable and if any of - # them match, yield them. - for version in iterable: - parsed_version = _coerce_version(version) - - if self.contains(parsed_version, **kw): - # If our version is a prerelease, and we were not set to allow - # prereleases, then we'll store it for later in case nothing - # else matches this specifier. - if parsed_version.is_prerelease and not ( - prereleases or self.prereleases - ): - found_prereleases.append(version) - # Either this is not a prerelease, or we should have been - # accepting prereleases from the beginning. - else: - yielded = True - yield version - - # Now that we've iterated over everything, determine if we've yielded - # any values, and if we have not and we have any prereleases stored up - # then we will go ahead and yield the prereleases. - if not yielded and found_prereleases: - for version in found_prereleases: - yield version - - -_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") - - -def _version_split(version: str) -> list[str]: - """Split version into components. - - The split components are intended for version comparison. The logic does - not attempt to retain the original version string, so joining the - components back with :func:`_version_join` may not produce the original - version string. - """ - result: list[str] = [] - - epoch, _, rest = version.rpartition("!") - result.append(epoch or "0") - - for item in rest.split("."): - match = _prefix_regex.search(item) - if match: - result.extend(match.groups()) - else: - result.append(item) - return result - - -def _version_join(components: list[str]) -> str: - """Join split version components into a version string. - - This function assumes the input came from :func:`_version_split`, where the - first component must be the epoch (either empty or numeric), and all other - components numeric. - """ - epoch, *rest = components - return f"{epoch}!{'.'.join(rest)}" - - -def _is_not_suffix(segment: str) -> bool: - return not any( - segment.startswith(prefix) for prefix in ("dev", "a", "b", "rc", "post") - ) - - -def _pad_version(left: list[str], right: list[str]) -> tuple[list[str], list[str]]: - left_split, right_split = [], [] - - # Get the release segment of our versions - left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) - right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) - - # Get the rest of our versions - left_split.append(left[len(left_split[0]) :]) - right_split.append(right[len(right_split[0]) :]) - - # Insert our padding - left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) - right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) - - return ( - list(itertools.chain.from_iterable(left_split)), - list(itertools.chain.from_iterable(right_split)), - ) - - -class SpecifierSet(BaseSpecifier): - """This class abstracts handling of a set of version specifiers. - - It can be passed a single specifier (``>=3.0``), a comma-separated list of - specifiers (``>=3.0,!=3.1``), or no specifier at all. - """ - - def __init__( - self, - specifiers: str | Iterable[Specifier] = "", - prereleases: bool | None = None, - ) -> None: - """Initialize a SpecifierSet instance. - - :param specifiers: - The string representation of a specifier or a comma-separated list of - specifiers which will be parsed and normalized before use. - May also be an iterable of ``Specifier`` instances, which will be used - as is. - :param prereleases: - This tells the SpecifierSet if it should accept prerelease versions if - applicable or not. The default of ``None`` will autodetect it from the - given specifiers. - - :raises InvalidSpecifier: - If the given ``specifiers`` are not parseable than this exception will be - raised. - """ - - if isinstance(specifiers, str): - # Split on `,` to break each individual specifier into its own item, and - # strip each item to remove leading/trailing whitespace. - split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] - - # Make each individual specifier a Specifier and save in a frozen set - # for later. - self._specs = frozenset(map(Specifier, split_specifiers)) - else: - # Save the supplied specifiers in a frozen set. - self._specs = frozenset(specifiers) - - # Store our prereleases value so we can use it later to determine if - # we accept prereleases or not. - self._prereleases = prereleases - - @property - def prereleases(self) -> bool | None: - # If we have been given an explicit prerelease modifier, then we'll - # pass that through here. - if self._prereleases is not None: - return self._prereleases - - # If we don't have any specifiers, and we don't have a forced value, - # then we'll just return None since we don't know if this should have - # pre-releases or not. - if not self._specs: - return None - - # Otherwise we'll see if any of the given specifiers accept - # prereleases, if any of them do we'll return True, otherwise False. - return any(s.prereleases for s in self._specs) - - @prereleases.setter - def prereleases(self, value: bool) -> None: - self._prereleases = value - - def __repr__(self) -> str: - """A representation of the specifier set that shows all internal state. - - Note that the ordering of the individual specifiers within the set may not - match the input string. - - >>> SpecifierSet('>=1.0.0,!=2.0.0') - =1.0.0')> - >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=False) - =1.0.0', prereleases=False)> - >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=True) - =1.0.0', prereleases=True)> - """ - pre = ( - f", prereleases={self.prereleases!r}" - if self._prereleases is not None - else "" - ) - - return f"" - - def __str__(self) -> str: - """A string representation of the specifier set that can be round-tripped. - - Note that the ordering of the individual specifiers within the set may not - match the input string. - - >>> str(SpecifierSet(">=1.0.0,!=1.0.1")) - '!=1.0.1,>=1.0.0' - >>> str(SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False)) - '!=1.0.1,>=1.0.0' - """ - return ",".join(sorted(str(s) for s in self._specs)) - - def __hash__(self) -> int: - return hash(self._specs) - - def __and__(self, other: SpecifierSet | str) -> SpecifierSet: - """Return a SpecifierSet which is a combination of the two sets. - - :param other: The other object to combine with. - - >>> SpecifierSet(">=1.0.0,!=1.0.1") & '<=2.0.0,!=2.0.1' - =1.0.0')> - >>> SpecifierSet(">=1.0.0,!=1.0.1") & SpecifierSet('<=2.0.0,!=2.0.1') - =1.0.0')> - """ - if isinstance(other, str): - other = SpecifierSet(other) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - specifier = SpecifierSet() - specifier._specs = frozenset(self._specs | other._specs) - - if self._prereleases is None and other._prereleases is not None: - specifier._prereleases = other._prereleases - elif self._prereleases is not None and other._prereleases is None: - specifier._prereleases = self._prereleases - elif self._prereleases == other._prereleases: - specifier._prereleases = self._prereleases - else: - raise ValueError( - "Cannot combine SpecifierSets with True and False prerelease overrides." - ) - - return specifier - - def __eq__(self, other: object) -> bool: - """Whether or not the two SpecifierSet-like objects are equal. - - :param other: The other object to check against. - - The value of :attr:`prereleases` is ignored. - - >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.1") - True - >>> (SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False) == - ... SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)) - True - >>> SpecifierSet(">=1.0.0,!=1.0.1") == ">=1.0.0,!=1.0.1" - True - >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0") - False - >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.2") - False - """ - if isinstance(other, (str, Specifier)): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs == other._specs - - def __len__(self) -> int: - """Returns the number of specifiers in this specifier set.""" - return len(self._specs) - - def __iter__(self) -> Iterator[Specifier]: - """ - Returns an iterator over all the underlying :class:`Specifier` instances - in this specifier set. - - >>> sorted(SpecifierSet(">=1.0.0,!=1.0.1"), key=str) - [, =1.0.0')>] - """ - return iter(self._specs) - - def __contains__(self, item: UnparsedVersion) -> bool: - """Return whether or not the item is contained in this specifier. - - :param item: The item to check for. - - This is used for the ``in`` operator and behaves the same as - :meth:`contains` with no ``prereleases`` argument passed. - - >>> "1.2.3" in SpecifierSet(">=1.0.0,!=1.0.1") - True - >>> Version("1.2.3") in SpecifierSet(">=1.0.0,!=1.0.1") - True - >>> "1.0.1" in SpecifierSet(">=1.0.0,!=1.0.1") - False - >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1") - False - >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True) - True - """ - return self.contains(item) - - def contains( - self, - item: UnparsedVersion, - prereleases: bool | None = None, - installed: bool | None = None, - ) -> bool: - """Return whether or not the item is contained in this SpecifierSet. - - :param item: - The item to check for, which can be a version string or a - :class:`Version` instance. - :param prereleases: - Whether or not to match prereleases with this SpecifierSet. If set to - ``None`` (the default), it uses :attr:`prereleases` to determine - whether or not prereleases are allowed. - - >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.2.3") - True - >>> SpecifierSet(">=1.0.0,!=1.0.1").contains(Version("1.2.3")) - True - >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.0.1") - False - >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1") - False - >>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True).contains("1.3.0a1") - True - >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True) - True - """ - # Ensure that our item is a Version instance. - if not isinstance(item, Version): - item = Version(item) - - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # We can determine if we're going to allow pre-releases by looking to - # see if any of the underlying items supports them. If none of them do - # and this item is a pre-release then we do not allow it and we can - # short circuit that here. - # Note: This means that 1.0.dev1 would not be contained in something - # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 - if not prereleases and item.is_prerelease: - return False - - if installed and item.is_prerelease: - item = Version(item.base_version) - - # We simply dispatch to the underlying specs here to make sure that the - # given version is contained within all of them. - # Note: This use of all() here means that an empty set of specifiers - # will always return True, this is an explicit design decision. - return all(s.contains(item, prereleases=prereleases) for s in self._specs) - - def filter( - self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None - ) -> Iterator[UnparsedVersionVar]: - """Filter items in the given iterable, that match the specifiers in this set. - - :param iterable: - An iterable that can contain version strings and :class:`Version` instances. - The items in the iterable will be filtered according to the specifier. - :param prereleases: - Whether or not to allow prereleases in the returned iterator. If set to - ``None`` (the default), it will be intelligently decide whether to allow - prereleases or not (based on the :attr:`prereleases` attribute, and - whether the only versions matching are prereleases). - - This method is smarter than just ``filter(SpecifierSet(...).contains, [...])`` - because it implements the rule from :pep:`440` that a prerelease item - SHOULD be accepted if no other versions match the given specifier. - - >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) - ['1.3'] - >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", Version("1.4")])) - ['1.3', ] - >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.5a1"])) - [] - >>> list(SpecifierSet(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) - ['1.3', '1.5a1'] - >>> list(SpecifierSet(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) - ['1.3', '1.5a1'] - - An "empty" SpecifierSet will filter items based on the presence of prerelease - versions in the set. - - >>> list(SpecifierSet("").filter(["1.3", "1.5a1"])) - ['1.3'] - >>> list(SpecifierSet("").filter(["1.5a1"])) - ['1.5a1'] - >>> list(SpecifierSet("", prereleases=True).filter(["1.3", "1.5a1"])) - ['1.3', '1.5a1'] - >>> list(SpecifierSet("").filter(["1.3", "1.5a1"], prereleases=True)) - ['1.3', '1.5a1'] - """ - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # If we have any specifiers, then we want to wrap our iterable in the - # filter method for each one, this will act as a logical AND amongst - # each specifier. - if self._specs: - for spec in self._specs: - iterable = spec.filter(iterable, prereleases=bool(prereleases)) - return iter(iterable) - # If we do not have any specifiers, then we need to have a rough filter - # which will filter out any pre-releases, unless there are no final - # releases. - else: - filtered: list[UnparsedVersionVar] = [] - found_prereleases: list[UnparsedVersionVar] = [] - - for item in iterable: - parsed_version = _coerce_version(item) - - # Store any item which is a pre-release for later unless we've - # already found a final version or we are accepting prereleases - if parsed_version.is_prerelease and not prereleases: - if not filtered: - found_prereleases.append(item) - else: - filtered.append(item) - - # If we've found no items except for pre-releases, then we'll go - # ahead and use the pre-releases - if not filtered and found_prereleases and prereleases is None: - return iter(found_prereleases) - - return iter(filtered) diff --git a/blog-app/venv/Lib/site-packages/packaging/tags.py b/blog-app/venv/Lib/site-packages/packaging/tags.py deleted file mode 100644 index 8522f59..0000000 --- a/blog-app/venv/Lib/site-packages/packaging/tags.py +++ /dev/null @@ -1,656 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -from __future__ import annotations - -import logging -import platform -import re -import struct -import subprocess -import sys -import sysconfig -from importlib.machinery import EXTENSION_SUFFIXES -from typing import ( - Iterable, - Iterator, - Sequence, - Tuple, - cast, -) - -from . import _manylinux, _musllinux - -logger = logging.getLogger(__name__) - -PythonVersion = Sequence[int] -AppleVersion = Tuple[int, int] - -INTERPRETER_SHORT_NAMES: dict[str, str] = { - "python": "py", # Generic. - "cpython": "cp", - "pypy": "pp", - "ironpython": "ip", - "jython": "jy", -} - - -_32_BIT_INTERPRETER = struct.calcsize("P") == 4 - - -class Tag: - """ - A representation of the tag triple for a wheel. - - Instances are considered immutable and thus are hashable. Equality checking - is also supported. - """ - - __slots__ = ["_abi", "_hash", "_interpreter", "_platform"] - - def __init__(self, interpreter: str, abi: str, platform: str) -> None: - self._interpreter = interpreter.lower() - self._abi = abi.lower() - self._platform = platform.lower() - # The __hash__ of every single element in a Set[Tag] will be evaluated each time - # that a set calls its `.disjoint()` method, which may be called hundreds of - # times when scanning a page of links for packages with tags matching that - # Set[Tag]. Pre-computing the value here produces significant speedups for - # downstream consumers. - self._hash = hash((self._interpreter, self._abi, self._platform)) - - @property - def interpreter(self) -> str: - return self._interpreter - - @property - def abi(self) -> str: - return self._abi - - @property - def platform(self) -> str: - return self._platform - - def __eq__(self, other: object) -> bool: - if not isinstance(other, Tag): - return NotImplemented - - return ( - (self._hash == other._hash) # Short-circuit ASAP for perf reasons. - and (self._platform == other._platform) - and (self._abi == other._abi) - and (self._interpreter == other._interpreter) - ) - - def __hash__(self) -> int: - return self._hash - - def __str__(self) -> str: - return f"{self._interpreter}-{self._abi}-{self._platform}" - - def __repr__(self) -> str: - return f"<{self} @ {id(self)}>" - - -def parse_tag(tag: str) -> frozenset[Tag]: - """ - Parses the provided tag (e.g. `py3-none-any`) into a frozenset of Tag instances. - - Returning a set is required due to the possibility that the tag is a - compressed tag set. - """ - tags = set() - interpreters, abis, platforms = tag.split("-") - for interpreter in interpreters.split("."): - for abi in abis.split("."): - for platform_ in platforms.split("."): - tags.add(Tag(interpreter, abi, platform_)) - return frozenset(tags) - - -def _get_config_var(name: str, warn: bool = False) -> int | str | None: - value: int | str | None = sysconfig.get_config_var(name) - if value is None and warn: - logger.debug( - "Config variable '%s' is unset, Python ABI tag may be incorrect", name - ) - return value - - -def _normalize_string(string: str) -> str: - return string.replace(".", "_").replace("-", "_").replace(" ", "_") - - -def _is_threaded_cpython(abis: list[str]) -> bool: - """ - Determine if the ABI corresponds to a threaded (`--disable-gil`) build. - - The threaded builds are indicated by a "t" in the abiflags. - """ - if len(abis) == 0: - return False - # expect e.g., cp313 - m = re.match(r"cp\d+(.*)", abis[0]) - if not m: - return False - abiflags = m.group(1) - return "t" in abiflags - - -def _abi3_applies(python_version: PythonVersion, threading: bool) -> bool: - """ - Determine if the Python version supports abi3. - - PEP 384 was first implemented in Python 3.2. The threaded (`--disable-gil`) - builds do not support abi3. - """ - return len(python_version) > 1 and tuple(python_version) >= (3, 2) and not threading - - -def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> list[str]: - py_version = tuple(py_version) # To allow for version comparison. - abis = [] - version = _version_nodot(py_version[:2]) - threading = debug = pymalloc = ucs4 = "" - with_debug = _get_config_var("Py_DEBUG", warn) - has_refcount = hasattr(sys, "gettotalrefcount") - # Windows doesn't set Py_DEBUG, so checking for support of debug-compiled - # extension modules is the best option. - # https://github.com/pypa/pip/issues/3383#issuecomment-173267692 - has_ext = "_d.pyd" in EXTENSION_SUFFIXES - if with_debug or (with_debug is None and (has_refcount or has_ext)): - debug = "d" - if py_version >= (3, 13) and _get_config_var("Py_GIL_DISABLED", warn): - threading = "t" - if py_version < (3, 8): - with_pymalloc = _get_config_var("WITH_PYMALLOC", warn) - if with_pymalloc or with_pymalloc is None: - pymalloc = "m" - if py_version < (3, 3): - unicode_size = _get_config_var("Py_UNICODE_SIZE", warn) - if unicode_size == 4 or ( - unicode_size is None and sys.maxunicode == 0x10FFFF - ): - ucs4 = "u" - elif debug: - # Debug builds can also load "normal" extension modules. - # We can also assume no UCS-4 or pymalloc requirement. - abis.append(f"cp{version}{threading}") - abis.insert(0, f"cp{version}{threading}{debug}{pymalloc}{ucs4}") - return abis - - -def cpython_tags( - python_version: PythonVersion | None = None, - abis: Iterable[str] | None = None, - platforms: Iterable[str] | None = None, - *, - warn: bool = False, -) -> Iterator[Tag]: - """ - Yields the tags for a CPython interpreter. - - The tags consist of: - - cp-- - - cp-abi3- - - cp-none- - - cp-abi3- # Older Python versions down to 3.2. - - If python_version only specifies a major version then user-provided ABIs and - the 'none' ABItag will be used. - - If 'abi3' or 'none' are specified in 'abis' then they will be yielded at - their normal position and not at the beginning. - """ - if not python_version: - python_version = sys.version_info[:2] - - interpreter = f"cp{_version_nodot(python_version[:2])}" - - if abis is None: - if len(python_version) > 1: - abis = _cpython_abis(python_version, warn) - else: - abis = [] - abis = list(abis) - # 'abi3' and 'none' are explicitly handled later. - for explicit_abi in ("abi3", "none"): - try: - abis.remove(explicit_abi) - except ValueError: - pass - - platforms = list(platforms or platform_tags()) - for abi in abis: - for platform_ in platforms: - yield Tag(interpreter, abi, platform_) - - threading = _is_threaded_cpython(abis) - use_abi3 = _abi3_applies(python_version, threading) - if use_abi3: - yield from (Tag(interpreter, "abi3", platform_) for platform_ in platforms) - yield from (Tag(interpreter, "none", platform_) for platform_ in platforms) - - if use_abi3: - for minor_version in range(python_version[1] - 1, 1, -1): - for platform_ in platforms: - version = _version_nodot((python_version[0], minor_version)) - interpreter = f"cp{version}" - yield Tag(interpreter, "abi3", platform_) - - -def _generic_abi() -> list[str]: - """ - Return the ABI tag based on EXT_SUFFIX. - """ - # The following are examples of `EXT_SUFFIX`. - # We want to keep the parts which are related to the ABI and remove the - # parts which are related to the platform: - # - linux: '.cpython-310-x86_64-linux-gnu.so' => cp310 - # - mac: '.cpython-310-darwin.so' => cp310 - # - win: '.cp310-win_amd64.pyd' => cp310 - # - win: '.pyd' => cp37 (uses _cpython_abis()) - # - pypy: '.pypy38-pp73-x86_64-linux-gnu.so' => pypy38_pp73 - # - graalpy: '.graalpy-38-native-x86_64-darwin.dylib' - # => graalpy_38_native - - ext_suffix = _get_config_var("EXT_SUFFIX", warn=True) - if not isinstance(ext_suffix, str) or ext_suffix[0] != ".": - raise SystemError("invalid sysconfig.get_config_var('EXT_SUFFIX')") - parts = ext_suffix.split(".") - if len(parts) < 3: - # CPython3.7 and earlier uses ".pyd" on Windows. - return _cpython_abis(sys.version_info[:2]) - soabi = parts[1] - if soabi.startswith("cpython"): - # non-windows - abi = "cp" + soabi.split("-")[1] - elif soabi.startswith("cp"): - # windows - abi = soabi.split("-")[0] - elif soabi.startswith("pypy"): - abi = "-".join(soabi.split("-")[:2]) - elif soabi.startswith("graalpy"): - abi = "-".join(soabi.split("-")[:3]) - elif soabi: - # pyston, ironpython, others? - abi = soabi - else: - return [] - return [_normalize_string(abi)] - - -def generic_tags( - interpreter: str | None = None, - abis: Iterable[str] | None = None, - platforms: Iterable[str] | None = None, - *, - warn: bool = False, -) -> Iterator[Tag]: - """ - Yields the tags for a generic interpreter. - - The tags consist of: - - -- - - The "none" ABI will be added if it was not explicitly provided. - """ - if not interpreter: - interp_name = interpreter_name() - interp_version = interpreter_version(warn=warn) - interpreter = "".join([interp_name, interp_version]) - if abis is None: - abis = _generic_abi() - else: - abis = list(abis) - platforms = list(platforms or platform_tags()) - if "none" not in abis: - abis.append("none") - for abi in abis: - for platform_ in platforms: - yield Tag(interpreter, abi, platform_) - - -def _py_interpreter_range(py_version: PythonVersion) -> Iterator[str]: - """ - Yields Python versions in descending order. - - After the latest version, the major-only version will be yielded, and then - all previous versions of that major version. - """ - if len(py_version) > 1: - yield f"py{_version_nodot(py_version[:2])}" - yield f"py{py_version[0]}" - if len(py_version) > 1: - for minor in range(py_version[1] - 1, -1, -1): - yield f"py{_version_nodot((py_version[0], minor))}" - - -def compatible_tags( - python_version: PythonVersion | None = None, - interpreter: str | None = None, - platforms: Iterable[str] | None = None, -) -> Iterator[Tag]: - """ - Yields the sequence of tags that are compatible with a specific version of Python. - - The tags consist of: - - py*-none- - - -none-any # ... if `interpreter` is provided. - - py*-none-any - """ - if not python_version: - python_version = sys.version_info[:2] - platforms = list(platforms or platform_tags()) - for version in _py_interpreter_range(python_version): - for platform_ in platforms: - yield Tag(version, "none", platform_) - if interpreter: - yield Tag(interpreter, "none", "any") - for version in _py_interpreter_range(python_version): - yield Tag(version, "none", "any") - - -def _mac_arch(arch: str, is_32bit: bool = _32_BIT_INTERPRETER) -> str: - if not is_32bit: - return arch - - if arch.startswith("ppc"): - return "ppc" - - return "i386" - - -def _mac_binary_formats(version: AppleVersion, cpu_arch: str) -> list[str]: - formats = [cpu_arch] - if cpu_arch == "x86_64": - if version < (10, 4): - return [] - formats.extend(["intel", "fat64", "fat32"]) - - elif cpu_arch == "i386": - if version < (10, 4): - return [] - formats.extend(["intel", "fat32", "fat"]) - - elif cpu_arch == "ppc64": - # TODO: Need to care about 32-bit PPC for ppc64 through 10.2? - if version > (10, 5) or version < (10, 4): - return [] - formats.append("fat64") - - elif cpu_arch == "ppc": - if version > (10, 6): - return [] - formats.extend(["fat32", "fat"]) - - if cpu_arch in {"arm64", "x86_64"}: - formats.append("universal2") - - if cpu_arch in {"x86_64", "i386", "ppc64", "ppc", "intel"}: - formats.append("universal") - - return formats - - -def mac_platforms( - version: AppleVersion | None = None, arch: str | None = None -) -> Iterator[str]: - """ - Yields the platform tags for a macOS system. - - The `version` parameter is a two-item tuple specifying the macOS version to - generate platform tags for. The `arch` parameter is the CPU architecture to - generate platform tags for. Both parameters default to the appropriate value - for the current system. - """ - version_str, _, cpu_arch = platform.mac_ver() - if version is None: - version = cast("AppleVersion", tuple(map(int, version_str.split(".")[:2]))) - if version == (10, 16): - # When built against an older macOS SDK, Python will report macOS 10.16 - # instead of the real version. - version_str = subprocess.run( - [ - sys.executable, - "-sS", - "-c", - "import platform; print(platform.mac_ver()[0])", - ], - check=True, - env={"SYSTEM_VERSION_COMPAT": "0"}, - stdout=subprocess.PIPE, - text=True, - ).stdout - version = cast("AppleVersion", tuple(map(int, version_str.split(".")[:2]))) - else: - version = version - if arch is None: - arch = _mac_arch(cpu_arch) - else: - arch = arch - - if (10, 0) <= version and version < (11, 0): - # Prior to Mac OS 11, each yearly release of Mac OS bumped the - # "minor" version number. The major version was always 10. - major_version = 10 - for minor_version in range(version[1], -1, -1): - compat_version = major_version, minor_version - binary_formats = _mac_binary_formats(compat_version, arch) - for binary_format in binary_formats: - yield f"macosx_{major_version}_{minor_version}_{binary_format}" - - if version >= (11, 0): - # Starting with Mac OS 11, each yearly release bumps the major version - # number. The minor versions are now the midyear updates. - minor_version = 0 - for major_version in range(version[0], 10, -1): - compat_version = major_version, minor_version - binary_formats = _mac_binary_formats(compat_version, arch) - for binary_format in binary_formats: - yield f"macosx_{major_version}_{minor_version}_{binary_format}" - - if version >= (11, 0): - # Mac OS 11 on x86_64 is compatible with binaries from previous releases. - # Arm64 support was introduced in 11.0, so no Arm binaries from previous - # releases exist. - # - # However, the "universal2" binary format can have a - # macOS version earlier than 11.0 when the x86_64 part of the binary supports - # that version of macOS. - major_version = 10 - if arch == "x86_64": - for minor_version in range(16, 3, -1): - compat_version = major_version, minor_version - binary_formats = _mac_binary_formats(compat_version, arch) - for binary_format in binary_formats: - yield f"macosx_{major_version}_{minor_version}_{binary_format}" - else: - for minor_version in range(16, 3, -1): - compat_version = major_version, minor_version - binary_format = "universal2" - yield f"macosx_{major_version}_{minor_version}_{binary_format}" - - -def ios_platforms( - version: AppleVersion | None = None, multiarch: str | None = None -) -> Iterator[str]: - """ - Yields the platform tags for an iOS system. - - :param version: A two-item tuple specifying the iOS version to generate - platform tags for. Defaults to the current iOS version. - :param multiarch: The CPU architecture+ABI to generate platform tags for - - (the value used by `sys.implementation._multiarch` e.g., - `arm64_iphoneos` or `x84_64_iphonesimulator`). Defaults to the current - multiarch value. - """ - if version is None: - # if iOS is the current platform, ios_ver *must* be defined. However, - # it won't exist for CPython versions before 3.13, which causes a mypy - # error. - _, release, _, _ = platform.ios_ver() # type: ignore[attr-defined, unused-ignore] - version = cast("AppleVersion", tuple(map(int, release.split(".")[:2]))) - - if multiarch is None: - multiarch = sys.implementation._multiarch - multiarch = multiarch.replace("-", "_") - - ios_platform_template = "ios_{major}_{minor}_{multiarch}" - - # Consider any iOS major.minor version from the version requested, down to - # 12.0. 12.0 is the first iOS version that is known to have enough features - # to support CPython. Consider every possible minor release up to X.9. There - # highest the minor has ever gone is 8 (14.8 and 15.8) but having some extra - # candidates that won't ever match doesn't really hurt, and it saves us from - # having to keep an explicit list of known iOS versions in the code. Return - # the results descending order of version number. - - # If the requested major version is less than 12, there won't be any matches. - if version[0] < 12: - return - - # Consider the actual X.Y version that was requested. - yield ios_platform_template.format( - major=version[0], minor=version[1], multiarch=multiarch - ) - - # Consider every minor version from X.0 to the minor version prior to the - # version requested by the platform. - for minor in range(version[1] - 1, -1, -1): - yield ios_platform_template.format( - major=version[0], minor=minor, multiarch=multiarch - ) - - for major in range(version[0] - 1, 11, -1): - for minor in range(9, -1, -1): - yield ios_platform_template.format( - major=major, minor=minor, multiarch=multiarch - ) - - -def android_platforms( - api_level: int | None = None, abi: str | None = None -) -> Iterator[str]: - """ - Yields the :attr:`~Tag.platform` tags for Android. If this function is invoked on - non-Android platforms, the ``api_level`` and ``abi`` arguments are required. - - :param int api_level: The maximum `API level - `__ to return. Defaults - to the current system's version, as returned by ``platform.android_ver``. - :param str abi: The `Android ABI `__, - e.g. ``arm64_v8a``. Defaults to the current system's ABI , as returned by - ``sysconfig.get_platform``. Hyphens and periods will be replaced with - underscores. - """ - if platform.system() != "Android" and (api_level is None or abi is None): - raise TypeError( - "on non-Android platforms, the api_level and abi arguments are required" - ) - - if api_level is None: - # Python 3.13 was the first version to return platform.system() == "Android", - # and also the first version to define platform.android_ver(). - api_level = platform.android_ver().api_level # type: ignore[attr-defined] - - if abi is None: - abi = sysconfig.get_platform().split("-")[-1] - abi = _normalize_string(abi) - - # 16 is the minimum API level known to have enough features to support CPython - # without major patching. Yield every API level from the maximum down to the - # minimum, inclusive. - min_api_level = 16 - for ver in range(api_level, min_api_level - 1, -1): - yield f"android_{ver}_{abi}" - - -def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]: - linux = _normalize_string(sysconfig.get_platform()) - if not linux.startswith("linux_"): - # we should never be here, just yield the sysconfig one and return - yield linux - return - if is_32bit: - if linux == "linux_x86_64": - linux = "linux_i686" - elif linux == "linux_aarch64": - linux = "linux_armv8l" - _, arch = linux.split("_", 1) - archs = {"armv8l": ["armv8l", "armv7l"]}.get(arch, [arch]) - yield from _manylinux.platform_tags(archs) - yield from _musllinux.platform_tags(archs) - for arch in archs: - yield f"linux_{arch}" - - -def _generic_platforms() -> Iterator[str]: - yield _normalize_string(sysconfig.get_platform()) - - -def platform_tags() -> Iterator[str]: - """ - Provides the platform tags for this installation. - """ - if platform.system() == "Darwin": - return mac_platforms() - elif platform.system() == "iOS": - return ios_platforms() - elif platform.system() == "Android": - return android_platforms() - elif platform.system() == "Linux": - return _linux_platforms() - else: - return _generic_platforms() - - -def interpreter_name() -> str: - """ - Returns the name of the running interpreter. - - Some implementations have a reserved, two-letter abbreviation which will - be returned when appropriate. - """ - name = sys.implementation.name - return INTERPRETER_SHORT_NAMES.get(name) or name - - -def interpreter_version(*, warn: bool = False) -> str: - """ - Returns the version of the running interpreter. - """ - version = _get_config_var("py_version_nodot", warn=warn) - if version: - version = str(version) - else: - version = _version_nodot(sys.version_info[:2]) - return version - - -def _version_nodot(version: PythonVersion) -> str: - return "".join(map(str, version)) - - -def sys_tags(*, warn: bool = False) -> Iterator[Tag]: - """ - Returns the sequence of tag triples for the running interpreter. - - The order of the sequence corresponds to priority order for the - interpreter, from most to least important. - """ - - interp_name = interpreter_name() - if interp_name == "cp": - yield from cpython_tags(warn=warn) - else: - yield from generic_tags() - - if interp_name == "pp": - interp = "pp3" - elif interp_name == "cp": - interp = "cp" + interpreter_version(warn=warn) - else: - interp = None - yield from compatible_tags(interpreter=interp) diff --git a/blog-app/venv/Lib/site-packages/packaging/utils.py b/blog-app/venv/Lib/site-packages/packaging/utils.py deleted file mode 100644 index 2345095..0000000 --- a/blog-app/venv/Lib/site-packages/packaging/utils.py +++ /dev/null @@ -1,163 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -from __future__ import annotations - -import functools -import re -from typing import NewType, Tuple, Union, cast - -from .tags import Tag, parse_tag -from .version import InvalidVersion, Version, _TrimmedRelease - -BuildTag = Union[Tuple[()], Tuple[int, str]] -NormalizedName = NewType("NormalizedName", str) - - -class InvalidName(ValueError): - """ - An invalid distribution name; users should refer to the packaging user guide. - """ - - -class InvalidWheelFilename(ValueError): - """ - An invalid wheel filename was found, users should refer to PEP 427. - """ - - -class InvalidSdistFilename(ValueError): - """ - An invalid sdist filename was found, users should refer to the packaging user guide. - """ - - -# Core metadata spec for `Name` -_validate_regex = re.compile( - r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE -) -_canonicalize_regex = re.compile(r"[-_.]+") -_normalized_regex = re.compile(r"^([a-z0-9]|[a-z0-9]([a-z0-9-](?!--))*[a-z0-9])$") -# PEP 427: The build number must start with a digit. -_build_tag_regex = re.compile(r"(\d+)(.*)") - - -def canonicalize_name(name: str, *, validate: bool = False) -> NormalizedName: - if validate and not _validate_regex.match(name): - raise InvalidName(f"name is invalid: {name!r}") - # This is taken from PEP 503. - value = _canonicalize_regex.sub("-", name).lower() - return cast(NormalizedName, value) - - -def is_normalized_name(name: str) -> bool: - return _normalized_regex.match(name) is not None - - -@functools.singledispatch -def canonicalize_version( - version: Version | str, *, strip_trailing_zero: bool = True -) -> str: - """ - Return a canonical form of a version as a string. - - >>> canonicalize_version('1.0.1') - '1.0.1' - - Per PEP 625, versions may have multiple canonical forms, differing - only by trailing zeros. - - >>> canonicalize_version('1.0.0') - '1' - >>> canonicalize_version('1.0.0', strip_trailing_zero=False) - '1.0.0' - - Invalid versions are returned unaltered. - - >>> canonicalize_version('foo bar baz') - 'foo bar baz' - """ - return str(_TrimmedRelease(str(version)) if strip_trailing_zero else version) - - -@canonicalize_version.register -def _(version: str, *, strip_trailing_zero: bool = True) -> str: - try: - parsed = Version(version) - except InvalidVersion: - # Legacy versions cannot be normalized - return version - return canonicalize_version(parsed, strip_trailing_zero=strip_trailing_zero) - - -def parse_wheel_filename( - filename: str, -) -> tuple[NormalizedName, Version, BuildTag, frozenset[Tag]]: - if not filename.endswith(".whl"): - raise InvalidWheelFilename( - f"Invalid wheel filename (extension must be '.whl'): {filename!r}" - ) - - filename = filename[:-4] - dashes = filename.count("-") - if dashes not in (4, 5): - raise InvalidWheelFilename( - f"Invalid wheel filename (wrong number of parts): {filename!r}" - ) - - parts = filename.split("-", dashes - 2) - name_part = parts[0] - # See PEP 427 for the rules on escaping the project name. - if "__" in name_part or re.match(r"^[\w\d._]*$", name_part, re.UNICODE) is None: - raise InvalidWheelFilename(f"Invalid project name: {filename!r}") - name = canonicalize_name(name_part) - - try: - version = Version(parts[1]) - except InvalidVersion as e: - raise InvalidWheelFilename( - f"Invalid wheel filename (invalid version): {filename!r}" - ) from e - - if dashes == 5: - build_part = parts[2] - build_match = _build_tag_regex.match(build_part) - if build_match is None: - raise InvalidWheelFilename( - f"Invalid build number: {build_part} in {filename!r}" - ) - build = cast(BuildTag, (int(build_match.group(1)), build_match.group(2))) - else: - build = () - tags = parse_tag(parts[-1]) - return (name, version, build, tags) - - -def parse_sdist_filename(filename: str) -> tuple[NormalizedName, Version]: - if filename.endswith(".tar.gz"): - file_stem = filename[: -len(".tar.gz")] - elif filename.endswith(".zip"): - file_stem = filename[: -len(".zip")] - else: - raise InvalidSdistFilename( - f"Invalid sdist filename (extension must be '.tar.gz' or '.zip'):" - f" {filename!r}" - ) - - # We are requiring a PEP 440 version, which cannot contain dashes, - # so we split on the last dash. - name_part, sep, version_part = file_stem.rpartition("-") - if not sep: - raise InvalidSdistFilename(f"Invalid sdist filename: {filename!r}") - - name = canonicalize_name(name_part) - - try: - version = Version(version_part) - except InvalidVersion as e: - raise InvalidSdistFilename( - f"Invalid sdist filename (invalid version): {filename!r}" - ) from e - - return (name, version) diff --git a/blog-app/venv/Lib/site-packages/packaging/version.py b/blog-app/venv/Lib/site-packages/packaging/version.py deleted file mode 100644 index c9bbda2..0000000 --- a/blog-app/venv/Lib/site-packages/packaging/version.py +++ /dev/null @@ -1,582 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -""" -.. testsetup:: - - from packaging.version import parse, Version -""" - -from __future__ import annotations - -import itertools -import re -from typing import Any, Callable, NamedTuple, SupportsInt, Tuple, Union - -from ._structures import Infinity, InfinityType, NegativeInfinity, NegativeInfinityType - -__all__ = ["VERSION_PATTERN", "InvalidVersion", "Version", "parse"] - -LocalType = Tuple[Union[int, str], ...] - -CmpPrePostDevType = Union[InfinityType, NegativeInfinityType, Tuple[str, int]] -CmpLocalType = Union[ - NegativeInfinityType, - Tuple[Union[Tuple[int, str], Tuple[NegativeInfinityType, Union[int, str]]], ...], -] -CmpKey = Tuple[ - int, - Tuple[int, ...], - CmpPrePostDevType, - CmpPrePostDevType, - CmpPrePostDevType, - CmpLocalType, -] -VersionComparisonMethod = Callable[[CmpKey, CmpKey], bool] - - -class _Version(NamedTuple): - epoch: int - release: tuple[int, ...] - dev: tuple[str, int] | None - pre: tuple[str, int] | None - post: tuple[str, int] | None - local: LocalType | None - - -def parse(version: str) -> Version: - """Parse the given version string. - - >>> parse('1.0.dev1') - - - :param version: The version string to parse. - :raises InvalidVersion: When the version string is not a valid version. - """ - return Version(version) - - -class InvalidVersion(ValueError): - """Raised when a version string is not a valid version. - - >>> Version("invalid") - Traceback (most recent call last): - ... - packaging.version.InvalidVersion: Invalid version: 'invalid' - """ - - -class _BaseVersion: - _key: tuple[Any, ...] - - def __hash__(self) -> int: - return hash(self._key) - - # Please keep the duplicated `isinstance` check - # in the six comparisons hereunder - # unless you find a way to avoid adding overhead function calls. - def __lt__(self, other: _BaseVersion) -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key < other._key - - def __le__(self, other: _BaseVersion) -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key <= other._key - - def __eq__(self, other: object) -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key == other._key - - def __ge__(self, other: _BaseVersion) -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key >= other._key - - def __gt__(self, other: _BaseVersion) -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key > other._key - - def __ne__(self, other: object) -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key != other._key - - -# Deliberately not anchored to the start and end of the string, to make it -# easier for 3rd party code to reuse -_VERSION_PATTERN = r""" - v? - (?: - (?:(?P[0-9]+)!)? # epoch - (?P[0-9]+(?:\.[0-9]+)*) # release segment - (?P

                                          # pre-release
-            [-_\.]?
-            (?Palpha|a|beta|b|preview|pre|c|rc)
-            [-_\.]?
-            (?P[0-9]+)?
-        )?
-        (?P                                         # post release
-            (?:-(?P[0-9]+))
-            |
-            (?:
-                [-_\.]?
-                (?Ppost|rev|r)
-                [-_\.]?
-                (?P[0-9]+)?
-            )
-        )?
-        (?P                                          # dev release
-            [-_\.]?
-            (?Pdev)
-            [-_\.]?
-            (?P[0-9]+)?
-        )?
-    )
-    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
-"""
-
-VERSION_PATTERN = _VERSION_PATTERN
-"""
-A string containing the regular expression used to match a valid version.
-
-The pattern is not anchored at either end, and is intended for embedding in larger
-expressions (for example, matching a version number as part of a file name). The
-regular expression should be compiled with the ``re.VERBOSE`` and ``re.IGNORECASE``
-flags set.
-
-:meta hide-value:
-"""
-
-
-class Version(_BaseVersion):
-    """This class abstracts handling of a project's versions.
-
-    A :class:`Version` instance is comparison aware and can be compared and
-    sorted using the standard Python interfaces.
-
-    >>> v1 = Version("1.0a5")
-    >>> v2 = Version("1.0")
-    >>> v1
-    
-    >>> v2
-    
-    >>> v1 < v2
-    True
-    >>> v1 == v2
-    False
-    >>> v1 > v2
-    False
-    >>> v1 >= v2
-    False
-    >>> v1 <= v2
-    True
-    """
-
-    _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
-    _key: CmpKey
-
-    def __init__(self, version: str) -> None:
-        """Initialize a Version object.
-
-        :param version:
-            The string representation of a version which will be parsed and normalized
-            before use.
-        :raises InvalidVersion:
-            If the ``version`` does not conform to PEP 440 in any way then this
-            exception will be raised.
-        """
-
-        # Validate the version and parse it into pieces
-        match = self._regex.search(version)
-        if not match:
-            raise InvalidVersion(f"Invalid version: {version!r}")
-
-        # Store the parsed out pieces of the version
-        self._version = _Version(
-            epoch=int(match.group("epoch")) if match.group("epoch") else 0,
-            release=tuple(int(i) for i in match.group("release").split(".")),
-            pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")),
-            post=_parse_letter_version(
-                match.group("post_l"), match.group("post_n1") or match.group("post_n2")
-            ),
-            dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")),
-            local=_parse_local_version(match.group("local")),
-        )
-
-        # Generate a key which will be used for sorting
-        self._key = _cmpkey(
-            self._version.epoch,
-            self._version.release,
-            self._version.pre,
-            self._version.post,
-            self._version.dev,
-            self._version.local,
-        )
-
-    def __repr__(self) -> str:
-        """A representation of the Version that shows all internal state.
-
-        >>> Version('1.0.0')
-        
-        """
-        return f""
-
-    def __str__(self) -> str:
-        """A string representation of the version that can be round-tripped.
-
-        >>> str(Version("1.0a5"))
-        '1.0a5'
-        """
-        parts = []
-
-        # Epoch
-        if self.epoch != 0:
-            parts.append(f"{self.epoch}!")
-
-        # Release segment
-        parts.append(".".join(str(x) for x in self.release))
-
-        # Pre-release
-        if self.pre is not None:
-            parts.append("".join(str(x) for x in self.pre))
-
-        # Post-release
-        if self.post is not None:
-            parts.append(f".post{self.post}")
-
-        # Development release
-        if self.dev is not None:
-            parts.append(f".dev{self.dev}")
-
-        # Local version segment
-        if self.local is not None:
-            parts.append(f"+{self.local}")
-
-        return "".join(parts)
-
-    @property
-    def epoch(self) -> int:
-        """The epoch of the version.
-
-        >>> Version("2.0.0").epoch
-        0
-        >>> Version("1!2.0.0").epoch
-        1
-        """
-        return self._version.epoch
-
-    @property
-    def release(self) -> tuple[int, ...]:
-        """The components of the "release" segment of the version.
-
-        >>> Version("1.2.3").release
-        (1, 2, 3)
-        >>> Version("2.0.0").release
-        (2, 0, 0)
-        >>> Version("1!2.0.0.post0").release
-        (2, 0, 0)
-
-        Includes trailing zeroes but not the epoch or any pre-release / development /
-        post-release suffixes.
-        """
-        return self._version.release
-
-    @property
-    def pre(self) -> tuple[str, int] | None:
-        """The pre-release segment of the version.
-
-        >>> print(Version("1.2.3").pre)
-        None
-        >>> Version("1.2.3a1").pre
-        ('a', 1)
-        >>> Version("1.2.3b1").pre
-        ('b', 1)
-        >>> Version("1.2.3rc1").pre
-        ('rc', 1)
-        """
-        return self._version.pre
-
-    @property
-    def post(self) -> int | None:
-        """The post-release number of the version.
-
-        >>> print(Version("1.2.3").post)
-        None
-        >>> Version("1.2.3.post1").post
-        1
-        """
-        return self._version.post[1] if self._version.post else None
-
-    @property
-    def dev(self) -> int | None:
-        """The development number of the version.
-
-        >>> print(Version("1.2.3").dev)
-        None
-        >>> Version("1.2.3.dev1").dev
-        1
-        """
-        return self._version.dev[1] if self._version.dev else None
-
-    @property
-    def local(self) -> str | None:
-        """The local version segment of the version.
-
-        >>> print(Version("1.2.3").local)
-        None
-        >>> Version("1.2.3+abc").local
-        'abc'
-        """
-        if self._version.local:
-            return ".".join(str(x) for x in self._version.local)
-        else:
-            return None
-
-    @property
-    def public(self) -> str:
-        """The public portion of the version.
-
-        >>> Version("1.2.3").public
-        '1.2.3'
-        >>> Version("1.2.3+abc").public
-        '1.2.3'
-        >>> Version("1!1.2.3dev1+abc").public
-        '1!1.2.3.dev1'
-        """
-        return str(self).split("+", 1)[0]
-
-    @property
-    def base_version(self) -> str:
-        """The "base version" of the version.
-
-        >>> Version("1.2.3").base_version
-        '1.2.3'
-        >>> Version("1.2.3+abc").base_version
-        '1.2.3'
-        >>> Version("1!1.2.3dev1+abc").base_version
-        '1!1.2.3'
-
-        The "base version" is the public version of the project without any pre or post
-        release markers.
-        """
-        parts = []
-
-        # Epoch
-        if self.epoch != 0:
-            parts.append(f"{self.epoch}!")
-
-        # Release segment
-        parts.append(".".join(str(x) for x in self.release))
-
-        return "".join(parts)
-
-    @property
-    def is_prerelease(self) -> bool:
-        """Whether this version is a pre-release.
-
-        >>> Version("1.2.3").is_prerelease
-        False
-        >>> Version("1.2.3a1").is_prerelease
-        True
-        >>> Version("1.2.3b1").is_prerelease
-        True
-        >>> Version("1.2.3rc1").is_prerelease
-        True
-        >>> Version("1.2.3dev1").is_prerelease
-        True
-        """
-        return self.dev is not None or self.pre is not None
-
-    @property
-    def is_postrelease(self) -> bool:
-        """Whether this version is a post-release.
-
-        >>> Version("1.2.3").is_postrelease
-        False
-        >>> Version("1.2.3.post1").is_postrelease
-        True
-        """
-        return self.post is not None
-
-    @property
-    def is_devrelease(self) -> bool:
-        """Whether this version is a development release.
-
-        >>> Version("1.2.3").is_devrelease
-        False
-        >>> Version("1.2.3.dev1").is_devrelease
-        True
-        """
-        return self.dev is not None
-
-    @property
-    def major(self) -> int:
-        """The first item of :attr:`release` or ``0`` if unavailable.
-
-        >>> Version("1.2.3").major
-        1
-        """
-        return self.release[0] if len(self.release) >= 1 else 0
-
-    @property
-    def minor(self) -> int:
-        """The second item of :attr:`release` or ``0`` if unavailable.
-
-        >>> Version("1.2.3").minor
-        2
-        >>> Version("1").minor
-        0
-        """
-        return self.release[1] if len(self.release) >= 2 else 0
-
-    @property
-    def micro(self) -> int:
-        """The third item of :attr:`release` or ``0`` if unavailable.
-
-        >>> Version("1.2.3").micro
-        3
-        >>> Version("1").micro
-        0
-        """
-        return self.release[2] if len(self.release) >= 3 else 0
-
-
-class _TrimmedRelease(Version):
-    @property
-    def release(self) -> tuple[int, ...]:
-        """
-        Release segment without any trailing zeros.
-
-        >>> _TrimmedRelease('1.0.0').release
-        (1,)
-        >>> _TrimmedRelease('0.0').release
-        (0,)
-        """
-        rel = super().release
-        nonzeros = (index for index, val in enumerate(rel) if val)
-        last_nonzero = max(nonzeros, default=0)
-        return rel[: last_nonzero + 1]
-
-
-def _parse_letter_version(
-    letter: str | None, number: str | bytes | SupportsInt | None
-) -> tuple[str, int] | None:
-    if letter:
-        # We consider there to be an implicit 0 in a pre-release if there is
-        # not a numeral associated with it.
-        if number is None:
-            number = 0
-
-        # We normalize any letters to their lower case form
-        letter = letter.lower()
-
-        # We consider some words to be alternate spellings of other words and
-        # in those cases we want to normalize the spellings to our preferred
-        # spelling.
-        if letter == "alpha":
-            letter = "a"
-        elif letter == "beta":
-            letter = "b"
-        elif letter in ["c", "pre", "preview"]:
-            letter = "rc"
-        elif letter in ["rev", "r"]:
-            letter = "post"
-
-        return letter, int(number)
-
-    assert not letter
-    if number:
-        # We assume if we are given a number, but we are not given a letter
-        # then this is using the implicit post release syntax (e.g. 1.0-1)
-        letter = "post"
-
-        return letter, int(number)
-
-    return None
-
-
-_local_version_separators = re.compile(r"[\._-]")
-
-
-def _parse_local_version(local: str | None) -> LocalType | None:
-    """
-    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
-    """
-    if local is not None:
-        return tuple(
-            part.lower() if not part.isdigit() else int(part)
-            for part in _local_version_separators.split(local)
-        )
-    return None
-
-
-def _cmpkey(
-    epoch: int,
-    release: tuple[int, ...],
-    pre: tuple[str, int] | None,
-    post: tuple[str, int] | None,
-    dev: tuple[str, int] | None,
-    local: LocalType | None,
-) -> CmpKey:
-    # When we compare a release version, we want to compare it with all of the
-    # trailing zeros removed. So we'll use a reverse the list, drop all the now
-    # leading zeros until we come to something non zero, then take the rest
-    # re-reverse it back into the correct order and make it a tuple and use
-    # that for our sorting key.
-    _release = tuple(
-        reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release))))
-    )
-
-    # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
-    # We'll do this by abusing the pre segment, but we _only_ want to do this
-    # if there is not a pre or a post segment. If we have one of those then
-    # the normal sorting rules will handle this case correctly.
-    if pre is None and post is None and dev is not None:
-        _pre: CmpPrePostDevType = NegativeInfinity
-    # Versions without a pre-release (except as noted above) should sort after
-    # those with one.
-    elif pre is None:
-        _pre = Infinity
-    else:
-        _pre = pre
-
-    # Versions without a post segment should sort before those with one.
-    if post is None:
-        _post: CmpPrePostDevType = NegativeInfinity
-
-    else:
-        _post = post
-
-    # Versions without a development segment should sort after those with one.
-    if dev is None:
-        _dev: CmpPrePostDevType = Infinity
-
-    else:
-        _dev = dev
-
-    if local is None:
-        # Versions without a local segment should sort before those with one.
-        _local: CmpLocalType = NegativeInfinity
-    else:
-        # Versions with a local segment need that segment parsed to implement
-        # the sorting rules in PEP440.
-        # - Alpha numeric segments sort before numeric segments
-        # - Alpha numeric segments sort lexicographically
-        # - Numeric segments sort numerically
-        # - Shorter versions sort before longer versions when the prefixes
-        #   match exactly
-        _local = tuple(
-            (i, "") if isinstance(i, int) else (NegativeInfinity, i) for i in local
-        )
-
-    return epoch, _release, _pre, _post, _dev, _local
diff --git a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/INSTALLER b/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/METADATA b/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/METADATA
deleted file mode 100644
index 3cae064..0000000
--- a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/METADATA
+++ /dev/null
@@ -1,90 +0,0 @@
-Metadata-Version: 2.4
-Name: pip
-Version: 25.1.1
-Summary: The PyPA recommended tool for installing Python packages.
-Author-email: The pip developers 
-License: MIT
-Project-URL: Homepage, https://pip.pypa.io/
-Project-URL: Documentation, https://pip.pypa.io
-Project-URL: Source, https://github.com/pypa/pip
-Project-URL: Changelog, https://pip.pypa.io/en/stable/news/
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Topic :: Software Development :: Build Tools
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Programming Language :: Python :: 3.10
-Classifier: Programming Language :: Python :: 3.11
-Classifier: Programming Language :: Python :: 3.12
-Classifier: Programming Language :: Python :: 3.13
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Requires-Python: >=3.9
-Description-Content-Type: text/x-rst
-License-File: LICENSE.txt
-License-File: AUTHORS.txt
-Dynamic: license-file
-
-pip - The Python Package Installer
-==================================
-
-.. |pypi-version| image:: https://img.shields.io/pypi/v/pip.svg
-   :target: https://pypi.org/project/pip/
-   :alt: PyPI
-
-.. |python-versions| image:: https://img.shields.io/pypi/pyversions/pip
-   :target: https://pypi.org/project/pip
-   :alt: PyPI - Python Version
-
-.. |docs-badge| image:: https://readthedocs.org/projects/pip/badge/?version=latest
-   :target: https://pip.pypa.io/en/latest
-   :alt: Documentation
-
-|pypi-version| |python-versions| |docs-badge|
-
-pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
-
-Please take a look at our documentation for how to install and use pip:
-
-* `Installation`_
-* `Usage`_
-
-We release updates regularly, with a new version every 3 months. Find more details in our documentation:
-
-* `Release notes`_
-* `Release process`_
-
-If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:
-
-* `Issue tracking`_
-* `Discourse channel`_
-* `User IRC`_
-
-If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:
-
-* `GitHub page`_
-* `Development documentation`_
-* `Development IRC`_
-
-Code of Conduct
----------------
-
-Everyone interacting in the pip project's codebases, issue trackers, chat
-rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
-
-.. _package installer: https://packaging.python.org/guides/tool-recommendations/
-.. _Python Package Index: https://pypi.org
-.. _Installation: https://pip.pypa.io/en/stable/installation/
-.. _Usage: https://pip.pypa.io/en/stable/
-.. _Release notes: https://pip.pypa.io/en/stable/news.html
-.. _Release process: https://pip.pypa.io/en/latest/development/release-process/
-.. _GitHub page: https://github.com/pypa/pip
-.. _Development documentation: https://pip.pypa.io/en/latest/development
-.. _Issue tracking: https://github.com/pypa/pip/issues
-.. _Discourse channel: https://discuss.python.org/c/packaging
-.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
-.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
-.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
diff --git a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/RECORD b/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/RECORD
deleted file mode 100644
index dd7d6fa..0000000
--- a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/RECORD
+++ /dev/null
@@ -1,856 +0,0 @@
-../../Scripts/pip.exe,sha256=NdTzw69eYEyZIdyRKubbK256ML-TgLwjMfmbq0MGwnU,108453
-../../Scripts/pip3.10.exe,sha256=NdTzw69eYEyZIdyRKubbK256ML-TgLwjMfmbq0MGwnU,108453
-../../Scripts/pip3.exe,sha256=NdTzw69eYEyZIdyRKubbK256ML-TgLwjMfmbq0MGwnU,108453
-pip-25.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-pip-25.1.1.dist-info/METADATA,sha256=QFxj1tLpk8hGWrgQLRhJYUpwo_1FqBr43OT0srIZcmU,3649
-pip-25.1.1.dist-info/RECORD,,
-pip-25.1.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip-25.1.1.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
-pip-25.1.1.dist-info/entry_points.txt,sha256=eeIjuzfnfR2PrhbjnbzFU6MnSS70kZLxwaHHq6M-bD0,87
-pip-25.1.1.dist-info/licenses/AUTHORS.txt,sha256=YzDFTYpeYnwpmODDFTgyKZNKWcfdO10L5Ex_U6kJLRc,11223
-pip-25.1.1.dist-info/licenses/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
-pip-25.1.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-pip/__init__.py,sha256=zQQ7Na8YWi0IN86IUKEzDAJtyVpXdJXYDkQ536caUiQ,357
-pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
-pip/__pip-runner__.py,sha256=JOoEZTwrtv7jRaXBkgSQKAE04yNyfFmGHxqpHiGHvL0,1450
-pip/__pycache__/__init__.cpython-310.pyc,,
-pip/__pycache__/__main__.cpython-310.pyc,,
-pip/__pycache__/__pip-runner__.cpython-310.pyc,,
-pip/_internal/__init__.py,sha256=MfcoOluDZ8QMCFYal04IqOJ9q6m2V7a0aOsnI-WOxUo,513
-pip/_internal/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/__pycache__/build_env.cpython-310.pyc,,
-pip/_internal/__pycache__/cache.cpython-310.pyc,,
-pip/_internal/__pycache__/configuration.cpython-310.pyc,,
-pip/_internal/__pycache__/exceptions.cpython-310.pyc,,
-pip/_internal/__pycache__/main.cpython-310.pyc,,
-pip/_internal/__pycache__/pyproject.cpython-310.pyc,,
-pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc,,
-pip/_internal/__pycache__/wheel_builder.cpython-310.pyc,,
-pip/_internal/build_env.py,sha256=60_espLI9X3C2db3Ww2gIcyjNk2cAPNcc5gsVO4DOqg,10924
-pip/_internal/cache.py,sha256=SjhJK1C6NbonrU4AyYXKTOH0CGOk5cJrYt60mRANnPM,10368
-pip/_internal/cli/__init__.py,sha256=Iqg_tKA771XuMO1P4t_sDHnSKPzkUb9D0DqunAmw_ko,131
-pip/_internal/cli/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc,,
-pip/_internal/cli/__pycache__/base_command.cpython-310.pyc,,
-pip/_internal/cli/__pycache__/cmdoptions.cpython-310.pyc,,
-pip/_internal/cli/__pycache__/command_context.cpython-310.pyc,,
-pip/_internal/cli/__pycache__/index_command.cpython-310.pyc,,
-pip/_internal/cli/__pycache__/main.cpython-310.pyc,,
-pip/_internal/cli/__pycache__/main_parser.cpython-310.pyc,,
-pip/_internal/cli/__pycache__/parser.cpython-310.pyc,,
-pip/_internal/cli/__pycache__/progress_bars.cpython-310.pyc,,
-pip/_internal/cli/__pycache__/req_command.cpython-310.pyc,,
-pip/_internal/cli/__pycache__/spinners.cpython-310.pyc,,
-pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc,,
-pip/_internal/cli/autocompletion.py,sha256=fs0Wy16Ga5tX1IZKvww5BDi7i5zyzfCPvu7cgXlgXys,6864
-pip/_internal/cli/base_command.py,sha256=0A8YuJVJh2YyXU8pdW0eidLg1eklCW5cU01mpI-FAxA,8351
-pip/_internal/cli/cmdoptions.py,sha256=-_V4gjMa0c3U8-vXKAyb5xVViJNzFAxBI3Zx_6Ds5-g,31909
-pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
-pip/_internal/cli/index_command.py,sha256=kplkusUgCZy75jNCo-etaDmSG8UvqcR2W50ALDdm6dk,5720
-pip/_internal/cli/main.py,sha256=1bXC7uL3tdb_EZlGVKs6_TgzC9tlKU7zhAZsbZA-IzY,2816
-pip/_internal/cli/main_parser.py,sha256=chZqNmCuO_JYt8ynBCumh4crURaRoXBZ0RxoSYQIwCw,4337
-pip/_internal/cli/parser.py,sha256=VCMtduzECUV87KaHNu-xJ-wLNL82yT3x16V4XBxOAqI,10825
-pip/_internal/cli/progress_bars.py,sha256=r9BD4T2-egcInB1Uh9Jjw3EP9F3INy5kZhGwSePm9jo,4435
-pip/_internal/cli/req_command.py,sha256=1yfssBvnUKNer8D7iT3OHqdJJNdCqRhwDqUFWgieppk,12934
-pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118
-pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
-pip/_internal/commands/__init__.py,sha256=3405KyFv4l0ruxeF69oosFanxNQcC_fHBGv7Rpt0PXg,4009
-pip/_internal/commands/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/cache.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/check.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/completion.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/configuration.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/debug.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/download.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/freeze.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/hash.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/help.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/index.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/inspect.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/install.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/list.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/lock.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/search.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/show.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc,,
-pip/_internal/commands/__pycache__/wheel.cpython-310.pyc,,
-pip/_internal/commands/cache.py,sha256=IOezTicHjGE5sWdBx2nwPVgbjuJHM3s-BZEkpZLemuY,8107
-pip/_internal/commands/check.py,sha256=Hr_4eiMd9cgVDgEvjtIdw915NmL7ROIWW8enkr8slPQ,2268
-pip/_internal/commands/completion.py,sha256=W9QFQTPLjy2tPACJ_y3g9EgB1pbsh7pvCUX8ocuIdPg,4554
-pip/_internal/commands/configuration.py,sha256=n98enwp6y0b5G6fiRQjaZo43FlJKYve_daMhN-4BRNc,9766
-pip/_internal/commands/debug.py,sha256=DNDRgE9YsKrbYzU0s3VKi8rHtKF4X13CJ_br_8PUXO0,6797
-pip/_internal/commands/download.py,sha256=0qB0nys6ZEPsog451lDsjL5Bx7Z97t-B80oFZKhpzKM,5273
-pip/_internal/commands/freeze.py,sha256=YW-aMmAzzOaBWWobo9g4DPKuWp0dTC32lWMqXzKFLzE,3144
-pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703
-pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132
-pip/_internal/commands/index.py,sha256=8UucFVwx6FmM8cNbaPY8iI5kZdV3f6jhqDa-S8aGgpg,5068
-pip/_internal/commands/inspect.py,sha256=PGrY9TRTRCM3y5Ml8Bdk8DEOXquWRfscr4DRo1LOTPc,3189
-pip/_internal/commands/install.py,sha256=SRsiLpead7A8bLdxMqxTAJM3sUFHtgN9zgBT98UQz5E,29757
-pip/_internal/commands/list.py,sha256=Rwtf8B0d0-WrkM7Qsv41-dWg8I_r9BLuZV30wSWnzgU,13274
-pip/_internal/commands/lock.py,sha256=bUYrryKa769UXM61imojoeVVgc_1ZHK-9a0hIJmmlCg,5941
-pip/_internal/commands/search.py,sha256=IrfvxcRCSoZY9A5XAlCF1wtl_y2HPcXslQdHcjzwMNk,5784
-pip/_internal/commands/show.py,sha256=Yh5rGYhR2Io5TkL0fFCMWE1VqqM4xhPHjhbdS3QgEac,8028
-pip/_internal/commands/uninstall.py,sha256=7pOR7enK76gimyxQbzxcG1OsyLXL3DvX939xmM8Fvtg,3892
-pip/_internal/commands/wheel.py,sha256=NEfaVF4f41VBNSn93RL8gkfCEDmdGhbP9xu_dE6cdUk,6346
-pip/_internal/configuration.py,sha256=-KOok6jh3hFzXMPQFPJ1_EFjBpAsge-RSreQuLHLmzo,14005
-pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
-pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/distributions/__pycache__/base.cpython-310.pyc,,
-pip/_internal/distributions/__pycache__/installed.cpython-310.pyc,,
-pip/_internal/distributions/__pycache__/sdist.cpython-310.pyc,,
-pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc,,
-pip/_internal/distributions/base.py,sha256=QeB9qvKXDIjLdPBDE5fMgpfGqMMCr-govnuoQnGuiF8,1783
-pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842
-pip/_internal/distributions/sdist.py,sha256=PlcP4a6-R6c98XnOM-b6Lkb3rsvh9iG4ok8shaanrzs,6751
-pip/_internal/distributions/wheel.py,sha256=THBYfnv7VVt8mYhMYUtH13S1E7FDwtDyDfmUcl8ai0E,1317
-pip/_internal/exceptions.py,sha256=wpE11H0e4L9G6AH70sRG149z82X7wX530HK-9eA_DIQ,28464
-pip/_internal/index/__init__.py,sha256=tzwMH_fhQeubwMqHdSivasg1cRgTSbNg2CiMVnzMmyU,29
-pip/_internal/index/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/index/__pycache__/collector.cpython-310.pyc,,
-pip/_internal/index/__pycache__/package_finder.cpython-310.pyc,,
-pip/_internal/index/__pycache__/sources.cpython-310.pyc,,
-pip/_internal/index/collector.py,sha256=RdPO0JLAlmyBWPAWYHPyRoGjz3GNAeTngCNkbGey_mE,16265
-pip/_internal/index/package_finder.py,sha256=RohRzzLExoXl7QDdTiqyxIaQEcHUn6UNOr9KzC1vjL0,38446
-pip/_internal/index/sources.py,sha256=lPBLK5Xiy8Q6IQMio26Wl7ocfZOKkgGklIBNyUJ23fI,8632
-pip/_internal/locations/__init__.py,sha256=vvTMNxghT0aEXrSdqpNtuRDGx08bzJxfDAUUfQ0Vb0A,14309
-pip/_internal/locations/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc,,
-pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc,,
-pip/_internal/locations/__pycache__/base.cpython-310.pyc,,
-pip/_internal/locations/_distutils.py,sha256=x6nyVLj7X11Y4khIdf-mFlxMl2FWadtVEgeb8upc_WI,6013
-pip/_internal/locations/_sysconfig.py,sha256=IGzds60qsFneRogC-oeBaY7bEh3lPt_v47kMJChQXsU,7724
-pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556
-pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340
-pip/_internal/metadata/__init__.py,sha256=nGWuZvjQlIHudlMz_-bsUs2LDA2ZKNPGevZoEGcd64Y,5723
-pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/metadata/__pycache__/_json.cpython-310.pyc,,
-pip/_internal/metadata/__pycache__/base.cpython-310.pyc,,
-pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc,,
-pip/_internal/metadata/_json.py,sha256=ezrIYazHCINM2QUk1eA9wEAMj3aeGWeDVgGalgUzKpc,2707
-pip/_internal/metadata/base.py,sha256=jCbzdIc8MgWnPR4rfrvSQhSVzSoOyKOXhj3xe8BoG8c,25467
-pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135
-pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/metadata/importlib/__pycache__/_compat.cpython-310.pyc,,
-pip/_internal/metadata/importlib/__pycache__/_dists.cpython-310.pyc,,
-pip/_internal/metadata/importlib/__pycache__/_envs.cpython-310.pyc,,
-pip/_internal/metadata/importlib/_compat.py,sha256=c6av8sP8BBjAZuFSJow1iWfygUXNM3xRTCn5nqw6B9M,2796
-pip/_internal/metadata/importlib/_dists.py,sha256=ftmYiyfUGUIjnVwt6W-Ijsimy5c28KgmXly5Q5IQ2P4,8279
-pip/_internal/metadata/importlib/_envs.py,sha256=X63CkdAPJCYPhefYSLiQzPf9ijMXm5nL_A_Z68yp2-w,5297
-pip/_internal/metadata/pkg_resources.py,sha256=U07ETAINSGeSRBfWUG93E4tZZbaW_f7PGzEqZN0hulc,10542
-pip/_internal/models/__init__.py,sha256=AjmCEBxX_MH9f_jVjIGNCFJKYCYeSEe18yyvNx4uRKQ,62
-pip/_internal/models/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/models/__pycache__/candidate.cpython-310.pyc,,
-pip/_internal/models/__pycache__/direct_url.cpython-310.pyc,,
-pip/_internal/models/__pycache__/format_control.cpython-310.pyc,,
-pip/_internal/models/__pycache__/index.cpython-310.pyc,,
-pip/_internal/models/__pycache__/installation_report.cpython-310.pyc,,
-pip/_internal/models/__pycache__/link.cpython-310.pyc,,
-pip/_internal/models/__pycache__/pylock.cpython-310.pyc,,
-pip/_internal/models/__pycache__/scheme.cpython-310.pyc,,
-pip/_internal/models/__pycache__/search_scope.cpython-310.pyc,,
-pip/_internal/models/__pycache__/selection_prefs.cpython-310.pyc,,
-pip/_internal/models/__pycache__/target_python.cpython-310.pyc,,
-pip/_internal/models/__pycache__/wheel.cpython-310.pyc,,
-pip/_internal/models/candidate.py,sha256=zzgFRuw_kWPjKpGw7LC0ZUMD2CQ2EberUIYs8izjdCA,753
-pip/_internal/models/direct_url.py,sha256=lJ1fIVTgk5UG5SzTNR0FpgSGAQjChlH-3otgiEJAhIs,6576
-pip/_internal/models/format_control.py,sha256=wtsQqSK9HaUiNxQEuB-C62eVimw6G4_VQFxV9-_KDBE,2486
-pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
-pip/_internal/models/installation_report.py,sha256=zRVZoaz-2vsrezj_H3hLOhMZCK9c7TbzWgC-jOalD00,2818
-pip/_internal/models/link.py,sha256=wIAgxhiu05ycLhbtAibknXX5L6X9ju_PPLVnMcvh9B4,21511
-pip/_internal/models/pylock.py,sha256=n3-I26bf2v-Kn6qcx4ATB_Zel2SLhaUxZBmsMeGgYAo,6196
-pip/_internal/models/scheme.py,sha256=PakmHJM3e8OOWSZFtfz1Az7f1meONJnkGuQxFlt3wBE,575
-pip/_internal/models/search_scope.py,sha256=67NEnsYY84784S-MM7ekQuo9KXLH-7MzFntXjapvAo0,4531
-pip/_internal/models/selection_prefs.py,sha256=qaFfDs3ciqoXPg6xx45N1jPLqccLJw4N0s4P0PyHTQ8,2015
-pip/_internal/models/target_python.py,sha256=2XaH2rZ5ZF-K5wcJbEMGEl7SqrTToDDNkrtQ2v_v_-Q,4271
-pip/_internal/models/wheel.py,sha256=10NUTXIRjf2P8oe1Wzolv8oUv7-YurrOduVFUIaDhdM,5506
-pip/_internal/network/__init__.py,sha256=FMy06P__y6jMjUc8z3ZcQdKF-pmZ2zM14_vBeHPGhUI,49
-pip/_internal/network/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/network/__pycache__/auth.cpython-310.pyc,,
-pip/_internal/network/__pycache__/cache.cpython-310.pyc,,
-pip/_internal/network/__pycache__/download.cpython-310.pyc,,
-pip/_internal/network/__pycache__/lazy_wheel.cpython-310.pyc,,
-pip/_internal/network/__pycache__/session.cpython-310.pyc,,
-pip/_internal/network/__pycache__/utils.cpython-310.pyc,,
-pip/_internal/network/__pycache__/xmlrpc.cpython-310.pyc,,
-pip/_internal/network/auth.py,sha256=D4gASjUrqoDFlSt6gQ767KAAjv6PUyJU0puDlhXNVRE,20809
-pip/_internal/network/cache.py,sha256=JGYT-BUaSMdEBwII_K1UE6qyBItz7hzGkyLl_JRzkBY,4613
-pip/_internal/network/download.py,sha256=6IdZyoERWIsXXFUFL_h_e_xi8Z0G0UlpkodPy8qKv2U,11078
-pip/_internal/network/lazy_wheel.py,sha256=PBdoMoNQQIA84Fhgne38jWF52W4x_KtsHjxgv4dkRKA,7622
-pip/_internal/network/session.py,sha256=msM4es16LmmNEYNkrYyg8fTc7gAHbKFltawfKP27LOI,18771
-pip/_internal/network/utils.py,sha256=Inaxel-NxBu4PQWkjyErdnfewsFCcgHph7dzR1-FboY,4088
-pip/_internal/network/xmlrpc.py,sha256=jW9oDSWamMld3iZOO9RbonVC8ZStkHyppCszoevkuJg,1837
-pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_internal/operations/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/operations/__pycache__/check.cpython-310.pyc,,
-pip/_internal/operations/__pycache__/freeze.cpython-310.pyc,,
-pip/_internal/operations/__pycache__/prepare.cpython-310.pyc,,
-pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_internal/operations/build/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/operations/build/__pycache__/build_tracker.cpython-310.pyc,,
-pip/_internal/operations/build/__pycache__/metadata.cpython-310.pyc,,
-pip/_internal/operations/build/__pycache__/metadata_editable.cpython-310.pyc,,
-pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-310.pyc,,
-pip/_internal/operations/build/__pycache__/wheel.cpython-310.pyc,,
-pip/_internal/operations/build/__pycache__/wheel_editable.cpython-310.pyc,,
-pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-310.pyc,,
-pip/_internal/operations/build/build_tracker.py,sha256=-ARW_TcjHCOX7D2NUOGntB4Fgc6b4aolsXkAK6BWL7w,4774
-pip/_internal/operations/build/metadata.py,sha256=INHaeiRfOiLYCXApfDNRo9Cw2xI4VwTc0KItvfdfOjk,1421
-pip/_internal/operations/build/metadata_editable.py,sha256=oWudMsnjy4loO_Jy7g4N9nxsnaEX_iDlVRgCy7pu1rs,1509
-pip/_internal/operations/build/metadata_legacy.py,sha256=wv8cFA0wTqF62Jlm9QwloYZsofOyQ7sWBBmvCcVvn1k,2189
-pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075
-pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417
-pip/_internal/operations/build/wheel_legacy.py,sha256=KXpyGYoCQYcudXNZvohLXgWHaCk4Gf3z0dbS9ol4uu0,3620
-pip/_internal/operations/check.py,sha256=4cnD_2eglsDe5s2CoYkxDt4HcRitTywzLMfTZ-tGQ4U,5911
-pip/_internal/operations/freeze.py,sha256=1_M79jAQKnCxWr-KCCmHuVXOVFGaUJHmoWLfFzgh7K4,9843
-pip/_internal/operations/install/__init__.py,sha256=ak-UETcQPKlFZaWoYKWu5QVXbpFBvg0sXc3i0O4vSYY,50
-pip/_internal/operations/install/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/operations/install/__pycache__/editable_legacy.cpython-310.pyc,,
-pip/_internal/operations/install/__pycache__/wheel.cpython-310.pyc,,
-pip/_internal/operations/install/editable_legacy.py,sha256=TI6wT8sLqDTprWZLYEOBOe7a6-1B9uwKb7kTBxLIaWY,1282
-pip/_internal/operations/install/wheel.py,sha256=4NYSQ9ypl69iiduh5gUPCK3WNYqouTHZ0rMXoVgkiZw,27553
-pip/_internal/operations/prepare.py,sha256=-i9dYwwJJjN7h6sZTabcz84tizgn7EAsY0sHnLAfs3Q,28363
-pip/_internal/pyproject.py,sha256=GLJ6rWRS5_2noKdajohoLyDty57Z7QXhcUAYghmTnWc,7286
-pip/_internal/req/__init__.py,sha256=dX2QGlfDwEqE5pLjOeM-f2qEgXFn6f2Vdi_zIHAYy1k,3096
-pip/_internal/req/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/req/__pycache__/constructors.cpython-310.pyc,,
-pip/_internal/req/__pycache__/req_dependency_group.cpython-310.pyc,,
-pip/_internal/req/__pycache__/req_file.cpython-310.pyc,,
-pip/_internal/req/__pycache__/req_install.cpython-310.pyc,,
-pip/_internal/req/__pycache__/req_set.cpython-310.pyc,,
-pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc,,
-pip/_internal/req/constructors.py,sha256=v1qzCN1mIldwx-nCrPc8JO4lxkm3Fv8M5RWvt8LISjc,18430
-pip/_internal/req/req_dependency_group.py,sha256=5PGuZidqwDeTHZkP4tnNrlPrasfvJBONd1B5S0146zs,2677
-pip/_internal/req/req_file.py,sha256=eys82McgaICOGic2UZRHjD720piKJPwmeSYdXlWwl6w,20234
-pip/_internal/req/req_install.py,sha256=gMoFak9zrhjHlHaOQxPFheHKtIobppFgq1WrKel_nTE,35788
-pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858
-pip/_internal/req/req_uninstall.py,sha256=PQ6SyocDycUYsLAsTpjkbdwO_qjdo-y8BvQfZ5Avdrw,24075
-pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_internal/resolution/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/resolution/__pycache__/base.cpython-310.pyc,,
-pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583
-pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_internal/resolution/legacy/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/resolution/legacy/__pycache__/resolver.cpython-310.pyc,,
-pip/_internal/resolution/legacy/resolver.py,sha256=3HZiJBRd1FTN6jQpI4qRO8-TbLYeIbUTS6PFvXnXs2w,24068
-pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/base.cpython-310.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-310.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-310.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-310.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-310.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-310.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-310.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-310.pyc,,
-pip/_internal/resolution/resolvelib/base.py,sha256=DCf669FsqyQY5uqXeePDHQY1e4QO-pBzWH8O0s9-K94,5023
-pip/_internal/resolution/resolvelib/candidates.py,sha256=U3Qp83jhM_RiJviyrlPCijbps6wYO6VsTDaTnCf_B3o,20241
-pip/_internal/resolution/resolvelib/factory.py,sha256=FCvHc9M8UJ_7iU63QtPiHuq_BmfdnBiMJ8WaDBJNFxk,32668
-pip/_internal/resolution/resolvelib/found_candidates.py,sha256=6lAF_pLQ2_Z0CBOHIFxGp6NfvT1uwIpCui6e-GgI5tk,6000
-pip/_internal/resolution/resolvelib/provider.py,sha256=8ptYOOjfa336D4FZ751EQHR0LDq8jJhIGJXDou8Cv8Y,11190
-pip/_internal/resolution/resolvelib/reporter.py,sha256=EwJAHOjWZ8eTHQWss7zJjmQEj6ooP6oWSwwVXFtgpqQ,3260
-pip/_internal/resolution/resolvelib/requirements.py,sha256=7JG4Z72e5Yk4vU0S5ulGvbqTy4FMQGYhY5zQhX9zTtY,8065
-pip/_internal/resolution/resolvelib/resolver.py,sha256=9zcR4c7UZV1j2ILTmb68Ck_5HdvQvf4cmTBE2bWHkKg,12785
-pip/_internal/self_outdated_check.py,sha256=1PFtttvLAeyCVR3tPoBq2sOlPD0IJ-KSqU6bc1HUk9c,8318
-pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_internal/utils/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/_jaraco_text.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/_log.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/appdirs.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/compat.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/compatibility_tags.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/datetime.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/deprecation.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/direct_url_helpers.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/egg_link.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/entrypoints.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/filesystem.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/filetypes.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/glibc.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/hashes.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/logging.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/misc.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/packaging.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/retry.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/setuptools_build.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/subprocess.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/temp_dir.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/unpacking.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/urls.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/virtualenv.cpython-310.pyc,,
-pip/_internal/utils/__pycache__/wheel.cpython-310.pyc,,
-pip/_internal/utils/_jaraco_text.py,sha256=M15uUPIh5NpP1tdUGBxRau6q1ZAEtI8-XyLEETscFfE,3350
-pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
-pip/_internal/utils/appdirs.py,sha256=zrIISCn2QxlXYw-zJZZBTrFNTyy_0WNKiI-TOoN6wJo,1705
-pip/_internal/utils/compat.py,sha256=ckkFveBiYQjRWjkNsajt_oWPS57tJvE8XxoC4OIYgCY,2399
-pip/_internal/utils/compatibility_tags.py,sha256=q5W7IrNlqC5ke0AqWRG6aX5pimiqh--xuPCCNwCKPsU,6662
-pip/_internal/utils/datetime.py,sha256=Gt29Ml4ToPSM88j54iu43WKtrU9A-moP4QmMiiqzedU,241
-pip/_internal/utils/deprecation.py,sha256=k7Qg_UBAaaTdyq82YVARA6D7RmcGTXGv7fnfcgigj4Q,3707
-pip/_internal/utils/direct_url_helpers.py,sha256=r2MRtkVDACv9AGqYODBUC9CjwgtsUU1s68hmgfCJMtA,3196
-pip/_internal/utils/egg_link.py,sha256=0FePZoUYKv4RGQ2t6x7w5Z427wbA_Uo3WZnAkrgsuqo,2463
-pip/_internal/utils/entrypoints.py,sha256=4CheZ81OBPPLb3Gn-X_WEPtllUibpwDVzlVQ4RFh7PM,3325
-pip/_internal/utils/filesystem.py,sha256=ajvA-q4ocliW9kPp8Yquh-4vssXbu-UKbo5FV9V4X64,4950
-pip/_internal/utils/filetypes.py,sha256=OCPzUxq3Aa6k_95MiI8DYgkOzutTs47fA-v-vYUJp9E,715
-pip/_internal/utils/glibc.py,sha256=vUkWq_1pJuzcYNcGKLlQmABoUiisK8noYY1yc8Wq4w4,3734
-pip/_internal/utils/hashes.py,sha256=XGGLL0AG8-RhWnyz87xF6MFZ--BKadHU35D47eApCKI,4972
-pip/_internal/utils/logging.py,sha256=zMZK1NxfhM4QMGUyaU9q1grNuDhLSVbSkGCvZBKmaPw,12076
-pip/_internal/utils/misc.py,sha256=DWnYxBUItjRp7hhxEg4ih6P6YpKrykM86dbi_EcU8SQ,23450
-pip/_internal/utils/packaging.py,sha256=CjJOqLNENW-U88ojOllVL40f1ab2W2Bm3KHCavwNNfw,1603
-pip/_internal/utils/retry.py,sha256=mhFbykXjhTnZfgzeuy-vl9c8nECnYn_CMtwNJX2tYzQ,1392
-pip/_internal/utils/setuptools_build.py,sha256=J9EyRantVgu4V-xS_qfQy2mcPLVUM7A-227QdKGUZCA,4482
-pip/_internal/utils/subprocess.py,sha256=EsvqSRiSMHF98T8Txmu6NLU3U--MpTTQjtNgKP0P--M,8988
-pip/_internal/utils/temp_dir.py,sha256=5qOXe8M4JeY6vaFQM867d5zkp1bSwMZ-KT5jymmP0Zg,9310
-pip/_internal/utils/unpacking.py,sha256=4yCqlRAI2zxl5tfxlnLoWLNcEn-k1c3vaet_oaJ42iI,11926
-pip/_internal/utils/urls.py,sha256=qceSOZb5lbNDrHNsv7_S4L4Ytszja5NwPKUMnZHbYnM,1599
-pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456
-pip/_internal/utils/wheel.py,sha256=MHObYn6d7VyZL10i-W1xoJZ2hT5-wB1WkII70AsYUE8,4493
-pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596
-pip/_internal/vcs/__pycache__/__init__.cpython-310.pyc,,
-pip/_internal/vcs/__pycache__/bazaar.cpython-310.pyc,,
-pip/_internal/vcs/__pycache__/git.cpython-310.pyc,,
-pip/_internal/vcs/__pycache__/mercurial.cpython-310.pyc,,
-pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc,,
-pip/_internal/vcs/__pycache__/versioncontrol.cpython-310.pyc,,
-pip/_internal/vcs/bazaar.py,sha256=EKStcQaKpNu0NK4p5Q10Oc4xb3DUxFw024XrJy40bFQ,3528
-pip/_internal/vcs/git.py,sha256=3KLPrKsDL9xZchmz4H1Obo8fM2Fh8ChrhtDHWjbkj-I,18591
-pip/_internal/vcs/mercurial.py,sha256=oULOhzJ2Uie-06d1omkL-_Gc6meGaUkyogvqG9ZCyPs,5249
-pip/_internal/vcs/subversion.py,sha256=ddTugHBqHzV3ebKlU5QXHPN4gUqlyXbOx8q8NgXKvs8,11735
-pip/_internal/vcs/versioncontrol.py,sha256=cvf_-hnTAjQLXJ3d17FMNhQfcO1AcKWUF10tfrYyP-c,22440
-pip/_internal/wheel_builder.py,sha256=Z5Z2ANADbKdSHY9BHqw9zG5-1AxstO6YM6m9yLWe7Vw,11212
-pip/_vendor/__init__.py,sha256=WzusPTGWIMeQQWSVJ0h2rafGkVTa9WKJ2HT-2-EoZrU,4907
-pip/_vendor/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/__pycache__/typing_extensions.cpython-310.pyc,,
-pip/_vendor/cachecontrol/__init__.py,sha256=x9ecUkiwNvAGfE3g0eaRx3VrJZnZWAluA2LRcvab3HQ,677
-pip/_vendor/cachecontrol/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-310.pyc,,
-pip/_vendor/cachecontrol/__pycache__/adapter.cpython-310.pyc,,
-pip/_vendor/cachecontrol/__pycache__/cache.cpython-310.pyc,,
-pip/_vendor/cachecontrol/__pycache__/controller.cpython-310.pyc,,
-pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-310.pyc,,
-pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-310.pyc,,
-pip/_vendor/cachecontrol/__pycache__/serialize.cpython-310.pyc,,
-pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-310.pyc,,
-pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737
-pip/_vendor/cachecontrol/adapter.py,sha256=8y6rTPXOzVHmDKCW5CR9sivLVuDv-cpdGcZYdRWNaPw,6599
-pip/_vendor/cachecontrol/cache.py,sha256=OXwv7Fn2AwnKNiahJHnjtvaKLndvVLv_-zO-ltlV9qI,1953
-pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303
-pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-310.pyc,,
-pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-310.pyc,,
-pip/_vendor/cachecontrol/caches/file_cache.py,sha256=d8upFmy_zwaCmlbWEVBlLXFddt8Zw8c5SFpxeOZsdfw,4117
-pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386
-pip/_vendor/cachecontrol/controller.py,sha256=cx0Hl8xLZgUuXuy78Gih9AYjCtqurmYjVJxyA4yWt7w,19101
-pip/_vendor/cachecontrol/filewrapper.py,sha256=2ktXNPE0KqnyzF24aOsKCA58HQq1xeC6l2g6_zwjghc,4291
-pip/_vendor/cachecontrol/heuristics.py,sha256=gqMXU8w0gQuEQiSdu3Yg-0vd9kW7nrWKbLca75rheGE,4881
-pip/_vendor/cachecontrol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/cachecontrol/serialize.py,sha256=HQd2IllQ05HzPkVLMXTF2uX5mjEQjDBkxCqUJUODpZk,5163
-pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417
-pip/_vendor/certifi/__init__.py,sha256=neIaAf7BM36ygmQCmy-ZsSyjnvjWghFeu13wwEAnjj0,94
-pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
-pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc,,
-pip/_vendor/certifi/__pycache__/core.cpython-310.pyc,,
-pip/_vendor/certifi/cacert.pem,sha256=xVsh-Qf3-G1IrdCTVS-1ZRdJ_1-GBQjMu0I9bB-9gMc,297255
-pip/_vendor/certifi/core.py,sha256=2SRT5rIcQChFDbe37BQa-kULxAgJ8qN6l1jfqTp4HIs,4486
-pip/_vendor/certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/dependency_groups/__init__.py,sha256=C3OFu0NGwDzQ4LOmmSOFPsRSvkbBn-mdd4j_5YqJw-s,250
-pip/_vendor/dependency_groups/__main__.py,sha256=UNTM7P5mfVtT7wDi9kOTXWgV3fu3e8bTrt1Qp1jvjKo,1709
-pip/_vendor/dependency_groups/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/dependency_groups/__pycache__/__main__.cpython-310.pyc,,
-pip/_vendor/dependency_groups/__pycache__/_implementation.cpython-310.pyc,,
-pip/_vendor/dependency_groups/__pycache__/_lint_dependency_groups.cpython-310.pyc,,
-pip/_vendor/dependency_groups/__pycache__/_pip_wrapper.cpython-310.pyc,,
-pip/_vendor/dependency_groups/__pycache__/_toml_compat.cpython-310.pyc,,
-pip/_vendor/dependency_groups/_implementation.py,sha256=Gqb2DlQELRakeHlKf6QtQSW0M-bcEomxHw4JsvID1ls,8041
-pip/_vendor/dependency_groups/_lint_dependency_groups.py,sha256=yp-DDqKXtbkDTNa0ifa-FmOA8ra24lPZEXftW-R5AuI,1710
-pip/_vendor/dependency_groups/_pip_wrapper.py,sha256=nuVW_w_ntVxpE26ELEvngMY0N04sFLsijXRyZZROFG8,1865
-pip/_vendor/dependency_groups/_toml_compat.py,sha256=BHnXnFacm3DeolsA35GjI6qkDApvua-1F20kv3BfZWE,285
-pip/_vendor/dependency_groups/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/distlib/__init__.py,sha256=dcwgYGYGQqAEawBXPDtIx80DO_3cOmFv8HTc8JMzknQ,625
-pip/_vendor/distlib/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc,,
-pip/_vendor/distlib/__pycache__/database.cpython-310.pyc,,
-pip/_vendor/distlib/__pycache__/index.cpython-310.pyc,,
-pip/_vendor/distlib/__pycache__/locators.cpython-310.pyc,,
-pip/_vendor/distlib/__pycache__/manifest.cpython-310.pyc,,
-pip/_vendor/distlib/__pycache__/markers.cpython-310.pyc,,
-pip/_vendor/distlib/__pycache__/metadata.cpython-310.pyc,,
-pip/_vendor/distlib/__pycache__/resources.cpython-310.pyc,,
-pip/_vendor/distlib/__pycache__/scripts.cpython-310.pyc,,
-pip/_vendor/distlib/__pycache__/util.cpython-310.pyc,,
-pip/_vendor/distlib/__pycache__/version.cpython-310.pyc,,
-pip/_vendor/distlib/__pycache__/wheel.cpython-310.pyc,,
-pip/_vendor/distlib/compat.py,sha256=2jRSjRI4o-vlXeTK2BCGIUhkc6e9ZGhSsacRM5oseTw,41467
-pip/_vendor/distlib/database.py,sha256=mHy_LxiXIsIVRb-T0-idBrVLw3Ffij5teHCpbjmJ9YU,51160
-pip/_vendor/distlib/index.py,sha256=lTbw268rRhj8dw1sib3VZ_0EhSGgoJO3FKJzSFMOaeA,20797
-pip/_vendor/distlib/locators.py,sha256=oBeAZpFuPQSY09MgNnLfQGGAXXvVO96BFpZyKMuK4tM,51026
-pip/_vendor/distlib/manifest.py,sha256=3qfmAmVwxRqU1o23AlfXrQGZzh6g_GGzTAP_Hb9C5zQ,14168
-pip/_vendor/distlib/markers.py,sha256=X6sDvkFGcYS8gUW8hfsWuKEKAqhQZAJ7iXOMLxRYjYk,5164
-pip/_vendor/distlib/metadata.py,sha256=zil3sg2EUfLXVigljY2d_03IJt-JSs7nX-73fECMX2s,38724
-pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
-pip/_vendor/distlib/scripts.py,sha256=BJliaDAZaVB7WAkwokgC3HXwLD2iWiHaVI50H7C6eG8,18608
-pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
-pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
-pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
-pip/_vendor/distlib/util.py,sha256=vMPGvsS4j9hF6Y9k3Tyom1aaHLb0rFmZAEyzeAdel9w,66682
-pip/_vendor/distlib/version.py,sha256=s5VIs8wBn0fxzGxWM_aA2ZZyx525HcZbMvcTlTyZ3Rg,23727
-pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
-pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
-pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
-pip/_vendor/distlib/wheel.py,sha256=DFIVguEQHCdxnSdAO0dfFsgMcvVZitg7bCOuLwZ7A_s,43979
-pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
-pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
-pip/_vendor/distro/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/distro/__pycache__/__main__.cpython-310.pyc,,
-pip/_vendor/distro/__pycache__/distro.cpython-310.pyc,,
-pip/_vendor/distro/distro.py,sha256=XqbefacAhDT4zr_trnbA15eY8vdK4GTghgmvUGrEM_4,49430
-pip/_vendor/distro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868
-pip/_vendor/idna/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/idna/__pycache__/codec.cpython-310.pyc,,
-pip/_vendor/idna/__pycache__/compat.cpython-310.pyc,,
-pip/_vendor/idna/__pycache__/core.cpython-310.pyc,,
-pip/_vendor/idna/__pycache__/idnadata.cpython-310.pyc,,
-pip/_vendor/idna/__pycache__/intranges.cpython-310.pyc,,
-pip/_vendor/idna/__pycache__/package_data.cpython-310.pyc,,
-pip/_vendor/idna/__pycache__/uts46data.cpython-310.pyc,,
-pip/_vendor/idna/codec.py,sha256=PEew3ItwzjW4hymbasnty2N2OXvNcgHB-JjrBuxHPYY,3422
-pip/_vendor/idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316
-pip/_vendor/idna/core.py,sha256=YJYyAMnwiQEPjVC4-Fqu_p4CJ6yKKuDGmppBNQNQpFs,13239
-pip/_vendor/idna/idnadata.py,sha256=W30GcIGvtOWYwAjZj4ZjuouUutC6ffgNuyjJy7fZ-lo,78306
-pip/_vendor/idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898
-pip/_vendor/idna/package_data.py,sha256=q59S3OXsc5VI8j6vSD0sGBMyk6zZ4vWFREE88yCJYKs,21
-pip/_vendor/idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/idna/uts46data.py,sha256=rt90K9J40gUSwppDPCrhjgi5AA6pWM65dEGRSf6rIhM,239289
-pip/_vendor/msgpack/__init__.py,sha256=reRaiOtEzSjPnr7TpxjgIvbfln5pV66FhricAs2eC-g,1109
-pip/_vendor/msgpack/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/msgpack/__pycache__/exceptions.cpython-310.pyc,,
-pip/_vendor/msgpack/__pycache__/ext.cpython-310.pyc,,
-pip/_vendor/msgpack/__pycache__/fallback.cpython-310.pyc,,
-pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
-pip/_vendor/msgpack/ext.py,sha256=kteJv03n9tYzd5oo3xYopVTo4vRaAxonBQQJhXohZZo,5726
-pip/_vendor/msgpack/fallback.py,sha256=0g1Pzp0vtmBEmJ5w9F3s_-JMVURP8RS4G1cc5TRaAsI,32390
-pip/_vendor/packaging/__init__.py,sha256=_0cDiPVf2S-bNfVmZguxxzmrIYWlyASxpqph4qsJWUc,494
-pip/_vendor/packaging/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/packaging/__pycache__/_elffile.cpython-310.pyc,,
-pip/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc,,
-pip/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc,,
-pip/_vendor/packaging/__pycache__/_parser.cpython-310.pyc,,
-pip/_vendor/packaging/__pycache__/_structures.cpython-310.pyc,,
-pip/_vendor/packaging/__pycache__/_tokenizer.cpython-310.pyc,,
-pip/_vendor/packaging/__pycache__/markers.cpython-310.pyc,,
-pip/_vendor/packaging/__pycache__/metadata.cpython-310.pyc,,
-pip/_vendor/packaging/__pycache__/requirements.cpython-310.pyc,,
-pip/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc,,
-pip/_vendor/packaging/__pycache__/tags.cpython-310.pyc,,
-pip/_vendor/packaging/__pycache__/utils.cpython-310.pyc,,
-pip/_vendor/packaging/__pycache__/version.cpython-310.pyc,,
-pip/_vendor/packaging/_elffile.py,sha256=UkrbDtW7aeq3qqoAfU16ojyHZ1xsTvGke_WqMTKAKd0,3286
-pip/_vendor/packaging/_manylinux.py,sha256=t4y_-dTOcfr36gLY-ztiOpxxJFGO2ikC11HgfysGxiM,9596
-pip/_vendor/packaging/_musllinux.py,sha256=p9ZqNYiOItGee8KcZFeHF_YcdhVwGHdK6r-8lgixvGQ,2694
-pip/_vendor/packaging/_parser.py,sha256=gYfnj0pRHflVc4RHZit13KNTyN9iiVcU2RUCGi22BwM,10221
-pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
-pip/_vendor/packaging/_tokenizer.py,sha256=OYzt7qKxylOAJ-q0XyK1qAycyPRYLfMPdGQKRXkZWyI,5310
-pip/_vendor/packaging/licenses/__init__.py,sha256=3bx-gryo4sRv5LsrwApouy65VIs3u6irSORJzALkrzU,5727
-pip/_vendor/packaging/licenses/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/packaging/licenses/__pycache__/_spdx.cpython-310.pyc,,
-pip/_vendor/packaging/licenses/_spdx.py,sha256=oAm1ztPFwlsmCKe7lAAsv_OIOfS1cWDu9bNBkeu-2ns,48398
-pip/_vendor/packaging/markers.py,sha256=P0we27jm1xUzgGMJxBjtUFCIWeBxTsMeJTOJ6chZmAY,12049
-pip/_vendor/packaging/metadata.py,sha256=8IZErqQQnNm53dZZuYq4FGU4_dpyinMeH1QFBIWIkfE,34739
-pip/_vendor/packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/packaging/requirements.py,sha256=gYyRSAdbrIyKDY66ugIDUQjRMvxkH2ALioTmX3tnL6o,2947
-pip/_vendor/packaging/specifiers.py,sha256=yc9D_MycJEmwUpZvcs1OZL9HfiNFmyw0RZaeHRNHkPw,40079
-pip/_vendor/packaging/tags.py,sha256=41s97W9Zatrq2Ed7Rc3qeBDaHe8pKKvYq2mGjwahfXk,22745
-pip/_vendor/packaging/utils.py,sha256=0F3Hh9OFuRgrhTgGZUl5K22Fv1YP2tZl1z_2gO6kJiA,5050
-pip/_vendor/packaging/version.py,sha256=oiHqzTUv_p12hpjgsLDVcaF5hT7pDaSOViUNMD4GTW0,16688
-pip/_vendor/pkg_resources/__init__.py,sha256=jrhDRbOubP74QuPXxd7U7Po42PH2l-LZ2XfcO7llpZ4,124463
-pip/_vendor/pkg_resources/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/platformdirs/__init__.py,sha256=UfeSHWl8AeTtbOBOoHAxK4dODOWkZtfy-m_i7cWdJ8c,22344
-pip/_vendor/platformdirs/__main__.py,sha256=jBJ8zb7Mpx5ebcqF83xrpO94MaeCpNGHVf9cvDN2JLg,1505
-pip/_vendor/platformdirs/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/platformdirs/__pycache__/__main__.cpython-310.pyc,,
-pip/_vendor/platformdirs/__pycache__/android.cpython-310.pyc,,
-pip/_vendor/platformdirs/__pycache__/api.cpython-310.pyc,,
-pip/_vendor/platformdirs/__pycache__/macos.cpython-310.pyc,,
-pip/_vendor/platformdirs/__pycache__/unix.cpython-310.pyc,,
-pip/_vendor/platformdirs/__pycache__/version.cpython-310.pyc,,
-pip/_vendor/platformdirs/__pycache__/windows.cpython-310.pyc,,
-pip/_vendor/platformdirs/android.py,sha256=r0DshVBf-RO1jXJGX8C4Til7F1XWt-bkdWMgmvEiaYg,9013
-pip/_vendor/platformdirs/api.py,sha256=U9EzI3EYxcXWUCtIGRllqrcN99i2LSY1mq2-GtsUwEQ,9277
-pip/_vendor/platformdirs/macos.py,sha256=UlbyFZ8Rzu3xndCqQEHrfsYTeHwYdFap1Ioz-yxveT4,6154
-pip/_vendor/platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/platformdirs/unix.py,sha256=WZmkUA--L3JNRGmz32s35YfoD3ica6xKIPdCV_HhLcs,10458
-pip/_vendor/platformdirs/version.py,sha256=0fnw4ljascx7O5PfIeZ2yj6w3pAkqwp099vDcivxuvY,511
-pip/_vendor/platformdirs/windows.py,sha256=IFpiohUBwxPtCzlyKwNtxyW4Jk8haa6W8o59mfrDXVo,10125
-pip/_vendor/pygments/__init__.py,sha256=qMm7-KYqNpMrmjymZaqfH-_9iJtjnexAKodkb9G5D5g,2983
-pip/_vendor/pygments/__main__.py,sha256=WrndpSe6i1ckX_SQ1KaxD9CTKGzD0EuCOFxcbwFpoLU,353
-pip/_vendor/pygments/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/pygments/__pycache__/__main__.cpython-310.pyc,,
-pip/_vendor/pygments/__pycache__/console.cpython-310.pyc,,
-pip/_vendor/pygments/__pycache__/filter.cpython-310.pyc,,
-pip/_vendor/pygments/__pycache__/formatter.cpython-310.pyc,,
-pip/_vendor/pygments/__pycache__/lexer.cpython-310.pyc,,
-pip/_vendor/pygments/__pycache__/modeline.cpython-310.pyc,,
-pip/_vendor/pygments/__pycache__/plugin.cpython-310.pyc,,
-pip/_vendor/pygments/__pycache__/regexopt.cpython-310.pyc,,
-pip/_vendor/pygments/__pycache__/scanner.cpython-310.pyc,,
-pip/_vendor/pygments/__pycache__/sphinxext.cpython-310.pyc,,
-pip/_vendor/pygments/__pycache__/style.cpython-310.pyc,,
-pip/_vendor/pygments/__pycache__/token.cpython-310.pyc,,
-pip/_vendor/pygments/__pycache__/unistring.cpython-310.pyc,,
-pip/_vendor/pygments/__pycache__/util.cpython-310.pyc,,
-pip/_vendor/pygments/console.py,sha256=AagDWqwea2yBWf10KC9ptBgMpMjxKp8yABAmh-NQOVk,1718
-pip/_vendor/pygments/filter.py,sha256=YLtpTnZiu07nY3oK9nfR6E9Y1FBHhP5PX8gvkJWcfag,1910
-pip/_vendor/pygments/filters/__init__.py,sha256=4U4jtA0X3iP83uQnB9-TI-HDSw8E8y8zMYHa0UjbbaI,40392
-pip/_vendor/pygments/filters/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/pygments/formatter.py,sha256=KZQMmyo_xkOIkQG8g66LYEkBh1bx7a0HyGCBcvhI9Ew,4390
-pip/_vendor/pygments/formatters/__init__.py,sha256=KTwBmnXlaopJhQDOemVHYHskiDghuq-08YtP6xPNJPg,5385
-pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-310.pyc,,
-pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176
-pip/_vendor/pygments/lexer.py,sha256=_kBrOJ_NT5Tl0IVM0rA9c8eysP6_yrlGzEQI0eVYB-A,35349
-pip/_vendor/pygments/lexers/__init__.py,sha256=wbIME35GH7bI1B9rNPJFqWT-ij_RApZDYPUlZycaLzA,12115
-pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-310.pyc,,
-pip/_vendor/pygments/lexers/__pycache__/python.cpython-310.pyc,,
-pip/_vendor/pygments/lexers/_mapping.py,sha256=l4tCXM8e9aPC2BD6sjIr0deT-J-z5tHgCwL-p1fS0PE,77602
-pip/_vendor/pygments/lexers/python.py,sha256=vxjn1cOHclIKJKxoyiBsQTY65GHbkZtZRuKQ2AVCKaw,53853
-pip/_vendor/pygments/modeline.py,sha256=K5eSkR8GS1r5OkXXTHOcV0aM_6xpk9eWNEIAW-OOJ2g,1005
-pip/_vendor/pygments/plugin.py,sha256=tPx0rJCTIZ9ioRgLNYG4pifCbAwTRUZddvLw-NfAk2w,1891
-pip/_vendor/pygments/regexopt.py,sha256=wXaP9Gjp_hKAdnICqoDkRxAOQJSc4v3X6mcxx3z-TNs,3072
-pip/_vendor/pygments/scanner.py,sha256=nNcETRR1tRuiTaHmHSTTECVYFPcLf6mDZu1e4u91A9E,3092
-pip/_vendor/pygments/sphinxext.py,sha256=5x7Zh9YlU6ISJ31dMwduiaanb5dWZnKg3MyEQsseNnQ,7981
-pip/_vendor/pygments/style.py,sha256=PlOZqlsnTVd58RGy50vkA2cXQ_lP5bF5EGMEBTno6DA,6420
-pip/_vendor/pygments/styles/__init__.py,sha256=x9ebctfyvCAFpMTlMJ5YxwcNYBzjgq6zJaKkNm78r4M,2042
-pip/_vendor/pygments/styles/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-310.pyc,,
-pip/_vendor/pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312
-pip/_vendor/pygments/token.py,sha256=WbdWGhYm_Vosb0DDxW9lHNPgITXfWTsQmHt6cy9RbcM,6226
-pip/_vendor/pygments/unistring.py,sha256=al-_rBemRuGvinsrM6atNsHTmJ6DUbw24q2O2Ru1cBc,63208
-pip/_vendor/pygments/util.py,sha256=oRtSpiAo5jM9ulntkvVbgXUdiAW57jnuYGB7t9fYuhc,10031
-pip/_vendor/pyproject_hooks/__init__.py,sha256=cPB_a9LXz5xvsRbX1o2qyAdjLatZJdQ_Lc5McNX-X7Y,691
-pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-310.pyc,,
-pip/_vendor/pyproject_hooks/_impl.py,sha256=jY-raxnmyRyB57ruAitrJRUzEexuAhGTpgMygqx67Z4,14936
-pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=MJNPpfIxcO-FghxpBbxkG1rFiQf6HOUbV4U5mq0HFns,557
-pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-310.pyc,,
-pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=qcXMhmx__MIJq10gGHW3mA4Tl8dy8YzHMccwnNoKlw0,12216
-pip/_vendor/pyproject_hooks/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/requests/__init__.py,sha256=HlB_HzhrzGtfD_aaYUwUh1zWXLZ75_YCLyit75d0Vz8,5057
-pip/_vendor/requests/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/__version__.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/_internal_utils.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/adapters.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/api.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/auth.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/certs.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/compat.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/cookies.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/exceptions.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/help.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/hooks.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/models.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/packages.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/sessions.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/status_codes.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/structures.cpython-310.pyc,,
-pip/_vendor/requests/__pycache__/utils.cpython-310.pyc,,
-pip/_vendor/requests/__version__.py,sha256=FVfglgZmNQnmYPXpOohDU58F5EUb_-VnSTaAesS187g,435
-pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495
-pip/_vendor/requests/adapters.py,sha256=J7VeVxKBvawbtlX2DERVo05J9BXTcWYLMHNd1Baa-bk,27607
-pip/_vendor/requests/api.py,sha256=_Zb9Oa7tzVIizTKwFrPjDEY9ejtm_OnSRERnADxGsQs,6449
-pip/_vendor/requests/auth.py,sha256=kF75tqnLctZ9Mf_hm9TZIj4cQWnN5uxRz8oWsx5wmR0,10186
-pip/_vendor/requests/certs.py,sha256=kHDlkK_beuHXeMPc5jta2wgl8gdKeUWt5f2nTDVrvt8,441
-pip/_vendor/requests/compat.py,sha256=Mo9f9xZpefod8Zm-n9_StJcVTmwSukXR2p3IQyyVXvU,1485
-pip/_vendor/requests/cookies.py,sha256=bNi-iqEj4NPZ00-ob-rHvzkvObzN3lEpgw3g6paS3Xw,18590
-pip/_vendor/requests/exceptions.py,sha256=D1wqzYWne1mS2rU43tP9CeN1G7QAy7eqL9o1god6Ejw,4272
-pip/_vendor/requests/help.py,sha256=hRKaf9u0G7fdwrqMHtF3oG16RKktRf6KiwtSq2Fo1_0,3813
-pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733
-pip/_vendor/requests/models.py,sha256=x4K4CmH-lC0l2Kb-iPfMN4dRXxHEcbOaEWBL_i09AwI,35483
-pip/_vendor/requests/packages.py,sha256=_ZQDCJTJ8SP3kVWunSqBsRZNPzj2c1WFVqbdr08pz3U,1057
-pip/_vendor/requests/sessions.py,sha256=ykTI8UWGSltOfH07HKollH7kTBGw4WhiBVaQGmckTw4,30495
-pip/_vendor/requests/status_codes.py,sha256=iJUAeA25baTdw-6PfD0eF4qhpINDJRJI-yaMqxs4LEI,4322
-pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912
-pip/_vendor/requests/utils.py,sha256=L79vnFbzJ3SFLKtJwpoWe41Tozi3RlZv94pY1TFIyow,33631
-pip/_vendor/resolvelib/__init__.py,sha256=4LcBWHMH317EKEkpV5XLVnqiU1lrmCiygjsADuCgz4s,541
-pip/_vendor/resolvelib/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/resolvelib/__pycache__/providers.cpython-310.pyc,,
-pip/_vendor/resolvelib/__pycache__/reporters.cpython-310.pyc,,
-pip/_vendor/resolvelib/__pycache__/structs.cpython-310.pyc,,
-pip/_vendor/resolvelib/providers.py,sha256=pIWJbIdJJ9GFtNbtwTH0Ia43Vj6hYCEJj2DOLue15FM,8914
-pip/_vendor/resolvelib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/resolvelib/reporters.py,sha256=8BNa7G9cKW4Lie4BhDhd7Z57J_Vlb1CYPGSgVN2erMA,2038
-pip/_vendor/resolvelib/resolvers/__init__.py,sha256=GMYuhrbSsYTIjOij0tuJKLvlk6UXmp3nXQetn2sOvpQ,640
-pip/_vendor/resolvelib/resolvers/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/resolvelib/resolvers/__pycache__/abstract.cpython-310.pyc,,
-pip/_vendor/resolvelib/resolvers/__pycache__/criterion.cpython-310.pyc,,
-pip/_vendor/resolvelib/resolvers/__pycache__/exceptions.cpython-310.pyc,,
-pip/_vendor/resolvelib/resolvers/__pycache__/resolution.cpython-310.pyc,,
-pip/_vendor/resolvelib/resolvers/abstract.py,sha256=jZOBVigE4PUub9i3F-bTvBwaIXX8S9EU3CGASBvFqEU,1558
-pip/_vendor/resolvelib/resolvers/criterion.py,sha256=lcmZGv5sKHOnFD_RzZwvlGSj19MeA-5rCMpdf2Sgw7Y,1768
-pip/_vendor/resolvelib/resolvers/exceptions.py,sha256=ln_jaQtgLlRUSFY627yiHG2gD7AgaXzRKaElFVh7fDQ,1768
-pip/_vendor/resolvelib/resolvers/resolution.py,sha256=yQegMuOmlzAElLLpgD-k6NbPDMCQf29rWhiFC26OdkM,20671
-pip/_vendor/resolvelib/structs.py,sha256=pu-EJiR2IBITr2SQeNPRa0rXhjlStfmO_GEgAhr3004,6420
-pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090
-pip/_vendor/rich/__main__.py,sha256=eO7Cq8JnrgG8zVoeImiAs92q3hXNMIfp0w5lMsO7Q2Y,8477
-pip/_vendor/rich/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/__main__.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_cell_widths.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_emoji_codes.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_emoji_replace.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_export_format.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_extension.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_fileno.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_inspect.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_log_render.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_loop.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_null_file.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_palettes.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_pick.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_ratio.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_spinners.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_stack.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_timer.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_win32_console.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_windows.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_windows_renderer.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/_wrap.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/abc.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/align.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/ansi.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/bar.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/box.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/cells.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/color.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/color_triplet.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/columns.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/console.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/constrain.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/containers.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/control.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/default_styles.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/diagnose.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/emoji.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/errors.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/file_proxy.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/filesize.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/highlighter.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/json.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/jupyter.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/layout.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/live.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/live_render.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/logging.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/markup.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/measure.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/padding.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/pager.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/palette.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/panel.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/pretty.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/progress.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/progress_bar.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/prompt.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/protocol.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/region.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/repr.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/rule.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/scope.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/screen.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/segment.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/spinner.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/status.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/style.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/styled.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/syntax.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/table.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/terminal_theme.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/text.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/theme.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/themes.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/traceback.cpython-310.pyc,,
-pip/_vendor/rich/__pycache__/tree.cpython-310.pyc,,
-pip/_vendor/rich/_cell_widths.py,sha256=fbmeyetEdHjzE_Vx2l1uK7tnPOhMs2X1lJfO3vsKDpA,10209
-pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
-pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
-pip/_vendor/rich/_export_format.py,sha256=RI08pSrm5tBSzPMvnbTqbD9WIalaOoN5d4M1RTmLq1Y,2128
-pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265
-pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799
-pip/_vendor/rich/_inspect.py,sha256=QM05lEFnFoTaFqpnbx-zBEI6k8oIKrD3cvjEOQNhKig,9655
-pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225
-pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
-pip/_vendor/rich/_null_file.py,sha256=ADGKp1yt-k70FMKV6tnqCqecB-rSJzp-WQsD7LPL-kg,1394
-pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
-pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
-pip/_vendor/rich/_ratio.py,sha256=Zt58apszI6hAAcXPpgdWKpu3c31UBWebOeR4mbyptvU,5471
-pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
-pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
-pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
-pip/_vendor/rich/_win32_console.py,sha256=BSaDRIMwBLITn_m0mTRLPqME5q-quGdSMuYMpYeYJwc,22755
-pip/_vendor/rich/_windows.py,sha256=aBwaD_S56SbgopIvayVmpk0Y28uwY2C5Bab1wl3Bp-I,1925
-pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783
-pip/_vendor/rich/_wrap.py,sha256=FlSsom5EX0LVkA3KWy34yHnCfLtqX-ZIepXKh-70rpc,3404
-pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890
-pip/_vendor/rich/align.py,sha256=Rh-3adnDaN1Ao07EjR2PhgE62PGLPgO8SMwJBku1urQ,10469
-pip/_vendor/rich/ansi.py,sha256=Avs1LHbSdcyOvDOdpELZUoULcBiYewY76eNBp6uFBhs,6921
-pip/_vendor/rich/bar.py,sha256=ldbVHOzKJOnflVNuv1xS7g6dLX2E3wMnXkdPbpzJTcs,3263
-pip/_vendor/rich/box.py,sha256=nr5fYIUghB_iUCEq6y0Z3LlCT8gFPDrzN9u2kn7tJl4,10831
-pip/_vendor/rich/cells.py,sha256=KrQkj5-LghCCpJLSNQIyAZjndc4bnEqOEmi5YuZ9UCY,5130
-pip/_vendor/rich/color.py,sha256=3HSULVDj7qQkXUdFWv78JOiSZzfy5y1nkcYhna296V0,18211
-pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
-pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
-pip/_vendor/rich/console.py,sha256=_RJizBQIn9qxr4Ln7Q_SC5N9ekPWPAxH0KGVxsgg69Y,100565
-pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
-pip/_vendor/rich/containers.py,sha256=c_56TxcedGYqDepHBMTuZdUIijitAQgnox-Qde0Z1qo,5502
-pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630
-pip/_vendor/rich/default_styles.py,sha256=khQFqqaoDs3bprMqWpHw8nO5UpG2DN6QtuTd6LzZwYc,8257
-pip/_vendor/rich/diagnose.py,sha256=WNPjU2pEdrPICJ24KOaTD_hzP839qArpmF1JIM5x_EQ,998
-pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501
-pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
-pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683
-pip/_vendor/rich/filesize.py,sha256=_iz9lIpRgvW7MNSeCZnLg-HwzbP4GETg543WqD8SFs0,2484
-pip/_vendor/rich/highlighter.py,sha256=G_sn-8DKjM1sEjLG_oc4ovkWmiUpWvj8bXi0yed2LnY,9586
-pip/_vendor/rich/json.py,sha256=vVEoKdawoJRjAFayPwXkMBPLy7RSTs-f44wSQDR2nJ0,5031
-pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252
-pip/_vendor/rich/layout.py,sha256=ajkSFAtEVv9EFTcFs-w4uZfft7nEXhNzL7ZVdgrT5rI,14004
-pip/_vendor/rich/live.py,sha256=DhzAPEnjTxQuq9_0Y2xh2MUwQcP_aGPkenLfKETslwM,14270
-pip/_vendor/rich/live_render.py,sha256=zJtB471jGziBtEwxc54x12wEQtH4BuQr1SA8v9kU82w,3666
-pip/_vendor/rich/logging.py,sha256=ZgpKMMBY_BuMAI_BYzo-UtXak6t5oH9VK8m9Q2Lm0f4,12458
-pip/_vendor/rich/markup.py,sha256=3euGKP5s41NCQwaSjTnJxus5iZMHjxpIM0W6fCxra38,8451
-pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
-pip/_vendor/rich/padding.py,sha256=KVEI3tOwo9sgK1YNSuH__M1_jUWmLZwRVV_KmOtVzyM,4908
-pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
-pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396
-pip/_vendor/rich/panel.py,sha256=SUDaa3z4MU7vIjzvbi0SXuc6BslDzADwdY1AX4TbTdY,11225
-pip/_vendor/rich/pretty.py,sha256=gy3S72u4FRg2ytoo7N1ZDWDIvB4unbzd5iUGdgm-8fc,36391
-pip/_vendor/rich/progress.py,sha256=MtmCjTk5zYU_XtRHxRHTAEHG6hF9PeF7EMWbEPleIC0,60357
-pip/_vendor/rich/progress_bar.py,sha256=mZTPpJUwcfcdgQCTTz3kyY-fc79ddLwtx6Ghhxfo064,8162
-pip/_vendor/rich/prompt.py,sha256=l0RhQU-0UVTV9e08xW1BbIj0Jq2IXyChX4lC0lFNzt4,12447
-pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391
-pip/_vendor/rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
-pip/_vendor/rich/repr.py,sha256=5MZJZmONgC6kud-QW-_m1okXwL2aR6u6y-pUcUCJz28,4431
-pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602
-pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843
-pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591
-pip/_vendor/rich/segment.py,sha256=otnKeKGEV-WRlQVosfJVeFDcDxAKHpvJ_hLzSu5lumM,24743
-pip/_vendor/rich/spinner.py,sha256=PT5qgXPG3ZpqRj7n3EZQ6NW56mx3ldZqZCU7gEMyZk4,4364
-pip/_vendor/rich/status.py,sha256=kkPph3YeAZBo-X-4wPp8gTqZyU466NLwZBA4PZTTewo,4424
-pip/_vendor/rich/style.py,sha256=xpj4uMBZMtuNuNomfUiamigl3p1sDvTCZwrG1tcTVeg,27059
-pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258
-pip/_vendor/rich/syntax.py,sha256=qqAnEUZ4K57Po81_5RBxnsuU4KRzSdvDPAhKw8ma_3E,35763
-pip/_vendor/rich/table.py,sha256=ZmT7V7MMCOYKw7TGY9SZLyYDf6JdM-WVf07FdVuVhTI,40049
-pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
-pip/_vendor/rich/text.py,sha256=AO7JPCz6-gaN1thVLXMBntEmDPVYFgFNG1oM61_sanU,47552
-pip/_vendor/rich/theme.py,sha256=oNyhXhGagtDlbDye3tVu3esWOWk0vNkuxFw-_unlaK0,3771
-pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
-pip/_vendor/rich/traceback.py,sha256=ZA8Q67DyP5a_stpIh6GPf9IiXj_s3dAhDIr6Zbfkahk,35170
-pip/_vendor/rich/tree.py,sha256=yWnQ6rAvRGJ3qZGqBrxS2SW2TKBTNrP0SdY8QxOFPuw,9451
-pip/_vendor/tomli/__init__.py,sha256=PhNw_eyLgdn7McJ6nrAN8yIm3dXC75vr1sVGVVwDSpA,314
-pip/_vendor/tomli/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/tomli/__pycache__/_parser.cpython-310.pyc,,
-pip/_vendor/tomli/__pycache__/_re.cpython-310.pyc,,
-pip/_vendor/tomli/__pycache__/_types.cpython-310.pyc,,
-pip/_vendor/tomli/_parser.py,sha256=9w8LG0jB7fwmZZWB0vVXbeejDHcl4ANIJxB2scEnDlA,25591
-pip/_vendor/tomli/_re.py,sha256=sh4sBDRgO94KJZwNIrgdcyV_qQast50YvzOAUGpRDKA,3171
-pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
-pip/_vendor/tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
-pip/_vendor/tomli_w/__init__.py,sha256=0F8yDtXx3Uunhm874KrAcP76srsM98y7WyHQwCulZbo,169
-pip/_vendor/tomli_w/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/tomli_w/__pycache__/_writer.cpython-310.pyc,,
-pip/_vendor/tomli_w/_writer.py,sha256=dsifFS2xYf1i76mmRyfz9y125xC7Z_HQ845ZKhJsYXs,6961
-pip/_vendor/tomli_w/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
-pip/_vendor/truststore/__init__.py,sha256=2wRSVijjRzPLVXUzWqvdZLNsEOhDfopKLd2EKAYLwKU,1320
-pip/_vendor/truststore/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/truststore/__pycache__/_api.cpython-310.pyc,,
-pip/_vendor/truststore/__pycache__/_macos.cpython-310.pyc,,
-pip/_vendor/truststore/__pycache__/_openssl.cpython-310.pyc,,
-pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-310.pyc,,
-pip/_vendor/truststore/__pycache__/_windows.cpython-310.pyc,,
-pip/_vendor/truststore/_api.py,sha256=40I0ojO2DnITiHvOnUYvJ1bfQMBKHOkci14noNxEnCs,11246
-pip/_vendor/truststore/_macos.py,sha256=nZlLkOmszUE0g6ryRwBVGY5COzPyudcsiJtDWarM5LQ,20503
-pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324
-pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130
-pip/_vendor/truststore/_windows.py,sha256=rAHyKYD8M7t-bXfG8VgOVa3TpfhVhbt4rZQlO45YuP8,17993
-pip/_vendor/truststore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/typing_extensions.py,sha256=ipKHUPtZCqL6c-HfvGl-9t0opsXcSL72y4GYjyJXs_g,172702
-pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
-pip/_vendor/urllib3/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/urllib3/__pycache__/_collections.cpython-310.pyc,,
-pip/_vendor/urllib3/__pycache__/_version.cpython-310.pyc,,
-pip/_vendor/urllib3/__pycache__/connection.cpython-310.pyc,,
-pip/_vendor/urllib3/__pycache__/connectionpool.cpython-310.pyc,,
-pip/_vendor/urllib3/__pycache__/exceptions.cpython-310.pyc,,
-pip/_vendor/urllib3/__pycache__/fields.cpython-310.pyc,,
-pip/_vendor/urllib3/__pycache__/filepost.cpython-310.pyc,,
-pip/_vendor/urllib3/__pycache__/poolmanager.cpython-310.pyc,,
-pip/_vendor/urllib3/__pycache__/request.cpython-310.pyc,,
-pip/_vendor/urllib3/__pycache__/response.cpython-310.pyc,,
-pip/_vendor/urllib3/_collections.py,sha256=pyASJJhW7wdOpqJj9QJA8FyGRfr8E8uUUhqUvhF0728,11372
-pip/_vendor/urllib3/_version.py,sha256=t9wGB6ooOTXXgiY66K1m6BZS1CJyXHAU8EoWDTe6Shk,64
-pip/_vendor/urllib3/connection.py,sha256=ttIA909BrbTUzwkqEe_TzZVh4JOOj7g61Ysei2mrwGg,20314
-pip/_vendor/urllib3/connectionpool.py,sha256=e2eiAwNbFNCKxj4bwDKNK-w7HIdSz3OmMxU_TIt-evQ,40408
-pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-310.pyc,,
-pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-310.pyc,,
-pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-310.pyc,,
-pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-310.pyc,,
-pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-310.pyc,,
-pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-310.pyc,,
-pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
-pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-310.pyc,,
-pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-310.pyc,,
-pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
-pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
-pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036
-pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528
-pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081
-pip/_vendor/urllib3/contrib/securetransport.py,sha256=Fef1IIUUFHqpevzXiDPbIGkDKchY2FVKeVeLGR1Qq3g,34446
-pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
-pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
-pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
-pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
-pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/urllib3/packages/__pycache__/six.cpython-310.pyc,,
-pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-310.pyc,,
-pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-310.pyc,,
-pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
-pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343
-pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
-pip/_vendor/urllib3/poolmanager.py,sha256=aWyhXRtNO4JUnCSVVqKTKQd8EXTvUm1VN9pgs2bcONo,19990
-pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691
-pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641
-pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
-pip/_vendor/urllib3/util/__pycache__/__init__.cpython-310.pyc,,
-pip/_vendor/urllib3/util/__pycache__/connection.cpython-310.pyc,,
-pip/_vendor/urllib3/util/__pycache__/proxy.cpython-310.pyc,,
-pip/_vendor/urllib3/util/__pycache__/queue.cpython-310.pyc,,
-pip/_vendor/urllib3/util/__pycache__/request.cpython-310.pyc,,
-pip/_vendor/urllib3/util/__pycache__/response.cpython-310.pyc,,
-pip/_vendor/urllib3/util/__pycache__/retry.cpython-310.pyc,,
-pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-310.pyc,,
-pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-310.pyc,,
-pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-310.pyc,,
-pip/_vendor/urllib3/util/__pycache__/timeout.cpython-310.pyc,,
-pip/_vendor/urllib3/util/__pycache__/url.cpython-310.pyc,,
-pip/_vendor/urllib3/util/__pycache__/wait.cpython-310.pyc,,
-pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
-pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
-pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
-pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
-pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
-pip/_vendor/urllib3/util/retry.py,sha256=6ENvOZ8PBDzh8kgixpql9lIrb2dxH-k7ZmBanJF2Ng4,22050
-pip/_vendor/urllib3/util/ssl_.py,sha256=QDuuTxPSCj1rYtZ4xpD7Ux-r20TD50aHyqKyhQ7Bq4A,17460
-pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
-pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
-pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
-pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296
-pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
-pip/_vendor/vendor.txt,sha256=Fym1hhuw75IJOl33NPi5nIJJc66DioBSUWrVRIVtRUE,373
-pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
diff --git a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/REQUESTED b/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/REQUESTED
deleted file mode 100644
index e69de29..0000000
diff --git a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/WHEEL b/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/WHEEL
deleted file mode 100644
index f6e58ac..0000000
--- a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: setuptools (79.0.0)
-Root-Is-Purelib: true
-Tag: py3-none-any
-
diff --git a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/entry_points.txt b/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/entry_points.txt
deleted file mode 100644
index 25fcf7e..0000000
--- a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/entry_points.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-[console_scripts]
-pip = pip._internal.cli.main:main
-pip3 = pip._internal.cli.main:main
diff --git a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/licenses/AUTHORS.txt b/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/licenses/AUTHORS.txt
deleted file mode 100644
index 08441a0..0000000
--- a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/licenses/AUTHORS.txt
+++ /dev/null
@@ -1,821 +0,0 @@
-@Switch01
-A_Rog
-Aakanksha Agrawal
-Abhinav Sagar
-ABHYUDAY PRATAP SINGH
-abs51295
-AceGentile
-Adam Chainz
-Adam Tse
-Adam Turner
-Adam Wentz
-admin
-Adolfo Ochagavía
-Adrien Morison
-Agus
-ahayrapetyan
-Ahilya
-AinsworthK
-Akash Srivastava
-Alan Yee
-Albert Tugushev
-Albert-Guan
-albertg
-Alberto Sottile
-Aleks Bunin
-Ales Erjavec
-Alethea Flowers
-Alex Gaynor
-Alex Grönholm
-Alex Hedges
-Alex Loosley
-Alex Morega
-Alex Stachowiak
-Alexander Regueiro
-Alexander Shtyrov
-Alexandre Conrad
-Alexey Popravka
-Aleš Erjavec
-Alli
-Ami Fischman
-Ananya Maiti
-Anatoly Techtonik
-Anders Kaseorg
-Andre Aguiar
-Andreas Lutro
-Andrei Geacar
-Andrew Gaul
-Andrew Shymanel
-Andrey Bienkowski
-Andrey Bulgakov
-Andrés Delfino
-Andy Freeland
-Andy Kluger
-Ani Hayrapetyan
-Aniruddha Basak
-Anish Tambe
-Anrs Hu
-Anthony Sottile
-Antoine Musso
-Anton Ovchinnikov
-Anton Patrushev
-Anton Zelenov
-Antonio Alvarado Hernandez
-Antony Lee
-Antti Kaihola
-Anubhav Patel
-Anudit Nagar
-Anuj Godase
-AQNOUCH Mohammed
-AraHaan
-arena
-arenasys
-Arindam Choudhury
-Armin Ronacher
-Arnon Yaari
-Artem
-Arun Babu Neelicattu
-Ashley Manton
-Ashwin Ramaswami
-atse
-Atsushi Odagiri
-Avinash Karhana
-Avner Cohen
-Awit (Ah-Wit) Ghirmai
-Baptiste Mispelon
-Barney Gale
-barneygale
-Bartek Ogryczak
-Bastian Venthur
-Ben Bodenmiller
-Ben Darnell
-Ben Hoyt
-Ben Mares
-Ben Rosser
-Bence Nagy
-Benjamin Peterson
-Benjamin VanEvery
-Benoit Pierre
-Berker Peksag
-Bernard
-Bernard Tyers
-Bernardo B. Marques
-Bernhard M. Wiedemann
-Bertil Hatt
-Bhavam Vidyarthi
-Blazej Michalik
-Bogdan Opanchuk
-BorisZZZ
-Brad Erickson
-Bradley Ayers
-Bradley Reynolds
-Branch Vincent
-Brandon L. Reiss
-Brandt Bucher
-Brannon Dorsey
-Brett Randall
-Brett Rosen
-Brian Cristante
-Brian Rosner
-briantracy
-BrownTruck
-Bruno Oliveira
-Bruno Renié
-Bruno S
-Bstrdsmkr
-Buck Golemon
-burrows
-Bussonnier Matthias
-bwoodsend
-c22
-Caleb Brown
-Caleb Martinez
-Calvin Smith
-Carl Meyer
-Carlos Liam
-Carol Willing
-Carter Thayer
-Cass
-Chandrasekhar Atina
-Charlie Marsh
-charwick
-Chih-Hsuan Yen
-Chris Brinker
-Chris Hunt
-Chris Jerdonek
-Chris Kuehl
-Chris Markiewicz
-Chris McDonough
-Chris Pawley
-Chris Pryer
-Chris Wolfe
-Christian Clauss
-Christian Heimes
-Christian Oudard
-Christoph Reiter
-Christopher Hunt
-Christopher Snyder
-chrysle
-cjc7373
-Clark Boylan
-Claudio Jolowicz
-Clay McClure
-Cody
-Cody Soyland
-Colin Watson
-Collin Anderson
-Connor Osborn
-Cooper Lees
-Cooper Ry Lees
-Cory Benfield
-Cory Wright
-Craig Kerstiens
-Cristian Sorinel
-Cristina
-Cristina Muñoz
-ctg123
-Curtis Doty
-cytolentino
-Daan De Meyer
-Dale
-Damian
-Damian Quiroga
-Damian Shaw
-Dan Black
-Dan Savilonis
-Dan Sully
-Dane Hillard
-daniel
-Daniel Collins
-Daniel Hahler
-Daniel Holth
-Daniel Jost
-Daniel Katz
-Daniel Shaulov
-Daniele Esposti
-Daniele Nicolodi
-Daniele Procida
-Daniil Konovalenko
-Danny Hermes
-Danny McClanahan
-Darren Kavanagh
-Dav Clark
-Dave Abrahams
-Dave Jones
-David Aguilar
-David Black
-David Bordeynik
-David Caro
-David D Lowe
-David Evans
-David Hewitt
-David Linke
-David Poggi
-David Poznik
-David Pursehouse
-David Runge
-David Tucker
-David Wales
-Davidovich
-ddelange
-Deepak Sharma
-Deepyaman Datta
-Denise Yu
-dependabot[bot]
-derwolfe
-Desetude
-developer
-Devesh Kumar Singh
-devsagul
-Diego Caraballo
-Diego Ramirez
-DiegoCaraballo
-Dimitri Merejkowsky
-Dimitri Papadopoulos
-Dimitri Papadopoulos Orfanos
-Dirk Stolle
-Dmitry Gladkov
-Dmitry Volodin
-Domen Kožar
-Dominic Davis-Foster
-Donald Stufft
-Dongweiming
-doron zarhi
-Dos Moonen
-Douglas Thor
-DrFeathers
-Dustin Ingram
-Dustin Rodrigues
-Dwayne Bailey
-Ed Morley
-Edgar Ramírez
-Edgar Ramírez Mondragón
-Ee Durbin
-Efflam Lemaillet
-efflamlemaillet
-Eitan Adler
-ekristina
-elainechan
-Eli Schwartz
-Elisha Hollander
-Ellen Marie Dash
-Emil Burzo
-Emil Styrke
-Emmanuel Arias
-Endoh Takanao
-enoch
-Erdinc Mutlu
-Eric Cousineau
-Eric Gillingham
-Eric Hanchrow
-Eric Hopper
-Erik M. Bray
-Erik Rose
-Erwin Janssen
-Eugene Vereshchagin
-everdimension
-Federico
-Felipe Peter
-Felix Yan
-fiber-space
-Filip Kokosiński
-Filipe Laíns
-Finn Womack
-finnagin
-Flavio Amurrio
-Florian Briand
-Florian Rathgeber
-Francesco
-Francesco Montesano
-Fredrik Orderud
-Fredrik Roubert
-Frost Ming
-Gabriel Curio
-Gabriel de Perthuis
-Garry Polley
-gavin
-gdanielson
-Geoffrey Sneddon
-George Margaritis
-George Song
-Georgi Valkov
-Georgy Pchelkin
-ghost
-Giftlin Rajaiah
-gizmoguy1
-gkdoc
-Godefroid Chapelle
-Gopinath M
-GOTO Hayato
-gousaiyang
-gpiks
-Greg Roodt
-Greg Ward
-Guilherme Espada
-Guillaume Seguin
-gutsytechster
-Guy Rozendorn
-Guy Tuval
-gzpan123
-Hanjun Kim
-Hari Charan
-Harsh Vardhan
-harupy
-Harutaka Kawamura
-hauntsaninja
-Henrich Hartzer
-Henry Schreiner
-Herbert Pfennig
-Holly Stotelmyer
-Honnix
-Hsiaoming Yang
-Hugo Lopes Tavares
-Hugo van Kemenade
-Hugues Bruant
-Hynek Schlawack
-Ian Bicking
-Ian Cordasco
-Ian Lee
-Ian Stapleton Cordasco
-Ian Wienand
-Igor Kuzmitshov
-Igor Sobreira
-Ikko Ashimine
-Ilan Schnell
-Illia Volochii
-Ilya Baryshev
-Inada Naoki
-Ionel Cristian Mărieș
-Ionel Maries Cristian
-Itamar Turner-Trauring
-iTrooz
-Ivan Pozdeev
-J. Nick Koston
-Jacob Kim
-Jacob Walls
-Jaime Sanz
-Jake Lishman
-jakirkham
-Jakub Kuczys
-Jakub Stasiak
-Jakub Vysoky
-Jakub Wilk
-James Cleveland
-James Curtin
-James Firth
-James Gerity
-James Polley
-Jan Pokorný
-Jannis Leidel
-Jarek Potiuk
-jarondl
-Jason Curtis
-Jason R. Coombs
-JasonMo
-JasonMo1
-Jay Graves
-Jean Abou Samra
-Jean-Christophe Fillion-Robin
-Jeff Barber
-Jeff Dairiki
-Jeff Widman
-Jelmer Vernooij
-jenix21
-Jeremy Fleischman
-Jeremy Stanley
-Jeremy Zafran
-Jesse Rittner
-Jiashuo Li
-Jim Fisher
-Jim Garrison
-Jinzhe Zeng
-Jiun Bae
-Jivan Amara
-Joa
-Joe Bylund
-Joe Michelini
-Johannes Altmanninger
-John Paton
-John Sirois
-John T. Wodder II
-John-Scott Atlakson
-johnthagen
-Jon Banafato
-Jon Dufresne
-Jon Parise
-Jonas Nockert
-Jonathan Herbert
-Joonatan Partanen
-Joost Molenaar
-Jorge Niedbalski
-Joseph Bylund
-Joseph Long
-Josh Bronson
-Josh Cannon
-Josh Hansen
-Josh Schneier
-Joshua
-JoshuaPerdue
-Juan Luis Cano Rodríguez
-Juanjo Bazán
-Judah Rand
-Julian Berman
-Julian Gethmann
-Julien Demoor
-July Tikhonov
-Jussi Kukkonen
-Justin van Heek
-jwg4
-Jyrki Pulliainen
-Kai Chen
-Kai Mueller
-Kamal Bin Mustafa
-Karolina Surma
-kasium
-kaustav haldar
-keanemind
-Keith Maxwell
-Kelsey Hightower
-Kenneth Belitzky
-Kenneth Reitz
-Kevin Burke
-Kevin Carter
-Kevin Frommelt
-Kevin R Patterson
-Kexuan Sun
-Kit Randel
-Klaas van Schelven
-KOLANICH
-konstin
-kpinc
-Krishan Bhasin
-Krishna Oza
-Kumar McMillan
-Kuntal Majumder
-Kurt McKee
-Kyle Persohn
-lakshmanaram
-Laszlo Kiss-Kollar
-Laurent Bristiel
-Laurent LAPORTE
-Laurie O
-Laurie Opperman
-layday
-Leon Sasson
-Lev Givon
-Lincoln de Sousa
-Lipis
-lorddavidiii
-Loren Carvalho
-Lucas Cimon
-Ludovic Gasc
-Luis Medel
-Lukas Geiger
-Lukas Juhrich
-Luke Macken
-Luo Jiebin
-luojiebin
-luz.paz
-László Kiss Kollár
-M00nL1ght
-Malcolm Smith
-Marc Abramowitz
-Marc Tamlyn
-Marcus Smith
-Mariatta
-Mark Kohler
-Mark McLoughlin
-Mark Williams
-Markus Hametner
-Martey Dodoo
-Martin Fischer
-Martin Häcker
-Martin Pavlasek
-Masaki
-Masklinn
-Matej Stuchlik
-Mathew Jennings
-Mathieu Bridon
-Mathieu Kniewallner
-Matt Bacchi
-Matt Good
-Matt Maker
-Matt Robenolt
-Matt Wozniski
-matthew
-Matthew Einhorn
-Matthew Feickert
-Matthew Gilliard
-Matthew Hughes
-Matthew Iversen
-Matthew Treinish
-Matthew Trumbell
-Matthew Willson
-Matthias Bussonnier
-mattip
-Maurits van Rees
-Max W Chase
-Maxim Kurnikov
-Maxime Rouyrre
-mayeut
-mbaluna
-Md Sujauddin Sekh
-mdebi
-memoselyk
-meowmeowcat
-Michael
-Michael Aquilina
-Michael E. Karpeles
-Michael Klich
-Michael Mintz
-Michael Williamson
-michaelpacer
-Michał Górny
-Mickaël Schoentgen
-Miguel Araujo Perez
-Mihir Singh
-Mike
-Mike Hendricks
-Min RK
-MinRK
-Miro Hrončok
-Monica Baluna
-montefra
-Monty Taylor
-morotti
-mrKazzila
-Muha Ajjan
-Nadav Wexler
-Nahuel Ambrosini
-Nate Coraor
-Nate Prewitt
-Nathan Houghton
-Nathaniel J. Smith
-Nehal J Wani
-Neil Botelho
-Nguyễn Gia Phong
-Nicholas Serra
-Nick Coghlan
-Nick Stenning
-Nick Timkovich
-Nicolas Bock
-Nicole Harris
-Nikhil Benesch
-Nikhil Ladha
-Nikita Chepanov
-Nikolay Korolev
-Nipunn Koorapati
-Nitesh Sharma
-Niyas Sait
-Noah
-Noah Gorny
-Nowell Strite
-NtaleGrey
-nucccc
-nvdv
-OBITORASU
-Ofek Lev
-ofrinevo
-Oleg Burnaev
-Oliver Freund
-Oliver Jeeves
-Oliver Mannion
-Oliver Tonnhofer
-Olivier Girardot
-Olivier Grisel
-Ollie Rutherfurd
-OMOTO Kenji
-Omry Yadan
-onlinejudge95
-Oren Held
-Oscar Benjamin
-Oz N Tiram
-Pachwenko
-Patrick Dubroy
-Patrick Jenkins
-Patrick Lawson
-patricktokeeffe
-Patrik Kopkan
-Paul Ganssle
-Paul Kehrer
-Paul Moore
-Paul Nasrat
-Paul Oswald
-Paul van der Linden
-Paulus Schoutsen
-Pavel Safronov
-Pavithra Eswaramoorthy
-Pawel Jasinski
-Paweł Szramowski
-Pekka Klärck
-Peter Gessler
-Peter Lisák
-Peter Shen
-Peter Waller
-Petr Viktorin
-petr-tik
-Phaneendra Chiruvella
-Phil Elson
-Phil Freo
-Phil Pennock
-Phil Whelan
-Philip Jägenstedt
-Philip Molloy
-Philippe Ombredanne
-Pi Delport
-Pierre-Yves Rofes
-Pieter Degroote
-pip
-Prabakaran Kumaresshan
-Prabhjyotsing Surjit Singh Sodhi
-Prabhu Marappan
-Pradyun Gedam
-Prashant Sharma
-Pratik Mallya
-pre-commit-ci[bot]
-Preet Thakkar
-Preston Holmes
-Przemek Wrzos
-Pulkit Goyal
-q0w
-Qiangning Hong
-Qiming Xu
-Quentin Lee
-Quentin Pradet
-R. David Murray
-Rafael Caricio
-Ralf Schmitt
-Ran Benita
-Randy Döring
-Razzi Abuissa
-rdb
-Reece Dunham
-Remi Rampin
-Rene Dudfield
-Riccardo Magliocchetti
-Riccardo Schirone
-Richard Jones
-Richard Si
-Ricky Ng-Adam
-Rishi
-rmorotti
-RobberPhex
-Robert Collins
-Robert McGibbon
-Robert Pollak
-Robert T. McGibbon
-robin elisha robinson
-Roey Berman
-Rohan Jain
-Roman Bogorodskiy
-Roman Donchenko
-Romuald Brunet
-ronaudinho
-Ronny Pfannschmidt
-Rory McCann
-Ross Brattain
-Roy Wellington Ⅳ
-Ruairidh MacLeod
-Russell Keith-Magee
-Ryan Shepherd
-Ryan Wooden
-ryneeverett
-S. Guliaev
-Sachi King
-Salvatore Rinchiera
-sandeepkiran-js
-Sander Van Balen
-Savio Jomton
-schlamar
-Scott Kitterman
-Sean
-seanj
-Sebastian Jordan
-Sebastian Schaetz
-Segev Finer
-SeongSoo Cho
-Sergey Vasilyev
-Seth Michael Larson
-Seth Woodworth
-Shahar Epstein
-Shantanu
-shenxianpeng
-shireenrao
-Shivansh-007
-Shixian Sheng
-Shlomi Fish
-Shovan Maity
-Simeon Visser
-Simon Cross
-Simon Pichugin
-sinoroc
-sinscary
-snook92
-socketubs
-Sorin Sbarnea
-Srinivas Nyayapati
-Srishti Hegde
-Stavros Korokithakis
-Stefan Scherfke
-Stefano Rivera
-Stephan Erb
-Stephen Rosen
-stepshal
-Steve (Gadget) Barnes
-Steve Barnes
-Steve Dower
-Steve Kowalik
-Steven Myint
-Steven Silvester
-stonebig
-studioj
-Stéphane Bidoul
-Stéphane Bidoul (ACSONE)
-Stéphane Klein
-Sumana Harihareswara
-Surbhi Sharma
-Sviatoslav Sydorenko
-Sviatoslav Sydorenko (Святослав Сидоренко)
-Swat009
-Sylvain
-Takayuki SHIMIZUKAWA
-Taneli Hukkinen
-tbeswick
-Thiago
-Thijs Triemstra
-Thomas Fenzl
-Thomas Grainger
-Thomas Guettler
-Thomas Johansson
-Thomas Kluyver
-Thomas Smith
-Thomas VINCENT
-Tim D. Smith
-Tim Gates
-Tim Harder
-Tim Heap
-tim smith
-tinruufu
-Tobias Hermann
-Tom Forbes
-Tom Freudenheim
-Tom V
-Tomas Hrnciar
-Tomas Orsava
-Tomer Chachamu
-Tommi Enenkel | AnB
-Tomáš Hrnčiar
-Tony Beswick
-Tony Narlock
-Tony Zhaocheng Tan
-TonyBeswick
-toonarmycaptain
-Toshio Kuratomi
-toxinu
-Travis Swicegood
-Tushar Sadhwani
-Tzu-ping Chung
-Valentin Haenel
-Victor Stinner
-victorvpaulo
-Vikram - Google
-Viktor Szépe
-Ville Skyttä
-Vinay Sajip
-Vincent Philippon
-Vinicyus Macedo
-Vipul Kumar
-Vitaly Babiy
-Vladimir Fokow
-Vladimir Rutsky
-W. Trevor King
-Wil Tan
-Wilfred Hughes
-William Edwards
-William ML Leslie
-William T Olson
-William Woodruff
-Wilson Mo
-wim glenn
-Winson Luk
-Wolfgang Maier
-Wu Zhenyu
-XAMES3
-Xavier Fernandez
-Xianpeng Shen
-xoviat
-xtreak
-YAMAMOTO Takashi
-Yen Chi Hsuan
-Yeray Diaz Diaz
-Yoval P
-Yu Jian
-Yuan Jing Vincent Yan
-Yusuke Hayashi
-Zearin
-Zhiping Deng
-ziebam
-Zvezdan Petkovic
-Łukasz Langa
-Роман Донченко
-Семён Марьясин
diff --git a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/licenses/LICENSE.txt b/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/licenses/LICENSE.txt
deleted file mode 100644
index 8e7b65e..0000000
--- a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/licenses/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)
-
-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.
diff --git a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/top_level.txt b/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/top_level.txt
deleted file mode 100644
index a1b589e..0000000
--- a/blog-app/venv/Lib/site-packages/pip-25.1.1.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/blog-app/venv/Lib/site-packages/pip/__init__.py b/blog-app/venv/Lib/site-packages/pip/__init__.py
deleted file mode 100644
index d4b19f0..0000000
--- a/blog-app/venv/Lib/site-packages/pip/__init__.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from typing import List, Optional
-
-__version__ = "25.1.1"
-
-
-def main(args: Optional[List[str]] = None) -> int:
-    """This is an internal API only meant for use by pip's own console scripts.
-
-    For additional details, see https://github.com/pypa/pip/issues/7498.
-    """
-    from pip._internal.utils.entrypoints import _wrapper
-
-    return _wrapper(args)
diff --git a/blog-app/venv/Lib/site-packages/pip/__main__.py b/blog-app/venv/Lib/site-packages/pip/__main__.py
deleted file mode 100644
index 5991326..0000000
--- a/blog-app/venv/Lib/site-packages/pip/__main__.py
+++ /dev/null
@@ -1,24 +0,0 @@
-import os
-import sys
-
-# Remove '' and current working directory from the first entry
-# of sys.path, if present to avoid using current directory
-# in pip commands check, freeze, install, list and show,
-# when invoked as python -m pip 
-if sys.path[0] in ("", os.getcwd()):
-    sys.path.pop(0)
-
-# If we are running from a wheel, add the wheel to sys.path
-# This allows the usage python pip-*.whl/pip install pip-*.whl
-if __package__ == "":
-    # __file__ is pip-*.whl/pip/__main__.py
-    # first dirname call strips of '/__main__.py', second strips off '/pip'
-    # Resulting path is the name of the wheel itself
-    # Add that to sys.path so we can import pip
-    path = os.path.dirname(os.path.dirname(__file__))
-    sys.path.insert(0, path)
-
-if __name__ == "__main__":
-    from pip._internal.cli.main import main as _main
-
-    sys.exit(_main())
diff --git a/blog-app/venv/Lib/site-packages/pip/__pip-runner__.py b/blog-app/venv/Lib/site-packages/pip/__pip-runner__.py
deleted file mode 100644
index d6be157..0000000
--- a/blog-app/venv/Lib/site-packages/pip/__pip-runner__.py
+++ /dev/null
@@ -1,50 +0,0 @@
-"""Execute exactly this copy of pip, within a different environment.
-
-This file is named as it is, to ensure that this module can't be imported via
-an import statement.
-"""
-
-# /!\ This version compatibility check section must be Python 2 compatible. /!\
-
-import sys
-
-# Copied from pyproject.toml
-PYTHON_REQUIRES = (3, 9)
-
-
-def version_str(version):  # type: ignore
-    return ".".join(str(v) for v in version)
-
-
-if sys.version_info[:2] < PYTHON_REQUIRES:
-    raise SystemExit(
-        "This version of pip does not support python {} (requires >={}).".format(
-            version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES)
-        )
-    )
-
-# From here on, we can use Python 3 features, but the syntax must remain
-# Python 2 compatible.
-
-import runpy  # noqa: E402
-from importlib.machinery import PathFinder  # noqa: E402
-from os.path import dirname  # noqa: E402
-
-PIP_SOURCES_ROOT = dirname(dirname(__file__))
-
-
-class PipImportRedirectingFinder:
-    @classmethod
-    def find_spec(self, fullname, path=None, target=None):  # type: ignore
-        if fullname != "pip":
-            return None
-
-        spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target)
-        assert spec, (PIP_SOURCES_ROOT, fullname)
-        return spec
-
-
-sys.meta_path.insert(0, PipImportRedirectingFinder())
-
-assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module"
-runpy.run_module("pip", run_name="__main__", alter_sys=True)
diff --git a/blog-app/venv/Lib/site-packages/pip/__pycache__/__init__.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/__pycache__/__init__.cpython-310.pyc
deleted file mode 100644
index b12e3a847b20be71f296d58b8256348003e43837..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 658
zcmYk4QEL=25P*~2z3a7F@WGdYVBX}w?op|<7LjU8K`7UP_2pPta+m3C=x!1+*(+P>
zll}*PgMVpXeey5(SupOobFu2atP;Go0%!Vrc#KxPyD3gtoK0DVK`q708+8SBk
z4PU*^_wv1IpGm*Oe&`{z-YkgXza->EJt4)XWE59PB>2KPyXW`pE2k6EyYE+(MnOXw
zp-li!^~L+kkHVU|6Aefc#I^OJMG*5&IPG4bu(w7mtU+6Yz=hW?V7|2_NX{r!Dy9E|
z3I##x8ea+o5LE~ck0z6)4plqP7q*$W&dCYYoM^-raB{H!<}hCu^0ApQ??>gWm(GEw
zYj{qPdHIhrZv&Oi!35tqOS|ZYF(>gEO>6%L^CR+qHz!BMX9SPMR4;5TvA8gB>h%hW
z53L8;uJ=!2Ra{lDds*q?vI~_p#Tmuk6!Y3HcL}0cfms#jdS0LouYH&@$svS`EKuomWWSG+L%QYUh+b
zC2&DE-TC-KSIkHYE-C$G`1piCEUKab4Lg;!ajwkdvMl)#QiLI~NY
SH(;TE8XU8b57-Cp|N9Tg>Wm)%

diff --git a/blog-app/venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-310.pyc
deleted file mode 100644
index 3c9b5df52eda4811ecc96aaf4f1f9b0e2d29579d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1656
zcmZ`3+iv4TbY|=}&ZTX7Q3Wf6{IFaiZNu_}gi5JsyU-O%L(?K*1&yYjNiwZtyEBu}
zbW;gPdE_737bN%uKEpY;BiL+CGixxWf<
z*#^*m0^%q@9CH%k0COiG+~srEC~yQmbvfblzmT_)AZJLuFXnjRW?nq_Gr@2t6MPHs
zGtT7{f&%PbpS^z9bLXV1VdyJQ?RtY86_c$^j7^fG5Fw~CNhS-Fr&^w1(9JYq24l$V;!^q$F>3uR5=QrWTzLHdJb-P#7wj{pe-?S%p&9B43`TH6FJw~3w0
z9yMjUpI6bL0BIsLGVV?lG(s!p)q-wD7V=7Y3WqWD+?k{1ZI%tX!DDPl7muA==gJ+s
zdi^;vWQ;p`caB|9MjDv|>8Lr%h9@g_zzwQX5oXoqev`Hijt_VCTJ-SX;0O$JwTL>I
z*BL~Sbun{O@I0G0Om&5UzrgpO45(EQ`yPO{Gsq(@u97Nt@#W+H_p$!k2r#b!YCTG=
zI!dz=rPFqUbA{6L0m}`6TRDUR)O`WP$aAIl46&81Y(1!DK#u|RJRlDdT*djDRnccM
zru6dT9TwZvLxK8ll&T#C3@Rhuu+;w47PSJxj-Zu1;K?n`iYziv-Fl>Jt670ko`hhd
z1NUI5`Q6c12Mv0-_s#MC;a)4R#jNtGP-WanvQlfLVOZ>4NR!QX64hrWm;>R^E34D-
z63LT#pM@~Wgc{|!3kr#@+k7b7MAjiY#3)sEf=rz(LUzKTBUwXv~hL0>d)pC`r;eP-@RJ@!3

diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/__init__.py b/blog-app/venv/Lib/site-packages/pip/_internal/__init__.py
deleted file mode 100644
index 1a5b7f8..0000000
--- a/blog-app/venv/Lib/site-packages/pip/_internal/__init__.py
+++ /dev/null
@@ -1,18 +0,0 @@
-from typing import List, Optional
-
-from pip._internal.utils import _log
-
-# init_logging() must be called before any call to logging.getLogger()
-# which happens at import of most modules.
-_log.init_logging()
-
-
-def main(args: Optional[List[str]] = None) -> int:
-    """This is preserved for old console scripts that may still be referencing
-    it.
-
-    For additional details, see https://github.com/pypa/pip/issues/7498.
-    """
-    from pip._internal.utils.entrypoints import _wrapper
-
-    return _wrapper(args)
diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-310.pyc
deleted file mode 100644
index 4e58b4719ed2e28985dcb345b3c521e419befa5b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 720
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
B;LQL4

diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-310.pyc
deleted file mode 100644
index 81425bc7850cf3c55a68dcab88975eb099cc691a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 11673
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

diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-310.pyc
deleted file mode 100644
index b508d760936fa446e082467544fb3e7547aa2add..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 644
zcmYjP!D`$v5S47N>n;uS&`Y3DT^G7`4~4X$gwTYX!Y0u4vKWHanq7<7me9ysT+&nf
z9liILeC?^f&{Ib)gbbReCovkm8Oa8fJ1!94w*_I*(PeH(jT++OhupABKt$9*diK}OO1ZauB_Lllg(;Oq}$<`
zI`F;gD!Tc>B4WYM$ngb%;wlQae&d|o^LzH4Q|9>V&zoAKpkW;#xIHMbHBOjDiOO_n
z8W31HZ9NKKOD|eE2=uyX#0G?eEjZ{Z-RfqezJ(M4N2eO~`&tYHQ
z)Udp+b$LDb+H~aw#om>h#_X0PqTEBbFE90`MD1Z|WpyWafMqD)K~~X9-Q{)|lR$zL
z4Dc+?A{YM3g0B|onEJs|^IUi-7ZZ#zdN;;Y#uPQ_egscLNcN#Ms&C*V^k&NXoQe1!
D2S%-1

diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-310.pyc
deleted file mode 100644
index b1ad683ef5784e250ff5fc4df3b33fb38516430c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3787
zcmb7H&2JmW72la%l1p+)>dUs|$m!NiBNMO~8)%w9aGf+!in>r`Ax>+QU_h)mLvrQi
zEM2bj_g0|jU(#bwb1ION|Ahdy``#?SWEcgy!VYI<-{<)Uilvwn88S3)QSG3b*g{Ox(UBDuzHz#h9Hd@WP7=K
zu4mWnUcR0u1~-oi%zBU!Z)=WXy%=U;mI<6*sb17P*`VC3)GK(9VTW4}sNA@q8j#e;sptEMu484i`T
z=gU~xcl)s)g{I@5;0xa4VGI(M?}Re;g1|%O
zPlSksx-ua=7#@h|h_~X827WMQlj_QEeJTC0^ZL)AsM6taQ_Qs}Gdes{S;6Ch2wMa_
znLId0TR(iPO
zWaDngcZGk<8y^h>_Xc`@mmfDi>+u}lV`~7#Cei(BBfqJJu?56qS!bhXEcFh_>=R*^``;
zDtCxZgiK{xUEX@2oXJ{CQ-y&94ZQ#E&G*#Y%qE(tYzbM~2mM-F6AxPpJ)J%knBc+E
zp8p$gn0QW}lCd?JQ$cl4BeO%hAoime1Po0(7OH{;%q0bIHJ2D2=H_S7UsXx}vC%@aZ(jfwFGc$3_j%`!k|hm=`k8>HO@9d`kDYe2+a
zV#vMNWLeb2a$_UBp4g(p?8H7cL}x<9fQkWC{w$x^%-#UKGx{}6V~8&jt3QehN5wOT
z6`m5un5~Mq8pA7MV{Y8#?kpQ?m?Li64|uImaN#-d1Y`&tXSt)-
zxHr!(cia87C$$LJ6fWi`hn!{Z!6yeUq@N4tzr}Sm{lMLiLOv6Mf@V*Td*OnZt|!B-
z*o9gV_$@yUhOX@Mmf!X{tIY(=Y}R=Vmh3^*z#8vH?bNBX^lZu3xi=FtJr4gcueBpF6EefVbva&6fMGupFUpD6EU;HN21ujDJaR=8
z#q;#5YW1W0E{nKy!zgy)R^*;Qu0w=7y*4rK*kSCrA@?yD?$$J!wtx$kvpm*kZ_8~*
zgOJrmnL*s%ejl0*n}-lk0A_#WXbiTcz7|Gzc75p`2Jq!Ir_J>x0Ib`gov96TQ@b9x
z=ON;QKBV<$Ka^6*6J$n*|F`Jr0hJ&&jnqUIo`^5TV9P5Rr3zYm97TatnUgN(!DwZ^
zb^8}TyHR_;c4L$psmW?ua1+Xrx6^E<$=+;Msc_-G5>*^<2AJh0{m5wZPK-$C@VMAK
zpgGWE0BEuXoY#RK8#hlz;pi9Z={K)u-7sjM%t
zatiG0l@;}QsB&0O1OHHE0;sjn9)K#QOz0m~7OFtci&Z|&QzWtmu^*^>+Yg~Vfr=*_
zl#P9hz$;mlaLD8EBN(a`@fOa1io@GDY{8&PP(A1Eh05bn@W{?N}7nKt-QBIm@zu-zrd&ec|NoY=PLOtvPYW&Qjnl>osV2
zK~4JH{*t~dWE}#0#B#EvOvMLaNOe<{XBgKIV(~8efq{cIc_>v88sPvADO?^>V7I8U
z@vsj$B1|O2_DE!K+c}1d5U8NTh3MVDts->1wI+1KEE2-TovRBwwKNeyRBZuWse`E2
zHQ}^buJK1LuK&Z4I)l=XV+N=z=LyjTIhU-{LRp7!lG0pR1|Ho;>NL?9EJRMnP&do=
ztzN_i0l$siuKYO+wqXNy4p}1wS|AQ}=o)o0E9QztEsP`0WFbBfz1f?kO6

diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc
deleted file mode 100644
index 88d273657f683dbcf0a59f0b387ded161a718a1e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6890
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

diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-310.pyc
deleted file mode 100644
index bf98d4afbed38ccabd10640e6c5c5652f9ee4a0b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8387
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
U Union[Tuple[str], Tuple[str, str]]:
-    return (a, b) if a != b else (a,)
-
-
-class _Prefix:
-    def __init__(self, path: str) -> None:
-        self.path = path
-        self.setup = False
-        scheme = get_scheme("", prefix=path)
-        self.bin_dir = scheme.scripts
-        self.lib_dirs = _dedup(scheme.purelib, scheme.platlib)
-
-
-def get_runnable_pip() -> str:
-    """Get a file to pass to a Python executable, to run the currently-running pip.
-
-    This is used to run a pip subprocess, for installing requirements into the build
-    environment.
-    """
-    source = pathlib.Path(pip_location).resolve().parent
-
-    if not source.is_dir():
-        # This would happen if someone is using pip from inside a zip file. In that
-        # case, we can use that directly.
-        return str(source)
-
-    return os.fsdecode(source / "__pip-runner__.py")
-
-
-def _get_system_sitepackages() -> Set[str]:
-    """Get system site packages
-
-    Usually from site.getsitepackages,
-    but fallback on `get_purelib()/get_platlib()` if unavailable
-    (e.g. in a virtualenv created by virtualenv<20)
-
-    Returns normalized set of strings.
-    """
-    if hasattr(site, "getsitepackages"):
-        system_sites = site.getsitepackages()
-    else:
-        # virtualenv < 20 overwrites site.py without getsitepackages
-        # fallback on get_purelib/get_platlib.
-        # this is known to miss things, but shouldn't in the cases
-        # where getsitepackages() has been removed (inside a virtualenv)
-        system_sites = [get_purelib(), get_platlib()]
-    return {os.path.normcase(path) for path in system_sites}
-
-
-class BuildEnvironment:
-    """Creates and manages an isolated environment to install build deps"""
-
-    def __init__(self) -> None:
-        temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True)
-
-        self._prefixes = OrderedDict(
-            (name, _Prefix(os.path.join(temp_dir.path, name)))
-            for name in ("normal", "overlay")
-        )
-
-        self._bin_dirs: List[str] = []
-        self._lib_dirs: List[str] = []
-        for prefix in reversed(list(self._prefixes.values())):
-            self._bin_dirs.append(prefix.bin_dir)
-            self._lib_dirs.extend(prefix.lib_dirs)
-
-        # Customize site to:
-        # - ensure .pth files are honored
-        # - prevent access to system site packages
-        system_sites = _get_system_sitepackages()
-
-        self._site_dir = os.path.join(temp_dir.path, "site")
-        if not os.path.exists(self._site_dir):
-            os.mkdir(self._site_dir)
-        with open(
-            os.path.join(self._site_dir, "sitecustomize.py"), "w", encoding="utf-8"
-        ) as fp:
-            fp.write(
-                textwrap.dedent(
-                    """
-                import os, site, sys
-
-                # First, drop system-sites related paths.
-                original_sys_path = sys.path[:]
-                known_paths = set()
-                for path in {system_sites!r}:
-                    site.addsitedir(path, known_paths=known_paths)
-                system_paths = set(
-                    os.path.normcase(path)
-                    for path in sys.path[len(original_sys_path):]
-                )
-                original_sys_path = [
-                    path for path in original_sys_path
-                    if os.path.normcase(path) not in system_paths
-                ]
-                sys.path = original_sys_path
-
-                # Second, add lib directories.
-                # ensuring .pth file are processed.
-                for path in {lib_dirs!r}:
-                    assert not path in sys.path
-                    site.addsitedir(path)
-                """
-                ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)
-            )
-
-    def __enter__(self) -> None:
-        self._save_env = {
-            name: os.environ.get(name, None)
-            for name in ("PATH", "PYTHONNOUSERSITE", "PYTHONPATH")
-        }
-
-        path = self._bin_dirs[:]
-        old_path = self._save_env["PATH"]
-        if old_path:
-            path.extend(old_path.split(os.pathsep))
-
-        pythonpath = [self._site_dir]
-
-        os.environ.update(
-            {
-                "PATH": os.pathsep.join(path),
-                "PYTHONNOUSERSITE": "1",
-                "PYTHONPATH": os.pathsep.join(pythonpath),
-            }
-        )
-
-    def __exit__(
-        self,
-        exc_type: Optional[Type[BaseException]],
-        exc_val: Optional[BaseException],
-        exc_tb: Optional[TracebackType],
-    ) -> None:
-        for varname, old_value in self._save_env.items():
-            if old_value is None:
-                os.environ.pop(varname, None)
-            else:
-                os.environ[varname] = old_value
-
-    def check_requirements(
-        self, reqs: Iterable[str]
-    ) -> Tuple[Set[Tuple[str, str]], Set[str]]:
-        """Return 2 sets:
-        - conflicting requirements: set of (installed, wanted) reqs tuples
-        - missing requirements: set of reqs
-        """
-        missing = set()
-        conflicting = set()
-        if reqs:
-            env = (
-                get_environment(self._lib_dirs)
-                if hasattr(self, "_lib_dirs")
-                else get_default_environment()
-            )
-            for req_str in reqs:
-                req = get_requirement(req_str)
-                # We're explicitly evaluating with an empty extra value, since build
-                # environments are not provided any mechanism to select specific extras.
-                if req.marker is not None and not req.marker.evaluate({"extra": ""}):
-                    continue
-                dist = env.get_distribution(req.name)
-                if not dist:
-                    missing.add(req_str)
-                    continue
-                if isinstance(dist.version, Version):
-                    installed_req_str = f"{req.name}=={dist.version}"
-                else:
-                    installed_req_str = f"{req.name}==={dist.version}"
-                if not req.specifier.contains(dist.version, prereleases=True):
-                    conflicting.add((installed_req_str, req_str))
-                # FIXME: Consider direct URL?
-        return conflicting, missing
-
-    def install_requirements(
-        self,
-        finder: "PackageFinder",
-        requirements: Iterable[str],
-        prefix_as_string: str,
-        *,
-        kind: str,
-    ) -> None:
-        prefix = self._prefixes[prefix_as_string]
-        assert not prefix.setup
-        prefix.setup = True
-        if not requirements:
-            return
-        self._install_requirements(
-            get_runnable_pip(),
-            finder,
-            requirements,
-            prefix,
-            kind=kind,
-        )
-
-    @staticmethod
-    def _install_requirements(
-        pip_runnable: str,
-        finder: "PackageFinder",
-        requirements: Iterable[str],
-        prefix: _Prefix,
-        *,
-        kind: str,
-    ) -> None:
-        args: List[str] = [
-            sys.executable,
-            pip_runnable,
-            "install",
-            "--ignore-installed",
-            "--no-user",
-            "--prefix",
-            prefix.path,
-            "--no-warn-script-location",
-            "--disable-pip-version-check",
-            # As the build environment is ephemeral, it's wasteful to
-            # pre-compile everything, especially as not every Python
-            # module will be used/compiled in most cases.
-            "--no-compile",
-            # The prefix specified two lines above, thus
-            # target from config file or env var should be ignored
-            "--target",
-            "",
-        ]
-        if logger.getEffectiveLevel() <= logging.DEBUG:
-            args.append("-vv")
-        elif logger.getEffectiveLevel() <= VERBOSE:
-            args.append("-v")
-        for format_control in ("no_binary", "only_binary"):
-            formats = getattr(finder.format_control, format_control)
-            args.extend(
-                (
-                    "--" + format_control.replace("_", "-"),
-                    ",".join(sorted(formats or {":none:"})),
-                )
-            )
-
-        index_urls = finder.index_urls
-        if index_urls:
-            args.extend(["-i", index_urls[0]])
-            for extra_index in index_urls[1:]:
-                args.extend(["--extra-index-url", extra_index])
-        else:
-            args.append("--no-index")
-        for link in finder.find_links:
-            args.extend(["--find-links", link])
-
-        if finder.proxy:
-            args.extend(["--proxy", finder.proxy])
-        for host in finder.trusted_hosts:
-            args.extend(["--trusted-host", host])
-        if finder.custom_cert:
-            args.extend(["--cert", finder.custom_cert])
-        if finder.client_cert:
-            args.extend(["--client-cert", finder.client_cert])
-        if finder.allow_all_prereleases:
-            args.append("--pre")
-        if finder.prefer_binary:
-            args.append("--prefer-binary")
-        args.append("--")
-        args.extend(requirements)
-        with open_spinner(f"Installing {kind}") as spinner:
-            call_subprocess(
-                args,
-                command_desc=f"pip subprocess to install {kind}",
-                spinner=spinner,
-            )
-
-
-class NoOpBuildEnvironment(BuildEnvironment):
-    """A no-op drop-in replacement for BuildEnvironment"""
-
-    def __init__(self) -> None:
-        pass
-
-    def __enter__(self) -> None:
-        pass
-
-    def __exit__(
-        self,
-        exc_type: Optional[Type[BaseException]],
-        exc_val: Optional[BaseException],
-        exc_tb: Optional[TracebackType],
-    ) -> None:
-        pass
-
-    def cleanup(self) -> None:
-        pass
-
-    def install_requirements(
-        self,
-        finder: "PackageFinder",
-        requirements: Iterable[str],
-        prefix_as_string: str,
-        *,
-        kind: str,
-    ) -> None:
-        raise NotImplementedError()
diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cache.py b/blog-app/venv/Lib/site-packages/pip/_internal/cache.py
deleted file mode 100644
index 97d9171..0000000
--- a/blog-app/venv/Lib/site-packages/pip/_internal/cache.py
+++ /dev/null
@@ -1,289 +0,0 @@
-"""Cache Management"""
-
-import hashlib
-import json
-import logging
-import os
-from pathlib import Path
-from typing import Any, Dict, List, Optional
-
-from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version
-from pip._vendor.packaging.utils import canonicalize_name
-
-from pip._internal.exceptions import InvalidWheelFilename
-from pip._internal.models.direct_url import DirectUrl
-from pip._internal.models.link import Link
-from pip._internal.models.wheel import Wheel
-from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
-from pip._internal.utils.urls import path_to_url
-
-logger = logging.getLogger(__name__)
-
-ORIGIN_JSON_NAME = "origin.json"
-
-
-def _hash_dict(d: Dict[str, str]) -> str:
-    """Return a stable sha224 of a dictionary."""
-    s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True)
-    return hashlib.sha224(s.encode("ascii")).hexdigest()
-
-
-class Cache:
-    """An abstract class - provides cache directories for data from links
-
-    :param cache_dir: The root of the cache.
-    """
-
-    def __init__(self, cache_dir: str) -> None:
-        super().__init__()
-        assert not cache_dir or os.path.isabs(cache_dir)
-        self.cache_dir = cache_dir or None
-
-    def _get_cache_path_parts(self, link: Link) -> List[str]:
-        """Get parts of part that must be os.path.joined with cache_dir"""
-
-        # We want to generate an url to use as our cache key, we don't want to
-        # just reuse the URL because it might have other items in the fragment
-        # and we don't care about those.
-        key_parts = {"url": link.url_without_fragment}
-        if link.hash_name is not None and link.hash is not None:
-            key_parts[link.hash_name] = link.hash
-        if link.subdirectory_fragment:
-            key_parts["subdirectory"] = link.subdirectory_fragment
-
-        # Include interpreter name, major and minor version in cache key
-        # to cope with ill-behaved sdists that build a different wheel
-        # depending on the python version their setup.py is being run on,
-        # and don't encode the difference in compatibility tags.
-        # https://github.com/pypa/pip/issues/7296
-        key_parts["interpreter_name"] = interpreter_name()
-        key_parts["interpreter_version"] = interpreter_version()
-
-        # Encode our key url with sha224, we'll use this because it has similar
-        # security properties to sha256, but with a shorter total output (and
-        # thus less secure). However the differences don't make a lot of
-        # difference for our use case here.
-        hashed = _hash_dict(key_parts)
-
-        # We want to nest the directories some to prevent having a ton of top
-        # level directories where we might run out of sub directories on some
-        # FS.
-        parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]]
-
-        return parts
-
-    def _get_candidates(self, link: Link, canonical_package_name: str) -> List[Any]:
-        can_not_cache = not self.cache_dir or not canonical_package_name or not link
-        if can_not_cache:
-            return []
-
-        path = self.get_path_for_link(link)
-        if os.path.isdir(path):
-            return [(candidate, path) for candidate in os.listdir(path)]
-        return []
-
-    def get_path_for_link(self, link: Link) -> str:
-        """Return a directory to store cached items in for link."""
-        raise NotImplementedError()
-
-    def get(
-        self,
-        link: Link,
-        package_name: Optional[str],
-        supported_tags: List[Tag],
-    ) -> Link:
-        """Returns a link to a cached item if it exists, otherwise returns the
-        passed link.
-        """
-        raise NotImplementedError()
-
-
-class SimpleWheelCache(Cache):
-    """A cache of wheels for future installs."""
-
-    def __init__(self, cache_dir: str) -> None:
-        super().__init__(cache_dir)
-
-    def get_path_for_link(self, link: Link) -> str:
-        """Return a directory to store cached wheels for link
-
-        Because there are M wheels for any one sdist, we provide a directory
-        to cache them in, and then consult that directory when looking up
-        cache hits.
-
-        We only insert things into the cache if they have plausible version
-        numbers, so that we don't contaminate the cache with things that were
-        not unique. E.g. ./package might have dozens of installs done for it
-        and build a version of 0.0...and if we built and cached a wheel, we'd
-        end up using the same wheel even if the source has been edited.
-
-        :param link: The link of the sdist for which this will cache wheels.
-        """
-        parts = self._get_cache_path_parts(link)
-        assert self.cache_dir
-        # Store wheels within the root cache_dir
-        return os.path.join(self.cache_dir, "wheels", *parts)
-
-    def get(
-        self,
-        link: Link,
-        package_name: Optional[str],
-        supported_tags: List[Tag],
-    ) -> Link:
-        candidates = []
-
-        if not package_name:
-            return link
-
-        canonical_package_name = canonicalize_name(package_name)
-        for wheel_name, wheel_dir in self._get_candidates(link, canonical_package_name):
-            try:
-                wheel = Wheel(wheel_name)
-            except InvalidWheelFilename:
-                continue
-            if canonicalize_name(wheel.name) != canonical_package_name:
-                logger.debug(
-                    "Ignoring cached wheel %s for %s as it "
-                    "does not match the expected distribution name %s.",
-                    wheel_name,
-                    link,
-                    package_name,
-                )
-                continue
-            if not wheel.supported(supported_tags):
-                # Built for a different python/arch/etc
-                continue
-            candidates.append(
-                (
-                    wheel.support_index_min(supported_tags),
-                    wheel_name,
-                    wheel_dir,
-                )
-            )
-
-        if not candidates:
-            return link
-
-        _, wheel_name, wheel_dir = min(candidates)
-        return Link(path_to_url(os.path.join(wheel_dir, wheel_name)))
-
-
-class EphemWheelCache(SimpleWheelCache):
-    """A SimpleWheelCache that creates it's own temporary cache directory"""
-
-    def __init__(self) -> None:
-        self._temp_dir = TempDirectory(
-            kind=tempdir_kinds.EPHEM_WHEEL_CACHE,
-            globally_managed=True,
-        )
-
-        super().__init__(self._temp_dir.path)
-
-
-class CacheEntry:
-    def __init__(
-        self,
-        link: Link,
-        persistent: bool,
-    ):
-        self.link = link
-        self.persistent = persistent
-        self.origin: Optional[DirectUrl] = None
-        origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME
-        if origin_direct_url_path.exists():
-            try:
-                self.origin = DirectUrl.from_json(
-                    origin_direct_url_path.read_text(encoding="utf-8")
-                )
-            except Exception as e:
-                logger.warning(
-                    "Ignoring invalid cache entry origin file %s for %s (%s)",
-                    origin_direct_url_path,
-                    link.filename,
-                    e,
-                )
-
-
-class WheelCache(Cache):
-    """Wraps EphemWheelCache and SimpleWheelCache into a single Cache
-
-    This Cache allows for gracefully degradation, using the ephem wheel cache
-    when a certain link is not found in the simple wheel cache first.
-    """
-
-    def __init__(self, cache_dir: str) -> None:
-        super().__init__(cache_dir)
-        self._wheel_cache = SimpleWheelCache(cache_dir)
-        self._ephem_cache = EphemWheelCache()
-
-    def get_path_for_link(self, link: Link) -> str:
-        return self._wheel_cache.get_path_for_link(link)
-
-    def get_ephem_path_for_link(self, link: Link) -> str:
-        return self._ephem_cache.get_path_for_link(link)
-
-    def get(
-        self,
-        link: Link,
-        package_name: Optional[str],
-        supported_tags: List[Tag],
-    ) -> Link:
-        cache_entry = self.get_cache_entry(link, package_name, supported_tags)
-        if cache_entry is None:
-            return link
-        return cache_entry.link
-
-    def get_cache_entry(
-        self,
-        link: Link,
-        package_name: Optional[str],
-        supported_tags: List[Tag],
-    ) -> Optional[CacheEntry]:
-        """Returns a CacheEntry with a link to a cached item if it exists or
-        None. The cache entry indicates if the item was found in the persistent
-        or ephemeral cache.
-        """
-        retval = self._wheel_cache.get(
-            link=link,
-            package_name=package_name,
-            supported_tags=supported_tags,
-        )
-        if retval is not link:
-            return CacheEntry(retval, persistent=True)
-
-        retval = self._ephem_cache.get(
-            link=link,
-            package_name=package_name,
-            supported_tags=supported_tags,
-        )
-        if retval is not link:
-            return CacheEntry(retval, persistent=False)
-
-        return None
-
-    @staticmethod
-    def record_download_origin(cache_dir: str, download_info: DirectUrl) -> None:
-        origin_path = Path(cache_dir) / ORIGIN_JSON_NAME
-        if origin_path.exists():
-            try:
-                origin = DirectUrl.from_json(origin_path.read_text(encoding="utf-8"))
-            except Exception as e:
-                logger.warning(
-                    "Could not read origin file %s in cache entry (%s). "
-                    "Will attempt to overwrite it.",
-                    origin_path,
-                    e,
-                )
-            else:
-                # TODO: use DirectUrl.equivalent when
-                # https://github.com/pypa/pip/pull/10564 is merged.
-                if origin.url != download_info.url:
-                    logger.warning(
-                        "Origin URL %s in cache entry %s does not match download URL "
-                        "%s. This is likely a pip bug or a cache corruption issue. "
-                        "Will overwrite it with the new value.",
-                        origin.url,
-                        cache_dir,
-                        download_info.url,
-                    )
-        origin_path.write_text(download_info.to_json(), encoding="utf-8")
diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/__init__.py b/blog-app/venv/Lib/site-packages/pip/_internal/cli/__init__.py
deleted file mode 100644
index 5fcddf5..0000000
--- a/blog-app/venv/Lib/site-packages/pip/_internal/cli/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-"""Subpackage containing all of pip's command line interface related code"""
-
-# This file intentionally does not import submodules
diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-310.pyc
deleted file mode 100644
index 8d967f9b7c68f5b3eea5b56171f750d75aa00755..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 298
zcmYjMv1-FG5S6pk6!Hfhw3Q65$3iJ3v>{VT18J9XAY|!cACV;^$%eFJzox&GwSUp6
zvgwcq_m21O;NH3U{E{VHEpMBz)PF{Cjx32~s*oqr?49Xs#}>1X^{%fvsSdJ6uAGgM
zEZLe%W4PP%j=JlR{I-==b3+z6*@%8G6>^V8M$~DnakI!y7eZ*Kg!pEDmX1vH`}uSS
zZvlOP4Jl`2fESA^PXoeZ?@{)Xzrq1t8!WaB!S)y%XJMUo4^SCb7qaVMKs&%QRS+m*
n@t-(A3RsFMl9i@ZhDwnnMImmw<0-#yo$d`jjNgYbRL=eY3|U%`

diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc
deleted file mode 100644
index a00cfebba25e53eef9e0fb13927bd414b0bef9c4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5475
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

diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-310.pyc
deleted file mode 100644
index 29ba712aab36742ab8c6c65c59c8ce716be02957..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 24975
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

0toV~=l+_}5cw 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 U8+pXT)!)S}(!$l>ApH;i0pOgmu>b%7 diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-310.pyc deleted file mode 100644 index 882a02b7ed11c6cf632aed908d2f26f0e7392732..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3021 zcmZuz%WvGq8J`()xm@l;tA}OFc3Rd=-EL9Ibz2}nAP7mMxHVwNLS!Srb_Igk8LcSs zm6@UJU2ub-N`YQ_=-CLcx)kW4|4t8c?J37zT{P-9!&Ry%B{3gozWL_yJ%7yFZ4be7 z|AY6A|J6n4pL%fpsl(s{XyPA0DC#4MDT#3(n=k1T^R@aGe683{YW-T`^qr*MuVXE1 z$8OT-H%z}4dr7n3G<_#-CGCDY>GV5hT#px$Zoiu>_7~0AjhB+;{<7&e;+5o9|5mcv zUxl$pn{!zyLVU`NXi=l)GKTN65Ugw#X^5rq}lQ2sCJmiA$ zufZ~Cw`VE)StO)#pXV~l(lA!F7eyYk9#-8ElL0T%G(3!1kViT2ykSB!BPn`BEp2D% zQ8cQS?wM`XJ1=t@>eF}FQCP%M{Eo%>lZ+>!l#Iio_ApBlxS0rOG?Z#ZpCY0pibEb; zO~Fa6?Mm!p&NIDiLCe7VIk!IA z#Wk4qs58Q}PTen&Y|dI2Xa}9++h|H?W7aOo1;_`T5`p`?$>VKvZDHJ0-A~-~lJO~M z{Zrv@KYKd4>-{7Ljs4BJp|r=-Lby|F1S$q9OczOw#8KGVTS z6#3PAZ?O-KtBV5s%f}E}WaF3o7Hpte^ZN!-dX)VQ@ppjv_Vexc2QMKK#b7rYW^pJ6 z&r`O;qcb-6r~uOxhQGtk1}~1;`rdIg*c;2^EFC-n+0(&coQ>AQJRh8~^lb1fIvj{d zvh_S1o`UjX09Jbh=RwdxR6iQV(W7hev5}9Jw;4m^!_D%opJ`QHAP#a!_tLqXJp6u4 zZEVKbFpR|(bgmXE?DZD7jv}s?^EME*Mk8Tz#+)v4P?6CfAy?y4mwz#V#Bjb1i3?|WG)T)!GBZ|0@=2YKI>4RI#=|!M|OK; z;vGimqw4s{(!SAD%*Pw-HG|M68Q3BZ<*{&u3g--_%Gn2ERaCG)FV{V9T6?Jq)Cn;=^@pD+h`&+`wd*2HGS$W4$*2jlSZ~wE#eORnF#Er5akdfW?BT z<~0MWy2f|-!{A$bnFgn!&efrEff*RYs*MVxVIoEq*O*D;$+e2M0K*+e$kwxABWq<3G{ zgMenkATWO6oBHSvfhb3gbNKJ!L~}HVa$B=+gHjvc0@21{5ydnBXBzkQ7r#3TFjb+# zo$v8Cs$%{>uu-cwWaj@>*IaXB7ceEOe%?#~sTFV34 z8S2}tnd;lBS?b%a+4wd?r=6?ibb7}M-FCi~Zx?EXcCl7$mujVUxmIphYL)g>ZA$gA z!|C?1+A&pk!kPALZMHpEn^X6>@OXQ^Hs3x`JE3b_A1?5ddwT8EO^vxM|4?IjZmgf) zF>8xxDX=11ihL3G&)~kq%D6A1#~HLdi3%T-;vaj)AIJdUe5Xf)I@js!$HSCv0dxd>6xW!Cd7PFhq zr&?2I4$D0(VaHtVtml};-KNFztnkpPT-ILZF00_8=PsLK(+}-hfgQ_QEH=Yt z@kWu&?YA6f^Jpot6CCfJ)UuHm*h#cj*r|!u(`*r~Q|uYMeI^^hVb3xTt<#@smR384 zT{7c`SC#eUWhTv_~ z1T{Z0=$XA4uw<=jNhe*>pNXiU&)#Z^N*gWlpS72baF9BT6Tk#7*iF-=#{`_-f9 zJo2r_ws+;@?bjb07d)A3-}gncov4MxyxSnj8hsp8=u!*$BUD=2wl&b#HBlZ|L!D|& zKdJ3Onou{yLe>hMPFoXmVC}#*Z&>1aJhPZFF!v1VJ+${UaSd-d%>Meqhu69vBFzwT6X(MXapa{eLfb*(Wt^p6@lHcH6&*h4?UCoOvN^ zpBFVpCN$%;=XaRb=82ER$4iC%VJ_2a?X2@<&x4^2VSbz5`FJf77^s_E@WQCmqFVKW z$Cp}{z4PZTHqTw~&Rx8ia{FBM@OT-IFOR0owBJjqIoumVgMQ4Ots)ZpJ(TtdlF?ZD7M)_N3ls?L}^p2wu3ib7g6oA?#F_x1}CQt>>BXK}>~D6E2GOzVz5t(WlU8Wq&$ z^n%fU=_o-xS|em`jr$C`@sxg%&?~W=LuCNRzhMZ6oF?k#2{LWgvdrC5o-P&u5!z$p zazPP1QnT04cxVN(k||6!?Qft+sDm!1pRoHaYKj zYEmWE=<78D0kO{(u|HVQJQ%1Gc@Thx2o#5w_WSgUg*!z5W$)wd!ehhps+M>a6w6ZP z324?>x(R=fYzn_C9mdH+RLxXYzD0e_cHBD5*;2+PMd<736_ce|ur0mseGOMtcUc^x z^(oHU7)NpT15^gOs3zd;Iz(c}5JhHe8y$n0;H^G{cLbMVXND&1i;f+z5_{;V9kBNd zv=~2w&m8C|tUYrTFv;bN zEUxhnm6ege)t&xV9r6GumEr`xtXItOJYENiCHSR$n50(VXYb?DiEz*H6b@47< zNFOQ}UARKd1`eqE`XA7EH29p>fAy#}jw{pBl`v}fVf;EOqX7i%E2gvKZWtuun{;QT z8g>hHHMPvc2-KB6rc}H~Pn01h$*SW@bxa33I8w*Psen~{k={RtqB=u}t>d?Oy$*L$ zZ%3>bQoU5K-|P8d_9R!Yv#3$83)%sNo}>%kprl;K9iFFx@T#~*1%WK_ z4i(E(5XrKfA;AU@LyYUu162@6O_xTfcLrBX)Vi9bpEBlhhGjjmbmNIJx{ShCGpA7yM%HbFBTmy&B88v?p-4^veiuUI$Y<_!86u-j>jrQ7 zy)cOb@00=r>8c(GxdRK*Y847uS4OSliJ(_^WWUyhV(@9|Lp-tT5 z54x~Gn4O-sFL-_k=Z#xs#Hq8bsHekY7kPUWlDP8;m6{f-BYQTqDPZuvHu(j(HgBbCY zLVCD^=R>&;i>%P2O+Di?qo?Z@+2wVcyke5u(T31z)Dhu`TWHTKhkpy>8c6|m{#yg1 zMLp@hh*{nMQiV6Yq1`P2v6{ouz)FBwcXU{J^WKetsZ5wO@7#W;S`ps?!Lks&lD@&r6({Qgt`RphJJ&KGTN&4 z0m_nf}T&~kAPN5uNVdRgMta%V$6^) zxbU?yyEI91H7`D-S;%0EkEp0o@q1LPP(iB^G`;wJD!l#TKvT&8F3D zBuj9WI#O|L?kV+~*gZ2~ z4-SG(aijo~MIh^{ECLDVz(BZcQn(Bu0;CukdvJ-W2H1u$ghCk$bL#z<-c}eJ2+T|8 zy(uDSpPzWX*Fx}$>`fL}FCk){_8A)me=X`L%aH&MpxG4YPmKHnS`cw~+A08p6DW9^JxfQtIN>NsuZca^X*5F9#2#eO^dA@}6_Q$q zuf6N0C~IJ>tC;X!f#5>b=wG?Xi4P?E6imThWg%940amFI_A+Be*%4T&loejeilt@b z42l_dXao^qdLWhu34)yrG)WT~FsTQJ88S8YULDi^F_BNqsF(%l37B#A2xc65X}MZD zqzuwT1|ju&q!F@sOKsjw+DRd(#qEj+iH~GUkX1}oW|L~(WTCuuh_;8gRM_NdaAG4j zhHoIcuZ-d;T~MzEu8B`EyNmw;l>^nGj2bil5*be9)NBs5;mD_W` z@eRBL^&a3$&^}5hrCa$B1*b;JuevB=_S0sEJ;5Rd_$ypWx}97Bfi`kir;orHqtuo1 zYR*VhwGCw5WZkeFPt{ZGF$8bYoiE)Hf0AEcee}>v)_}$zIfG^ng;B$9j|q17;aZ zK4118nV~(_KA?<-%1TSSixCo_&aGHl{6Ub6cz70Li0@HBtCc2y z&=^xjWj@R4_?Zj-8+3~+C=BIMEBb=&eqwypKMK1|yf|SvDeNb1lIF&LisJh)o62|^ zEpr>W3T8co=%_%2L`L}-n9{Q=04nf079gOB#F?EY&hE_u%s`!4ZqGmud)pb<1O2`x zzKOj-!WW>)89-f$_vnjp?@l9;rk<6n)NJSl4-F7?{I_;0!f9>s7Cwf|rJV?5C?uGcA=L2CU=a7&m zu_3U{+udYqN$N`~wN}lgq;G>jX{&h^9uE)u?|>+uU@CUNI76SDkf-%0WV zlS20owazbKYYJO8bV#eNVWi@~r1Z?LhSL6Ag%2NTozFKl^}d5V;7^hgf&%>~C0L^U zahPF2gm+9`>$tCI@!d^m2>pG8Ypj2HH1DDQy@~#nfti#McI*sHmfO(8j}Ou1rgU{~ zE1L44>F3bfDI}fDPqk0=PmQLj4g}qSnWiW@-&Q?K=qXW~R$Tdo3Wki~F|_1Jqj&Y; z492kVJv)Fyp47*xKPq^wz{|gmMWZ`KFZ%46^ zw;3RSRH_xHaU=zusqP-Q;{ALhJzRUI3DTd?+~p+Lo04ddkX^e$SF_pF*LsVR>Z3j3H!?a$qeBt)n0cpNRc=GN$d!ewIL}jq zR~J$w;Cw*FJXQuvI%;zeMd7Gi{FG=bD1)j{dK#=dIJky=7UbY%LA{&-2n9(5c|7re z3ZDvP@c)eZnh4!wB^xd~xszqcHyl8covoBdB-Yg_?$rKmdaSFsCUY2r(!-exNh!}0 z2CZ|@pTd+J#F{2K2>nu)5|T($01eds1y@X=dd0zci%~IL8=wWLU_+g~SO75Y6XQw2 z0W8!PpA?W9SbQ=AcYzS-iSbFnaRF{9Ai_BfE_&|a{Su{;DXFaYzwv+AtqED8uxB4Z zQgA|;C(b9pH>jy(EHEWtF?kBYiJeoh^Ul^wK$Ng_{R)!vxx|J2)_0J!$&e(H_utby z_!$R%6OKf$0*yB;(g7i*oQ5Ukd7dM?wq9mByvx2lMm(j~grjQQG!+w7kR(Tp0 z73gYs3`hzQJz?DSGA!O}idOhF6~g}LR_fqYm=SqxoTR1kNEUY-1SEbFhs#Ry{Z107 z-%pI&DKdDI!3`1vaez4Ff_FH>biV2_GKusK3lL3un~~T+L_8zs5nwj(tAbIEDN7io z8Ja%_zm+@*g<-5P@|h@6<3lQFU(y5)36HcIQFjaJEs|-dR+c@8m7WMreU%CfsrCtq z>{t*GT8MNO(s!B5Jb?IX>geqk3en8a;FGzn3c!O(+dF2-Fw6?XZ;=r8lW7y#D-uHp zBVib1uU|Mq{GJ|BT*aglXoa+x(D!v*YA(o!id@K>q7J;G4tw;^aR8V7BmyTJZ=rkD zmPHjy)YTD`*g+e9>5u@6iUT%|&JwTU>7g|X3df$OMG|r@(N75$j#!2=H`U{ZG7M?D z&7@K9qL3E39TgLf<>1Kp3R<3^AJ!;CCulA~+bWb0{4LeUrYmax=Um+?y8Hz$1u7}4 zZseR_8iw(eVH*EsSjI06+xSnzsXSgR8@V~8B+f2QUp+OiV)p8DidvZ?j0|;1DLhG& z64TTPmn^_SQW`T1R+Vj)4pPh1S*=k~tyV&IBPE#9G-_e;41Tn+wEv@xCH!b(33=M2 z7b7IVDVCCFdHPVN@eopl*Gd88!elr4-AcUF4sa4mx!BYlHU%8&3w9)DY% zKyfya>Q_e#Dyu0=X)Ky%^HsJ+ac4{_JeonNgL@@CQh6QXp~cj0sUMuU5P7n|&+8=| R;Z4I5&zRGa7jtj)z-x~#!l+6jcKF}nji?0G{q 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 diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc deleted file mode 100644 index cfb37bb98ad60a0ca28b3ba954f32aded9c00fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmYk2&uW7}5XRTU{Gn9nq0k=k0y(5P7D_2e)DUU98`Mof78c_!afwxNRmiE&(^vA^ zQ(mE`u1OD_VSd9me8a$GhH(W{jAoBL{ z3wo^Yf$`v^9N^S0oH{MKE%X+53UJ(S1|Bv|+w+>9?YhWq3=Cf(dWZBPZ?}%?_Gk!kJCxRs}B!MEz zl28(qa;p$ECyT1!VRfEcye59kC!1K1&9RKLlq{9^Kz2#CpM-f%YM$0)Ep|kTl27t5 zI)r;JNiOm!6=}(fG)$&ZBBrto%SzHHV_ZJu$7cBak+CY_FYQa@wSo?G?UF<77xY$V AtN;K2 diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/autocompletion.py b/blog-app/venv/Lib/site-packages/pip/_internal/cli/autocompletion.py deleted file mode 100644 index 4fa4612..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +++ /dev/null @@ -1,175 +0,0 @@ -"""Logic that powers autocompletion installed by ``pip completion``.""" - -import optparse -import os -import sys -from itertools import chain -from typing import Any, Iterable, List, Optional - -from pip._internal.cli.main_parser import create_main_parser -from pip._internal.commands import commands_dict, create_command -from pip._internal.metadata import get_default_environment - - -def autocomplete() -> None: - """Entry Point for completion of main and subcommand options.""" - # Don't complete if user hasn't sourced bash_completion file. - if "PIP_AUTO_COMPLETE" not in os.environ: - return - # Don't complete if autocompletion environment variables - # are not present - if not os.environ.get("COMP_WORDS") or not os.environ.get("COMP_CWORD"): - return - cwords = os.environ["COMP_WORDS"].split()[1:] - cword = int(os.environ["COMP_CWORD"]) - try: - current = cwords[cword - 1] - except IndexError: - current = "" - - parser = create_main_parser() - subcommands = list(commands_dict) - options = [] - - # subcommand - subcommand_name: Optional[str] = None - for word in cwords: - if word in subcommands: - subcommand_name = word - break - # subcommand options - if subcommand_name is not None: - # special case: 'help' subcommand has no options - if subcommand_name == "help": - sys.exit(1) - # special case: list locally installed dists for show and uninstall - should_list_installed = not current.startswith("-") and subcommand_name in [ - "show", - "uninstall", - ] - if should_list_installed: - env = get_default_environment() - lc = current.lower() - installed = [ - dist.canonical_name - for dist in env.iter_installed_distributions(local_only=True) - if dist.canonical_name.startswith(lc) - and dist.canonical_name not in cwords[1:] - ] - # if there are no dists installed, fall back to option completion - if installed: - for dist in installed: - print(dist) - sys.exit(1) - - should_list_installables = ( - not current.startswith("-") and subcommand_name == "install" - ) - if should_list_installables: - for path in auto_complete_paths(current, "path"): - print(path) - sys.exit(1) - - subcommand = create_command(subcommand_name) - - for opt in subcommand.parser.option_list_all: - if opt.help != optparse.SUPPRESS_HELP: - options += [ - (opt_str, opt.nargs) for opt_str in opt._long_opts + opt._short_opts - ] - - # filter out previously specified options from available options - prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]] - options = [(x, v) for (x, v) in options if x not in prev_opts] - # filter options by current input - options = [(k, v) for k, v in options if k.startswith(current)] - # get completion type given cwords and available subcommand options - completion_type = get_path_completion_type( - cwords, - cword, - subcommand.parser.option_list_all, - ) - # get completion files and directories if ``completion_type`` is - # ````, ``

`` or ```` - if completion_type: - paths = auto_complete_paths(current, completion_type) - options = [(path, 0) for path in paths] - for option in options: - opt_label = option[0] - # append '=' to options which require args - if option[1] and option[0][:2] == "--": - opt_label += "=" - print(opt_label) - else: - # show main parser options only when necessary - - opts = [i.option_list for i in parser.option_groups] - opts.append(parser.option_list) - flattened_opts = chain.from_iterable(opts) - if current.startswith("-"): - for opt in flattened_opts: - if opt.help != optparse.SUPPRESS_HELP: - subcommands += opt._long_opts + opt._short_opts - else: - # get completion type given cwords and all available options - completion_type = get_path_completion_type(cwords, cword, flattened_opts) - if completion_type: - subcommands = list(auto_complete_paths(current, completion_type)) - - print(" ".join([x for x in subcommands if x.startswith(current)])) - sys.exit(1) - - -def get_path_completion_type( - cwords: List[str], cword: int, opts: Iterable[Any] -) -> Optional[str]: - """Get the type of path completion (``file``, ``dir``, ``path`` or None) - - :param cwords: same as the environmental variable ``COMP_WORDS`` - :param cword: same as the environmental variable ``COMP_CWORD`` - :param opts: The available options to check - :return: path completion type (``file``, ``dir``, ``path`` or None) - """ - if cword < 2 or not cwords[cword - 2].startswith("-"): - return None - for opt in opts: - if opt.help == optparse.SUPPRESS_HELP: - continue - for o in str(opt).split("/"): - if cwords[cword - 2].split("=")[0] == o: - if not opt.metavar or any( - x in ("path", "file", "dir") for x in opt.metavar.split("/") - ): - return opt.metavar - return None - - -def auto_complete_paths(current: str, completion_type: str) -> Iterable[str]: - """If ``completion_type`` is ``file`` or ``path``, list all regular files - and directories starting with ``current``; otherwise only list directories - starting with ``current``. - - :param current: The word to be completed - :param completion_type: path completion type(``file``, ``path`` or ``dir``) - :return: A generator of regular files and/or directories - """ - directory, filename = os.path.split(current) - current_path = os.path.abspath(directory) - # Don't complete paths if they can't be accessed - if not os.access(current_path, os.R_OK): - return - filename = os.path.normcase(filename) - # list all files that start with ``filename`` - file_list = ( - x for x in os.listdir(current_path) if os.path.normcase(x).startswith(filename) - ) - for f in file_list: - opt = os.path.join(current_path, f) - comp_file = os.path.normcase(os.path.join(directory, f)) - # complete regular files when there is not ```` after option - # complete directories when there is ````, ```` or - # ````after option - if completion_type != "dir" and os.path.isfile(opt): - yield comp_file - elif os.path.isdir(opt): - yield os.path.join(comp_file, "") diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/base_command.py b/blog-app/venv/Lib/site-packages/pip/_internal/cli/base_command.py deleted file mode 100644 index 1d71d67..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/cli/base_command.py +++ /dev/null @@ -1,233 +0,0 @@ -"""Base Command class, and related routines""" - -import logging -import logging.config -import optparse -import os -import sys -import traceback -from optparse import Values -from typing import List, Optional, Tuple - -from pip._vendor.rich import reconfigure -from pip._vendor.rich import traceback as rich_traceback - -from pip._internal.cli import cmdoptions -from pip._internal.cli.command_context import CommandContextMixIn -from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter -from pip._internal.cli.status_codes import ( - ERROR, - PREVIOUS_BUILD_DIR_ERROR, - UNKNOWN_ERROR, - VIRTUALENV_NOT_FOUND, -) -from pip._internal.exceptions import ( - BadCommand, - CommandError, - DiagnosticPipError, - InstallationError, - NetworkConnectionError, - PreviousBuildDirError, -) -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging -from pip._internal.utils.misc import get_prog, normalize_path -from pip._internal.utils.temp_dir import TempDirectoryTypeRegistry as TempDirRegistry -from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry -from pip._internal.utils.virtualenv import running_under_virtualenv - -__all__ = ["Command"] - -logger = logging.getLogger(__name__) - - -class Command(CommandContextMixIn): - usage: str = "" - ignore_require_venv: bool = False - - def __init__(self, name: str, summary: str, isolated: bool = False) -> None: - super().__init__() - - self.name = name - self.summary = summary - self.parser = ConfigOptionParser( - usage=self.usage, - prog=f"{get_prog()} {name}", - formatter=UpdatingDefaultsHelpFormatter(), - add_help_option=False, - name=name, - description=self.__doc__, - isolated=isolated, - ) - - self.tempdir_registry: Optional[TempDirRegistry] = None - - # Commands should add options to this option group - optgroup_name = f"{self.name.capitalize()} Options" - self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) - - # Add the general options - gen_opts = cmdoptions.make_option_group( - cmdoptions.general_group, - self.parser, - ) - self.parser.add_option_group(gen_opts) - - self.add_options() - - def add_options(self) -> None: - pass - - def handle_pip_version_check(self, options: Values) -> None: - """ - This is a no-op so that commands by default do not do the pip version - check. - """ - # Make sure we do the pip version check if the index_group options - # are present. - assert not hasattr(options, "no_index") - - def run(self, options: Values, args: List[str]) -> int: - raise NotImplementedError - - def _run_wrapper(self, level_number: int, options: Values, args: List[str]) -> int: - def _inner_run() -> int: - try: - return self.run(options, args) - finally: - self.handle_pip_version_check(options) - - if options.debug_mode: - rich_traceback.install(show_locals=True) - return _inner_run() - - try: - status = _inner_run() - assert isinstance(status, int) - return status - except DiagnosticPipError as exc: - logger.error("%s", exc, extra={"rich": True}) - logger.debug("Exception information:", exc_info=True) - - return ERROR - except PreviousBuildDirError as exc: - logger.critical(str(exc)) - logger.debug("Exception information:", exc_info=True) - - return PREVIOUS_BUILD_DIR_ERROR - except ( - InstallationError, - BadCommand, - NetworkConnectionError, - ) as exc: - logger.critical(str(exc)) - logger.debug("Exception information:", exc_info=True) - - return ERROR - except CommandError as exc: - logger.critical("%s", exc) - logger.debug("Exception information:", exc_info=True) - - return ERROR - except BrokenStdoutLoggingError: - # Bypass our logger and write any remaining messages to - # stderr because stdout no longer works. - print("ERROR: Pipe to stdout was broken", file=sys.stderr) - if level_number <= logging.DEBUG: - traceback.print_exc(file=sys.stderr) - - return ERROR - except KeyboardInterrupt: - logger.critical("Operation cancelled by user") - logger.debug("Exception information:", exc_info=True) - - return ERROR - except BaseException: - logger.critical("Exception:", exc_info=True) - - return UNKNOWN_ERROR - - def parse_args(self, args: List[str]) -> Tuple[Values, List[str]]: - # factored out for testability - return self.parser.parse_args(args) - - def main(self, args: List[str]) -> int: - try: - with self.main_context(): - return self._main(args) - finally: - logging.shutdown() - - def _main(self, args: List[str]) -> int: - # We must initialize this before the tempdir manager, otherwise the - # configuration would not be accessible by the time we clean up the - # tempdir manager. - self.tempdir_registry = self.enter_context(tempdir_registry()) - # Intentionally set as early as possible so globally-managed temporary - # directories are available to the rest of the code. - self.enter_context(global_tempdir_manager()) - - options, args = self.parse_args(args) - - # Set verbosity so that it can be used elsewhere. - self.verbosity = options.verbose - options.quiet - if options.debug_mode: - self.verbosity = 2 - - reconfigure(no_color=options.no_color) - level_number = setup_logging( - verbosity=self.verbosity, - no_color=options.no_color, - user_log_file=options.log, - ) - - always_enabled_features = set(options.features_enabled) & set( - cmdoptions.ALWAYS_ENABLED_FEATURES - ) - if always_enabled_features: - logger.warning( - "The following features are always enabled: %s. ", - ", ".join(sorted(always_enabled_features)), - ) - - # Make sure that the --python argument isn't specified after the - # subcommand. We can tell, because if --python was specified, - # we should only reach this point if we're running in the created - # subprocess, which has the _PIP_RUNNING_IN_SUBPROCESS environment - # variable set. - if options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ: - logger.critical( - "The --python option must be placed before the pip subcommand name" - ) - sys.exit(ERROR) - - # TODO: Try to get these passing down from the command? - # without resorting to os.environ to hold these. - # This also affects isolated builds and it should. - - if options.no_input: - os.environ["PIP_NO_INPUT"] = "1" - - if options.exists_action: - os.environ["PIP_EXISTS_ACTION"] = " ".join(options.exists_action) - - if options.require_venv and not self.ignore_require_venv: - # If a venv is required check if it can really be found - if not running_under_virtualenv(): - logger.critical("Could not find an activated virtualenv (required).") - sys.exit(VIRTUALENV_NOT_FOUND) - - if options.cache_dir: - options.cache_dir = normalize_path(options.cache_dir) - if not check_path_owner(options.cache_dir): - logger.warning( - "The directory '%s' or its parent directory is not owned " - "or is not writable by the current user. The cache " - "has been disabled. Check the permissions and owner of " - "that directory. If executing pip with sudo, you should " - "use sudo's -H flag.", - options.cache_dir, - ) - options.cache_dir = None - - return self._run_wrapper(level_number, options, args) diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py b/blog-app/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py deleted file mode 100644 index 8839283..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +++ /dev/null @@ -1,1133 +0,0 @@ -""" -shared options and groups - -The principle here is to define options once, but *not* instantiate them -globally. One reason being that options with action='append' can carry state -between parses. pip parses general options twice internally, and shouldn't -pass on state. To be consistent, all options will follow this design. -""" - -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - -import importlib.util -import logging -import os -import pathlib -import textwrap -from functools import partial -from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values -from textwrap import dedent -from typing import Any, Callable, Dict, Optional, Tuple - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli.parser import ConfigOptionParser -from pip._internal.exceptions import CommandError -from pip._internal.locations import USER_CACHE_DIR, get_src_prefix -from pip._internal.models.format_control import FormatControl -from pip._internal.models.index import PyPI -from pip._internal.models.target_python import TargetPython -from pip._internal.utils.hashes import STRONG_HASHES -from pip._internal.utils.misc import strtobool - -logger = logging.getLogger(__name__) - - -def raise_option_error(parser: OptionParser, option: Option, msg: str) -> None: - """ - Raise an option parsing error using parser.error(). - - Args: - parser: an OptionParser instance. - option: an Option instance. - msg: the error text. - """ - msg = f"{option} error: {msg}" - msg = textwrap.fill(" ".join(msg.split())) - parser.error(msg) - - -def make_option_group(group: Dict[str, Any], parser: ConfigOptionParser) -> OptionGroup: - """ - Return an OptionGroup object - group -- assumed to be dict with 'name' and 'options' keys - parser -- an optparse Parser - """ - option_group = OptionGroup(parser, group["name"]) - for option in group["options"]: - option_group.add_option(option()) - return option_group - - -def check_dist_restriction(options: Values, check_target: bool = False) -> None: - """Function for determining if custom platform options are allowed. - - :param options: The OptionParser options. - :param check_target: Whether or not to check if --target is being used. - """ - dist_restriction_set = any( - [ - options.python_version, - options.platforms, - options.abis, - options.implementation, - ] - ) - - binary_only = FormatControl(set(), {":all:"}) - sdist_dependencies_allowed = ( - options.format_control != binary_only and not options.ignore_dependencies - ) - - # Installations or downloads using dist restrictions must not combine - # source distributions and dist-specific wheels, as they are not - # guaranteed to be locally compatible. - if dist_restriction_set and sdist_dependencies_allowed: - raise CommandError( - "When restricting platform and interpreter constraints using " - "--python-version, --platform, --abi, or --implementation, " - "either --no-deps must be set, or --only-binary=:all: must be " - "set and --no-binary must not be set (or must be set to " - ":none:)." - ) - - if check_target: - if not options.dry_run and dist_restriction_set and not options.target_dir: - raise CommandError( - "Can not use any platform or abi specific options unless " - "installing via '--target' or using '--dry-run'" - ) - - -def _path_option_check(option: Option, opt: str, value: str) -> str: - return os.path.expanduser(value) - - -def _package_name_option_check(option: Option, opt: str, value: str) -> str: - return canonicalize_name(value) - - -class PipOption(Option): - TYPES = Option.TYPES + ("path", "package_name") - TYPE_CHECKER = Option.TYPE_CHECKER.copy() - TYPE_CHECKER["package_name"] = _package_name_option_check - TYPE_CHECKER["path"] = _path_option_check - - -########### -# options # -########### - -help_: Callable[..., Option] = partial( - Option, - "-h", - "--help", - dest="help", - action="help", - help="Show help.", -) - -debug_mode: Callable[..., Option] = partial( - Option, - "--debug", - dest="debug_mode", - action="store_true", - default=False, - help=( - "Let unhandled exceptions propagate outside the main subroutine, " - "instead of logging them to stderr." - ), -) - -isolated_mode: Callable[..., Option] = partial( - Option, - "--isolated", - dest="isolated_mode", - action="store_true", - default=False, - help=( - "Run pip in an isolated mode, ignoring environment variables and user " - "configuration." - ), -) - -require_virtualenv: Callable[..., Option] = partial( - Option, - "--require-virtualenv", - "--require-venv", - dest="require_venv", - action="store_true", - default=False, - help=( - "Allow pip to only run in a virtual environment; " - "exit with an error otherwise." - ), -) - -override_externally_managed: Callable[..., Option] = partial( - Option, - "--break-system-packages", - dest="override_externally_managed", - action="store_true", - help="Allow pip to modify an EXTERNALLY-MANAGED Python installation", -) - -python: Callable[..., Option] = partial( - Option, - "--python", - dest="python", - help="Run pip with the specified Python interpreter.", -) - -verbose: Callable[..., Option] = partial( - Option, - "-v", - "--verbose", - dest="verbose", - action="count", - default=0, - help="Give more output. Option is additive, and can be used up to 3 times.", -) - -no_color: Callable[..., Option] = partial( - Option, - "--no-color", - dest="no_color", - action="store_true", - default=False, - help="Suppress colored output.", -) - -version: Callable[..., Option] = partial( - Option, - "-V", - "--version", - dest="version", - action="store_true", - help="Show version and exit.", -) - -quiet: Callable[..., Option] = partial( - Option, - "-q", - "--quiet", - dest="quiet", - action="count", - default=0, - help=( - "Give less output. Option is additive, and can be used up to 3" - " times (corresponding to WARNING, ERROR, and CRITICAL logging" - " levels)." - ), -) - -progress_bar: Callable[..., Option] = partial( - Option, - "--progress-bar", - dest="progress_bar", - type="choice", - choices=["on", "off", "raw"], - default="on", - help="Specify whether the progress bar should be used [on, off, raw] (default: on)", -) - -log: Callable[..., Option] = partial( - PipOption, - "--log", - "--log-file", - "--local-log", - dest="log", - metavar="path", - type="path", - help="Path to a verbose appending log.", -) - -no_input: Callable[..., Option] = partial( - Option, - # Don't ask for input - "--no-input", - dest="no_input", - action="store_true", - default=False, - help="Disable prompting for input.", -) - -keyring_provider: Callable[..., Option] = partial( - Option, - "--keyring-provider", - dest="keyring_provider", - choices=["auto", "disabled", "import", "subprocess"], - default="auto", - help=( - "Enable the credential lookup via the keyring library if user input is allowed." - " Specify which mechanism to use [auto, disabled, import, subprocess]." - " (default: %default)" - ), -) - -proxy: Callable[..., Option] = partial( - Option, - "--proxy", - dest="proxy", - type="str", - default="", - help="Specify a proxy in the form scheme://[user:passwd@]proxy.server:port.", -) - -retries: Callable[..., Option] = partial( - Option, - "--retries", - dest="retries", - type="int", - default=5, - help="Maximum attempts to establish a new HTTP connection. (default: %default)", -) - -resume_retries: Callable[..., Option] = partial( - Option, - "--resume-retries", - dest="resume_retries", - type="int", - default=0, - help="Maximum attempts to resume or restart an incomplete download. " - "(default: %default)", -) - -timeout: Callable[..., Option] = partial( - Option, - "--timeout", - "--default-timeout", - metavar="sec", - dest="timeout", - type="float", - default=15, - help="Set the socket timeout (default %default seconds).", -) - - -def exists_action() -> Option: - return Option( - # Option when path already exist - "--exists-action", - dest="exists_action", - type="choice", - choices=["s", "i", "w", "b", "a"], - default=[], - action="append", - metavar="action", - help="Default action when a path already exists: " - "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", - ) - - -cert: Callable[..., Option] = partial( - PipOption, - "--cert", - dest="cert", - type="path", - metavar="path", - help=( - "Path to PEM-encoded CA certificate bundle. " - "If provided, overrides the default. " - "See 'SSL Certificate Verification' in pip documentation " - "for more information." - ), -) - -client_cert: Callable[..., Option] = partial( - PipOption, - "--client-cert", - dest="client_cert", - type="path", - default=None, - metavar="path", - help="Path to SSL client certificate, a single file containing the " - "private key and the certificate in PEM format.", -) - -index_url: Callable[..., Option] = partial( - Option, - "-i", - "--index-url", - "--pypi-url", - dest="index_url", - metavar="URL", - default=PyPI.simple_url, - help="Base URL of the Python Package Index (default %default). " - "This should point to a repository compliant with PEP 503 " - "(the simple repository API) or a local directory laid out " - "in the same format.", -) - - -def extra_index_url() -> Option: - return Option( - "--extra-index-url", - dest="extra_index_urls", - metavar="URL", - action="append", - default=[], - help="Extra URLs of package indexes to use in addition to " - "--index-url. Should follow the same rules as " - "--index-url.", - ) - - -no_index: Callable[..., Option] = partial( - Option, - "--no-index", - dest="no_index", - action="store_true", - default=False, - help="Ignore package index (only looking at --find-links URLs instead).", -) - - -def find_links() -> Option: - return Option( - "-f", - "--find-links", - dest="find_links", - action="append", - default=[], - metavar="url", - help="If a URL or path to an html file, then parse for links to " - "archives such as sdist (.tar.gz) or wheel (.whl) files. " - "If a local path or file:// URL that's a directory, " - "then look for archives in the directory listing. " - "Links to VCS project URLs are not supported.", - ) - - -def trusted_host() -> Option: - return Option( - "--trusted-host", - dest="trusted_hosts", - action="append", - metavar="HOSTNAME", - default=[], - help="Mark this host or host:port pair as trusted, even though it " - "does not have valid or any HTTPS.", - ) - - -def constraints() -> Option: - return Option( - "-c", - "--constraint", - dest="constraints", - action="append", - default=[], - metavar="file", - help="Constrain versions using the given constraints file. " - "This option can be used multiple times.", - ) - - -def requirements() -> Option: - return Option( - "-r", - "--requirement", - dest="requirements", - action="append", - default=[], - metavar="file", - help="Install from the given requirements file. " - "This option can be used multiple times.", - ) - - -def editable() -> Option: - return Option( - "-e", - "--editable", - dest="editables", - action="append", - default=[], - metavar="path/url", - help=( - "Install a project in editable mode (i.e. setuptools " - '"develop mode") from a local project path or a VCS url.' - ), - ) - - -def _handle_src(option: Option, opt_str: str, value: str, parser: OptionParser) -> None: - value = os.path.abspath(value) - setattr(parser.values, option.dest, value) - - -src: Callable[..., Option] = partial( - PipOption, - "--src", - "--source", - "--source-dir", - "--source-directory", - dest="src_dir", - type="path", - metavar="dir", - default=get_src_prefix(), - action="callback", - callback=_handle_src, - help="Directory to check out editable projects into. " - 'The default in a virtualenv is "/src". ' - 'The default for global installs is "/src".', -) - - -def _get_format_control(values: Values, option: Option) -> Any: - """Get a format_control object.""" - return getattr(values, option.dest) - - -def _handle_no_binary( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, - existing.no_binary, - existing.only_binary, - ) - - -def _handle_only_binary( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, - existing.only_binary, - existing.no_binary, - ) - - -def no_binary() -> Option: - format_control = FormatControl(set(), set()) - return Option( - "--no-binary", - dest="format_control", - action="callback", - callback=_handle_no_binary, - type="str", - default=format_control, - help="Do not use binary packages. Can be supplied multiple times, and " - 'each time adds to the existing value. Accepts either ":all:" to ' - 'disable all binary packages, ":none:" to empty the set (notice ' - "the colons), or one or more package names with commas between " - "them (no colons). Note that some packages are tricky to compile " - "and may fail to install when this option is used on them.", - ) - - -def only_binary() -> Option: - format_control = FormatControl(set(), set()) - return Option( - "--only-binary", - dest="format_control", - action="callback", - callback=_handle_only_binary, - type="str", - default=format_control, - help="Do not use source packages. Can be supplied multiple times, and " - 'each time adds to the existing value. Accepts either ":all:" to ' - 'disable all source packages, ":none:" to empty the set, or one ' - "or more package names with commas between them. Packages " - "without binary distributions will fail to install when this " - "option is used on them.", - ) - - -platforms: Callable[..., Option] = partial( - Option, - "--platform", - dest="platforms", - metavar="platform", - action="append", - default=None, - help=( - "Only use wheels compatible with . Defaults to the " - "platform of the running system. Use this option multiple times to " - "specify multiple platforms supported by the target interpreter." - ), -) - - -# This was made a separate function for unit-testing purposes. -def _convert_python_version(value: str) -> Tuple[Tuple[int, ...], Optional[str]]: - """ - Convert a version string like "3", "37", or "3.7.3" into a tuple of ints. - - :return: A 2-tuple (version_info, error_msg), where `error_msg` is - non-None if and only if there was a parsing error. - """ - if not value: - # The empty string is the same as not providing a value. - return (None, None) - - parts = value.split(".") - if len(parts) > 3: - return ((), "at most three version parts are allowed") - - if len(parts) == 1: - # Then we are in the case of "3" or "37". - value = parts[0] - if len(value) > 1: - parts = [value[0], value[1:]] - - try: - version_info = tuple(int(part) for part in parts) - except ValueError: - return ((), "each version part must be an integer") - - return (version_info, None) - - -def _handle_python_version( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - """ - Handle a provided --python-version value. - """ - version_info, error_msg = _convert_python_version(value) - if error_msg is not None: - msg = f"invalid --python-version value: {value!r}: {error_msg}" - raise_option_error(parser, option=option, msg=msg) - - parser.values.python_version = version_info - - -python_version: Callable[..., Option] = partial( - Option, - "--python-version", - dest="python_version", - metavar="python_version", - action="callback", - callback=_handle_python_version, - type="str", - default=None, - help=dedent( - """\ - The Python interpreter version to use for wheel and "Requires-Python" - compatibility checks. Defaults to a version derived from the running - interpreter. The version can be specified using up to three dot-separated - integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor - version can also be given as a string without dots (e.g. "37" for 3.7.0). - """ - ), -) - - -implementation: Callable[..., Option] = partial( - Option, - "--implementation", - dest="implementation", - metavar="implementation", - default=None, - help=( - "Only use wheels compatible with Python " - "implementation , e.g. 'pp', 'jy', 'cp', " - " or 'ip'. If not specified, then the current " - "interpreter implementation is used. Use 'py' to force " - "implementation-agnostic wheels." - ), -) - - -abis: Callable[..., Option] = partial( - Option, - "--abi", - dest="abis", - metavar="abi", - action="append", - default=None, - help=( - "Only use wheels compatible with Python abi , e.g. 'pypy_41'. " - "If not specified, then the current interpreter abi tag is used. " - "Use this option multiple times to specify multiple abis supported " - "by the target interpreter. Generally you will need to specify " - "--implementation, --platform, and --python-version when using this " - "option." - ), -) - - -def add_target_python_options(cmd_opts: OptionGroup) -> None: - cmd_opts.add_option(platforms()) - cmd_opts.add_option(python_version()) - cmd_opts.add_option(implementation()) - cmd_opts.add_option(abis()) - - -def make_target_python(options: Values) -> TargetPython: - target_python = TargetPython( - platforms=options.platforms, - py_version_info=options.python_version, - abis=options.abis, - implementation=options.implementation, - ) - - return target_python - - -def prefer_binary() -> Option: - return Option( - "--prefer-binary", - dest="prefer_binary", - action="store_true", - default=False, - help=( - "Prefer binary packages over source packages, even if the " - "source packages are newer." - ), - ) - - -cache_dir: Callable[..., Option] = partial( - PipOption, - "--cache-dir", - dest="cache_dir", - default=USER_CACHE_DIR, - metavar="dir", - type="path", - help="Store the cache data in .", -) - - -def _handle_no_cache_dir( - option: Option, opt: str, value: str, parser: OptionParser -) -> None: - """ - Process a value provided for the --no-cache-dir option. - - This is an optparse.Option callback for the --no-cache-dir option. - """ - # The value argument will be None if --no-cache-dir is passed via the - # command-line, since the option doesn't accept arguments. However, - # the value can be non-None if the option is triggered e.g. by an - # environment variable, like PIP_NO_CACHE_DIR=true. - if value is not None: - # Then parse the string value to get argument error-checking. - try: - strtobool(value) - except ValueError as exc: - raise_option_error(parser, option=option, msg=str(exc)) - - # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() - # converted to 0 (like "false" or "no") caused cache_dir to be disabled - # rather than enabled (logic would say the latter). Thus, we disable - # the cache directory not just on values that parse to True, but (for - # backwards compatibility reasons) also on values that parse to False. - # In other words, always set it to False if the option is provided in - # some (valid) form. - parser.values.cache_dir = False - - -no_cache: Callable[..., Option] = partial( - Option, - "--no-cache-dir", - dest="cache_dir", - action="callback", - callback=_handle_no_cache_dir, - help="Disable the cache.", -) - -no_deps: Callable[..., Option] = partial( - Option, - "--no-deps", - "--no-dependencies", - dest="ignore_dependencies", - action="store_true", - default=False, - help="Don't install package dependencies.", -) - - -def _handle_dependency_group( - option: Option, opt: str, value: str, parser: OptionParser -) -> None: - """ - Process a value provided for the --group option. - - Splits on the rightmost ":", and validates that the path (if present) ends - in `pyproject.toml`. Defaults the path to `pyproject.toml` when one is not given. - - `:` cannot appear in dependency group names, so this is a safe and simple parse. - - This is an optparse.Option callback for the dependency_groups option. - """ - path, sep, groupname = value.rpartition(":") - if not sep: - path = "pyproject.toml" - else: - # check for 'pyproject.toml' filenames using pathlib - if pathlib.PurePath(path).name != "pyproject.toml": - msg = "group paths use 'pyproject.toml' filenames" - raise_option_error(parser, option=option, msg=msg) - - parser.values.dependency_groups.append((path, groupname)) - - -dependency_groups: Callable[..., Option] = partial( - Option, - "--group", - dest="dependency_groups", - default=[], - type=str, - action="callback", - callback=_handle_dependency_group, - metavar="[path:]group", - help='Install a named dependency-group from a "pyproject.toml" file. ' - 'If a path is given, the name of the file must be "pyproject.toml". ' - 'Defaults to using "pyproject.toml" in the current directory.', -) - -ignore_requires_python: Callable[..., Option] = partial( - Option, - "--ignore-requires-python", - dest="ignore_requires_python", - action="store_true", - help="Ignore the Requires-Python information.", -) - -no_build_isolation: Callable[..., Option] = partial( - Option, - "--no-build-isolation", - dest="build_isolation", - action="store_false", - default=True, - help="Disable isolation when building a modern source distribution. " - "Build dependencies specified by PEP 518 must be already installed " - "if this option is used.", -) - -check_build_deps: Callable[..., Option] = partial( - Option, - "--check-build-dependencies", - dest="check_build_deps", - action="store_true", - default=False, - help="Check the build dependencies when PEP517 is used.", -) - - -def _handle_no_use_pep517( - option: Option, opt: str, value: str, parser: OptionParser -) -> None: - """ - Process a value provided for the --no-use-pep517 option. - - This is an optparse.Option callback for the no_use_pep517 option. - """ - # Since --no-use-pep517 doesn't accept arguments, the value argument - # will be None if --no-use-pep517 is passed via the command-line. - # However, the value can be non-None if the option is triggered e.g. - # by an environment variable, for example "PIP_NO_USE_PEP517=true". - if value is not None: - msg = """A value was passed for --no-use-pep517, - probably using either the PIP_NO_USE_PEP517 environment variable - or the "no-use-pep517" config file option. Use an appropriate value - of the PIP_USE_PEP517 environment variable or the "use-pep517" - config file option instead. - """ - raise_option_error(parser, option=option, msg=msg) - - # If user doesn't wish to use pep517, we check if setuptools is installed - # and raise error if it is not. - packages = ("setuptools",) - if not all(importlib.util.find_spec(package) for package in packages): - msg = ( - f"It is not possible to use --no-use-pep517 " - f"without {' and '.join(packages)} installed." - ) - raise_option_error(parser, option=option, msg=msg) - - # Otherwise, --no-use-pep517 was passed via the command-line. - parser.values.use_pep517 = False - - -use_pep517: Any = partial( - Option, - "--use-pep517", - dest="use_pep517", - action="store_true", - default=None, - help="Use PEP 517 for building source distributions " - "(use --no-use-pep517 to force legacy behaviour).", -) - -no_use_pep517: Any = partial( - Option, - "--no-use-pep517", - dest="use_pep517", - action="callback", - callback=_handle_no_use_pep517, - default=None, - help=SUPPRESS_HELP, -) - - -def _handle_config_settings( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - key, sep, val = value.partition("=") - if sep != "=": - parser.error(f"Arguments to {opt_str} must be of the form KEY=VAL") - dest = getattr(parser.values, option.dest) - if dest is None: - dest = {} - setattr(parser.values, option.dest, dest) - if key in dest: - if isinstance(dest[key], list): - dest[key].append(val) - else: - dest[key] = [dest[key], val] - else: - dest[key] = val - - -config_settings: Callable[..., Option] = partial( - Option, - "-C", - "--config-settings", - dest="config_settings", - type=str, - action="callback", - callback=_handle_config_settings, - metavar="settings", - help="Configuration settings to be passed to the PEP 517 build backend. " - "Settings take the form KEY=VALUE. Use multiple --config-settings options " - "to pass multiple keys to the backend.", -) - -build_options: Callable[..., Option] = partial( - Option, - "--build-option", - dest="build_options", - metavar="options", - action="append", - help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", -) - -global_options: Callable[..., Option] = partial( - Option, - "--global-option", - dest="global_options", - action="append", - metavar="options", - help="Extra global options to be supplied to the setup.py " - "call before the install or bdist_wheel command.", -) - -no_clean: Callable[..., Option] = partial( - Option, - "--no-clean", - action="store_true", - default=False, - help="Don't clean up build directories.", -) - -pre: Callable[..., Option] = partial( - Option, - "--pre", - action="store_true", - default=False, - help="Include pre-release and development versions. By default, " - "pip only finds stable versions.", -) - -json: Callable[..., Option] = partial( - Option, - "--json", - action="store_true", - default=False, - help="Output data in a machine-readable JSON format.", -) - -disable_pip_version_check: Callable[..., Option] = partial( - Option, - "--disable-pip-version-check", - dest="disable_pip_version_check", - action="store_true", - default=False, - help="Don't periodically check PyPI to determine whether a new version " - "of pip is available for download. Implied with --no-index.", -) - -root_user_action: Callable[..., Option] = partial( - Option, - "--root-user-action", - dest="root_user_action", - default="warn", - choices=["warn", "ignore"], - help="Action if pip is run as a root user [warn, ignore] (default: warn)", -) - - -def _handle_merge_hash( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - """Given a value spelled "algo:digest", append the digest to a list - pointed to in a dict by the algo name.""" - if not parser.values.hashes: - parser.values.hashes = {} - try: - algo, digest = value.split(":", 1) - except ValueError: - parser.error( - f"Arguments to {opt_str} must be a hash name " - "followed by a value, like --hash=sha256:" - "abcde..." - ) - if algo not in STRONG_HASHES: - parser.error( - "Allowed hash algorithms for {} are {}.".format( - opt_str, ", ".join(STRONG_HASHES) - ) - ) - parser.values.hashes.setdefault(algo, []).append(digest) - - -hash: Callable[..., Option] = partial( - Option, - "--hash", - # Hash values eventually end up in InstallRequirement.hashes due to - # __dict__ copying in process_line(). - dest="hashes", - action="callback", - callback=_handle_merge_hash, - type="string", - help="Verify that the package's archive matches this " - "hash before installing. Example: --hash=sha256:abcdef...", -) - - -require_hashes: Callable[..., Option] = partial( - Option, - "--require-hashes", - dest="require_hashes", - action="store_true", - default=False, - help="Require a hash to check each requirement against, for " - "repeatable installs. This option is implied when any package in a " - "requirements file has a --hash option.", -) - - -list_path: Callable[..., Option] = partial( - PipOption, - "--path", - dest="path", - type="path", - action="append", - help="Restrict to the specified installation path for listing " - "packages (can be used multiple times).", -) - - -def check_list_path_option(options: Values) -> None: - if options.path and (options.user or options.local): - raise CommandError("Cannot combine '--path' with '--user' or '--local'") - - -list_exclude: Callable[..., Option] = partial( - PipOption, - "--exclude", - dest="excludes", - action="append", - metavar="package", - type="package_name", - help="Exclude specified package from the output", -) - - -no_python_version_warning: Callable[..., Option] = partial( - Option, - "--no-python-version-warning", - dest="no_python_version_warning", - action="store_true", - default=False, - help=SUPPRESS_HELP, # No-op, a hold-over from the Python 2->3 transition. -) - - -# Features that are now always on. A warning is printed if they are used. -ALWAYS_ENABLED_FEATURES = [ - "truststore", # always on since 24.2 - "no-binary-enable-wheel-cache", # always on since 23.1 -] - -use_new_feature: Callable[..., Option] = partial( - Option, - "--use-feature", - dest="features_enabled", - metavar="feature", - action="append", - default=[], - choices=[ - "fast-deps", - ] - + ALWAYS_ENABLED_FEATURES, - help="Enable new functionality, that may be backward incompatible.", -) - -use_deprecated_feature: Callable[..., Option] = partial( - Option, - "--use-deprecated", - dest="deprecated_features_enabled", - metavar="feature", - action="append", - default=[], - choices=[ - "legacy-resolver", - "legacy-certs", - ], - help=("Enable deprecated functionality, that will be removed in the future."), -) - -########## -# groups # -########## - -general_group: Dict[str, Any] = { - "name": "General Options", - "options": [ - help_, - debug_mode, - isolated_mode, - require_virtualenv, - python, - verbose, - version, - quiet, - log, - no_input, - keyring_provider, - proxy, - retries, - timeout, - exists_action, - trusted_host, - cert, - client_cert, - cache_dir, - no_cache, - disable_pip_version_check, - no_color, - no_python_version_warning, - use_new_feature, - use_deprecated_feature, - resume_retries, - ], -} - -index_group: Dict[str, Any] = { - "name": "Package Index Options", - "options": [ - index_url, - extra_index_url, - no_index, - find_links, - ], -} diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/command_context.py b/blog-app/venv/Lib/site-packages/pip/_internal/cli/command_context.py deleted file mode 100644 index 139995a..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/cli/command_context.py +++ /dev/null @@ -1,27 +0,0 @@ -from contextlib import ExitStack, contextmanager -from typing import ContextManager, Generator, TypeVar - -_T = TypeVar("_T", covariant=True) - - -class CommandContextMixIn: - def __init__(self) -> None: - super().__init__() - self._in_main_context = False - self._main_context = ExitStack() - - @contextmanager - def main_context(self) -> Generator[None, None, None]: - assert not self._in_main_context - - self._in_main_context = True - try: - with self._main_context: - yield - finally: - self._in_main_context = False - - def enter_context(self, context_provider: ContextManager[_T]) -> _T: - assert self._in_main_context - - return self._main_context.enter_context(context_provider) diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/index_command.py b/blog-app/venv/Lib/site-packages/pip/_internal/cli/index_command.py deleted file mode 100644 index 87a1e08..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/cli/index_command.py +++ /dev/null @@ -1,173 +0,0 @@ -""" -Contains command classes which may interact with an index / the network. - -Unlike its sister module, req_command, this module still uses lazy imports -so commands which don't always hit the network (e.g. list w/o --outdated or ---uptodate) don't need waste time importing PipSession and friends. -""" - -import logging -import os -import sys -from functools import lru_cache -from optparse import Values -from typing import TYPE_CHECKING, List, Optional - -from pip._vendor import certifi - -from pip._internal.cli.base_command import Command -from pip._internal.cli.command_context import CommandContextMixIn - -if TYPE_CHECKING: - from ssl import SSLContext - - from pip._internal.network.session import PipSession - -logger = logging.getLogger(__name__) - - -@lru_cache -def _create_truststore_ssl_context() -> Optional["SSLContext"]: - if sys.version_info < (3, 10): - logger.debug("Disabling truststore because Python version isn't 3.10+") - return None - - try: - import ssl - except ImportError: - logger.warning("Disabling truststore since ssl support is missing") - return None - - try: - from pip._vendor import truststore - except ImportError: - logger.warning("Disabling truststore because platform isn't supported") - return None - - ctx = truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT) - ctx.load_verify_locations(certifi.where()) - return ctx - - -class SessionCommandMixin(CommandContextMixIn): - """ - A class mixin for command classes needing _build_session(). - """ - - def __init__(self) -> None: - super().__init__() - self._session: Optional[PipSession] = None - - @classmethod - def _get_index_urls(cls, options: Values) -> Optional[List[str]]: - """Return a list of index urls from user-provided options.""" - index_urls = [] - if not getattr(options, "no_index", False): - url = getattr(options, "index_url", None) - if url: - index_urls.append(url) - urls = getattr(options, "extra_index_urls", None) - if urls: - index_urls.extend(urls) - # Return None rather than an empty list - return index_urls or None - - def get_default_session(self, options: Values) -> "PipSession": - """Get a default-managed session.""" - if self._session is None: - self._session = self.enter_context(self._build_session(options)) - # there's no type annotation on requests.Session, so it's - # automatically ContextManager[Any] and self._session becomes Any, - # then https://github.com/python/mypy/issues/7696 kicks in - assert self._session is not None - return self._session - - def _build_session( - self, - options: Values, - retries: Optional[int] = None, - timeout: Optional[int] = None, - ) -> "PipSession": - from pip._internal.network.session import PipSession - - cache_dir = options.cache_dir - assert not cache_dir or os.path.isabs(cache_dir) - - if "legacy-certs" not in options.deprecated_features_enabled: - ssl_context = _create_truststore_ssl_context() - else: - ssl_context = None - - session = PipSession( - cache=os.path.join(cache_dir, "http-v2") if cache_dir else None, - retries=retries if retries is not None else options.retries, - trusted_hosts=options.trusted_hosts, - index_urls=self._get_index_urls(options), - ssl_context=ssl_context, - ) - - # Handle custom ca-bundles from the user - if options.cert: - session.verify = options.cert - - # Handle SSL client certificate - if options.client_cert: - session.cert = options.client_cert - - # Handle timeouts - if options.timeout or timeout: - session.timeout = timeout if timeout is not None else options.timeout - - # Handle configured proxies - if options.proxy: - session.proxies = { - "http": options.proxy, - "https": options.proxy, - } - session.trust_env = False - session.pip_proxy = options.proxy - - # Determine if we can prompt the user for authentication or not - session.auth.prompting = not options.no_input - session.auth.keyring_provider = options.keyring_provider - - return session - - -def _pip_self_version_check(session: "PipSession", options: Values) -> None: - from pip._internal.self_outdated_check import pip_self_version_check as check - - check(session, options) - - -class IndexGroupCommand(Command, SessionCommandMixin): - """ - Abstract base class for commands with the index_group options. - - This also corresponds to the commands that permit the pip version check. - """ - - def handle_pip_version_check(self, options: Values) -> None: - """ - Do the pip version check if not disabled. - - This overrides the default behavior of not doing the check. - """ - # Make sure the index_group options are present. - assert hasattr(options, "no_index") - - if options.disable_pip_version_check or options.no_index: - return - - try: - # Otherwise, check if we're using the latest version of pip available. - session = self._build_session( - options, - retries=0, - timeout=min(5, options.timeout), - ) - with session: - _pip_self_version_check(session, options) - except Exception: - logger.warning("There was an error checking the latest version of pip.") - logger.debug("See below for error", exc_info=True) diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/main.py b/blog-app/venv/Lib/site-packages/pip/_internal/cli/main.py deleted file mode 100644 index 377476c..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/cli/main.py +++ /dev/null @@ -1,79 +0,0 @@ -"""Primary application entrypoint.""" - -import locale -import logging -import os -import sys -import warnings -from typing import List, Optional - -from pip._internal.cli.autocompletion import autocomplete -from pip._internal.cli.main_parser import parse_command -from pip._internal.commands import create_command -from pip._internal.exceptions import PipError -from pip._internal.utils import deprecation - -logger = logging.getLogger(__name__) - - -# Do not import and use main() directly! Using it directly is actively -# discouraged by pip's maintainers. The name, location and behavior of -# this function is subject to change, so calling it directly is not -# portable across different pip versions. - -# In addition, running pip in-process is unsupported and unsafe. This is -# elaborated in detail at -# https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program. -# That document also provides suggestions that should work for nearly -# all users that are considering importing and using main() directly. - -# However, we know that certain users will still want to invoke pip -# in-process. If you understand and accept the implications of using pip -# in an unsupported manner, the best approach is to use runpy to avoid -# depending on the exact location of this entry point. - -# The following example shows how to use runpy to invoke pip in that -# case: -# -# sys.argv = ["pip", your, args, here] -# runpy.run_module("pip", run_name="__main__") -# -# Note that this will exit the process after running, unlike a direct -# call to main. As it is not safe to do any processing after calling -# main, this should not be an issue in practice. - - -def main(args: Optional[List[str]] = None) -> int: - if args is None: - args = sys.argv[1:] - - # Suppress the pkg_resources deprecation warning - # Note - we use a module of .*pkg_resources to cover - # the normal case (pip._vendor.pkg_resources) and the - # devendored case (a bare pkg_resources) - warnings.filterwarnings( - action="ignore", category=DeprecationWarning, module=".*pkg_resources" - ) - - # Configure our deprecation warnings to be sent through loggers - deprecation.install_warning_logger() - - autocomplete() - - try: - cmd_name, cmd_args = parse_command(args) - except PipError as exc: - sys.stderr.write(f"ERROR: {exc}") - sys.stderr.write(os.linesep) - sys.exit(1) - - # Needed for locale.getpreferredencoding(False) to work - # in pip._internal.utils.encoding.auto_decode - try: - locale.setlocale(locale.LC_ALL, "") - except locale.Error as e: - # setlocale can apparently crash if locale are uninitialized - logger.debug("Ignoring error %s when setting locale", e) - command = create_command(cmd_name, isolated=("--isolated" in cmd_args)) - - return command.main(cmd_args) diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/main_parser.py b/blog-app/venv/Lib/site-packages/pip/_internal/cli/main_parser.py deleted file mode 100644 index c52684a..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/cli/main_parser.py +++ /dev/null @@ -1,133 +0,0 @@ -"""A single place for constructing and exposing the main parser""" - -import os -import subprocess -import sys -from typing import List, Optional, Tuple - -from pip._internal.build_env import get_runnable_pip -from pip._internal.cli import cmdoptions -from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter -from pip._internal.commands import commands_dict, get_similar_commands -from pip._internal.exceptions import CommandError -from pip._internal.utils.misc import get_pip_version, get_prog - -__all__ = ["create_main_parser", "parse_command"] - - -def create_main_parser() -> ConfigOptionParser: - """Creates and returns the main parser for pip's CLI""" - - parser = ConfigOptionParser( - usage="\n%prog [options]", - add_help_option=False, - formatter=UpdatingDefaultsHelpFormatter(), - name="global", - prog=get_prog(), - ) - parser.disable_interspersed_args() - - parser.version = get_pip_version() - - # add the general options - gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) - parser.add_option_group(gen_opts) - - # so the help formatter knows - parser.main = True # type: ignore - - # create command listing for description - description = [""] + [ - f"{name:27} {command_info.summary}" - for name, command_info in commands_dict.items() - ] - parser.description = "\n".join(description) - - return parser - - -def identify_python_interpreter(python: str) -> Optional[str]: - # If the named file exists, use it. - # If it's a directory, assume it's a virtual environment and - # look for the environment's Python executable. - if os.path.exists(python): - if os.path.isdir(python): - # bin/python for Unix, Scripts/python.exe for Windows - # Try both in case of odd cases like cygwin. - for exe in ("bin/python", "Scripts/python.exe"): - py = os.path.join(python, exe) - if os.path.exists(py): - return py - else: - return python - - # Could not find the interpreter specified - return None - - -def parse_command(args: List[str]) -> Tuple[str, List[str]]: - parser = create_main_parser() - - # Note: parser calls disable_interspersed_args(), so the result of this - # call is to split the initial args into the general options before the - # subcommand and everything else. - # For example: - # args: ['--timeout=5', 'install', '--user', 'INITools'] - # general_options: ['--timeout==5'] - # args_else: ['install', '--user', 'INITools'] - general_options, args_else = parser.parse_args(args) - - # --python - if general_options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ: - # Re-invoke pip using the specified Python interpreter - interpreter = identify_python_interpreter(general_options.python) - if interpreter is None: - raise CommandError( - f"Could not locate Python interpreter {general_options.python}" - ) - - pip_cmd = [ - interpreter, - get_runnable_pip(), - ] - pip_cmd.extend(args) - - # Set a flag so the child doesn't re-invoke itself, causing - # an infinite loop. - os.environ["_PIP_RUNNING_IN_SUBPROCESS"] = "1" - returncode = 0 - try: - proc = subprocess.run(pip_cmd) - returncode = proc.returncode - except (subprocess.SubprocessError, OSError) as exc: - raise CommandError(f"Failed to run pip under {interpreter}: {exc}") - sys.exit(returncode) - - # --version - if general_options.version: - sys.stdout.write(parser.version) - sys.stdout.write(os.linesep) - sys.exit() - - # pip || pip help -> print_help() - if not args_else or (args_else[0] == "help" and len(args_else) == 1): - parser.print_help() - sys.exit() - - # the subcommand name - cmd_name = args_else[0] - - if cmd_name not in commands_dict: - guess = get_similar_commands(cmd_name) - - msg = [f'unknown command "{cmd_name}"'] - if guess: - msg.append(f'maybe you meant "{guess}"') - - raise CommandError(" - ".join(msg)) - - # all the args without the subcommand - cmd_args = args[:] - cmd_args.remove(cmd_name) - - return cmd_name, cmd_args diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/parser.py b/blog-app/venv/Lib/site-packages/pip/_internal/cli/parser.py deleted file mode 100644 index bc4aca0..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/cli/parser.py +++ /dev/null @@ -1,294 +0,0 @@ -"""Base option parser setup""" - -import logging -import optparse -import shutil -import sys -import textwrap -from contextlib import suppress -from typing import Any, Dict, Generator, List, NoReturn, Optional, Tuple - -from pip._internal.cli.status_codes import UNKNOWN_ERROR -from pip._internal.configuration import Configuration, ConfigurationError -from pip._internal.utils.misc import redact_auth_from_url, strtobool - -logger = logging.getLogger(__name__) - - -class PrettyHelpFormatter(optparse.IndentedHelpFormatter): - """A prettier/less verbose help formatter for optparse.""" - - def __init__(self, *args: Any, **kwargs: Any) -> None: - # help position must be aligned with __init__.parseopts.description - kwargs["max_help_position"] = 30 - kwargs["indent_increment"] = 1 - kwargs["width"] = shutil.get_terminal_size()[0] - 2 - super().__init__(*args, **kwargs) - - def format_option_strings(self, option: optparse.Option) -> str: - return self._format_option_strings(option) - - def _format_option_strings( - self, option: optparse.Option, mvarfmt: str = " <{}>", optsep: str = ", " - ) -> str: - """ - Return a comma-separated list of option strings and metavars. - - :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') - :param mvarfmt: metavar format string - :param optsep: separator - """ - opts = [] - - if option._short_opts: - opts.append(option._short_opts[0]) - if option._long_opts: - opts.append(option._long_opts[0]) - if len(opts) > 1: - opts.insert(1, optsep) - - if option.takes_value(): - assert option.dest is not None - metavar = option.metavar or option.dest.lower() - opts.append(mvarfmt.format(metavar.lower())) - - return "".join(opts) - - def format_heading(self, heading: str) -> str: - if heading == "Options": - return "" - return heading + ":\n" - - def format_usage(self, usage: str) -> str: - """ - Ensure there is only one newline between usage and the first heading - if there is no description. - """ - msg = "\nUsage: {}\n".format(self.indent_lines(textwrap.dedent(usage), " ")) - return msg - - def format_description(self, description: Optional[str]) -> str: - # leave full control over description to us - if description: - if hasattr(self.parser, "main"): - label = "Commands" - else: - label = "Description" - # some doc strings have initial newlines, some don't - description = description.lstrip("\n") - # some doc strings have final newlines and spaces, some don't - description = description.rstrip() - # dedent, then reindent - description = self.indent_lines(textwrap.dedent(description), " ") - description = f"{label}:\n{description}\n" - return description - else: - return "" - - def format_epilog(self, epilog: Optional[str]) -> str: - # leave full control over epilog to us - if epilog: - return epilog - else: - return "" - - def indent_lines(self, text: str, indent: str) -> str: - new_lines = [indent + line for line in text.split("\n")] - return "\n".join(new_lines) - - -class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): - """Custom help formatter for use in ConfigOptionParser. - - This is updates the defaults before expanding them, allowing - them to show up correctly in the help listing. - - Also redact auth from url type options - """ - - def expand_default(self, option: optparse.Option) -> str: - default_values = None - if self.parser is not None: - assert isinstance(self.parser, ConfigOptionParser) - self.parser._update_defaults(self.parser.defaults) - assert option.dest is not None - default_values = self.parser.defaults.get(option.dest) - help_text = super().expand_default(option) - - if default_values and option.metavar == "URL": - if isinstance(default_values, str): - default_values = [default_values] - - # If its not a list, we should abort and just return the help text - if not isinstance(default_values, list): - default_values = [] - - for val in default_values: - help_text = help_text.replace(val, redact_auth_from_url(val)) - - return help_text - - -class CustomOptionParser(optparse.OptionParser): - def insert_option_group( - self, idx: int, *args: Any, **kwargs: Any - ) -> optparse.OptionGroup: - """Insert an OptionGroup at a given position.""" - group = self.add_option_group(*args, **kwargs) - - self.option_groups.pop() - self.option_groups.insert(idx, group) - - return group - - @property - def option_list_all(self) -> List[optparse.Option]: - """Get a list of all options, including those in option groups.""" - res = self.option_list[:] - for i in self.option_groups: - res.extend(i.option_list) - - return res - - -class ConfigOptionParser(CustomOptionParser): - """Custom option parser which updates its defaults by checking the - configuration files and environmental variables""" - - def __init__( - self, - *args: Any, - name: str, - isolated: bool = False, - **kwargs: Any, - ) -> None: - self.name = name - self.config = Configuration(isolated) - - assert self.name - super().__init__(*args, **kwargs) - - def check_default(self, option: optparse.Option, key: str, val: Any) -> Any: - try: - return option.check_value(key, val) - except optparse.OptionValueError as exc: - print(f"An error occurred during configuration: {exc}") - sys.exit(3) - - def _get_ordered_configuration_items( - self, - ) -> Generator[Tuple[str, Any], None, None]: - # Configuration gives keys in an unordered manner. Order them. - override_order = ["global", self.name, ":env:"] - - # Pool the options into different groups - section_items: Dict[str, List[Tuple[str, Any]]] = { - name: [] for name in override_order - } - for section_key, val in self.config.items(): - # ignore empty values - if not val: - logger.debug( - "Ignoring configuration key '%s' as it's value is empty.", - section_key, - ) - continue - - section, key = section_key.split(".", 1) - if section in override_order: - section_items[section].append((key, val)) - - # Yield each group in their override order - for section in override_order: - for key, val in section_items[section]: - yield key, val - - def _update_defaults(self, defaults: Dict[str, Any]) -> Dict[str, Any]: - """Updates the given defaults with values from the config files and - the environ. Does a little special handling for certain types of - options (lists).""" - - # Accumulate complex default state. - self.values = optparse.Values(self.defaults) - late_eval = set() - # Then set the options with those values - for key, val in self._get_ordered_configuration_items(): - # '--' because configuration supports only long names - option = self.get_option("--" + key) - - # Ignore options not present in this parser. E.g. non-globals put - # in [global] by users that want them to apply to all applicable - # commands. - if option is None: - continue - - assert option.dest is not None - - if option.action in ("store_true", "store_false"): - try: - val = strtobool(val) - except ValueError: - self.error( - f"{val} is not a valid value for {key} option, " - "please specify a boolean value like yes/no, " - "true/false or 1/0 instead." - ) - elif option.action == "count": - with suppress(ValueError): - val = strtobool(val) - with suppress(ValueError): - val = int(val) - if not isinstance(val, int) or val < 0: - self.error( - f"{val} is not a valid value for {key} option, " - "please instead specify either a non-negative integer " - "or a boolean value like yes/no or false/true " - "which is equivalent to 1/0." - ) - elif option.action == "append": - val = val.split() - val = [self.check_default(option, key, v) for v in val] - elif option.action == "callback": - assert option.callback is not None - late_eval.add(option.dest) - opt_str = option.get_opt_string() - val = option.convert_value(opt_str, val) - # From take_action - args = option.callback_args or () - kwargs = option.callback_kwargs or {} - option.callback(option, opt_str, val, self, *args, **kwargs) - else: - val = self.check_default(option, key, val) - - defaults[option.dest] = val - - for key in late_eval: - defaults[key] = getattr(self.values, key) - self.values = None - return defaults - - def get_default_values(self) -> optparse.Values: - """Overriding to make updating the defaults after instantiation of - the option parser possible, _update_defaults() does the dirty work.""" - if not self.process_default_values: - # Old, pre-Optik 1.5 behaviour. - return optparse.Values(self.defaults) - - # Load the configuration, or error out in case of an error - try: - self.config.load() - except ConfigurationError as err: - self.exit(UNKNOWN_ERROR, str(err)) - - defaults = self._update_defaults(self.defaults.copy()) # ours - for option in self._get_all_options(): - assert option.dest is not None - default = defaults.get(option.dest) - if isinstance(default, str): - opt_str = option.get_opt_string() - defaults[option.dest] = option.check_value(opt_str, default) - return optparse.Values(defaults) - - def error(self, msg: str) -> NoReturn: - self.print_usage(sys.stderr) - self.exit(UNKNOWN_ERROR, f"{msg}\n") diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py b/blog-app/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py deleted file mode 100644 index ab9d76b..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +++ /dev/null @@ -1,144 +0,0 @@ -import functools -import sys -from typing import Callable, Generator, Iterable, Iterator, Optional, Tuple, TypeVar - -from pip._vendor.rich.progress import ( - BarColumn, - DownloadColumn, - FileSizeColumn, - MofNCompleteColumn, - Progress, - ProgressColumn, - SpinnerColumn, - TextColumn, - TimeElapsedColumn, - TimeRemainingColumn, - TransferSpeedColumn, -) - -from pip._internal.cli.spinners import RateLimiter -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.logging import get_console, get_indentation - -T = TypeVar("T") -ProgressRenderer = Callable[[Iterable[T]], Iterator[T]] - - -def _rich_download_progress_bar( - iterable: Iterable[bytes], - *, - bar_type: str, - size: Optional[int], - initial_progress: Optional[int] = None, -) -> Generator[bytes, None, None]: - assert bar_type == "on", "This should only be used in the default mode." - - if not size: - total = float("inf") - columns: Tuple[ProgressColumn, ...] = ( - TextColumn("[progress.description]{task.description}"), - SpinnerColumn("line", speed=1.5), - FileSizeColumn(), - TransferSpeedColumn(), - TimeElapsedColumn(), - ) - else: - total = size - columns = ( - TextColumn("[progress.description]{task.description}"), - BarColumn(), - DownloadColumn(), - TransferSpeedColumn(), - TextColumn("eta"), - TimeRemainingColumn(), - ) - - progress = Progress(*columns, refresh_per_second=5) - task_id = progress.add_task(" " * (get_indentation() + 2), total=total) - if initial_progress is not None: - progress.update(task_id, advance=initial_progress) - with progress: - for chunk in iterable: - yield chunk - progress.update(task_id, advance=len(chunk)) - - -def _rich_install_progress_bar( - iterable: Iterable[InstallRequirement], *, total: int -) -> Iterator[InstallRequirement]: - columns = ( - TextColumn("{task.fields[indent]}"), - BarColumn(), - MofNCompleteColumn(), - TextColumn("{task.description}"), - ) - console = get_console() - - bar = Progress(*columns, refresh_per_second=6, console=console, transient=True) - # Hiding the progress bar at initialization forces a refresh cycle to occur - # until the bar appears, avoiding very short flashes. - task = bar.add_task("", total=total, indent=" " * get_indentation(), visible=False) - with bar: - for req in iterable: - bar.update(task, description=rf"\[{req.name}]", visible=True) - yield req - bar.advance(task) - - -def _raw_progress_bar( - iterable: Iterable[bytes], - *, - size: Optional[int], - initial_progress: Optional[int] = None, -) -> Generator[bytes, None, None]: - def write_progress(current: int, total: int) -> None: - sys.stdout.write(f"Progress {current} of {total}\n") - sys.stdout.flush() - - current = initial_progress or 0 - total = size or 0 - rate_limiter = RateLimiter(0.25) - - write_progress(current, total) - for chunk in iterable: - current += len(chunk) - if rate_limiter.ready() or current == total: - write_progress(current, total) - rate_limiter.reset() - yield chunk - - -def get_download_progress_renderer( - *, bar_type: str, size: Optional[int] = None, initial_progress: Optional[int] = None -) -> ProgressRenderer[bytes]: - """Get an object that can be used to render the download progress. - - Returns a callable, that takes an iterable to "wrap". - """ - if bar_type == "on": - return functools.partial( - _rich_download_progress_bar, - bar_type=bar_type, - size=size, - initial_progress=initial_progress, - ) - elif bar_type == "raw": - return functools.partial( - _raw_progress_bar, - size=size, - initial_progress=initial_progress, - ) - else: - return iter # no-op, when passed an iterator - - -def get_install_progress_renderer( - *, bar_type: str, total: int -) -> ProgressRenderer[InstallRequirement]: - """Get an object that can be used to render the install progress. - Returns a callable, that takes an iterable to "wrap". - """ - if bar_type == "on": - return functools.partial(_rich_install_progress_bar, total=total) - else: - return iter diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/req_command.py b/blog-app/venv/Lib/site-packages/pip/_internal/cli/req_command.py deleted file mode 100644 index d9b5142..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/cli/req_command.py +++ /dev/null @@ -1,347 +0,0 @@ -"""Contains the RequirementCommand base class. - -This class is in a separate module so the commands that do not always -need PackageFinder capability don't unnecessarily import the -PackageFinder machinery and all its vendored dependencies, etc. -""" - -import logging -from functools import partial -from optparse import Values -from typing import Any, List, Optional, Tuple - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.index_command import IndexGroupCommand -from pip._internal.cli.index_command import SessionCommandMixin as SessionCommandMixin -from pip._internal.exceptions import CommandError, PreviousBuildDirError -from pip._internal.index.collector import LinkCollector -from pip._internal.index.package_finder import PackageFinder -from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.models.target_python import TargetPython -from pip._internal.network.session import PipSession -from pip._internal.operations.build.build_tracker import BuildTracker -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req.constructors import ( - install_req_from_editable, - install_req_from_line, - install_req_from_parsed_requirement, - install_req_from_req_string, -) -from pip._internal.req.req_dependency_group import parse_dependency_groups -from pip._internal.req.req_file import parse_requirements -from pip._internal.req.req_install import InstallRequirement -from pip._internal.resolution.base import BaseResolver -from pip._internal.utils.temp_dir import ( - TempDirectory, - TempDirectoryTypeRegistry, - tempdir_kinds, -) - -logger = logging.getLogger(__name__) - - -KEEPABLE_TEMPDIR_TYPES = [ - tempdir_kinds.BUILD_ENV, - tempdir_kinds.EPHEM_WHEEL_CACHE, - tempdir_kinds.REQ_BUILD, -] - - -def with_cleanup(func: Any) -> Any: - """Decorator for common logic related to managing temporary - directories. - """ - - def configure_tempdir_registry(registry: TempDirectoryTypeRegistry) -> None: - for t in KEEPABLE_TEMPDIR_TYPES: - registry.set_delete(t, False) - - def wrapper( - self: RequirementCommand, options: Values, args: List[Any] - ) -> Optional[int]: - assert self.tempdir_registry is not None - if options.no_clean: - configure_tempdir_registry(self.tempdir_registry) - - try: - return func(self, options, args) - except PreviousBuildDirError: - # This kind of conflict can occur when the user passes an explicit - # build directory with a pre-existing folder. In that case we do - # not want to accidentally remove it. - configure_tempdir_registry(self.tempdir_registry) - raise - - return wrapper - - -class RequirementCommand(IndexGroupCommand): - def __init__(self, *args: Any, **kw: Any) -> None: - super().__init__(*args, **kw) - - self.cmd_opts.add_option(cmdoptions.dependency_groups()) - self.cmd_opts.add_option(cmdoptions.no_clean()) - - @staticmethod - def determine_resolver_variant(options: Values) -> str: - """Determines which resolver should be used, based on the given options.""" - if "legacy-resolver" in options.deprecated_features_enabled: - return "legacy" - - return "resolvelib" - - @classmethod - def make_requirement_preparer( - cls, - temp_build_dir: TempDirectory, - options: Values, - build_tracker: BuildTracker, - session: PipSession, - finder: PackageFinder, - use_user_site: bool, - download_dir: Optional[str] = None, - verbosity: int = 0, - ) -> RequirementPreparer: - """ - Create a RequirementPreparer instance for the given parameters. - """ - temp_build_dir_path = temp_build_dir.path - assert temp_build_dir_path is not None - legacy_resolver = False - - resolver_variant = cls.determine_resolver_variant(options) - if resolver_variant == "resolvelib": - lazy_wheel = "fast-deps" in options.features_enabled - if lazy_wheel: - logger.warning( - "pip is using lazily downloaded wheels using HTTP " - "range requests to obtain dependency information. " - "This experimental feature is enabled through " - "--use-feature=fast-deps and it is not ready for " - "production." - ) - else: - legacy_resolver = True - lazy_wheel = False - if "fast-deps" in options.features_enabled: - logger.warning( - "fast-deps has no effect when used with the legacy resolver." - ) - - return RequirementPreparer( - build_dir=temp_build_dir_path, - src_dir=options.src_dir, - download_dir=download_dir, - build_isolation=options.build_isolation, - check_build_deps=options.check_build_deps, - build_tracker=build_tracker, - session=session, - progress_bar=options.progress_bar, - finder=finder, - require_hashes=options.require_hashes, - use_user_site=use_user_site, - lazy_wheel=lazy_wheel, - verbosity=verbosity, - legacy_resolver=legacy_resolver, - resume_retries=options.resume_retries, - ) - - @classmethod - def make_resolver( - cls, - preparer: RequirementPreparer, - finder: PackageFinder, - options: Values, - wheel_cache: Optional[WheelCache] = None, - use_user_site: bool = False, - ignore_installed: bool = True, - ignore_requires_python: bool = False, - force_reinstall: bool = False, - upgrade_strategy: str = "to-satisfy-only", - use_pep517: Optional[bool] = None, - py_version_info: Optional[Tuple[int, ...]] = None, - ) -> BaseResolver: - """ - Create a Resolver instance for the given parameters. - """ - make_install_req = partial( - install_req_from_req_string, - isolated=options.isolated_mode, - use_pep517=use_pep517, - ) - resolver_variant = cls.determine_resolver_variant(options) - # The long import name and duplicated invocation is needed to convince - # Mypy into correctly typechecking. Otherwise it would complain the - # "Resolver" class being redefined. - if resolver_variant == "resolvelib": - import pip._internal.resolution.resolvelib.resolver - - return pip._internal.resolution.resolvelib.resolver.Resolver( - preparer=preparer, - finder=finder, - wheel_cache=wheel_cache, - make_install_req=make_install_req, - use_user_site=use_user_site, - ignore_dependencies=options.ignore_dependencies, - ignore_installed=ignore_installed, - ignore_requires_python=ignore_requires_python, - force_reinstall=force_reinstall, - upgrade_strategy=upgrade_strategy, - py_version_info=py_version_info, - ) - import pip._internal.resolution.legacy.resolver - - return pip._internal.resolution.legacy.resolver.Resolver( - preparer=preparer, - finder=finder, - wheel_cache=wheel_cache, - make_install_req=make_install_req, - use_user_site=use_user_site, - ignore_dependencies=options.ignore_dependencies, - ignore_installed=ignore_installed, - ignore_requires_python=ignore_requires_python, - force_reinstall=force_reinstall, - upgrade_strategy=upgrade_strategy, - py_version_info=py_version_info, - ) - - def get_requirements( - self, - args: List[str], - options: Values, - finder: PackageFinder, - session: PipSession, - ) -> List[InstallRequirement]: - """ - Parse command-line arguments into the corresponding requirements. - """ - requirements: List[InstallRequirement] = [] - for filename in options.constraints: - for parsed_req in parse_requirements( - filename, - constraint=True, - finder=finder, - options=options, - session=session, - ): - req_to_add = install_req_from_parsed_requirement( - parsed_req, - isolated=options.isolated_mode, - user_supplied=False, - ) - requirements.append(req_to_add) - - for req in args: - req_to_add = install_req_from_line( - req, - comes_from=None, - isolated=options.isolated_mode, - use_pep517=options.use_pep517, - user_supplied=True, - config_settings=getattr(options, "config_settings", None), - ) - requirements.append(req_to_add) - - if options.dependency_groups: - for req in parse_dependency_groups(options.dependency_groups): - req_to_add = install_req_from_req_string( - req, - isolated=options.isolated_mode, - use_pep517=options.use_pep517, - user_supplied=True, - ) - requirements.append(req_to_add) - - for req in options.editables: - req_to_add = install_req_from_editable( - req, - user_supplied=True, - isolated=options.isolated_mode, - use_pep517=options.use_pep517, - config_settings=getattr(options, "config_settings", None), - ) - requirements.append(req_to_add) - - # NOTE: options.require_hashes may be set if --require-hashes is True - for filename in options.requirements: - for parsed_req in parse_requirements( - filename, finder=finder, options=options, session=session - ): - req_to_add = install_req_from_parsed_requirement( - parsed_req, - isolated=options.isolated_mode, - use_pep517=options.use_pep517, - user_supplied=True, - config_settings=( - parsed_req.options.get("config_settings") - if parsed_req.options - else None - ), - ) - requirements.append(req_to_add) - - # If any requirement has hash options, enable hash checking. - if any(req.has_hash_options for req in requirements): - options.require_hashes = True - - if not ( - args - or options.editables - or options.requirements - or options.dependency_groups - ): - opts = {"name": self.name} - if options.find_links: - raise CommandError( - "You must give at least one requirement to {name} " - '(maybe you meant "pip {name} {links}"?)'.format( - **dict(opts, links=" ".join(options.find_links)) - ) - ) - else: - raise CommandError( - "You must give at least one requirement to {name} " - '(see "pip help {name}")'.format(**opts) - ) - - return requirements - - @staticmethod - def trace_basic_info(finder: PackageFinder) -> None: - """ - Trace basic information about the provided objects. - """ - # Display where finder is looking for packages - search_scope = finder.search_scope - locations = search_scope.get_formatted_locations() - if locations: - logger.info(locations) - - def _build_package_finder( - self, - options: Values, - session: PipSession, - target_python: Optional[TargetPython] = None, - ignore_requires_python: Optional[bool] = None, - ) -> PackageFinder: - """ - Create a package finder appropriate to this requirement command. - - :param ignore_requires_python: Whether to ignore incompatible - "Requires-Python" values in links. Defaults to False. - """ - link_collector = LinkCollector.create(session, options=options) - selection_prefs = SelectionPreferences( - allow_yanked=True, - format_control=options.format_control, - allow_all_prereleases=options.pre, - prefer_binary=options.prefer_binary, - ignore_requires_python=ignore_requires_python, - ) - - return PackageFinder.create( - link_collector=link_collector, - selection_prefs=selection_prefs, - target_python=target_python, - ) diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/spinners.py b/blog-app/venv/Lib/site-packages/pip/_internal/cli/spinners.py deleted file mode 100644 index cf2b976..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/cli/spinners.py +++ /dev/null @@ -1,159 +0,0 @@ -import contextlib -import itertools -import logging -import sys -import time -from typing import IO, Generator, Optional - -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.logging import get_indentation - -logger = logging.getLogger(__name__) - - -class SpinnerInterface: - def spin(self) -> None: - raise NotImplementedError() - - def finish(self, final_status: str) -> None: - raise NotImplementedError() - - -class InteractiveSpinner(SpinnerInterface): - def __init__( - self, - message: str, - file: Optional[IO[str]] = None, - spin_chars: str = "-\\|/", - # Empirically, 8 updates/second looks nice - min_update_interval_seconds: float = 0.125, - ): - self._message = message - if file is None: - file = sys.stdout - self._file = file - self._rate_limiter = RateLimiter(min_update_interval_seconds) - self._finished = False - - self._spin_cycle = itertools.cycle(spin_chars) - - self._file.write(" " * get_indentation() + self._message + " ... ") - self._width = 0 - - def _write(self, status: str) -> None: - assert not self._finished - # Erase what we wrote before by backspacing to the beginning, writing - # spaces to overwrite the old text, and then backspacing again - backup = "\b" * self._width - self._file.write(backup + " " * self._width + backup) - # Now we have a blank slate to add our status - self._file.write(status) - self._width = len(status) - self._file.flush() - self._rate_limiter.reset() - - def spin(self) -> None: - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._write(next(self._spin_cycle)) - - def finish(self, final_status: str) -> None: - if self._finished: - return - self._write(final_status) - self._file.write("\n") - self._file.flush() - self._finished = True - - -# Used for dumb terminals, non-interactive installs (no tty), etc. -# We still print updates occasionally (once every 60 seconds by default) to -# act as a keep-alive for systems like Travis-CI that take lack-of-output as -# an indication that a task has frozen. -class NonInteractiveSpinner(SpinnerInterface): - def __init__(self, message: str, min_update_interval_seconds: float = 60.0) -> None: - self._message = message - self._finished = False - self._rate_limiter = RateLimiter(min_update_interval_seconds) - self._update("started") - - def _update(self, status: str) -> None: - assert not self._finished - self._rate_limiter.reset() - logger.info("%s: %s", self._message, status) - - def spin(self) -> None: - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._update("still running...") - - def finish(self, final_status: str) -> None: - if self._finished: - return - self._update(f"finished with status '{final_status}'") - self._finished = True - - -class RateLimiter: - def __init__(self, min_update_interval_seconds: float) -> None: - self._min_update_interval_seconds = min_update_interval_seconds - self._last_update: float = 0 - - def ready(self) -> bool: - now = time.time() - delta = now - self._last_update - return delta >= self._min_update_interval_seconds - - def reset(self) -> None: - self._last_update = time.time() - - -@contextlib.contextmanager -def open_spinner(message: str) -> Generator[SpinnerInterface, None, None]: - # Interactive spinner goes directly to sys.stdout rather than being routed - # through the logging system, but it acts like it has level INFO, - # i.e. it's only displayed if we're at level INFO or better. - # Non-interactive spinner goes through the logging system, so it is always - # in sync with logging configuration. - if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: - spinner: SpinnerInterface = InteractiveSpinner(message) - else: - spinner = NonInteractiveSpinner(message) - try: - with hidden_cursor(sys.stdout): - yield spinner - except KeyboardInterrupt: - spinner.finish("canceled") - raise - except Exception: - spinner.finish("error") - raise - else: - spinner.finish("done") - - -HIDE_CURSOR = "\x1b[?25l" -SHOW_CURSOR = "\x1b[?25h" - - -@contextlib.contextmanager -def hidden_cursor(file: IO[str]) -> Generator[None, None, None]: - # The Windows terminal does not support the hide/show cursor ANSI codes, - # even via colorama. So don't even try. - if WINDOWS: - yield - # We don't want to clutter the output with control characters if we're - # writing to a file, or if the user is running with --quiet. - # See https://github.com/pypa/pip/issues/3418 - elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: - yield - else: - file.write(HIDE_CURSOR) - try: - yield - finally: - file.write(SHOW_CURSOR) diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/cli/status_codes.py b/blog-app/venv/Lib/site-packages/pip/_internal/cli/status_codes.py deleted file mode 100644 index 5e29502..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/cli/status_codes.py +++ /dev/null @@ -1,6 +0,0 @@ -SUCCESS = 0 -ERROR = 1 -UNKNOWN_ERROR = 2 -VIRTUALENV_NOT_FOUND = 3 -PREVIOUS_BUILD_DIR_ERROR = 4 -NO_MATCHES_FOUND = 23 diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/__init__.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/__init__.py deleted file mode 100644 index bc4f216..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/__init__.py +++ /dev/null @@ -1,137 +0,0 @@ -""" -Package containing all pip commands -""" - -import importlib -from collections import namedtuple -from typing import Any, Dict, Optional - -from pip._internal.cli.base_command import Command - -CommandInfo = namedtuple("CommandInfo", "module_path, class_name, summary") - -# This dictionary does a bunch of heavy lifting for help output: -# - Enables avoiding additional (costly) imports for presenting `--help`. -# - The ordering matters for help display. -# -# Even though the module path starts with the same "pip._internal.commands" -# prefix, the full path makes testing easier (specifically when modifying -# `commands_dict` in test setup / teardown). -commands_dict: Dict[str, CommandInfo] = { - "install": CommandInfo( - "pip._internal.commands.install", - "InstallCommand", - "Install packages.", - ), - "lock": CommandInfo( - "pip._internal.commands.lock", - "LockCommand", - "Generate a lock file.", - ), - "download": CommandInfo( - "pip._internal.commands.download", - "DownloadCommand", - "Download packages.", - ), - "uninstall": CommandInfo( - "pip._internal.commands.uninstall", - "UninstallCommand", - "Uninstall packages.", - ), - "freeze": CommandInfo( - "pip._internal.commands.freeze", - "FreezeCommand", - "Output installed packages in requirements format.", - ), - "inspect": CommandInfo( - "pip._internal.commands.inspect", - "InspectCommand", - "Inspect the python environment.", - ), - "list": CommandInfo( - "pip._internal.commands.list", - "ListCommand", - "List installed packages.", - ), - "show": CommandInfo( - "pip._internal.commands.show", - "ShowCommand", - "Show information about installed packages.", - ), - "check": CommandInfo( - "pip._internal.commands.check", - "CheckCommand", - "Verify installed packages have compatible dependencies.", - ), - "config": CommandInfo( - "pip._internal.commands.configuration", - "ConfigurationCommand", - "Manage local and global configuration.", - ), - "search": CommandInfo( - "pip._internal.commands.search", - "SearchCommand", - "Search PyPI for packages.", - ), - "cache": CommandInfo( - "pip._internal.commands.cache", - "CacheCommand", - "Inspect and manage pip's wheel cache.", - ), - "index": CommandInfo( - "pip._internal.commands.index", - "IndexCommand", - "Inspect information available from package indexes.", - ), - "wheel": CommandInfo( - "pip._internal.commands.wheel", - "WheelCommand", - "Build wheels from your requirements.", - ), - "hash": CommandInfo( - "pip._internal.commands.hash", - "HashCommand", - "Compute hashes of package archives.", - ), - "completion": CommandInfo( - "pip._internal.commands.completion", - "CompletionCommand", - "A helper command used for command completion.", - ), - "debug": CommandInfo( - "pip._internal.commands.debug", - "DebugCommand", - "Show information useful for debugging.", - ), - "help": CommandInfo( - "pip._internal.commands.help", - "HelpCommand", - "Show help for commands.", - ), -} - - -def create_command(name: str, **kwargs: Any) -> Command: - """ - Create an instance of the Command class with the given name. - """ - module_path, class_name, summary = commands_dict[name] - module = importlib.import_module(module_path) - command_class = getattr(module, class_name) - command = command_class(name=name, summary=summary, **kwargs) - - return command - - -def get_similar_commands(name: str) -> Optional[str]: - """Command name auto-correct.""" - from difflib import get_close_matches - - name = name.lower() - - close_commands = get_close_matches(name, commands_dict.keys()) - - if close_commands: - return close_commands[0] - else: - return None diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 6a4632d0aedcc4e85d61cfb67b013e90bd1a63cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3377 zcmaJ@O>7%Q6yBflPi!Y?p?~QQU7#%(8i%$(OKG8PLQ7~!1EB?37ORcl*j{D5Yi4#6 zY&i(2h$9!S99jtuaN)v*3l}b2xNt!laY0B(z=aE!N(kP}dX^Mw9PQ+N^WJ>#&3kWl zHkzC)8TdPR;dJNIX~XzQg6+RNf(!WY_f5mNZh%oYzyvEW>n8rU1FLJ-ZBx#XfOK>9 zTsL3OcMJ7`n#%>n?nHgUG^h=EDBQH_CEtJ|Ex`nopnTK*(1Z%2Ntl9Zg?1p?3HQPM z3hhF)8}`6nh4vwuf&Fkmp@WDH!2@tuAqUZe@DMz#&=EvO;TSxk(4&Z|@EAO<&~Zew zP=h&zo+c!Tk>t&j!xaXENW6()hIcLBtv;wcv9IVobRvuo1>+g~J zl$u?o1zMRgS_E#u>o_|N)~Zo`V{o*z;x*U3Hg%d&7<+!`hi%6T0;lKqaH`w&Lg1xe zWFeQUrYMD8mqMKM0$R0&eKG6{vfwvkQM}fR{V4PTG%C!e>qL1ZEQYOU;B+HM0_yg> zxO3cT1|H|GWIOKg1l_Q{DEJ|d(f8m1bY64)Fs2L{YdVbDNH3-qQ^OJcVCM)sy>u_U zCP)x9*9Qm25J_ddyo95s*nNeDlzB0AJV$DsmLJfXC_=Ou29XDY!(*tlftX$xnQF@W z^u)HXCK60=x=ESgdu=ka5Ie4GV@-K~HnWX0-(r*w=-|*8!c;9LFDo-mb>dnQ_mbEd zg+n1@#3_f-w-TSxE)8Suv?A8^;+m>Yk2d4~tB=&H`ba_hI*j#^*oiyT>Gk7I6go8A z@L3c}53*W5kH=RFm7=_aqbA%Z!97ApCfnbJLC2Rq(cbkDTZ zM6TJP*i;9{4SDFgcpm(~EGH%@ZBiz~SP>LZ-V`TO* zMQ@K~R$5V6lt!BQlxDuG$Qzy?crxuR7Ik&#SSDO3)1Omb$NEuPQF&d4ru`hbl=uOp z;o_N*wEZYycO50{&yL4CWBXGoMfpV>HS5DD;4!7xF1$mz6ScBnWzGBz8EvVFMgf(r zFnDlm!)Oz+Q*x%}+Rf}mr$d7tW%`}(BphD}vaHB0F9Fr6=^{)I(6yvJHa$u!Dhtv` zdpP!=gN7bjNuYeF1#P@~WP&h`@d-jDCJ0B(yI1kbMcbprq)d(i=Pt+#ipaZ0RHiJv0buZU6(pR4%rvpB@Y(3mkA_Lj9}Z;{x%Weu&{=2kAYhq$>4Iy!QVWi>P`vMH$d2=vV!t8IEp{L2%Swo?x^WD zRy1^EtTjbYwb*eCMHEJt|4jpVYHw z{2kQr3Jw*kXiZtfD#|Qez=`S(QE**|ny$-EAQojTT7VJb%YrjY z&gA2M56>QxIbt$NOdbRA@2{}HudR8wEuD7xLC*?uQ0-{*n2BlE^};a1?vwQBQWiqR zv27cwm(*U0=hC)&P9~54ibLKgk_y(aVwEgwf|yqN_oww2$!GE%QqJT*$c{|@o$Su! z-^l(<{+S%kW`%jECKsZ9QsoXO;G$oWkEnq11{ugH~5{*o+Z@)zWl RO#YnQ(DI(o_Pn{j@;78{Kz#rJ diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-310.pyc deleted file mode 100644 index a8513978e36188a2e9cd711513acf7cf2e1430f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6571 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 Yju~PZm8%gpAaqP`59A(*rih^b1*_PPDgXcg diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-310.pyc deleted file mode 100644 index 89487a16d1a3d0936e5293c157b02367f8ab2295..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1998 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 oK)q*eD9qj)SnfWii9kY_RsaA1 diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-310.pyc deleted file mode 100644 index 35f0fd9f268da3d7deca27e30906940f8ee7b6af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8962 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 diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-310.pyc deleted file mode 100644 index ba31c46ece017fa77e3574c1e4cd6b47e0701f1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6925 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 diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-310.pyc deleted file mode 100644 index 32aa537439a1cd96eaea81cb37b7a6f181fb1a23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2982 zcmZt|O>Y~=b-%bvE=h@!Y`Jm*d($Qd0$Tc#qCgM?Zsj;F5Xc5(7sZCbV!1OUSDO9s z%&ZbIQZLTcxBdVbJ@wk3GuNK{51O=xzBfx!l$#}H_&#Rdym?>q%6{KB;QR3L@8*B( z8OFa5+58+p9>WlSgNYc#WJZMl7Bh1zvP^_+X6H`iMOmq$lmo}8eFDW`Nn0qP1#ST>2PvzbsXr?TcniYIM;79dA31R7BqrzSDa4A99s z9$N2gpuGc|0;+6rAyn_2askK3SurjDVeoC>>FMXc9(^``DS$gZ&eD=4V*IS2Pk44t z$A73fO=?YlLeIx9<}`dh&&JO$Owt?#k{N;iA7yioC*<7>I~2cNT3A~cng7-^-aD5 zf42-_0s-%;4e=oW#GIQ~V2;-Y?_C;m2$sK_&x|YM5=~s1M-0RvOOPS}tH zX(DI{(r5wxgkT6n$&p!dLitGVeX-cr|3UCc#mian%`(Ej4tX9raHD zE{#(iv&14cab^Z-;r-u0<}NvH(!qOU{*kRW?wY<$2AaA9RLFT;eQiqX+J0-iHP@?l z$sVk_bM273*DdM32Hsnf?7wl=EAEkB!HR<$nwH|NrL?a*L7^A~P`O`#yoy0aSz_0|#M}Xiq_e7Qu`b zlqWJPW(`cvg9YqT4N^!t?6goc!4GMO-{21`o3qAWi7vRMS^xsbmdkFM`P__s&a`EvC7YQSy%9q zID)e2`^Bq!bD;Pb4iwK}a!qUVXSx4&`x_L?{mJd#;O>70-g<|%Wx7ARofX&p@4&rd zEe>u~snN!n%3Br+3x7BSy=PmFKw4UHwc9 zJ=NVvYvt>lh)W1X)xmIUz!v&QsCFjc-Gt%@=7u2SzX7$C=@0kd>7|n6b@;E5=GGN~ zb&Vg}OBag9>HF!Nrf2cm^-E83d|LQDoF3xz5z29NZ1h*h#(4=f8BgVXWV_HlK&gNi zjzdy#4`{;{KScfrr$;#b7AEDe42sLT7iiu#o7cr(fGbevw&|KZ{j&L%WjW^RX948@ zwA*pa#m;R2`EKMI{ zOQBk|fJTCcs5G_#9NR*$tmMjuzJfnS+RYU-gpV@chv@)@?jYI*Xzqf}_JdC~XLz?U zRvTim$srW3TzOGJspS}x`lM(FI)>4@gBhhPYaI6A|LCI$yqWQ`#o_qkt6x|IWl+`v zmO*LOzKI^*mQ+@{-b1T6YRZ_70d@cOs#<1DjNmYc1s!6_nLy*ByB7WxYL9)0zUnVo fN3}n1yzvFrBZ0PR8$EMi_MnMrep~jgbEoq^^lB{C diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-310.pyc deleted file mode 100644 index e6a756011ae894e89f05e1e6a661be5a5602e80c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2175 zcmZuyOK;mo5ayB;Nl}vRJes6#nlfk{R6wM(hoXRy21#uvDG5e6AXK9y(fsL~_@r9vz7B6aF;dev3CfJ5mRi15@n&MDj_*`_Evcuj@1_mE zQLU|{nYR2^I_J+-Yde`w7yO0vf`5T%j7%=FODDv?{8*z7t-sc2ojJ#b{}FZB721H= zWLI`9+M;u>P5&w-n_7GRPq0$!wTZG`gh|N+aOTrkNO;>Td76e9ZR@JGwz09kq3q4) zD=TZ8o3PV*^zg;{#`jxm!IOuZPgHAjYh%6lxLT~Cyun#WgJ@W0uY_tI@K~}SFJ)26 z2){Tx&Jnu@yG%or03qTVRQFA4_%+(37PY}s9gj0O&e>iWbC$A93U4P)m?v|O=CEI|P=?zHt8R)jA;TmQ-D)*jTq<}z z@P5h*8RwaJ>D|Ml_q}enyQM77WXZE$L}s8tz6o;$rdS3t)^@dBLJ8HWA$4j>gVrV{ zwI(&GpO6zm?Kd_-Eo)*^2enUh%oM<;-W%ziaMb8@!eo#`Jcg;Nzhi4c=A4agf%j9K z&PC`Oz_9G)8AJ4bIU4DAymn2QlnJTqXqd+l6UquB^h?>4?Sy3_l{sWd!O@4dqns$E z0eCKy8`6pcUG9L8+d!1Hlk+r$L%VsLDXR#%U|d}S2pN}n5Y&SK&&vWcRIp^{ca47n zC;uL=Ecc&-mgx85C{IGsU(eVohk*9KDz25}}C&%)$xG%X2n7n7k|9ID1UZ^R;)Bd!6l zh(7a}#3A}y>#xg=(bbvs?9QB2_GwZmGvosi8F0zjr~!jGRY`Ckn6WMz7}^Pu`mS+8 zh$hWVZA^A+N5)uR)m}D_OleUvHphmvksj;E&}jA+qyved_eKj#V%eQ0^tZq+iFTc% z-KtS=a5X3el!Y?HAw*S3$~fm}1#cn2_NQ6_0ubao0p>8r5^mQx0>Ez|`3woFE3*jY zu!_`_T*pm=m)RGJi>GDl2e>3|Y&)?3pU&ClWlx^10f9rW5wo-g4Zrq&EW zt9b*+JWPSMIAFJFo5a;`%vBP83w0`pP#)pcXXCvX`migZNGUnif4zRBOES^NP`pQm zg!mm3h@gE0QJa`!6QjE~{{#FkOwH7e4JdA7Qagcy{z?lTe;kveynT&-iQluK3I}mE;5TvQ zKs8J|0D`D2d03#Viqj1!$nJSTcB3TjZij*erI=r=?f(E*dpZ;V diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-310.pyc deleted file mode 100644 index 3e36314d18ac80f34726cb06ee6298d17f137085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1336 zcmZuxO>f&q5Z&c2KP1a((-=n61O{QC2Olg0IV3=k21b~W;aOg$hd?--axo2GW@n+wYJOP7$wi!U6@mswA2m2yYj9*L7*;b)WFtNY8fp*R z4z`?uHNYOW{_%*1Z&?(70p7Fvm|FACHYRuo=T1OlFX}3cBHfRoqGV0ZAs$50+a}IU z?XYvBh?NNhcB6okzLTY*lsuCBZIi*%Fqf7Q(2TPts+O97%<{g$j7S^qp4qzKjN)oJ z^Ay-oYtQQNjuqUNWyeff?bNd>6X`Pj-X~L$XT!5teVjdM{+9Iryrk;5ZWK%-<7zo4 rU;Z}}f0yv(CG94sBeOxgtHZF@-jk(JPt9deW)KHxfQ|42yhHv4T{2~@ diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-310.pyc deleted file mode 100644 index 710191ee2c6df1a79f3ef71ccf6cc7bbae03f125..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4679 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 diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-310.pyc deleted file mode 100644 index 34874d6afbc536ba71e32574198b58366fe55dce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11302 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 diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-310.pyc deleted file mode 100644 index af020ec3bc44781760661f1d12fc1f7659bbd39d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5529 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 C45gO< diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc deleted file mode 100644 index 729cce80cd0ce7edefded51888e4bcc42634854c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3359 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 diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/cache.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/cache.py deleted file mode 100644 index ad65641..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/cache.py +++ /dev/null @@ -1,228 +0,0 @@ -import os -import textwrap -from optparse import Values -from typing import Any, List - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.exceptions import CommandError, PipError -from pip._internal.utils import filesystem -from pip._internal.utils.logging import getLogger -from pip._internal.utils.misc import format_size - -logger = getLogger(__name__) - - -class CacheCommand(Command): - """ - Inspect and manage pip's wheel cache. - - Subcommands: - - - dir: Show the cache directory. - - info: Show information about the cache. - - list: List filenames of packages stored in the cache. - - remove: Remove one or more package from the cache. - - purge: Remove all items from the cache. - - ```` can be a glob expression or a package name. - """ - - ignore_require_venv = True - usage = """ - %prog dir - %prog info - %prog list [] [--format=[human, abspath]] - %prog remove - %prog purge - """ - - def add_options(self) -> None: - self.cmd_opts.add_option( - "--format", - action="store", - dest="list_format", - default="human", - choices=("human", "abspath"), - help="Select the output format among: human (default) or abspath", - ) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - handlers = { - "dir": self.get_cache_dir, - "info": self.get_cache_info, - "list": self.list_cache_items, - "remove": self.remove_cache_items, - "purge": self.purge_cache, - } - - if not options.cache_dir: - logger.error("pip cache commands can not function since cache is disabled.") - return ERROR - - # Determine action - if not args or args[0] not in handlers: - logger.error( - "Need an action (%s) to perform.", - ", ".join(sorted(handlers)), - ) - return ERROR - - action = args[0] - - # Error handling happens here, not in the action-handlers. - try: - handlers[action](options, args[1:]) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - return SUCCESS - - def get_cache_dir(self, options: Values, args: List[Any]) -> None: - if args: - raise CommandError("Too many arguments") - - logger.info(options.cache_dir) - - def get_cache_info(self, options: Values, args: List[Any]) -> None: - if args: - raise CommandError("Too many arguments") - - num_http_files = len(self._find_http_files(options)) - num_packages = len(self._find_wheels(options, "*")) - - http_cache_location = self._cache_dir(options, "http-v2") - old_http_cache_location = self._cache_dir(options, "http") - wheels_cache_location = self._cache_dir(options, "wheels") - http_cache_size = filesystem.format_size( - filesystem.directory_size(http_cache_location) - + filesystem.directory_size(old_http_cache_location) - ) - wheels_cache_size = filesystem.format_directory_size(wheels_cache_location) - - message = ( - textwrap.dedent( - """ - Package index page cache location (pip v23.3+): {http_cache_location} - Package index page cache location (older pips): {old_http_cache_location} - Package index page cache size: {http_cache_size} - Number of HTTP files: {num_http_files} - Locally built wheels location: {wheels_cache_location} - Locally built wheels size: {wheels_cache_size} - Number of locally built wheels: {package_count} - """ # noqa: E501 - ) - .format( - http_cache_location=http_cache_location, - old_http_cache_location=old_http_cache_location, - http_cache_size=http_cache_size, - num_http_files=num_http_files, - wheels_cache_location=wheels_cache_location, - package_count=num_packages, - wheels_cache_size=wheels_cache_size, - ) - .strip() - ) - - logger.info(message) - - def list_cache_items(self, options: Values, args: List[Any]) -> None: - if len(args) > 1: - raise CommandError("Too many arguments") - - if args: - pattern = args[0] - else: - pattern = "*" - - files = self._find_wheels(options, pattern) - if options.list_format == "human": - self.format_for_human(files) - else: - self.format_for_abspath(files) - - def format_for_human(self, files: List[str]) -> None: - if not files: - logger.info("No locally built wheels cached.") - return - - results = [] - for filename in files: - wheel = os.path.basename(filename) - size = filesystem.format_file_size(filename) - results.append(f" - {wheel} ({size})") - logger.info("Cache contents:\n") - logger.info("\n".join(sorted(results))) - - def format_for_abspath(self, files: List[str]) -> None: - if files: - logger.info("\n".join(sorted(files))) - - def remove_cache_items(self, options: Values, args: List[Any]) -> None: - if len(args) > 1: - raise CommandError("Too many arguments") - - if not args: - raise CommandError("Please provide a pattern") - - files = self._find_wheels(options, args[0]) - - no_matching_msg = "No matching packages" - if args[0] == "*": - # Only fetch http files if no specific pattern given - files += self._find_http_files(options) - else: - # Add the pattern to the log message - no_matching_msg += f' for pattern "{args[0]}"' - - if not files: - logger.warning(no_matching_msg) - - bytes_removed = 0 - for filename in files: - bytes_removed += os.stat(filename).st_size - os.unlink(filename) - logger.verbose("Removed %s", filename) - logger.info("Files removed: %s (%s)", len(files), format_size(bytes_removed)) - - def purge_cache(self, options: Values, args: List[Any]) -> None: - if args: - raise CommandError("Too many arguments") - - return self.remove_cache_items(options, ["*"]) - - def _cache_dir(self, options: Values, subdir: str) -> str: - return os.path.join(options.cache_dir, subdir) - - def _find_http_files(self, options: Values) -> List[str]: - old_http_dir = self._cache_dir(options, "http") - new_http_dir = self._cache_dir(options, "http-v2") - return filesystem.find_files(old_http_dir, "*") + filesystem.find_files( - new_http_dir, "*" - ) - - def _find_wheels(self, options: Values, pattern: str) -> List[str]: - wheel_dir = self._cache_dir(options, "wheels") - - # The wheel filename format, as specified in PEP 427, is: - # {distribution}-{version}(-{build})?-{python}-{abi}-{platform}.whl - # - # Additionally, non-alphanumeric values in the distribution are - # normalized to underscores (_), meaning hyphens can never occur - # before `-{version}`. - # - # Given that information: - # - If the pattern we're given contains a hyphen (-), the user is - # providing at least the version. Thus, we can just append `*.whl` - # to match the rest of it. - # - If the pattern we're given doesn't contain a hyphen (-), the - # user is only providing the name. Thus, we append `-*.whl` to - # match the hyphen before the version, followed by anything else. - # - # PEP 427: https://www.python.org/dev/peps/pep-0427/ - pattern = pattern + ("*.whl" if "-" in pattern else "-*.whl") - - return filesystem.find_files(wheel_dir, pattern) diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/check.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/check.py deleted file mode 100644 index f54a16d..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/check.py +++ /dev/null @@ -1,67 +0,0 @@ -import logging -from optparse import Values -from typing import List - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.metadata import get_default_environment -from pip._internal.operations.check import ( - check_package_set, - check_unsupported, - create_package_set_from_installed, -) -from pip._internal.utils.compatibility_tags import get_supported -from pip._internal.utils.misc import write_output - -logger = logging.getLogger(__name__) - - -class CheckCommand(Command): - """Verify installed packages have compatible dependencies.""" - - ignore_require_venv = True - usage = """ - %prog [options]""" - - def run(self, options: Values, args: List[str]) -> int: - package_set, parsing_probs = create_package_set_from_installed() - missing, conflicting = check_package_set(package_set) - unsupported = list( - check_unsupported( - get_default_environment().iter_installed_distributions(), - get_supported(), - ) - ) - - for project_name in missing: - version = package_set[project_name].version - for dependency in missing[project_name]: - write_output( - "%s %s requires %s, which is not installed.", - project_name, - version, - dependency[0], - ) - - for project_name in conflicting: - version = package_set[project_name].version - for dep_name, dep_version, req in conflicting[project_name]: - write_output( - "%s %s has requirement %s, but you have %s %s.", - project_name, - version, - req, - dep_name, - dep_version, - ) - for package in unsupported: - write_output( - "%s %s is not supported on this platform", - package.raw_name, - package.version, - ) - if missing or conflicting or parsing_probs or unsupported: - return ERROR - else: - write_output("No broken requirements found.") - return SUCCESS diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/completion.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/completion.py deleted file mode 100644 index fe041d2..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/completion.py +++ /dev/null @@ -1,136 +0,0 @@ -import sys -import textwrap -from optparse import Values -from typing import List - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.utils.misc import get_prog - -BASE_COMPLETION = """ -# pip {shell} completion start{script}# pip {shell} completion end -""" - -COMPLETION_SCRIPTS = { - "bash": """ - _pip_completion() - {{ - COMPREPLY=( $( COMP_WORDS="${{COMP_WORDS[*]}}" \\ - COMP_CWORD=$COMP_CWORD \\ - PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) ) - }} - complete -o default -F _pip_completion {prog} - """, - "zsh": """ - #compdef -P pip[0-9.]# - __pip() {{ - compadd $( COMP_WORDS="$words[*]" \\ - COMP_CWORD=$((CURRENT-1)) \\ - PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null ) - }} - if [[ $zsh_eval_context[-1] == loadautofunc ]]; then - # autoload from fpath, call function directly - __pip "$@" - else - # eval/source/. command, register function for later - compdef __pip -P 'pip[0-9.]#' - fi - """, - "fish": """ - function __fish_complete_pip - set -lx COMP_WORDS \\ - (commandline --current-process --tokenize --cut-at-cursor) \\ - (commandline --current-token --cut-at-cursor) - set -lx COMP_CWORD (math (count $COMP_WORDS) - 1) - set -lx PIP_AUTO_COMPLETE 1 - set -l completions - if string match -q '2.*' $version - set completions (eval $COMP_WORDS[1]) - else - set completions ($COMP_WORDS[1]) - end - string split \\ -- $completions - end - complete -fa "(__fish_complete_pip)" -c {prog} - """, - "powershell": """ - if ((Test-Path Function:\\TabExpansion) -and -not ` - (Test-Path Function:\\_pip_completeBackup)) {{ - Rename-Item Function:\\TabExpansion _pip_completeBackup - }} - function TabExpansion($line, $lastWord) {{ - $lastBlock = [regex]::Split($line, '[|;]')[-1].TrimStart() - if ($lastBlock.StartsWith("{prog} ")) {{ - $Env:COMP_WORDS=$lastBlock - $Env:COMP_CWORD=$lastBlock.Split().Length - 1 - $Env:PIP_AUTO_COMPLETE=1 - (& {prog}).Split() - Remove-Item Env:COMP_WORDS - Remove-Item Env:COMP_CWORD - Remove-Item Env:PIP_AUTO_COMPLETE - }} - elseif (Test-Path Function:\\_pip_completeBackup) {{ - # Fall back on existing tab expansion - _pip_completeBackup $line $lastWord - }} - }} - """, -} - - -class CompletionCommand(Command): - """A helper command to be used for command completion.""" - - ignore_require_venv = True - - def add_options(self) -> None: - self.cmd_opts.add_option( - "--bash", - "-b", - action="store_const", - const="bash", - dest="shell", - help="Emit completion code for bash", - ) - self.cmd_opts.add_option( - "--zsh", - "-z", - action="store_const", - const="zsh", - dest="shell", - help="Emit completion code for zsh", - ) - self.cmd_opts.add_option( - "--fish", - "-f", - action="store_const", - const="fish", - dest="shell", - help="Emit completion code for fish", - ) - self.cmd_opts.add_option( - "--powershell", - "-p", - action="store_const", - const="powershell", - dest="shell", - help="Emit completion code for powershell", - ) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - """Prints the completion code of the given shell""" - shells = COMPLETION_SCRIPTS.keys() - shell_options = ["--" + shell for shell in sorted(shells)] - if options.shell in shells: - script = textwrap.dedent( - COMPLETION_SCRIPTS.get(options.shell, "").format(prog=get_prog()) - ) - print(BASE_COMPLETION.format(script=script, shell=options.shell)) - return SUCCESS - else: - sys.stderr.write( - "ERROR: You must pass {}\n".format(" or ".join(shell_options)) - ) - return SUCCESS diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/configuration.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/configuration.py deleted file mode 100644 index 1a1dc6b..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/configuration.py +++ /dev/null @@ -1,280 +0,0 @@ -import logging -import os -import subprocess -from optparse import Values -from typing import Any, List, Optional - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.configuration import ( - Configuration, - Kind, - get_configuration_files, - kinds, -) -from pip._internal.exceptions import PipError -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import get_prog, write_output - -logger = logging.getLogger(__name__) - - -class ConfigurationCommand(Command): - """ - Manage local and global configuration. - - Subcommands: - - - list: List the active configuration (or from the file specified) - - edit: Edit the configuration file in an editor - - get: Get the value associated with command.option - - set: Set the command.option=value - - unset: Unset the value associated with command.option - - debug: List the configuration files and values defined under them - - Configuration keys should be dot separated command and option name, - with the special prefix "global" affecting any command. For example, - "pip config set global.index-url https://example.org/" would configure - the index url for all commands, but "pip config set download.timeout 10" - would configure a 10 second timeout only for "pip download" commands. - - If none of --user, --global and --site are passed, a virtual - environment configuration file is used if one is active and the file - exists. Otherwise, all modifications happen to the user file by - default. - """ - - ignore_require_venv = True - usage = """ - %prog [] list - %prog [] [--editor ] edit - - %prog [] get command.option - %prog [] set command.option value - %prog [] unset command.option - %prog [] debug - """ - - def add_options(self) -> None: - self.cmd_opts.add_option( - "--editor", - dest="editor", - action="store", - default=None, - help=( - "Editor to use to edit the file. Uses VISUAL or EDITOR " - "environment variables if not provided." - ), - ) - - self.cmd_opts.add_option( - "--global", - dest="global_file", - action="store_true", - default=False, - help="Use the system-wide configuration file only", - ) - - self.cmd_opts.add_option( - "--user", - dest="user_file", - action="store_true", - default=False, - help="Use the user configuration file only", - ) - - self.cmd_opts.add_option( - "--site", - dest="site_file", - action="store_true", - default=False, - help="Use the current environment configuration file only", - ) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - handlers = { - "list": self.list_values, - "edit": self.open_in_editor, - "get": self.get_name, - "set": self.set_name_value, - "unset": self.unset_name, - "debug": self.list_config_values, - } - - # Determine action - if not args or args[0] not in handlers: - logger.error( - "Need an action (%s) to perform.", - ", ".join(sorted(handlers)), - ) - return ERROR - - action = args[0] - - # Determine which configuration files are to be loaded - # Depends on whether the command is modifying. - try: - load_only = self._determine_file( - options, need_value=(action in ["get", "set", "unset", "edit"]) - ) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - # Load a new configuration - self.configuration = Configuration( - isolated=options.isolated_mode, load_only=load_only - ) - self.configuration.load() - - # Error handling happens here, not in the action-handlers. - try: - handlers[action](options, args[1:]) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - return SUCCESS - - def _determine_file(self, options: Values, need_value: bool) -> Optional[Kind]: - file_options = [ - key - for key, value in ( - (kinds.USER, options.user_file), - (kinds.GLOBAL, options.global_file), - (kinds.SITE, options.site_file), - ) - if value - ] - - if not file_options: - if not need_value: - return None - # Default to user, unless there's a site file. - elif any( - os.path.exists(site_config_file) - for site_config_file in get_configuration_files()[kinds.SITE] - ): - return kinds.SITE - else: - return kinds.USER - elif len(file_options) == 1: - return file_options[0] - - raise PipError( - "Need exactly one file to operate upon " - "(--user, --site, --global) to perform." - ) - - def list_values(self, options: Values, args: List[str]) -> None: - self._get_n_args(args, "list", n=0) - - for key, value in sorted(self.configuration.items()): - write_output("%s=%r", key, value) - - def get_name(self, options: Values, args: List[str]) -> None: - key = self._get_n_args(args, "get [name]", n=1) - value = self.configuration.get_value(key) - - write_output("%s", value) - - def set_name_value(self, options: Values, args: List[str]) -> None: - key, value = self._get_n_args(args, "set [name] [value]", n=2) - self.configuration.set_value(key, value) - - self._save_configuration() - - def unset_name(self, options: Values, args: List[str]) -> None: - key = self._get_n_args(args, "unset [name]", n=1) - self.configuration.unset_value(key) - - self._save_configuration() - - def list_config_values(self, options: Values, args: List[str]) -> None: - """List config key-value pairs across different config files""" - self._get_n_args(args, "debug", n=0) - - self.print_env_var_values() - # Iterate over config files and print if they exist, and the - # key-value pairs present in them if they do - for variant, files in sorted(self.configuration.iter_config_files()): - write_output("%s:", variant) - for fname in files: - with indent_log(): - file_exists = os.path.exists(fname) - write_output("%s, exists: %r", fname, file_exists) - if file_exists: - self.print_config_file_values(variant) - - def print_config_file_values(self, variant: Kind) -> None: - """Get key-value pairs from the file of a variant""" - for name, value in self.configuration.get_values_in_config(variant).items(): - with indent_log(): - write_output("%s: %s", name, value) - - def print_env_var_values(self) -> None: - """Get key-values pairs present as environment variables""" - write_output("%s:", "env_var") - with indent_log(): - for key, value in sorted(self.configuration.get_environ_vars()): - env_var = f"PIP_{key.upper()}" - write_output("%s=%r", env_var, value) - - def open_in_editor(self, options: Values, args: List[str]) -> None: - editor = self._determine_editor(options) - - fname = self.configuration.get_file_to_edit() - if fname is None: - raise PipError("Could not determine appropriate file.") - elif '"' in fname: - # This shouldn't happen, unless we see a username like that. - # If that happens, we'd appreciate a pull request fixing this. - raise PipError( - f'Can not open an editor for a file name containing "\n{fname}' - ) - - try: - subprocess.check_call(f'{editor} "{fname}"', shell=True) - except FileNotFoundError as e: - if not e.filename: - e.filename = editor - raise - except subprocess.CalledProcessError as e: - raise PipError(f"Editor Subprocess exited with exit code {e.returncode}") - - def _get_n_args(self, args: List[str], example: str, n: int) -> Any: - """Helper to make sure the command got the right number of arguments""" - if len(args) != n: - msg = ( - f"Got unexpected number of arguments, expected {n}. " - f'(example: "{get_prog()} config {example}")' - ) - raise PipError(msg) - - if n == 1: - return args[0] - else: - return args - - def _save_configuration(self) -> None: - # We successfully ran a modifying command. Need to save the - # configuration. - try: - self.configuration.save() - except Exception: - logger.exception( - "Unable to save configuration. Please report this as a bug." - ) - raise PipError("Internal Error.") - - def _determine_editor(self, options: Values) -> str: - if options.editor is not None: - return options.editor - elif "VISUAL" in os.environ: - return os.environ["VISUAL"] - elif "EDITOR" in os.environ: - return os.environ["EDITOR"] - else: - raise PipError("Could not determine editor to use.") diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/debug.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/debug.py deleted file mode 100644 index 567ca96..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/debug.py +++ /dev/null @@ -1,201 +0,0 @@ -import locale -import logging -import os -import sys -from optparse import Values -from types import ModuleType -from typing import Any, Dict, List, Optional - -import pip._vendor -from pip._vendor.certifi import where -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import Command -from pip._internal.cli.cmdoptions import make_target_python -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.configuration import Configuration -from pip._internal.metadata import get_environment -from pip._internal.utils.compat import open_text_resource -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import get_pip_version - -logger = logging.getLogger(__name__) - - -def show_value(name: str, value: Any) -> None: - logger.info("%s: %s", name, value) - - -def show_sys_implementation() -> None: - logger.info("sys.implementation:") - implementation_name = sys.implementation.name - with indent_log(): - show_value("name", implementation_name) - - -def create_vendor_txt_map() -> Dict[str, str]: - with open_text_resource("pip._vendor", "vendor.txt") as f: - # Purge non version specifying lines. - # Also, remove any space prefix or suffixes (including comments). - lines = [ - line.strip().split(" ", 1)[0] for line in f.readlines() if "==" in line - ] - - # Transform into "module" -> version dict. - return dict(line.split("==", 1) for line in lines) - - -def get_module_from_module_name(module_name: str) -> Optional[ModuleType]: - # Module name can be uppercase in vendor.txt for some reason... - module_name = module_name.lower().replace("-", "_") - # PATCH: setuptools is actually only pkg_resources. - if module_name == "setuptools": - module_name = "pkg_resources" - - try: - __import__(f"pip._vendor.{module_name}", globals(), locals(), level=0) - return getattr(pip._vendor, module_name) - except ImportError: - # We allow 'truststore' to fail to import due - # to being unavailable on Python 3.9 and earlier. - if module_name == "truststore" and sys.version_info < (3, 10): - return None - raise - - -def get_vendor_version_from_module(module_name: str) -> Optional[str]: - module = get_module_from_module_name(module_name) - version = getattr(module, "__version__", None) - - if module and not version: - # Try to find version in debundled module info. - assert module.__file__ is not None - env = get_environment([os.path.dirname(module.__file__)]) - dist = env.get_distribution(module_name) - if dist: - version = str(dist.version) - - return version - - -def show_actual_vendor_versions(vendor_txt_versions: Dict[str, str]) -> None: - """Log the actual version and print extra info if there is - a conflict or if the actual version could not be imported. - """ - for module_name, expected_version in vendor_txt_versions.items(): - extra_message = "" - actual_version = get_vendor_version_from_module(module_name) - if not actual_version: - extra_message = ( - " (Unable to locate actual module version, using" - " vendor.txt specified version)" - ) - actual_version = expected_version - elif parse_version(actual_version) != parse_version(expected_version): - extra_message = ( - " (CONFLICT: vendor.txt suggests version should" - f" be {expected_version})" - ) - logger.info("%s==%s%s", module_name, actual_version, extra_message) - - -def show_vendor_versions() -> None: - logger.info("vendored library versions:") - - vendor_txt_versions = create_vendor_txt_map() - with indent_log(): - show_actual_vendor_versions(vendor_txt_versions) - - -def show_tags(options: Values) -> None: - tag_limit = 10 - - target_python = make_target_python(options) - tags = target_python.get_sorted_tags() - - # Display the target options that were explicitly provided. - formatted_target = target_python.format_given() - suffix = "" - if formatted_target: - suffix = f" (target: {formatted_target})" - - msg = f"Compatible tags: {len(tags)}{suffix}" - logger.info(msg) - - if options.verbose < 1 and len(tags) > tag_limit: - tags_limited = True - tags = tags[:tag_limit] - else: - tags_limited = False - - with indent_log(): - for tag in tags: - logger.info(str(tag)) - - if tags_limited: - msg = f"...\n[First {tag_limit} tags shown. Pass --verbose to show all.]" - logger.info(msg) - - -def ca_bundle_info(config: Configuration) -> str: - levels = {key.split(".", 1)[0] for key, _ in config.items()} - if not levels: - return "Not specified" - - levels_that_override_global = ["install", "wheel", "download"] - global_overriding_level = [ - level for level in levels if level in levels_that_override_global - ] - if not global_overriding_level: - return "global" - - if "global" in levels: - levels.remove("global") - return ", ".join(levels) - - -class DebugCommand(Command): - """ - Display debug information. - """ - - usage = """ - %prog """ - ignore_require_venv = True - - def add_options(self) -> None: - cmdoptions.add_target_python_options(self.cmd_opts) - self.parser.insert_option_group(0, self.cmd_opts) - self.parser.config.load() - - def run(self, options: Values, args: List[str]) -> int: - logger.warning( - "This command is only meant for debugging. " - "Do not use this with automation for parsing and getting these " - "details, since the output and options of this command may " - "change without notice." - ) - show_value("pip version", get_pip_version()) - show_value("sys.version", sys.version) - show_value("sys.executable", sys.executable) - show_value("sys.getdefaultencoding", sys.getdefaultencoding()) - show_value("sys.getfilesystemencoding", sys.getfilesystemencoding()) - show_value( - "locale.getpreferredencoding", - locale.getpreferredencoding(), - ) - show_value("sys.platform", sys.platform) - show_sys_implementation() - - show_value("'cert' config value", ca_bundle_info(self.parser.config)) - show_value("REQUESTS_CA_BUNDLE", os.environ.get("REQUESTS_CA_BUNDLE")) - show_value("CURL_CA_BUNDLE", os.environ.get("CURL_CA_BUNDLE")) - show_value("pip._vendor.certifi.where()", where()) - show_value("pip._vendor.DEBUNDLED", pip._vendor.DEBUNDLED) - - show_vendor_versions() - - show_tags(options) - - return SUCCESS diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/download.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/download.py deleted file mode 100644 index 917bbb9..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/download.py +++ /dev/null @@ -1,146 +0,0 @@ -import logging -import os -from optparse import Values -from typing import List - -from pip._internal.cli import cmdoptions -from pip._internal.cli.cmdoptions import make_target_python -from pip._internal.cli.req_command import RequirementCommand, with_cleanup -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.operations.build.build_tracker import get_build_tracker -from pip._internal.req.req_install import check_legacy_setup_py_options -from pip._internal.utils.misc import ensure_dir, normalize_path, write_output -from pip._internal.utils.temp_dir import TempDirectory - -logger = logging.getLogger(__name__) - - -class DownloadCommand(RequirementCommand): - """ - Download packages from: - - - PyPI (and other indexes) using requirement specifiers. - - VCS project urls. - - Local project directories. - - Local or remote source archives. - - pip also supports downloading from "requirements files", which provide - an easy way to specify a whole environment to be downloaded. - """ - - usage = """ - %prog [options] [package-index-options] ... - %prog [options] -r [package-index-options] ... - %prog [options] ... - %prog [options] ... - %prog [options] ...""" - - def add_options(self) -> None: - self.cmd_opts.add_option(cmdoptions.constraints()) - self.cmd_opts.add_option(cmdoptions.requirements()) - self.cmd_opts.add_option(cmdoptions.no_deps()) - self.cmd_opts.add_option(cmdoptions.global_options()) - self.cmd_opts.add_option(cmdoptions.no_binary()) - self.cmd_opts.add_option(cmdoptions.only_binary()) - self.cmd_opts.add_option(cmdoptions.prefer_binary()) - self.cmd_opts.add_option(cmdoptions.src()) - self.cmd_opts.add_option(cmdoptions.pre()) - self.cmd_opts.add_option(cmdoptions.require_hashes()) - self.cmd_opts.add_option(cmdoptions.progress_bar()) - self.cmd_opts.add_option(cmdoptions.no_build_isolation()) - self.cmd_opts.add_option(cmdoptions.use_pep517()) - self.cmd_opts.add_option(cmdoptions.no_use_pep517()) - self.cmd_opts.add_option(cmdoptions.check_build_deps()) - self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) - - self.cmd_opts.add_option( - "-d", - "--dest", - "--destination-dir", - "--destination-directory", - dest="download_dir", - metavar="dir", - default=os.curdir, - help="Download packages into .", - ) - - cmdoptions.add_target_python_options(self.cmd_opts) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, self.cmd_opts) - - @with_cleanup - def run(self, options: Values, args: List[str]) -> int: - options.ignore_installed = True - # editable doesn't really make sense for `pip download`, but the bowels - # of the RequirementSet code require that property. - options.editables = [] - - cmdoptions.check_dist_restriction(options) - - options.download_dir = normalize_path(options.download_dir) - ensure_dir(options.download_dir) - - session = self.get_default_session(options) - - target_python = make_target_python(options) - finder = self._build_package_finder( - options=options, - session=session, - target_python=target_python, - ignore_requires_python=options.ignore_requires_python, - ) - - build_tracker = self.enter_context(get_build_tracker()) - - directory = TempDirectory( - delete=not options.no_clean, - kind="download", - globally_managed=True, - ) - - reqs = self.get_requirements(args, options, finder, session) - check_legacy_setup_py_options(options, reqs) - - preparer = self.make_requirement_preparer( - temp_build_dir=directory, - options=options, - build_tracker=build_tracker, - session=session, - finder=finder, - download_dir=options.download_dir, - use_user_site=False, - verbosity=self.verbosity, - ) - - resolver = self.make_resolver( - preparer=preparer, - finder=finder, - options=options, - ignore_requires_python=options.ignore_requires_python, - use_pep517=options.use_pep517, - py_version_info=options.python_version, - ) - - self.trace_basic_info(finder) - - requirement_set = resolver.resolve(reqs, check_supported_wheels=True) - - downloaded: List[str] = [] - for req in requirement_set.requirements.values(): - if req.satisfied_by is None: - assert req.name is not None - preparer.save_linked_requirement(req) - downloaded.append(req.name) - - preparer.prepare_linked_requirements_more(requirement_set.requirements.values()) - - if downloaded: - write_output("Successfully downloaded %s", " ".join(downloaded)) - - return SUCCESS diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/freeze.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/freeze.py deleted file mode 100644 index f8de335..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/freeze.py +++ /dev/null @@ -1,108 +0,0 @@ -import sys -from optparse import Values -from typing import AbstractSet, List - -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.operations.freeze import freeze -from pip._internal.utils.compat import stdlib_pkgs - - -def _should_suppress_build_backends() -> bool: - return sys.version_info < (3, 12) - - -def _dev_pkgs() -> AbstractSet[str]: - pkgs = {"pip"} - - if _should_suppress_build_backends(): - pkgs |= {"setuptools", "distribute", "wheel"} - - return pkgs - - -class FreezeCommand(Command): - """ - Output installed packages in requirements format. - - packages are listed in a case-insensitive sorted order. - """ - - ignore_require_venv = True - usage = """ - %prog [options]""" - - def add_options(self) -> None: - self.cmd_opts.add_option( - "-r", - "--requirement", - dest="requirements", - action="append", - default=[], - metavar="file", - help=( - "Use the order in the given requirements file and its " - "comments when generating output. This option can be " - "used multiple times." - ), - ) - self.cmd_opts.add_option( - "-l", - "--local", - dest="local", - action="store_true", - default=False, - help=( - "If in a virtualenv that has global access, do not output " - "globally-installed packages." - ), - ) - self.cmd_opts.add_option( - "--user", - dest="user", - action="store_true", - default=False, - help="Only output packages installed in user-site.", - ) - self.cmd_opts.add_option(cmdoptions.list_path()) - self.cmd_opts.add_option( - "--all", - dest="freeze_all", - action="store_true", - help=( - "Do not skip these packages in the output:" - " {}".format(", ".join(_dev_pkgs())) - ), - ) - self.cmd_opts.add_option( - "--exclude-editable", - dest="exclude_editable", - action="store_true", - help="Exclude editable package from output.", - ) - self.cmd_opts.add_option(cmdoptions.list_exclude()) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - skip = set(stdlib_pkgs) - if not options.freeze_all: - skip.update(_dev_pkgs()) - - if options.excludes: - skip.update(options.excludes) - - cmdoptions.check_list_path_option(options) - - for line in freeze( - requirement=options.requirements, - local_only=options.local, - user_only=options.user, - paths=options.path, - isolated=options.isolated_mode, - skip=skip, - exclude_editable=options.exclude_editable, - ): - sys.stdout.write(line + "\n") - return SUCCESS diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/hash.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/hash.py deleted file mode 100644 index 042dac8..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/hash.py +++ /dev/null @@ -1,59 +0,0 @@ -import hashlib -import logging -import sys -from optparse import Values -from typing import List - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES -from pip._internal.utils.misc import read_chunks, write_output - -logger = logging.getLogger(__name__) - - -class HashCommand(Command): - """ - Compute a hash of a local package archive. - - These can be used with --hash in a requirements file to do repeatable - installs. - """ - - usage = "%prog [options] ..." - ignore_require_venv = True - - def add_options(self) -> None: - self.cmd_opts.add_option( - "-a", - "--algorithm", - dest="algorithm", - choices=STRONG_HASHES, - action="store", - default=FAVORITE_HASH, - help="The hash algorithm to use: one of {}".format( - ", ".join(STRONG_HASHES) - ), - ) - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - if not args: - self.parser.print_usage(sys.stderr) - return ERROR - - algorithm = options.algorithm - for path in args: - write_output( - "%s:\n--hash=%s:%s", path, algorithm, _hash_of_file(path, algorithm) - ) - return SUCCESS - - -def _hash_of_file(path: str, algorithm: str) -> str: - """Return the hash digest of a file.""" - with open(path, "rb") as archive: - hash = hashlib.new(algorithm) - for chunk in read_chunks(archive): - hash.update(chunk) - return hash.hexdigest() diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/help.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/help.py deleted file mode 100644 index 6206631..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/help.py +++ /dev/null @@ -1,41 +0,0 @@ -from optparse import Values -from typing import List - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.exceptions import CommandError - - -class HelpCommand(Command): - """Show help for commands""" - - usage = """ - %prog """ - ignore_require_venv = True - - def run(self, options: Values, args: List[str]) -> int: - from pip._internal.commands import ( - commands_dict, - create_command, - get_similar_commands, - ) - - try: - # 'pip help' with no args is handled by pip.__init__.parseopt() - cmd_name = args[0] # the command we need help for - except IndexError: - return SUCCESS - - if cmd_name not in commands_dict: - guess = get_similar_commands(cmd_name) - - msg = [f'unknown command "{cmd_name}"'] - if guess: - msg.append(f'maybe you meant "{guess}"') - - raise CommandError(" - ".join(msg)) - - command = create_command(cmd_name) - command.parser.print_help() - - return SUCCESS diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/index.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/index.py deleted file mode 100644 index e8714a7..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/index.py +++ /dev/null @@ -1,153 +0,0 @@ -import json -import logging -from optparse import Values -from typing import Any, Iterable, List, Optional - -from pip._vendor.packaging.version import Version - -from pip._internal.cli import cmdoptions -from pip._internal.cli.req_command import IndexGroupCommand -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.commands.search import ( - get_installed_distribution, - print_dist_installation_info, -) -from pip._internal.exceptions import CommandError, DistributionNotFound, PipError -from pip._internal.index.collector import LinkCollector -from pip._internal.index.package_finder import PackageFinder -from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.models.target_python import TargetPython -from pip._internal.network.session import PipSession -from pip._internal.utils.misc import write_output - -logger = logging.getLogger(__name__) - - -class IndexCommand(IndexGroupCommand): - """ - Inspect information available from package indexes. - """ - - ignore_require_venv = True - usage = """ - %prog versions - """ - - def add_options(self) -> None: - cmdoptions.add_target_python_options(self.cmd_opts) - - self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) - self.cmd_opts.add_option(cmdoptions.pre()) - self.cmd_opts.add_option(cmdoptions.json()) - self.cmd_opts.add_option(cmdoptions.no_binary()) - self.cmd_opts.add_option(cmdoptions.only_binary()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - handlers = { - "versions": self.get_available_package_versions, - } - - # Determine action - if not args or args[0] not in handlers: - logger.error( - "Need an action (%s) to perform.", - ", ".join(sorted(handlers)), - ) - return ERROR - - action = args[0] - - # Error handling happens here, not in the action-handlers. - try: - handlers[action](options, args[1:]) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - return SUCCESS - - def _build_package_finder( - self, - options: Values, - session: PipSession, - target_python: Optional[TargetPython] = None, - ignore_requires_python: Optional[bool] = None, - ) -> PackageFinder: - """ - Create a package finder appropriate to the index command. - """ - link_collector = LinkCollector.create(session, options=options) - - # Pass allow_yanked=False to ignore yanked versions. - selection_prefs = SelectionPreferences( - allow_yanked=False, - allow_all_prereleases=options.pre, - ignore_requires_python=ignore_requires_python, - ) - - return PackageFinder.create( - link_collector=link_collector, - selection_prefs=selection_prefs, - target_python=target_python, - ) - - def get_available_package_versions(self, options: Values, args: List[Any]) -> None: - if len(args) != 1: - raise CommandError("You need to specify exactly one argument") - - target_python = cmdoptions.make_target_python(options) - query = args[0] - - with self._build_session(options) as session: - finder = self._build_package_finder( - options=options, - session=session, - target_python=target_python, - ignore_requires_python=options.ignore_requires_python, - ) - - versions: Iterable[Version] = ( - candidate.version for candidate in finder.find_all_candidates(query) - ) - - if not options.pre: - # Remove prereleases - versions = ( - version for version in versions if not version.is_prerelease - ) - versions = set(versions) - - if not versions: - raise DistributionNotFound( - f"No matching distribution found for {query}" - ) - - formatted_versions = [str(ver) for ver in sorted(versions, reverse=True)] - latest = formatted_versions[0] - - dist = get_installed_distribution(query) - - if options.json: - structured_output = { - "name": query, - "versions": formatted_versions, - "latest": latest, - } - - if dist is not None: - structured_output["installed_version"] = str(dist.version) - - write_output(json.dumps(structured_output)) - - else: - write_output(f"{query} ({latest})") - write_output("Available versions: {}".format(", ".join(formatted_versions))) - print_dist_installation_info(latest, dist) diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/inspect.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/inspect.py deleted file mode 100644 index e810c13..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/inspect.py +++ /dev/null @@ -1,92 +0,0 @@ -import logging -from optparse import Values -from typing import Any, Dict, List - -from pip._vendor.packaging.markers import default_environment -from pip._vendor.rich import print_json - -from pip import __version__ -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.metadata import BaseDistribution, get_environment -from pip._internal.utils.compat import stdlib_pkgs -from pip._internal.utils.urls import path_to_url - -logger = logging.getLogger(__name__) - - -class InspectCommand(Command): - """ - Inspect the content of a Python environment and produce a report in JSON format. - """ - - ignore_require_venv = True - usage = """ - %prog [options]""" - - def add_options(self) -> None: - self.cmd_opts.add_option( - "--local", - action="store_true", - default=False, - help=( - "If in a virtualenv that has global access, do not list " - "globally-installed packages." - ), - ) - self.cmd_opts.add_option( - "--user", - dest="user", - action="store_true", - default=False, - help="Only output packages installed in user-site.", - ) - self.cmd_opts.add_option(cmdoptions.list_path()) - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - cmdoptions.check_list_path_option(options) - dists = get_environment(options.path).iter_installed_distributions( - local_only=options.local, - user_only=options.user, - skip=set(stdlib_pkgs), - ) - output = { - "version": "1", - "pip_version": __version__, - "installed": [self._dist_to_dict(dist) for dist in dists], - "environment": default_environment(), - # TODO tags? scheme? - } - print_json(data=output) - return SUCCESS - - def _dist_to_dict(self, dist: BaseDistribution) -> Dict[str, Any]: - res: Dict[str, Any] = { - "metadata": dist.metadata_dict, - "metadata_location": dist.info_location, - } - # direct_url. Note that we don't have download_info (as in the installation - # report) since it is not recorded in installed metadata. - direct_url = dist.direct_url - if direct_url is not None: - res["direct_url"] = direct_url.to_dict() - else: - # Emulate direct_url for legacy editable installs. - editable_project_location = dist.editable_project_location - if editable_project_location is not None: - res["direct_url"] = { - "url": path_to_url(editable_project_location), - "dir_info": { - "editable": True, - }, - } - # installer - installer = dist.installer - if dist.installer: - res["installer"] = installer - # requested - if dist.installed_with_dist_info: - res["requested"] = dist.requested - return res diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/install.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/install.py deleted file mode 100644 index 300ae92..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/install.py +++ /dev/null @@ -1,793 +0,0 @@ -import errno -import json -import operator -import os -import shutil -import site -from optparse import SUPPRESS_HELP, Values -from typing import List, Optional - -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.requests.exceptions import InvalidProxyURL -from pip._vendor.rich import print_json - -# Eagerly import self_outdated_check to avoid crashes. Otherwise, -# this module would be imported *after* pip was replaced, resulting -# in crashes if the new self_outdated_check module was incompatible -# with the rest of pip that's already imported, or allowing a -# wheel to execute arbitrary code on install by replacing -# self_outdated_check. -import pip._internal.self_outdated_check # noqa: F401 -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.cmdoptions import make_target_python -from pip._internal.cli.req_command import ( - RequirementCommand, - with_cleanup, -) -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.exceptions import CommandError, InstallationError -from pip._internal.locations import get_scheme -from pip._internal.metadata import get_environment -from pip._internal.models.installation_report import InstallationReport -from pip._internal.operations.build.build_tracker import get_build_tracker -from pip._internal.operations.check import ConflictDetails, check_install_conflicts -from pip._internal.req import install_given_reqs -from pip._internal.req.req_install import ( - InstallRequirement, - check_legacy_setup_py_options, -) -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.filesystem import test_writable_dir -from pip._internal.utils.logging import getLogger -from pip._internal.utils.misc import ( - check_externally_managed, - ensure_dir, - get_pip_version, - protect_pip_from_modification_on_windows, - warn_if_run_as_root, - write_output, -) -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.virtualenv import ( - running_under_virtualenv, - virtualenv_no_global, -) -from pip._internal.wheel_builder import build, should_build_for_install_command - -logger = getLogger(__name__) - - -class InstallCommand(RequirementCommand): - """ - Install packages from: - - - PyPI (and other indexes) using requirement specifiers. - - VCS project urls. - - Local project directories. - - Local or remote source archives. - - pip also supports installing from "requirements files", which provide - an easy way to specify a whole environment to be installed. - """ - - usage = """ - %prog [options] [package-index-options] ... - %prog [options] -r [package-index-options] ... - %prog [options] [-e] ... - %prog [options] [-e] ... - %prog [options] ...""" - - def add_options(self) -> None: - self.cmd_opts.add_option(cmdoptions.requirements()) - self.cmd_opts.add_option(cmdoptions.constraints()) - self.cmd_opts.add_option(cmdoptions.no_deps()) - self.cmd_opts.add_option(cmdoptions.pre()) - - self.cmd_opts.add_option(cmdoptions.editable()) - self.cmd_opts.add_option( - "--dry-run", - action="store_true", - dest="dry_run", - default=False, - help=( - "Don't actually install anything, just print what would be. " - "Can be used in combination with --ignore-installed " - "to 'resolve' the requirements." - ), - ) - self.cmd_opts.add_option( - "-t", - "--target", - dest="target_dir", - metavar="dir", - default=None, - help=( - "Install packages into . " - "By default this will not replace existing files/folders in " - ". Use --upgrade to replace existing packages in " - "with new versions." - ), - ) - cmdoptions.add_target_python_options(self.cmd_opts) - - self.cmd_opts.add_option( - "--user", - dest="use_user_site", - action="store_true", - help=( - "Install to the Python user install directory for your " - "platform. Typically ~/.local/, or %APPDATA%\\Python on " - "Windows. (See the Python documentation for site.USER_BASE " - "for full details.)" - ), - ) - self.cmd_opts.add_option( - "--no-user", - dest="use_user_site", - action="store_false", - help=SUPPRESS_HELP, - ) - self.cmd_opts.add_option( - "--root", - dest="root_path", - metavar="dir", - default=None, - help="Install everything relative to this alternate root directory.", - ) - self.cmd_opts.add_option( - "--prefix", - dest="prefix_path", - metavar="dir", - default=None, - help=( - "Installation prefix where lib, bin and other top-level " - "folders are placed. Note that the resulting installation may " - "contain scripts and other resources which reference the " - "Python interpreter of pip, and not that of ``--prefix``. " - "See also the ``--python`` option if the intention is to " - "install packages into another (possibly pip-free) " - "environment." - ), - ) - - self.cmd_opts.add_option(cmdoptions.src()) - - self.cmd_opts.add_option( - "-U", - "--upgrade", - dest="upgrade", - action="store_true", - help=( - "Upgrade all specified packages to the newest available " - "version. The handling of dependencies depends on the " - "upgrade-strategy used." - ), - ) - - self.cmd_opts.add_option( - "--upgrade-strategy", - dest="upgrade_strategy", - default="only-if-needed", - choices=["only-if-needed", "eager"], - help=( - "Determines how dependency upgrading should be handled " - "[default: %default]. " - '"eager" - dependencies are upgraded regardless of ' - "whether the currently installed version satisfies the " - "requirements of the upgraded package(s). " - '"only-if-needed" - are upgraded only when they do not ' - "satisfy the requirements of the upgraded package(s)." - ), - ) - - self.cmd_opts.add_option( - "--force-reinstall", - dest="force_reinstall", - action="store_true", - help="Reinstall all packages even if they are already up-to-date.", - ) - - self.cmd_opts.add_option( - "-I", - "--ignore-installed", - dest="ignore_installed", - action="store_true", - help=( - "Ignore the installed packages, overwriting them. " - "This can break your system if the existing package " - "is of a different version or was installed " - "with a different package manager!" - ), - ) - - self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) - self.cmd_opts.add_option(cmdoptions.no_build_isolation()) - self.cmd_opts.add_option(cmdoptions.use_pep517()) - self.cmd_opts.add_option(cmdoptions.no_use_pep517()) - self.cmd_opts.add_option(cmdoptions.check_build_deps()) - self.cmd_opts.add_option(cmdoptions.override_externally_managed()) - - self.cmd_opts.add_option(cmdoptions.config_settings()) - self.cmd_opts.add_option(cmdoptions.global_options()) - - self.cmd_opts.add_option( - "--compile", - action="store_true", - dest="compile", - default=True, - help="Compile Python source files to bytecode", - ) - - self.cmd_opts.add_option( - "--no-compile", - action="store_false", - dest="compile", - help="Do not compile Python source files to bytecode", - ) - - self.cmd_opts.add_option( - "--no-warn-script-location", - action="store_false", - dest="warn_script_location", - default=True, - help="Do not warn when installing scripts outside PATH", - ) - self.cmd_opts.add_option( - "--no-warn-conflicts", - action="store_false", - dest="warn_about_conflicts", - default=True, - help="Do not warn about broken dependencies", - ) - self.cmd_opts.add_option(cmdoptions.no_binary()) - self.cmd_opts.add_option(cmdoptions.only_binary()) - self.cmd_opts.add_option(cmdoptions.prefer_binary()) - self.cmd_opts.add_option(cmdoptions.require_hashes()) - self.cmd_opts.add_option(cmdoptions.progress_bar()) - self.cmd_opts.add_option(cmdoptions.root_user_action()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, self.cmd_opts) - - self.cmd_opts.add_option( - "--report", - dest="json_report_file", - metavar="file", - default=None, - help=( - "Generate a JSON file describing what pip did to install " - "the provided requirements. " - "Can be used in combination with --dry-run and --ignore-installed " - "to 'resolve' the requirements. " - "When - is used as file name it writes to stdout. " - "When writing to stdout, please combine with the --quiet option " - "to avoid mixing pip logging output with JSON output." - ), - ) - - @with_cleanup - def run(self, options: Values, args: List[str]) -> int: - if options.use_user_site and options.target_dir is not None: - raise CommandError("Can not combine '--user' and '--target'") - - # Check whether the environment we're installing into is externally - # managed, as specified in PEP 668. Specifying --root, --target, or - # --prefix disables the check, since there's no reliable way to locate - # the EXTERNALLY-MANAGED file for those cases. An exception is also - # made specifically for "--dry-run --report" for convenience. - installing_into_current_environment = ( - not (options.dry_run and options.json_report_file) - and options.root_path is None - and options.target_dir is None - and options.prefix_path is None - ) - if ( - installing_into_current_environment - and not options.override_externally_managed - ): - check_externally_managed() - - upgrade_strategy = "to-satisfy-only" - if options.upgrade: - upgrade_strategy = options.upgrade_strategy - - cmdoptions.check_dist_restriction(options, check_target=True) - - logger.verbose("Using %s", get_pip_version()) - options.use_user_site = decide_user_install( - options.use_user_site, - prefix_path=options.prefix_path, - target_dir=options.target_dir, - root_path=options.root_path, - isolated_mode=options.isolated_mode, - ) - - target_temp_dir: Optional[TempDirectory] = None - target_temp_dir_path: Optional[str] = None - if options.target_dir: - options.ignore_installed = True - options.target_dir = os.path.abspath(options.target_dir) - if ( - # fmt: off - os.path.exists(options.target_dir) and - not os.path.isdir(options.target_dir) - # fmt: on - ): - raise CommandError( - "Target path exists but is not a directory, will not continue." - ) - - # Create a target directory for using with the target option - target_temp_dir = TempDirectory(kind="target") - target_temp_dir_path = target_temp_dir.path - self.enter_context(target_temp_dir) - - global_options = options.global_options or [] - - session = self.get_default_session(options) - - target_python = make_target_python(options) - finder = self._build_package_finder( - options=options, - session=session, - target_python=target_python, - ignore_requires_python=options.ignore_requires_python, - ) - build_tracker = self.enter_context(get_build_tracker()) - - directory = TempDirectory( - delete=not options.no_clean, - kind="install", - globally_managed=True, - ) - - try: - reqs = self.get_requirements(args, options, finder, session) - check_legacy_setup_py_options(options, reqs) - - wheel_cache = WheelCache(options.cache_dir) - - # Only when installing is it permitted to use PEP 660. - # In other circumstances (pip wheel, pip download) we generate - # regular (i.e. non editable) metadata and wheels. - for req in reqs: - req.permit_editable_wheels = True - - preparer = self.make_requirement_preparer( - temp_build_dir=directory, - options=options, - build_tracker=build_tracker, - session=session, - finder=finder, - use_user_site=options.use_user_site, - verbosity=self.verbosity, - ) - resolver = self.make_resolver( - preparer=preparer, - finder=finder, - options=options, - wheel_cache=wheel_cache, - use_user_site=options.use_user_site, - ignore_installed=options.ignore_installed, - ignore_requires_python=options.ignore_requires_python, - force_reinstall=options.force_reinstall, - upgrade_strategy=upgrade_strategy, - use_pep517=options.use_pep517, - py_version_info=options.python_version, - ) - - self.trace_basic_info(finder) - - requirement_set = resolver.resolve( - reqs, check_supported_wheels=not options.target_dir - ) - - if options.json_report_file: - report = InstallationReport(requirement_set.requirements_to_install) - if options.json_report_file == "-": - print_json(data=report.to_dict()) - else: - with open(options.json_report_file, "w", encoding="utf-8") as f: - json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) - - if options.dry_run: - would_install_items = sorted( - (r.metadata["name"], r.metadata["version"]) - for r in requirement_set.requirements_to_install - ) - if would_install_items: - write_output( - "Would install %s", - " ".join("-".join(item) for item in would_install_items), - ) - return SUCCESS - - try: - pip_req = requirement_set.get_requirement("pip") - except KeyError: - modifying_pip = False - else: - # If we're not replacing an already installed pip, - # we're not modifying it. - modifying_pip = pip_req.satisfied_by is None - protect_pip_from_modification_on_windows(modifying_pip=modifying_pip) - - reqs_to_build = [ - r - for r in requirement_set.requirements_to_install - if should_build_for_install_command(r) - ] - - _, build_failures = build( - reqs_to_build, - wheel_cache=wheel_cache, - verify=True, - build_options=[], - global_options=global_options, - ) - - if build_failures: - raise InstallationError( - "Failed to build installable wheels for some " - "pyproject.toml based projects ({})".format( - ", ".join(r.name for r in build_failures) # type: ignore - ) - ) - - to_install = resolver.get_installation_order(requirement_set) - - # Check for conflicts in the package set we're installing. - conflicts: Optional[ConflictDetails] = None - should_warn_about_conflicts = ( - not options.ignore_dependencies and options.warn_about_conflicts - ) - if should_warn_about_conflicts: - conflicts = self._determine_conflicts(to_install) - - # Don't warn about script install locations if - # --target or --prefix has been specified - warn_script_location = options.warn_script_location - if options.target_dir or options.prefix_path: - warn_script_location = False - - installed = install_given_reqs( - to_install, - global_options, - root=options.root_path, - home=target_temp_dir_path, - prefix=options.prefix_path, - warn_script_location=warn_script_location, - use_user_site=options.use_user_site, - pycompile=options.compile, - progress_bar=options.progress_bar, - ) - - lib_locations = get_lib_location_guesses( - user=options.use_user_site, - home=target_temp_dir_path, - root=options.root_path, - prefix=options.prefix_path, - isolated=options.isolated_mode, - ) - env = get_environment(lib_locations) - - # Display a summary of installed packages, with extra care to - # display a package name as it was requested by the user. - installed.sort(key=operator.attrgetter("name")) - summary = [] - installed_versions = {} - for distribution in env.iter_all_distributions(): - installed_versions[distribution.canonical_name] = distribution.version - for package in installed: - display_name = package.name - version = installed_versions.get(canonicalize_name(display_name), None) - if version: - text = f"{display_name}-{version}" - else: - text = display_name - summary.append(text) - - if conflicts is not None: - self._warn_about_conflicts( - conflicts, - resolver_variant=self.determine_resolver_variant(options), - ) - - installed_desc = " ".join(summary) - if installed_desc: - write_output( - "Successfully installed %s", - installed_desc, - ) - except OSError as error: - show_traceback = self.verbosity >= 1 - - message = create_os_error_message( - error, - show_traceback, - options.use_user_site, - ) - logger.error(message, exc_info=show_traceback) - - return ERROR - - if options.target_dir: - assert target_temp_dir - self._handle_target_dir( - options.target_dir, target_temp_dir, options.upgrade - ) - if options.root_user_action == "warn": - warn_if_run_as_root() - return SUCCESS - - def _handle_target_dir( - self, target_dir: str, target_temp_dir: TempDirectory, upgrade: bool - ) -> None: - ensure_dir(target_dir) - - # Checking both purelib and platlib directories for installed - # packages to be moved to target directory - lib_dir_list = [] - - # Checking both purelib and platlib directories for installed - # packages to be moved to target directory - scheme = get_scheme("", home=target_temp_dir.path) - purelib_dir = scheme.purelib - platlib_dir = scheme.platlib - data_dir = scheme.data - - if os.path.exists(purelib_dir): - lib_dir_list.append(purelib_dir) - if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: - lib_dir_list.append(platlib_dir) - if os.path.exists(data_dir): - lib_dir_list.append(data_dir) - - for lib_dir in lib_dir_list: - for item in os.listdir(lib_dir): - if lib_dir == data_dir: - ddir = os.path.join(data_dir, item) - if any(s.startswith(ddir) for s in lib_dir_list[:-1]): - continue - target_item_dir = os.path.join(target_dir, item) - if os.path.exists(target_item_dir): - if not upgrade: - logger.warning( - "Target directory %s already exists. Specify " - "--upgrade to force replacement.", - target_item_dir, - ) - continue - if os.path.islink(target_item_dir): - logger.warning( - "Target directory %s already exists and is " - "a link. pip will not automatically replace " - "links, please remove if replacement is " - "desired.", - target_item_dir, - ) - continue - if os.path.isdir(target_item_dir): - shutil.rmtree(target_item_dir) - else: - os.remove(target_item_dir) - - shutil.move(os.path.join(lib_dir, item), target_item_dir) - - def _determine_conflicts( - self, to_install: List[InstallRequirement] - ) -> Optional[ConflictDetails]: - try: - return check_install_conflicts(to_install) - except Exception: - logger.exception( - "Error while checking for conflicts. Please file an issue on " - "pip's issue tracker: https://github.com/pypa/pip/issues/new" - ) - return None - - def _warn_about_conflicts( - self, conflict_details: ConflictDetails, resolver_variant: str - ) -> None: - package_set, (missing, conflicting) = conflict_details - if not missing and not conflicting: - return - - parts: List[str] = [] - if resolver_variant == "legacy": - parts.append( - "pip's legacy dependency resolver does not consider dependency " - "conflicts when selecting packages. This behaviour is the " - "source of the following dependency conflicts." - ) - else: - assert resolver_variant == "resolvelib" - parts.append( - "pip's dependency resolver does not currently take into account " - "all the packages that are installed. This behaviour is the " - "source of the following dependency conflicts." - ) - - # NOTE: There is some duplication here, with commands/check.py - for project_name in missing: - version = package_set[project_name][0] - for dependency in missing[project_name]: - message = ( - f"{project_name} {version} requires {dependency[1]}, " - "which is not installed." - ) - parts.append(message) - - for project_name in conflicting: - version = package_set[project_name][0] - for dep_name, dep_version, req in conflicting[project_name]: - message = ( - "{name} {version} requires {requirement}, but {you} have " - "{dep_name} {dep_version} which is incompatible." - ).format( - name=project_name, - version=version, - requirement=req, - dep_name=dep_name, - dep_version=dep_version, - you=("you" if resolver_variant == "resolvelib" else "you'll"), - ) - parts.append(message) - - logger.critical("\n".join(parts)) - - -def get_lib_location_guesses( - user: bool = False, - home: Optional[str] = None, - root: Optional[str] = None, - isolated: bool = False, - prefix: Optional[str] = None, -) -> List[str]: - scheme = get_scheme( - "", - user=user, - home=home, - root=root, - isolated=isolated, - prefix=prefix, - ) - return [scheme.purelib, scheme.platlib] - - -def site_packages_writable(root: Optional[str], isolated: bool) -> bool: - return all( - test_writable_dir(d) - for d in set(get_lib_location_guesses(root=root, isolated=isolated)) - ) - - -def decide_user_install( - use_user_site: Optional[bool], - prefix_path: Optional[str] = None, - target_dir: Optional[str] = None, - root_path: Optional[str] = None, - isolated_mode: bool = False, -) -> bool: - """Determine whether to do a user install based on the input options. - - If use_user_site is False, no additional checks are done. - If use_user_site is True, it is checked for compatibility with other - options. - If use_user_site is None, the default behaviour depends on the environment, - which is provided by the other arguments. - """ - # In some cases (config from tox), use_user_site can be set to an integer - # rather than a bool, which 'use_user_site is False' wouldn't catch. - if (use_user_site is not None) and (not use_user_site): - logger.debug("Non-user install by explicit request") - return False - - if use_user_site: - if prefix_path: - raise CommandError( - "Can not combine '--user' and '--prefix' as they imply " - "different installation locations" - ) - if virtualenv_no_global(): - raise InstallationError( - "Can not perform a '--user' install. User site-packages " - "are not visible in this virtualenv." - ) - logger.debug("User install by explicit request") - return True - - # If we are here, user installs have not been explicitly requested/avoided - assert use_user_site is None - - # user install incompatible with --prefix/--target - if prefix_path or target_dir: - logger.debug("Non-user install due to --prefix or --target option") - return False - - # If user installs are not enabled, choose a non-user install - if not site.ENABLE_USER_SITE: - logger.debug("Non-user install because user site-packages disabled") - return False - - # If we have permission for a non-user install, do that, - # otherwise do a user install. - if site_packages_writable(root=root_path, isolated=isolated_mode): - logger.debug("Non-user install because site-packages writeable") - return False - - logger.info( - "Defaulting to user installation because normal site-packages " - "is not writeable" - ) - return True - - -def create_os_error_message( - error: OSError, show_traceback: bool, using_user_site: bool -) -> str: - """Format an error message for an OSError - - It may occur anytime during the execution of the install command. - """ - parts = [] - - # Mention the error if we are not going to show a traceback - parts.append("Could not install packages due to an OSError") - if not show_traceback: - parts.append(": ") - parts.append(str(error)) - else: - parts.append(".") - - # Spilt the error indication from a helper message (if any) - parts[-1] += "\n" - - # Suggest useful actions to the user: - # (1) using user site-packages or (2) verifying the permissions - if error.errno == errno.EACCES: - user_option_part = "Consider using the `--user` option" - permissions_part = "Check the permissions" - - if not running_under_virtualenv() and not using_user_site: - parts.extend( - [ - user_option_part, - " or ", - permissions_part.lower(), - ] - ) - else: - parts.append(permissions_part) - parts.append(".\n") - - # Suggest to check "pip config debug" in case of invalid proxy - if type(error) is InvalidProxyURL: - parts.append( - 'Consider checking your local proxy configuration with "pip config debug"' - ) - parts.append(".\n") - - # Suggest the user to enable Long Paths if path length is - # more than 260 - if ( - WINDOWS - and error.errno == errno.ENOENT - and error.filename - and len(error.filename) > 260 - ): - parts.append( - "HINT: This error might have occurred since " - "this system does not have Windows Long Path " - "support enabled. You can find information on " - "how to enable this at " - "https://pip.pypa.io/warnings/enable-long-paths\n" - ) - - return "".join(parts).strip() + "\n" diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/list.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/list.py deleted file mode 100644 index b030850..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/list.py +++ /dev/null @@ -1,391 +0,0 @@ -import json -import logging -from email.parser import Parser -from optparse import Values -from typing import TYPE_CHECKING, Generator, List, Optional, Sequence, Tuple, cast - -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import Version - -from pip._internal.cli import cmdoptions -from pip._internal.cli.index_command import IndexGroupCommand -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.exceptions import CommandError -from pip._internal.metadata import BaseDistribution, get_environment -from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.utils.compat import stdlib_pkgs -from pip._internal.utils.misc import tabulate, write_output - -if TYPE_CHECKING: - from pip._internal.index.package_finder import PackageFinder - from pip._internal.network.session import PipSession - - class _DistWithLatestInfo(BaseDistribution): - """Give the distribution object a couple of extra fields. - - These will be populated during ``get_outdated()``. This is dirty but - makes the rest of the code much cleaner. - """ - - latest_version: Version - latest_filetype: str - - _ProcessedDists = Sequence[_DistWithLatestInfo] - - -logger = logging.getLogger(__name__) - - -class ListCommand(IndexGroupCommand): - """ - List installed packages, including editables. - - Packages are listed in a case-insensitive sorted order. - """ - - ignore_require_venv = True - usage = """ - %prog [options]""" - - def add_options(self) -> None: - self.cmd_opts.add_option( - "-o", - "--outdated", - action="store_true", - default=False, - help="List outdated packages", - ) - self.cmd_opts.add_option( - "-u", - "--uptodate", - action="store_true", - default=False, - help="List uptodate packages", - ) - self.cmd_opts.add_option( - "-e", - "--editable", - action="store_true", - default=False, - help="List editable projects.", - ) - self.cmd_opts.add_option( - "-l", - "--local", - action="store_true", - default=False, - help=( - "If in a virtualenv that has global access, do not list " - "globally-installed packages." - ), - ) - self.cmd_opts.add_option( - "--user", - dest="user", - action="store_true", - default=False, - help="Only output packages installed in user-site.", - ) - self.cmd_opts.add_option(cmdoptions.list_path()) - self.cmd_opts.add_option( - "--pre", - action="store_true", - default=False, - help=( - "Include pre-release and development versions. By default, " - "pip only finds stable versions." - ), - ) - - self.cmd_opts.add_option( - "--format", - action="store", - dest="list_format", - default="columns", - choices=("columns", "freeze", "json"), - help=( - "Select the output format among: columns (default), freeze, or json. " - "The 'freeze' format cannot be used with the --outdated option." - ), - ) - - self.cmd_opts.add_option( - "--not-required", - action="store_true", - dest="not_required", - help="List packages that are not dependencies of installed packages.", - ) - - self.cmd_opts.add_option( - "--exclude-editable", - action="store_false", - dest="include_editable", - help="Exclude editable package from output.", - ) - self.cmd_opts.add_option( - "--include-editable", - action="store_true", - dest="include_editable", - help="Include editable package in output.", - default=True, - ) - self.cmd_opts.add_option(cmdoptions.list_exclude()) - index_opts = cmdoptions.make_option_group(cmdoptions.index_group, self.parser) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, self.cmd_opts) - - def handle_pip_version_check(self, options: Values) -> None: - if options.outdated or options.uptodate: - super().handle_pip_version_check(options) - - def _build_package_finder( - self, options: Values, session: "PipSession" - ) -> "PackageFinder": - """ - Create a package finder appropriate to this list command. - """ - # Lazy import the heavy index modules as most list invocations won't need 'em. - from pip._internal.index.collector import LinkCollector - from pip._internal.index.package_finder import PackageFinder - - link_collector = LinkCollector.create(session, options=options) - - # Pass allow_yanked=False to ignore yanked versions. - selection_prefs = SelectionPreferences( - allow_yanked=False, - allow_all_prereleases=options.pre, - ) - - return PackageFinder.create( - link_collector=link_collector, - selection_prefs=selection_prefs, - ) - - def run(self, options: Values, args: List[str]) -> int: - if options.outdated and options.uptodate: - raise CommandError("Options --outdated and --uptodate cannot be combined.") - - if options.outdated and options.list_format == "freeze": - raise CommandError( - "List format 'freeze' cannot be used with the --outdated option." - ) - - cmdoptions.check_list_path_option(options) - - skip = set(stdlib_pkgs) - if options.excludes: - skip.update(canonicalize_name(n) for n in options.excludes) - - packages: _ProcessedDists = [ - cast("_DistWithLatestInfo", d) - for d in get_environment(options.path).iter_installed_distributions( - local_only=options.local, - user_only=options.user, - editables_only=options.editable, - include_editables=options.include_editable, - skip=skip, - ) - ] - - # get_not_required must be called firstly in order to find and - # filter out all dependencies correctly. Otherwise a package - # can't be identified as requirement because some parent packages - # could be filtered out before. - if options.not_required: - packages = self.get_not_required(packages, options) - - if options.outdated: - packages = self.get_outdated(packages, options) - elif options.uptodate: - packages = self.get_uptodate(packages, options) - - self.output_package_listing(packages, options) - return SUCCESS - - def get_outdated( - self, packages: "_ProcessedDists", options: Values - ) -> "_ProcessedDists": - return [ - dist - for dist in self.iter_packages_latest_infos(packages, options) - if dist.latest_version > dist.version - ] - - def get_uptodate( - self, packages: "_ProcessedDists", options: Values - ) -> "_ProcessedDists": - return [ - dist - for dist in self.iter_packages_latest_infos(packages, options) - if dist.latest_version == dist.version - ] - - def get_not_required( - self, packages: "_ProcessedDists", options: Values - ) -> "_ProcessedDists": - dep_keys = { - canonicalize_name(dep.name) - for dist in packages - for dep in (dist.iter_dependencies() or ()) - } - - # Create a set to remove duplicate packages, and cast it to a list - # to keep the return type consistent with get_outdated and - # get_uptodate - return list({pkg for pkg in packages if pkg.canonical_name not in dep_keys}) - - def iter_packages_latest_infos( - self, packages: "_ProcessedDists", options: Values - ) -> Generator["_DistWithLatestInfo", None, None]: - with self._build_session(options) as session: - finder = self._build_package_finder(options, session) - - def latest_info( - dist: "_DistWithLatestInfo", - ) -> Optional["_DistWithLatestInfo"]: - all_candidates = finder.find_all_candidates(dist.canonical_name) - if not options.pre: - # Remove prereleases - all_candidates = [ - candidate - for candidate in all_candidates - if not candidate.version.is_prerelease - ] - - evaluator = finder.make_candidate_evaluator( - project_name=dist.canonical_name, - ) - best_candidate = evaluator.sort_best_candidate(all_candidates) - if best_candidate is None: - return None - - remote_version = best_candidate.version - if best_candidate.link.is_wheel: - typ = "wheel" - else: - typ = "sdist" - dist.latest_version = remote_version - dist.latest_filetype = typ - return dist - - for dist in map(latest_info, packages): - if dist is not None: - yield dist - - def output_package_listing( - self, packages: "_ProcessedDists", options: Values - ) -> None: - packages = sorted( - packages, - key=lambda dist: dist.canonical_name, - ) - if options.list_format == "columns" and packages: - data, header = format_for_columns(packages, options) - self.output_package_listing_columns(data, header) - elif options.list_format == "freeze": - for dist in packages: - if options.verbose >= 1: - write_output( - "%s==%s (%s)", dist.raw_name, dist.version, dist.location - ) - else: - write_output("%s==%s", dist.raw_name, dist.version) - elif options.list_format == "json": - write_output(format_for_json(packages, options)) - - def output_package_listing_columns( - self, data: List[List[str]], header: List[str] - ) -> None: - # insert the header first: we need to know the size of column names - if len(data) > 0: - data.insert(0, header) - - pkg_strings, sizes = tabulate(data) - - # Create and add a separator. - if len(data) > 0: - pkg_strings.insert(1, " ".join("-" * x for x in sizes)) - - for val in pkg_strings: - write_output(val) - - -def format_for_columns( - pkgs: "_ProcessedDists", options: Values -) -> Tuple[List[List[str]], List[str]]: - """ - Convert the package data into something usable - by output_package_listing_columns. - """ - header = ["Package", "Version"] - - running_outdated = options.outdated - if running_outdated: - header.extend(["Latest", "Type"]) - - def wheel_build_tag(dist: BaseDistribution) -> Optional[str]: - try: - wheel_file = dist.read_text("WHEEL") - except FileNotFoundError: - return None - return Parser().parsestr(wheel_file).get("Build") - - build_tags = [wheel_build_tag(p) for p in pkgs] - has_build_tags = any(build_tags) - if has_build_tags: - header.append("Build") - - if options.verbose >= 1: - header.append("Location") - if options.verbose >= 1: - header.append("Installer") - - has_editables = any(x.editable for x in pkgs) - if has_editables: - header.append("Editable project location") - - data = [] - for i, proj in enumerate(pkgs): - # if we're working on the 'outdated' list, separate out the - # latest_version and type - row = [proj.raw_name, proj.raw_version] - - if running_outdated: - row.append(str(proj.latest_version)) - row.append(proj.latest_filetype) - - if has_build_tags: - row.append(build_tags[i] or "") - - if has_editables: - row.append(proj.editable_project_location or "") - - if options.verbose >= 1: - row.append(proj.location or "") - if options.verbose >= 1: - row.append(proj.installer) - - data.append(row) - - return data, header - - -def format_for_json(packages: "_ProcessedDists", options: Values) -> str: - data = [] - for dist in packages: - info = { - "name": dist.raw_name, - "version": str(dist.version), - } - if options.verbose >= 1: - info["location"] = dist.location or "" - info["installer"] = dist.installer - if options.outdated: - info["latest_version"] = str(dist.latest_version) - info["latest_filetype"] = dist.latest_filetype - editable_project_location = dist.editable_project_location - if editable_project_location: - info["editable_project_location"] = editable_project_location - data.append(info) - return json.dumps(data) diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/lock.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/lock.py deleted file mode 100644 index 39f27e8..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/lock.py +++ /dev/null @@ -1,171 +0,0 @@ -import sys -from optparse import Values -from pathlib import Path -from typing import List - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.req_command import ( - RequirementCommand, - with_cleanup, -) -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.models.pylock import Pylock, is_valid_pylock_file_name -from pip._internal.operations.build.build_tracker import get_build_tracker -from pip._internal.req.req_install import ( - check_legacy_setup_py_options, -) -from pip._internal.utils.logging import getLogger -from pip._internal.utils.misc import ( - get_pip_version, -) -from pip._internal.utils.temp_dir import TempDirectory - -logger = getLogger(__name__) - - -class LockCommand(RequirementCommand): - """ - EXPERIMENTAL - Lock packages and their dependencies from: - - - PyPI (and other indexes) using requirement specifiers. - - VCS project urls. - - Local project directories. - - Local or remote source archives. - - pip also supports locking from "requirements files", which provide an easy - way to specify a whole environment to be installed. - - The generated lock file is only guaranteed to be valid for the current - python version and platform. - """ - - usage = """ - %prog [options] [-e] ... - %prog [options] [package-index-options] ... - %prog [options] -r [package-index-options] ... - %prog [options] ...""" - - def add_options(self) -> None: - self.cmd_opts.add_option( - cmdoptions.PipOption( - "--output", - "-o", - dest="output_file", - metavar="path", - type="path", - default="pylock.toml", - help="Lock file name (default=pylock.toml). Use - for stdout.", - ) - ) - self.cmd_opts.add_option(cmdoptions.requirements()) - self.cmd_opts.add_option(cmdoptions.constraints()) - self.cmd_opts.add_option(cmdoptions.no_deps()) - self.cmd_opts.add_option(cmdoptions.pre()) - - self.cmd_opts.add_option(cmdoptions.editable()) - - self.cmd_opts.add_option(cmdoptions.src()) - - self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) - self.cmd_opts.add_option(cmdoptions.no_build_isolation()) - self.cmd_opts.add_option(cmdoptions.use_pep517()) - self.cmd_opts.add_option(cmdoptions.no_use_pep517()) - self.cmd_opts.add_option(cmdoptions.check_build_deps()) - - self.cmd_opts.add_option(cmdoptions.config_settings()) - - self.cmd_opts.add_option(cmdoptions.no_binary()) - self.cmd_opts.add_option(cmdoptions.only_binary()) - self.cmd_opts.add_option(cmdoptions.prefer_binary()) - self.cmd_opts.add_option(cmdoptions.require_hashes()) - self.cmd_opts.add_option(cmdoptions.progress_bar()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, self.cmd_opts) - - @with_cleanup - def run(self, options: Values, args: List[str]) -> int: - logger.verbose("Using %s", get_pip_version()) - - logger.warning( - "pip lock is currently an experimental command. " - "It may be removed/changed in a future release " - "without prior warning." - ) - - session = self.get_default_session(options) - - finder = self._build_package_finder( - options=options, - session=session, - ignore_requires_python=options.ignore_requires_python, - ) - build_tracker = self.enter_context(get_build_tracker()) - - directory = TempDirectory( - delete=not options.no_clean, - kind="install", - globally_managed=True, - ) - - reqs = self.get_requirements(args, options, finder, session) - check_legacy_setup_py_options(options, reqs) - - wheel_cache = WheelCache(options.cache_dir) - - # Only when installing is it permitted to use PEP 660. - # In other circumstances (pip wheel, pip download) we generate - # regular (i.e. non editable) metadata and wheels. - for req in reqs: - req.permit_editable_wheels = True - - preparer = self.make_requirement_preparer( - temp_build_dir=directory, - options=options, - build_tracker=build_tracker, - session=session, - finder=finder, - use_user_site=False, - verbosity=self.verbosity, - ) - resolver = self.make_resolver( - preparer=preparer, - finder=finder, - options=options, - wheel_cache=wheel_cache, - use_user_site=False, - ignore_installed=True, - ignore_requires_python=options.ignore_requires_python, - upgrade_strategy="to-satisfy-only", - use_pep517=options.use_pep517, - ) - - self.trace_basic_info(finder) - - requirement_set = resolver.resolve(reqs, check_supported_wheels=True) - - if options.output_file == "-": - base_dir = Path.cwd() - else: - output_file_path = Path(options.output_file) - if not is_valid_pylock_file_name(output_file_path): - logger.warning( - "%s is not a valid lock file name.", - output_file_path, - ) - base_dir = output_file_path.parent - pylock_toml = Pylock.from_install_requirements( - requirement_set.requirements.values(), base_dir=base_dir - ).as_toml() - if options.output_file == "-": - sys.stdout.write(pylock_toml) - else: - output_file_path.write_text(pylock_toml, encoding="utf-8") - - return SUCCESS diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/search.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/search.py deleted file mode 100644 index c58c2b3..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/search.py +++ /dev/null @@ -1,176 +0,0 @@ -import logging -import shutil -import sys -import textwrap -import xmlrpc.client -from collections import OrderedDict -from optparse import Values -from typing import Dict, List, Optional, TypedDict - -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.cli.base_command import Command -from pip._internal.cli.req_command import SessionCommandMixin -from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS -from pip._internal.exceptions import CommandError -from pip._internal.metadata import get_default_environment -from pip._internal.metadata.base import BaseDistribution -from pip._internal.models.index import PyPI -from pip._internal.network.xmlrpc import PipXmlrpcTransport -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import write_output - - -class TransformedHit(TypedDict): - name: str - summary: str - versions: List[str] - - -logger = logging.getLogger(__name__) - - -class SearchCommand(Command, SessionCommandMixin): - """Search for PyPI packages whose name or summary contains .""" - - usage = """ - %prog [options] """ - ignore_require_venv = True - - def add_options(self) -> None: - self.cmd_opts.add_option( - "-i", - "--index", - dest="index", - metavar="URL", - default=PyPI.pypi_url, - help="Base URL of Python Package Index (default %default)", - ) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - if not args: - raise CommandError("Missing required argument (search query).") - query = args - pypi_hits = self.search(query, options) - hits = transform_hits(pypi_hits) - - terminal_width = None - if sys.stdout.isatty(): - terminal_width = shutil.get_terminal_size()[0] - - print_results(hits, terminal_width=terminal_width) - if pypi_hits: - return SUCCESS - return NO_MATCHES_FOUND - - def search(self, query: List[str], options: Values) -> List[Dict[str, str]]: - index_url = options.index - - session = self.get_default_session(options) - - transport = PipXmlrpcTransport(index_url, session) - pypi = xmlrpc.client.ServerProxy(index_url, transport) - try: - hits = pypi.search({"name": query, "summary": query}, "or") - except xmlrpc.client.Fault as fault: - message = ( - f"XMLRPC request failed [code: {fault.faultCode}]\n{fault.faultString}" - ) - raise CommandError(message) - assert isinstance(hits, list) - return hits - - -def transform_hits(hits: List[Dict[str, str]]) -> List["TransformedHit"]: - """ - The list from pypi is really a list of versions. We want a list of - packages with the list of versions stored inline. This converts the - list from pypi into one we can use. - """ - packages: Dict[str, TransformedHit] = OrderedDict() - for hit in hits: - name = hit["name"] - summary = hit["summary"] - version = hit["version"] - - if name not in packages.keys(): - packages[name] = { - "name": name, - "summary": summary, - "versions": [version], - } - else: - packages[name]["versions"].append(version) - - # if this is the highest version, replace summary and score - if version == highest_version(packages[name]["versions"]): - packages[name]["summary"] = summary - - return list(packages.values()) - - -def print_dist_installation_info(latest: str, dist: Optional[BaseDistribution]) -> None: - if dist is not None: - with indent_log(): - if dist.version == latest: - write_output("INSTALLED: %s (latest)", dist.version) - else: - write_output("INSTALLED: %s", dist.version) - if parse_version(latest).pre: - write_output( - "LATEST: %s (pre-release; install" - " with `pip install --pre`)", - latest, - ) - else: - write_output("LATEST: %s", latest) - - -def get_installed_distribution(name: str) -> Optional[BaseDistribution]: - env = get_default_environment() - return env.get_distribution(name) - - -def print_results( - hits: List["TransformedHit"], - name_column_width: Optional[int] = None, - terminal_width: Optional[int] = None, -) -> None: - if not hits: - return - if name_column_width is None: - name_column_width = ( - max( - [ - len(hit["name"]) + len(highest_version(hit.get("versions", ["-"]))) - for hit in hits - ] - ) - + 4 - ) - - for hit in hits: - name = hit["name"] - summary = hit["summary"] or "" - latest = highest_version(hit.get("versions", ["-"])) - if terminal_width is not None: - target_width = terminal_width - name_column_width - 5 - if target_width > 10: - # wrap and indent summary to fit terminal - summary_lines = textwrap.wrap(summary, target_width) - summary = ("\n" + " " * (name_column_width + 3)).join(summary_lines) - - name_latest = f"{name} ({latest})" - line = f"{name_latest:{name_column_width}} - {summary}" - try: - write_output(line) - dist = get_installed_distribution(name) - print_dist_installation_info(latest, dist) - except UnicodeEncodeError: - pass - - -def highest_version(versions: List[str]) -> str: - return max(versions, key=parse_version) diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/show.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/show.py deleted file mode 100644 index 7aaf6f4..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/show.py +++ /dev/null @@ -1,228 +0,0 @@ -import logging -import string -from optparse import Values -from typing import Generator, Iterable, Iterator, List, NamedTuple, Optional - -from pip._vendor.packaging.requirements import InvalidRequirement -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.metadata import BaseDistribution, get_default_environment -from pip._internal.utils.misc import write_output - -logger = logging.getLogger(__name__) - - -def normalize_project_url_label(label: str) -> str: - # This logic is from PEP 753 (Well-known Project URLs in Metadata). - chars_to_remove = string.punctuation + string.whitespace - removal_map = str.maketrans("", "", chars_to_remove) - return label.translate(removal_map).lower() - - -class ShowCommand(Command): - """ - Show information about one or more installed packages. - - The output is in RFC-compliant mail header format. - """ - - usage = """ - %prog [options] ...""" - ignore_require_venv = True - - def add_options(self) -> None: - self.cmd_opts.add_option( - "-f", - "--files", - dest="files", - action="store_true", - default=False, - help="Show the full list of installed files for each package.", - ) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - if not args: - logger.warning("ERROR: Please provide a package name or names.") - return ERROR - query = args - - results = search_packages_info(query) - if not print_results( - results, list_files=options.files, verbose=options.verbose - ): - return ERROR - return SUCCESS - - -class _PackageInfo(NamedTuple): - name: str - version: str - location: str - editable_project_location: Optional[str] - requires: List[str] - required_by: List[str] - installer: str - metadata_version: str - classifiers: List[str] - summary: str - homepage: str - project_urls: List[str] - author: str - author_email: str - license: str - license_expression: str - entry_points: List[str] - files: Optional[List[str]] - - -def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None]: - """ - Gather details from installed distributions. Print distribution name, - version, location, and installed files. Installed files requires a - pip generated 'installed-files.txt' in the distributions '.egg-info' - directory. - """ - env = get_default_environment() - - installed = {dist.canonical_name: dist for dist in env.iter_all_distributions()} - query_names = [canonicalize_name(name) for name in query] - missing = sorted( - [name for name, pkg in zip(query, query_names) if pkg not in installed] - ) - if missing: - logger.warning("Package(s) not found: %s", ", ".join(missing)) - - def _get_requiring_packages(current_dist: BaseDistribution) -> Iterator[str]: - return ( - dist.metadata["Name"] or "UNKNOWN" - for dist in installed.values() - if current_dist.canonical_name - in {canonicalize_name(d.name) for d in dist.iter_dependencies()} - ) - - for query_name in query_names: - try: - dist = installed[query_name] - except KeyError: - continue - - try: - requires = sorted( - # Avoid duplicates in requirements (e.g. due to environment markers). - {req.name for req in dist.iter_dependencies()}, - key=str.lower, - ) - except InvalidRequirement: - requires = sorted(dist.iter_raw_dependencies(), key=str.lower) - - try: - required_by = sorted(_get_requiring_packages(dist), key=str.lower) - except InvalidRequirement: - required_by = ["#N/A"] - - try: - entry_points_text = dist.read_text("entry_points.txt") - entry_points = entry_points_text.splitlines(keepends=False) - except FileNotFoundError: - entry_points = [] - - files_iter = dist.iter_declared_entries() - if files_iter is None: - files: Optional[List[str]] = None - else: - files = sorted(files_iter) - - metadata = dist.metadata - - project_urls = metadata.get_all("Project-URL", []) - homepage = metadata.get("Home-page", "") - if not homepage: - # It's common that there is a "homepage" Project-URL, but Home-page - # remains unset (especially as PEP 621 doesn't surface the field). - for url in project_urls: - url_label, url = url.split(",", maxsplit=1) - normalized_label = normalize_project_url_label(url_label) - if normalized_label == "homepage": - homepage = url.strip() - break - - yield _PackageInfo( - name=dist.raw_name, - version=dist.raw_version, - location=dist.location or "", - editable_project_location=dist.editable_project_location, - requires=requires, - required_by=required_by, - installer=dist.installer, - metadata_version=dist.metadata_version or "", - classifiers=metadata.get_all("Classifier", []), - summary=metadata.get("Summary", ""), - homepage=homepage, - project_urls=project_urls, - author=metadata.get("Author", ""), - author_email=metadata.get("Author-email", ""), - license=metadata.get("License", ""), - license_expression=metadata.get("License-Expression", ""), - entry_points=entry_points, - files=files, - ) - - -def print_results( - distributions: Iterable[_PackageInfo], - list_files: bool, - verbose: bool, -) -> bool: - """ - Print the information from installed distributions found. - """ - results_printed = False - for i, dist in enumerate(distributions): - results_printed = True - if i > 0: - write_output("---") - - metadata_version_tuple = tuple(map(int, dist.metadata_version.split("."))) - - write_output("Name: %s", dist.name) - write_output("Version: %s", dist.version) - write_output("Summary: %s", dist.summary) - write_output("Home-page: %s", dist.homepage) - write_output("Author: %s", dist.author) - write_output("Author-email: %s", dist.author_email) - if metadata_version_tuple >= (2, 4) and dist.license_expression: - write_output("License-Expression: %s", dist.license_expression) - else: - write_output("License: %s", dist.license) - write_output("Location: %s", dist.location) - if dist.editable_project_location is not None: - write_output( - "Editable project location: %s", dist.editable_project_location - ) - write_output("Requires: %s", ", ".join(dist.requires)) - write_output("Required-by: %s", ", ".join(dist.required_by)) - - if verbose: - write_output("Metadata-Version: %s", dist.metadata_version) - write_output("Installer: %s", dist.installer) - write_output("Classifiers:") - for classifier in dist.classifiers: - write_output(" %s", classifier) - write_output("Entry-points:") - for entry in dist.entry_points: - write_output(" %s", entry.strip()) - write_output("Project-URLs:") - for project_url in dist.project_urls: - write_output(" %s", project_url) - if list_files: - write_output("Files:") - if dist.files is None: - write_output("Cannot locate RECORD or installed-files.txt") - else: - for line in dist.files: - write_output(" %s", line.strip()) - return results_printed diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/uninstall.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/uninstall.py deleted file mode 100644 index bc0edea..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/uninstall.py +++ /dev/null @@ -1,114 +0,0 @@ -import logging -from optparse import Values -from typing import List - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import Command -from pip._internal.cli.index_command import SessionCommandMixin -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.exceptions import InstallationError -from pip._internal.req import parse_requirements -from pip._internal.req.constructors import ( - install_req_from_line, - install_req_from_parsed_requirement, -) -from pip._internal.utils.misc import ( - check_externally_managed, - protect_pip_from_modification_on_windows, - warn_if_run_as_root, -) - -logger = logging.getLogger(__name__) - - -class UninstallCommand(Command, SessionCommandMixin): - """ - Uninstall packages. - - pip is able to uninstall most installed packages. Known exceptions are: - - - Pure distutils packages installed with ``python setup.py install``, which - leave behind no metadata to determine what files were installed. - - Script wrappers installed by ``python setup.py develop``. - """ - - usage = """ - %prog [options] ... - %prog [options] -r ...""" - - def add_options(self) -> None: - self.cmd_opts.add_option( - "-r", - "--requirement", - dest="requirements", - action="append", - default=[], - metavar="file", - help=( - "Uninstall all the packages listed in the given requirements " - "file. This option can be used multiple times." - ), - ) - self.cmd_opts.add_option( - "-y", - "--yes", - dest="yes", - action="store_true", - help="Don't ask for confirmation of uninstall deletions.", - ) - self.cmd_opts.add_option(cmdoptions.root_user_action()) - self.cmd_opts.add_option(cmdoptions.override_externally_managed()) - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options: Values, args: List[str]) -> int: - session = self.get_default_session(options) - - reqs_to_uninstall = {} - for name in args: - req = install_req_from_line( - name, - isolated=options.isolated_mode, - ) - if req.name: - reqs_to_uninstall[canonicalize_name(req.name)] = req - else: - logger.warning( - "Invalid requirement: %r ignored -" - " the uninstall command expects named" - " requirements.", - name, - ) - for filename in options.requirements: - for parsed_req in parse_requirements( - filename, options=options, session=session - ): - req = install_req_from_parsed_requirement( - parsed_req, isolated=options.isolated_mode - ) - if req.name: - reqs_to_uninstall[canonicalize_name(req.name)] = req - if not reqs_to_uninstall: - raise InstallationError( - f"You must give at least one requirement to {self.name} (see " - f'"pip help {self.name}")' - ) - - if not options.override_externally_managed: - check_externally_managed() - - protect_pip_from_modification_on_windows( - modifying_pip="pip" in reqs_to_uninstall - ) - - for req in reqs_to_uninstall.values(): - uninstall_pathset = req.uninstall( - auto_confirm=options.yes, - verbose=self.verbosity > 0, - ) - if uninstall_pathset: - uninstall_pathset.commit() - if options.root_user_action == "warn": - warn_if_run_as_root() - return SUCCESS diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/commands/wheel.py b/blog-app/venv/Lib/site-packages/pip/_internal/commands/wheel.py deleted file mode 100644 index b380754..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/commands/wheel.py +++ /dev/null @@ -1,182 +0,0 @@ -import logging -import os -import shutil -from optparse import Values -from typing import List - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.req_command import RequirementCommand, with_cleanup -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.exceptions import CommandError -from pip._internal.operations.build.build_tracker import get_build_tracker -from pip._internal.req.req_install import ( - InstallRequirement, - check_legacy_setup_py_options, -) -from pip._internal.utils.misc import ensure_dir, normalize_path -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.wheel_builder import build - -logger = logging.getLogger(__name__) - - -class WheelCommand(RequirementCommand): - """ - Build Wheel archives for your requirements and dependencies. - - Wheel is a built-package format, and offers the advantage of not - recompiling your software during every install. For more details, see the - wheel docs: https://wheel.readthedocs.io/en/latest/ - - 'pip wheel' uses the build system interface as described here: - https://pip.pypa.io/en/stable/reference/build-system/ - - """ - - usage = """ - %prog [options] ... - %prog [options] -r ... - %prog [options] [-e] ... - %prog [options] [-e] ... - %prog [options] ...""" - - def add_options(self) -> None: - self.cmd_opts.add_option( - "-w", - "--wheel-dir", - dest="wheel_dir", - metavar="dir", - default=os.curdir, - help=( - "Build wheels into , where the default is the " - "current working directory." - ), - ) - self.cmd_opts.add_option(cmdoptions.no_binary()) - self.cmd_opts.add_option(cmdoptions.only_binary()) - self.cmd_opts.add_option(cmdoptions.prefer_binary()) - self.cmd_opts.add_option(cmdoptions.no_build_isolation()) - self.cmd_opts.add_option(cmdoptions.use_pep517()) - self.cmd_opts.add_option(cmdoptions.no_use_pep517()) - self.cmd_opts.add_option(cmdoptions.check_build_deps()) - self.cmd_opts.add_option(cmdoptions.constraints()) - self.cmd_opts.add_option(cmdoptions.editable()) - self.cmd_opts.add_option(cmdoptions.requirements()) - self.cmd_opts.add_option(cmdoptions.src()) - self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) - self.cmd_opts.add_option(cmdoptions.no_deps()) - self.cmd_opts.add_option(cmdoptions.progress_bar()) - - self.cmd_opts.add_option( - "--no-verify", - dest="no_verify", - action="store_true", - default=False, - help="Don't verify if built wheel is valid.", - ) - - self.cmd_opts.add_option(cmdoptions.config_settings()) - self.cmd_opts.add_option(cmdoptions.build_options()) - self.cmd_opts.add_option(cmdoptions.global_options()) - - self.cmd_opts.add_option( - "--pre", - action="store_true", - default=False, - help=( - "Include pre-release and development versions. By default, " - "pip only finds stable versions." - ), - ) - - self.cmd_opts.add_option(cmdoptions.require_hashes()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, self.cmd_opts) - - @with_cleanup - def run(self, options: Values, args: List[str]) -> int: - session = self.get_default_session(options) - - finder = self._build_package_finder(options, session) - - options.wheel_dir = normalize_path(options.wheel_dir) - ensure_dir(options.wheel_dir) - - build_tracker = self.enter_context(get_build_tracker()) - - directory = TempDirectory( - delete=not options.no_clean, - kind="wheel", - globally_managed=True, - ) - - reqs = self.get_requirements(args, options, finder, session) - check_legacy_setup_py_options(options, reqs) - - wheel_cache = WheelCache(options.cache_dir) - - preparer = self.make_requirement_preparer( - temp_build_dir=directory, - options=options, - build_tracker=build_tracker, - session=session, - finder=finder, - download_dir=options.wheel_dir, - use_user_site=False, - verbosity=self.verbosity, - ) - - resolver = self.make_resolver( - preparer=preparer, - finder=finder, - options=options, - wheel_cache=wheel_cache, - ignore_requires_python=options.ignore_requires_python, - use_pep517=options.use_pep517, - ) - - self.trace_basic_info(finder) - - requirement_set = resolver.resolve(reqs, check_supported_wheels=True) - - reqs_to_build: List[InstallRequirement] = [] - for req in requirement_set.requirements.values(): - if req.is_wheel: - preparer.save_linked_requirement(req) - else: - reqs_to_build.append(req) - - preparer.prepare_linked_requirements_more(requirement_set.requirements.values()) - - # build wheels - build_successes, build_failures = build( - reqs_to_build, - wheel_cache=wheel_cache, - verify=(not options.no_verify), - build_options=options.build_options or [], - global_options=options.global_options or [], - ) - for req in build_successes: - assert req.link and req.link.is_wheel - assert req.local_file_path - # copy from cache to target directory - try: - shutil.copy(req.local_file_path, options.wheel_dir) - except OSError as e: - logger.warning( - "Building wheel for %s failed: %s", - req.name, - e, - ) - build_failures.append(req) - if len(build_failures) != 0: - raise CommandError("Failed to build one or more wheels") - - return SUCCESS diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/configuration.py b/blog-app/venv/Lib/site-packages/pip/_internal/configuration.py deleted file mode 100644 index ffeda1d..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/configuration.py +++ /dev/null @@ -1,383 +0,0 @@ -"""Configuration management setup - -Some terminology: -- name - As written in config files. -- value - Value associated with a name -- key - Name combined with it's section (section.name) -- variant - A single word describing where the configuration key-value pair came from -""" - -import configparser -import locale -import os -import sys -from typing import Any, Dict, Iterable, List, NewType, Optional, Tuple - -from pip._internal.exceptions import ( - ConfigurationError, - ConfigurationFileCouldNotBeLoaded, -) -from pip._internal.utils import appdirs -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.logging import getLogger -from pip._internal.utils.misc import ensure_dir, enum - -RawConfigParser = configparser.RawConfigParser # Shorthand -Kind = NewType("Kind", str) - -CONFIG_BASENAME = "pip.ini" if WINDOWS else "pip.conf" -ENV_NAMES_IGNORED = "version", "help" - -# The kinds of configurations there are. -kinds = enum( - USER="user", # User Specific - GLOBAL="global", # System Wide - SITE="site", # [Virtual] Environment Specific - ENV="env", # from PIP_CONFIG_FILE - ENV_VAR="env-var", # from Environment Variables -) -OVERRIDE_ORDER = kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR -VALID_LOAD_ONLY = kinds.USER, kinds.GLOBAL, kinds.SITE - -logger = getLogger(__name__) - - -# NOTE: Maybe use the optionx attribute to normalize keynames. -def _normalize_name(name: str) -> str: - """Make a name consistent regardless of source (environment or file)""" - name = name.lower().replace("_", "-") - if name.startswith("--"): - name = name[2:] # only prefer long opts - return name - - -def _disassemble_key(name: str) -> List[str]: - if "." not in name: - error_message = ( - "Key does not contain dot separated section and key. " - f"Perhaps you wanted to use 'global.{name}' instead?" - ) - raise ConfigurationError(error_message) - return name.split(".", 1) - - -def get_configuration_files() -> Dict[Kind, List[str]]: - global_config_files = [ - os.path.join(path, CONFIG_BASENAME) for path in appdirs.site_config_dirs("pip") - ] - - site_config_file = os.path.join(sys.prefix, CONFIG_BASENAME) - legacy_config_file = os.path.join( - os.path.expanduser("~"), - "pip" if WINDOWS else ".pip", - CONFIG_BASENAME, - ) - new_config_file = os.path.join(appdirs.user_config_dir("pip"), CONFIG_BASENAME) - return { - kinds.GLOBAL: global_config_files, - kinds.SITE: [site_config_file], - kinds.USER: [legacy_config_file, new_config_file], - } - - -class Configuration: - """Handles management of configuration. - - Provides an interface to accessing and managing configuration files. - - This class converts provides an API that takes "section.key-name" style - keys and stores the value associated with it as "key-name" under the - section "section". - - This allows for a clean interface wherein the both the section and the - key-name are preserved in an easy to manage form in the configuration files - and the data stored is also nice. - """ - - def __init__(self, isolated: bool, load_only: Optional[Kind] = None) -> None: - super().__init__() - - if load_only is not None and load_only not in VALID_LOAD_ONLY: - raise ConfigurationError( - "Got invalid value for load_only - should be one of {}".format( - ", ".join(map(repr, VALID_LOAD_ONLY)) - ) - ) - self.isolated = isolated - self.load_only = load_only - - # Because we keep track of where we got the data from - self._parsers: Dict[Kind, List[Tuple[str, RawConfigParser]]] = { - variant: [] for variant in OVERRIDE_ORDER - } - self._config: Dict[Kind, Dict[str, Any]] = { - variant: {} for variant in OVERRIDE_ORDER - } - self._modified_parsers: List[Tuple[str, RawConfigParser]] = [] - - def load(self) -> None: - """Loads configuration from configuration files and environment""" - self._load_config_files() - if not self.isolated: - self._load_environment_vars() - - def get_file_to_edit(self) -> Optional[str]: - """Returns the file with highest priority in configuration""" - assert self.load_only is not None, "Need to be specified a file to be editing" - - try: - return self._get_parser_to_modify()[0] - except IndexError: - return None - - def items(self) -> Iterable[Tuple[str, Any]]: - """Returns key-value pairs like dict.items() representing the loaded - configuration - """ - return self._dictionary.items() - - def get_value(self, key: str) -> Any: - """Get a value from the configuration.""" - orig_key = key - key = _normalize_name(key) - try: - return self._dictionary[key] - except KeyError: - # disassembling triggers a more useful error message than simply - # "No such key" in the case that the key isn't in the form command.option - _disassemble_key(key) - raise ConfigurationError(f"No such key - {orig_key}") - - def set_value(self, key: str, value: Any) -> None: - """Modify a value in the configuration.""" - key = _normalize_name(key) - self._ensure_have_load_only() - - assert self.load_only - fname, parser = self._get_parser_to_modify() - - if parser is not None: - section, name = _disassemble_key(key) - - # Modify the parser and the configuration - if not parser.has_section(section): - parser.add_section(section) - parser.set(section, name, value) - - self._config[self.load_only][key] = value - self._mark_as_modified(fname, parser) - - def unset_value(self, key: str) -> None: - """Unset a value in the configuration.""" - orig_key = key - key = _normalize_name(key) - self._ensure_have_load_only() - - assert self.load_only - if key not in self._config[self.load_only]: - raise ConfigurationError(f"No such key - {orig_key}") - - fname, parser = self._get_parser_to_modify() - - if parser is not None: - section, name = _disassemble_key(key) - if not ( - parser.has_section(section) and parser.remove_option(section, name) - ): - # The option was not removed. - raise ConfigurationError( - "Fatal Internal error [id=1]. Please report as a bug." - ) - - # The section may be empty after the option was removed. - if not parser.items(section): - parser.remove_section(section) - self._mark_as_modified(fname, parser) - - del self._config[self.load_only][key] - - def save(self) -> None: - """Save the current in-memory state.""" - self._ensure_have_load_only() - - for fname, parser in self._modified_parsers: - logger.info("Writing to %s", fname) - - # Ensure directory exists. - ensure_dir(os.path.dirname(fname)) - - # Ensure directory's permission(need to be writeable) - try: - with open(fname, "w") as f: - parser.write(f) - except OSError as error: - raise ConfigurationError( - f"An error occurred while writing to the configuration file " - f"{fname}: {error}" - ) - - # - # Private routines - # - - def _ensure_have_load_only(self) -> None: - if self.load_only is None: - raise ConfigurationError("Needed a specific file to be modifying.") - logger.debug("Will be working with %s variant only", self.load_only) - - @property - def _dictionary(self) -> Dict[str, Any]: - """A dictionary representing the loaded configuration.""" - # NOTE: Dictionaries are not populated if not loaded. So, conditionals - # are not needed here. - retval = {} - - for variant in OVERRIDE_ORDER: - retval.update(self._config[variant]) - - return retval - - def _load_config_files(self) -> None: - """Loads configuration from configuration files""" - config_files = dict(self.iter_config_files()) - if config_files[kinds.ENV][0:1] == [os.devnull]: - logger.debug( - "Skipping loading configuration files due to " - "environment's PIP_CONFIG_FILE being os.devnull" - ) - return - - for variant, files in config_files.items(): - for fname in files: - # If there's specific variant set in `load_only`, load only - # that variant, not the others. - if self.load_only is not None and variant != self.load_only: - logger.debug("Skipping file '%s' (variant: %s)", fname, variant) - continue - - parser = self._load_file(variant, fname) - - # Keeping track of the parsers used - self._parsers[variant].append((fname, parser)) - - def _load_file(self, variant: Kind, fname: str) -> RawConfigParser: - logger.verbose("For variant '%s', will try loading '%s'", variant, fname) - parser = self._construct_parser(fname) - - for section in parser.sections(): - items = parser.items(section) - self._config[variant].update(self._normalized_keys(section, items)) - - return parser - - def _construct_parser(self, fname: str) -> RawConfigParser: - parser = configparser.RawConfigParser() - # If there is no such file, don't bother reading it but create the - # parser anyway, to hold the data. - # Doing this is useful when modifying and saving files, where we don't - # need to construct a parser. - if os.path.exists(fname): - locale_encoding = locale.getpreferredencoding(False) - try: - parser.read(fname, encoding=locale_encoding) - except UnicodeDecodeError: - # See https://github.com/pypa/pip/issues/4963 - raise ConfigurationFileCouldNotBeLoaded( - reason=f"contains invalid {locale_encoding} characters", - fname=fname, - ) - except configparser.Error as error: - # See https://github.com/pypa/pip/issues/4893 - raise ConfigurationFileCouldNotBeLoaded(error=error) - return parser - - def _load_environment_vars(self) -> None: - """Loads configuration from environment variables""" - self._config[kinds.ENV_VAR].update( - self._normalized_keys(":env:", self.get_environ_vars()) - ) - - def _normalized_keys( - self, section: str, items: Iterable[Tuple[str, Any]] - ) -> Dict[str, Any]: - """Normalizes items to construct a dictionary with normalized keys. - - This routine is where the names become keys and are made the same - regardless of source - configuration files or environment. - """ - normalized = {} - for name, val in items: - key = section + "." + _normalize_name(name) - normalized[key] = val - return normalized - - def get_environ_vars(self) -> Iterable[Tuple[str, str]]: - """Returns a generator with all environmental vars with prefix PIP_""" - for key, val in os.environ.items(): - if key.startswith("PIP_"): - name = key[4:].lower() - if name not in ENV_NAMES_IGNORED: - yield name, val - - # XXX: This is patched in the tests. - def iter_config_files(self) -> Iterable[Tuple[Kind, List[str]]]: - """Yields variant and configuration files associated with it. - - This should be treated like items of a dictionary. The order - here doesn't affect what gets overridden. That is controlled - by OVERRIDE_ORDER. However this does control the order they are - displayed to the user. It's probably most ergonomic to display - things in the same order as OVERRIDE_ORDER - """ - # SMELL: Move the conditions out of this function - - env_config_file = os.environ.get("PIP_CONFIG_FILE", None) - config_files = get_configuration_files() - - yield kinds.GLOBAL, config_files[kinds.GLOBAL] - - # per-user config is not loaded when env_config_file exists - should_load_user_config = not self.isolated and not ( - env_config_file and os.path.exists(env_config_file) - ) - if should_load_user_config: - # The legacy config file is overridden by the new config file - yield kinds.USER, config_files[kinds.USER] - - # virtualenv config - yield kinds.SITE, config_files[kinds.SITE] - - if env_config_file is not None: - yield kinds.ENV, [env_config_file] - else: - yield kinds.ENV, [] - - def get_values_in_config(self, variant: Kind) -> Dict[str, Any]: - """Get values present in a config file""" - return self._config[variant] - - def _get_parser_to_modify(self) -> Tuple[str, RawConfigParser]: - # Determine which parser to modify - assert self.load_only - parsers = self._parsers[self.load_only] - if not parsers: - # This should not happen if everything works correctly. - raise ConfigurationError( - "Fatal Internal error [id=2]. Please report as a bug." - ) - - # Use the highest priority parser. - return parsers[-1] - - # XXX: This is patched in the tests. - def _mark_as_modified(self, fname: str, parser: RawConfigParser) -> None: - file_parser_tuple = (fname, parser) - if file_parser_tuple not in self._modified_parsers: - self._modified_parsers.append(file_parser_tuple) - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({self._dictionary!r})" diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/distributions/__init__.py b/blog-app/venv/Lib/site-packages/pip/_internal/distributions/__init__.py deleted file mode 100644 index 9a89a83..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/distributions/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -from pip._internal.distributions.base import AbstractDistribution -from pip._internal.distributions.sdist import SourceDistribution -from pip._internal.distributions.wheel import WheelDistribution -from pip._internal.req.req_install import InstallRequirement - - -def make_distribution_for_install_requirement( - install_req: InstallRequirement, -) -> AbstractDistribution: - """Returns a Distribution for the given InstallRequirement""" - # Editable requirements will always be source distributions. They use the - # legacy logic until we create a modern standard for them. - if install_req.editable: - return SourceDistribution(install_req) - - # If it's a wheel, it's a WheelDistribution - if install_req.is_wheel: - return WheelDistribution(install_req) - - # Otherwise, a SourceDistribution - return SourceDistribution(install_req) diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 4ed2d852e71069bb6ed16679aae37e82d6a1c2ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 826 zcmaJC8rs+B5D=w9dx#!~S{SOGiA~gb`iTDl!E`3$cPK z`X5p3bs^-!@Jxb2mPr>1oxZonQI_DCDj%0GMA^&u{`u$$d!s>Vb}HtzA1hZlu0x%ljfd5brd+n*`9t!k@&g^Ps*>OUE6glLO^UZuSE8T843AFcbeLDHG zO2}`xSZozo+=6bug+UNOLo&c$C!|wn;7r|tOL6Un-n25PJQ>X z>4=A2nssh-EAJ?q7&S^!3bJz>kxh6QK9o;WW#m*w2}s+UJlNse@}7!>Gy&ed*c!8i z-GzxH11iYC5p>`RM|#2)-q?FZ##B^9^<`^Nk<}+P;mW#fTq0vf)I|NI_ks?ZAYTG` z3uFz^%w_Fdwj^4jEtkbIbiA!D&WKLFf94hO$e;s=&t@xYBY?t#WDyeo#UW&kjQ}YN zLT)V^Yr`fy5}}H=nJUooQ79QVi5i2t?KPVW+T)32=Ex0&CXe=$$?KY+jr(D!_w3C= zovpGx$)>4I*a)`qg+wzU6KSR@g2nOcS;VI@e;1y<1~!6nz@v{67HDH+kc9h%*@b4L zqt!ItHeBE_E4wqJ;Z+0}7xA)ePbCv(Ws=6nuw0+p#zU)11Iy=6+NsPj<@{2eCZ+e# z9b5=i5UadoZo)M*2+>+V2p4gyBXpNZqt!%#NXS?MucAOn+kKn!0#HuCmuxY@Opl&` zdzgF{Ym279Q>6`jq<0|(GU0+J{K!RWjQArdMIIB)_O#gnIJudlRD~c1ChbUbBlXb7jLh_I2ogK*`OW^8@YDgJ0KJ8IcK3SP?78qgil(ZV(;?OgzeRj2&|I z7zs+^KxS@?Szkx;Ivzs0fHp#c)U+&`@d(og7;q|^pzxIBWLsOk*vOb0=`Xs)FZp_{ zyR`+m7KU(hUPJ;Y%u@6qfam)<*_g&*UZAD8Ym7FB)U*M;>CA_-Fv~hQ6o1BNUx}+A zwaBJw_29!(-F#BxjqWz*@Gbn{ne#ZjgTsmUFKx?Y4(S-skKuG-h;z_8)sQ!;X4P^2 zDKZ%E>`Y;>vcO&}LRlx6$Y94W#86&rfW#^r&P&3aK+yFHA6|qb<`NF?;cx=dmA8hi z2O0&e+QBEM!g{MZe90hr@oV7wS=0BYTBIS)TfYA^<>73n=KDeikl*-+B2S>q<)a|$ z@Yz=|HW~^+vTv|xWG*Cvxq!3f@&M3mqJ=?kn0Il<8)+Sy%Q$V%3Pd2o5Z*Y#zl^7m zSEdHT5_F4vsuPc1IOlmQ)T?!<=Q`AJoc|ox`PcEBf1Jw7-}!m?E73r9=f$VnG7MC+ zYO)_g)ig-S+}Ocos2RO^&FGc+(8F?(+nb#|egYCW_d|B|xEwk1tT!t~{vu^+Yq!_G j21|0Y7Vzar^Sr5lR(Sq%q>4q{b<&|Nr$s&J7v28>I+EP4 diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-310.pyc deleted file mode 100644 index b165b41c63462ae7d7030c4753e0eeb3ce614d34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1510 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 KE^+~zcm50C1jS?k diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc deleted file mode 100644 index 20a0f5a4f02922e0e427a5898dced0c4fb3ac29f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1905 zcmaJ?-ESi`5MO&Yn@yUuDXPj94rz4)qySAHkq|nSYp=)0DOb@V#A>Bwvz|12-LKkC zk3`4IrGE);_b>UCC!TrZON_mwBphJLv!3ycJs-dEmfddK!g2TT!^t}h%lc6>tHVL& z5U2PS39}f-jy`>O^u=exN6LFr$+RrutWVT- z5*KBWCUKU|Au8e=P`LBSNJt(h@;JqBI+|+rzO8x>Vgai%wRMtaAZ9{B{`CYPQ@a-+ zqi1>=c5QWd$QUx`jT5w3lXl!-oB7kC!k~c- z%u&kaAg8=Y2!^;EdadUX&Yv|tn002oB*T{$7Qzvbjrk@@4f*B8(MRD|0=Ni=X;Nmf z2%i*i%+qTKA51yKQzJiy>+pO6`=^sMJe|o&S%fF3dl`+o?p3Pmbm zU;BuK5n+{92T@u`;0TU`)nteRlb}I0Q@znN%~+)IaS1$1*)F;#C=!Rx@4b@e!9Ug4 zqBmw}s-qY8kvzAaT2G1aKF8)*kQc=8RP>OinwNI1u^`_Q={zU0QEM#7f?}oZ`45lF zm->%p26X2ieShQWikeb>MdRJu)B-&HmqueP!hyEoE7MO7>(%F)}riOJ-;skjDJpYkpIsD^R# zZ$$B)mhS1MU1n>oZ{NUep-<^GdZa^MBlGu-KdZSJ{HL{Y$EMkNOW(3pBOw(CT-`US zmrNkJjA}81N(>Y2>vHJzvNL!G8Q#@IcSGMX;qceB;EpDH%dI*#6V_XGlfqg=w{gCW z7By_$`N69}{jY7mqrAwxmQkeIQIwZ#is_G3CyK77ai%MPTr-MTnc%{!cv%6LGj8Lp z%EnifZ)=ZTO>_e(XH=FM*ZE$lj_G_I3)lY@y%2Yic$PzGV~1?ov`s1fgWB|W>d@b4 zWAj&|Im9Q=m9q+w#C40+*S?AUJ&3UPS;+@=)1$%wU-wKHlqlb5EMI`Z+6yok;p5No zuV$&;b+sjO>S%6(r|zw*X()X6*S&yv)xQCQ4CC^@MXkJ#>&)KQI1oA;J*z`IbcZ-@ IhwRvY0)izM&;S4c diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/distributions/base.py b/blog-app/venv/Lib/site-packages/pip/_internal/distributions/base.py deleted file mode 100644 index 6e4d0c9..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/distributions/base.py +++ /dev/null @@ -1,53 +0,0 @@ -import abc -from typing import TYPE_CHECKING, Optional - -from pip._internal.metadata.base import BaseDistribution -from pip._internal.req import InstallRequirement - -if TYPE_CHECKING: - from pip._internal.index.package_finder import PackageFinder - - -class AbstractDistribution(metaclass=abc.ABCMeta): - """A base class for handling installable artifacts. - - The requirements for anything installable are as follows: - - - we must be able to determine the requirement name - (or we can't correctly handle the non-upgrade case). - - - for packages with setup requirements, we must also be able - to determine their requirements without installing additional - packages (for the same reason as run-time dependencies) - - - we must be able to create a Distribution object exposing the - above metadata. - - - if we need to do work in the build tracker, we must be able to generate a unique - string to identify the requirement in the build tracker. - """ - - def __init__(self, req: InstallRequirement) -> None: - super().__init__() - self.req = req - - @abc.abstractproperty - def build_tracker_id(self) -> Optional[str]: - """A string that uniquely identifies this requirement to the build tracker. - - If None, then this dist has no work to do in the build tracker, and - ``.prepare_distribution_metadata()`` will not be called.""" - raise NotImplementedError() - - @abc.abstractmethod - def get_metadata_distribution(self) -> BaseDistribution: - raise NotImplementedError() - - @abc.abstractmethod - def prepare_distribution_metadata( - self, - finder: "PackageFinder", - build_isolation: bool, - check_build_deps: bool, - ) -> None: - raise NotImplementedError() diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/distributions/installed.py b/blog-app/venv/Lib/site-packages/pip/_internal/distributions/installed.py deleted file mode 100644 index ab8d53b..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/distributions/installed.py +++ /dev/null @@ -1,29 +0,0 @@ -from typing import Optional - -from pip._internal.distributions.base import AbstractDistribution -from pip._internal.index.package_finder import PackageFinder -from pip._internal.metadata import BaseDistribution - - -class InstalledDistribution(AbstractDistribution): - """Represents an installed package. - - This does not need any preparation as the required information has already - been computed. - """ - - @property - def build_tracker_id(self) -> Optional[str]: - return None - - def get_metadata_distribution(self) -> BaseDistribution: - assert self.req.satisfied_by is not None, "not actually installed" - return self.req.satisfied_by - - def prepare_distribution_metadata( - self, - finder: PackageFinder, - build_isolation: bool, - check_build_deps: bool, - ) -> None: - pass diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/distributions/sdist.py b/blog-app/venv/Lib/site-packages/pip/_internal/distributions/sdist.py deleted file mode 100644 index 28ea5ce..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/distributions/sdist.py +++ /dev/null @@ -1,158 +0,0 @@ -import logging -from typing import TYPE_CHECKING, Iterable, Optional, Set, Tuple - -from pip._internal.build_env import BuildEnvironment -from pip._internal.distributions.base import AbstractDistribution -from pip._internal.exceptions import InstallationError -from pip._internal.metadata import BaseDistribution -from pip._internal.utils.subprocess import runner_with_spinner_message - -if TYPE_CHECKING: - from pip._internal.index.package_finder import PackageFinder - -logger = logging.getLogger(__name__) - - -class SourceDistribution(AbstractDistribution): - """Represents a source distribution. - - The preparation step for these needs metadata for the packages to be - generated, either using PEP 517 or using the legacy `setup.py egg_info`. - """ - - @property - def build_tracker_id(self) -> Optional[str]: - """Identify this requirement uniquely by its link.""" - assert self.req.link - return self.req.link.url_without_fragment - - def get_metadata_distribution(self) -> BaseDistribution: - return self.req.get_dist() - - def prepare_distribution_metadata( - self, - finder: "PackageFinder", - build_isolation: bool, - check_build_deps: bool, - ) -> None: - # Load pyproject.toml, to determine whether PEP 517 is to be used - self.req.load_pyproject_toml() - - # Set up the build isolation, if this requirement should be isolated - should_isolate = self.req.use_pep517 and build_isolation - if should_isolate: - # Setup an isolated environment and install the build backend static - # requirements in it. - self._prepare_build_backend(finder) - # Check that if the requirement is editable, it either supports PEP 660 or - # has a setup.py or a setup.cfg. This cannot be done earlier because we need - # to setup the build backend to verify it supports build_editable, nor can - # it be done later, because we want to avoid installing build requirements - # needlessly. Doing it here also works around setuptools generating - # UNKNOWN.egg-info when running get_requires_for_build_wheel on a directory - # without setup.py nor setup.cfg. - self.req.isolated_editable_sanity_check() - # Install the dynamic build requirements. - self._install_build_reqs(finder) - # Check if the current environment provides build dependencies - should_check_deps = self.req.use_pep517 and check_build_deps - if should_check_deps: - pyproject_requires = self.req.pyproject_requires - assert pyproject_requires is not None - conflicting, missing = self.req.build_env.check_requirements( - pyproject_requires - ) - if conflicting: - self._raise_conflicts("the backend dependencies", conflicting) - if missing: - self._raise_missing_reqs(missing) - self.req.prepare_metadata() - - def _prepare_build_backend(self, finder: "PackageFinder") -> None: - # Isolate in a BuildEnvironment and install the build-time - # requirements. - pyproject_requires = self.req.pyproject_requires - assert pyproject_requires is not None - - self.req.build_env = BuildEnvironment() - self.req.build_env.install_requirements( - finder, pyproject_requires, "overlay", kind="build dependencies" - ) - conflicting, missing = self.req.build_env.check_requirements( - self.req.requirements_to_check - ) - if conflicting: - self._raise_conflicts("PEP 517/518 supported requirements", conflicting) - if missing: - logger.warning( - "Missing build requirements in pyproject.toml for %s.", - self.req, - ) - logger.warning( - "The project does not specify a build backend, and " - "pip cannot fall back to setuptools without %s.", - " and ".join(map(repr, sorted(missing))), - ) - - def _get_build_requires_wheel(self) -> Iterable[str]: - with self.req.build_env: - runner = runner_with_spinner_message("Getting requirements to build wheel") - backend = self.req.pep517_backend - assert backend is not None - with backend.subprocess_runner(runner): - return backend.get_requires_for_build_wheel() - - def _get_build_requires_editable(self) -> Iterable[str]: - with self.req.build_env: - runner = runner_with_spinner_message( - "Getting requirements to build editable" - ) - backend = self.req.pep517_backend - assert backend is not None - with backend.subprocess_runner(runner): - return backend.get_requires_for_build_editable() - - def _install_build_reqs(self, finder: "PackageFinder") -> None: - # Install any extra build dependencies that the backend requests. - # This must be done in a second pass, as the pyproject.toml - # dependencies must be installed before we can call the backend. - if ( - self.req.editable - and self.req.permit_editable_wheels - and self.req.supports_pyproject_editable - ): - build_reqs = self._get_build_requires_editable() - else: - build_reqs = self._get_build_requires_wheel() - conflicting, missing = self.req.build_env.check_requirements(build_reqs) - if conflicting: - self._raise_conflicts("the backend dependencies", conflicting) - self.req.build_env.install_requirements( - finder, missing, "normal", kind="backend dependencies" - ) - - def _raise_conflicts( - self, conflicting_with: str, conflicting_reqs: Set[Tuple[str, str]] - ) -> None: - format_string = ( - "Some build dependencies for {requirement} " - "conflict with {conflicting_with}: {description}." - ) - error_message = format_string.format( - requirement=self.req, - conflicting_with=conflicting_with, - description=", ".join( - f"{installed} is incompatible with {wanted}" - for installed, wanted in sorted(conflicting_reqs) - ), - ) - raise InstallationError(error_message) - - def _raise_missing_reqs(self, missing: Set[str]) -> None: - format_string = ( - "Some build dependencies for {requirement} are missing: {missing}." - ) - error_message = format_string.format( - requirement=self.req, missing=", ".join(map(repr, sorted(missing))) - ) - raise InstallationError(error_message) diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/distributions/wheel.py b/blog-app/venv/Lib/site-packages/pip/_internal/distributions/wheel.py deleted file mode 100644 index bfadd39..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/distributions/wheel.py +++ /dev/null @@ -1,42 +0,0 @@ -from typing import TYPE_CHECKING, Optional - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.distributions.base import AbstractDistribution -from pip._internal.metadata import ( - BaseDistribution, - FilesystemWheel, - get_wheel_distribution, -) - -if TYPE_CHECKING: - from pip._internal.index.package_finder import PackageFinder - - -class WheelDistribution(AbstractDistribution): - """Represents a wheel distribution. - - This does not need any preparation as wheels can be directly unpacked. - """ - - @property - def build_tracker_id(self) -> Optional[str]: - return None - - def get_metadata_distribution(self) -> BaseDistribution: - """Loads the metadata from the wheel file into memory and returns a - Distribution that uses it, not relying on the wheel file or - requirement. - """ - assert self.req.local_file_path, "Set as part of preparation during download" - assert self.req.name, "Wheels are never unnamed" - wheel = FilesystemWheel(self.req.local_file_path) - return get_wheel_distribution(wheel, canonicalize_name(self.req.name)) - - def prepare_distribution_metadata( - self, - finder: "PackageFinder", - build_isolation: bool, - check_build_deps: bool, - ) -> None: - pass diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/exceptions.py b/blog-app/venv/Lib/site-packages/pip/_internal/exceptions.py deleted file mode 100644 index 4fe4aad..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/exceptions.py +++ /dev/null @@ -1,862 +0,0 @@ -"""Exceptions used throughout package. - -This module MUST NOT try to import from anything within `pip._internal` to -operate. This is expected to be importable from any/all files within the -subpackage and, thus, should not depend on them. -""" - -import configparser -import contextlib -import locale -import logging -import pathlib -import re -import sys -from itertools import chain, groupby, repeat -from typing import TYPE_CHECKING, Dict, Iterator, List, Literal, Optional, Union - -from pip._vendor.packaging.requirements import InvalidRequirement -from pip._vendor.packaging.version import InvalidVersion -from pip._vendor.rich.console import Console, ConsoleOptions, RenderResult -from pip._vendor.rich.markup import escape -from pip._vendor.rich.text import Text - -if TYPE_CHECKING: - from hashlib import _Hash - - from pip._vendor.requests.models import Request, Response - - from pip._internal.metadata import BaseDistribution - from pip._internal.models.link import Link - from pip._internal.req.req_install import InstallRequirement - -logger = logging.getLogger(__name__) - - -# -# Scaffolding -# -def _is_kebab_case(s: str) -> bool: - return re.match(r"^[a-z]+(-[a-z]+)*$", s) is not None - - -def _prefix_with_indent( - s: Union[Text, str], - console: Console, - *, - prefix: str, - indent: str, -) -> Text: - if isinstance(s, Text): - text = s - else: - text = console.render_str(s) - - return console.render_str(prefix, overflow="ignore") + console.render_str( - f"\n{indent}", overflow="ignore" - ).join(text.split(allow_blank=True)) - - -class PipError(Exception): - """The base pip error.""" - - -class DiagnosticPipError(PipError): - """An error, that presents diagnostic information to the user. - - This contains a bunch of logic, to enable pretty presentation of our error - messages. Each error gets a unique reference. Each error can also include - additional context, a hint and/or a note -- which are presented with the - main error message in a consistent style. - - This is adapted from the error output styling in `sphinx-theme-builder`. - """ - - reference: str - - def __init__( - self, - *, - kind: 'Literal["error", "warning"]' = "error", - reference: Optional[str] = None, - message: Union[str, Text], - context: Optional[Union[str, Text]], - hint_stmt: Optional[Union[str, Text]], - note_stmt: Optional[Union[str, Text]] = None, - link: Optional[str] = None, - ) -> None: - # Ensure a proper reference is provided. - if reference is None: - assert hasattr(self, "reference"), "error reference not provided!" - reference = self.reference - assert _is_kebab_case(reference), "error reference must be kebab-case!" - - self.kind = kind - self.reference = reference - - self.message = message - self.context = context - - self.note_stmt = note_stmt - self.hint_stmt = hint_stmt - - self.link = link - - super().__init__(f"<{self.__class__.__name__}: {self.reference}>") - - def __repr__(self) -> str: - return ( - f"<{self.__class__.__name__}(" - f"reference={self.reference!r}, " - f"message={self.message!r}, " - f"context={self.context!r}, " - f"note_stmt={self.note_stmt!r}, " - f"hint_stmt={self.hint_stmt!r}" - ")>" - ) - - def __rich_console__( - self, - console: Console, - options: ConsoleOptions, - ) -> RenderResult: - colour = "red" if self.kind == "error" else "yellow" - - yield f"[{colour} bold]{self.kind}[/]: [bold]{self.reference}[/]" - yield "" - - if not options.ascii_only: - # Present the main message, with relevant context indented. - if self.context is not None: - yield _prefix_with_indent( - self.message, - console, - prefix=f"[{colour}]×[/] ", - indent=f"[{colour}]│[/] ", - ) - yield _prefix_with_indent( - self.context, - console, - prefix=f"[{colour}]╰─>[/] ", - indent=f"[{colour}] [/] ", - ) - else: - yield _prefix_with_indent( - self.message, - console, - prefix="[red]×[/] ", - indent=" ", - ) - else: - yield self.message - if self.context is not None: - yield "" - yield self.context - - if self.note_stmt is not None or self.hint_stmt is not None: - yield "" - - if self.note_stmt is not None: - yield _prefix_with_indent( - self.note_stmt, - console, - prefix="[magenta bold]note[/]: ", - indent=" ", - ) - if self.hint_stmt is not None: - yield _prefix_with_indent( - self.hint_stmt, - console, - prefix="[cyan bold]hint[/]: ", - indent=" ", - ) - - if self.link is not None: - yield "" - yield f"Link: {self.link}" - - -# -# Actual Errors -# -class ConfigurationError(PipError): - """General exception in configuration""" - - -class InstallationError(PipError): - """General exception during installation""" - - -class MissingPyProjectBuildRequires(DiagnosticPipError): - """Raised when pyproject.toml has `build-system`, but no `build-system.requires`.""" - - reference = "missing-pyproject-build-system-requires" - - def __init__(self, *, package: str) -> None: - super().__init__( - message=f"Can not process {escape(package)}", - context=Text( - "This package has an invalid pyproject.toml file.\n" - "The [build-system] table is missing the mandatory `requires` key." - ), - note_stmt="This is an issue with the package mentioned above, not pip.", - hint_stmt=Text("See PEP 518 for the detailed specification."), - ) - - -class InvalidPyProjectBuildRequires(DiagnosticPipError): - """Raised when pyproject.toml an invalid `build-system.requires`.""" - - reference = "invalid-pyproject-build-system-requires" - - def __init__(self, *, package: str, reason: str) -> None: - super().__init__( - message=f"Can not process {escape(package)}", - context=Text( - "This package has an invalid `build-system.requires` key in " - f"pyproject.toml.\n{reason}" - ), - note_stmt="This is an issue with the package mentioned above, not pip.", - hint_stmt=Text("See PEP 518 for the detailed specification."), - ) - - -class NoneMetadataError(PipError): - """Raised when accessing a Distribution's "METADATA" or "PKG-INFO". - - This signifies an inconsistency, when the Distribution claims to have - the metadata file (if not, raise ``FileNotFoundError`` instead), but is - not actually able to produce its content. This may be due to permission - errors. - """ - - def __init__( - self, - dist: "BaseDistribution", - metadata_name: str, - ) -> None: - """ - :param dist: A Distribution object. - :param metadata_name: The name of the metadata being accessed - (can be "METADATA" or "PKG-INFO"). - """ - self.dist = dist - self.metadata_name = metadata_name - - def __str__(self) -> str: - # Use `dist` in the error message because its stringification - # includes more information, like the version and location. - return f"None {self.metadata_name} metadata found for distribution: {self.dist}" - - -class UserInstallationInvalid(InstallationError): - """A --user install is requested on an environment without user site.""" - - def __str__(self) -> str: - return "User base directory is not specified" - - -class InvalidSchemeCombination(InstallationError): - def __str__(self) -> str: - before = ", ".join(str(a) for a in self.args[:-1]) - return f"Cannot set {before} and {self.args[-1]} together" - - -class DistributionNotFound(InstallationError): - """Raised when a distribution cannot be found to satisfy a requirement""" - - -class RequirementsFileParseError(InstallationError): - """Raised when a general error occurs parsing a requirements file line.""" - - -class BestVersionAlreadyInstalled(PipError): - """Raised when the most up-to-date version of a package is already - installed.""" - - -class BadCommand(PipError): - """Raised when virtualenv or a command is not found""" - - -class CommandError(PipError): - """Raised when there is an error in command-line arguments""" - - -class PreviousBuildDirError(PipError): - """Raised when there's a previous conflicting build directory""" - - -class NetworkConnectionError(PipError): - """HTTP connection error""" - - def __init__( - self, - error_msg: str, - response: Optional["Response"] = None, - request: Optional["Request"] = None, - ) -> None: - """ - Initialize NetworkConnectionError with `request` and `response` - objects. - """ - self.response = response - self.request = request - self.error_msg = error_msg - if ( - self.response is not None - and not self.request - and hasattr(response, "request") - ): - self.request = self.response.request - super().__init__(error_msg, response, request) - - def __str__(self) -> str: - return str(self.error_msg) - - -class InvalidWheelFilename(InstallationError): - """Invalid wheel filename.""" - - -class UnsupportedWheel(InstallationError): - """Unsupported wheel.""" - - -class InvalidWheel(InstallationError): - """Invalid (e.g. corrupt) wheel.""" - - def __init__(self, location: str, name: str): - self.location = location - self.name = name - - def __str__(self) -> str: - return f"Wheel '{self.name}' located at {self.location} is invalid." - - -class MetadataInconsistent(InstallationError): - """Built metadata contains inconsistent information. - - This is raised when the metadata contains values (e.g. name and version) - that do not match the information previously obtained from sdist filename, - user-supplied ``#egg=`` value, or an install requirement name. - """ - - def __init__( - self, ireq: "InstallRequirement", field: str, f_val: str, m_val: str - ) -> None: - self.ireq = ireq - self.field = field - self.f_val = f_val - self.m_val = m_val - - def __str__(self) -> str: - return ( - f"Requested {self.ireq} has inconsistent {self.field}: " - f"expected {self.f_val!r}, but metadata has {self.m_val!r}" - ) - - -class MetadataInvalid(InstallationError): - """Metadata is invalid.""" - - def __init__(self, ireq: "InstallRequirement", error: str) -> None: - self.ireq = ireq - self.error = error - - def __str__(self) -> str: - return f"Requested {self.ireq} has invalid metadata: {self.error}" - - -class InstallationSubprocessError(DiagnosticPipError, InstallationError): - """A subprocess call failed.""" - - reference = "subprocess-exited-with-error" - - def __init__( - self, - *, - command_description: str, - exit_code: int, - output_lines: Optional[List[str]], - ) -> None: - if output_lines is None: - output_prompt = Text("See above for output.") - else: - output_prompt = ( - Text.from_markup(f"[red][{len(output_lines)} lines of output][/]\n") - + Text("".join(output_lines)) - + Text.from_markup(R"[red]\[end of output][/]") - ) - - super().__init__( - message=( - f"[green]{escape(command_description)}[/] did not run successfully.\n" - f"exit code: {exit_code}" - ), - context=output_prompt, - hint_stmt=None, - note_stmt=( - "This error originates from a subprocess, and is likely not a " - "problem with pip." - ), - ) - - self.command_description = command_description - self.exit_code = exit_code - - def __str__(self) -> str: - return f"{self.command_description} exited with {self.exit_code}" - - -class MetadataGenerationFailed(InstallationSubprocessError, InstallationError): - reference = "metadata-generation-failed" - - def __init__( - self, - *, - package_details: str, - ) -> None: - super(InstallationSubprocessError, self).__init__( - message="Encountered error while generating package metadata.", - context=escape(package_details), - hint_stmt="See above for details.", - note_stmt="This is an issue with the package mentioned above, not pip.", - ) - - def __str__(self) -> str: - return "metadata generation failed" - - -class HashErrors(InstallationError): - """Multiple HashError instances rolled into one for reporting""" - - def __init__(self) -> None: - self.errors: List[HashError] = [] - - def append(self, error: "HashError") -> None: - self.errors.append(error) - - def __str__(self) -> str: - lines = [] - self.errors.sort(key=lambda e: e.order) - for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): - lines.append(cls.head) - lines.extend(e.body() for e in errors_of_cls) - if lines: - return "\n".join(lines) - return "" - - def __bool__(self) -> bool: - return bool(self.errors) - - -class HashError(InstallationError): - """ - A failure to verify a package against known-good hashes - - :cvar order: An int sorting hash exception classes by difficulty of - recovery (lower being harder), so the user doesn't bother fretting - about unpinned packages when he has deeper issues, like VCS - dependencies, to deal with. Also keeps error reports in a - deterministic order. - :cvar head: A section heading for display above potentially many - exceptions of this kind - :ivar req: The InstallRequirement that triggered this error. This is - pasted on after the exception is instantiated, because it's not - typically available earlier. - - """ - - req: Optional["InstallRequirement"] = None - head = "" - order: int = -1 - - def body(self) -> str: - """Return a summary of me for display under the heading. - - This default implementation simply prints a description of the - triggering requirement. - - :param req: The InstallRequirement that provoked this error, with - its link already populated by the resolver's _populate_link(). - - """ - return f" {self._requirement_name()}" - - def __str__(self) -> str: - return f"{self.head}\n{self.body()}" - - def _requirement_name(self) -> str: - """Return a description of the requirement that triggered me. - - This default implementation returns long description of the req, with - line numbers - - """ - return str(self.req) if self.req else "unknown package" - - -class VcsHashUnsupported(HashError): - """A hash was provided for a version-control-system-based requirement, but - we don't have a method for hashing those.""" - - order = 0 - head = ( - "Can't verify hashes for these requirements because we don't " - "have a way to hash version control repositories:" - ) - - -class DirectoryUrlHashUnsupported(HashError): - """A hash was provided for a version-control-system-based requirement, but - we don't have a method for hashing those.""" - - order = 1 - head = ( - "Can't verify hashes for these file:// requirements because they " - "point to directories:" - ) - - -class HashMissing(HashError): - """A hash was needed for a requirement but is absent.""" - - order = 2 - head = ( - "Hashes are required in --require-hashes mode, but they are " - "missing from some requirements. Here is a list of those " - "requirements along with the hashes their downloaded archives " - "actually had. Add lines like these to your requirements files to " - "prevent tampering. (If you did not enable --require-hashes " - "manually, note that it turns on automatically when any package " - "has a hash.)" - ) - - def __init__(self, gotten_hash: str) -> None: - """ - :param gotten_hash: The hash of the (possibly malicious) archive we - just downloaded - """ - self.gotten_hash = gotten_hash - - def body(self) -> str: - # Dodge circular import. - from pip._internal.utils.hashes import FAVORITE_HASH - - package = None - if self.req: - # In the case of URL-based requirements, display the original URL - # seen in the requirements file rather than the package name, - # so the output can be directly copied into the requirements file. - package = ( - self.req.original_link - if self.req.is_direct - # In case someone feeds something downright stupid - # to InstallRequirement's constructor. - else getattr(self.req, "req", None) - ) - return " {} --hash={}:{}".format( - package or "unknown package", FAVORITE_HASH, self.gotten_hash - ) - - -class HashUnpinned(HashError): - """A requirement had a hash specified but was not pinned to a specific - version.""" - - order = 3 - head = ( - "In --require-hashes mode, all requirements must have their " - "versions pinned with ==. These do not:" - ) - - -class HashMismatch(HashError): - """ - Distribution file hash values don't match. - - :ivar package_name: The name of the package that triggered the hash - mismatch. Feel free to write to this after the exception is raise to - improve its error message. - - """ - - order = 4 - head = ( - "THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS " - "FILE. If you have updated the package versions, please update " - "the hashes. Otherwise, examine the package contents carefully; " - "someone may have tampered with them." - ) - - def __init__(self, allowed: Dict[str, List[str]], gots: Dict[str, "_Hash"]) -> None: - """ - :param allowed: A dict of algorithm names pointing to lists of allowed - hex digests - :param gots: A dict of algorithm names pointing to hashes we - actually got from the files under suspicion - """ - self.allowed = allowed - self.gots = gots - - def body(self) -> str: - return f" {self._requirement_name()}:\n{self._hash_comparison()}" - - def _hash_comparison(self) -> str: - """ - Return a comparison of actual and expected hash values. - - Example:: - - Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde - or 123451234512345123451234512345123451234512345 - Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef - - """ - - def hash_then_or(hash_name: str) -> "chain[str]": - # For now, all the decent hashes have 6-char names, so we can get - # away with hard-coding space literals. - return chain([hash_name], repeat(" or")) - - lines: List[str] = [] - for hash_name, expecteds in self.allowed.items(): - prefix = hash_then_or(hash_name) - lines.extend((f" Expected {next(prefix)} {e}") for e in expecteds) - lines.append( - f" Got {self.gots[hash_name].hexdigest()}\n" - ) - return "\n".join(lines) - - -class UnsupportedPythonVersion(InstallationError): - """Unsupported python version according to Requires-Python package - metadata.""" - - -class ConfigurationFileCouldNotBeLoaded(ConfigurationError): - """When there are errors while loading a configuration file""" - - def __init__( - self, - reason: str = "could not be loaded", - fname: Optional[str] = None, - error: Optional[configparser.Error] = None, - ) -> None: - super().__init__(error) - self.reason = reason - self.fname = fname - self.error = error - - def __str__(self) -> str: - if self.fname is not None: - message_part = f" in {self.fname}." - else: - assert self.error is not None - message_part = f".\n{self.error}\n" - return f"Configuration file {self.reason}{message_part}" - - -_DEFAULT_EXTERNALLY_MANAGED_ERROR = f"""\ -The Python environment under {sys.prefix} is managed externally, and may not be -manipulated by the user. Please use specific tooling from the distributor of -the Python installation to interact with this environment instead. -""" - - -class ExternallyManagedEnvironment(DiagnosticPipError): - """The current environment is externally managed. - - This is raised when the current environment is externally managed, as - defined by `PEP 668`_. The ``EXTERNALLY-MANAGED`` configuration is checked - and displayed when the error is bubbled up to the user. - - :param error: The error message read from ``EXTERNALLY-MANAGED``. - """ - - reference = "externally-managed-environment" - - def __init__(self, error: Optional[str]) -> None: - if error is None: - context = Text(_DEFAULT_EXTERNALLY_MANAGED_ERROR) - else: - context = Text(error) - super().__init__( - message="This environment is externally managed", - context=context, - note_stmt=( - "If you believe this is a mistake, please contact your " - "Python installation or OS distribution provider. " - "You can override this, at the risk of breaking your Python " - "installation or OS, by passing --break-system-packages." - ), - hint_stmt=Text("See PEP 668 for the detailed specification."), - ) - - @staticmethod - def _iter_externally_managed_error_keys() -> Iterator[str]: - # LC_MESSAGES is in POSIX, but not the C standard. The most common - # platform that does not implement this category is Windows, where - # using other categories for console message localization is equally - # unreliable, so we fall back to the locale-less vendor message. This - # can always be re-evaluated when a vendor proposes a new alternative. - try: - category = locale.LC_MESSAGES - except AttributeError: - lang: Optional[str] = None - else: - lang, _ = locale.getlocale(category) - if lang is not None: - yield f"Error-{lang}" - for sep in ("-", "_"): - before, found, _ = lang.partition(sep) - if not found: - continue - yield f"Error-{before}" - yield "Error" - - @classmethod - def from_config( - cls, - config: Union[pathlib.Path, str], - ) -> "ExternallyManagedEnvironment": - parser = configparser.ConfigParser(interpolation=None) - try: - parser.read(config, encoding="utf-8") - section = parser["externally-managed"] - for key in cls._iter_externally_managed_error_keys(): - with contextlib.suppress(KeyError): - return cls(section[key]) - except KeyError: - pass - except (OSError, UnicodeDecodeError, configparser.ParsingError): - from pip._internal.utils._log import VERBOSE - - exc_info = logger.isEnabledFor(VERBOSE) - logger.warning("Failed to read %s", config, exc_info=exc_info) - return cls(None) - - -class UninstallMissingRecord(DiagnosticPipError): - reference = "uninstall-no-record-file" - - def __init__(self, *, distribution: "BaseDistribution") -> None: - installer = distribution.installer - if not installer or installer == "pip": - dep = f"{distribution.raw_name}=={distribution.version}" - hint = Text.assemble( - "You might be able to recover from this via: ", - (f"pip install --force-reinstall --no-deps {dep}", "green"), - ) - else: - hint = Text( - f"The package was installed by {installer}. " - "You should check if it can uninstall the package." - ) - - super().__init__( - message=Text(f"Cannot uninstall {distribution}"), - context=( - "The package's contents are unknown: " - f"no RECORD file was found for {distribution.raw_name}." - ), - hint_stmt=hint, - ) - - -class LegacyDistutilsInstall(DiagnosticPipError): - reference = "uninstall-distutils-installed-package" - - def __init__(self, *, distribution: "BaseDistribution") -> None: - super().__init__( - message=Text(f"Cannot uninstall {distribution}"), - context=( - "It is a distutils installed project and thus we cannot accurately " - "determine which files belong to it which would lead to only a partial " - "uninstall." - ), - hint_stmt=None, - ) - - -class InvalidInstalledPackage(DiagnosticPipError): - reference = "invalid-installed-package" - - def __init__( - self, - *, - dist: "BaseDistribution", - invalid_exc: Union[InvalidRequirement, InvalidVersion], - ) -> None: - installed_location = dist.installed_location - - if isinstance(invalid_exc, InvalidRequirement): - invalid_type = "requirement" - else: - invalid_type = "version" - - super().__init__( - message=Text( - f"Cannot process installed package {dist} " - + (f"in {installed_location!r} " if installed_location else "") - + f"because it has an invalid {invalid_type}:\n{invalid_exc.args[0]}" - ), - context=( - "Starting with pip 24.1, packages with invalid " - f"{invalid_type}s can not be processed." - ), - hint_stmt="To proceed this package must be uninstalled.", - ) - - -class IncompleteDownloadError(DiagnosticPipError): - """Raised when the downloader receives fewer bytes than advertised - in the Content-Length header.""" - - reference = "incomplete-download" - - def __init__( - self, link: "Link", received: int, expected: int, *, retries: int - ) -> None: - # Dodge circular import. - from pip._internal.utils.misc import format_size - - download_status = f"{format_size(received)}/{format_size(expected)}" - if retries: - retry_status = f"after {retries} attempts " - hint = "Use --resume-retries to configure resume attempt limit." - else: - retry_status = "" - hint = "Consider using --resume-retries to enable download resumption." - message = Text( - f"Download failed {retry_status}because not enough bytes " - f"were received ({download_status})" - ) - - super().__init__( - message=message, - context=f"URL: {link.redacted_url}", - hint_stmt=hint, - note_stmt="This is an issue with network connectivity, not pip.", - ) - - -class ResolutionTooDeepError(DiagnosticPipError): - """Raised when the dependency resolver exceeds the maximum recursion depth.""" - - reference = "resolution-too-deep" - - def __init__(self) -> None: - super().__init__( - message="Dependency resolution exceeded maximum depth", - context=( - "Pip cannot resolve the current dependencies as the dependency graph " - "is too complex for pip to solve efficiently." - ), - hint_stmt=( - "Try adding lower bounds to constrain your dependencies, " - "for example: 'package>=2.0.0' instead of just 'package'. " - ), - link="https://pip.pypa.io/en/stable/topics/dependency-resolution/#handling-resolution-too-deep-errors", - ) diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/index/__init__.py b/blog-app/venv/Lib/site-packages/pip/_internal/index/__init__.py deleted file mode 100644 index 197dd75..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/index/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Index interaction code""" diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index c1ac1e5a4edd6144483b939a132755ec7fd02808..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252 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 WEKa8Gh<$S8#n>nLZ|l>0cK$!Vm35l{ diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-310.pyc deleted file mode 100644 index 2b81cb7d54bb65a672feb52aafc02949ad79722a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8905 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 Optional[str]: - """Look for VCS schemes in the URL. - - Returns the matched VCS scheme, or None if there's no match. - """ - for scheme in vcs.schemes: - if url.lower().startswith(scheme) and url[len(scheme)] in "+:": - return scheme - return None - - -class _NotAPIContent(Exception): - def __init__(self, content_type: str, request_desc: str) -> None: - super().__init__(content_type, request_desc) - self.content_type = content_type - self.request_desc = request_desc - - -def _ensure_api_header(response: Response) -> None: - """ - Check the Content-Type header to ensure the response contains a Simple - API Response. - - Raises `_NotAPIContent` if the content type is not a valid content-type. - """ - content_type = response.headers.get("Content-Type", "Unknown") - - content_type_l = content_type.lower() - if content_type_l.startswith( - ( - "text/html", - "application/vnd.pypi.simple.v1+html", - "application/vnd.pypi.simple.v1+json", - ) - ): - return - - raise _NotAPIContent(content_type, response.request.method) - - -class _NotHTTP(Exception): - pass - - -def _ensure_api_response(url: str, session: PipSession) -> None: - """ - Send a HEAD request to the URL, and ensure the response contains a simple - API Response. - - Raises `_NotHTTP` if the URL is not available for a HEAD request, or - `_NotAPIContent` if the content type is not a valid content type. - """ - scheme, netloc, path, query, fragment = urllib.parse.urlsplit(url) - if scheme not in {"http", "https"}: - raise _NotHTTP() - - resp = session.head(url, allow_redirects=True) - raise_for_status(resp) - - _ensure_api_header(resp) - - -def _get_simple_response(url: str, session: PipSession) -> Response: - """Access an Simple API response with GET, and return the response. - - This consists of three parts: - - 1. If the URL looks suspiciously like an archive, send a HEAD first to - check the Content-Type is HTML or Simple API, to avoid downloading a - large file. Raise `_NotHTTP` if the content type cannot be determined, or - `_NotAPIContent` if it is not HTML or a Simple API. - 2. Actually perform the request. Raise HTTP exceptions on network failures. - 3. Check the Content-Type header to make sure we got a Simple API response, - and raise `_NotAPIContent` otherwise. - """ - if is_archive_file(Link(url).filename): - _ensure_api_response(url, session=session) - - logger.debug("Getting page %s", redact_auth_from_url(url)) - - resp = session.get( - url, - headers={ - "Accept": ", ".join( - [ - "application/vnd.pypi.simple.v1+json", - "application/vnd.pypi.simple.v1+html; q=0.1", - "text/html; q=0.01", - ] - ), - # We don't want to blindly returned cached data for - # /simple/, because authors generally expecting that - # twine upload && pip install will function, but if - # they've done a pip install in the last ~10 minutes - # it won't. Thus by setting this to zero we will not - # blindly use any cached data, however the benefit of - # using max-age=0 instead of no-cache, is that we will - # still support conditional requests, so we will still - # minimize traffic sent in cases where the page hasn't - # changed at all, we will just always incur the round - # trip for the conditional GET now instead of only - # once per 10 minutes. - # For more information, please see pypa/pip#5670. - "Cache-Control": "max-age=0", - }, - ) - raise_for_status(resp) - - # The check for archives above only works if the url ends with - # something that looks like an archive. However that is not a - # requirement of an url. Unless we issue a HEAD request on every - # url we cannot know ahead of time for sure if something is a - # Simple API response or not. However we can check after we've - # downloaded it. - _ensure_api_header(resp) - - logger.debug( - "Fetched page %s as %s", - redact_auth_from_url(url), - resp.headers.get("Content-Type", "Unknown"), - ) - - return resp - - -def _get_encoding_from_headers(headers: ResponseHeaders) -> Optional[str]: - """Determine if we have any encoding information in our headers.""" - if headers and "Content-Type" in headers: - m = email.message.Message() - m["content-type"] = headers["Content-Type"] - charset = m.get_param("charset") - if charset: - return str(charset) - return None - - -class CacheablePageContent: - def __init__(self, page: "IndexContent") -> None: - assert page.cache_link_parsing - self.page = page - - def __eq__(self, other: object) -> bool: - return isinstance(other, type(self)) and self.page.url == other.page.url - - def __hash__(self) -> int: - return hash(self.page.url) - - -class ParseLinks(Protocol): - def __call__(self, page: "IndexContent") -> Iterable[Link]: ... - - -def with_cached_index_content(fn: ParseLinks) -> ParseLinks: - """ - Given a function that parses an Iterable[Link] from an IndexContent, cache the - function's result (keyed by CacheablePageContent), unless the IndexContent - `page` has `page.cache_link_parsing == False`. - """ - - @functools.lru_cache(maxsize=None) - def wrapper(cacheable_page: CacheablePageContent) -> List[Link]: - return list(fn(cacheable_page.page)) - - @functools.wraps(fn) - def wrapper_wrapper(page: "IndexContent") -> List[Link]: - if page.cache_link_parsing: - return wrapper(CacheablePageContent(page)) - return list(fn(page)) - - return wrapper_wrapper - - -@with_cached_index_content -def parse_links(page: "IndexContent") -> Iterable[Link]: - """ - Parse a Simple API's Index Content, and yield its anchor elements as Link objects. - """ - - content_type_l = page.content_type.lower() - if content_type_l.startswith("application/vnd.pypi.simple.v1+json"): - data = json.loads(page.content) - for file in data.get("files", []): - link = Link.from_json(file, page.url) - if link is None: - continue - yield link - return - - parser = HTMLLinkParser(page.url) - encoding = page.encoding or "utf-8" - parser.feed(page.content.decode(encoding)) - - url = page.url - base_url = parser.base_url or url - for anchor in parser.anchors: - link = Link.from_element(anchor, page_url=url, base_url=base_url) - if link is None: - continue - yield link - - -@dataclass(frozen=True) -class IndexContent: - """Represents one response (or page), along with its URL. - - :param encoding: the encoding to decode the given content. - :param url: the URL from which the HTML was downloaded. - :param cache_link_parsing: whether links parsed from this page's url - should be cached. PyPI index urls should - have this set to False, for example. - """ - - content: bytes - content_type: str - encoding: Optional[str] - url: str - cache_link_parsing: bool = True - - def __str__(self) -> str: - return redact_auth_from_url(self.url) - - -class HTMLLinkParser(HTMLParser): - """ - HTMLParser that keeps the first base HREF and a list of all anchor - elements' attributes. - """ - - def __init__(self, url: str) -> None: - super().__init__(convert_charrefs=True) - - self.url: str = url - self.base_url: Optional[str] = None - self.anchors: List[Dict[str, Optional[str]]] = [] - - def handle_starttag(self, tag: str, attrs: List[Tuple[str, Optional[str]]]) -> None: - if tag == "base" and self.base_url is None: - href = self.get_href(attrs) - if href is not None: - self.base_url = href - elif tag == "a": - self.anchors.append(dict(attrs)) - - def get_href(self, attrs: List[Tuple[str, Optional[str]]]) -> Optional[str]: - for name, value in attrs: - if name == "href": - return value - return None - - -def _handle_get_simple_fail( - link: Link, - reason: Union[str, Exception], - meth: Optional[Callable[..., None]] = None, -) -> None: - if meth is None: - meth = logger.debug - meth("Could not fetch URL %s: %s - skipping", link, reason) - - -def _make_index_content( - response: Response, cache_link_parsing: bool = True -) -> IndexContent: - encoding = _get_encoding_from_headers(response.headers) - return IndexContent( - response.content, - response.headers["Content-Type"], - encoding=encoding, - url=response.url, - cache_link_parsing=cache_link_parsing, - ) - - -def _get_index_content(link: Link, *, session: PipSession) -> Optional["IndexContent"]: - url = link.url.split("#", 1)[0] - - # Check for VCS schemes that do not support lookup as web pages. - vcs_scheme = _match_vcs_scheme(url) - if vcs_scheme: - logger.warning( - "Cannot look at %s URL %s because it does not support lookup as web pages.", - vcs_scheme, - link, - ) - return None - - # Tack index.html onto file:// URLs that point to directories - scheme, _, path, _, _, _ = urllib.parse.urlparse(url) - if scheme == "file" and os.path.isdir(urllib.request.url2pathname(path)): - # add trailing slash if not present so urljoin doesn't trim - # final segment - if not url.endswith("/"): - url += "/" - # TODO: In the future, it would be nice if pip supported PEP 691 - # style responses in the file:// URLs, however there's no - # standard file extension for application/vnd.pypi.simple.v1+json - # so we'll need to come up with something on our own. - url = urllib.parse.urljoin(url, "index.html") - logger.debug(" file: URL is directory, getting %s", url) - - try: - resp = _get_simple_response(url, session=session) - except _NotHTTP: - logger.warning( - "Skipping page %s because it looks like an archive, and cannot " - "be checked by a HTTP HEAD request.", - link, - ) - except _NotAPIContent as exc: - logger.warning( - "Skipping page %s because the %s request got Content-Type: %s. " - "The only supported Content-Types are application/vnd.pypi.simple.v1+json, " - "application/vnd.pypi.simple.v1+html, and text/html", - link, - exc.request_desc, - exc.content_type, - ) - except NetworkConnectionError as exc: - _handle_get_simple_fail(link, exc) - except RetryError as exc: - _handle_get_simple_fail(link, exc) - except SSLError as exc: - reason = "There was a problem confirming the ssl certificate: " - reason += str(exc) - _handle_get_simple_fail(link, reason, meth=logger.info) - except requests.ConnectionError as exc: - _handle_get_simple_fail(link, f"connection error: {exc}") - except requests.Timeout: - _handle_get_simple_fail(link, "timed out") - else: - return _make_index_content(resp, cache_link_parsing=link.cache_link_parsing) - return None - - -class CollectedSources(NamedTuple): - find_links: Sequence[Optional[LinkSource]] - index_urls: Sequence[Optional[LinkSource]] - - -class LinkCollector: - """ - Responsible for collecting Link objects from all configured locations, - making network requests as needed. - - The class's main method is its collect_sources() method. - """ - - def __init__( - self, - session: PipSession, - search_scope: SearchScope, - ) -> None: - self.search_scope = search_scope - self.session = session - - @classmethod - def create( - cls, - session: PipSession, - options: Values, - suppress_no_index: bool = False, - ) -> "LinkCollector": - """ - :param session: The Session to use to make requests. - :param suppress_no_index: Whether to ignore the --no-index option - when constructing the SearchScope object. - """ - index_urls = [options.index_url] + options.extra_index_urls - if options.no_index and not suppress_no_index: - logger.debug( - "Ignoring indexes: %s", - ",".join(redact_auth_from_url(url) for url in index_urls), - ) - index_urls = [] - - # Make sure find_links is a list before passing to create(). - find_links = options.find_links or [] - - search_scope = SearchScope.create( - find_links=find_links, - index_urls=index_urls, - no_index=options.no_index, - ) - link_collector = LinkCollector( - session=session, - search_scope=search_scope, - ) - return link_collector - - @property - def find_links(self) -> List[str]: - return self.search_scope.find_links - - def fetch_response(self, location: Link) -> Optional[IndexContent]: - """ - Fetch an HTML page containing package links. - """ - return _get_index_content(location, session=self.session) - - def collect_sources( - self, - project_name: str, - candidates_from_page: CandidatesFromPage, - ) -> CollectedSources: - # The OrderedDict calls deduplicate sources by URL. - index_url_sources = collections.OrderedDict( - build_source( - loc, - candidates_from_page=candidates_from_page, - page_validator=self.session.is_secure_origin, - expand_dir=False, - cache_link_parsing=False, - project_name=project_name, - ) - for loc in self.search_scope.get_index_urls_locations(project_name) - ).values() - find_links_sources = collections.OrderedDict( - build_source( - loc, - candidates_from_page=candidates_from_page, - page_validator=self.session.is_secure_origin, - expand_dir=True, - cache_link_parsing=True, - project_name=project_name, - ) - for loc in self.find_links - ).values() - - if logger.isEnabledFor(logging.DEBUG): - lines = [ - f"* {s.link}" - for s in itertools.chain(find_links_sources, index_url_sources) - if s is not None and s.link is not None - ] - lines = [ - f"{len(lines)} location(s) to search " - f"for versions of {project_name}:" - ] + lines - logger.debug("\n".join(lines)) - - return CollectedSources( - find_links=list(find_links_sources), - index_urls=list(index_url_sources), - ) diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/index/package_finder.py b/blog-app/venv/Lib/site-packages/pip/_internal/index/package_finder.py deleted file mode 100644 index 6971e95..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/index/package_finder.py +++ /dev/null @@ -1,1050 +0,0 @@ -"""Routines related to PyPI, indexes""" - -import enum -import functools -import itertools -import logging -import re -from dataclasses import dataclass -from typing import ( - TYPE_CHECKING, - Dict, - FrozenSet, - Iterable, - List, - Optional, - Set, - Tuple, - Union, -) - -from pip._vendor.packaging import specifiers -from pip._vendor.packaging.tags import Tag -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import InvalidVersion, _BaseVersion -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.exceptions import ( - BestVersionAlreadyInstalled, - DistributionNotFound, - InvalidWheelFilename, - UnsupportedWheel, -) -from pip._internal.index.collector import LinkCollector, parse_links -from pip._internal.models.candidate import InstallationCandidate -from pip._internal.models.format_control import FormatControl -from pip._internal.models.link import Link -from pip._internal.models.search_scope import SearchScope -from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.models.target_python import TargetPython -from pip._internal.models.wheel import Wheel -from pip._internal.req import InstallRequirement -from pip._internal.utils._log import getLogger -from pip._internal.utils.filetypes import WHEEL_EXTENSION -from pip._internal.utils.hashes import Hashes -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import build_netloc -from pip._internal.utils.packaging import check_requires_python -from pip._internal.utils.unpacking import SUPPORTED_EXTENSIONS - -if TYPE_CHECKING: - from pip._vendor.typing_extensions import TypeGuard - -__all__ = ["FormatControl", "BestCandidateResult", "PackageFinder"] - - -logger = getLogger(__name__) - -BuildTag = Union[Tuple[()], Tuple[int, str]] -CandidateSortingKey = Tuple[int, int, int, _BaseVersion, Optional[int], BuildTag] - - -def _check_link_requires_python( - link: Link, - version_info: Tuple[int, int, int], - ignore_requires_python: bool = False, -) -> bool: - """ - Return whether the given Python version is compatible with a link's - "Requires-Python" value. - - :param version_info: A 3-tuple of ints representing the Python - major-minor-micro version to check. - :param ignore_requires_python: Whether to ignore the "Requires-Python" - value if the given Python version isn't compatible. - """ - try: - is_compatible = check_requires_python( - link.requires_python, - version_info=version_info, - ) - except specifiers.InvalidSpecifier: - logger.debug( - "Ignoring invalid Requires-Python (%r) for link: %s", - link.requires_python, - link, - ) - else: - if not is_compatible: - version = ".".join(map(str, version_info)) - if not ignore_requires_python: - logger.verbose( - "Link requires a different Python (%s not in: %r): %s", - version, - link.requires_python, - link, - ) - return False - - logger.debug( - "Ignoring failed Requires-Python check (%s not in: %r) for link: %s", - version, - link.requires_python, - link, - ) - - return True - - -class LinkType(enum.Enum): - candidate = enum.auto() - different_project = enum.auto() - yanked = enum.auto() - format_unsupported = enum.auto() - format_invalid = enum.auto() - platform_mismatch = enum.auto() - requires_python_mismatch = enum.auto() - - -class LinkEvaluator: - """ - Responsible for evaluating links for a particular project. - """ - - _py_version_re = re.compile(r"-py([123]\.?[0-9]?)$") - - # Don't include an allow_yanked default value to make sure each call - # site considers whether yanked releases are allowed. This also causes - # that decision to be made explicit in the calling code, which helps - # people when reading the code. - def __init__( - self, - project_name: str, - canonical_name: str, - formats: FrozenSet[str], - target_python: TargetPython, - allow_yanked: bool, - ignore_requires_python: Optional[bool] = None, - ) -> None: - """ - :param project_name: The user supplied package name. - :param canonical_name: The canonical package name. - :param formats: The formats allowed for this package. Should be a set - with 'binary' or 'source' or both in it. - :param target_python: The target Python interpreter to use when - evaluating link compatibility. This is used, for example, to - check wheel compatibility, as well as when checking the Python - version, e.g. the Python version embedded in a link filename - (or egg fragment) and against an HTML link's optional PEP 503 - "data-requires-python" attribute. - :param allow_yanked: Whether files marked as yanked (in the sense - of PEP 592) are permitted to be candidates for install. - :param ignore_requires_python: Whether to ignore incompatible - PEP 503 "data-requires-python" values in HTML links. Defaults - to False. - """ - if ignore_requires_python is None: - ignore_requires_python = False - - self._allow_yanked = allow_yanked - self._canonical_name = canonical_name - self._ignore_requires_python = ignore_requires_python - self._formats = formats - self._target_python = target_python - - self.project_name = project_name - - def evaluate_link(self, link: Link) -> Tuple[LinkType, str]: - """ - Determine whether a link is a candidate for installation. - - :return: A tuple (result, detail), where *result* is an enum - representing whether the evaluation found a candidate, or the reason - why one is not found. If a candidate is found, *detail* will be the - candidate's version string; if one is not found, it contains the - reason the link fails to qualify. - """ - version = None - if link.is_yanked and not self._allow_yanked: - reason = link.yanked_reason or "" - return (LinkType.yanked, f"yanked for reason: {reason}") - - if link.egg_fragment: - egg_info = link.egg_fragment - ext = link.ext - else: - egg_info, ext = link.splitext() - if not ext: - return (LinkType.format_unsupported, "not a file") - if ext not in SUPPORTED_EXTENSIONS: - return ( - LinkType.format_unsupported, - f"unsupported archive format: {ext}", - ) - if "binary" not in self._formats and ext == WHEEL_EXTENSION: - reason = f"No binaries permitted for {self.project_name}" - return (LinkType.format_unsupported, reason) - if "macosx10" in link.path and ext == ".zip": - return (LinkType.format_unsupported, "macosx10 one") - if ext == WHEEL_EXTENSION: - try: - wheel = Wheel(link.filename) - except InvalidWheelFilename: - return ( - LinkType.format_invalid, - "invalid wheel filename", - ) - if canonicalize_name(wheel.name) != self._canonical_name: - reason = f"wrong project name (not {self.project_name})" - return (LinkType.different_project, reason) - - supported_tags = self._target_python.get_unsorted_tags() - if not wheel.supported(supported_tags): - # Include the wheel's tags in the reason string to - # simplify troubleshooting compatibility issues. - file_tags = ", ".join(wheel.get_formatted_file_tags()) - reason = ( - f"none of the wheel's tags ({file_tags}) are compatible " - f"(run pip debug --verbose to show compatible tags)" - ) - return (LinkType.platform_mismatch, reason) - - version = wheel.version - - # This should be up by the self.ok_binary check, but see issue 2700. - if "source" not in self._formats and ext != WHEEL_EXTENSION: - reason = f"No sources permitted for {self.project_name}" - return (LinkType.format_unsupported, reason) - - if not version: - version = _extract_version_from_fragment( - egg_info, - self._canonical_name, - ) - if not version: - reason = f"Missing project version for {self.project_name}" - return (LinkType.format_invalid, reason) - - match = self._py_version_re.search(version) - if match: - version = version[: match.start()] - py_version = match.group(1) - if py_version != self._target_python.py_version: - return ( - LinkType.platform_mismatch, - "Python version is incorrect", - ) - - supports_python = _check_link_requires_python( - link, - version_info=self._target_python.py_version_info, - ignore_requires_python=self._ignore_requires_python, - ) - if not supports_python: - reason = f"{version} Requires-Python {link.requires_python}" - return (LinkType.requires_python_mismatch, reason) - - logger.debug("Found link %s, version: %s", link, version) - - return (LinkType.candidate, version) - - -def filter_unallowed_hashes( - candidates: List[InstallationCandidate], - hashes: Optional[Hashes], - project_name: str, -) -> List[InstallationCandidate]: - """ - Filter out candidates whose hashes aren't allowed, and return a new - list of candidates. - - If at least one candidate has an allowed hash, then all candidates with - either an allowed hash or no hash specified are returned. Otherwise, - the given candidates are returned. - - Including the candidates with no hash specified when there is a match - allows a warning to be logged if there is a more preferred candidate - with no hash specified. Returning all candidates in the case of no - matches lets pip report the hash of the candidate that would otherwise - have been installed (e.g. permitting the user to more easily update - their requirements file with the desired hash). - """ - if not hashes: - logger.debug( - "Given no hashes to check %s links for project %r: " - "discarding no candidates", - len(candidates), - project_name, - ) - # Make sure we're not returning back the given value. - return list(candidates) - - matches_or_no_digest = [] - # Collect the non-matches for logging purposes. - non_matches = [] - match_count = 0 - for candidate in candidates: - link = candidate.link - if not link.has_hash: - pass - elif link.is_hash_allowed(hashes=hashes): - match_count += 1 - else: - non_matches.append(candidate) - continue - - matches_or_no_digest.append(candidate) - - if match_count: - filtered = matches_or_no_digest - else: - # Make sure we're not returning back the given value. - filtered = list(candidates) - - if len(filtered) == len(candidates): - discard_message = "discarding no candidates" - else: - discard_message = "discarding {} non-matches:\n {}".format( - len(non_matches), - "\n ".join(str(candidate.link) for candidate in non_matches), - ) - - logger.debug( - "Checked %s links for project %r against %s hashes " - "(%s matches, %s no digest): %s", - len(candidates), - project_name, - hashes.digest_count, - match_count, - len(matches_or_no_digest) - match_count, - discard_message, - ) - - return filtered - - -@dataclass -class CandidatePreferences: - """ - Encapsulates some of the preferences for filtering and sorting - InstallationCandidate objects. - """ - - prefer_binary: bool = False - allow_all_prereleases: bool = False - - -@dataclass(frozen=True) -class BestCandidateResult: - """A collection of candidates, returned by `PackageFinder.find_best_candidate`. - - This class is only intended to be instantiated by CandidateEvaluator's - `compute_best_candidate()` method. - - :param all_candidates: A sequence of all available candidates found. - :param applicable_candidates: The applicable candidates. - :param best_candidate: The most preferred candidate found, or None - if no applicable candidates were found. - """ - - all_candidates: List[InstallationCandidate] - applicable_candidates: List[InstallationCandidate] - best_candidate: Optional[InstallationCandidate] - - def __post_init__(self) -> None: - assert set(self.applicable_candidates) <= set(self.all_candidates) - - if self.best_candidate is None: - assert not self.applicable_candidates - else: - assert self.best_candidate in self.applicable_candidates - - -class CandidateEvaluator: - """ - Responsible for filtering and sorting candidates for installation based - on what tags are valid. - """ - - @classmethod - def create( - cls, - project_name: str, - target_python: Optional[TargetPython] = None, - prefer_binary: bool = False, - allow_all_prereleases: bool = False, - specifier: Optional[specifiers.BaseSpecifier] = None, - hashes: Optional[Hashes] = None, - ) -> "CandidateEvaluator": - """Create a CandidateEvaluator object. - - :param target_python: The target Python interpreter to use when - checking compatibility. If None (the default), a TargetPython - object will be constructed from the running Python. - :param specifier: An optional object implementing `filter` - (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable - versions. - :param hashes: An optional collection of allowed hashes. - """ - if target_python is None: - target_python = TargetPython() - if specifier is None: - specifier = specifiers.SpecifierSet() - - supported_tags = target_python.get_sorted_tags() - - return cls( - project_name=project_name, - supported_tags=supported_tags, - specifier=specifier, - prefer_binary=prefer_binary, - allow_all_prereleases=allow_all_prereleases, - hashes=hashes, - ) - - def __init__( - self, - project_name: str, - supported_tags: List[Tag], - specifier: specifiers.BaseSpecifier, - prefer_binary: bool = False, - allow_all_prereleases: bool = False, - hashes: Optional[Hashes] = None, - ) -> None: - """ - :param supported_tags: The PEP 425 tags supported by the target - Python in order of preference (most preferred first). - """ - self._allow_all_prereleases = allow_all_prereleases - self._hashes = hashes - self._prefer_binary = prefer_binary - self._project_name = project_name - self._specifier = specifier - self._supported_tags = supported_tags - # Since the index of the tag in the _supported_tags list is used - # as a priority, precompute a map from tag to index/priority to be - # used in wheel.find_most_preferred_tag. - self._wheel_tag_preferences = { - tag: idx for idx, tag in enumerate(supported_tags) - } - - def get_applicable_candidates( - self, - candidates: List[InstallationCandidate], - ) -> List[InstallationCandidate]: - """ - Return the applicable candidates from a list of candidates. - """ - # Using None infers from the specifier instead. - allow_prereleases = self._allow_all_prereleases or None - specifier = self._specifier - - # We turn the version object into a str here because otherwise - # when we're debundled but setuptools isn't, Python will see - # packaging.version.Version and - # pkg_resources._vendor.packaging.version.Version as different - # types. This way we'll use a str as a common data interchange - # format. If we stop using the pkg_resources provided specifier - # and start using our own, we can drop the cast to str(). - candidates_and_versions = [(c, str(c.version)) for c in candidates] - versions = set( - specifier.filter( - (v for _, v in candidates_and_versions), - prereleases=allow_prereleases, - ) - ) - - applicable_candidates = [c for c, v in candidates_and_versions if v in versions] - filtered_applicable_candidates = filter_unallowed_hashes( - candidates=applicable_candidates, - hashes=self._hashes, - project_name=self._project_name, - ) - - return sorted(filtered_applicable_candidates, key=self._sort_key) - - def _sort_key(self, candidate: InstallationCandidate) -> CandidateSortingKey: - """ - Function to pass as the `key` argument to a call to sorted() to sort - InstallationCandidates by preference. - - Returns a tuple such that tuples sorting as greater using Python's - default comparison operator are more preferred. - - The preference is as follows: - - First and foremost, candidates with allowed (matching) hashes are - always preferred over candidates without matching hashes. This is - because e.g. if the only candidate with an allowed hash is yanked, - we still want to use that candidate. - - Second, excepting hash considerations, candidates that have been - yanked (in the sense of PEP 592) are always less preferred than - candidates that haven't been yanked. Then: - - If not finding wheels, they are sorted by version only. - If finding wheels, then the sort order is by version, then: - 1. existing installs - 2. wheels ordered via Wheel.support_index_min(self._supported_tags) - 3. source archives - If prefer_binary was set, then all wheels are sorted above sources. - - Note: it was considered to embed this logic into the Link - comparison operators, but then different sdist links - with the same version, would have to be considered equal - """ - valid_tags = self._supported_tags - support_num = len(valid_tags) - build_tag: BuildTag = () - binary_preference = 0 - link = candidate.link - if link.is_wheel: - # can raise InvalidWheelFilename - wheel = Wheel(link.filename) - try: - pri = -( - wheel.find_most_preferred_tag( - valid_tags, self._wheel_tag_preferences - ) - ) - except ValueError: - raise UnsupportedWheel( - f"{wheel.filename} is not a supported wheel for this platform. It " - "can't be sorted." - ) - if self._prefer_binary: - binary_preference = 1 - build_tag = wheel.build_tag - else: # sdist - pri = -(support_num) - has_allowed_hash = int(link.is_hash_allowed(self._hashes)) - yank_value = -1 * int(link.is_yanked) # -1 for yanked. - return ( - has_allowed_hash, - yank_value, - binary_preference, - candidate.version, - pri, - build_tag, - ) - - def sort_best_candidate( - self, - candidates: List[InstallationCandidate], - ) -> Optional[InstallationCandidate]: - """ - Return the best candidate per the instance's sort order, or None if - no candidate is acceptable. - """ - if not candidates: - return None - best_candidate = max(candidates, key=self._sort_key) - return best_candidate - - def compute_best_candidate( - self, - candidates: List[InstallationCandidate], - ) -> BestCandidateResult: - """ - Compute and return a `BestCandidateResult` instance. - """ - applicable_candidates = self.get_applicable_candidates(candidates) - - best_candidate = self.sort_best_candidate(applicable_candidates) - - return BestCandidateResult( - candidates, - applicable_candidates=applicable_candidates, - best_candidate=best_candidate, - ) - - -class PackageFinder: - """This finds packages. - - This is meant to match easy_install's technique for looking for - packages, by reading pages and looking for appropriate links. - """ - - def __init__( - self, - link_collector: LinkCollector, - target_python: TargetPython, - allow_yanked: bool, - format_control: Optional[FormatControl] = None, - candidate_prefs: Optional[CandidatePreferences] = None, - ignore_requires_python: Optional[bool] = None, - ) -> None: - """ - This constructor is primarily meant to be used by the create() class - method and from tests. - - :param format_control: A FormatControl object, used to control - the selection of source packages / binary packages when consulting - the index and links. - :param candidate_prefs: Options to use when creating a - CandidateEvaluator object. - """ - if candidate_prefs is None: - candidate_prefs = CandidatePreferences() - - format_control = format_control or FormatControl(set(), set()) - - self._allow_yanked = allow_yanked - self._candidate_prefs = candidate_prefs - self._ignore_requires_python = ignore_requires_python - self._link_collector = link_collector - self._target_python = target_python - - self.format_control = format_control - - # These are boring links that have already been logged somehow. - self._logged_links: Set[Tuple[Link, LinkType, str]] = set() - - # Cache of the result of finding candidates - self._all_candidates: Dict[str, List[InstallationCandidate]] = {} - self._best_candidates: Dict[ - Tuple[str, Optional[specifiers.BaseSpecifier], Optional[Hashes]], - BestCandidateResult, - ] = {} - - # Don't include an allow_yanked default value to make sure each call - # site considers whether yanked releases are allowed. This also causes - # that decision to be made explicit in the calling code, which helps - # people when reading the code. - @classmethod - def create( - cls, - link_collector: LinkCollector, - selection_prefs: SelectionPreferences, - target_python: Optional[TargetPython] = None, - ) -> "PackageFinder": - """Create a PackageFinder. - - :param selection_prefs: The candidate selection preferences, as a - SelectionPreferences object. - :param target_python: The target Python interpreter to use when - checking compatibility. If None (the default), a TargetPython - object will be constructed from the running Python. - """ - if target_python is None: - target_python = TargetPython() - - candidate_prefs = CandidatePreferences( - prefer_binary=selection_prefs.prefer_binary, - allow_all_prereleases=selection_prefs.allow_all_prereleases, - ) - - return cls( - candidate_prefs=candidate_prefs, - link_collector=link_collector, - target_python=target_python, - allow_yanked=selection_prefs.allow_yanked, - format_control=selection_prefs.format_control, - ignore_requires_python=selection_prefs.ignore_requires_python, - ) - - @property - def target_python(self) -> TargetPython: - return self._target_python - - @property - def search_scope(self) -> SearchScope: - return self._link_collector.search_scope - - @search_scope.setter - def search_scope(self, search_scope: SearchScope) -> None: - self._link_collector.search_scope = search_scope - - @property - def find_links(self) -> List[str]: - return self._link_collector.find_links - - @property - def index_urls(self) -> List[str]: - return self.search_scope.index_urls - - @property - def proxy(self) -> Optional[str]: - return self._link_collector.session.pip_proxy - - @property - def trusted_hosts(self) -> Iterable[str]: - for host_port in self._link_collector.session.pip_trusted_origins: - yield build_netloc(*host_port) - - @property - def custom_cert(self) -> Optional[str]: - # session.verify is either a boolean (use default bundle/no SSL - # verification) or a string path to a custom CA bundle to use. We only - # care about the latter. - verify = self._link_collector.session.verify - return verify if isinstance(verify, str) else None - - @property - def client_cert(self) -> Optional[str]: - cert = self._link_collector.session.cert - assert not isinstance(cert, tuple), "pip only supports PEM client certs" - return cert - - @property - def allow_all_prereleases(self) -> bool: - return self._candidate_prefs.allow_all_prereleases - - def set_allow_all_prereleases(self) -> None: - self._candidate_prefs.allow_all_prereleases = True - - @property - def prefer_binary(self) -> bool: - return self._candidate_prefs.prefer_binary - - def set_prefer_binary(self) -> None: - self._candidate_prefs.prefer_binary = True - - def requires_python_skipped_reasons(self) -> List[str]: - reasons = { - detail - for _, result, detail in self._logged_links - if result == LinkType.requires_python_mismatch - } - return sorted(reasons) - - def make_link_evaluator(self, project_name: str) -> LinkEvaluator: - canonical_name = canonicalize_name(project_name) - formats = self.format_control.get_allowed_formats(canonical_name) - - return LinkEvaluator( - project_name=project_name, - canonical_name=canonical_name, - formats=formats, - target_python=self._target_python, - allow_yanked=self._allow_yanked, - ignore_requires_python=self._ignore_requires_python, - ) - - def _sort_links(self, links: Iterable[Link]) -> List[Link]: - """ - Returns elements of links in order, non-egg links first, egg links - second, while eliminating duplicates - """ - eggs, no_eggs = [], [] - seen: Set[Link] = set() - for link in links: - if link not in seen: - seen.add(link) - if link.egg_fragment: - eggs.append(link) - else: - no_eggs.append(link) - return no_eggs + eggs - - def _log_skipped_link(self, link: Link, result: LinkType, detail: str) -> None: - entry = (link, result, detail) - if entry not in self._logged_links: - # Put the link at the end so the reason is more visible and because - # the link string is usually very long. - logger.debug("Skipping link: %s: %s", detail, link) - self._logged_links.add(entry) - - def get_install_candidate( - self, link_evaluator: LinkEvaluator, link: Link - ) -> Optional[InstallationCandidate]: - """ - If the link is a candidate for install, convert it to an - InstallationCandidate and return it. Otherwise, return None. - """ - result, detail = link_evaluator.evaluate_link(link) - if result != LinkType.candidate: - self._log_skipped_link(link, result, detail) - return None - - try: - return InstallationCandidate( - name=link_evaluator.project_name, - link=link, - version=detail, - ) - except InvalidVersion: - return None - - def evaluate_links( - self, link_evaluator: LinkEvaluator, links: Iterable[Link] - ) -> List[InstallationCandidate]: - """ - Convert links that are candidates to InstallationCandidate objects. - """ - candidates = [] - for link in self._sort_links(links): - candidate = self.get_install_candidate(link_evaluator, link) - if candidate is not None: - candidates.append(candidate) - - return candidates - - def process_project_url( - self, project_url: Link, link_evaluator: LinkEvaluator - ) -> List[InstallationCandidate]: - logger.debug( - "Fetching project page and analyzing links: %s", - project_url, - ) - index_response = self._link_collector.fetch_response(project_url) - if index_response is None: - return [] - - page_links = list(parse_links(index_response)) - - with indent_log(): - package_links = self.evaluate_links( - link_evaluator, - links=page_links, - ) - - return package_links - - def find_all_candidates(self, project_name: str) -> List[InstallationCandidate]: - """Find all available InstallationCandidate for project_name - - This checks index_urls and find_links. - All versions found are returned as an InstallationCandidate list. - - See LinkEvaluator.evaluate_link() for details on which files - are accepted. - """ - if project_name in self._all_candidates: - return self._all_candidates[project_name] - - link_evaluator = self.make_link_evaluator(project_name) - - collected_sources = self._link_collector.collect_sources( - project_name=project_name, - candidates_from_page=functools.partial( - self.process_project_url, - link_evaluator=link_evaluator, - ), - ) - - page_candidates_it = itertools.chain.from_iterable( - source.page_candidates() - for sources in collected_sources - for source in sources - if source is not None - ) - page_candidates = list(page_candidates_it) - - file_links_it = itertools.chain.from_iterable( - source.file_links() - for sources in collected_sources - for source in sources - if source is not None - ) - file_candidates = self.evaluate_links( - link_evaluator, - sorted(file_links_it, reverse=True), - ) - - if logger.isEnabledFor(logging.DEBUG) and file_candidates: - paths = [] - for candidate in file_candidates: - assert candidate.link.url # we need to have a URL - try: - paths.append(candidate.link.file_path) - except Exception: - paths.append(candidate.link.url) # it's not a local file - - logger.debug("Local files found: %s", ", ".join(paths)) - - # This is an intentional priority ordering - self._all_candidates[project_name] = file_candidates + page_candidates - - return self._all_candidates[project_name] - - def make_candidate_evaluator( - self, - project_name: str, - specifier: Optional[specifiers.BaseSpecifier] = None, - hashes: Optional[Hashes] = None, - ) -> CandidateEvaluator: - """Create a CandidateEvaluator object to use.""" - candidate_prefs = self._candidate_prefs - return CandidateEvaluator.create( - project_name=project_name, - target_python=self._target_python, - prefer_binary=candidate_prefs.prefer_binary, - allow_all_prereleases=candidate_prefs.allow_all_prereleases, - specifier=specifier, - hashes=hashes, - ) - - def find_best_candidate( - self, - project_name: str, - specifier: Optional[specifiers.BaseSpecifier] = None, - hashes: Optional[Hashes] = None, - ) -> BestCandidateResult: - """Find matches for the given project and specifier. - - :param specifier: An optional object implementing `filter` - (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable - versions. - - :return: A `BestCandidateResult` instance. - """ - if (project_name, specifier, hashes) in self._best_candidates: - return self._best_candidates[project_name, specifier, hashes] - - candidates = self.find_all_candidates(project_name) - candidate_evaluator = self.make_candidate_evaluator( - project_name=project_name, - specifier=specifier, - hashes=hashes, - ) - self._best_candidates[project_name, specifier, hashes] = ( - candidate_evaluator.compute_best_candidate(candidates) - ) - - return self._best_candidates[project_name, specifier, hashes] - - def find_requirement( - self, req: InstallRequirement, upgrade: bool - ) -> Optional[InstallationCandidate]: - """Try to find a Link matching req - - Expects req, an InstallRequirement and upgrade, a boolean - Returns a InstallationCandidate if found, - Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise - """ - name = req.name - assert name is not None, "find_requirement() called with no name" - - hashes = req.hashes(trust_internet=False) - best_candidate_result = self.find_best_candidate( - name, - specifier=req.specifier, - hashes=hashes, - ) - best_candidate = best_candidate_result.best_candidate - - installed_version: Optional[_BaseVersion] = None - if req.satisfied_by is not None: - installed_version = req.satisfied_by.version - - def _format_versions(cand_iter: Iterable[InstallationCandidate]) -> str: - # This repeated parse_version and str() conversion is needed to - # handle different vendoring sources from pip and pkg_resources. - # If we stop using the pkg_resources provided specifier and start - # using our own, we can drop the cast to str(). - return ( - ", ".join( - sorted( - {str(c.version) for c in cand_iter}, - key=parse_version, - ) - ) - or "none" - ) - - if installed_version is None and best_candidate is None: - logger.critical( - "Could not find a version that satisfies the requirement %s " - "(from versions: %s)", - req, - _format_versions(best_candidate_result.all_candidates), - ) - - raise DistributionNotFound(f"No matching distribution found for {req}") - - def _should_install_candidate( - candidate: Optional[InstallationCandidate], - ) -> "TypeGuard[InstallationCandidate]": - if installed_version is None: - return True - if best_candidate is None: - return False - return best_candidate.version > installed_version - - if not upgrade and installed_version is not None: - if _should_install_candidate(best_candidate): - logger.debug( - "Existing installed version (%s) satisfies requirement " - "(most up-to-date version is %s)", - installed_version, - best_candidate.version, - ) - else: - logger.debug( - "Existing installed version (%s) is most up-to-date and " - "satisfies requirement", - installed_version, - ) - return None - - if _should_install_candidate(best_candidate): - logger.debug( - "Using version %s (newest of versions: %s)", - best_candidate.version, - _format_versions(best_candidate_result.applicable_candidates), - ) - return best_candidate - - # We have an existing version, and its the best version - logger.debug( - "Installed version (%s) is most up-to-date (past versions: %s)", - installed_version, - _format_versions(best_candidate_result.applicable_candidates), - ) - raise BestVersionAlreadyInstalled - - -def _find_name_version_sep(fragment: str, canonical_name: str) -> int: - """Find the separator's index based on the package's canonical name. - - :param fragment: A + filename "fragment" (stem) or - egg fragment. - :param canonical_name: The package's canonical name. - - This function is needed since the canonicalized name does not necessarily - have the same length as the egg info's name part. An example:: - - >>> fragment = 'foo__bar-1.0' - >>> canonical_name = 'foo-bar' - >>> _find_name_version_sep(fragment, canonical_name) - 8 - """ - # Project name and version must be separated by one single dash. Find all - # occurrences of dashes; if the string in front of it matches the canonical - # name, this is the one separating the name and version parts. - for i, c in enumerate(fragment): - if c != "-": - continue - if canonicalize_name(fragment[:i]) == canonical_name: - return i - raise ValueError(f"{fragment} does not match {canonical_name}") - - -def _extract_version_from_fragment(fragment: str, canonical_name: str) -> Optional[str]: - """Parse the version string from a + filename - "fragment" (stem) or egg fragment. - - :param fragment: The string to parse. E.g. foo-2.1 - :param canonical_name: The canonicalized name of the package this - belongs to. - """ - try: - version_start = _find_name_version_sep(fragment, canonical_name) + 1 - except ValueError: - return None - version = fragment[version_start:] - if not version: - return None - return version diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/index/sources.py b/blog-app/venv/Lib/site-packages/pip/_internal/index/sources.py deleted file mode 100644 index 3dafb30..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/index/sources.py +++ /dev/null @@ -1,284 +0,0 @@ -import logging -import mimetypes -import os -from collections import defaultdict -from typing import Callable, Dict, Iterable, List, Optional, Tuple - -from pip._vendor.packaging.utils import ( - InvalidSdistFilename, - InvalidWheelFilename, - canonicalize_name, - parse_sdist_filename, - parse_wheel_filename, -) - -from pip._internal.models.candidate import InstallationCandidate -from pip._internal.models.link import Link -from pip._internal.utils.urls import path_to_url, url_to_path -from pip._internal.vcs import is_url - -logger = logging.getLogger(__name__) - -FoundCandidates = Iterable[InstallationCandidate] -FoundLinks = Iterable[Link] -CandidatesFromPage = Callable[[Link], Iterable[InstallationCandidate]] -PageValidator = Callable[[Link], bool] - - -class LinkSource: - @property - def link(self) -> Optional[Link]: - """Returns the underlying link, if there's one.""" - raise NotImplementedError() - - def page_candidates(self) -> FoundCandidates: - """Candidates found by parsing an archive listing HTML file.""" - raise NotImplementedError() - - def file_links(self) -> FoundLinks: - """Links found by specifying archives directly.""" - raise NotImplementedError() - - -def _is_html_file(file_url: str) -> bool: - return mimetypes.guess_type(file_url, strict=False)[0] == "text/html" - - -class _FlatDirectoryToUrls: - """Scans directory and caches results""" - - def __init__(self, path: str) -> None: - self._path = path - self._page_candidates: List[str] = [] - self._project_name_to_urls: Dict[str, List[str]] = defaultdict(list) - self._scanned_directory = False - - def _scan_directory(self) -> None: - """Scans directory once and populates both page_candidates - and project_name_to_urls at the same time - """ - for entry in os.scandir(self._path): - url = path_to_url(entry.path) - if _is_html_file(url): - self._page_candidates.append(url) - continue - - # File must have a valid wheel or sdist name, - # otherwise not worth considering as a package - try: - project_filename = parse_wheel_filename(entry.name)[0] - except InvalidWheelFilename: - try: - project_filename = parse_sdist_filename(entry.name)[0] - except InvalidSdistFilename: - continue - - self._project_name_to_urls[project_filename].append(url) - self._scanned_directory = True - - @property - def page_candidates(self) -> List[str]: - if not self._scanned_directory: - self._scan_directory() - - return self._page_candidates - - @property - def project_name_to_urls(self) -> Dict[str, List[str]]: - if not self._scanned_directory: - self._scan_directory() - - return self._project_name_to_urls - - -class _FlatDirectorySource(LinkSource): - """Link source specified by ``--find-links=``. - - This looks the content of the directory, and returns: - - * ``page_candidates``: Links listed on each HTML file in the directory. - * ``file_candidates``: Archives in the directory. - """ - - _paths_to_urls: Dict[str, _FlatDirectoryToUrls] = {} - - def __init__( - self, - candidates_from_page: CandidatesFromPage, - path: str, - project_name: str, - ) -> None: - self._candidates_from_page = candidates_from_page - self._project_name = canonicalize_name(project_name) - - # Get existing instance of _FlatDirectoryToUrls if it exists - if path in self._paths_to_urls: - self._path_to_urls = self._paths_to_urls[path] - else: - self._path_to_urls = _FlatDirectoryToUrls(path=path) - self._paths_to_urls[path] = self._path_to_urls - - @property - def link(self) -> Optional[Link]: - return None - - def page_candidates(self) -> FoundCandidates: - for url in self._path_to_urls.page_candidates: - yield from self._candidates_from_page(Link(url)) - - def file_links(self) -> FoundLinks: - for url in self._path_to_urls.project_name_to_urls[self._project_name]: - yield Link(url) - - -class _LocalFileSource(LinkSource): - """``--find-links=`` or ``--[extra-]index-url=``. - - If a URL is supplied, it must be a ``file:`` URL. If a path is supplied to - the option, it is converted to a URL first. This returns: - - * ``page_candidates``: Links listed on an HTML file. - * ``file_candidates``: The non-HTML file. - """ - - def __init__( - self, - candidates_from_page: CandidatesFromPage, - link: Link, - ) -> None: - self._candidates_from_page = candidates_from_page - self._link = link - - @property - def link(self) -> Optional[Link]: - return self._link - - def page_candidates(self) -> FoundCandidates: - if not _is_html_file(self._link.url): - return - yield from self._candidates_from_page(self._link) - - def file_links(self) -> FoundLinks: - if _is_html_file(self._link.url): - return - yield self._link - - -class _RemoteFileSource(LinkSource): - """``--find-links=`` or ``--[extra-]index-url=``. - - This returns: - - * ``page_candidates``: Links listed on an HTML file. - * ``file_candidates``: The non-HTML file. - """ - - def __init__( - self, - candidates_from_page: CandidatesFromPage, - page_validator: PageValidator, - link: Link, - ) -> None: - self._candidates_from_page = candidates_from_page - self._page_validator = page_validator - self._link = link - - @property - def link(self) -> Optional[Link]: - return self._link - - def page_candidates(self) -> FoundCandidates: - if not self._page_validator(self._link): - return - yield from self._candidates_from_page(self._link) - - def file_links(self) -> FoundLinks: - yield self._link - - -class _IndexDirectorySource(LinkSource): - """``--[extra-]index-url=``. - - This is treated like a remote URL; ``candidates_from_page`` contains logic - for this by appending ``index.html`` to the link. - """ - - def __init__( - self, - candidates_from_page: CandidatesFromPage, - link: Link, - ) -> None: - self._candidates_from_page = candidates_from_page - self._link = link - - @property - def link(self) -> Optional[Link]: - return self._link - - def page_candidates(self) -> FoundCandidates: - yield from self._candidates_from_page(self._link) - - def file_links(self) -> FoundLinks: - return () - - -def build_source( - location: str, - *, - candidates_from_page: CandidatesFromPage, - page_validator: PageValidator, - expand_dir: bool, - cache_link_parsing: bool, - project_name: str, -) -> Tuple[Optional[str], Optional[LinkSource]]: - path: Optional[str] = None - url: Optional[str] = None - if os.path.exists(location): # Is a local path. - url = path_to_url(location) - path = location - elif location.startswith("file:"): # A file: URL. - url = location - path = url_to_path(location) - elif is_url(location): - url = location - - if url is None: - msg = ( - "Location '%s' is ignored: " - "it is either a non-existing path or lacks a specific scheme." - ) - logger.warning(msg, location) - return (None, None) - - if path is None: - source: LinkSource = _RemoteFileSource( - candidates_from_page=candidates_from_page, - page_validator=page_validator, - link=Link(url, cache_link_parsing=cache_link_parsing), - ) - return (url, source) - - if os.path.isdir(path): - if expand_dir: - source = _FlatDirectorySource( - candidates_from_page=candidates_from_page, - path=path, - project_name=project_name, - ) - else: - source = _IndexDirectorySource( - candidates_from_page=candidates_from_page, - link=Link(url, cache_link_parsing=cache_link_parsing), - ) - return (url, source) - elif os.path.isfile(path): - source = _LocalFileSource( - candidates_from_page=candidates_from_page, - link=Link(url, cache_link_parsing=cache_link_parsing), - ) - return (url, source) - logger.warning( - "Location '%s' is ignored: it is neither a file nor a directory.", - location, - ) - return (url, None) diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/locations/__init__.py b/blog-app/venv/Lib/site-packages/pip/_internal/locations/__init__.py deleted file mode 100644 index dfb5dd3..0000000 --- a/blog-app/venv/Lib/site-packages/pip/_internal/locations/__init__.py +++ /dev/null @@ -1,439 +0,0 @@ -import functools -import logging -import os -import pathlib -import sys -import sysconfig -from typing import Any, Dict, Optional - -from pip._internal.models.scheme import SCHEME_KEYS, Scheme -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.deprecation import deprecated -from pip._internal.utils.virtualenv import running_under_virtualenv - -from . import _sysconfig -from .base import ( - USER_CACHE_DIR, - get_major_minor_version, - get_src_prefix, - is_osx_framework, - site_packages, - user_site, -) - -__all__ = [ - "USER_CACHE_DIR", - "get_bin_prefix", - "get_bin_user", - "get_major_minor_version", - "get_platlib", - "get_purelib", - "get_scheme", - "get_src_prefix", - "site_packages", - "user_site", -] - - -logger = logging.getLogger(__name__) - - -_PLATLIBDIR: str = getattr(sys, "platlibdir", "lib") - -_USE_SYSCONFIG_DEFAULT = sys.version_info >= (3, 10) - - -def _should_use_sysconfig() -> bool: - """This function determines the value of _USE_SYSCONFIG. - - By default, pip uses sysconfig on Python 3.10+. - But Python distributors can override this decision by setting: - sysconfig._PIP_USE_SYSCONFIG = True / False - Rationale in https://github.com/pypa/pip/issues/10647 - - This is a function for testability, but should be constant during any one - run. - """ - return bool(getattr(sysconfig, "_PIP_USE_SYSCONFIG", _USE_SYSCONFIG_DEFAULT)) - - -_USE_SYSCONFIG = _should_use_sysconfig() - -if not _USE_SYSCONFIG: - # Import distutils lazily to avoid deprecation warnings, - # but import it soon enough that it is in memory and available during - # a pip reinstall. - from . import _distutils - -# Be noisy about incompatibilities if this platforms "should" be using -# sysconfig, but is explicitly opting out and using distutils instead. -if _USE_SYSCONFIG_DEFAULT and not _USE_SYSCONFIG: - _MISMATCH_LEVEL = logging.WARNING -else: - _MISMATCH_LEVEL = logging.DEBUG - - -def _looks_like_bpo_44860() -> bool: - """The resolution to bpo-44860 will change this incorrect platlib. - - See . - """ - from distutils.command.install import INSTALL_SCHEMES - - try: - unix_user_platlib = INSTALL_SCHEMES["unix_user"]["platlib"] - except KeyError: - return False - return unix_user_platlib == "$usersite" - - -def _looks_like_red_hat_patched_platlib_purelib(scheme: Dict[str, str]) -> bool: - platlib = scheme["platlib"] - if "/$platlibdir/" in platlib: - platlib = platlib.replace("/$platlibdir/", f"/{_PLATLIBDIR}/") - if "/lib64/" not in platlib: - return False - unpatched = platlib.replace("/lib64/", "/lib/") - return unpatched.replace("$platbase/", "$base/") == scheme["purelib"] - - -@functools.lru_cache(maxsize=None) -def _looks_like_red_hat_lib() -> bool: - """Red Hat patches platlib in unix_prefix and unix_home, but not purelib. - - This is the only way I can see to tell a Red Hat-patched Python. - """ - from distutils.command.install import INSTALL_SCHEMES - - return all( - k in INSTALL_SCHEMES - and _looks_like_red_hat_patched_platlib_purelib(INSTALL_SCHEMES[k]) - for k in ("unix_prefix", "unix_home") - ) - - -@functools.lru_cache(maxsize=None) -def _looks_like_debian_scheme() -> bool: - """Debian adds two additional schemes.""" - from distutils.command.install import INSTALL_SCHEMES - - return "deb_system" in INSTALL_SCHEMES and "unix_local" in INSTALL_SCHEMES - - -@functools.lru_cache(maxsize=None) -def _looks_like_red_hat_scheme() -> bool: - """Red Hat patches ``sys.prefix`` and ``sys.exec_prefix``. - - Red Hat's ``00251-change-user-install-location.patch`` changes the install - command's ``prefix`` and ``exec_prefix`` to append ``"/local"``. This is - (fortunately?) done quite unconditionally, so we create a default command - object without any configuration to detect this. - """ - from distutils.command.install import install - from distutils.dist import Distribution - - cmd: Any = install(Distribution()) - cmd.finalize_options() - return ( - cmd.exec_prefix == f"{os.path.normpath(sys.exec_prefix)}/local" - and cmd.prefix == f"{os.path.normpath(sys.prefix)}/local" - ) - - -@functools.lru_cache(maxsize=None) -def _looks_like_slackware_scheme() -> bool: - """Slackware patches sysconfig but fails to patch distutils and site. - - Slackware changes sysconfig's user scheme to use ``"lib64"`` for the lib - path, but does not do the same to the site module. - """ - if user_site is None: # User-site not available. - return False - try: - paths = sysconfig.get_paths(scheme="posix_user", expand=False) - except KeyError: # User-site not available. - return False - return "/lib64/" in paths["purelib"] and "/lib64/" not in user_site - - -@functools.lru_cache(maxsize=None) -def _looks_like_msys2_mingw_scheme() -> bool: - """MSYS2 patches distutils and sysconfig to use a UNIX-like scheme. - - However, MSYS2 incorrectly patches sysconfig ``nt`` scheme. The fix is - likely going to be included in their 3.10 release, so we ignore the warning. - See msys2/MINGW-packages#9319. - - MSYS2 MINGW's patch uses lowercase ``"lib"`` instead of the usual uppercase, - and is missing the final ``"site-packages"``. - """ - paths = sysconfig.get_paths("nt", expand=False) - return all( - "Lib" not in p and "lib" in p and not p.endswith("site-packages") - for p in (paths[key] for key in ("platlib", "purelib")) - ) - - -@functools.lru_cache(maxsize=None) -def _warn_mismatched(old: pathlib.Path, new: pathlib.Path, *, key: str) -> None: - issue_url = "https://github.com/pypa/pip/issues/10151" - message = ( - "Value for %s does not match. Please report this to <%s>" - "\ndistutils: %s" - "\nsysconfig: %s" - ) - logger.log(_MISMATCH_LEVEL, message, key, issue_url, old, new) - - -def _warn_if_mismatch(old: pathlib.Path, new: pathlib.Path, *, key: str) -> bool: - if old == new: - return False - _warn_mismatched(old, new, key=key) - return True - - -@functools.lru_cache(maxsize=None) -def _log_context( - *, - user: bool = False, - home: Optional[str] = None, - root: Optional[str] = None, - prefix: Optional[str] = None, -) -> None: - parts = [ - "Additional context:", - "user = %r", - "home = %r", - "root = %r", - "prefix = %r", - ] - - logger.log(_MISMATCH_LEVEL, "\n".join(parts), user, home, root, prefix) - - -def get_scheme( - dist_name: str, - user: bool = False, - home: Optional[str] = None, - root: Optional[str] = None, - isolated: bool = False, - prefix: Optional[str] = None, -) -> Scheme: - new = _sysconfig.get_scheme( - dist_name, - user=user, - home=home, - root=root, - isolated=isolated, - prefix=prefix, - ) - if _USE_SYSCONFIG: - return new - - old = _distutils.get_scheme( - dist_name, - user=user, - home=home, - root=root, - isolated=isolated, - prefix=prefix, - ) - - warning_contexts = [] - for k in SCHEME_KEYS: - old_v = pathlib.Path(getattr(old, k)) - new_v = pathlib.Path(getattr(new, k)) - - if old_v == new_v: - continue - - # distutils incorrectly put PyPy packages under ``site-packages/python`` - # in the ``posix_home`` scheme, but PyPy devs said they expect the - # directory name to be ``pypy`` instead. So we treat this as a bug fix - # and not warn about it. See bpo-43307 and python/cpython#24628. - skip_pypy_special_case = ( - sys.implementation.name == "pypy" - and home is not None - and k in ("platlib", "purelib") - and old_v.parent == new_v.parent - and old_v.name.startswith("python") - and new_v.name.startswith("pypy") - ) - if skip_pypy_special_case: - continue - - # sysconfig's ``osx_framework_user`` does not include ``pythonX.Y`` in - # the ``include`` value, but distutils's ``headers`` does. We'll let - # CPython decide whether this is a bug or feature. See bpo-43948. - skip_osx_framework_user_special_case = ( - user - and is_osx_framework() - and k == "headers" - and old_v.parent.parent == new_v.parent - and old_v.parent.name.startswith("python") - ) - if skip_osx_framework_user_special_case: - continue - - # On Red Hat and derived Linux distributions, distutils is patched to - # use "lib64" instead of "lib" for platlib. - if k == "platlib" and _looks_like_red_hat_lib(): - continue - - # On Python 3.9+, sysconfig's posix_user scheme sets platlib against - # sys.platlibdir, but distutils's unix_user incorrectly coninutes - # using the same $usersite for both platlib and purelib. This creates a - # mismatch when sys.platlibdir is not "lib". - skip_bpo_44860 = ( - user - and k == "platlib" - and not WINDOWS - and _PLATLIBDIR != "lib" - and _looks_like_bpo_44860() - ) - if skip_bpo_44860: - continue - - # Slackware incorrectly patches posix_user to use lib64 instead of lib, - # but not usersite to match the location. - skip_slackware_user_scheme = ( - user - and k in ("platlib", "purelib") - and not WINDOWS - and _looks_like_slackware_scheme() - ) - if skip_slackware_user_scheme: - continue - - # Both Debian and Red Hat patch Python to place the system site under - # /usr/local instead of /usr. Debian also places lib in dist-packages - # instead of site-packages, but the /usr/local check should cover it. - skip_linux_system_special_case = ( - not (user or home or prefix or running_under_virtualenv()) - and old_v.parts[1:3] == ("usr", "local") - and len(new_v.parts) > 1 - and new_v.parts[1] == "usr" - and (len(new_v.parts) < 3 or new_v.parts[2] != "local") - and (_looks_like_red_hat_scheme() or _looks_like_debian_scheme()) - ) - if skip_linux_system_special_case: - continue - - # MSYS2 MINGW's sysconfig patch does not include the "site-packages" - # part of the path. This is incorrect and will be fixed in MSYS. - skip_msys2_mingw_bug = ( - WINDOWS and k in ("platlib", "purelib") and _looks_like_msys2_mingw_scheme() - ) - if skip_msys2_mingw_bug: - continue - - # CPython's POSIX install script invokes pip (via ensurepip) against the - # interpreter located in the source tree, not the install site. This - # triggers special logic in sysconfig that's not present in distutils. - # https://github.com/python/cpython/blob/8c21941ddaf/Lib/sysconfig.py#L178-L194 - skip_cpython_build = ( - sysconfig.is_python_build(check_home=True) - and not WINDOWS - and k in ("headers", "include", "platinclude") - ) - if skip_cpython_build: - continue - - warning_contexts.append((old_v, new_v, f"scheme.{k}")) - - if not warning_contexts: - return old - - # Check if this path mismatch is caused by distutils config files. Those - # files will no longer work once we switch to sysconfig, so this raises a - # deprecation message for them. - default_old = _distutils.distutils_scheme( - dist_name, - user, - home, - root, - isolated, - prefix, - ignore_config_files=True, - ) - if any(default_old[k] != getattr(old, k) for k in SCHEME_KEYS): - deprecated( - reason=( - "Configuring installation scheme with distutils config files " - "is deprecated and will no longer work in the near future. If you " - "are using a Homebrew or Linuxbrew Python, please see discussion " - "at https://github.com/Homebrew/homebrew-core/issues/76621" - ), - replacement=None, - gone_in=None, - ) - return old - - # Post warnings about this mismatch so user can report them back. - for old_v, new_v, key in warning_contexts: - _warn_mismatched(old_v, new_v, key=key) - _log_context(user=user, home=home, root=root, prefix=prefix) - - return old - - -def get_bin_prefix() -> str: - new = _sysconfig.get_bin_prefix() - if _USE_SYSCONFIG: - return new - - old = _distutils.get_bin_prefix() - if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="bin_prefix"): - _log_context() - return old - - -def get_bin_user() -> str: - return _sysconfig.get_scheme("", user=True).scripts - - -def _looks_like_deb_system_dist_packages(value: str) -> bool: - """Check if the value is Debian's APT-controlled dist-packages. - - Debian's ``distutils.sysconfig.get_python_lib()`` implementation returns the - default package path controlled by APT, but does not patch ``sysconfig`` to - do the same. This is similar to the bug worked around in ``get_scheme()``, - but here the default is ``deb_system`` instead of ``unix_local``. Ultimately - we can't do anything about this Debian bug, and this detection allows us to - skip the warning when needed. - """ - if not _looks_like_debian_scheme(): - return False - if value == "/usr/lib/python3/dist-packages": - return True - return False - - -def get_purelib() -> str: - """Return the default pure-Python lib location.""" - new = _sysconfig.get_purelib() - if _USE_SYSCONFIG: - return new - - old = _distutils.get_purelib() - if _looks_like_deb_system_dist_packages(old): - return old - if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="purelib"): - _log_context() - return old - - -def get_platlib() -> str: - """Return the default platform-shared lib location.""" - new = _sysconfig.get_platlib() - if _USE_SYSCONFIG: - return new - - from . import _distutils - - old = _distutils.get_platlib() - if _looks_like_deb_system_dist_packages(old): - return old - if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="platlib"): - _log_context() - return old diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 0e57f69b4fa1e0ddb517cb9e687f9f7d76672076..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10498 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 DsTA!} diff --git a/blog-app/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc b/blog-app/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc deleted file mode 100644 index 2f8e3a0e5a3c852c099231e564e8542af5d42680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6036 zcmai2&2!tv6$d~N{1ipY@`r54MwFyBQ+*`;%G7n;__I;t%AUxHQ;sqa$X$t$K!8~+ zCDB7&qIBv@dg-yvjNQp}#<%<(z4g!wu08pjQ&SQ z6GaWbb8o-Znmey)|Dwjh-y|AuvdhVjk=-UnR-UO&AN%V;b+@c z-D>CRIi2Qb{CvAmFSLvGqH3Fdsa>v@QO`2VpJ-R=mG)$PvR$oLb&YF}kMXG|di^+` z=9$MQo@o1e{UkrdGc3pS{Y?Ed%k!CagB4iuQ?q^st+QyASQ)KzX={R2(0VCtO|mLl z=QlKV?5}$L0;t*yJ21Vgi;ww*$1hV$*9ylAI{r|ySvJkjvJ-rUo#f``EI&J=u~Wm^ zY4pzwTX|kwudp-h?5ElKE9s8s*h|>))wFe4iaj>ivj|r67{7@2j44CKi=eZoG5rx3`>kZ~bm1wvwea zJw7eELEr@&PB&m&INP3(UDxNq_A}h0R?EbtX3GsWxFf<)#-}#8blUD_D4ezzpxovn zqK&IwH=d%U1?sfYCw_U+)FS#U09#t7)BW_2%NbkR1F^Yh6vaDB=3qtI@1H;C*Vei55tsoMR(riX1= zn*%Rivt>uEu@8qN}S zWv44&a7PRF^^{)Z1x>Y|VjpWEMaA>B>-lcO=PB2aQZo$Jy^RIZFvi#2t}j#lqCMvn zs|h0@p#&=#l)@Ig18sHl;ilFMm zD-;w`5Ksnnr3WP9wP8Xe4+R#A8dis0JUhXhO$LEQj6?asV{635?fQ3 zPHM*8RO90lhgv6)Wy-ns!L_A3*RJ2WNap~^^VtA zjXcTcJ8pB!-QdwG>}V0p&8L3*Q7u!x^77ol}9P3hre+lP}=